@opengeni/artifact-tool 0.2.2

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.
Files changed (203) hide show
  1. package/LICENSE +190 -0
  2. package/README.md +104 -0
  3. package/dist/bounded-zip.d.ts +28 -0
  4. package/dist/chunk-4BSENMAE.js +39 -0
  5. package/dist/chunk-4BSENMAE.js.map +1 -0
  6. package/dist/chunk-4FRFNNBM.js +276 -0
  7. package/dist/chunk-4FRFNNBM.js.map +1 -0
  8. package/dist/chunk-5XIA6KHZ.js +49 -0
  9. package/dist/chunk-5XIA6KHZ.js.map +1 -0
  10. package/dist/chunk-66CT2ZRP.js +2229 -0
  11. package/dist/chunk-66CT2ZRP.js.map +1 -0
  12. package/dist/chunk-72SYDU4O.js +319 -0
  13. package/dist/chunk-72SYDU4O.js.map +1 -0
  14. package/dist/chunk-B2ZJRZDA.js +279 -0
  15. package/dist/chunk-B2ZJRZDA.js.map +1 -0
  16. package/dist/chunk-DCTLTNPW.js +2458 -0
  17. package/dist/chunk-DCTLTNPW.js.map +1 -0
  18. package/dist/chunk-FGZM4FQ6.js +473 -0
  19. package/dist/chunk-FGZM4FQ6.js.map +1 -0
  20. package/dist/chunk-HTJBLBDE.js +591 -0
  21. package/dist/chunk-HTJBLBDE.js.map +1 -0
  22. package/dist/chunk-IYFXZQ34.js +5306 -0
  23. package/dist/chunk-IYFXZQ34.js.map +1 -0
  24. package/dist/chunk-J6N7IR44.js +172 -0
  25. package/dist/chunk-J6N7IR44.js.map +1 -0
  26. package/dist/chunk-N2IHNWBS.js +1002 -0
  27. package/dist/chunk-N2IHNWBS.js.map +1 -0
  28. package/dist/chunk-NAG44K67.js +549 -0
  29. package/dist/chunk-NAG44K67.js.map +1 -0
  30. package/dist/chunk-O24KTEGP.js +33 -0
  31. package/dist/chunk-O24KTEGP.js.map +1 -0
  32. package/dist/chunk-PI2AZVGK.js +2074 -0
  33. package/dist/chunk-PI2AZVGK.js.map +1 -0
  34. package/dist/chunk-Q2FFHEY7.js +40 -0
  35. package/dist/chunk-Q2FFHEY7.js.map +1 -0
  36. package/dist/chunk-RBGQADXA.js +57 -0
  37. package/dist/chunk-RBGQADXA.js.map +1 -0
  38. package/dist/chunk-U5G2BKM2.js +613 -0
  39. package/dist/chunk-U5G2BKM2.js.map +1 -0
  40. package/dist/chunk-VOJHMSM3.js +39 -0
  41. package/dist/chunk-VOJHMSM3.js.map +1 -0
  42. package/dist/chunk-VUNV25KB.js +16 -0
  43. package/dist/chunk-VUNV25KB.js.map +1 -0
  44. package/dist/chunk-XIFUNVBO.js +101 -0
  45. package/dist/chunk-XIFUNVBO.js.map +1 -0
  46. package/dist/chunk-ZCJYRJGB.js +489 -0
  47. package/dist/chunk-ZCJYRJGB.js.map +1 -0
  48. package/dist/chunk-ZZXPEE4S.js +2260 -0
  49. package/dist/chunk-ZZXPEE4S.js.map +1 -0
  50. package/dist/document-docx-api.d.ts +49 -0
  51. package/dist/document-docx-codec.d.ts +9 -0
  52. package/dist/document-docx-codec.js +4765 -0
  53. package/dist/document-docx-codec.js.map +1 -0
  54. package/dist/document-docx-import.d.ts +261 -0
  55. package/dist/document-docx-packer.d.ts +18 -0
  56. package/dist/document-docx-state.d.ts +12 -0
  57. package/dist/document-render.d.ts +3 -0
  58. package/dist/document-render.js +492 -0
  59. package/dist/document-render.js.map +1 -0
  60. package/dist/document.d.ts +432 -0
  61. package/dist/document.js +37 -0
  62. package/dist/document.js.map +1 -0
  63. package/dist/errors.d.ts +23 -0
  64. package/dist/file-blob.d.ts +11 -0
  65. package/dist/index.d.ts +4 -0
  66. package/dist/index.js +186 -0
  67. package/dist/index.js.map +1 -0
  68. package/dist/inspection.d.ts +12 -0
  69. package/dist/kernel.d.ts +101 -0
  70. package/dist/lib-GQLPACFK.js +9746 -0
  71. package/dist/lib-GQLPACFK.js.map +1 -0
  72. package/dist/materializer-cli-entry.d.ts +2 -0
  73. package/dist/materializer-cli-entry.js +29 -0
  74. package/dist/materializer-cli-entry.js.map +1 -0
  75. package/dist/materializer-cli.d.ts +24 -0
  76. package/dist/materializer-cli.js +24 -0
  77. package/dist/materializer-cli.js.map +1 -0
  78. package/dist/native-raster.d.ts +10 -0
  79. package/dist/native.d.ts +129 -0
  80. package/dist/native.js +31 -0
  81. package/dist/native.js.map +1 -0
  82. package/dist/office-import.d.ts +48 -0
  83. package/dist/office-import.js +154 -0
  84. package/dist/office-import.js.map +1 -0
  85. package/dist/presentation-pptx-api.d.ts +60 -0
  86. package/dist/presentation-pptx-import.d.ts +5 -0
  87. package/dist/presentation-pptx-state-digest-765CZZED.js +10 -0
  88. package/dist/presentation-pptx-state-digest-765CZZED.js.map +1 -0
  89. package/dist/presentation-pptx-state-digest.d.ts +3 -0
  90. package/dist/presentation-pptx-state.d.ts +4 -0
  91. package/dist/presentation-pptx-xml.d.ts +29 -0
  92. package/dist/presentation-pptx.d.ts +5 -0
  93. package/dist/presentation-pptx.js +2365 -0
  94. package/dist/presentation-pptx.js.map +1 -0
  95. package/dist/presentation-render.d.ts +29 -0
  96. package/dist/presentation-render.js +375 -0
  97. package/dist/presentation-render.js.map +1 -0
  98. package/dist/presentation.d.ts +565 -0
  99. package/dist/presentation.js +71 -0
  100. package/dist/presentation.js.map +1 -0
  101. package/dist/production-composite.d.ts +68 -0
  102. package/dist/production-document.d.ts +2 -0
  103. package/dist/production-document.js +176 -0
  104. package/dist/production-document.js.map +1 -0
  105. package/dist/production-native-codecs.d.ts +94 -0
  106. package/dist/production-presentation.d.ts +2 -0
  107. package/dist/production-presentation.js +176 -0
  108. package/dist/production-presentation.js.map +1 -0
  109. package/dist/production-sha256.d.ts +2 -0
  110. package/dist/production-spreadsheet-native.d.ts +12 -0
  111. package/dist/production-spreadsheet.d.ts +2 -0
  112. package/dist/production-spreadsheet.js +176 -0
  113. package/dist/production-spreadsheet.js.map +1 -0
  114. package/dist/production.d.ts +96 -0
  115. package/dist/raster-image.d.ts +34 -0
  116. package/dist/reference.d.ts +17 -0
  117. package/dist/reference.js +574 -0
  118. package/dist/reference.js.map +1 -0
  119. package/dist/runtime-cli-entry.d.ts +2 -0
  120. package/dist/runtime-cli-entry.js +21 -0
  121. package/dist/runtime-cli-entry.js.map +1 -0
  122. package/dist/runtime-cli.d.ts +76 -0
  123. package/dist/runtime-cli.js +26 -0
  124. package/dist/runtime-cli.js.map +1 -0
  125. package/dist/runtime-development.d.ts +73 -0
  126. package/dist/runtime-development.js +30 -0
  127. package/dist/runtime-development.js.map +1 -0
  128. package/dist/runtime-receipt.d.ts +19 -0
  129. package/dist/runtime.d.ts +355 -0
  130. package/dist/runtime.js +42 -0
  131. package/dist/runtime.js.map +1 -0
  132. package/dist/snapshot.d.ts +26 -0
  133. package/dist/snapshot.js +61 -0
  134. package/dist/snapshot.js.map +1 -0
  135. package/dist/spreadsheet-address.d.ts +18 -0
  136. package/dist/spreadsheet-file.d.ts +17 -0
  137. package/dist/spreadsheet-formula.d.ts +67 -0
  138. package/dist/spreadsheet-image.d.ts +17 -0
  139. package/dist/spreadsheet-render.d.ts +5 -0
  140. package/dist/spreadsheet-render.js +752 -0
  141. package/dist/spreadsheet-render.js.map +1 -0
  142. package/dist/spreadsheet-types.d.ts +155 -0
  143. package/dist/spreadsheet-xlsx-api.d.ts +88 -0
  144. package/dist/spreadsheet-xlsx-codec.d.ts +16 -0
  145. package/dist/spreadsheet-xlsx-codec.js +16 -0
  146. package/dist/spreadsheet-xlsx-codec.js.map +1 -0
  147. package/dist/spreadsheet-xlsx-state.d.ts +16 -0
  148. package/dist/spreadsheet.d.ts +724 -0
  149. package/dist/spreadsheet.js +67 -0
  150. package/dist/spreadsheet.js.map +1 -0
  151. package/package.json +129 -0
  152. package/src/bounded-zip.ts +450 -0
  153. package/src/document-docx-api.ts +64 -0
  154. package/src/document-docx-codec.ts +2253 -0
  155. package/src/document-docx-import.ts +3814 -0
  156. package/src/document-docx-packer.ts +72 -0
  157. package/src/document-docx-state.ts +59 -0
  158. package/src/document-render.ts +615 -0
  159. package/src/document.ts +2800 -0
  160. package/src/errors.ts +45 -0
  161. package/src/file-blob.ts +43 -0
  162. package/src/index.ts +4 -0
  163. package/src/inspection.ts +50 -0
  164. package/src/kernel.ts +525 -0
  165. package/src/materializer-cli-entry.ts +11 -0
  166. package/src/materializer-cli.ts +743 -0
  167. package/src/native-raster.ts +141 -0
  168. package/src/native.ts +390 -0
  169. package/src/office-import.ts +243 -0
  170. package/src/presentation-pptx-api.ts +107 -0
  171. package/src/presentation-pptx-import.ts +2065 -0
  172. package/src/presentation-pptx-state-digest.ts +46 -0
  173. package/src/presentation-pptx-state.ts +18 -0
  174. package/src/presentation-pptx-xml.ts +473 -0
  175. package/src/presentation-pptx.ts +447 -0
  176. package/src/presentation-render.ts +532 -0
  177. package/src/presentation.ts +2599 -0
  178. package/src/production-composite.ts +805 -0
  179. package/src/production-document.ts +2 -0
  180. package/src/production-native-codecs.ts +1141 -0
  181. package/src/production-presentation.ts +2 -0
  182. package/src/production-sha256.ts +150 -0
  183. package/src/production-spreadsheet-native.ts +686 -0
  184. package/src/production-spreadsheet.ts +2 -0
  185. package/src/production.ts +1022 -0
  186. package/src/raster-image.ts +586 -0
  187. package/src/reference.ts +17 -0
  188. package/src/runtime-cli-entry.ts +13 -0
  189. package/src/runtime-cli.ts +670 -0
  190. package/src/runtime-development.ts +689 -0
  191. package/src/runtime-receipt.ts +169 -0
  192. package/src/runtime.ts +1463 -0
  193. package/src/snapshot.ts +88 -0
  194. package/src/spreadsheet-address.ts +90 -0
  195. package/src/spreadsheet-file.ts +71 -0
  196. package/src/spreadsheet-formula.ts +1212 -0
  197. package/src/spreadsheet-image.ts +242 -0
  198. package/src/spreadsheet-render.ts +985 -0
  199. package/src/spreadsheet-types.ts +171 -0
  200. package/src/spreadsheet-xlsx-api.ts +123 -0
  201. package/src/spreadsheet-xlsx-codec.ts +3063 -0
  202. package/src/spreadsheet-xlsx-state.ts +191 -0
  203. package/src/spreadsheet.ts +5195 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/presentation-pptx-xml.ts","../src/presentation-pptx-import.ts","../src/presentation-pptx.ts"],"sourcesContent":["import {\n PresentationSecurityError,\n type PresentationPptxImportLimits,\n} from \"./presentation-pptx-api\";\n\nexport type PptxXmlNode = PptxXmlElement | { type: \"text\"; value: string };\n\nexport type PptxXmlElement = {\n type: \"element\";\n name: string;\n localName: string;\n attributes: ReadonlyMap<string, string>;\n /** Resolved namespace bindings, populated by parsePptxXmlPart validation. */\n namespaceUri?: string;\n attributeNamespaces?: ReadonlyMap<string, string | undefined>;\n children: PptxXmlNode[];\n};\n\nexport type PptxXmlBudget = {\n limits: PresentationPptxImportLimits;\n totalBytes: number;\n totalNodes: number;\n};\n\nexport function parsePptxXmlPart(\n bytes: Uint8Array,\n partName: string,\n budget: PptxXmlBudget,\n): PptxXmlElement {\n if (bytes.byteLength > budget.limits.xmlBytes) {\n throw pptxXmlLimit(\"XML part exceeds its byte limit\", partName);\n }\n budget.totalBytes += bytes.byteLength;\n if (budget.totalBytes > budget.limits.totalXmlBytes) {\n throw pptxXmlLimit(\"PPTX exceeds its total XML byte limit\", partName);\n }\n let xml: string;\n try {\n if (bytes[0] === 0xff && bytes[1] === 0xfe) {\n xml = new TextDecoder(\"utf-16le\", { fatal: true }).decode(bytes);\n } else if (bytes[0] === 0xfe && bytes[1] === 0xff) {\n xml = new TextDecoder(\"utf-16be\", { fatal: true }).decode(bytes);\n } else {\n xml = new TextDecoder(\"utf-8\", { fatal: true }).decode(bytes);\n }\n } catch {\n throw pptxXmlSecurity(\"OOXML text is not valid UTF-8 or UTF-16\", \"unsafe-xml\", partName);\n }\n if (/<!\\s*(?:DOCTYPE|ENTITY)\\b/i.test(xml)) {\n throw pptxXmlSecurity(\"DOCTYPE and entity declarations are forbidden\", \"unsafe-xml\", partName);\n }\n const parsed = parseXml(xml, partName, budget);\n validateNamespaceBindings(parsed, partName, new Map());\n return parsed;\n}\n\nfunction parseXml(xml: string, partName: string, budget: PptxXmlBudget): PptxXmlElement {\n const stack: PptxXmlElement[] = [];\n let root: PptxXmlElement | undefined;\n let cursor = 0;\n let sawDeclaration = false;\n const addNode = (node: PptxXmlNode): void => {\n budget.totalNodes += 1;\n if (budget.totalNodes > budget.limits.xmlNodes) {\n throw pptxXmlLimit(\"PPTX exceeds its XML node limit\", partName);\n }\n const parent = stack.at(-1);\n if (parent) parent.children.push(node);\n else if (node.type === \"text\" && isXmlWhitespace(node.value)) return;\n else if (node.type === \"element\" && !root) root = node;\n else\n throw pptxXmlSecurity(\n \"XML has text outside its root or multiple roots\",\n \"unsafe-xml\",\n partName,\n );\n };\n\n while (cursor < xml.length) {\n const opening = xml.indexOf(\"<\", cursor);\n if (opening < 0) {\n if (cursor < xml.length)\n addNode({ type: \"text\", value: decodeEntities(xml.slice(cursor), partName) });\n cursor = xml.length;\n break;\n }\n if (opening > cursor) {\n addNode({ type: \"text\", value: decodeEntities(xml.slice(cursor, opening), partName) });\n }\n if (xml.startsWith(\"<!--\", opening)) {\n const end = xml.indexOf(\"-->\", opening + 4);\n const body = end < 0 ? \"\" : xml.slice(opening + 4, end);\n if (end < 0 || body.includes(\"--\") || body.endsWith(\"-\")) {\n throw pptxXmlSecurity(\"Malformed XML comment\", \"unsafe-xml\", partName);\n }\n validateXmlCharacters(body, partName);\n cursor = end + 3;\n continue;\n }\n if (xml.startsWith(\"<?\", opening)) {\n const end = xml.indexOf(\"?>\", opening + 2);\n const instruction = end < 0 ? \"\" : xml.slice(opening + 2, end);\n const declaration =\n /^xml[\\x20\\t\\r\\n]+version=(?:\"1\\.[01]\"|'1\\.[01]')(?:[\\x20\\t\\r\\n]+encoding=(?:\"[Uu][Tt][Ff]-(?:8|16)\"|'[Uu][Tt][Ff]-(?:8|16)'))?(?:[\\x20\\t\\r\\n]+standalone=(?:\"(?:yes|no)\"|'(?:yes|no)'))?[\\x20\\t\\r\\n]*$/.test(\n instruction,\n );\n if (end < 0 || !declaration || opening !== 0 || root || stack.length > 0 || sawDeclaration) {\n throw pptxXmlSecurity(\n \"XML processing instructions are unsupported\",\n \"unsafe-xml\",\n partName,\n );\n }\n sawDeclaration = true;\n cursor = end + 2;\n continue;\n }\n if (xml.startsWith(\"<!\", opening)) {\n throw pptxXmlSecurity(\"XML declarations and CDATA are unsupported\", \"unsafe-xml\", partName);\n }\n const end = findTagEnd(xml, opening + 1, partName);\n const source = xml.slice(opening + 1, end);\n if (source.startsWith(\"/\")) {\n const match = /^\\/([^\\x20\\t\\r\\n]+)[\\x20\\t\\r\\n]*$/.exec(source);\n const name = match?.[1];\n if (!name || !XML_QNAME.test(name)) {\n throw pptxXmlSecurity(\"Malformed XML closing tag\", \"unsafe-xml\", partName);\n }\n const current = stack.pop();\n if (!current || current.name !== name) {\n throw pptxXmlSecurity(\"Mismatched XML closing tag\", \"unsafe-xml\", partName);\n }\n } else {\n if (isXmlSpace(source[0])) {\n throw pptxXmlSecurity(\"XML start tag has leading whitespace\", \"unsafe-xml\", partName);\n }\n const selfClosing = /\\/[\\x20\\t\\r\\n]*$/.test(source);\n const body = selfClosing ? source.replace(/\\/[\\x20\\t\\r\\n]*$/, \"\") : source;\n const element = parseStartTag(body, partName, budget.limits.xmlAttributesPerElement);\n addNode(element);\n if (!selfClosing) {\n stack.push(element);\n if (stack.length > budget.limits.xmlDepth) {\n throw pptxXmlLimit(\"XML exceeds its depth limit\", partName);\n }\n }\n }\n cursor = end + 1;\n }\n if (stack.length > 0 || !root) {\n throw pptxXmlSecurity(\"XML is empty or ends with unclosed elements\", \"unsafe-xml\", partName);\n }\n return root;\n}\n\nfunction findTagEnd(xml: string, start: number, partName: string): number {\n let quote: string | undefined;\n for (let index = start; index < xml.length; index += 1) {\n const character = xml[index];\n if (quote) {\n if (character === quote) quote = undefined;\n } else if (character === '\"' || character === \"'\") quote = character;\n else if (character === \">\") return index;\n }\n throw pptxXmlSecurity(\"Unterminated XML tag\", \"unsafe-xml\", partName);\n}\n\nfunction parseStartTag(source: string, partName: string, maxAttributes: number): PptxXmlElement {\n let cursor = 0;\n const skipSpace = (): void => {\n while (cursor < source.length && isXmlSpace(source[cursor])) cursor += 1;\n };\n const nameStart = cursor;\n while (cursor < source.length && !isXmlSpace(source[cursor])) cursor += 1;\n const name = source.slice(nameStart, cursor);\n if (!XML_QNAME.test(name)) {\n throw pptxXmlSecurity(\"Invalid XML element name\", \"unsafe-xml\", partName);\n }\n const attributes = new Map<string, string>();\n while (cursor < source.length) {\n if (!isXmlSpace(source[cursor])) {\n throw pptxXmlSecurity(\n \"XML attributes must be separated by whitespace\",\n \"unsafe-xml\",\n partName,\n );\n }\n skipSpace();\n if (cursor >= source.length) break;\n const attributeStart = cursor;\n while (cursor < source.length && !isXmlSpace(source[cursor]) && source[cursor] !== \"=\")\n cursor += 1;\n const attributeName = source.slice(attributeStart, cursor);\n if (!XML_QNAME.test(attributeName)) {\n throw pptxXmlSecurity(\"Invalid XML attribute name\", \"unsafe-xml\", partName);\n }\n skipSpace();\n if (source[cursor] !== \"=\") {\n throw pptxXmlSecurity(\"XML attribute lacks a value\", \"unsafe-xml\", partName);\n }\n cursor += 1;\n skipSpace();\n const quote = source[cursor];\n if (quote !== '\"' && quote !== \"'\") {\n throw pptxXmlSecurity(\"XML attribute value must be quoted\", \"unsafe-xml\", partName);\n }\n cursor += 1;\n const valueStart = cursor;\n const valueEnd = source.indexOf(quote, valueStart);\n if (valueEnd < 0) {\n throw pptxXmlSecurity(\"Unterminated XML attribute\", \"unsafe-xml\", partName);\n }\n if (attributes.has(attributeName)) {\n throw pptxXmlSecurity(\"Duplicate XML attribute\", \"unsafe-xml\", partName);\n }\n if (attributes.size >= maxAttributes) {\n throw pptxXmlLimit(\"XML element exceeds its attribute limit\", partName);\n }\n const rawValue = source.slice(valueStart, valueEnd);\n if (rawValue.includes(\"<\")) {\n throw pptxXmlSecurity(\n \"XML attribute contains an unescaped less-than sign\",\n \"unsafe-xml\",\n partName,\n );\n }\n attributes.set(attributeName, decodeEntities(rawValue, partName));\n cursor = valueEnd + 1;\n }\n return { type: \"element\", name, localName: xmlLocalName(name), attributes, children: [] };\n}\n\nfunction validateNamespaceBindings(\n element: PptxXmlElement,\n partName: string,\n inherited: ReadonlyMap<string, string>,\n): void {\n const bindings = new Map(inherited);\n for (const [name, value] of element.attributes) {\n if (name === \"xmlns\") bindings.set(\"\", value);\n else if (name.startsWith(\"xmlns:\")) {\n const declaredPrefix = name.slice(6);\n const required = REQUIRED_NAMESPACE_URIS.get(declaredPrefix);\n if (required && required !== value) {\n throw pptxXmlSecurity(\n \"OOXML namespace prefix is rebound to an unexpected URI\",\n \"unsafe-xml\",\n partName,\n );\n }\n bindings.set(declaredPrefix, value);\n }\n }\n const prefix = xmlPrefix(element.name);\n if (prefix && !bindings.has(prefix)) {\n throw pptxXmlSecurity(\n \"XML element uses an undeclared namespace prefix\",\n \"unsafe-xml\",\n partName,\n );\n }\n const namespaceUri = bindings.get(prefix ?? \"\");\n if (namespaceUri === undefined) delete element.namespaceUri;\n else element.namespaceUri = namespaceUri;\n const attributeNamespaces = new Map<string, string | undefined>();\n for (const name of element.attributes.keys()) {\n if (name === \"xmlns\" || name.startsWith(\"xmlns:\")) continue;\n const attributePrefix = xmlPrefix(name);\n if (attributePrefix && attributePrefix !== \"xml\" && !bindings.has(attributePrefix)) {\n throw pptxXmlSecurity(\n \"XML attribute uses an undeclared namespace prefix\",\n \"unsafe-xml\",\n partName,\n );\n }\n attributeNamespaces.set(\n name,\n attributePrefix === \"xml\"\n ? \"http://www.w3.org/XML/1998/namespace\"\n : attributePrefix\n ? bindings.get(attributePrefix)\n : undefined,\n );\n }\n element.attributeNamespaces = attributeNamespaces;\n for (const child of pptxXmlChildren(element))\n validateNamespaceBindings(child, partName, bindings);\n}\n\nfunction decodeEntities(value: string, partName: string): string {\n validateXmlCharacters(value, partName);\n if (value.includes(\"]]>\")) {\n throw pptxXmlSecurity(\"XML contains malformed character data\", \"unsafe-xml\", partName);\n }\n if (!value.includes(\"&\")) return value;\n const output: string[] = [];\n let cursor = 0;\n let ampersand = value.indexOf(\"&\");\n let references = 0;\n while (ampersand >= 0) {\n references += 1;\n if (references > 65_536) {\n throw pptxXmlLimit(\"XML text exceeds its entity reference limit\", partName);\n }\n output.push(value.slice(cursor, ampersand));\n const semicolon = value.indexOf(\";\", ampersand + 1);\n const nested = value.indexOf(\"&\", ampersand + 1);\n if (semicolon < 0 || (nested >= 0 && nested < semicolon)) {\n throw pptxXmlSecurity(\n \"XML contains an unterminated entity reference\",\n \"unsafe-xml\",\n partName,\n );\n }\n const entity = value.slice(ampersand + 1, semicolon);\n if (entity.length === 0 || entity.length > 16) {\n throw pptxXmlSecurity(\"XML contains a malformed entity reference\", \"unsafe-xml\", partName);\n }\n output.push(decodeEntity(entity, partName));\n cursor = semicolon + 1;\n ampersand = value.indexOf(\"&\", cursor);\n }\n output.push(value.slice(cursor));\n return output.join(\"\");\n}\n\nfunction decodeEntity(entity: string, partName: string): string {\n if (entity === \"amp\") return \"&\";\n if (entity === \"lt\") return \"<\";\n if (entity === \"gt\") return \">\";\n if (entity === \"quot\") return '\"';\n if (entity === \"apos\") return \"'\";\n const decimal = /^#([0-9]+)$/.exec(entity);\n const hexadecimal = /^#x([0-9a-f]+)$/i.exec(entity);\n const codePoint = decimal\n ? Number(decimal[1])\n : hexadecimal\n ? Number.parseInt(hexadecimal[1] ?? \"\", 16)\n : NaN;\n if (!Number.isInteger(codePoint) || !isValidXmlCodePoint(codePoint)) {\n throw pptxXmlSecurity(`Unsupported or invalid XML entity: &${entity};`, \"unsafe-xml\", partName);\n }\n return String.fromCodePoint(codePoint);\n}\n\nfunction validateXmlCharacters(value: string, partName: string): void {\n for (const character of value) {\n if (!isValidXmlCodePoint(character.codePointAt(0) ?? 0)) {\n throw pptxXmlSecurity(\"XML contains a forbidden character\", \"unsafe-xml\", partName);\n }\n }\n}\n\nfunction isValidXmlCodePoint(codePoint: number): boolean {\n return (\n codePoint === 0x09 ||\n codePoint === 0x0a ||\n codePoint === 0x0d ||\n (codePoint >= 0x20 && codePoint <= 0xd7ff) ||\n (codePoint >= 0xe000 && codePoint <= 0xfffd) ||\n (codePoint >= 0x10000 && codePoint <= 0x10ffff)\n );\n}\n\nexport function pptxXmlChildren(element: PptxXmlElement | undefined): PptxXmlElement[] {\n return (\n element?.children.filter((child): child is PptxXmlElement => child.type === \"element\") ?? []\n );\n}\n\nexport function pptxXmlChild(\n element: PptxXmlElement | undefined,\n localName: string,\n): PptxXmlElement | undefined {\n return pptxXmlChildren(element).find((child) => child.localName === localName);\n}\n\nexport function pptxXmlDescendants(\n element: PptxXmlElement | undefined,\n localName: string,\n): PptxXmlElement[] {\n const output: PptxXmlElement[] = [];\n const visit = (node: PptxXmlElement): void => {\n for (const child of pptxXmlChildren(node)) {\n if (child.localName === localName) output.push(child);\n visit(child);\n }\n };\n if (element) visit(element);\n return output;\n}\n\nexport function pptxXmlAttribute(\n element: PptxXmlElement | undefined,\n localName: string,\n): string | undefined {\n if (!element) return undefined;\n for (const [name, value] of element.attributes) {\n if (xmlLocalName(name) === localName && name !== \"xmlns\" && !name.startsWith(\"xmlns:\"))\n return value;\n }\n return undefined;\n}\n\nexport function pptxXmlQualifiedAttribute(\n element: PptxXmlElement | undefined,\n qualifiedName: string,\n): string | undefined {\n return element?.attributes.get(qualifiedName);\n}\n\nexport function pptxXmlText(element: PptxXmlElement | undefined): string {\n if (!element) return \"\";\n let output = \"\";\n const visit = (node: PptxXmlNode): void => {\n if (node.type === \"text\") output += node.value;\n else for (const child of node.children) visit(child);\n };\n visit(element);\n return output;\n}\n\nexport function pptxXmlDirectText(element: PptxXmlElement | undefined): string {\n return (\n element?.children\n .filter((child): child is { type: \"text\"; value: string } => child.type === \"text\")\n .map((child) => child.value)\n .join(\"\") ?? \"\"\n );\n}\n\nexport function pptxXmlSecurity(\n message: string,\n code: PresentationSecurityError[\"code\"],\n entryName?: string,\n): PresentationSecurityError {\n return new PresentationSecurityError(\n entryName ? `${message}: ${entryName}` : message,\n code,\n entryName,\n );\n}\n\nfunction pptxXmlLimit(message: string, entryName?: string): PresentationSecurityError {\n return pptxXmlSecurity(message, \"limit-exceeded\", entryName);\n}\n\nfunction xmlLocalName(value: string): string {\n return value.slice(value.indexOf(\":\") + 1);\n}\n\nfunction xmlPrefix(value: string): string | undefined {\n const index = value.indexOf(\":\");\n return index < 0 ? undefined : value.slice(0, index);\n}\n\nfunction isXmlSpace(value: string | undefined): boolean {\n return value === \" \" || value === \"\\t\" || value === \"\\r\" || value === \"\\n\";\n}\n\nfunction isXmlWhitespace(value: string): boolean {\n for (const character of value) if (!isXmlSpace(character)) return false;\n return true;\n}\n\nconst XML_QNAME = /^(?:[A-Za-z_][A-Za-z0-9_.-]*:)?[A-Za-z_][A-Za-z0-9_.-]*$/;\n\nconst REQUIRED_NAMESPACE_URIS = new Map([\n [\"a\", \"http://schemas.openxmlformats.org/drawingml/2006/main\"],\n [\"c\", \"http://schemas.openxmlformats.org/drawingml/2006/chart\"],\n [\"p\", \"http://schemas.openxmlformats.org/presentationml/2006/main\"],\n [\"r\", \"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"],\n]);\n","import {\n inflateBoundedZipEntry,\n parseBoundedZip,\n verifyBoundedZipEntry,\n type BoundedZipEntry,\n type BoundedZipFailure,\n} from \"./bounded-zip\";\nimport { FileBlob } from \"./file-blob\";\nimport {\n Presentation,\n PresentationFidelityError,\n type PresentationChartConfig,\n type PresentationChartSeriesConfig,\n type PresentationChartType,\n type PresentationFill,\n type PresentationGroupChildConfig,\n type PresentationGroupConfig,\n type PresentationImageConfig,\n type PresentationLayout,\n type PresentationLine,\n type PresentationMaster,\n type PresentationPosition,\n type PresentationShapeConfig,\n type PresentationShapeGeometry,\n type PresentationTableCellInput,\n type PresentationTableConfig,\n type PresentationTemplateElement,\n type PresentationTextStyle,\n} from \"./presentation\";\nimport {\n PPTX_MEDIA_TYPE,\n PresentationSecurityError,\n type PresentationFidelityIssue,\n type PresentationPptxImportLimits,\n type PresentationPptxImportOptions,\n} from \"./presentation-pptx-api\";\nimport { setPresentationLossState } from \"./presentation-pptx-state\";\nimport {\n parsePptxXmlPart,\n pptxXmlAttribute,\n pptxXmlChild,\n pptxXmlChildren,\n pptxXmlDescendants,\n pptxXmlDirectText,\n pptxXmlQualifiedAttribute,\n pptxXmlText,\n type PptxXmlBudget,\n type PptxXmlElement,\n} from \"./presentation-pptx-xml\";\n\nconst OFFICE_RELATIONSHIP_BASE =\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/\";\nconst PACKAGE_RELATIONSHIP_BASE = \"http://schemas.openxmlformats.org/package/2006/relationships/\";\nconst PRESENTATION_MAIN_TYPE =\n \"application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml\";\nconst PRESENTATION_NAMESPACE = \"http://schemas.openxmlformats.org/presentationml/2006/main\";\nconst DRAWING_NAMESPACE = \"http://schemas.openxmlformats.org/drawingml/2006/main\";\nconst CHART_NAMESPACE = \"http://schemas.openxmlformats.org/drawingml/2006/chart\";\nconst CONTENT_TYPES_NAMESPACE = \"http://schemas.openxmlformats.org/package/2006/content-types\";\nconst RELATIONSHIPS_NAMESPACE = \"http://schemas.openxmlformats.org/package/2006/relationships\";\nconst TABLE_GRAPHIC_URI = \"http://schemas.openxmlformats.org/drawingml/2006/table\";\nconst CHART_GRAPHIC_URI = \"http://schemas.openxmlformats.org/drawingml/2006/chart\";\nconst EMU_PER_PIXEL = 9_525;\n\nexport const DEFAULT_PPTX_IMPORT_LIMITS: PresentationPptxImportLimits = Object.freeze({\n compressedBytes: 128 * 1024 * 1024,\n expandedBytes: 256 * 1024 * 1024,\n entryBytes: 64 * 1024 * 1024,\n entries: 30_000,\n compressionRatio: 100,\n totalXmlBytes: 32 * 1024 * 1024,\n xmlBytes: 8 * 1024 * 1024,\n xmlDepth: 192,\n xmlNodes: 2_000_000,\n xmlAttributesPerElement: 512,\n relationshipsPerPart: 8_192,\n relationships: 50_000,\n slides: 10_000,\n elements: 1_000_000,\n textCharacters: 16_000_000,\n imageBytes: 128 * 1024 * 1024,\n chartPoints: 5_000_000,\n nestedPackageBytes: 32 * 1024 * 1024,\n nestedExpandedBytes: 64 * 1024 * 1024,\n nestedEntries: 20_000,\n retainedBytes: 256 * 1024 * 1024,\n});\n\ntype Relationship = {\n id: string;\n type: string;\n target: string;\n sourcePart: string;\n partName: string;\n};\n\ntype ImportContext = {\n bytes: Uint8Array;\n limits: PresentationPptxImportLimits;\n entries: ReadonlyMap<string, BoundedZipEntry>;\n xmlBudget: PptxXmlBudget;\n xmlCache: Map<string, PptxXmlElement>;\n bytesCache: Map<string, Uint8Array>;\n relationshipsCache: Map<string, readonly Relationship[]>;\n issues: PresentationFidelityIssue[];\n unsupportedParts: Set<string>;\n elements: number;\n textCharacters: number;\n imageBytes: number;\n chartPoints: number;\n relationships: number;\n nestedExpandedBytes: number;\n nestedEntries: number;\n retainedBytes: number;\n themeColors: ReadonlyMap<string, string>;\n};\n\ntype Transform = {\n offsetX: number;\n offsetY: number;\n scaleX: number;\n scaleY: number;\n};\n\ntype ParsedElement = PresentationGroupChildConfig & { placeholderType?: string };\n\nexport async function importPresentationPptx(\n input: FileBlob | Blob | ArrayBuffer | Uint8Array,\n options: PresentationPptxImportOptions = {},\n): Promise<Presentation> {\n const limits = resolveLimits(options.limits);\n const bytes = await toBytes(input);\n if (bytes.byteLength === 0 || bytes.byteLength > limits.compressedBytes) {\n throw pptxSecurity(\n bytes.byteLength === 0 ? \"PPTX input is empty\" : \"PPTX exceeds its compressed byte limit\",\n bytes.byteLength === 0 ? \"invalid-package\" : \"limit-exceeded\",\n );\n }\n const directory = parseBoundedZip(\n bytes,\n {\n entries: limits.entries,\n compressedEntryBytes: limits.compressedBytes,\n expandedEntryBytes: limits.entryBytes,\n expandedBytes: limits.expandedBytes,\n compressionRatio: limits.compressionRatio,\n compressionRatioThreshold: 1_048_576,\n },\n pptxZipFailure,\n );\n const entries = new Map(directory.map((entry) => [entry.name, entry]));\n const context: ImportContext = {\n bytes,\n limits,\n entries,\n xmlBudget: { limits, totalBytes: 0, totalNodes: 0 },\n xmlCache: new Map(),\n bytesCache: new Map(),\n relationshipsCache: new Map(),\n issues: [],\n unsupportedParts: new Set(),\n elements: 0,\n textCharacters: 0,\n imageBytes: 0,\n chartPoints: 0,\n relationships: 0,\n nestedExpandedBytes: 0,\n nestedEntries: 0,\n retainedBytes: bytes.byteLength,\n themeColors: DEFAULT_THEME_COLORS,\n };\n\n await preflightPackage(context);\n const rootRelationships = relationshipsFor(context, \"\");\n const officeDocuments = rootRelationships.filter(\n (relationship) => relationship.type === `${OFFICE_RELATIONSHIP_BASE}officeDocument`,\n );\n if (officeDocuments.length !== 1 || officeDocuments[0]?.partName !== \"ppt/presentation.xml\") {\n throw pptxSecurity(\n \"PPTX must contain exactly one canonical ppt/presentation.xml office document\",\n \"invalid-package\",\n \"_rels/.rels\",\n );\n }\n const presentationRoot = readXml(context, \"ppt/presentation.xml\");\n requireRoot(presentationRoot, \"presentation\", PRESENTATION_NAMESPACE, \"ppt/presentation.xml\");\n const presentationRelationships = relationshipsFor(context, \"ppt/presentation.xml\");\n const presentationRelationshipById = byRelationshipId(presentationRelationships);\n const slideSize = parseSlideSize(presentationRoot);\n\n const themeRelationship = presentationRelationships.find(\n (relationship) => relationship.type === `${OFFICE_RELATIONSHIP_BASE}theme`,\n );\n if (themeRelationship) {\n context.themeColors = parseThemeColors(\n readXml(context, themeRelationship.partName),\n themeRelationship.partName,\n );\n }\n\n const presentation = Presentation.create({ slideSize });\n const masterByPart = new Map<string, PresentationMaster>();\n const layoutByPart = new Map<string, PresentationLayout>();\n importMastersAndLayouts(\n context,\n presentation,\n presentationRoot,\n presentationRelationshipById,\n masterByPart,\n layoutByPart,\n );\n importSlides(context, presentation, presentationRoot, presentationRelationshipById, layoutByPart);\n\n const deduplicatedIssues = deduplicateIssues(context.issues);\n if (options.unsupportedContent === \"error\" && deduplicatedIssues.length > 0) {\n throw new PresentationFidelityError(\n \"PPTX contains inert content that the editable presentation model cannot regenerate exactly\",\n deduplicatedIssues,\n );\n }\n const { presentationModelDigest, sha256Hex } = await import(\"./presentation-pptx-state-digest\");\n setPresentationLossState(presentation, {\n version: 1,\n mediaType: PPTX_MEDIA_TYPE,\n sourceBytes: bytes,\n sourceDigest: await sha256Hex(bytes),\n unsupportedParts: [...context.unsupportedParts].sort(),\n modelDigest: await presentationModelDigest(presentation),\n });\n return presentation;\n}\n\nfunction resolveLimits(\n requested: Partial<PresentationPptxImportLimits> | undefined,\n): PresentationPptxImportLimits {\n const limits = { ...DEFAULT_PPTX_IMPORT_LIMITS, ...requested };\n for (const [name, value] of Object.entries(limits)) {\n if (!Number.isSafeInteger(value) || value <= 0) {\n throw pptxSecurity(`Invalid PPTX import limit: ${name}`, \"limit-exceeded\");\n }\n const maximum = DEFAULT_PPTX_IMPORT_LIMITS[name as keyof PresentationPptxImportLimits];\n if (value > maximum) {\n throw pptxSecurity(\n `PPTX import limit ${name} may only tighten the production maximum`,\n \"limit-exceeded\",\n );\n }\n }\n return limits;\n}\n\nasync function toBytes(input: FileBlob | Blob | ArrayBuffer | Uint8Array): Promise<Uint8Array> {\n if (input instanceof Uint8Array) return input.slice();\n if (input instanceof ArrayBuffer) return new Uint8Array(input.slice(0));\n if (input instanceof Blob) return new Uint8Array(await input.arrayBuffer());\n throw pptxSecurity(\"PPTX input must be a Blob, ArrayBuffer, or Uint8Array\", \"invalid-package\");\n}\n\nasync function preflightPackage(context: ImportContext): Promise<void> {\n if (!context.entries.has(\"[Content_Types].xml\") || !context.entries.has(\"_rels/.rels\")) {\n throw pptxSecurity(\"PPTX is missing required OPC package parts\", \"invalid-package\");\n }\n for (const entry of context.entries.values()) rejectActiveEntry(entry.name, entry.directory);\n for (const entry of context.entries.values()) {\n if (entry.directory) continue;\n if (isXmlPart(entry.name)) {\n const xmlBytes = await inflateBoundedZipEntry(\n context.bytes,\n entry,\n context.limits.entryBytes,\n pptxZipFailure,\n );\n reserveRetained(context, xmlBytes.byteLength * 3, entry.name);\n context.bytesCache.set(entry.name, xmlBytes);\n readXml(context, entry.name);\n } else if (isRasterMediaPart(entry.name)) {\n const imageBytes = await inflateBoundedZipEntry(\n context.bytes,\n entry,\n context.limits.entryBytes,\n pptxZipFailure,\n );\n reserveRetained(context, imageBytes.byteLength, entry.name);\n context.bytesCache.set(entry.name, imageBytes);\n } else if (/^ppt\\/embeddings\\/.*\\.xlsx$/i.test(entry.name)) {\n const nestedBytes = await inflateBoundedZipEntry(\n context.bytes,\n entry,\n context.limits.nestedPackageBytes,\n pptxZipFailure,\n );\n await preflightEmbeddedXlsx(context, entry, nestedBytes);\n } else {\n await verifyBoundedZipEntry(context.bytes, entry, context.limits.entryBytes, pptxZipFailure);\n }\n }\n validateContentTypes(context);\n for (const entry of context.entries.values()) {\n if (!entry.name.endsWith(\".rels\")) continue;\n relationshipsForPart(context, entry.name);\n }\n validateRelationshipTargets(context);\n classifySourceOnlyParts(context);\n}\n\nfunction isXmlPart(name: string): boolean {\n return name === \"[Content_Types].xml\" || /(?:\\.xml|\\.rels)$/i.test(name);\n}\n\nfunction readXml(context: ImportContext, partName: string): PptxXmlElement {\n const cached = context.xmlCache.get(partName);\n if (cached) return cached;\n const bytes = readPartBytes(context, partName);\n const parsed = parsePptxXmlPart(bytes, partName, context.xmlBudget);\n context.xmlCache.set(partName, parsed);\n context.bytesCache.delete(partName);\n return parsed;\n}\n\nfunction readPartBytes(context: ImportContext, partName: string): Uint8Array {\n const cached = context.bytesCache.get(partName);\n if (cached) return cached;\n const entry = context.entries.get(partName);\n if (!entry || entry.directory) {\n throw pptxSecurity(\"Required PPTX part is missing\", \"invalid-package\", partName);\n }\n // XML is inflated synchronously by preflight before projection; cached access is sync.\n throw pptxSecurity(\n \"PPTX part was not inflated during bounded preflight\",\n \"invalid-package\",\n partName,\n );\n}\n\nfunction validateContentTypes(context: ImportContext): void {\n const root = readXml(context, \"[Content_Types].xml\");\n requireRoot(root, \"Types\", CONTENT_TYPES_NAMESPACE, \"[Content_Types].xml\");\n const defaults = new Map<string, string>();\n const overrides = new Map<string, string>();\n for (const child of pptxXmlChildren(root)) {\n if (child.localName === \"Default\") {\n const extension = requiredAttribute(child, \"Extension\", \"[Content_Types].xml\").toLowerCase();\n const contentType = requiredAttribute(child, \"ContentType\", \"[Content_Types].xml\");\n if (defaults.has(extension)) {\n throw pptxSecurity(\n \"Duplicate OPC content-type extension\",\n \"invalid-package\",\n \"[Content_Types].xml\",\n );\n }\n defaults.set(extension, contentType);\n if (!KNOWN_DEFAULT_CONTENT_TYPES.has(`${extension}\\0${contentType}`)) {\n markSourceOnly(context, [\"[Content_Types].xml\"]);\n }\n } else if (child.localName === \"Override\") {\n const name = requiredAttribute(child, \"PartName\", \"[Content_Types].xml\");\n if (!name.startsWith(\"/\") || name.includes(\"\\\\\") || name.includes(\"..\")) {\n throw pptxSecurity(\n \"Unsafe OPC content-type part name\",\n \"invalid-package\",\n \"[Content_Types].xml\",\n );\n }\n const normalized = name.slice(1);\n const contentType = requiredAttribute(child, \"ContentType\", \"[Content_Types].xml\");\n if (overrides.has(normalized.toLowerCase())) {\n throw pptxSecurity(\"Duplicate OPC content-type override\", \"invalid-package\", normalized);\n }\n overrides.set(normalized.toLowerCase(), contentType);\n if (!isKnownPptxPart(normalized)) {\n markSourceOnly(context, [\"[Content_Types].xml\", normalized]);\n }\n } else {\n throw pptxSecurity(\n \"Unknown OPC content-type declaration\",\n \"invalid-package\",\n \"[Content_Types].xml\",\n );\n }\n }\n const presentationType = overrides.get(\"ppt/presentation.xml\");\n if (presentationType !== PRESENTATION_MAIN_TYPE) {\n throw pptxSecurity(\n presentationType?.includes(\"macroEnabled\")\n ? \"Macro-enabled presentations are forbidden\"\n : \"ppt/presentation.xml has the wrong content type\",\n presentationType?.includes(\"macroEnabled\") ? \"active-content\" : \"invalid-package\",\n \"[Content_Types].xml\",\n );\n }\n for (const entry of context.entries.values()) {\n if (entry.directory || entry.name === \"[Content_Types].xml\") continue;\n const extension = entry.name.includes(\".\")\n ? entry.name.slice(entry.name.lastIndexOf(\".\") + 1).toLowerCase()\n : \"\";\n const contentType = overrides.get(entry.name.toLowerCase()) ?? defaults.get(extension);\n if (!contentType) {\n throw pptxSecurity(\"OPC package part lacks a content type\", \"invalid-package\", entry.name);\n }\n if (isActiveContentType(contentType)) {\n throw pptxSecurity(\"Active OPC content type is forbidden\", \"active-content\", entry.name);\n }\n }\n}\n\nfunction relationshipsFor(context: ImportContext, sourcePart: string): readonly Relationship[] {\n return relationshipsForPart(context, relationshipPartName(sourcePart));\n}\n\nfunction relationshipsForPart(\n context: ImportContext,\n relationshipsPart: string,\n): readonly Relationship[] {\n const cached = context.relationshipsCache.get(relationshipsPart);\n if (cached) return cached;\n if (!context.entries.has(relationshipsPart)) {\n if (relationshipsPart === \"_rels/.rels\") {\n throw pptxSecurity(\n \"OPC root relationships are missing\",\n \"invalid-package\",\n relationshipsPart,\n );\n }\n context.relationshipsCache.set(relationshipsPart, []);\n return [];\n }\n const root = readXml(context, relationshipsPart);\n requireRoot(root, \"Relationships\", RELATIONSHIPS_NAMESPACE, relationshipsPart);\n const sourcePart = relationshipSourcePart(relationshipsPart);\n const relationships: Relationship[] = [];\n const ids = new Set<string>();\n for (const child of pptxXmlChildren(root)) {\n if (child.localName !== \"Relationship\" || pptxXmlChildren(child).length > 0) {\n throw pptxSecurity(\"Invalid OPC relationship element\", \"invalid-package\", relationshipsPart);\n }\n if (relationships.length >= context.limits.relationshipsPerPart) {\n throw pptxSecurity(\n \"Relationship part exceeds its relationship limit\",\n \"limit-exceeded\",\n relationshipsPart,\n );\n }\n const id = requiredAttribute(child, \"Id\", relationshipsPart);\n const type = requiredAttribute(child, \"Type\", relationshipsPart);\n const target = requiredAttribute(child, \"Target\", relationshipsPart);\n if (id.length > 512 || type.length > 2_048 || target.length > 4_096 || ids.has(id)) {\n throw pptxSecurity(\n \"Duplicate or oversized OPC relationship\",\n \"invalid-package\",\n relationshipsPart,\n );\n }\n ids.add(id);\n const targetMode = pptxXmlAttribute(child, \"TargetMode\") ?? \"Internal\";\n if (targetMode !== \"Internal\") {\n throw pptxSecurity(\n \"External OPC relationships are forbidden\",\n \"external-relationship\",\n relationshipsPart,\n );\n }\n if (/^(?:https?|ftp|file|data|javascript):/i.test(target)) {\n throw pptxSecurity(\n \"External OPC relationship target is forbidden\",\n \"external-relationship\",\n relationshipsPart,\n );\n }\n const partName = resolvePartTarget(sourcePart, target, relationshipsPart);\n const relationship = { id, type, target, sourcePart, partName };\n validateRelationshipKind(context, relationship, relationshipsPart);\n relationships.push(relationship);\n }\n context.relationships += relationships.length;\n if (context.relationships > context.limits.relationships) {\n throw pptxSecurity(\n \"PPTX exceeds its total relationship limit\",\n \"limit-exceeded\",\n relationshipsPart,\n );\n }\n context.relationshipsCache.set(relationshipsPart, relationships);\n return relationships;\n}\n\nfunction validateRelationshipKind(\n context: ImportContext,\n relationship: Relationship,\n relationshipsPart: string,\n): void {\n const suffix = relationship.type.slice(relationship.type.lastIndexOf(\"/\") + 1);\n const standardOfficeRelationship = relationship.type === `${OFFICE_RELATIONSHIP_BASE}${suffix}`;\n const standardPackageRelationship = relationship.type === `${PACKAGE_RELATIONSHIP_BASE}${suffix}`;\n if (\n !standardOfficeRelationship &&\n !standardPackageRelationship &&\n !ALLOWED_EXACT_RELATIONSHIPS.has(relationship.type)\n ) {\n throw pptxSecurity(\n `Unsupported or non-standard presentation relationship type: ${relationship.type}`,\n \"invalid-package\",\n relationshipsPart,\n );\n }\n if (ACTIVE_RELATIONSHIP_SUFFIX.test(suffix)) {\n throw pptxSecurity(\n \"Active or remote presentation relationship is forbidden\",\n \"active-content\",\n relationshipsPart,\n );\n }\n if (!KNOWN_RELATIONSHIP_SUFFIXES.has(suffix)) {\n markSourceOnly(context, [relationshipsPart, relationship.partName]);\n }\n if (suffix === \"package\") {\n const safeChartWorkbook =\n /^ppt\\/charts\\/chart\\d+\\.xml$/i.test(relationship.sourcePart) &&\n /^ppt\\/embeddings\\/[^/]+\\.xlsx$/i.test(relationship.partName);\n if (!safeChartWorkbook) {\n throw pptxSecurity(\n \"Embedded packages are forbidden outside chart data workbooks\",\n \"active-content\",\n relationshipsPart,\n );\n }\n }\n if (suffix === \"hyperlink\") {\n context.unsupportedParts.add(relationshipsPart);\n context.issues.push(fidelityIssue(\"hyperlink\", [relationshipsPart]));\n }\n if (SOURCE_ONLY_RELATIONSHIP_SUFFIXES.has(suffix)) {\n context.unsupportedParts.add(relationshipsPart);\n context.issues.push(fidelityIssue(\"theme\", [relationshipsPart, relationship.partName]));\n }\n}\n\nfunction classifySourceOnlyParts(context: ImportContext): void {\n for (const entry of context.entries.values()) {\n if (!entry.directory && !isKnownPptxPart(entry.name)) {\n markSourceOnly(context, [entry.name, \"[Content_Types].xml\"]);\n }\n }\n}\n\nfunction markSourceOnly(context: ImportContext, parts: readonly string[]): void {\n for (const part of parts) context.unsupportedParts.add(part);\n context.issues.push(fidelityIssue(\"source-only\", parts));\n}\n\nfunction isKnownPptxPart(name: string): boolean {\n return KNOWN_PPTX_PART_PATTERNS.some((pattern) => pattern.test(name));\n}\n\nfunction isActiveContentType(contentType: string): boolean {\n return /(?:macroEnabled|vbaProject|activeX|oleObject|javascript|ecmascript|x-msdownload|executable|powershell|shellscript|text\\/html)/i.test(\n contentType,\n );\n}\n\nfunction validateRelationshipTargets(context: ImportContext): void {\n for (const relationships of context.relationshipsCache.values()) {\n for (const relationship of relationships) {\n const suffix = relationship.type.slice(relationship.type.lastIndexOf(\"/\") + 1);\n if (suffix === \"hyperlink\") continue;\n if (!context.entries.has(relationship.partName)) {\n throw pptxSecurity(\n \"OPC relationship targets a missing package part\",\n \"invalid-package\",\n relationship.partName,\n );\n }\n }\n }\n}\n\nasync function preflightEmbeddedXlsx(\n context: ImportContext,\n entry: BoundedZipEntry,\n bytes: Uint8Array,\n): Promise<void> {\n if (entry.expandedSize > context.limits.nestedPackageBytes) {\n throw pptxSecurity(\n \"Embedded chart workbook exceeds its byte limit\",\n \"limit-exceeded\",\n entry.name,\n );\n }\n const nested = parseBoundedZip(\n bytes,\n {\n entries: Math.min(context.limits.entries, 10_000),\n compressedEntryBytes: context.limits.nestedPackageBytes,\n expandedEntryBytes: context.limits.nestedPackageBytes,\n expandedBytes: context.limits.nestedPackageBytes,\n compressionRatio: context.limits.compressionRatio,\n compressionRatioThreshold: 1_048_576,\n },\n pptxZipFailure,\n );\n context.nestedEntries += nested.length;\n context.nestedExpandedBytes += nested.reduce((sum, part) => sum + part.expandedSize, 0);\n if (\n context.nestedEntries > context.limits.nestedEntries ||\n context.nestedExpandedBytes > context.limits.nestedExpandedBytes\n ) {\n throw pptxSecurity(\n \"Embedded chart workbooks exceed the global nested archive budget\",\n \"limit-exceeded\",\n entry.name,\n );\n }\n for (const nestedEntry of nested) {\n rejectNestedWorkbookEntry(nestedEntry.name, entry.name);\n if (nestedEntry.directory) continue;\n if (isXmlPart(nestedEntry.name)) {\n const xmlBytes = await inflateBoundedZipEntry(\n bytes,\n nestedEntry,\n context.limits.nestedPackageBytes,\n pptxZipFailure,\n );\n const root = parsePptxXmlPart(\n xmlBytes,\n `${entry.name}!/${nestedEntry.name}`,\n context.xmlBudget,\n );\n if (nestedEntry.name.endsWith(\".rels\")) {\n for (const relationship of pptxXmlChildren(root)) {\n if (relationship.localName !== \"Relationship\") {\n throw pptxSecurity(\n \"Embedded workbook relationship XML is invalid\",\n \"invalid-package\",\n entry.name,\n );\n }\n const targetMode = pptxXmlAttribute(relationship, \"TargetMode\") ?? \"Internal\";\n const target = requiredAttribute(\n relationship,\n \"Target\",\n `${entry.name}!/${nestedEntry.name}`,\n );\n if (\n targetMode !== \"Internal\" ||\n /^(?:https?|ftp|file|data|javascript):/i.test(target) ||\n target.includes(\"\\\\\") ||\n /%(?:2e|2f|5c)/i.test(target)\n ) {\n throw pptxSecurity(\n \"Embedded chart workbook contains an external relationship\",\n \"external-relationship\",\n entry.name,\n );\n }\n }\n }\n if (pptxXmlDescendants(root, \"f\").length > 0) {\n throw pptxSecurity(\n \"Formula-bearing embedded chart workbooks are not retained\",\n \"active-content\",\n entry.name,\n );\n }\n } else {\n await verifyBoundedZipEntry(\n bytes,\n nestedEntry,\n context.limits.nestedPackageBytes,\n pptxZipFailure,\n );\n }\n }\n}\n\nfunction rejectNestedWorkbookEntry(name: string, container: string): void {\n if (\n /(?:^|\\/)(?:vbaProject|vbaData)\\.bin$/i.test(name) ||\n /(?:^|\\/)(?:activeX|embeddings|externalLinks|connections|queryTables|webextensions)(?:\\/|$)/i.test(\n name,\n ) ||\n /\\.(?:exe|dll|com|msi|js|vbs|bat|cmd|ps1|sh|scr|jar)$/i.test(name)\n ) {\n throw pptxSecurity(\n `Embedded chart workbook contains active content: ${name}`,\n \"active-content\",\n container,\n );\n }\n}\n\nfunction rejectActiveEntry(name: string, directory = false): void {\n const safeChartWorkbook = /^ppt\\/embeddings\\/[^/]+\\.xlsx$/i.test(name);\n if (\n /(?:^|\\/)(?:vbaProject|vbaData)\\.bin$/i.test(name) ||\n /(?:^|\\/)(?:activeX|oleObject|externalLinks|connections|webextensions)(?:\\/|$)/i.test(name) ||\n /^ppt\\/(?:audio|video)\\//i.test(name) ||\n (/^ppt\\/embeddings\\//i.test(name) && !directory && !safeChartWorkbook) ||\n (!directory && /\\.(?:zip|docx|dotx|xlsx|xltx|pptx|ppsx)$/i.test(name) && !safeChartWorkbook) ||\n /\\.(?:exe|dll|com|msi|js|vbs|vbe|bat|cmd|ps1|sh|scr|jar|ppam|pptm|svg|svgz|html?|mhtml)$/i.test(\n name,\n )\n ) {\n throw pptxSecurity(\"Active presentation content is forbidden\", \"active-content\", name);\n }\n}\n\nfunction isRasterMediaPart(name: string): boolean {\n return /^ppt\\/media\\/[^/]+\\.(?:png|jpe?g|gif|webp)$/i.test(name);\n}\n\nfunction reserveRetained(context: ImportContext, bytes: number, partName: string): void {\n context.retainedBytes += bytes;\n if (context.retainedBytes > context.limits.retainedBytes) {\n throw pptxSecurity(\"PPTX exceeds its retained-memory budget\", \"limit-exceeded\", partName);\n }\n}\n\nfunction importMastersAndLayouts(\n context: ImportContext,\n presentation: Presentation,\n presentationRoot: PptxXmlElement,\n presentationRelationships: ReadonlyMap<string, Relationship>,\n masterByPart: Map<string, PresentationMaster>,\n layoutByPart: Map<string, PresentationLayout>,\n): void {\n const masterIds = pptxXmlChildren(pptxXmlChild(presentationRoot, \"sldMasterIdLst\"));\n for (const masterId of masterIds) {\n const relationshipId = requiredRelationshipId(masterId, \"ppt/presentation.xml\");\n const relationship = presentationRelationships.get(relationshipId);\n if (!relationship || relationship.type !== `${OFFICE_RELATIONSHIP_BASE}slideMaster`) {\n throw pptxSecurity(\n \"Slide master id references the wrong relationship\",\n \"invalid-package\",\n \"ppt/presentation.xml\",\n );\n }\n const masterRoot = readXml(context, relationship.partName);\n requireRoot(masterRoot, \"sldMaster\", PRESENTATION_NAMESPACE, relationship.partName);\n const common = requiredChild(masterRoot, \"cSld\", relationship.partName);\n const masterRelationships = byRelationshipId(relationshipsFor(context, relationship.partName));\n const elements = parseTemplateTree(\n context,\n requiredChild(common, \"spTree\", relationship.partName),\n masterRelationships,\n relationship.partName,\n );\n const master = presentation.masters.add({\n name: pptxXmlAttribute(common, \"name\") ?? `Master ${presentation.masters.items.length + 1}`,\n background: parseBackground(context, common),\n elements,\n });\n masterByPart.set(relationship.partName, master);\n\n for (const layoutId of pptxXmlChildren(pptxXmlChild(masterRoot, \"sldLayoutIdLst\"))) {\n const layoutRelationshipId = requiredRelationshipId(layoutId, relationship.partName);\n const layoutRelationship = masterRelationships.get(layoutRelationshipId);\n if (\n !layoutRelationship ||\n layoutRelationship.type !== `${OFFICE_RELATIONSHIP_BASE}slideLayout`\n ) {\n throw pptxSecurity(\n \"Slide layout id references the wrong relationship\",\n \"invalid-package\",\n relationship.partName,\n );\n }\n if (layoutByPart.has(layoutRelationship.partName)) continue;\n const layoutRoot = readXml(context, layoutRelationship.partName);\n requireRoot(layoutRoot, \"sldLayout\", PRESENTATION_NAMESPACE, layoutRelationship.partName);\n const layoutCommon = requiredChild(layoutRoot, \"cSld\", layoutRelationship.partName);\n const layoutRelationships = byRelationshipId(\n relationshipsFor(context, layoutRelationship.partName),\n );\n const parent = [...layoutRelationships.values()].find(\n (candidate) => candidate.type === `${OFFICE_RELATIONSHIP_BASE}slideMaster`,\n );\n if (!parent || parent.partName !== relationship.partName) {\n throw pptxSecurity(\n \"Slide layout does not link back to its master\",\n \"invalid-package\",\n layoutRelationship.partName,\n );\n }\n const layout = presentation.layouts.add({\n name:\n pptxXmlAttribute(layoutCommon, \"name\") ??\n `Layout ${presentation.layouts.items.length + 1}`,\n masterId: master.id,\n background: parseBackground(context, layoutCommon),\n elements: parseTemplateTree(\n context,\n requiredChild(layoutCommon, \"spTree\", layoutRelationship.partName),\n layoutRelationships,\n layoutRelationship.partName,\n ),\n });\n layoutByPart.set(layoutRelationship.partName, layout);\n }\n }\n}\n\nfunction importSlides(\n context: ImportContext,\n presentation: Presentation,\n presentationRoot: PptxXmlElement,\n presentationRelationships: ReadonlyMap<string, Relationship>,\n layoutByPart: ReadonlyMap<string, PresentationLayout>,\n): void {\n const slideIds = pptxXmlChildren(pptxXmlChild(presentationRoot, \"sldIdLst\"));\n if (slideIds.length > context.limits.slides) {\n throw pptxSecurity(\"PPTX exceeds its slide limit\", \"limit-exceeded\", \"ppt/presentation.xml\");\n }\n const seenParts = new Set<string>();\n for (const slideId of slideIds) {\n const relationshipId = requiredRelationshipId(slideId, \"ppt/presentation.xml\");\n const relationship = presentationRelationships.get(relationshipId);\n if (\n !relationship ||\n relationship.type !== `${OFFICE_RELATIONSHIP_BASE}slide` ||\n seenParts.has(relationship.partName)\n ) {\n throw pptxSecurity(\n \"Slide id references an invalid or duplicate slide\",\n \"invalid-package\",\n \"ppt/presentation.xml\",\n );\n }\n seenParts.add(relationship.partName);\n const root = readXml(context, relationship.partName);\n requireRoot(root, \"sld\", PRESENTATION_NAMESPACE, relationship.partName);\n const common = requiredChild(root, \"cSld\", relationship.partName);\n const relationships = relationshipsFor(context, relationship.partName);\n const relationshipById = byRelationshipId(relationships);\n const slide = presentation.slides.add();\n slide.title = pptxXmlAttribute(common, \"name\") ?? \"\";\n slide.background.fill = parseBackground(context, common);\n const layoutRelationship = relationships.find(\n (candidate) => candidate.type === `${OFFICE_RELATIONSHIP_BASE}slideLayout`,\n );\n if (!layoutRelationship) {\n throw pptxSecurity(\n \"Slide lacks a slide-layout relationship\",\n \"invalid-package\",\n relationship.partName,\n );\n }\n const layout = layoutByPart.get(layoutRelationship.partName);\n if (!layout) {\n throw pptxSecurity(\n \"Slide references an unknown slide layout\",\n \"invalid-package\",\n relationship.partName,\n );\n }\n slide.setLayout(layout);\n const parsed = parseSceneTree(\n context,\n requiredChild(common, \"spTree\", relationship.partName),\n relationshipById,\n relationship.partName,\n );\n let derivedTitle: string | undefined;\n for (const element of parsed) {\n switch (element.kind) {\n case \"shape\": {\n const shape = slide.shapes.add(element.config);\n if (\n !derivedTitle &&\n (shape.placeholder?.type === \"title\" || shape.placeholder?.type === \"ctrTitle\") &&\n shape.text.toString().length > 0\n )\n derivedTitle = shape.text.toString();\n break;\n }\n case \"chart\":\n slide.charts.add(element.type, element.config ?? {});\n break;\n case \"image\":\n slide.images.add(element.config);\n break;\n case \"table\":\n slide.tables.add(element.config);\n break;\n case \"group\":\n slide.groups.add(element.config);\n break;\n }\n }\n if (derivedTitle) slide.title = derivedTitle;\n const notesRelationship = relationships.find(\n (candidate) => candidate.type === `${OFFICE_RELATIONSHIP_BASE}notesSlide`,\n );\n if (notesRelationship) slide.notes.set(parseNotes(context, notesRelationship.partName));\n if (pptxXmlChild(root, \"transition\"))\n addUnsupported(context, \"transition\", relationship.partName);\n if (pptxXmlChild(root, \"timing\")) addUnsupported(context, \"animation\", relationship.partName);\n }\n}\n\nfunction parseTemplateTree(\n context: ImportContext,\n tree: PptxXmlElement,\n relationships: ReadonlyMap<string, Relationship>,\n partName: string,\n): PresentationTemplateElement[] {\n const output: PresentationTemplateElement[] = [];\n for (const element of parseSceneTree(context, tree, relationships, partName)) {\n if (element.kind === \"group\") {\n // The model keeps true groups on slides; template groups remain source-preserved\n // until the package-native writer supports inherited nested group transforms.\n addUnsupported(context, \"group\", partName);\n } else output.push(element);\n }\n return output;\n}\n\nfunction parseSceneTree(\n context: ImportContext,\n tree: PptxXmlElement,\n relationships: ReadonlyMap<string, Relationship>,\n partName: string,\n transform: Transform = IDENTITY_TRANSFORM,\n depth = 0,\n): ParsedElement[] {\n if (depth > 32)\n throw pptxSecurity(\"Presentation group nesting exceeds its limit\", \"limit-exceeded\", partName);\n const output: ParsedElement[] = [];\n for (const element of pptxXmlChildren(tree)) {\n if (element.localName === \"nvGrpSpPr\" || element.localName === \"grpSpPr\") continue;\n consumeElement(context, partName);\n switch (element.localName) {\n case \"sp\":\n case \"cxnSp\":\n if (element.localName === \"cxnSp\") {\n addUnsupported(context, \"connector\", partName, \"style-approximated\");\n }\n output.push({ kind: \"shape\", config: parseShape(context, element, partName, transform) });\n break;\n case \"pic\":\n {\n const image = parseImage(context, element, relationships, partName, transform);\n if (image) output.push({ kind: \"image\", config: image });\n }\n break;\n case \"graphicFrame\": {\n const graphicData = pptxXmlDescendants(element, \"graphicData\")[0];\n const uri = pptxXmlAttribute(graphicData, \"uri\");\n if (uri === TABLE_GRAPHIC_URI) {\n output.push({ kind: \"table\", config: parseTable(context, element, partName, transform) });\n } else if (uri === CHART_GRAPHIC_URI) {\n const chartRef = pptxXmlDescendants(graphicData, \"chart\")[0];\n const relationshipId = requiredRelationshipId(chartRef, partName);\n const relationship = relationships.get(relationshipId);\n if (!relationship || relationship.type !== `${OFFICE_RELATIONSHIP_BASE}chart`) {\n throw pptxSecurity(\n \"Chart frame references the wrong relationship\",\n \"invalid-package\",\n partName,\n );\n }\n const parsed = parseChart(context, relationship.partName);\n if (parsed) {\n const frameName = nonVisualName(element);\n if (frameName) parsed.config.name = frameName;\n parsed.config.position = parseFramePosition(element, partName, transform);\n output.push({ kind: \"chart\", ...parsed });\n }\n } else {\n addUnsupported(context, \"smart-art\", partName);\n }\n break;\n }\n case \"grpSp\": {\n const group = parseGroup(context, element, relationships, partName, transform, depth + 1);\n output.push({ kind: \"group\", config: group });\n break;\n }\n case \"contentPart\":\n case \"alternateContent\":\n case \"extLst\":\n addUnsupported(context, \"custom-geometry\", partName);\n break;\n default:\n addUnsupported(context, \"custom-geometry\", partName);\n }\n }\n return output;\n}\n\nfunction parseGroup(\n context: ImportContext,\n group: PptxXmlElement,\n relationships: ReadonlyMap<string, Relationship>,\n partName: string,\n parentTransform: Transform,\n depth: number,\n): PresentationGroupConfig {\n const properties = requiredChild(group, \"grpSpPr\", partName);\n const xfrm = requiredChild(properties, \"xfrm\", partName);\n const rawPosition = rawPositionFromXfrm(xfrm, partName);\n const childOffsetElement = requiredChild(xfrm, \"chOff\", partName);\n const childExtentElement = requiredChild(xfrm, \"chExt\", partName);\n const childOffset = {\n left: emuNumber(requiredAttribute(childOffsetElement, \"x\", partName), partName),\n top: emuNumber(requiredAttribute(childOffsetElement, \"y\", partName), partName),\n };\n const childExtent = {\n width: positiveEmu(requiredAttribute(childExtentElement, \"cx\", partName), partName),\n height: positiveEmu(requiredAttribute(childExtentElement, \"cy\", partName), partName),\n };\n const position = applyTransform(rawPosition, parentTransform);\n const name = nonVisualName(group) ?? `Group ${context.elements}`;\n return {\n name,\n position,\n childOffset,\n childExtent,\n rotation: rotationFromXfrm(xfrm, partName),\n flipHorizontal: booleanAttribute(xfrm, \"flipH\"),\n flipVertical: booleanAttribute(xfrm, \"flipV\"),\n children: parseSceneTree(context, group, relationships, partName, IDENTITY_TRANSFORM, depth),\n };\n}\n\nfunction parseShape(\n context: ImportContext,\n element: PptxXmlElement,\n partName: string,\n transform: Transform,\n): PresentationShapeConfig {\n const properties = pptxXmlChild(element, \"spPr\");\n const xfrm = pptxXmlChild(properties, \"xfrm\");\n const position = xfrm\n ? applyTransform(rawPositionFromXfrm(xfrm, partName), transform)\n : applyTransform({ left: 0, top: 0, width: 1, height: 1 }, transform);\n const preset =\n pptxXmlAttribute(pptxXmlChild(properties, \"prstGeom\"), \"prst\") ??\n (element.localName === \"cxnSp\" ? \"line\" : \"rect\");\n const geometry = mapGeometry(context, preset, partName);\n const text = parseTextBody(context, pptxXmlChild(element, \"txBody\"), partName);\n const placeholderElement = pptxXmlDescendants(\n pptxXmlChild(element, element.localName === \"cxnSp\" ? \"nvCxnSpPr\" : \"nvSpPr\"),\n \"ph\",\n )[0];\n const placeholderType = pptxXmlAttribute(placeholderElement, \"type\");\n const placeholderIndex = optionalInteger(pptxXmlAttribute(placeholderElement, \"idx\"), partName);\n return {\n geometry,\n name: nonVisualName(element) ?? `Shape ${context.elements}`,\n position,\n fill: parseFill(context, properties, \"white\") ?? \"white\",\n line: parseLine(context, pptxXmlChild(properties, \"ln\"), partName),\n text: text.value,\n textStyle: text.style,\n rotation: xfrm ? rotationFromXfrm(xfrm, partName) : 0,\n ...(placeholderType\n ? {\n placeholder: {\n type: placeholderType,\n ...(placeholderIndex === undefined ? {} : { index: placeholderIndex }),\n },\n }\n : {}),\n };\n}\n\nfunction parseImage(\n context: ImportContext,\n element: PptxXmlElement,\n relationships: ReadonlyMap<string, Relationship>,\n partName: string,\n transform: Transform,\n): PresentationImageConfig | undefined {\n const blip = pptxXmlDescendants(element, \"blip\")[0];\n const relationshipId = requiredRelationshipId(blip, partName, \"embed\");\n const relationship = relationships.get(relationshipId);\n if (!relationship || relationship.type !== `${OFFICE_RELATIONSHIP_BASE}image`) {\n throw pptxSecurity(\"Picture references the wrong relationship\", \"invalid-package\", partName);\n }\n if (!isRasterMediaPart(relationship.partName)) {\n addUnsupported(context, \"media\", relationship.partName);\n return undefined;\n }\n const bytes = readPartBytes(context, relationship.partName);\n context.imageBytes += bytes.byteLength;\n if (context.imageBytes > context.limits.imageBytes) {\n throw pptxSecurity(\n \"PPTX exceeds its decoded image byte limit\",\n \"limit-exceeded\",\n relationship.partName,\n );\n }\n const properties = requiredChild(element, \"spPr\", partName);\n const xfrm = requiredChild(properties, \"xfrm\", partName);\n const cropElement = pptxXmlDescendants(pptxXmlChild(element, \"blipFill\"), \"srcRect\")[0];\n const crop = cropElement\n ? {\n left: cropPercent(pptxXmlAttribute(cropElement, \"l\"), partName),\n top: cropPercent(pptxXmlAttribute(cropElement, \"t\"), partName),\n right: cropPercent(pptxXmlAttribute(cropElement, \"r\"), partName),\n bottom: cropPercent(pptxXmlAttribute(cropElement, \"b\"), partName),\n }\n : undefined;\n const geometry = mapImageGeometry(\n pptxXmlAttribute(pptxXmlChild(properties, \"prstGeom\"), \"prst\") ?? \"rect\",\n );\n const name = nonVisualName(element) ?? `Image ${context.elements}`;\n const description = nonVisualDescription(element) ?? \"\";\n const imageConfig: PresentationImageConfig = {\n blob: bytes.slice(),\n contentType: rasterContentType(relationship.partName),\n name,\n alt: description,\n position: applyTransform(rawPositionFromXfrm(xfrm, partName), transform),\n fit: crop ? \"cover\" : \"contain\",\n geometry,\n rotation: rotationFromXfrm(xfrm, partName),\n flipHorizontal: booleanAttribute(xfrm, \"flipH\"),\n flipVertical: booleanAttribute(xfrm, \"flipV\"),\n lockAspectRatio: booleanAttribute(pptxXmlDescendants(element, \"picLocks\")[0], \"noChangeAspect\"),\n ...(crop ? { crop } : {}),\n };\n return imageConfig;\n}\n\nfunction parseTable(\n context: ImportContext,\n frame: PptxXmlElement,\n partName: string,\n transform: Transform,\n): PresentationTableConfig {\n const table = pptxXmlDescendants(frame, \"tbl\")[0];\n if (!table) throw pptxSecurity(\"Table frame lacks table data\", \"invalid-package\", partName);\n const grid = requiredChild(table, \"tblGrid\", partName);\n const columnWidths = pptxXmlChildren(grid).map((column) =>\n positiveEmu(requiredAttribute(column, \"w\", partName), partName),\n );\n if (columnWidths.length === 0) {\n throw pptxSecurity(\"Presentation table has no columns\", \"invalid-package\", partName);\n }\n const rowElements = pptxXmlChildren(table).filter((child) => child.localName === \"tr\");\n const rows: PresentationTableCellInput[][] = [];\n const rowHeights: number[] = [];\n const occupied = Array.from(\n { length: rowElements.length },\n () => new Uint8Array(columnWidths.length),\n );\n for (const [rowIndex, rowElement] of rowElements.entries()) {\n rowHeights.push(positiveEmu(requiredAttribute(rowElement, \"h\", partName), partName));\n const row: PresentationTableCellInput[] = Array.from(\n { length: columnWidths.length },\n () => null,\n );\n let column = 0;\n for (const cellElement of pptxXmlChildren(rowElement).filter(\n (child) => child.localName === \"tc\",\n )) {\n if (column >= columnWidths.length) {\n throw pptxSecurity(\"Presentation table row exceeds its grid\", \"invalid-package\", partName);\n }\n const properties = pptxXmlChild(cellElement, \"tcPr\");\n const horizontalMerge =\n booleanAttribute(cellElement, \"hMerge\") || booleanAttribute(properties, \"hMerge\");\n const verticalMerge =\n booleanAttribute(cellElement, \"vMerge\") || booleanAttribute(properties, \"vMerge\");\n if (horizontalMerge || verticalMerge) {\n // Covered continuation slots are represented as null. The anchor's span\n // attributes carry semantic occupancy.\n if (occupied[rowIndex]![column] === 0) {\n throw pptxSecurity(\n \"Presentation table merge continuation has no spanning anchor\",\n \"invalid-package\",\n partName,\n );\n }\n column += 1;\n continue;\n }\n if (occupied[rowIndex]![column] !== 0) {\n throw pptxSecurity(\"Presentation table spans overlap\", \"invalid-package\", partName);\n }\n const colSpan =\n optionalPositiveInteger(\n pptxXmlAttribute(cellElement, \"gridSpan\") ?? pptxXmlAttribute(properties, \"gridSpan\"),\n partName,\n ) ?? 1;\n const rowSpan =\n optionalPositiveInteger(\n pptxXmlAttribute(cellElement, \"rowSpan\") ?? pptxXmlAttribute(properties, \"rowSpan\"),\n partName,\n ) ?? 1;\n if (column + colSpan > columnWidths.length || rowIndex + rowSpan > rowElements.length) {\n throw pptxSecurity(\n \"Presentation table cell span exceeds its grid\",\n \"invalid-package\",\n partName,\n );\n }\n const text = parseTextBody(context, pptxXmlChild(cellElement, \"txBody\"), partName);\n row[column] = {\n text: text.value,\n textStyle: text.style,\n fill: parseFill(context, properties, \"white\") ?? \"white\",\n colSpan,\n rowSpan,\n };\n for (let occupiedRow = rowIndex; occupiedRow < rowIndex + rowSpan; occupiedRow += 1) {\n for (let occupiedColumn = column; occupiedColumn < column + colSpan; occupiedColumn += 1) {\n if (occupiedRow === rowIndex && occupiedColumn === column) continue;\n if (occupied[occupiedRow]![occupiedColumn] !== 0) {\n throw pptxSecurity(\"Presentation table spans overlap\", \"invalid-package\", partName);\n }\n occupied[occupiedRow]![occupiedColumn] = 1;\n }\n }\n // DrawingML retains one physical <a:tc> per grid slot. A spanning anchor\n // is followed by hMerge/vMerge continuation cells, so advance by one\n // physical slot rather than by the semantic span.\n column += 1;\n }\n if (column !== columnWidths.length) {\n throw pptxSecurity(\n \"Presentation table row does not cover its grid\",\n \"invalid-package\",\n partName,\n );\n }\n rows.push(row);\n }\n for (let row = 0; row < rows.length; row += 1) {\n for (let column = 0; column < columnWidths.length; column += 1) {\n if (rows[row]![column] === null && occupied[row]![column] === 0) {\n throw pptxSecurity(\n \"Presentation table has an uncovered grid slot\",\n \"invalid-package\",\n partName,\n );\n }\n }\n }\n if (pptxXmlChild(table, \"tblPr\")) {\n const styleId = pptxXmlText(pptxXmlChild(pptxXmlChild(table, \"tblPr\"), \"tableStyleId\"));\n if (styleId) addUnsupported(context, \"table-style\", partName);\n }\n return {\n name: nonVisualName(frame) ?? `Table ${context.elements}`,\n position: parseFramePosition(frame, partName, transform),\n rows,\n columnWidths,\n rowHeights,\n };\n}\n\nfunction parseChart(\n context: ImportContext,\n partName: string,\n): { type: PresentationChartType; config: PresentationChartConfig } | undefined {\n const root = readXml(context, partName);\n requireRoot(root, \"chartSpace\", CHART_NAMESPACE, partName);\n const chart = requiredChild(root, \"chart\", partName);\n const plot = requiredChild(chart, \"plotArea\", partName);\n const chartElement = pptxXmlChildren(plot).find((candidate) =>\n CHART_ELEMENT_TYPES.has(candidate.localName),\n );\n if (!chartElement) {\n addUnsupported(context, \"unsupported-chart\", partName);\n return undefined;\n }\n const type = CHART_ELEMENT_TYPES.get(chartElement.localName)!;\n if (chartElement.localName.includes(\"3D\")) {\n addUnsupported(context, \"unsupported-chart\", partName, \"style-approximated\");\n }\n const series: PresentationChartSeriesConfig[] = [];\n for (const seriesElement of pptxXmlChildren(chartElement).filter(\n (candidate) => candidate.localName === \"ser\",\n )) {\n const name =\n parseChartString(pptxXmlChild(seriesElement, \"tx\")) || `Series ${series.length + 1}`;\n const categories = parseChartCategories(pptxXmlChild(seriesElement, \"cat\"));\n const values = parseChartNumbers(\n pptxXmlChild(seriesElement, type === \"scatter\" || type === \"bubble\" ? \"yVal\" : \"val\"),\n context,\n partName,\n );\n const xValues = parseChartNumbers(pptxXmlChild(seriesElement, \"xVal\"), context, partName);\n const bubbleSizes = parseChartNumbers(\n pptxXmlChild(seriesElement, \"bubbleSize\"),\n context,\n partName,\n );\n const fill = parseFill(context, pptxXmlChild(seriesElement, \"spPr\"), undefined);\n series.push({\n name,\n categories,\n values,\n ...(xValues.length > 0 ? { xValues } : {}),\n ...(bubbleSizes.length > 0 ? { bubbleSizes } : {}),\n ...(fill ? { fill } : {}),\n });\n }\n const categories =\n series.find((candidate) => (candidate.categories?.length ?? 0) > 0)?.categories ?? [];\n const legend = pptxXmlChild(chart, \"legend\");\n const labels = pptxXmlChild(chartElement, \"dLbls\");\n const axes = pptxXmlChildren(plot).filter((candidate) => candidate.localName.endsWith(\"Ax\"));\n const categoryAxis = axes.find(\n (axis) => axis.localName === \"catAx\" || axis.localName === \"dateAx\",\n );\n const valueAxis = axes.find((axis) => axis.localName === \"valAx\");\n return {\n type,\n config: {\n name: `Chart ${context.elements}`,\n title: parseChartString(pptxXmlChild(chart, \"title\")),\n categories,\n series,\n hasLegend: Boolean(legend) && !booleanAttribute(pptxXmlChild(legend, \"delete\"), \"val\"),\n ...(legend\n ? {\n legend: {\n position: chartLegendPosition(\n pptxXmlAttribute(pptxXmlChild(legend, \"legendPos\"), \"val\"),\n ),\n },\n }\n : {}),\n ...(parseChartAxis(categoryAxis) ? { xAxis: parseChartAxis(categoryAxis)! } : {}),\n ...(parseChartAxis(valueAxis) ? { yAxis: parseChartAxis(valueAxis)! } : {}),\n dataLabels: {\n showValue: booleanAttribute(pptxXmlChild(labels, \"showVal\"), \"val\"),\n showSeriesName: booleanAttribute(pptxXmlChild(labels, \"showSerName\"), \"val\"),\n showCategoryName: booleanAttribute(pptxXmlChild(labels, \"showCatName\"), \"val\"),\n showPercent: booleanAttribute(pptxXmlChild(labels, \"showPercent\"), \"val\"),\n },\n },\n };\n}\n\nfunction parseNotes(context: ImportContext, partName: string): string {\n const root = readXml(context, partName);\n requireRoot(root, \"notes\", PRESENTATION_NAMESPACE, partName);\n const common = requiredChild(root, \"cSld\", partName);\n const tree = requiredChild(common, \"spTree\", partName);\n const paragraphs: string[] = [];\n for (const shape of pptxXmlChildren(tree).filter((child) => child.localName === \"sp\")) {\n const placeholder = pptxXmlDescendants(shape, \"ph\")[0];\n const type = pptxXmlAttribute(placeholder, \"type\");\n if (type !== \"body\") continue;\n const text = parseTextBody(context, pptxXmlChild(shape, \"txBody\"), partName).value;\n if (text.length > 0) paragraphs.push(text);\n }\n return paragraphs.join(\"\\n\");\n}\n\nfunction parseTextBody(\n context: ImportContext,\n body: PptxXmlElement | undefined,\n partName: string,\n): { value: string; style: PresentationTextStyle } {\n if (!body) return { value: \"\", style: {} };\n const paragraphs: string[] = [];\n const styles: PresentationTextStyle[] = [];\n let paragraphAlignment: PresentationTextStyle[\"alignment\"];\n for (const paragraph of pptxXmlChildren(body).filter((child) => child.localName === \"p\")) {\n const parts: string[] = [];\n const paragraphProperties = pptxXmlChild(paragraph, \"pPr\");\n const alignment = mapTextAlignment(pptxXmlAttribute(paragraphProperties, \"algn\"));\n if (alignment && !paragraphAlignment) paragraphAlignment = alignment;\n for (const child of pptxXmlChildren(paragraph)) {\n if (child.localName === \"r\" || child.localName === \"fld\") {\n const text = pptxXmlDirectText(pptxXmlChild(child, \"t\"));\n consumeText(context, text.length, partName);\n parts.push(text);\n const properties = pptxXmlChild(child, \"rPr\");\n if (properties) styles.push(parseTextStyle(context, properties, body));\n } else if (child.localName === \"br\") parts.push(\"\\n\");\n }\n paragraphs.push(parts.join(\"\"));\n }\n const value = paragraphs.join(\"\\n\");\n const firstStyle = styles[0] ?? {};\n if (styles.some((style) => JSON.stringify(style) !== JSON.stringify(firstStyle))) {\n addUnsupported(context, \"theme\", partName, \"style-approximated\");\n }\n const verticalAlignment = mapVerticalAlignment(\n pptxXmlAttribute(pptxXmlChild(body, \"bodyPr\"), \"anchor\"),\n );\n return {\n value,\n style: {\n ...firstStyle,\n ...(paragraphAlignment ? { alignment: paragraphAlignment } : {}),\n ...(verticalAlignment ? { verticalAlignment } : {}),\n },\n };\n}\n\nfunction parseTextStyle(\n context: ImportContext,\n properties: PptxXmlElement,\n body: PptxXmlElement,\n): PresentationTextStyle {\n const size = optionalNumber(pptxXmlAttribute(properties, \"sz\"));\n const font = pptxXmlAttribute(pptxXmlChild(properties, \"latin\"), \"typeface\");\n const fill = parseFill(context, properties, undefined);\n const underline = pptxXmlAttribute(properties, \"u\");\n const verticalAlignment = mapVerticalAlignment(\n pptxXmlAttribute(pptxXmlChild(body, \"bodyPr\"), \"anchor\"),\n );\n return {\n ...(font && !font.startsWith(\"+\") ? { fontFamily: font } : {}),\n ...(size !== undefined ? { fontSize: size / 75 } : {}),\n bold: booleanAttribute(properties, \"b\"),\n italic: booleanAttribute(properties, \"i\"),\n underline: underline !== undefined && underline !== \"none\",\n ...(fill && fill !== \"none\" ? { color: typeof fill === \"string\" ? fill : fill.color } : {}),\n ...(verticalAlignment ? { verticalAlignment } : {}),\n };\n}\n\nfunction parseBackground(context: ImportContext, common: PptxXmlElement): PresentationFill {\n const background = pptxXmlChild(common, \"bg\");\n if (!background) return \"white\";\n const properties = pptxXmlChild(background, \"bgPr\");\n if (properties) return parseFill(context, properties, \"white\") ?? \"white\";\n const reference = pptxXmlChild(background, \"bgRef\");\n const scheme = pptxXmlAttribute(pptxXmlChild(reference, \"schemeClr\"), \"val\");\n return scheme ? (context.themeColors.get(scheme) ?? \"white\") : \"white\";\n}\n\nfunction parseFill(\n context: ImportContext,\n parent: PptxXmlElement | undefined,\n fallback: PresentationFill | undefined,\n): PresentationFill | undefined {\n if (!parent) return fallback;\n if (pptxXmlChild(parent, \"noFill\")) return \"none\";\n const solid = pptxXmlChild(parent, \"solidFill\");\n if (!solid) return fallback;\n const srgb = pptxXmlChild(solid, \"srgbClr\");\n const scheme = pptxXmlChild(solid, \"schemeClr\");\n const system = pptxXmlChild(solid, \"sysClr\");\n const alpha = optionalNumber(\n pptxXmlAttribute(pptxXmlChild(srgb ?? scheme ?? system, \"alpha\"), \"val\"),\n );\n if (alpha === 0) return \"none\";\n const srgbValue = pptxXmlAttribute(srgb, \"val\");\n if (srgbValue && /^[0-9A-Fa-f]{6}$/.test(srgbValue)) return `#${srgbValue.toLowerCase()}`;\n const schemeValue = pptxXmlAttribute(scheme, \"val\");\n if (schemeValue) return context.themeColors.get(schemeValue) ?? fallback ?? \"#000000\";\n const systemValue = pptxXmlAttribute(system, \"lastClr\");\n if (systemValue && /^[0-9A-Fa-f]{6}$/.test(systemValue)) return `#${systemValue.toLowerCase()}`;\n return fallback;\n}\n\nfunction parseLine(\n context: ImportContext,\n line: PptxXmlElement | undefined,\n partName: string,\n): PresentationLine {\n if (!line) return { style: \"none\", fill: \"none\", width: 0 };\n const width = optionalNumber(pptxXmlAttribute(line, \"w\"));\n const dash = pptxXmlAttribute(pptxXmlChild(line, \"prstDash\"), \"val\");\n const style =\n dash === \"dot\" || dash === \"sysDot\" ? \"dot\" : dash && dash !== \"solid\" ? \"dash\" : \"solid\";\n if (dash && ![\"solid\", \"dot\", \"sysDot\", \"dash\", \"sysDash\", \"lgDash\"].includes(dash)) {\n addUnsupported(context, \"theme\", partName, \"style-approximated\");\n }\n const fill = parseFill(context, line, \"#000000\") ?? \"#000000\";\n return fill === \"none\"\n ? { style: \"none\", fill: \"none\", width: 0 }\n : { style, fill, width: width === undefined ? 1 : width / EMU_PER_PIXEL };\n}\n\nfunction parseFramePosition(\n frame: PptxXmlElement,\n partName: string,\n transform: Transform,\n): PresentationPosition {\n const xfrm = requiredChild(frame, \"xfrm\", partName);\n return applyTransform(rawPositionFromXfrm(xfrm, partName), transform);\n}\n\nfunction rawPositionFromXfrm(xfrm: PptxXmlElement, partName: string): PresentationPosition {\n const offset = requiredChild(xfrm, \"off\", partName);\n const extent = requiredChild(xfrm, \"ext\", partName);\n return {\n left: emuNumber(requiredAttribute(offset, \"x\", partName), partName),\n top: emuNumber(requiredAttribute(offset, \"y\", partName), partName),\n width: positiveEmu(requiredAttribute(extent, \"cx\", partName), partName),\n height: positiveEmu(requiredAttribute(extent, \"cy\", partName), partName),\n };\n}\n\nfunction applyTransform(\n position: PresentationPosition,\n transform: Transform,\n): PresentationPosition {\n return {\n left: transform.offsetX + position.left * transform.scaleX,\n top: transform.offsetY + position.top * transform.scaleY,\n width: position.width * transform.scaleX,\n height: position.height * transform.scaleY,\n };\n}\n\nfunction rotationFromXfrm(xfrm: PptxXmlElement, partName: string): number {\n const raw = pptxXmlAttribute(xfrm, \"rot\");\n if (raw === undefined) return 0;\n const value = Number(raw);\n if (!Number.isSafeInteger(value) || Math.abs(value) > 21_600_000) {\n throw pptxSecurity(\"Shape rotation is invalid\", \"invalid-package\", partName);\n }\n return value / 60_000;\n}\n\nfunction mapGeometry(\n context: ImportContext,\n preset: string,\n partName: string,\n): PresentationShapeGeometry {\n const mapped = GEOMETRY_MAP.get(preset);\n if (mapped) return mapped;\n addUnsupported(context, \"custom-geometry\", partName);\n return \"rect\";\n}\n\nfunction mapImageGeometry(value: string): \"rect\" | \"roundRect\" | \"ellipse\" {\n return value === \"ellipse\" ? \"ellipse\" : value === \"roundRect\" ? \"roundRect\" : \"rect\";\n}\n\nfunction parseChartString(element: PptxXmlElement | undefined): string {\n if (!element) return \"\";\n const points = pptxXmlDescendants(element, \"pt\")\n .map((point) => ({\n index: optionalInteger(pptxXmlAttribute(point, \"idx\"), \"chart\") ?? 0,\n value: pptxXmlText(pptxXmlChild(point, \"v\")),\n }))\n .sort((left, right) => left.index - right.index);\n if (points.length > 0) return points.map((point) => point.value).join(\"\");\n return pptxXmlDescendants(element, \"t\").map(pptxXmlText).join(\"\");\n}\n\nfunction parseChartCategories(element: PptxXmlElement | undefined): string[] {\n if (!element) return [];\n return pptxXmlDescendants(element, \"pt\")\n .map((point) => ({\n index: optionalInteger(pptxXmlAttribute(point, \"idx\"), \"chart\") ?? 0,\n value: pptxXmlText(pptxXmlChild(point, \"v\")),\n }))\n .sort((left, right) => left.index - right.index)\n .map((point) => point.value);\n}\n\nfunction parseChartNumbers(\n element: PptxXmlElement | undefined,\n context: ImportContext,\n partName: string,\n): number[] {\n if (!element) return [];\n const points = pptxXmlDescendants(element, \"pt\")\n .map((point) => {\n const index = optionalInteger(pptxXmlAttribute(point, \"idx\"), partName) ?? 0;\n const raw = pptxXmlText(pptxXmlChild(point, \"v\"));\n const value = Number(raw);\n if (!Number.isFinite(value)) {\n throw pptxSecurity(\"Chart cache contains a non-finite number\", \"invalid-package\", partName);\n }\n return { index, value };\n })\n .sort((left, right) => left.index - right.index);\n context.chartPoints += points.length;\n if (context.chartPoints > context.limits.chartPoints) {\n throw pptxSecurity(\"PPTX exceeds its chart point limit\", \"limit-exceeded\", partName);\n }\n return points.map((point) => point.value);\n}\n\nfunction parseChartAxis(axis: PptxXmlElement | undefined): PresentationChartConfig[\"xAxis\"] {\n if (!axis) return undefined;\n const scaling = pptxXmlChild(axis, \"scaling\");\n const minimum = optionalNumber(pptxXmlAttribute(pptxXmlChild(scaling, \"min\"), \"val\"));\n const maximum = optionalNumber(pptxXmlAttribute(pptxXmlChild(scaling, \"max\"), \"val\"));\n return {\n visible: !booleanAttribute(pptxXmlChild(axis, \"delete\"), \"val\"),\n title: parseChartString(pptxXmlChild(axis, \"title\")),\n ...(minimum === undefined ? {} : { min: minimum }),\n ...(maximum === undefined ? {} : { max: maximum }),\n };\n}\n\nfunction chartLegendPosition(\n value: string | undefined,\n): \"left\" | \"top\" | \"topRight\" | \"right\" | \"bottom\" {\n switch (value) {\n case \"l\":\n return \"left\";\n case \"t\":\n return \"top\";\n case \"tr\":\n return \"topRight\";\n case \"r\":\n return \"right\";\n default:\n return \"bottom\";\n }\n}\n\nfunction parseThemeColors(root: PptxXmlElement, partName: string): ReadonlyMap<string, string> {\n requireRoot(root, \"theme\", DRAWING_NAMESPACE, partName);\n const colors = new Map(DEFAULT_THEME_COLORS);\n const scheme = pptxXmlDescendants(root, \"clrScheme\")[0];\n for (const entry of pptxXmlChildren(scheme)) {\n const color = pptxXmlChildren(entry)[0];\n const value = pptxXmlAttribute(color, color?.localName === \"sysClr\" ? \"lastClr\" : \"val\");\n if (value && /^[0-9A-Fa-f]{6}$/.test(value))\n colors.set(entry.localName, `#${value.toLowerCase()}`);\n }\n return colors;\n}\n\nfunction parseSlideSize(root: PptxXmlElement): { width: number; height: number } {\n const size = requiredChild(root, \"sldSz\", \"ppt/presentation.xml\");\n return {\n width: positiveEmu(\n requiredAttribute(size, \"cx\", \"ppt/presentation.xml\"),\n \"ppt/presentation.xml\",\n ),\n height: positiveEmu(\n requiredAttribute(size, \"cy\", \"ppt/presentation.xml\"),\n \"ppt/presentation.xml\",\n ),\n };\n}\n\nfunction mapTextAlignment(value: string | undefined): PresentationTextStyle[\"alignment\"] {\n if (value === \"ctr\") return \"center\";\n if (value === \"r\") return \"right\";\n if (value === \"just\" || value === \"justLow\" || value === \"dist\") return \"justify\";\n return value === \"l\" ? \"left\" : undefined;\n}\n\nfunction mapVerticalAlignment(\n value: string | undefined,\n): PresentationTextStyle[\"verticalAlignment\"] {\n if (value === \"ctr\") return \"middle\";\n if (value === \"b\") return \"bottom\";\n return value === \"t\" ? \"top\" : undefined;\n}\n\nfunction rasterContentType(\n partName: string,\n): \"image/png\" | \"image/jpeg\" | \"image/gif\" | \"image/webp\" {\n const extension = partName.slice(partName.lastIndexOf(\".\") + 1).toLowerCase();\n if (extension === \"png\") return \"image/png\";\n if (extension === \"jpg\" || extension === \"jpeg\") return \"image/jpeg\";\n if (extension === \"gif\") return \"image/gif\";\n return \"image/webp\";\n}\n\nfunction cropPercent(value: string | undefined, partName: string): number {\n if (value === undefined) return 0;\n const parsed = Number(value);\n if (!Number.isFinite(parsed) || parsed < 0 || parsed > 100_000) {\n throw pptxSecurity(\"Picture crop percentage is invalid\", \"invalid-package\", partName);\n }\n return parsed / 1_000;\n}\n\nfunction nonVisualName(element: PptxXmlElement): string | undefined {\n return pptxXmlAttribute(pptxXmlDescendants(element, \"cNvPr\")[0], \"name\");\n}\n\nfunction nonVisualDescription(element: PptxXmlElement): string | undefined {\n return pptxXmlAttribute(pptxXmlDescendants(element, \"cNvPr\")[0], \"descr\");\n}\n\nfunction requiredRelationshipId(\n element: PptxXmlElement | undefined,\n partName: string,\n localName: \"id\" | \"embed\" = \"id\",\n): string {\n if (!element)\n throw pptxSecurity(\"Relationship reference is missing\", \"invalid-package\", partName);\n const direct = pptxXmlQualifiedAttribute(element, `r:${localName}`);\n if (direct) return direct;\n const candidates = [...element.attributes].filter(\n ([name]) =>\n name.includes(\":\") &&\n name.slice(name.indexOf(\":\") + 1) === localName &&\n element.attributeNamespaces?.get(name) === OFFICE_RELATIONSHIP_BASE.slice(0, -1),\n );\n if (candidates.length !== 1 || !candidates[0]?.[1]) {\n throw pptxSecurity(\n \"Relationship reference is missing or ambiguous\",\n \"invalid-package\",\n partName,\n );\n }\n return candidates[0][1];\n}\n\nfunction requiredChild(\n parent: PptxXmlElement | undefined,\n localName: string,\n partName: string,\n): PptxXmlElement {\n const candidates = pptxXmlChildren(parent).filter((child) => child.localName === localName);\n if (candidates.length !== 1 || !candidates[0]) {\n throw pptxSecurity(\n `Required ${localName} element is missing or duplicated`,\n \"invalid-package\",\n partName,\n );\n }\n return candidates[0];\n}\n\nfunction requireRoot(\n element: PptxXmlElement,\n localName: string,\n namespaceUri: string,\n partName: string,\n): void {\n if (element.localName !== localName || element.namespaceUri !== namespaceUri) {\n throw pptxSecurity(\n `OOXML root must be ${localName} in ${namespaceUri}`,\n \"invalid-package\",\n partName,\n );\n }\n}\n\nfunction requiredAttribute(\n element: PptxXmlElement | undefined,\n localName: string,\n partName: string,\n): string {\n const value = pptxXmlAttribute(element, localName);\n if (value === undefined || value.length === 0) {\n throw pptxSecurity(`Required ${localName} attribute is missing`, \"invalid-package\", partName);\n }\n return value;\n}\n\nfunction byRelationshipId(\n relationships: readonly Relationship[],\n): ReadonlyMap<string, Relationship> {\n return new Map(relationships.map((relationship) => [relationship.id, relationship]));\n}\n\nfunction relationshipPartName(sourcePart: string): string {\n if (sourcePart === \"\") return \"_rels/.rels\";\n const slash = sourcePart.lastIndexOf(\"/\");\n const directory = slash < 0 ? \"\" : sourcePart.slice(0, slash + 1);\n const file = slash < 0 ? sourcePart : sourcePart.slice(slash + 1);\n return `${directory}_rels/${file}.rels`;\n}\n\nfunction relationshipSourcePart(relationshipPart: string): string {\n if (relationshipPart === \"_rels/.rels\") return \"\";\n const match = /^(.*\\/)?_rels\\/([^/]+)\\.rels$/.exec(relationshipPart);\n if (!match) {\n throw pptxSecurity(\"Invalid relationships part path\", \"invalid-package\", relationshipPart);\n }\n return `${match[1] ?? \"\"}${match[2] ?? \"\"}`;\n}\n\nfunction resolvePartTarget(sourcePart: string, target: string, relationshipPart: string): string {\n if (\n /[\\u0000-\\u001f\\u007f]/.test(target) ||\n target.includes(\"\\\\\") ||\n target.startsWith(\"//\") ||\n /%(?:2e|2f|5c)/i.test(target)\n ) {\n throw pptxSecurity(\"Unsafe OPC relationship target\", \"invalid-package\", relationshipPart);\n }\n const packageAbsolute = target.startsWith(\"/\");\n const relative = packageAbsolute ? target.slice(1) : target;\n const base =\n !packageAbsolute && sourcePart.includes(\"/\")\n ? sourcePart.slice(0, sourcePart.lastIndexOf(\"/\") + 1)\n : \"\";\n const combined = `${base}${relative}`;\n if (combined.length === 0 || combined.length > 4_096 || combined.includes(\"//\")) {\n throw pptxSecurity(\"Invalid OPC relationship target\", \"invalid-package\", relationshipPart);\n }\n const output: string[] = [];\n for (const segment of combined.split(\"/\")) {\n if (segment === \"\" || segment === \".\") continue;\n if (segment === \"..\") {\n if (output.length === 0) {\n throw pptxSecurity(\n \"OPC relationship escapes the package root\",\n \"invalid-package\",\n relationshipPart,\n );\n }\n output.pop();\n } else output.push(segment);\n if (output.length > 256) {\n throw pptxSecurity(\"OPC relationship path is too deep\", \"limit-exceeded\", relationshipPart);\n }\n }\n return output.join(\"/\");\n}\n\nfunction emuNumber(value: string, partName: string): number {\n const parsed = Number(value);\n if (!Number.isSafeInteger(parsed) || Math.abs(parsed) > 9_525_000_000) {\n throw pptxSecurity(\n \"Presentation geometry is outside supported bounds\",\n \"invalid-package\",\n partName,\n );\n }\n return parsed / EMU_PER_PIXEL;\n}\n\nfunction positiveEmu(value: string, partName: string): number {\n const parsed = emuNumber(value, partName);\n if (parsed <= 0) {\n throw pptxSecurity(\"Presentation extent must be positive\", \"invalid-package\", partName);\n }\n return parsed;\n}\n\nfunction optionalNumber(value: string | undefined): number | undefined {\n if (value === undefined) return undefined;\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : undefined;\n}\n\nfunction optionalInteger(value: string | undefined, partName: string): number | undefined {\n if (value === undefined) return undefined;\n const parsed = Number(value);\n if (!Number.isSafeInteger(parsed) || parsed < 0) {\n throw pptxSecurity(\"OOXML integer is invalid\", \"invalid-package\", partName);\n }\n return parsed;\n}\n\nfunction optionalPositiveInteger(value: string | undefined, partName: string): number | undefined {\n const parsed = optionalInteger(value, partName);\n if (parsed === undefined) return undefined;\n if (parsed <= 0 || parsed > 1_024) {\n throw pptxSecurity(\"OOXML span is outside supported bounds\", \"invalid-package\", partName);\n }\n return parsed;\n}\n\nfunction booleanAttribute(element: PptxXmlElement | undefined, name: string): boolean {\n const value = pptxXmlAttribute(element, name);\n return value === \"1\" || value === \"true\" || value === \"on\";\n}\n\nfunction consumeElement(context: ImportContext, partName: string): void {\n context.elements += 1;\n if (context.elements > context.limits.elements) {\n throw pptxSecurity(\"PPTX exceeds its element limit\", \"limit-exceeded\", partName);\n }\n}\n\nfunction consumeText(context: ImportContext, characters: number, partName: string): void {\n context.textCharacters += characters;\n if (context.textCharacters > context.limits.textCharacters) {\n throw pptxSecurity(\"PPTX exceeds its text character limit\", \"limit-exceeded\", partName);\n }\n}\n\nfunction addUnsupported(\n context: ImportContext,\n feature: PresentationFidelityIssue[\"feature\"],\n partName: string,\n code: PresentationFidelityIssue[\"code\"] = \"content-preserved-in-source\",\n): void {\n context.unsupportedParts.add(partName);\n context.issues.push({\n code,\n severity: code === \"content-will-be-discarded\" ? \"error\" : \"warning\",\n feature,\n message:\n code === \"style-approximated\"\n ? `${feature} styling is represented by the closest editable model style`\n : `${feature} content is retained in the validated source package but is not editable`,\n parts: [partName],\n });\n}\n\nfunction fidelityIssue(\n feature: PresentationFidelityIssue[\"feature\"],\n parts: readonly string[],\n): PresentationFidelityIssue {\n return {\n code: \"content-preserved-in-source\",\n severity: \"warning\",\n feature,\n message: `${feature} content is retained in the validated source package but is not editable`,\n parts,\n };\n}\n\nfunction deduplicateIssues(\n issues: readonly PresentationFidelityIssue[],\n): PresentationFidelityIssue[] {\n const result = new Map<string, PresentationFidelityIssue>();\n for (const issue of issues) {\n const key = `${issue.code}\\0${issue.feature}\\0${(issue.parts ?? []).join(\"\\0\")}`;\n result.set(key, issue);\n }\n return [...result.values()];\n}\n\nfunction pptxSecurity(\n message: string,\n code: PresentationSecurityError[\"code\"],\n entryName?: string,\n): PresentationSecurityError {\n return new PresentationSecurityError(\n entryName ? `${message}: ${entryName}` : message,\n code,\n entryName,\n );\n}\n\nfunction pptxZipFailure(\n kind: Parameters<BoundedZipFailure>[0],\n message: string,\n entryName?: string,\n): never {\n throw pptxSecurity(\n message,\n kind === \"limit\"\n ? \"limit-exceeded\"\n : kind === \"encrypted\"\n ? \"encrypted-content\"\n : \"invalid-package\",\n entryName,\n );\n}\n\nconst IDENTITY_TRANSFORM: Transform = { offsetX: 0, offsetY: 0, scaleX: 1, scaleY: 1 };\n\nconst GEOMETRY_MAP = new Map<string, PresentationShapeGeometry>([\n [\"rect\", \"rect\"],\n [\"roundRect\", \"roundRect\"],\n [\"ellipse\", \"ellipse\"],\n [\"triangle\", \"triangle\"],\n [\"rtTriangle\", \"triangle\"],\n [\"rightArrow\", \"rightArrow\"],\n [\"line\", \"line\"],\n]);\n\nconst CHART_ELEMENT_TYPES = new Map<string, PresentationChartType>([\n [\"barChart\", \"bar\"],\n [\"bar3DChart\", \"bar\"],\n [\"lineChart\", \"line\"],\n [\"line3DChart\", \"line\"],\n [\"areaChart\", \"area\"],\n [\"area3DChart\", \"area\"],\n [\"pieChart\", \"pie\"],\n [\"pie3DChart\", \"pie\"],\n [\"doughnutChart\", \"doughnut\"],\n [\"scatterChart\", \"scatter\"],\n [\"bubbleChart\", \"bubble\"],\n [\"radarChart\", \"radar\"],\n]);\n\nconst DEFAULT_THEME_COLORS = new Map<string, string>([\n [\"dk1\", \"#000000\"],\n [\"lt1\", \"#ffffff\"],\n [\"dk2\", \"#1f497d\"],\n [\"lt2\", \"#eeeceed\"],\n [\"accent1\", \"#4472c4\"],\n [\"accent2\", \"#ed7d31\"],\n [\"accent3\", \"#a5a5a5\"],\n [\"accent4\", \"#ffc000\"],\n [\"accent5\", \"#5b9bd5\"],\n [\"accent6\", \"#70ad47\"],\n [\"hlink\", \"#0563c1\"],\n [\"folHlink\", \"#954f72\"],\n [\"tx1\", \"#000000\"],\n [\"bg1\", \"#ffffff\"],\n [\"tx2\", \"#1f497d\"],\n [\"bg2\", \"#eeeceed\"],\n]);\n\nconst KNOWN_RELATIONSHIP_SUFFIXES = new Set([\n \"officeDocument\",\n \"core-properties\",\n \"extended-properties\",\n \"custom-properties\",\n \"slideMaster\",\n \"slideLayout\",\n \"slide\",\n \"notesMaster\",\n \"notesSlide\",\n \"theme\",\n \"presProps\",\n \"viewProps\",\n \"tableStyles\",\n \"chart\",\n \"image\",\n \"package\",\n \"hyperlink\",\n \"handoutMaster\",\n \"font\",\n \"tags\",\n \"customXml\",\n \"comments\",\n \"commentAuthors\",\n \"diagramData\",\n \"diagramLayout\",\n \"diagramColors\",\n \"diagramQuickStyle\",\n]);\n\nconst ACTIVE_RELATIONSHIP_SUFFIX =\n /^(?:vbaProject|activeX|oleObject|audio|video|media|externalLink|attachedTemplate|control|webVideo|linkedData|externalData)$/i;\n\nconst SOURCE_ONLY_RELATIONSHIP_SUFFIXES = new Set([\n \"handoutMaster\",\n \"font\",\n \"tags\",\n \"customXml\",\n \"comments\",\n \"commentAuthors\",\n \"diagramData\",\n \"diagramLayout\",\n \"diagramColors\",\n \"diagramQuickStyle\",\n]);\n\nconst ALLOWED_EXACT_RELATIONSHIPS = new Set([\n \"http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties\",\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties\",\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/custom-properties\",\n]);\n\nconst KNOWN_DEFAULT_CONTENT_TYPES = new Set([\n \"rels\\0application/vnd.openxmlformats-package.relationships+xml\",\n \"xml\\0application/xml\",\n \"png\\0image/png\",\n \"jpg\\0image/jpeg\",\n \"jpeg\\0image/jpeg\",\n \"jpg\\0image/jpg\",\n \"gif\\0image/gif\",\n \"webp\\0image/webp\",\n \"svg\\0image/svg+xml\",\n \"m4v\\0video/mp4\",\n \"mp4\\0video/mp4\",\n \"vml\\0application/vnd.openxmlformats-officedocument.vmlDrawing\",\n \"xlsx\\0application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n]);\n\nconst KNOWN_PPTX_PART_PATTERNS: readonly RegExp[] = [\n /^\\[Content_Types\\]\\.xml$/,\n /^_rels\\/\\.rels$/,\n /^docProps\\/(?:app|core|custom)\\.xml$/,\n /^ppt\\/presentation\\.xml$/,\n /^ppt\\/(?:presProps|viewProps|tableStyles)\\.xml$/,\n /^ppt\\/(?:_rels\\/presentation\\.xml|slides\\/_rels\\/slide\\d+\\.xml|slideMasters\\/_rels\\/slideMaster\\d+\\.xml|slideLayouts\\/_rels\\/slideLayout\\d+\\.xml|notesSlides\\/_rels\\/notesSlide\\d+\\.xml|notesMasters\\/_rels\\/notesMaster\\d+\\.xml|charts\\/_rels\\/chart\\d+\\.xml)\\.rels$/,\n /^ppt\\/(?:slides\\/slide\\d+|slideMasters\\/slideMaster\\d+|slideLayouts\\/slideLayout\\d+|notesSlides\\/notesSlide\\d+|notesMasters\\/notesMaster\\d+|charts\\/chart\\d+|theme\\/theme\\d+)\\.xml$/,\n /^ppt\\/media\\/[^/]+\\.(?:png|jpe?g|gif|webp)$/i,\n /^ppt\\/embeddings\\/[^/]+\\.xlsx$/i,\n];\n","import { FileBlob } from \"./file-blob\";\nimport {\n presentationColorValue,\n PresentationFile,\n type Presentation,\n type PresentationChart,\n type PresentationFill,\n type PresentationImage,\n type PresentationLine,\n type PresentationPosition,\n type PresentationGroup,\n type PresentationShape,\n type PresentationTable,\n} from \"./presentation\";\nimport {\n PPTX_MEDIA_TYPE,\n PresentationFidelityError,\n type PresentationPptxExportOptions,\n} from \"./presentation-pptx-api\";\nimport { presentationModelDigest, sha256Hex } from \"./presentation-pptx-state-digest\";\nimport { presentationLossState } from \"./presentation-pptx-state\";\n\nexport { importPresentationPptx } from \"./presentation-pptx-import\";\n\nconst colorValue = presentationColorValue;\n\nexport async function exportPresentationPptx(\n presentation: Presentation,\n options: PresentationPptxExportOptions = {},\n): Promise<FileBlob> {\n const provenance = presentationLossState(presentation);\n if (provenance) {\n const [currentModelDigest, actualSourceDigest] = await Promise.all([\n presentationModelDigest(presentation),\n sha256Hex(provenance.sourceBytes),\n ]);\n const sourceBindingValid =\n provenance.version === 1 &&\n provenance.mediaType === PPTX_MEDIA_TYPE &&\n provenance.sourceDigest === actualSourceDigest;\n if (sourceBindingValid && provenance.modelDigest === currentModelDigest) {\n return FileBlob.fromBytes(provenance.sourceBytes, {\n name: options.fileName ?? \"presentation.pptx\",\n type: PPTX_MEDIA_TYPE,\n });\n }\n if (!sourceBindingValid && options.unsupportedContent !== \"discard\") {\n throw new PresentationFidelityError(\n \"PPTX source-preservation envelope is invalid or no longer matches its source bytes\",\n [\n {\n code: \"content-will-be-discarded\",\n severity: \"error\",\n feature: \"source-only\",\n message: \"The retained source package failed its digest or version binding\",\n parts: [...provenance.unsupportedParts],\n },\n ],\n );\n }\n }\n const issues = PresentationFile.fidelityReport(presentation).map((issue) => ({\n ...issue,\n severity: \"error\" as const,\n code: \"content-will-be-discarded\" as const,\n }));\n if (issues.length > 0 && options.unsupportedContent !== \"discard\") {\n throw new PresentationFidelityError(\n 'PPTX export would discard source-only presentation content; use unsupportedContent: \"discard\" only when that loss is intended',\n issues,\n );\n }\n const { default: PptxConstructor } = await import(\"pptxgenjs\");\n const pptx = new PptxConstructor() as unknown as PptxRuntime;\n pptx.defineLayout({\n name: \"OPENGENI_CUSTOM\",\n width: presentation.slideSize.width / 96,\n height: presentation.slideSize.height / 96,\n });\n pptx.layout = \"OPENGENI_CUSTOM\";\n pptx.author = \"OpenGeni\";\n\n for (const slide of presentation.slides.items) {\n const target = pptx.addSlide();\n target.background = { color: pptxColor(slide.background.fill) };\n for (const element of slide.elements) {\n if (\"geometry\" in element && \"text\" in element) exportShapeToPptx(target, element);\n else if (\"series\" in element) exportChartToPptx(target, element);\n else if (\"sourceForPptx\" in element) exportImageToPptx(target, element);\n else if (\"rows\" in element) exportTableToPptx(target, element);\n else if (\"children\" in element) exportGroupToPptx(target, element);\n }\n if (slide.notes.toString().length > 0) target.addNotes(slide.notes.toString());\n }\n\n const output = await pptx.write({ outputType: \"arraybuffer\" });\n const bytes =\n output instanceof Uint8Array\n ? output\n : output instanceof ArrayBuffer\n ? new Uint8Array(output)\n : typeof output === \"string\"\n ? new TextEncoder().encode(output)\n : undefined;\n if (!bytes) throw new Error(\"PPTX writer returned an unsupported output type\");\n const canonicalBytes = await canonicalizeGeneratedPptx(bytes);\n return FileBlob.fromBytes(canonicalBytes, {\n name: options.fileName ?? \"presentation.pptx\",\n type: PPTX_MEDIA_TYPE,\n });\n}\n\nasync function canonicalizeGeneratedPptx(bytes: Uint8Array): Promise<Uint8Array> {\n const { default: JSZip } = await import(\"jszip\");\n const source = await JSZip.loadAsync(bytes);\n const chartIds = Object.keys(source.files)\n .map((name) => /^ppt\\/charts\\/chart(\\d+)\\.xml$/.exec(name)?.[1])\n .filter((value): value is string => value !== undefined)\n .map(Number)\n .sort((left, right) => left - right);\n const chartIdMap = new Map(chartIds.map((id, index) => [id, index + 1]));\n const rename = (value: string): string =>\n value\n .replace(/chart(\\d+)\\.xml/g, (match, raw: string) => {\n const replacement = chartIdMap.get(Number(raw));\n return replacement === undefined ? match : `chart${replacement}.xml`;\n })\n .replace(/Microsoft_Excel_Worksheet(\\d+)\\.xlsx/g, (match, raw: string) => {\n const replacement = chartIdMap.get(Number(raw));\n return replacement === undefined ? match : `Microsoft_Excel_Worksheet${replacement}.xlsx`;\n });\n return await canonicalizeGeneratedZip(source, rename, true);\n}\n\nasync function canonicalizeGeneratedZip(\n source: GeneratedZip,\n rename: (value: string) => string,\n canonicalizeNestedWorkbooks: boolean,\n): Promise<Uint8Array> {\n const { default: JSZip } = await import(\"jszip\");\n const output = new JSZip();\n const entries = Object.values(source.files)\n .filter((entry) => !entry.dir)\n .sort((left, right) => rename(left.name).localeCompare(rename(right.name)));\n for (const entry of entries) {\n let data = await entry.async(\"uint8array\");\n if (canonicalizeNestedWorkbooks && /^ppt\\/embeddings\\/[^/]+\\.xlsx$/i.test(entry.name)) {\n data = await canonicalizeGeneratedZip(await JSZip.loadAsync(data), (value) => value, false);\n } else if (/(?:\\.xml|\\.rels)$/i.test(entry.name) || entry.name === \"[Content_Types].xml\") {\n const xml = new TextDecoder().decode(data);\n data = new TextEncoder().encode(\n rename(xml).replace(\n /(<dcterms:(?:created|modified)\\b[^>]*>)[^<]*(<\\/dcterms:(?:created|modified)>)/g,\n \"$11980-01-01T00:00:00Z$2\",\n ),\n );\n }\n output.file(rename(entry.name), data, {\n binary: true,\n createFolders: false,\n date: DETERMINISTIC_ZIP_DATE,\n });\n }\n return await output.generateAsync({\n type: \"uint8array\",\n compression: \"DEFLATE\",\n compressionOptions: { level: 9 },\n platform: \"DOS\",\n });\n}\n\ntype GeneratedZip = {\n files: Record<string, GeneratedZipEntry>;\n};\n\ntype GeneratedZipEntry = {\n name: string;\n dir: boolean;\n async(type: \"uint8array\"): Promise<Uint8Array>;\n};\n\nconst DETERMINISTIC_ZIP_DATE = new Date(\"1980-01-01T00:00:00.000Z\");\n\ntype PptxRuntime = {\n layout: string;\n author: string;\n defineLayout(options: { name: string; width: number; height: number }): void;\n addSlide(): PptxSlideRuntime;\n write(options: { outputType: \"arraybuffer\" }): Promise<unknown>;\n};\n\ntype PptxSlideRuntime = {\n background: { color: string };\n addShape(type: string, options: Record<string, unknown>): void;\n addText(text: string, options: Record<string, unknown>): void;\n addChart(\n type: string,\n data: Array<Record<string, unknown>>,\n options: Record<string, unknown>,\n ): void;\n addImage(options: Record<string, unknown>): void;\n addTable(rows: unknown[][], options: Record<string, unknown>): void;\n addNotes(notes: string): void;\n};\n\nfunction exportShapeToPptx(\n slide: PptxSlideRuntime,\n shape: PresentationShape,\n position: PresentationPosition = shape.position,\n): void {\n const box = pptxPosition(position);\n const fill = pptxFill(shape.fill);\n const line = pptxLine(shape.line);\n const text = shape.text.toString();\n if (shape.geometry === \"line\" || text.length === 0) {\n if (shape.geometry !== \"textbox\") {\n slide.addShape(shape.geometry, {\n ...box,\n fill,\n line,\n rotate: shape.rotation,\n objectName: shape.name,\n });\n }\n }\n if (shape.geometry === \"textbox\" || text) {\n const style = shape.text.style;\n slide.addText(text, {\n ...box,\n margin: 0,\n breakLine: false,\n fontFace: style.fontFamily ?? \"Aptos\",\n fontSize: (style.fontSize ?? 18) * 0.75,\n bold: style.bold ?? false,\n italic: style.italic ?? false,\n underline: style.underline ? { style: \"sng\" } : undefined,\n color: pptxColor(style.color ?? \"slate-950\"),\n align: style.alignment ?? \"left\",\n valign: style.verticalAlignment ?? \"top\",\n shape: shape.geometry === \"textbox\" || shape.geometry === \"line\" ? undefined : shape.geometry,\n fill: shape.geometry === \"line\" ? { color: \"FFFFFF\", transparency: 100 } : fill,\n line: shape.geometry === \"line\" ? { color: \"FFFFFF\", transparency: 100 } : line,\n rotate: shape.rotation,\n objectName: shape.name,\n });\n }\n}\n\nfunction exportTableToPptx(\n slide: PptxSlideRuntime,\n table: PresentationTable,\n position: PresentationPosition = table.position,\n): void {\n const rows = table.rows.map((row) =>\n row\n .filter((cell) => cell !== null)\n .map((cell) => ({\n text: cell.text.toString(),\n options: {\n fill: pptxFill(cell.fill),\n color: pptxColor(cell.text.style.color ?? table.textStyle.color ?? \"slate-950\"),\n fontFace: cell.text.style.fontFamily ?? table.textStyle.fontFamily ?? \"Aptos\",\n fontSize: (cell.text.style.fontSize ?? table.textStyle.fontSize ?? 16) * 0.75,\n bold: cell.text.style.bold ?? table.textStyle.bold ?? false,\n italic: cell.text.style.italic ?? table.textStyle.italic ?? false,\n align: cell.text.style.alignment ?? table.textStyle.alignment ?? \"left\",\n valign: cell.text.style.verticalAlignment ?? table.textStyle.verticalAlignment ?? \"top\",\n rowspan: cell.rowSpan > 1 ? cell.rowSpan : undefined,\n colspan: cell.colSpan > 1 ? cell.colSpan : undefined,\n },\n })),\n );\n slide.addTable(rows, {\n ...pptxPosition(position),\n border: pptxTableBorder(table.line),\n fill: pptxFill(table.fill),\n margin: 2,\n objectName: table.name,\n ...(table.columnWidths.length > 0\n ? { colW: table.columnWidths.map((width) => width / 96) }\n : {}),\n ...(table.rowHeights.length > 0 ? { rowH: table.rowHeights.map((height) => height / 96) } : {}),\n });\n}\n\nfunction exportGroupToPptx(\n slide: PptxSlideRuntime,\n group: PresentationGroup,\n parentTransform: (position: PresentationPosition) => PresentationPosition = (position) =>\n position,\n): void {\n // PptxGenJS has no group authoring primitive. Children retain absolute geometry;\n // the typed fidelity report explicitly records that the grouping relation flattens.\n const transform = (position: PresentationPosition): PresentationPosition =>\n parentTransform(groupChildPosition(group, position));\n for (const child of group.children) {\n if (\"geometry\" in child && \"text\" in child)\n exportShapeToPptx(slide, child, transform(child.position));\n else if (\"series\" in child) exportChartToPptx(slide, child, transform(child.position));\n else if (\"sourceForPptx\" in child) exportImageToPptx(slide, child, transform(child.position));\n else if (\"rows\" in child) exportTableToPptx(slide, child, transform(child.position));\n else if (\"children\" in child) exportGroupToPptx(slide, child, transform);\n }\n}\n\nfunction exportChartToPptx(\n slide: PptxSlideRuntime,\n chart: PresentationChart,\n position: PresentationPosition = chart.position,\n): void {\n const categories = chart.categories;\n // PptxGenJS models scatter/bubble input as one shared X column followed by\n // one or more Y series. The fidelity gate rejects differing per-series X\n // vectors before this fallback writer is reached.\n const data =\n chart.type === \"scatter\" || chart.type === \"bubble\"\n ? [\n {\n name: \"X Values\",\n values: chart.series.items[0]?.xValues ?? [],\n },\n ...chart.series.items.map((series) => ({\n name: series.name,\n values: series.values,\n sizes: series.bubbleSizes.length > 0 ? series.bubbleSizes : undefined,\n })),\n ]\n : chart.series.items.map((series) => ({\n name: series.name,\n labels: series.categories.length > 0 ? series.categories : categories,\n values: series.values,\n }));\n slide.addChart(chart.type, data, {\n ...pptxPosition(position),\n showTitle: chart.title.length > 0,\n title: chart.title,\n showLegend: chart.hasLegend,\n legendPos: pptxLegendPosition(chart.legend?.position),\n showValue: chart.dataLabels?.showValue ?? false,\n showCategoryName: chart.dataLabels?.showCategoryName ?? false,\n showPercent: chart.dataLabels?.showPercent ?? false,\n showCatName: chart.dataLabels?.showCategoryName ?? false,\n showSerName: chart.dataLabels?.showSeriesName ?? false,\n catAxisHidden: chart.xAxis?.visible === false,\n catAxisTitle: chart.xAxis?.title,\n catAxisMinVal: chart.xAxis?.min,\n catAxisMaxVal: chart.xAxis?.max,\n valAxisHidden: chart.yAxis?.visible === false,\n valAxisTitle: chart.yAxis?.title,\n valAxisMinVal: chart.yAxis?.min,\n valAxisMaxVal: chart.yAxis?.max,\n });\n}\n\nfunction exportImageToPptx(\n slide: PptxSlideRuntime,\n image: PresentationImage,\n position: PresentationPosition = image.position,\n): void {\n slide.addImage({\n ...image.sourceForPptx(),\n ...pptxPosition(position),\n altText: image.alt,\n rotate: image.rotation,\n flipH: image.flipHorizontal,\n flipV: image.flipVertical,\n rounding: image.geometry === \"ellipse\" || image.geometry === \"roundRect\",\n objectName: image.name,\n sizing: {\n type: image.crop ? \"crop\" : image.fit,\n w: position.width / 96,\n h: position.height / 96,\n },\n });\n}\n\nfunction groupChildPosition(\n group: PresentationGroup,\n position: PresentationPosition,\n): PresentationPosition {\n const scaleX = group.position.width / group.childExtent.width;\n const scaleY = group.position.height / group.childExtent.height;\n return {\n left: group.position.left + (position.left - group.childOffset.left) * scaleX,\n top: group.position.top + (position.top - group.childOffset.top) * scaleY,\n width: position.width * scaleX,\n height: position.height * scaleY,\n };\n}\n\nfunction pptxLegendPosition(\n position: \"left\" | \"top\" | \"topRight\" | \"right\" | \"bottom\" | undefined,\n): \"l\" | \"t\" | \"tr\" | \"r\" | \"b\" {\n switch (position) {\n case \"left\":\n return \"l\";\n case \"top\":\n return \"t\";\n case \"topRight\":\n return \"tr\";\n case \"right\":\n return \"r\";\n default:\n return \"b\";\n }\n}\nfunction pptxPosition(position: PresentationPosition): Record<string, number> {\n return {\n x: position.left / 96,\n y: position.top / 96,\n w: position.width / 96,\n h: position.height / 96,\n };\n}\n\nfunction pptxColor(fill: PresentationFill): string {\n const color = colorValue(fill);\n return color === \"none\" ? \"FFFFFF\" : color.replace(/^#/, \"\").slice(0, 6).toUpperCase();\n}\n\nfunction pptxFill(fill: PresentationFill): Record<string, unknown> {\n return colorValue(fill) === \"none\"\n ? { color: \"FFFFFF\", transparency: 100 }\n : { color: pptxColor(fill), transparency: 0 };\n}\n\nfunction pptxLine(line: PresentationLine): Record<string, unknown> {\n const none =\n line.style === \"none\" || colorValue(line.fill ?? \"none\") === \"none\" || (line.width ?? 1) === 0;\n return none\n ? { color: \"FFFFFF\", transparency: 100, width: 0 }\n : {\n color: pptxColor(line.fill ?? \"slate-900\"),\n width: (line.width ?? 1) * 0.75,\n dashType: line.style,\n };\n}\n\nfunction pptxTableBorder(line: PresentationLine): Record<string, unknown> {\n const shapeLine = pptxLine(line);\n return {\n color: shapeLine.color,\n transparency: shapeLine.transparency,\n pt: shapeLine.width,\n type: shapeLine.dashType,\n };\n}\n"],"mappings":"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","names":["end","presentationModelDigest","sha256Hex","categories","colorValue"]}
@@ -0,0 +1,29 @@
1
+ import { FileBlob } from "./file-blob.js";
2
+ import { type Presentation, type PresentationExportOptions, type Slide } from "./presentation.js";
3
+ type MontageDimensions = {
4
+ columns: number;
5
+ rows: number;
6
+ gap: number;
7
+ width: number;
8
+ height: number;
9
+ };
10
+ export type PresentationRenderJob = {
11
+ kind: "slide";
12
+ slide: Slide;
13
+ format: Exclude<PresentationExportOptions["format"], "layout">;
14
+ scale: number;
15
+ name: string;
16
+ dimensions: {
17
+ width: number;
18
+ height: number;
19
+ };
20
+ } | {
21
+ kind: "montage";
22
+ presentation: Presentation;
23
+ format: Exclude<PresentationExportOptions["format"], "layout">;
24
+ scale: number;
25
+ name: string;
26
+ dimensions: MontageDimensions;
27
+ };
28
+ export declare function executePresentationRender(job: PresentationRenderJob): Promise<FileBlob>;
29
+ export {};