@usejunior/docx-core 0.9.1 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (335) hide show
  1. package/LICENSE +202 -21
  2. package/NOTICE +2 -0
  3. package/README.md +2 -2
  4. package/dist/.tsbuildinfo +1 -1
  5. package/dist/atomizer.d.ts +28 -8
  6. package/dist/atomizer.d.ts.map +1 -1
  7. package/dist/atomizer.js +96 -25
  8. package/dist/atomizer.js.map +1 -1
  9. package/dist/baselines/atomizer/auxiliaryIdCollision.d.ts +99 -0
  10. package/dist/baselines/atomizer/auxiliaryIdCollision.d.ts.map +1 -0
  11. package/dist/baselines/atomizer/auxiliaryIdCollision.js +415 -0
  12. package/dist/baselines/atomizer/auxiliaryIdCollision.js.map +1 -0
  13. package/dist/baselines/atomizer/documentReconstructor.d.ts.map +1 -1
  14. package/dist/baselines/atomizer/documentReconstructor.js +333 -112
  15. package/dist/baselines/atomizer/documentReconstructor.js.map +1 -1
  16. package/dist/baselines/atomizer/formattingFidelity.d.ts +99 -0
  17. package/dist/baselines/atomizer/formattingFidelity.d.ts.map +1 -0
  18. package/dist/baselines/atomizer/formattingFidelity.js +449 -0
  19. package/dist/baselines/atomizer/formattingFidelity.js.map +1 -0
  20. package/dist/baselines/atomizer/inPlaceModifier-bookmarks.d.ts +37 -0
  21. package/dist/baselines/atomizer/inPlaceModifier-bookmarks.d.ts.map +1 -0
  22. package/dist/baselines/atomizer/inPlaceModifier-bookmarks.js +189 -0
  23. package/dist/baselines/atomizer/inPlaceModifier-bookmarks.js.map +1 -0
  24. package/dist/baselines/atomizer/inPlaceModifier-containers.d.ts +74 -0
  25. package/dist/baselines/atomizer/inPlaceModifier-containers.d.ts.map +1 -0
  26. package/dist/baselines/atomizer/inPlaceModifier-containers.js +171 -0
  27. package/dist/baselines/atomizer/inPlaceModifier-containers.js.map +1 -0
  28. package/dist/baselines/atomizer/inPlaceModifier-deletion.d.ts +88 -0
  29. package/dist/baselines/atomizer/inPlaceModifier-deletion.d.ts.map +1 -0
  30. package/dist/baselines/atomizer/inPlaceModifier-deletion.js +326 -0
  31. package/dist/baselines/atomizer/inPlaceModifier-deletion.js.map +1 -0
  32. package/dist/baselines/atomizer/inPlaceModifier-postprocess.d.ts +85 -0
  33. package/dist/baselines/atomizer/inPlaceModifier-postprocess.d.ts.map +1 -0
  34. package/dist/baselines/atomizer/inPlaceModifier-postprocess.js +402 -0
  35. package/dist/baselines/atomizer/inPlaceModifier-postprocess.js.map +1 -0
  36. package/dist/baselines/atomizer/inPlaceModifier-presplit.d.ts +39 -0
  37. package/dist/baselines/atomizer/inPlaceModifier-presplit.d.ts.map +1 -0
  38. package/dist/baselines/atomizer/inPlaceModifier-presplit.js +265 -0
  39. package/dist/baselines/atomizer/inPlaceModifier-presplit.js.map +1 -0
  40. package/dist/baselines/atomizer/inPlaceModifier-shared.d.ts +62 -0
  41. package/dist/baselines/atomizer/inPlaceModifier-shared.d.ts.map +1 -0
  42. package/dist/baselines/atomizer/inPlaceModifier-shared.js +139 -0
  43. package/dist/baselines/atomizer/inPlaceModifier-shared.js.map +1 -0
  44. package/dist/baselines/atomizer/inPlaceModifier-wrappers.d.ts +198 -0
  45. package/dist/baselines/atomizer/inPlaceModifier-wrappers.d.ts.map +1 -0
  46. package/dist/baselines/atomizer/inPlaceModifier-wrappers.js +475 -0
  47. package/dist/baselines/atomizer/inPlaceModifier-wrappers.js.map +1 -0
  48. package/dist/baselines/atomizer/inPlaceModifier.d.ts +6 -290
  49. package/dist/baselines/atomizer/inPlaceModifier.d.ts.map +1 -1
  50. package/dist/baselines/atomizer/inPlaceModifier.js +23 -1828
  51. package/dist/baselines/atomizer/inPlaceModifier.js.map +1 -1
  52. package/dist/baselines/atomizer/pipeline.d.ts +36 -2
  53. package/dist/baselines/atomizer/pipeline.d.ts.map +1 -1
  54. package/dist/baselines/atomizer/pipeline.js +216 -144
  55. package/dist/baselines/atomizer/pipeline.js.map +1 -1
  56. package/dist/baselines/atomizer/trackChangesAcceptorAst.d.ts.map +1 -1
  57. package/dist/baselines/atomizer/trackChangesAcceptorAst.js +199 -173
  58. package/dist/baselines/atomizer/trackChangesAcceptorAst.js.map +1 -1
  59. package/dist/baselines/wmlcomparer/DotnetCli.d.ts.map +1 -1
  60. package/dist/baselines/wmlcomparer/DotnetCli.js +7 -0
  61. package/dist/baselines/wmlcomparer/DotnetCli.js.map +1 -1
  62. package/dist/cli/compare-two.d.ts.map +1 -1
  63. package/dist/cli/compare-two.js +3 -1
  64. package/dist/cli/compare-two.js.map +1 -1
  65. package/dist/cli/conformance-adapter.d.ts +3 -0
  66. package/dist/cli/conformance-adapter.d.ts.map +1 -0
  67. package/dist/cli/conformance-adapter.js +93 -0
  68. package/dist/cli/conformance-adapter.js.map +1 -0
  69. package/dist/cli/index.d.ts.map +1 -1
  70. package/dist/cli/index.js +5 -1
  71. package/dist/cli/index.js.map +1 -1
  72. package/dist/compare-types.d.ts +197 -0
  73. package/dist/compare-types.d.ts.map +1 -0
  74. package/dist/compare-types.js +2 -0
  75. package/dist/compare-types.js.map +1 -0
  76. package/dist/core-types.d.ts +5 -1
  77. package/dist/core-types.d.ts.map +1 -1
  78. package/dist/core-types.js +5 -1
  79. package/dist/core-types.js.map +1 -1
  80. package/dist/footnotes.d.ts +8 -3
  81. package/dist/footnotes.d.ts.map +1 -1
  82. package/dist/footnotes.js +8 -3
  83. package/dist/footnotes.js.map +1 -1
  84. package/dist/generation/compile.d.ts +21 -0
  85. package/dist/generation/compile.d.ts.map +1 -0
  86. package/dist/generation/compile.js +46 -0
  87. package/dist/generation/compile.js.map +1 -0
  88. package/dist/generation/context.d.ts +42 -0
  89. package/dist/generation/context.d.ts.map +1 -0
  90. package/dist/generation/context.js +65 -0
  91. package/dist/generation/context.js.map +1 -0
  92. package/dist/generation/emit/comments-part.d.ts +36 -0
  93. package/dist/generation/emit/comments-part.d.ts.map +1 -0
  94. package/dist/generation/emit/comments-part.js +116 -0
  95. package/dist/generation/emit/comments-part.js.map +1 -0
  96. package/dist/generation/emit/document-part.d.ts +24 -0
  97. package/dist/generation/emit/document-part.d.ts.map +1 -0
  98. package/dist/generation/emit/document-part.js +60 -0
  99. package/dist/generation/emit/document-part.js.map +1 -0
  100. package/dist/generation/emit/emit-context.d.ts +26 -0
  101. package/dist/generation/emit/emit-context.d.ts.map +1 -0
  102. package/dist/generation/emit/emit-context.js +19 -0
  103. package/dist/generation/emit/emit-context.js.map +1 -0
  104. package/dist/generation/emit/header-footer-part.d.ts +23 -0
  105. package/dist/generation/emit/header-footer-part.d.ts.map +1 -0
  106. package/dist/generation/emit/header-footer-part.js +57 -0
  107. package/dist/generation/emit/header-footer-part.js.map +1 -0
  108. package/dist/generation/emit/numbering-part.d.ts +29 -0
  109. package/dist/generation/emit/numbering-part.d.ts.map +1 -0
  110. package/dist/generation/emit/numbering-part.js +100 -0
  111. package/dist/generation/emit/numbering-part.js.map +1 -0
  112. package/dist/generation/emit/package-parts.d.ts +24 -0
  113. package/dist/generation/emit/package-parts.d.ts.map +1 -0
  114. package/dist/generation/emit/package-parts.js +121 -0
  115. package/dist/generation/emit/package-parts.js.map +1 -0
  116. package/dist/generation/emit/paragraph.d.ts +24 -0
  117. package/dist/generation/emit/paragraph.d.ts.map +1 -0
  118. package/dist/generation/emit/paragraph.js +63 -0
  119. package/dist/generation/emit/paragraph.js.map +1 -0
  120. package/dist/generation/emit/properties.d.ts +34 -0
  121. package/dist/generation/emit/properties.d.ts.map +1 -0
  122. package/dist/generation/emit/properties.js +138 -0
  123. package/dist/generation/emit/properties.js.map +1 -0
  124. package/dist/generation/emit/run.d.ts +15 -0
  125. package/dist/generation/emit/run.d.ts.map +1 -0
  126. package/dist/generation/emit/run.js +71 -0
  127. package/dist/generation/emit/run.js.map +1 -0
  128. package/dist/generation/emit/section.d.ts +29 -0
  129. package/dist/generation/emit/section.d.ts.map +1 -0
  130. package/dist/generation/emit/section.js +117 -0
  131. package/dist/generation/emit/section.js.map +1 -0
  132. package/dist/generation/emit/settings-part.d.ts +13 -0
  133. package/dist/generation/emit/settings-part.d.ts.map +1 -0
  134. package/dist/generation/emit/settings-part.js +24 -0
  135. package/dist/generation/emit/settings-part.js.map +1 -0
  136. package/dist/generation/emit/styles-part.d.ts +16 -0
  137. package/dist/generation/emit/styles-part.d.ts.map +1 -0
  138. package/dist/generation/emit/styles-part.js +80 -0
  139. package/dist/generation/emit/styles-part.js.map +1 -0
  140. package/dist/generation/emit/table.d.ts +26 -0
  141. package/dist/generation/emit/table.d.ts.map +1 -0
  142. package/dist/generation/emit/table.js +196 -0
  143. package/dist/generation/emit/table.js.map +1 -0
  144. package/dist/generation/errors.d.ts +22 -0
  145. package/dist/generation/errors.d.ts.map +1 -0
  146. package/dist/generation/errors.js +29 -0
  147. package/dist/generation/errors.js.map +1 -0
  148. package/dist/generation/index.d.ts +13 -0
  149. package/dist/generation/index.d.ts.map +1 -0
  150. package/dist/generation/index.js +12 -0
  151. package/dist/generation/index.js.map +1 -0
  152. package/dist/generation/ordering.d.ts +46 -0
  153. package/dist/generation/ordering.d.ts.map +1 -0
  154. package/dist/generation/ordering.js +119 -0
  155. package/dist/generation/ordering.js.map +1 -0
  156. package/dist/generation/recipes.d.ts +47 -0
  157. package/dist/generation/recipes.d.ts.map +1 -0
  158. package/dist/generation/recipes.js +84 -0
  159. package/dist/generation/recipes.js.map +1 -0
  160. package/dist/generation/structural-checks.d.ts +24 -0
  161. package/dist/generation/structural-checks.d.ts.map +1 -0
  162. package/dist/generation/structural-checks.js +318 -0
  163. package/dist/generation/structural-checks.js.map +1 -0
  164. package/dist/generation/types.d.ts +217 -0
  165. package/dist/generation/types.d.ts.map +1 -0
  166. package/dist/generation/types.js +16 -0
  167. package/dist/generation/types.js.map +1 -0
  168. package/dist/generation/validate-spec.d.ts +27 -0
  169. package/dist/generation/validate-spec.d.ts.map +1 -0
  170. package/dist/generation/validate-spec.js +307 -0
  171. package/dist/generation/validate-spec.js.map +1 -0
  172. package/dist/index.d.ts +9 -150
  173. package/dist/index.d.ts.map +1 -1
  174. package/dist/index.js +14 -0
  175. package/dist/index.js.map +1 -1
  176. package/dist/integration/generation-probes.d.ts +15 -0
  177. package/dist/integration/generation-probes.d.ts.map +1 -0
  178. package/dist/integration/generation-probes.js +84 -0
  179. package/dist/integration/generation-probes.js.map +1 -0
  180. package/dist/integration/libreoffice-oracle.d.ts +49 -0
  181. package/dist/integration/libreoffice-oracle.d.ts.map +1 -0
  182. package/dist/integration/libreoffice-oracle.js +290 -0
  183. package/dist/integration/libreoffice-oracle.js.map +1 -0
  184. package/dist/integration/synthetic-docx-fixture.d.ts +72 -0
  185. package/dist/integration/synthetic-docx-fixture.d.ts.map +1 -1
  186. package/dist/integration/synthetic-docx-fixture.js +131 -4
  187. package/dist/integration/synthetic-docx-fixture.js.map +1 -1
  188. package/dist/primitives/accept_changes.d.ts +4 -3
  189. package/dist/primitives/accept_changes.d.ts.map +1 -1
  190. package/dist/primitives/accept_changes.js +163 -77
  191. package/dist/primitives/accept_changes.js.map +1 -1
  192. package/dist/primitives/comments.d.ts +12 -3
  193. package/dist/primitives/comments.d.ts.map +1 -1
  194. package/dist/primitives/comments.js +374 -97
  195. package/dist/primitives/comments.js.map +1 -1
  196. package/dist/primitives/content_fingerprint.d.ts +29 -0
  197. package/dist/primitives/content_fingerprint.d.ts.map +1 -0
  198. package/dist/primitives/content_fingerprint.js +63 -0
  199. package/dist/primitives/content_fingerprint.js.map +1 -0
  200. package/dist/primitives/document.d.ts +94 -15
  201. package/dist/primitives/document.d.ts.map +1 -1
  202. package/dist/primitives/document.js +373 -36
  203. package/dist/primitives/document.js.map +1 -1
  204. package/dist/primitives/document_view-comments.d.ts +18 -0
  205. package/dist/primitives/document_view-comments.d.ts.map +1 -0
  206. package/dist/primitives/document_view-comments.js +160 -0
  207. package/dist/primitives/document_view-comments.js.map +1 -0
  208. package/dist/primitives/document_view-headings.d.ts +45 -0
  209. package/dist/primitives/document_view-headings.d.ts.map +1 -0
  210. package/dist/primitives/document_view-headings.js +247 -0
  211. package/dist/primitives/document_view-headings.js.map +1 -0
  212. package/dist/primitives/document_view-styles.d.ts +11 -0
  213. package/dist/primitives/document_view-styles.d.ts.map +1 -0
  214. package/dist/primitives/document_view-styles.js +104 -0
  215. package/dist/primitives/document_view-styles.js.map +1 -0
  216. package/dist/primitives/document_view-toon.d.ts +37 -0
  217. package/dist/primitives/document_view-toon.d.ts.map +1 -0
  218. package/dist/primitives/document_view-toon.js +199 -0
  219. package/dist/primitives/document_view-toon.js.map +1 -0
  220. package/dist/primitives/document_view-types.d.ts +152 -0
  221. package/dist/primitives/document_view-types.d.ts.map +1 -0
  222. package/dist/primitives/document_view-types.js +2 -0
  223. package/dist/primitives/document_view-types.js.map +1 -0
  224. package/dist/primitives/document_view.d.ts +8 -106
  225. package/dist/primitives/document_view.d.ts.map +1 -1
  226. package/dist/primitives/document_view.js +153 -312
  227. package/dist/primitives/document_view.js.map +1 -1
  228. package/dist/primitives/dom-helpers.d.ts +9 -0
  229. package/dist/primitives/dom-helpers.d.ts.map +1 -1
  230. package/dist/primitives/dom-helpers.js +10 -1
  231. package/dist/primitives/dom-helpers.js.map +1 -1
  232. package/dist/primitives/footnotes.d.ts +4 -3
  233. package/dist/primitives/footnotes.d.ts.map +1 -1
  234. package/dist/primitives/footnotes.js +232 -44
  235. package/dist/primitives/footnotes.js.map +1 -1
  236. package/dist/primitives/formatting_tags.d.ts +7 -0
  237. package/dist/primitives/formatting_tags.d.ts.map +1 -1
  238. package/dist/primitives/formatting_tags.js +22 -11
  239. package/dist/primitives/formatting_tags.js.map +1 -1
  240. package/dist/primitives/index.d.ts +10 -0
  241. package/dist/primitives/index.d.ts.map +1 -1
  242. package/dist/primitives/index.js +9 -0
  243. package/dist/primitives/index.js.map +1 -1
  244. package/dist/primitives/layout.d.ts +4 -3
  245. package/dist/primitives/layout.d.ts.map +1 -1
  246. package/dist/primitives/layout.js +45 -3
  247. package/dist/primitives/layout.js.map +1 -1
  248. package/dist/primitives/merge_runs.d.ts +21 -3
  249. package/dist/primitives/merge_runs.d.ts.map +1 -1
  250. package/dist/primitives/merge_runs.js +32 -10
  251. package/dist/primitives/merge_runs.js.map +1 -1
  252. package/dist/primitives/minimal_save.d.ts +38 -0
  253. package/dist/primitives/minimal_save.d.ts.map +1 -0
  254. package/dist/primitives/minimal_save.js +323 -0
  255. package/dist/primitives/minimal_save.js.map +1 -0
  256. package/dist/primitives/namespaces.d.ts +47 -0
  257. package/dist/primitives/namespaces.d.ts.map +1 -1
  258. package/dist/primitives/namespaces.js +52 -0
  259. package/dist/primitives/namespaces.js.map +1 -1
  260. package/dist/primitives/reject_changes.d.ts +6 -4
  261. package/dist/primitives/reject_changes.d.ts.map +1 -1
  262. package/dist/primitives/reject_changes.js +187 -91
  263. package/dist/primitives/reject_changes.js.map +1 -1
  264. package/dist/primitives/revision-parts.d.ts +7 -0
  265. package/dist/primitives/revision-parts.d.ts.map +1 -0
  266. package/dist/primitives/revision-parts.js +27 -0
  267. package/dist/primitives/revision-parts.js.map +1 -0
  268. package/dist/primitives/revision-vocabulary.d.ts +7 -0
  269. package/dist/primitives/revision-vocabulary.d.ts.map +1 -0
  270. package/dist/primitives/revision-vocabulary.js +39 -0
  271. package/dist/primitives/revision-vocabulary.js.map +1 -0
  272. package/dist/primitives/schema-corpus-capture.d.ts +19 -0
  273. package/dist/primitives/schema-corpus-capture.d.ts.map +1 -0
  274. package/dist/primitives/schema-corpus-capture.js +29 -0
  275. package/dist/primitives/schema-corpus-capture.js.map +1 -0
  276. package/dist/primitives/sectPrAudit.d.ts +19 -0
  277. package/dist/primitives/sectPrAudit.d.ts.map +1 -0
  278. package/dist/primitives/sectPrAudit.js +165 -0
  279. package/dist/primitives/sectPrAudit.js.map +1 -0
  280. package/dist/primitives/semantic_tags.d.ts +7 -0
  281. package/dist/primitives/semantic_tags.d.ts.map +1 -1
  282. package/dist/primitives/semantic_tags.js +23 -4
  283. package/dist/primitives/semantic_tags.js.map +1 -1
  284. package/dist/primitives/serialize_html.d.ts +37 -0
  285. package/dist/primitives/serialize_html.d.ts.map +1 -0
  286. package/dist/primitives/serialize_html.js +395 -0
  287. package/dist/primitives/serialize_html.js.map +1 -0
  288. package/dist/primitives/serialize_markdown.d.ts +16 -0
  289. package/dist/primitives/serialize_markdown.d.ts.map +1 -0
  290. package/dist/primitives/serialize_markdown.js +300 -0
  291. package/dist/primitives/serialize_markdown.js.map +1 -0
  292. package/dist/primitives/serialize_plaintext.d.ts +15 -0
  293. package/dist/primitives/serialize_plaintext.d.ts.map +1 -0
  294. package/dist/primitives/serialize_plaintext.js +154 -0
  295. package/dist/primitives/serialize_plaintext.js.map +1 -0
  296. package/dist/primitives/styles.d.ts +15 -0
  297. package/dist/primitives/styles.d.ts.map +1 -1
  298. package/dist/primitives/styles.js +33 -22
  299. package/dist/primitives/styles.js.map +1 -1
  300. package/dist/primitives/tables.d.ts.map +1 -1
  301. package/dist/primitives/tables.js +13 -3
  302. package/dist/primitives/tables.js.map +1 -1
  303. package/dist/primitives/text.d.ts +2 -1
  304. package/dist/primitives/text.d.ts.map +1 -1
  305. package/dist/primitives/text.js +116 -12
  306. package/dist/primitives/text.js.map +1 -1
  307. package/dist/primitives/track-changes-emitter.d.ts +148 -0
  308. package/dist/primitives/track-changes-emitter.d.ts.map +1 -0
  309. package/dist/primitives/track-changes-emitter.js +291 -0
  310. package/dist/primitives/track-changes-emitter.js.map +1 -0
  311. package/dist/primitives/validate_ai_revisions.d.ts +35 -0
  312. package/dist/primitives/validate_ai_revisions.d.ts.map +1 -0
  313. package/dist/primitives/validate_ai_revisions.js +323 -0
  314. package/dist/primitives/validate_ai_revisions.js.map +1 -0
  315. package/dist/primitives/xml-helpers.d.ts +29 -0
  316. package/dist/primitives/xml-helpers.d.ts.map +1 -0
  317. package/dist/primitives/xml-helpers.js +35 -0
  318. package/dist/primitives/xml-helpers.js.map +1 -0
  319. package/dist/primitives/xml.d.ts +5 -0
  320. package/dist/primitives/xml.d.ts.map +1 -1
  321. package/dist/primitives/xml.js +5 -0
  322. package/dist/primitives/xml.js.map +1 -1
  323. package/dist/primitives/zip.d.ts +1 -0
  324. package/dist/primitives/zip.d.ts.map +1 -1
  325. package/dist/primitives/zip.js +21 -3
  326. package/dist/primitives/zip.js.map +1 -1
  327. package/dist/shared/field-structure.d.ts +14 -0
  328. package/dist/shared/field-structure.d.ts.map +1 -0
  329. package/dist/shared/field-structure.js +166 -0
  330. package/dist/shared/field-structure.js.map +1 -0
  331. package/dist/shared/ooxml/namespaces.d.ts +4 -1
  332. package/dist/shared/ooxml/namespaces.d.ts.map +1 -1
  333. package/dist/shared/ooxml/namespaces.js +4 -1
  334. package/dist/shared/ooxml/namespaces.js.map +1 -1
  335. package/package.json +13 -9
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-corpus-capture.js","sourceRoot":"","sources":["../../src/primitives/schema-corpus-capture.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,8BAA8B,CAAC,GAAW;IACxD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;IAC9C,IAAI,CAAC,GAAG;QAAE,OAAO;IACjB,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC3E,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpC,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,MAAM,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC;AAC1D,CAAC"}
@@ -0,0 +1,19 @@
1
+ export type SectPrIssueType = 'missing_body' | 'multiple_body_level_sectpr' | 'body_level_sectpr_not_last' | 'sectpr_invalid_parent' | 'sectpr_in_ppr_without_paragraph_parent' | 'sectpr_reference_missing_rid' | 'sectpr_reference_dangling_rid';
2
+ export interface SectPrAuditIssue {
3
+ type: SectPrIssueType;
4
+ path: string;
5
+ message: string;
6
+ rid?: string;
7
+ }
8
+ export interface SectPrAuditSummary {
9
+ ok: boolean;
10
+ issues: SectPrAuditIssue[];
11
+ stats: {
12
+ bodyLevelSectPrCount: number;
13
+ paragraphLevelSectPrCount: number;
14
+ totalSectPrCount: number;
15
+ referenceCount: number;
16
+ };
17
+ }
18
+ export declare function auditSectPr(documentXml: string, documentRelsXml?: string | null): SectPrAuditSummary;
19
+ //# sourceMappingURL=sectPrAudit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sectPrAudit.d.ts","sourceRoot":"","sources":["../../src/primitives/sectPrAudit.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,eAAe,GACvB,cAAc,GACd,4BAA4B,GAC5B,4BAA4B,GAC5B,uBAAuB,GACvB,wCAAwC,GACxC,8BAA8B,GAC9B,+BAA+B,CAAC;AAEpC,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,eAAe,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAC3B,KAAK,EAAE;QACL,oBAAoB,EAAE,MAAM,CAAC;QAC7B,yBAAyB,EAAE,MAAM,CAAC;QAClC,gBAAgB,EAAE,MAAM,CAAC;QACzB,cAAc,EAAE,MAAM,CAAC;KACxB,CAAC;CACH;AA8DD,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,kBAAkB,CAoHpG"}
@@ -0,0 +1,165 @@
1
+ import { parseXml } from './xml.js';
2
+ import { childElements } from './dom-helpers.js';
3
+ import { OOXML } from './namespaces.js';
4
+ function elementSiblingIndex(node) {
5
+ const parent = node.parentNode;
6
+ if (!parent)
7
+ return 1;
8
+ let idx = 0;
9
+ for (const sibling of childElements(parent)) {
10
+ if (sibling.tagName === node.tagName) {
11
+ idx++;
12
+ }
13
+ if (sibling === node) {
14
+ return idx;
15
+ }
16
+ }
17
+ return idx || 1;
18
+ }
19
+ function nodePath(node) {
20
+ const parts = [];
21
+ let current = node;
22
+ while (current) {
23
+ parts.push(`${current.tagName}[${elementSiblingIndex(current)}]`);
24
+ const parentNode = current.parentNode;
25
+ if (!parentNode || parentNode.nodeType !== 1) {
26
+ break;
27
+ }
28
+ current = parentNode;
29
+ }
30
+ return parts.reverse().join('/');
31
+ }
32
+ function collectRelationshipIds(documentRelsXml) {
33
+ if (!documentRelsXml) {
34
+ return new Set();
35
+ }
36
+ try {
37
+ const relDoc = parseXml(documentRelsXml);
38
+ const ids = new Set();
39
+ const relationships = relDoc.getElementsByTagName('Relationship');
40
+ for (let i = 0; i < relationships.length; i++) {
41
+ const rel = relationships.item(i);
42
+ const id = rel?.getAttribute('Id');
43
+ if (id) {
44
+ ids.add(id);
45
+ }
46
+ }
47
+ return ids;
48
+ }
49
+ catch {
50
+ return new Set();
51
+ }
52
+ }
53
+ function getRid(ref) {
54
+ return (ref.getAttribute('r:id') ??
55
+ ref.getAttributeNS(OOXML.R_NS, 'id') ??
56
+ ref.getAttribute('id') ??
57
+ undefined);
58
+ }
59
+ export function auditSectPr(documentXml, documentRelsXml) {
60
+ const issues = [];
61
+ const relIds = collectRelationshipIds(documentRelsXml);
62
+ const doc = parseXml(documentXml);
63
+ const body = doc.getElementsByTagName('w:body').item(0);
64
+ if (!body) {
65
+ return {
66
+ ok: false,
67
+ issues: [
68
+ {
69
+ type: 'missing_body',
70
+ path: 'w:document',
71
+ message: 'Missing w:body element',
72
+ },
73
+ ],
74
+ stats: {
75
+ bodyLevelSectPrCount: 0,
76
+ paragraphLevelSectPrCount: 0,
77
+ totalSectPrCount: 0,
78
+ referenceCount: 0,
79
+ },
80
+ };
81
+ }
82
+ const bodyChildren = childElements(body);
83
+ const bodyLevelSectPrNodes = bodyChildren.filter((child) => child.tagName === 'w:sectPr');
84
+ if (bodyLevelSectPrNodes.length > 1) {
85
+ for (const sectPr of bodyLevelSectPrNodes) {
86
+ issues.push({
87
+ type: 'multiple_body_level_sectpr',
88
+ path: nodePath(sectPr),
89
+ message: 'Multiple body-level w:sectPr elements found; expected at most one final w:sectPr',
90
+ });
91
+ }
92
+ }
93
+ if (bodyLevelSectPrNodes.length > 0) {
94
+ const lastChild = bodyChildren[bodyChildren.length - 1];
95
+ for (const sectPr of bodyLevelSectPrNodes) {
96
+ if (sectPr !== lastChild) {
97
+ issues.push({
98
+ type: 'body_level_sectpr_not_last',
99
+ path: nodePath(sectPr),
100
+ message: 'Body-level w:sectPr is not the final direct child of w:body',
101
+ });
102
+ }
103
+ }
104
+ }
105
+ const sectPrNodes = Array.from(doc.getElementsByTagName('w:sectPr'));
106
+ let paragraphLevelSectPrCount = 0;
107
+ let referenceCount = 0;
108
+ for (const sectPr of sectPrNodes) {
109
+ const parent = sectPr.parentNode;
110
+ const parentTag = parent && parent.nodeType === 1 ? parent.tagName : '';
111
+ if (parentTag === 'w:pPr') {
112
+ paragraphLevelSectPrCount++;
113
+ const grand = parent.parentNode;
114
+ const grandTag = grand && grand.nodeType === 1 ? grand.tagName : '';
115
+ if (grandTag !== 'w:p') {
116
+ issues.push({
117
+ type: 'sectpr_in_ppr_without_paragraph_parent',
118
+ path: nodePath(sectPr),
119
+ message: 'w:sectPr in w:pPr does not have w:p as parent',
120
+ });
121
+ }
122
+ }
123
+ else if (parentTag !== 'w:body') {
124
+ issues.push({
125
+ type: 'sectpr_invalid_parent',
126
+ path: nodePath(sectPr),
127
+ message: `w:sectPr has invalid parent '${parentTag || '(none)'}'`,
128
+ });
129
+ }
130
+ for (const child of childElements(sectPr)) {
131
+ if (child.tagName !== 'w:headerReference' && child.tagName !== 'w:footerReference') {
132
+ continue;
133
+ }
134
+ referenceCount++;
135
+ const rid = getRid(child);
136
+ if (!rid) {
137
+ issues.push({
138
+ type: 'sectpr_reference_missing_rid',
139
+ path: nodePath(child),
140
+ message: `${child.tagName} is missing r:id`,
141
+ });
142
+ continue;
143
+ }
144
+ if (relIds.size > 0 && !relIds.has(rid)) {
145
+ issues.push({
146
+ type: 'sectpr_reference_dangling_rid',
147
+ path: nodePath(child),
148
+ message: `${child.tagName} references missing relationship id '${rid}'`,
149
+ rid,
150
+ });
151
+ }
152
+ }
153
+ }
154
+ return {
155
+ ok: issues.length === 0,
156
+ issues,
157
+ stats: {
158
+ bodyLevelSectPrCount: bodyLevelSectPrNodes.length,
159
+ paragraphLevelSectPrCount,
160
+ totalSectPrCount: sectPrNodes.length,
161
+ referenceCount,
162
+ },
163
+ };
164
+ }
165
+ //# sourceMappingURL=sectPrAudit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sectPrAudit.js","sourceRoot":"","sources":["../../src/primitives/sectPrAudit.ts"],"names":[],"mappings":"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"}
@@ -12,6 +12,13 @@ export declare function stripFontTags(text: string): string;
12
12
  * `<highlight>`, `<highlighting>`, `<a href="...">`, `</a>`, `<font ...>`,
13
13
  * `</font>`, `<header>`, `</header>`, `<RunInHeader>`, `</RunInHeader>`,
14
14
  * `<definition>`, `</definition>`.
15
+ *
16
+ * The replacement runs to a fixpoint (loop until the string stops changing) rather than a
17
+ * single pass: removing one tag can splice two halves together into a *new* tag occurrence
18
+ * (e.g. `<b<b>i>` → `<bi>`), which a single pass would leave behind. Looping closes that
19
+ * `js/incomplete-multi-character-sanitization` gap. Well-formed document `tagged_text`
20
+ * (non-nested, known tags only) reaches the fixpoint on the first pass, so this is a no-op
21
+ * for real input.
15
22
  */
16
23
  export declare function stripAllInlineTags(text: string): string;
17
24
  //# sourceMappingURL=semantic_tags.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"semantic_tags.d.ts","sourceRoot":"","sources":["../../src/primitives/semantic_tags.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,aAAa,cAAc,CAAC;AAQzC,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAIxD;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAOtD;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMvD;AAOD,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEjD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGlD;AAOD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGvD"}
1
+ {"version":3,"file":"semantic_tags.d.ts","sourceRoot":"","sources":["../../src/primitives/semantic_tags.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,aAAa,cAAc,CAAC;AAQzC,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAIxD;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAQtD;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMvD;AAOD,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEjD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGlD;AAYD;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CASvD"}
@@ -22,13 +22,14 @@ export function stripHyperlinkTags(text) {
22
22
  }
23
23
  export function hasHighlightTags(text) {
24
24
  return (text.includes(`<${HIGHLIGHT_TAG}>`) ||
25
+ text.includes(`<${HIGHLIGHT_TAG} `) || // full-mode attributed form: <highlight color="...">
25
26
  text.includes(`</${HIGHLIGHT_TAG}>`) ||
26
27
  text.includes('<highlighting>') ||
27
28
  text.includes('</highlighting>'));
28
29
  }
29
30
  export function stripHighlightTags(text) {
30
31
  return text
31
- .replaceAll(new RegExp(`<${HIGHLIGHT_TAG}>`, 'g'), '')
32
+ .replaceAll(new RegExp(`<${HIGHLIGHT_TAG}\\b[^>]*>`, 'g'), '')
32
33
  .replaceAll(new RegExp(`</${HIGHLIGHT_TAG}>`, 'g'), '')
33
34
  .replaceAll(/<highlighting>/g, '')
34
35
  .replaceAll(/<\/highlighting>/g, '');
@@ -44,15 +45,33 @@ export function stripFontTags(text) {
44
45
  return text.replace(FONT_OPEN_RE, '').replace(FONT_CLOSE_RE, '');
45
46
  }
46
47
  // General-purpose inline tag stripper ──────────────────────────────
47
- const ALL_INLINE_TAGS_RE = /<\/?(?:b|i|u|highlight|highlighting|a|font|header|RunInHeader|definition)(?:\s[^>]*)?>|<a\s+href="[^"]*">/g;
48
+ // A word boundary (`\b`) after the tag name keeps `<beta>` from matching `<b>` while letting
49
+ // `[^>]*>` consume any attributes linearly. Two earlier constructs were dropped: the
50
+ // `(?:\s[^>]*)?` group (its `\s` overlaps `[^>]`, the ambiguity CodeQL flags as polynomial
51
+ // ReDoS — `js/polynomial-redos` — on uncontrolled document text) and the trailing
52
+ // `|<a\s+href="[^"]*">` alternative (already covered by the `a` name + `[^>]*`).
53
+ const ALL_INLINE_TAGS_RE = /<\/?(?:b|i|u|highlight|highlighting|a|font|header|RunInHeader|definition)\b[^>]*>/g;
48
54
  /**
49
55
  * Strip ALL known inline tags from text. Handles `<b>`, `<i>`, `<u>`,
50
56
  * `<highlight>`, `<highlighting>`, `<a href="...">`, `</a>`, `<font ...>`,
51
57
  * `</font>`, `<header>`, `</header>`, `<RunInHeader>`, `</RunInHeader>`,
52
58
  * `<definition>`, `</definition>`.
59
+ *
60
+ * The replacement runs to a fixpoint (loop until the string stops changing) rather than a
61
+ * single pass: removing one tag can splice two halves together into a *new* tag occurrence
62
+ * (e.g. `<b<b>i>` → `<bi>`), which a single pass would leave behind. Looping closes that
63
+ * `js/incomplete-multi-character-sanitization` gap. Well-formed document `tagged_text`
64
+ * (non-nested, known tags only) reaches the fixpoint on the first pass, so this is a no-op
65
+ * for real input.
53
66
  */
54
67
  export function stripAllInlineTags(text) {
55
- ALL_INLINE_TAGS_RE.lastIndex = 0;
56
- return text.replace(ALL_INLINE_TAGS_RE, '');
68
+ let current = text;
69
+ let previous;
70
+ do {
71
+ previous = current;
72
+ ALL_INLINE_TAGS_RE.lastIndex = 0;
73
+ current = current.replace(ALL_INLINE_TAGS_RE, '');
74
+ } while (current !== previous);
75
+ return current;
57
76
  }
58
77
  //# sourceMappingURL=semantic_tags.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"semantic_tags.js","sourceRoot":"","sources":["../../src/primitives/semantic_tags.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,EAAE;AACF,mFAAmF;AAEnF,MAAM,CAAC,MAAM,aAAa,GAAG,WAAW,CAAC;AAEzC,qEAAqE;AAErE,MAAM,iBAAiB,GAAG,aAAa,CAAC;AACxC,MAAM,iBAAiB,GAAG,qBAAqB,CAAC;AAChD,MAAM,kBAAkB,GAAG,QAAQ,CAAC;AAEpC,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,OAAO,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,kDAAkD;IAClD,iBAAiB,CAAC,SAAS,GAAG,CAAC,CAAC;IAChC,OAAO,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,OAAO,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;AAC7E,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,OAAO,CACL,IAAI,CAAC,QAAQ,CAAC,IAAI,aAAa,GAAG,CAAC;QACnC,IAAI,CAAC,QAAQ,CAAC,KAAK,aAAa,GAAG,CAAC;QACpC,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC;QAC/B,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CACjC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,OAAO,IAAI;SACR,UAAU,CAAC,IAAI,MAAM,CAAC,IAAI,aAAa,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC;SACrD,UAAU,CAAC,IAAI,MAAM,CAAC,KAAK,aAAa,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC;SACtD,UAAU,CAAC,iBAAiB,EAAE,EAAE,CAAC;SACjC,UAAU,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;AACzC,CAAC;AAED,qEAAqE;AAErE,MAAM,YAAY,GAAG,gBAAgB,CAAC;AACtC,MAAM,aAAa,GAAG,WAAW,CAAC;AAElC,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,YAAY,CAAC,SAAS,GAAG,CAAC,CAAC;IAC3B,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;AACnE,CAAC;AAED,qEAAqE;AAErE,MAAM,kBAAkB,GACtB,4GAA4G,CAAC;AAE/G;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,kBAAkB,CAAC,SAAS,GAAG,CAAC,CAAC;IACjC,OAAO,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;AAC9C,CAAC"}
1
+ {"version":3,"file":"semantic_tags.js","sourceRoot":"","sources":["../../src/primitives/semantic_tags.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import type { DocumentViewNode } from './document_view.js';
2
+ import type { Footnote } from './footnotes.js';
3
+ /**
4
+ * Tracks which footnote numbers were actually rendered as markers in the body, and how many
5
+ * times each appeared. Used to (a) give repeated markers unique element ids and (b) emit a
6
+ * back-link from a definition only when its marker was really rendered (no dangling `#fnref-n`).
7
+ */
8
+ type FootnoteRefs = Map<number, number>;
9
+ export declare function isSafeHref(href: string): boolean;
10
+ /**
11
+ * Convert one TOON inline-tag string (a `DocumentViewNode.tagged_text` value) to inline HTML.
12
+ * This is the HTML parallel of `inlineTagsToMarkdown` and the reusable core of the serializer.
13
+ *
14
+ * Tag mapping:
15
+ * - `<b>`/`<i>`/`<u>`/`<a href="...">` → passed through verbatim (already valid, attribute-escaped HTML)
16
+ * - `<highlight>` → `<mark>`
17
+ * - `<font color=… size=… face=…>` → `<span style="…">` (values sanitized)
18
+ *
19
+ * Literal text spans are HTML-escaped; injected `[^n]` footnote markers become `<sup>` anchors.
20
+ */
21
+ export declare function inlineTagsToHtml(text: string, refs?: FootnoteRefs): string;
22
+ export interface SerializeHtmlOptions {
23
+ /** Emit only the body-level elements (no `<!DOCTYPE>`/`<head>`/`<body>` wrapper). */
24
+ readonly fragment?: boolean;
25
+ /** Override the `<title>` (full-document mode only). Defaults to the first heading's text. */
26
+ readonly title?: string;
27
+ }
28
+ /**
29
+ * Serialize a structured document view to semantic HTML.
30
+ *
31
+ * @param nodes Block nodes from `buildDocumentView({ showFormatting: true }).nodes`.
32
+ * @param footnotes Footnotes from `DocxDocument.getFootnotes()` (already sorted by
33
+ * `displayNumber`); rendered as a footnotes `<section>` with back-links.
34
+ */
35
+ export declare function serializeToHtml(nodes: DocumentViewNode[], footnotes?: Footnote[], opts?: SerializeHtmlOptions): string;
36
+ export {};
37
+ //# sourceMappingURL=serialize_html.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serialize_html.d.ts","sourceRoot":"","sources":["../../src/primitives/serialize_html.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAK/C;;;;GAIG;AACH,KAAK,YAAY,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AA0CxC,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAKhD;AAuCD;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,MAAM,CAwB1E;AAiLD,MAAM,WAAW,oBAAoB;IACnC,qFAAqF;IACrF,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,8FAA8F;IAC9F,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,gBAAgB,EAAE,EACzB,SAAS,GAAE,QAAQ,EAAO,EAC1B,IAAI,GAAE,oBAAyB,GAC9B,MAAM,CA4ER"}