@domternal/core 0.7.3 → 0.7.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/EventEmitter.ts","../src/helpers/inputRulesPlugin.ts","../src/helpers/callOrReturn.ts","../src/ExtensionManager.ts","../src/commands/selectionCommands.ts","../src/helpers/createDocument.ts","../src/helpers/isNodeEmpty.ts","../src/helpers/markInputRule.ts","../src/helpers/wrappingInputRule.ts","../src/helpers/textblockTypeInputRule.ts","../src/helpers/textInputRule.ts","../src/helpers/nodeInputRule.ts","../src/helpers/isValidUrl.ts","../src/helpers/ssr.ts","../src/helpers/getMarkRange.ts","../src/helpers/findParentNode.ts","../src/helpers/findChildren.ts","../src/helpers/defaultBlockAt.ts","../src/commands/contentCommands.ts","../src/Extension.ts","../src/helpers/specBuilder.ts","../src/Mark.ts","../src/commands/markCommands.ts","../src/utils/listItemAncestor.ts","../src/utils/liftCurrentListItem.ts","../src/commands/nodeCommands.ts","../src/utils/listItemCursorContext.ts","../src/commands/listCommands.ts","../src/commands/attributeCommands.ts","../src/commands/index.ts","../src/commandPropsBuilder.ts","../src/ChainBuilder.ts","../src/CanChecker.ts","../src/CommandManager.ts","../src/utils/inlineStyles.ts","../src/helpers/normalizeColor.ts","../src/Editor.ts","../src/utils/positionFloating.ts","../src/utils/clipboard.ts","../src/utils/copyThemeClass.ts","../src/utils/defaultBubbleContexts.ts","../src/utils/insertAsListItemChild.ts","../src/utils/liftEmptyChildrenZoneParagraph.ts","../src/utils/insertChildrenZoneSibling.ts","../src/utils/splitListForInsert.ts","../src/Node.ts","../src/ToolbarController.ts","../src/utils/groupFloatingMenuItems.ts","../src/FloatingMenuController.ts","../src/icons/phosphor.ts","../src/nodes/Document.ts","../src/nodes/Text.ts","../src/nodes/Paragraph.ts","../src/nodes/Heading.ts","../src/nodes/Blockquote.ts","../src/nodes/CodeBlock.ts","../src/extensions/ListKeymap.ts","../src/nodes/ListItem.ts","../src/nodes/BulletList.ts","../src/nodes/OrderedList.ts","../src/nodes/HorizontalRule.ts","../src/nodes/HardBreak.ts","../src/nodes/TaskItemNodeView.ts","../src/nodes/TaskItem.ts","../src/nodes/TaskList.ts","../src/marks/Bold.ts","../src/marks/Italic.ts","../src/marks/Underline.ts","../src/marks/Strike.ts","../src/marks/Code.ts","../src/marks/helpers/linkClickPlugin.ts","../src/marks/helpers/linkPastePlugin.ts","../src/marks/helpers/autolinkPlugin.ts","../src/marks/helpers/linkExitPlugin.ts","../src/marks/Link.ts","../src/marks/Subscript.ts","../src/marks/Superscript.ts","../src/marks/TextStyle.ts","../src/extensions/BaseKeymap.ts","../src/extensions/History.ts","../src/extensions/Dropcursor.ts","../src/extensions/Gapcursor.ts","../src/extensions/TrailingNode.ts","../src/extensions/Placeholder.ts","../src/extensions/ListIndent.ts","../src/extensions/CharacterCount.ts","../src/extensions/Typography.ts","../src/extensions/TextAlign.ts","../src/extensions/Focus.ts","../src/extensions/LineHeight.ts","../src/extensions/UniqueID.ts","../src/extensions/BlockColor.ts","../src/extensions/Selection.ts","../src/extensions/SelectionDecoration.ts","../src/extensions/InvisibleChars.ts","../src/extensions/TextColor.ts","../src/extensions/Highlight.ts","../src/extensions/FontFamily.ts","../src/extensions/FontSize.ts","../src/extensions/NotionColorPicker.ts","../src/extensions/ClearFormatting.ts","../src/extensions/LinkPopover.ts","../src/extensions/BubbleMenu.ts","../src/extensions/StarterKit.ts","../src/index.ts"],"names":["state","TextSelection","Plugin","Schema","keymap","AllSelection","pmSelectNodeBackward","DOMParser","PMNode","find","InputRule","findWrapping","canJoin","document","DOMSerializer","PMDOMParser","offset","ProseMirrorDOMParser","Fragment","Slice","liftListItem","allWrapped","from","to","liftTarget","$from","$to","range","target","allInTargetList","EditorState","wrapRangeInList","EditorView","flip","shift","hide","computePosition","autoUpdate","LIST_ITEM_TYPES","tr","pos","Node","PluginKey","sinkListItem","splitBlock","splitListItem","Selection","chainCommands","newlineInCode","createParagraphNear","liftEmptyBlock","baseKeymap","undo","redo","history","dropCursor","gapCursor","DecorationSet","isNodeEmpty","Decoration","LIST_WRAPPER_TYPES","NodeSelection","PMSelection"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAsBO,IAAM,eAAN,MAA4F;AAAA;AAAA,EAEvF,SAAA,uBAAgB,GAAA,EAA+C;AAAA;AAAA;AAAA;AAAA,EAKzE,EAAA,CAA2B,OAAU,QAAA,EAA0C;AAC7E,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA;AAE1C,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,SAAA,CAAU,IAAI,QAAkC,CAAA;AAAA,IAClD,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,SAAA,CAAU,IAAI,KAAA,kBAAO,IAAI,IAAI,CAAC,QAAkC,CAAC,CAAC,CAAA;AAAA,IACzE;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,GAAA,CAA4B,OAAU,QAAA,EAA2C;AAC/E,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA;AAE1C,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,IAAI,QAAA,EAAU;AAEZ,QAAA,SAAA,CAAU,OAAO,QAAkC,CAAA;AAGnD,QAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,UAAA,IAAA,CAAK,SAAA,CAAU,OAAO,KAAK,CAAA;AAAA,QAC7B;AAAA,MACF,CAAA,MAAO;AAEL,QAAA,IAAA,CAAK,SAAA,CAAU,OAAO,KAAK,CAAA;AAAA,MAC7B;AAAA,IACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAA,CACE,UACG,IAAA,EACG;AACN,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA;AAE1C,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,SAAA,CAAU,OAAA,CAAQ,CAAC,QAAA,KAAa;AAC9B,QAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AACnB,UAAC,QAAA,CAAqC,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,CAAC,CAAC,CAAA;AAAA,QAC1D,CAAA,MAAO;AACL,UAAC,QAAA,CAAwB,KAAK,IAAI,CAAA;AAAA,QACpC;AAAA,MACF,CAAC,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,IAAA,CAA6B,OAAU,QAAA,EAA0C;AAC/E,IAAA,MAAM,WAAA,IAAe,IAAI,IAAA,KAAoB;AAC3C,MAAA,IAAA,CAAK,GAAA,CAAI,OAAO,WAAW,CAAA;AAE3B,MAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AACnB,QAAC,QAAA,CAAqC,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,CAAC,CAAC,CAAA;AAAA,MAC1D,CAAA,MAAO;AACL,QAAC,QAAA,CAAwB,KAAK,IAAI,CAAA;AAAA,MACpC;AAAA,IACF,CAAA,CAAA;AAEA,IAAA,OAAO,IAAA,CAAK,EAAA,CAAG,KAAA,EAAO,WAAW,CAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAmB,KAAA,EAA4B;AAC7C,IAAA,IAAI,UAAU,MAAA,EAAW;AACvB,MAAA,IAAA,CAAK,SAAA,CAAU,OAAO,KAAK,CAAA;AAAA,IAC7B,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AAAA,IACvB;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,KAAA,EAA6B;AACzC,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAK,GAAG,IAAA,IAAQ,CAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,GAA+B;AAC7B,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA;AAAA,EACzC;AACF;ACtGA,IAAM,SAAA,GAAY,GAAA;AAElB,SAAS,IACP,IAAA,EACA,IAAA,EACA,EAAA,EACA,IAAA,EACA,OACA,MAAA,EACS;AACT,EAAA,IAAI,IAAA,CAAK,WAAW,OAAO,KAAA;AAE3B,EAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,GAAA,CAAI,OAAA,CAAQ,IAAI,CAAA;AACpC,EAAA,MAAM,UAAA,GACJ,MAAM,MAAA,CAAO,WAAA;AAAA,IACX,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAA,CAAM,eAAe,SAAS,CAAA;AAAA,IAC1C,KAAA,CAAM,YAAA;AAAA,IACN,IAAA;AAAA,IACA;AAAA,GACF,GAAI,IAAA;AAEN,EAAA,KAAA,MAAW,WAAW,KAAA,EAAO;AAC3B,IAAA,MAAM,IAAA,GAAO,OAAA;AAEb,IAAA,IAAI,CAAC,IAAA,CAAK,UAAA,IAAc,KAAA,CAAM,KAAA,EAAM,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,EAAG;AACrE,IAAA,IAAI,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM;AAC/B,MAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAAA,IACpB,CAAA,MAAA,IAAW,IAAA,CAAK,MAAA,KAAW,MAAA,EAAQ;AACjC,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,UAAU,CAAA;AACxC,IAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,CAAC,CAAA,CAAE,MAAA,GAAS,KAAK,MAAA,EAAQ;AAE7C,IAAA,MAAM,WAAW,IAAA,IAAQ,KAAA,CAAM,CAAC,CAAA,CAAE,SAAS,IAAA,CAAK,MAAA,CAAA;AAEhD,IAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AACpB,MAAA,MAAM,YAAuB,EAAC;AAC9B,MAAA,KAAA,CAAM,IAAI,YAAA,CAAa,QAAA,EAAU,KAAA,CAAM,GAAA,EAAK,CAAC,IAAA,KAAS;AACpD,QAAA,IAAI,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,KAAA,CAAM,KAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,EAAG,SAAA,CAAU,KAAK,IAAI,CAAA;AAAA,MACpF,CAAC,CAAA;AACD,MAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AAAA,IAC5B;AAEA,IAAA,MAAM,KAAK,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,KAAA,EAAO,UAAU,EAAE,CAAA;AAClD,IAAA,IAAI,CAAC,EAAA,EAAI;AAET,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA,EAAA,CAAG,OAAA,CAAQ,QAAQ,EAAE,SAAA,EAAW,IAAI,IAAA,EAAM,EAAA,EAAI,MAAM,CAAA;AAAA,IACtD;AACA,IAAA,IAAA,CAAK,SAAS,EAAE,CAAA;AAChB,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,KAAA;AACT;AAaA,SAAS,aAAA,CAAc,MAAA,EAAgBA,OAAA,EAAoB,QAAA,EAA+C;AACxG,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,QAAA,CAASA,OAAK,CAAA;AACtC,EAAA,IAAI,CAAC,UAAU,OAAO,KAAA;AAEtB,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,MAAM,KAAKA,OAAA,CAAM,EAAA;AACjB,IAAA,MAAM,SAAS,QAAA,CAAS,SAAA;AACxB,IAAA,KAAA,IAAS,IAAI,MAAA,CAAO,KAAA,CAAM,SAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AACjD,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA;AAC3B,MAAA,MAAM,GAAA,GAAM,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA;AACzB,MAAA,IAAI,QAAQ,GAAA,EAAK,EAAA,CAAG,KAAK,IAAA,CAAK,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,IAC3C;AACA,IAAA,IAAI,SAAS,IAAA,EAAM;AACjB,MAAA,MAAM,QAAQ,EAAA,CAAG,GAAA,CAAI,QAAQ,QAAA,CAAS,IAAI,EAAE,KAAA,EAAM;AAClD,MAAA,EAAA,CAAG,WAAA,CAAY,QAAA,CAAS,IAAA,EAAM,QAAA,CAAS,EAAA,EAAIA,OAAA,CAAM,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,IAAA,EAAM,KAAK,CAAC,CAAA;AAElF,MAAA,MAAM,MAAA,GAAS,QAAA,CAAS,IAAA,GAAO,QAAA,CAAS,IAAA,CAAK,MAAA;AAC7C,MAAA,IAAI,MAAA,IAAU,EAAA,CAAG,GAAA,CAAI,OAAA,CAAQ,IAAA,EAAM;AACjC,QAAA,EAAA,CAAG,aAAaC,mBAAA,CAAc,MAAA,CAAO,EAAA,CAAG,GAAA,EAAK,MAAM,CAAC,CAAA;AAAA,MACtD;AAAA,IACF,CAAA,MAAO;AACL,MAAA,EAAA,CAAG,MAAA,CAAO,QAAA,CAAS,IAAA,EAAM,QAAA,CAAS,EAAE,CAAA;AAAA,IACtC;AACA,IAAA,QAAA,CAAS,EAAE,CAAA;AAAA,EACb;AACA,EAAA,OAAO,IAAA;AACT;AAOO,SAAS,gBAAA,CAAiB,EAAE,KAAA,EAAM,EAAmC;AAC1E,EAAA,MAAM,MAAA,GAAiB,IAAIC,YAAA,CAAO;AAAA,IAChC,KAAA,EAAO;AAAA,MACL,IAAA,GAA+B;AAC7B,QAAA,OAAO,IAAA;AAAA,MACT,CAAA;AAAA,MACA,KAAA,CAAM,IAAiB,IAAA,EAAsD;AAC3E,QAAA,MAAM,MAAA,GAAS,EAAA,CAAG,OAAA,CAAQ,MAAM,CAAA;AAChC,QAAA,IAAI,QAAQ,OAAO,MAAA;AAGnB,QAAA,IAAI,EAAA,CAAG,OAAA,CAAQ,qBAAqB,CAAA,EAAG,OAAO,IAAA;AAE9C,QAAA,OAAO,EAAA,CAAG,YAAA,IAAgB,EAAA,CAAG,UAAA,GAAa,IAAA,GAAO,IAAA;AAAA,MACnD;AAAA,KACF;AAAA,IACA,KAAA,EAAO;AAAA,MACL,eAAA,CAAgB,IAAA,EAAkB,IAAA,EAAc,EAAA,EAAY,IAAA,EAAc;AACxE,QAAA,OAAO,IAAI,IAAA,EAAM,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,OAAO,MAAM,CAAA;AAAA,MAChD,CAAA;AAAA,MACA,aAAA,CAAc,MAAkB,KAAA,EAAsB;AAIpD,QAAA,IAAI,KAAA,CAAM,GAAA,KAAQ,WAAA,IAAe,CAAC,KAAA,CAAM,OAAA,IAAW,CAAC,KAAA,CAAM,OAAA,IAAW,CAAC,KAAA,CAAM,MAAA,EAAQ;AAClF,UAAA,OAAO,aAAA,CAAc,MAAA,EAAQ,IAAA,CAAK,KAAA,EAAO,CAAC,EAAA,KAAO;AAAE,YAAA,IAAA,CAAK,SAAS,EAAE,CAAA;AAAA,UAAG,CAAC,CAAA;AAAA,QACzE;AACA,QAAA,OAAO,KAAA;AAAA,MACT,CAAA;AAAA,MACA,eAAA,EAAiB;AAAA,QACf,cAAA,EAAgB,CAAC,IAAA,KAAqB;AACpC,UAAA,UAAA,CAAW,MAAM;AACf,YAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,IAAA,CAAK,KAAA,CAAM,SAAA;AAC/B,YAAA,IAAI,OAAA,EAAS;AAAE,cAAA,GAAA,CAAI,MAAM,OAAA,CAAQ,GAAA,EAAK,QAAQ,GAAA,EAAK,EAAA,EAAI,OAAO,MAAM,CAAA;AAAA,YAAG;AAAA,UACzE,CAAC,CAAA;AAAA,QACH;AAAA;AACF,KACF;AAAA;AAAA,IAEA,YAAA,EAAc;AAAA;AAAA,GAE6D,CAAA;AAE7E,EAAA,OAAO,MAAA;AACT;;;ACjJO,SAAS,YAAA,CACd,KAAA,EACA,OAAA,EAAA,GACG,IAAA,EACA;AACH,EAAA,IAAI,OAAO,UAAU,UAAA,EAAY;AAC/B,IAAA,OAAQ,KAAA,CAAoC,IAAA,CAAK,OAAA,EAAS,GAAG,IAAI,CAAA;AAAA,EACnE;AACA,EAAA,OAAO,KAAA;AACT;;;AC6CA,SAAS,cAAA,CACP,QACA,MAAA,EACyB;AACzB,EAAA,MAAM,MAAA,GAAS,EAAE,GAAG,MAAA,EAAO;AAE3B,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AACjD,IAAA,IAAI,GAAA,KAAQ,WAAW,OAAO,MAAA,CAAO,GAAG,CAAA,KAAM,QAAA,IAAY,OAAO,KAAA,KAAU,QAAA,EAAU;AACnF,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,CAAA,EAAG,OAAO,GAAG,CAAC,KAAK,KAAK,CAAA,CAAA;AAAA,IACxC,CAAA,MAAA,IAAW,GAAA,KAAQ,OAAA,IAAW,OAAO,MAAA,CAAO,GAAG,CAAA,KAAM,QAAA,IAAY,OAAO,KAAA,KAAU,QAAA,EAAU;AAC1F,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,CAAA,EAAG,OAAO,GAAG,CAAC,IAAI,KAAK,CAAA,CAAA;AAAA,IACvC,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,KAAA;AAAA,IAChB;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAEO,IAAM,mBAAN,MAAuB;AAAA;AAAA;AAAA;AAAA,EAIX,WAAA;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA;AAAA;AAAA;AAAA;AAAA,EAKR,MAAA;AAAA;AAAA;AAAA;AAAA,EAKQ,WAAoC,EAAC;AAAA;AAAA;AAAA;AAAA,EAK9C,WAAA,GAAc,KAAA;AAAA;AAAA;AAAA;AAAA,EAKd,QAAA,GAA4B,IAAA;AAAA;AAAA;AAAA;AAAA,EAK5B,SAAA,GAA+B,IAAA;AAAA;AAAA;AAAA;AAAA,EAK/B,aAAA,GAAsC,IAAA;AAAA;AAAA;AAAA;AAAA,EAKtC,kBAAA,GAAgD,IAAA;AAAA;AAAA;AAAA;AAAA,EAKhD,UAAA,GAAyD,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQjE,WAAA,CAAY,SAAkC,MAAA,EAAgC;AAC5E,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAGd,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,IAAA,CAAK,cAAc,EAAC;AACpB,MAAA,IAAA,CAAK,UAAU,OAAA,CAAQ,MAAA;AACvB,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,CAAC,OAAA,CAAQ,UAAA,IAAc,OAAA,CAAQ,UAAA,CAAW,WAAW,CAAA,EAAG;AAC1D,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OAEF;AAAA,IACF;AAYA,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,iBAAA,CAAkB,OAAA,CAAQ,UAAU,CAAA;AAC3D,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,qBAAA,CAAsB,SAAS,CAAA;AACpD,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA,CAAK,iBAAA,CAAkB,OAAO,CAAA;AACjD,IAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,IAAA,IAAA,CAAK,iBAAA,EAAkB;AACvB,IAAA,IAAA,CAAK,sBAAA,EAAuB;AAC5B,IAAA,IAAA,CAAK,OAAA,GAAU,KAAK,WAAA,EAAY;AAChC,IAAA,IAAA,CAAK,iBAAA,EAAkB;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,UAAA,GAAsC;AACxC,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,MAAA,GAAiB;AACnB,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,OAAA,GAAmC;AACrC,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,OAAA,GAAoB;AACtB,IAAA,IAAA,CAAK,QAAA,KAAa,KAAK,YAAA,EAAa;AACpC,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,QAAA,GAAuB;AACzB,IAAA,IAAA,CAAK,SAAA,KAAc,KAAK,eAAA,EAAgB;AACxC,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,YAAA,GAA8B;AAChC,IAAA,IAAA,CAAK,aAAA,KAAkB,KAAK,mBAAA,EAAoB;AAChD,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,iBAAA,GAAwC;AAC1C,IAAA,IAAA,CAAK,kBAAA,KAAuB,KAAK,wBAAA,EAAyB;AAC1D,IAAA,OAAO,IAAA,CAAK,kBAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,SAAA,GAAiD;AACnD,IAAA,IAAA,CAAK,UAAA,KAAe,KAAK,gBAAA,EAAiB;AAC1C,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,cAAA,GAAuB;AACrB,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AACrB,IAAA,IAAA,CAAK,kBAAA,GAAqB,IAAA;AAC1B,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,kBAAkB,UAAA,EAA4C;AACpE,IAAA,MAAM,SAAyB,EAAC;AAEhC,IAAA,KAAA,MAAW,OAAO,UAAA,EAAY;AAC5B,MAAA,MAAA,CAAO,KAAK,GAAG,CAAA;AAGf,MAAA,MAAM,MAAA,GAAS,YAAA;AAAA,QACZ,IAAkB,MAAA,CAAO,aAAA;AAAA,QAC1B;AAAA,OACF;AAEA,MAAA,IAAI,MAAA,IAAU,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAC/B,QAAA,MAAA,CAAO,IAAA,CAAK,GAAG,IAAA,CAAK,iBAAA,CAAkB,MAAM,CAAC,CAAA;AAAA,MAC/C;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,sBAAsB,UAAA,EAA4C;AACxE,IAAA,MAAM,IAAA,uBAAW,GAAA,EAAoB;AACrC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,UAAA,CAAW,QAAQ,CAAA,EAAA,EAAK;AAC1C,MAAA,MAAM,GAAA,GAAM,WAAW,CAAC,CAAA;AACxB,MAAA,IAAI,GAAA,EAAK,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,MAAM,CAAC,CAAA;AAAA,IAC/B;AACA,IAAA,OAAO,UAAA,CAAW,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,KAAK,GAAA,CAAI,GAAA,CAAI,IAAI,CAAA,KAAM,CAAC,CAAA;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,kBAAkB,UAAA,EAA4C;AACpE,IAAA,OAAO,CAAC,GAAG,UAAU,EAAE,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM;AACpC,MAAA,MAAM,SAAA,GAAa,CAAA,CAAgB,MAAA,CAAO,QAAA,IAAY,GAAA;AACtD,MAAA,MAAM,SAAA,GAAa,CAAA,CAAgB,MAAA,CAAO,QAAA,IAAY,GAAA;AACtD,MAAA,OAAO,SAAA,GAAY,SAAA;AAAA,IACrB,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,eAAA,GAAwB;AAC9B,IAAA,MAAM,KAAA,uBAAY,GAAA,EAAY;AAE9B,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,WAAA,EAAa;AAClC,MAAA,IAAI,KAAA,CAAM,GAAA,CAAI,GAAA,CAAI,IAAI,CAAA,EAAG;AACvB,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,0BAAA,EAA6B,IAAI,IAAI,CAAA,oEAAA;AAAA,SAEvC;AAAA,MACF;AACA,MAAA,KAAA,CAAM,GAAA,CAAI,IAAI,IAAI,CAAA;AAAA,IACpB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,iBAAA,GAA0B;AAChC,IAAA,MAAM,cAAA,GAAiB,IAAI,GAAA,CAAI,IAAA,CAAK,WAAA,CAAY,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAC,CAAA;AAElE,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,WAAA,EAAa;AAClC,MAAA,MAAM,IAAA,GAAQ,IAAkB,MAAA,CAAO,YAAA;AACvC,MAAA,IAAI,CAAC,IAAA,EAAM;AAEX,MAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,QAAA,IAAI,CAAC,cAAA,CAAe,GAAA,CAAI,GAAG,CAAA,EAAG;AAC5B,UAAA,MAAM,IAAI,KAAA;AAAA,YACR,CAAA,WAAA,EAAc,GAAA,CAAI,IAAI,CAAA,YAAA,EAAe,GAAG,CAAA,oDAAA;AAAA,WAE1C;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,sBAAA,GAA+B;AACrC,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,WAAA,EAAa;AAClC,MAAC,GAAA,CAAkB,SAAS,IAAA,CAAK,MAAA;AAAA,IAEnC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,uBAAA,GAA4E;AAClF,IAAA,MAAM,WAAA,uBAAkB,GAAA,EAAiD;AAEzE,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,WAAA,EAAa;AAClC,MAAA,MAAM,mBAAA,GAAuB,IAAkB,MAAA,CAAO,mBAAA;AACtD,MAAA,IAAI,CAAC,mBAAA,EAAqB;AAE1B,MAAA,MAAM,QAAQ,IAAA,CAAK,QAAA;AAAA,QACjB,MAAM,YAAA,CAAa,mBAAA,EAAqB,GAAG,CAAA;AAAA,QAC3C,CAAA,EAAG,IAAI,IAAI,CAAA,oBAAA;AAAA,OACb;AAEA,MAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,MAAA,KAAA,MAAW,EAAE,KAAA,EAAO,UAAA,EAAW,IAAK,KAAA,EAAO;AACzC,QAAA,KAAA,MAAW,YAAY,KAAA,EAAO;AAC5B,UAAA,MAAM,QAAA,GAAW,WAAA,CAAY,GAAA,CAAI,QAAQ,KAAK,EAAC;AAC/C,UAAA,WAAA,CAAY,IAAI,QAAA,EAAU,EAAE,GAAG,QAAA,EAAU,GAAG,YAAY,CAAA;AAAA,QAC1D;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,qBAAA,CACN,MACA,UAAA,EACM;AAEN,IAAA,MAAM,iBAAwD,EAAC;AAC/D,IAAA,KAAA,MAAW,CAAC,QAAA,EAAU,QAAQ,KAAK,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,EAAG;AAC7D,MAAA,cAAA,CAAe,QAAQ,CAAA,GAAI,EAAE,OAAA,EAAS,SAAS,OAAA,EAAQ;AAAA,IACzD;AACA,IAAA,IAAA,CAAK,QAAQ,EAAE,GAAG,IAAA,CAAK,KAAA,EAAO,GAAG,cAAA,EAAe;AAGhD,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,CAAC,IAAA,KAAS;AAC1C,QAAA,MAAM,mBAAmB,IAAA,CAAK,QAAA;AAG9B,QAAA,OAAO;AAAA,UACL,GAAG,IAAA;AAAA,UACH,QAAA,EAAU,CAAC,GAAA,KAA8B;AACvC,YAAA,MAAM,YAAY,gBAAA,GACd,gBAAA,CAAiB,GAAG,CAAA,GACpB,IAAA,CAAK,SAAS,EAAC;AAEnB,YAAA,IAAI,SAAA,KAAc,OAAO,OAAO,KAAA;AAGhC,YAAA,MAAM,eAAwC,EAAC;AAC/C,YAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAC3B,cAAA,KAAA,MAAW,CAAC,IAAA,EAAM,QAAQ,KAAK,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,EAAG;AACzD,gBAAA,IAAI,SAAS,SAAA,EAAW;AACtB,kBAAA,YAAA,CAAa,IAAI,CAAA,GAAI,QAAA,CAAS,SAAA,CAAU,GAAG,CAAA;AAAA,gBAC7C;AAAA,cACF;AAAA,YACF;AAEA,YAAA,OAAO,EAAE,GAAG,SAAA,EAAW,GAAG,YAAA,EAAa;AAAA,UACzC;AAAA,SACF;AAAA,MACF,CAAC,CAAA;AAAA,IACH;AAGA,IAAA,MAAM,gBAAgB,IAAA,CAAK,KAAA;AAC3B,IAAA,IAAI,aAAA,EAAe;AAEjB,MAAA,MAAM,YAAA,GAAe,IAAI,IAAA,KAA6B;AACpD,QAAA,MAAM,MAAA,GAAU,aAAA,CAA+C,GAAG,IAAI,CAAA;AACtE,QAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,MAAM,GAAG,OAAO,MAAA;AAGnC,QAAA,MAAM,UAAA,GAAa,KAAK,CAAC,CAAA;AAEzB,QAAA,IAAI,iBAAyC,EAAC;AAC9C,QAAA,KAAA,MAAW,GAAG,QAAQ,KAAK,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,EAAG;AACrD,UAAA,IAAI,SAAS,UAAA,EAAY;AACvB,YAAA,MAAM,QAAA,GAAW,QAAA,CAAS,UAAA,CAAW,UAAA,CAAW,KAAK,CAAA;AACrD,YAAA,IAAI,QAAA,EAAU;AACZ,cAAA,cAAA,GAAiB,cAAA,CAAe,gBAAgB,QAAQ,CAAA;AAAA,YAC1D;AAAA,UACF;AAAA,QACF;AAGA,QAAA,IACE,OAAO,MAAA,IAAU,CAAA,IACjB,OAAO,MAAA,CAAO,CAAC,MAAM,QAAA,IACrB,MAAA,CAAO,CAAC,CAAA,KAAM,QACd,CAAC,KAAA,CAAM,QAAQ,MAAA,CAAO,CAAC,CAAC,CAAA,EACxB;AACA,UAAA,MAAM,aAAA,GAAgB,OAAO,CAAC,CAAA;AAC9B,UAAA,MAAA,CAAO,CAAC,CAAA,GAAI,EAAE,GAAG,aAAA,EAAe,GAAG,cAAA,EAAe;AAAA,QACpD,WAAW,MAAA,CAAO,IAAA,CAAK,cAAc,CAAA,CAAE,SAAS,CAAA,EAAG;AAEjD,UAAA,MAAM,IAAA,GAAO,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA;AAC3B,UAAA,OAAO,CAAC,MAAA,CAAO,CAAC,CAAA,EAAG,cAAA,EAAgB,GAAG,IAAI,CAAA;AAAA,QAC5C;AAEA,QAAA,OAAO,MAAA;AAAA,MACT,CAAA;AAIA,MAAC,KAAa,KAAA,GAAQ,YAAA;AAAA,IACxB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,WAAA,GAAsB;AAE5B,IAAA,MAAM,WAAA,GAAc,KAAK,uBAAA,EAAwB;AAEjD,IAAA,MAAM,QAAkC,EAAC;AACzC,IAAA,MAAM,QAAkC,EAAC;AACzC,IAAA,IAAI,OAAA;AAEJ,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,WAAA,EAAa;AAClC,MAAA,IAAI,GAAA,CAAI,SAAS,MAAA,EAAQ;AACvB,QAAA,MAAM,OAAA,GAAU,GAAA;AAChB,QAAA,MAAM,IAAA,GAAO,QAAQ,cAAA,EAAe;AAEpC,QAAA,MAAM,UAAA,GAAa,WAAA,CAAY,GAAA,CAAI,GAAA,CAAI,IAAI,CAAA;AAC3C,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,IAAA,CAAK,qBAAA,CAAsB,MAAM,UAAU,CAAA;AAAA,QAC7C;AAEA,QAAA,KAAA,CAAM,GAAA,CAAI,IAAI,CAAA,GAAI,IAAA;AAGlB,QAAA,IAAI,OAAA,CAAQ,OAAO,OAAA,EAAS;AAC1B,UAAA,OAAA,GAAU,GAAA,CAAI,IAAA;AAAA,QAChB;AAAA,MACF,CAAA,MAAA,IAAW,GAAA,CAAI,IAAA,KAAS,MAAA,EAAQ;AAC9B,QAAA,MAAM,OAAA,GAAU,GAAA;AAChB,QAAA,MAAM,IAAA,GAAO,QAAQ,cAAA,EAAe;AAEpC,QAAA,MAAM,UAAA,GAAa,WAAA,CAAY,GAAA,CAAI,GAAA,CAAI,IAAI,CAAA;AAC3C,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,IAAA,CAAK,qBAAA,CAAsB,MAAM,UAAU,CAAA;AAAA,QAC7C;AAEA,QAAA,KAAA,CAAM,GAAA,CAAI,IAAI,CAAA,GAAI,IAAA;AAAA,MACpB;AAAA,IACF;AAEA,IAAA,OAAO,IAAIC,YAAA,CAAO;AAAA,MAChB,KAAA;AAAA,MACA,KAAA;AAAA,MACA,GAAI,OAAA,IAAW,EAAE,OAAA;AAAQ,KAC1B,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAA,GAA0B;AAChC,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,WAAA,EAAa;AAClC,MAAA,MAAM,cAAA,GAAkB,IAAkB,MAAA,CAAO,UAAA;AACjD,MAAA,IAAI,cAAA,EAAgB;AAClB,QAAA,MAAM,UAAU,IAAA,CAAK,QAAA;AAAA,UACnB,MAAM,YAAA,CAAa,cAAA,EAAgB,GAAG,CAAA;AAAA,UACtC,CAAA,EAAG,IAAI,IAAI,CAAA,WAAA;AAAA,SACb;AACA,QAAA,IAAI,YAAY,MAAA,EAAW;AACzB,UAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,IAAI,CAAA,GAAI,OAAA;AAC1B,UAAC,IAAkB,OAAA,GAAU,OAAA;AAAA,QAC/B;AAAA,MACF;AAIA,MAAA,IAAI,EAAE,GAAA,CAAI,IAAA,IAAQ,IAAA,CAAK,QAAA,CAAA,EAAW;AAChC,QAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,IAAI,CAAA,GAAK,GAAA,CAAkB,OAAA;AAAA,MAC/C;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,YAAA,GAAyB;AAC/B,IAAA,MAAM,UAAoB,EAAC;AAK3B,IAAA,MAAM,KAAA,GAAQ,KAAK,iBAAA,EAAkB;AACrC,IAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,MAAA,OAAA,CAAQ,IAAA,CAAK,gBAAA,CAAuB,EAAE,KAAA,EAAO,CAAC,CAAA;AAAA,IAChD;AAGA,IAAA,MAAM,SAAA,GAAY,KAAK,wBAAA,EAAyB;AAChD,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA,CAAE,SAAS,CAAA,EAAG;AACrC,MAAA,OAAA,CAAQ,IAAA,CAAKC,aAAA,CAAO,SAAS,CAAC,CAAA;AAAA,IAChC;AAGA,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,WAAA,EAAa;AAClC,MAAA,MAAM,UAAA,GAAc,IAAkB,MAAA,CAAO,qBAAA;AAC7C,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,MAAM,aAAa,IAAA,CAAK,QAAA;AAAA,UACtB,MAAM,YAAA,CAAa,UAAA,EAAY,GAAG,CAAA;AAAA,UAClC,CAAA,EAAG,IAAI,IAAI,CAAA,sBAAA;AAAA,SACb;AACA,QAAA,IAAI,UAAA,IAAc,UAAA,CAAW,MAAA,GAAS,CAAA,EAAG;AACvC,UAAA,OAAA,CAAQ,IAAA,CAAK,GAAG,UAAU,CAAA;AAAA,QAC5B;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,wBAAA,GAAsD;AAC5D,IAAA,MAAM,YAAuC,EAAC;AAE9C,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,WAAA,EAAa;AAClC,MAAA,MAAM,YAAA,GAAgB,IAAkB,MAAA,CAAO,oBAAA;AAC/C,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,MAAM,eAAe,IAAA,CAAK,QAAA;AAAA,UACxB,MAAM,YAAA,CAAa,YAAA,EAAc,GAAG,CAAA;AAAA,UACpC,CAAA,EAAG,IAAI,IAAI,CAAA,qBAAA;AAAA,SACb;AACA,QAAA,IAAI,YAAA,EAAc;AAChB,UAAA,MAAM,IAAA,GAAO,YAAA;AACb,UAAA,KAAA,MAAW,CAAC,GAAA,EAAK,OAAO,KAAK,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,EAAG;AACjD,YAAA,IAAI,SAAA,CAAU,GAAG,CAAA,EAAG;AAElB,cAAA,MAAM,IAAA,GAAO,UAAU,GAAG,CAAA;AAC1B,cAAA,SAAA,CAAU,GAAG,CAAA,GAAI,CAAC,KAAA,EAAO,UAAU,IAAA,KAAS;AAC1C,gBAAA,OAAO,OAAA,CAAQ,OAAO,QAAA,EAAU,IAAI,KAAK,IAAA,CAAK,KAAA,EAAO,UAAU,IAAI,CAAA;AAAA,cACrE,CAAA;AAAA,YACF,CAAA,MAAO;AACL,cAAA,SAAA,CAAU,GAAG,CAAA,GAAI,OAAA;AAAA,YACnB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,SAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAA,GAAiC;AACvC,IAAA,MAAM,QAAqB,EAAC;AAE5B,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,WAAA,EAAa;AAClC,MAAA,MAAM,QAAA,GAAY,IAAkB,MAAA,CAAO,aAAA;AAC3C,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,MAAM,WAAW,IAAA,CAAK,QAAA;AAAA,UACpB,MAAM,YAAA,CAAa,QAAA,EAAU,GAAG,CAAA;AAAA,UAChC,CAAA,EAAG,IAAI,IAAI,CAAA,cAAA;AAAA,SACb;AACA,QAAA,IAAI,QAAA,IAAY,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG;AACnC,UAAA,KAAA,CAAM,IAAA,CAAK,GAAG,QAAQ,CAAA;AAAA,QACxB;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,eAAA,GAA8B;AACpC,IAAA,MAAM,WAAuB,EAAC;AAE9B,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,WAAA,EAAa;AAClC,MAAA,MAAM,WAAA,GAAe,IAAkB,MAAA,CAAO,WAAA;AAC9C,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,MAAM,cAAc,IAAA,CAAK,QAAA;AAAA,UACvB,MAAM,YAAA,CAAa,WAAA,EAAa,GAAG,CAAA;AAAA,UACnC,CAAA,EAAG,IAAI,IAAI,CAAA,YAAA;AAAA,SACb;AACA,QAAA,IAAI,WAAA,EAAa;AAEf,UAAA,MAAA,CAAO,MAAA,CAAO,UAAU,WAAW,CAAA;AAAA,QACrC;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAA,GAAqC;AAC3C,IAAA,MAAM,QAAuB,EAAC;AAE9B,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,WAAA,EAAa;AAClC,MAAA,MAAM,QAAA,GAAY,IAAkB,MAAA,CAAO,eAAA;AAC3C,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,MAAM,WAAW,IAAA,CAAK,QAAA;AAAA,UACpB,MAAM,YAAA,CAAa,QAAA,EAAU,GAAG,CAAA;AAAA,UAChC,CAAA,EAAG,IAAI,IAAI,CAAA,gBAAA;AAAA,SACb;AACA,QAAA,IAAI,QAAA,IAAY,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG;AACnC,UAAA,KAAA,CAAM,IAAA,CAAK,GAAG,QAAQ,CAAA;AAAA,QACxB;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,wBAAA,GAA+C;AACrD,IAAA,MAAM,QAA4B,EAAC;AAEnC,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,WAAA,EAAa;AAClC,MAAA,MAAM,QAAA,GAAY,IAAkB,MAAA,CAAO,oBAAA;AAC3C,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,MAAM,WAAW,IAAA,CAAK,QAAA;AAAA,UACpB,MAAM,YAAA,CAAa,QAAA,EAAU,GAAG,CAAA;AAAA,UAChC,CAAA,EAAG,IAAI,IAAI,CAAA,qBAAA;AAAA,SACb;AACA,QAAA,IAAI,QAAA,IAAY,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG;AACnC,UAAA,KAAA,CAAM,IAAA,CAAK,GAAG,QAAQ,CAAA;AAAA,QACxB;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUQ,gBAAA,GAAwD;AAC9D,IAAA,MAAM,YAAiD,EAAC;AAExD,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,WAAA,EAAa;AAClC,MAAA,IAAI,GAAA,CAAI,SAAS,MAAA,EAAQ;AACzB,MAAA,MAAM,OAAA,GAAU,GAAA;AAChB,MAAA,MAAM,WAAA,GAAc,QAAQ,MAAA,CAAO,WAAA;AACnC,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,MAAM,WAAW,IAAA,CAAK,QAAA;AAAA,UACpB,MAAM,YAAA,CAAa,WAAA,EAAa,OAAO,CAAA;AAAA,UACvC,CAAA,EAAG,IAAI,IAAI,CAAA,YAAA;AAAA,SACb;AACA,QAAA,IAAI,QAAA,EAAU;AAEZ,UAAC,SAA4E,kBAAA,GAAqB;AAAA,YAChG,QAAQ,IAAA,CAAK,MAAA;AAAA,YACb,WAAW,EAAE,IAAA,EAAM,QAAQ,IAAA,EAAM,OAAA,EAAS,QAAQ,OAAA;AAAmC,WACvF;AACA,UAAA,SAAA,CAAU,GAAA,CAAI,IAAI,CAAA,GAAI,QAAA;AAAA,QACxB;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,SAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,cAAA,GAAuB;AACrB,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,MAAM,IAAI,MAAM,qCAAqC,CAAA;AAAA,IACvD;AAEA,IAAA,MAAM,EAAE,KAAA,EAAM,GAAI,IAAA,CAAK,OAAA,CAAQ,IAAA;AAE/B,IAAA,IAAI,CAAC,KAAA,CAAM,GAAA,CAAI,KAAK,CAAA,EAAG;AACrB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OAEF;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,KAAA,CAAM,GAAA,CAAI,MAAM,CAAA,EAAG;AACtB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OAEF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAA,GAAgB;AACd,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA;AAAA,IACF;AAGA,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,WAAA,EAAa;AAClC,MAAA,MAAM,SAAA,GAAa,IAAkB,MAAA,CAAO,SAAA;AAC5C,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,IAAA,CAAK,SAAS,MAAM;AAClB,UAAA,YAAA,CAAa,WAAW,GAAG,CAAA;AAAA,QAC7B,CAAA,EAAG,CAAA,EAAG,GAAA,CAAI,IAAI,CAAA,UAAA,CAAY,CAAA;AAAA,MAC5B;AAAA,IACF;AAMA,IAAA,IAAA,CAAK,cAAA,EAAe;AAEpB,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,QAAA,CAAY,IAAa,OAAA,EAAgC;AACvD,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,EAAA,EAAG;AAGlB,MAAA,IAAI,kBAAkB,OAAA,EAAS;AAC7B,QAAA,MAAA,CAAO,KAAA,CAAM,CAAC,KAAA,KAAmB;AAC/B,UAAA,MAAM,QAAA,GAAW,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AACzE,UAAA,IAAA,CAAK,OAAO,IAAA,GAAO,OAAA,EAAS,EAAE,KAAA,EAAO,QAAA,EAAU,SAAS,CAAA;AAAA,QAC1D,CAAC,CAAA;AAAA,MACH;AAEA,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,QAAA,GAAW,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AAGzE,MAAA,IAAA,CAAK,OAAO,IAAA,GAAO,OAAA,EAAS,EAAE,KAAA,EAAO,QAAA,EAAU,SAAS,CAAA;AAExD,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,kBAAA,GAA2B;AACzB,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,WAAA,EAAa;AAClC,MAAA,MAAM,IAAA,GAAQ,IAAkB,MAAA,CAAO,cAAA;AACvC,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,IAAA,CAAK,SAAS,MAAM;AAClB,UAAA,YAAA,CAAa,MAAM,GAAG,CAAA;AAAA,QACxB,CAAA,EAAG,CAAA,EAAG,GAAA,CAAI,IAAI,CAAA,eAAA,CAAiB,CAAA;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,GAAqB;AACnB,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,WAAA,EAAa;AAClC,MAAA,MAAM,IAAA,GAAQ,IAAkB,MAAA,CAAO,QAAA;AACvC,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,IAAA,CAAK,SAAS,MAAM;AAClB,UAAA,YAAA,CAAa,MAAM,GAAG,CAAA;AAAA,QACxB,CAAA,EAAG,CAAA,EAAG,GAAA,CAAI,IAAI,CAAA,SAAA,CAAW,CAAA;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,GAAqB;AACnB,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,WAAA,EAAa;AAClC,MAAA,MAAM,IAAA,GAAQ,IAAkB,MAAA,CAAO,QAAA;AACvC,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,IAAA,CAAK,SAAS,MAAM;AAClB,UAAA,YAAA,CAAa,MAAM,GAAG,CAAA;AAAA,QACxB,CAAA,EAAG,CAAA,EAAG,GAAA,CAAI,IAAI,CAAA,SAAA,CAAW,CAAA;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,qBAAA,GAA8B;AAC5B,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,WAAA,EAAa;AAClC,MAAA,MAAM,IAAA,GAAQ,IAAkB,MAAA,CAAO,iBAAA;AACvC,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,IAAA,CAAK,SAAS,MAAM;AAClB,UAAA,YAAA,CAAa,MAAM,GAAG,CAAA;AAAA,QACxB,CAAA,EAAG,CAAA,EAAG,GAAA,CAAI,IAAI,CAAA,kBAAA,CAAoB,CAAA;AAAA,MACpC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,kBAAkB,KAAA,EAA2C;AAC3D,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,WAAA,EAAa;AAClC,MAAA,MAAM,IAAA,GAAQ,IAAkB,MAAA,CAAO,aAAA;AACvC,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,IAAA,CAAK,SAAS,MAAM;AAClB,UAAA,IAAA,CAAK,IAAA,CAAK,KAAK,KAAK,CAAA;AAAA,QACtB,CAAA,EAAG,CAAA,EAAG,GAAA,CAAI,IAAI,CAAA,cAAA,CAAgB,CAAA;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY,KAAA,EAAoC;AAC9C,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,WAAA,EAAa;AAClC,MAAA,MAAM,IAAA,GAAQ,IAAkB,MAAA,CAAO,OAAA;AACvC,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,IAAA,CAAK,SAAS,MAAM;AAClB,UAAA,IAAA,CAAK,IAAA,CAAK,KAAK,KAAK,CAAA;AAAA,QACtB,CAAA,EAAG,CAAA,EAAG,GAAA,CAAI,IAAI,CAAA,QAAA,CAAU,CAAA;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW,KAAA,EAAoC;AAC7C,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,WAAA,EAAa;AAClC,MAAA,MAAM,IAAA,GAAQ,IAAkB,MAAA,CAAO,MAAA;AACvC,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,IAAA,CAAK,SAAS,MAAM;AAClB,UAAA,IAAA,CAAK,IAAA,CAAK,KAAK,KAAK,CAAA;AAAA,QACtB,CAAA,EAAG,CAAA,EAAG,GAAA,CAAI,IAAI,CAAA,OAAA,CAAS,CAAA;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AACF;AC37BA,SAAS,oBAAA,CACP,KACA,QAAA,EACe;AACf,EAAA,IAAI,QAAA,KAAa,IAAA,IAAQ,QAAA,KAAa,KAAA,EAAO;AAC3C,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,QAAA,KAAa,IAAA,IAAQ,QAAA,KAAa,KAAA,EAAO;AAC3C,IAAA,OAAO,GAAA,CAAI,QAAQ,IAAA,GAAO,CAAA;AAAA,EAC5B;AAEA,EAAA,IAAI,aAAa,OAAA,EAAS;AACxB,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,IAAI,aAAa,KAAA,EAAO;AACtB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,aAAa,QAAA,EAAU;AAChC,IAAA,OAAO,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,IAAI,QAAA,EAAU,GAAA,CAAI,OAAA,CAAQ,IAAI,CAAC,CAAA;AAAA,EACzD;AAEA,EAAA,OAAO,IAAA;AACT;AAYO,IAAM,KAAA,GACX,CAAC,QAAA,GAA0B,IAAA,KAC3B,CAAC,EAAE,MAAA,EAAQ,EAAA,EAAI,QAAA,EAAS,KAAM;AAC5B,EAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AAGpB,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAAC,IAAA,CAAK,GAAA,CAAI,WAAA,EAAa;AACzB,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,IAAA,CAAK,KAAA,EAAM;AAEX,EAAA,IAAI,aAAa,KAAA,EAAO;AACtB,IAAA,MAAM,SAAA,GAAY,IAAIC,kBAAA,CAAa,EAAA,CAAG,GAAG,CAAA;AACzC,IAAA,QAAA,CAAS,EAAA,CAAG,YAAA,CAAa,SAAS,CAAC,CAAA;AACnC,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,MAAM,WAAA,GAAc,oBAAA,CAAqB,EAAA,CAAG,GAAA,EAAK,QAAQ,CAAA;AAEzD,EAAA,IAAI,gBAAgB,IAAA,EAAM;AAGxB,IAAA,MAAM,IAAA,GAAO,EAAA,CAAG,GAAA,CAAI,OAAA,CAAQ,WAAW,CAAA;AACvC,IAAA,MAAM,SAAA,GAAYJ,mBAAAA,CAAc,IAAA,CAAK,IAAI,CAAA;AACzC,IAAA,QAAA,CAAS,EAAA,CAAG,YAAA,CAAa,SAAS,CAAC,CAAA;AAAA,EACrC,CAAA,MAAO;AACL,IAAA,QAAA,CAAS,EAAE,CAAA;AAAA,EACb;AAEA,EAAA,OAAO,IAAA;AACT;AAKK,IAAM,OACX,MACA,CAAC,EAAE,MAAA,EAAQ,UAAS,KAAM;AACxB,EAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AAEpB,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAA,CAAK,IAAI,IAAA,EAAK;AACd,EAAA,OAAO,IAAA;AACT;AAQK,IAAM,YACX,MACA,CAAC,EAAE,EAAA,EAAI,UAAS,KAAM;AACpB,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,EAAA,CAAG,YAAA,CAAa,IAAII,kBAAA,CAAa,EAAA,CAAG,GAAG,CAAC,CAAA;AACxC,EAAA,QAAA,CAAS,EAAE,CAAA;AACX,EAAA,OAAO,IAAA;AACT;AAOK,IAAM,qBACX,MACA,CAAC,EAAE,KAAA,EAAO,UAAS,KAAM;AACvB,EAAA,OAAOC,2BAAA,CAAqB,OAAO,QAAQ,CAAA;AAC7C;AAOK,IAAM,kBACX,MACA,CAAC,EAAE,EAAA,EAAI,UAAS,KAAM;AACpB,EAAA,MAAM,EAAE,KAAA,EAAO,IAAA,EAAM,EAAA,KAAO,EAAA,CAAG,SAAA;AAE/B,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,EAAA,CAAG,WAAA,CAAY,MAAM,EAAE,CAAA;AACvB,EAAA,QAAA,CAAS,EAAE,CAAA;AACX,EAAA,OAAO,IAAA;AACT;ACvIF,SAAS,cAAc,OAAA,EAA0C;AAC/D,EAAA,OACE,OAAO,YAAY,QAAA,IACnB,OAAA,KAAY,QACZ,MAAA,IAAU,OAAA,IACV,OAAQ,OAAA,CAAwB,IAAA,KAAS,QAAA;AAE7C;AASA,SAAS,cAAc,OAAA,EAAqC;AAC1D,EAAA,OAAO,OAAO,OAAA,KAAY,QAAA,IAAY,QAAQ,IAAA,EAAK,CAAE,WAAW,GAAG,CAAA;AACrE;AAKA,SAAS,oBAAoB,MAAA,EAAwB;AACnD,EAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,KAAA,CAAM,WAAW,CAAA;AAE9C,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,OAAO,MAAA,CAAO,KAAK,KAAA,EAAO,IAAA,EAAM,CAAC,aAAA,CAAc,MAAA,EAAQ,CAAC,CAAA;AAAA,EAC1D;AAIA,EAAA,KAAA,MAAW,CAAC,MAAM,QAAQ,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,CAAO,KAAK,CAAA,EAAG;AAC3D,IAAA,IAAI,IAAA,KAAS,KAAA,IAAS,IAAA,KAAS,MAAA,IAAU,SAAS,OAAA,EAAS;AACzD,MAAA,OAAO,MAAA,CAAO,KAAK,KAAA,EAAO,IAAA,EAAM,CAAC,QAAA,CAAS,MAAA,EAAQ,CAAC,CAAA;AAAA,IACrD;AAAA,EACF;AAGA,EAAA,OAAO,MAAA,CAAO,IAAA,CAAK,KAAA,EAAO,IAAA,EAAM,EAAE,CAAA;AACpC;AAKA,SAAS,gBAAA,CACP,IAAA,EACA,MAAA,EACA,OAAA,EACQ;AAER,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC5C,EAAA,OAAA,CAAQ,SAAA,GAAY,IAAA;AAEpB,EAAA,MAAM,MAAA,GAASC,eAAA,CAAU,UAAA,CAAW,MAAM,CAAA;AAC1C,EAAA,OAAO,MAAA,CAAO,KAAA,CAAM,OAAA,EAAS,OAAA,EAAS,YAAY,CAAA;AACpD;AA8BO,SAAS,cAAA,CACd,OAAA,EACA,MAAA,EACA,OAAA,EACQ;AAER,EAAA,IAAI,OAAA,KAAY,IAAA,IAAQ,OAAA,KAAY,MAAA,IAAa,YAAY,EAAA,EAAI;AAC/D,IAAA,OAAO,oBAAoB,MAAM,CAAA;AAAA,EACnC;AAGA,EAAA,IAAI,aAAA,CAAc,OAAO,CAAA,EAAG;AAC1B,IAAA,OAAOC,UAAA,CAAO,QAAA,CAAS,MAAA,EAAQ,OAAO,CAAA;AAAA,EACxC;AAGA,EAAA,IAAI,aAAA,CAAc,OAAO,CAAA,EAAG;AAC1B,IAAA,OAAO,gBAAA,CAAiB,OAAA,EAAS,MAAA,EAAQ,OAAO,CAAA;AAAA,EAClD;AAGA,EAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KAEF;AAAA,EACF;AAGA,EAAA,MAAM,IAAI,KAAA;AAAA,IACR,CAAA,sFAAA,EACS,OAAO,OAAO,CAAA;AAAA,GACzB;AACF;;;ACnGO,SAAS,WAAA,CACd,IAAA,EACA,OAAA,GAA8B,EAAC,EACtB;AACT,EAAA,MAAM,EAAE,aAAA,GAAgB,IAAA,EAAM,gBAAA,GAAmB,MAAK,GAAI,OAAA;AAG1D,EAAA,IAAI,KAAK,MAAA,EAAQ;AAEf,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,OAAO,CAAC,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,KAAK,MAAA,KAAW,CAAA;AAAA,IAC5C;AAGA,IAAA,IAAI,gBAAA,IAAoB,IAAA,CAAK,IAAA,CAAK,IAAA,KAAS,WAAA,EAAa;AACtD,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,IAAI,IAAA,CAAK,eAAe,CAAA,EAAG;AACzB,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,CAAC,aAAA,EAAe;AAClB,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,YAAY,CAAA,EAAA,EAAK;AACxC,IAAA,IAAI,CAAC,WAAA,CAAY,IAAA,CAAK,MAAM,CAAC,CAAA,EAAG,OAAO,CAAA,EAAG;AACxC,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAWO,SAAS,gBAAgB,GAAA,EAAsB;AACpD,EAAA,OAAO,YAAY,GAAA,EAAK;AAAA,IACtB,aAAA,EAAe,IAAA;AAAA,IACf,gBAAA,EAAkB;AAAA,GACnB,CAAA;AACH;AChCO,SAAS,cAAc,OAAA,EAA0C;AACtE,EAAA,MAAM,EAAE,IAAA,EAAAC,KAAAA,EAAM,IAAA,EAAM,aAAA,EAAe,UAAS,GAAI,OAAA;AAEhD,EAAA,OAAO,IAAIC,oBAAA;AAAA,IACTD,KAAAA;AAAA,IACA,CAAC,KAAA,EAAoB,KAAA,EAAyB,KAAA,EAAe,GAAA,KAAgB;AAC3E,MAAA,MAAM,UAAA,GAAa,aAAA,GAAgB,aAAA,CAAc,KAAK,CAAA,GAAI,IAAA;AAG1D,MAAA,IAAI,aAAA,IAAiB,eAAe,IAAA,EAAM;AACxC,QAAA,OAAO,IAAA;AAAA,MACT;AAIA,MAAA,MAAM,WAAA,GAAc,MAAM,CAAC,CAAA;AAC3B,MAAA,IAAI,CAAC,WAAA,EAAa;AAChB,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,MAAM,EAAE,IAAG,GAAI,KAAA;AAGf,MAAA,EAAA,CAAG,YAAY,KAAA,EAAO,GAAA,EAAK,MAAM,MAAA,CAAO,IAAA,CAAK,WAAW,CAAC,CAAA;AAGzD,MAAA,EAAA,CAAG,OAAA,CAAQ,OAAO,KAAA,GAAQ,WAAA,CAAY,QAAQ,IAAA,CAAK,MAAA,CAAO,UAAA,IAAc,MAAS,CAAC,CAAA;AAGlF,MAAA,EAAA,CAAG,iBAAiB,IAAI,CAAA;AAExB,MAAA,OAAO,EAAA;AAAA,IACT,CAAA;AAAA,IACA,QAAA,KAAa,MAAA,GAAY,EAAE,QAAA,KAAa;AAAC,GAC3C;AACF;AAKO,IAAM,qBAAA,GAAwB;AAAA;AAAA;AAAA;AAAA;AAAA,EAKnC,IAAA,EAAM,iCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMN,MAAA,EAAQ,sBAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMR,IAAA,EAAM,oBAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMN,SAAA,EAAW;AACb;ACjEO,SAAS,kBAAkB,OAAA,EAA8C;AAC9E,EAAA,MAAM,EAAE,MAAAA,KAAAA,EAAM,IAAA,EAAM,gBAAgB,IAAA,EAAM,aAAA,EAAe,QAAA,EAAU,KAAA,EAAM,GAAI,OAAA;AAE7E,EAAA,OAAO,IAAIC,oBAAAA;AAAA,IACTD,KAAAA;AAAA,IACA,CAAC,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,GAAA,KAAQ;AAC5B,MAAA,IAAI,KAAA,IAAS,CAAC,KAAA,CAAM,KAAK,GAAG,OAAO,IAAA;AACnC,MAAA,MAAM,KAAA,GAAQ,aAAA,YAAyB,QAAA,GAAW,aAAA,CAAc,KAAK,CAAA,GAAI,aAAA;AACzE,MAAA,MAAM,EAAA,GAAK,KAAA,CAAM,EAAA,CAAG,MAAA,CAAO,OAAO,GAAG,CAAA;AACrC,MAAA,MAAM,MAAA,GAAS,EAAA,CAAG,GAAA,CAAI,OAAA,CAAQ,KAAK,CAAA;AACnC,MAAA,MAAM,KAAA,GAAQ,OAAO,UAAA,EAAW;AAChC,MAAA,MAAM,QAAA,GAAW,KAAA,IAASE,sBAAA,CAAa,KAAA,EAAO,MAAM,KAAK,CAAA;AACzD,MAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AACtB,MAAA,EAAA,CAAG,IAAA,CAAK,OAAO,QAAQ,CAAA;AACvB,MAAA,MAAM,SAAS,EAAA,CAAG,GAAA,CAAI,OAAA,CAAQ,KAAA,GAAQ,CAAC,CAAA,CAAE,UAAA;AACzC,MAAA,IAAI,MAAA,EAAQ,IAAA,KAAS,IAAA,IAAQC,iBAAA,CAAQ,GAAG,GAAA,EAAK,KAAA,GAAQ,CAAC,CAAA,KACjD,CAAC,aAAA,IAAiB,aAAA,CAAc,KAAA,EAAO,MAAM,CAAA,CAAA,EAAI;AACpD,QAAA,EAAA,CAAG,IAAA,CAAK,QAAQ,CAAC,CAAA;AAAA,MACnB;AACA,MAAA,OAAO,EAAA;AAAA,IACT,CAAA;AAAA,IACA,QAAA,KAAa,MAAA,GAAY,EAAE,QAAA,KAAa;AAAC,GAC3C;AACF;AAOO,SAAS,cAAc,KAAA,EAA6B;AACzD,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,KAAA,CAAM,SAAA;AACxB,EAAA,KAAA,IAAS,CAAA,GAAI,KAAA,CAAM,KAAA,EAAO,CAAA,GAAI,GAAG,CAAA,EAAA,EAAK;AACpC,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,CAAC,EAAE,IAAA,CAAK,IAAA;AAChC,IAAA,IAAI,IAAA,KAAS,UAAA,IAAc,IAAA,KAAS,UAAA,EAAY,OAAO,KAAA;AAAA,EACzD;AACA,EAAA,OAAO,IAAA;AACT;AC3DO,SAAS,uBAAuB,OAAA,EAAmD;AACxF,EAAA,MAAM,EAAE,IAAA,EAAAH,KAAAA,EAAM,MAAM,aAAA,GAAgB,IAAA,EAAM,UAAS,GAAI,OAAA;AAEvD,EAAA,OAAO,IAAIC,oBAAAA;AAAA,IACTD,KAAAA;AAAA,IACA,CAAC,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,GAAA,KAAQ;AAC5B,MAAA,MAAM,MAAA,GAAS,KAAA,CAAM,GAAA,CAAI,OAAA,CAAQ,KAAK,CAAA;AACtC,MAAA,MAAM,KAAA,GAAQ,aAAA,YAAyB,QAAA,GAAW,aAAA,CAAc,KAAK,CAAA,GAAI,aAAA;AACzE,MAAA,IAAI,CAAC,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA,CAAE,eAAe,MAAA,CAAO,KAAA,CAAM,EAAE,CAAA,EAAG,OAAO,UAAA,CAAW,EAAE,CAAA,EAAG,IAAI,GAAG,OAAO,IAAA;AAC3F,MAAA,OAAO,KAAA,CAAM,EAAA,CACV,MAAA,CAAO,KAAA,EAAO,GAAG,EACjB,YAAA,CAAa,KAAA,EAAO,KAAA,EAAO,IAAA,EAAM,KAAK,CAAA;AAAA,IAC3C,CAAA;AAAA,IACA,QAAA,KAAa,MAAA,GAAY,EAAE,QAAA,KAAa;AAAC,GAC3C;AACF;ACvBO,SAAS,cAAc,OAAA,EAA0C;AACtE,EAAA,MAAM,EAAE,IAAA,EAAAA,KAAAA,EAAM,OAAA,EAAS,UAAS,GAAI,OAAA;AAEpC,EAAA,OAAO,IAAIC,oBAAAA;AAAA,IACTD,KAAAA;AAAA,IACA,CAAC,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,QAAQ,KAAA,CAAM,EAAA,CAAG,WAAA,CAAY,KAAA,EAAO,GAAA,EAAK,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,OAAO,CAAC,CAAA;AAAA,IAC1F,QAAA,KAAa,MAAA,GAAY,EAAE,QAAA,KAAa;AAAC,GAC3C;AACF;ACAO,SAAS,cAAc,OAAA,EAA0C;AACtE,EAAA,MAAM,EAAE,IAAA,EAAAA,KAAAA,EAAM,MAAM,aAAA,GAAgB,IAAA,EAAM,UAAS,GAAI,OAAA;AAEvD,EAAA,OAAO,IAAIC,oBAAAA;AAAA,IACTD,KAAAA;AAAA,IACA,CAAC,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,GAAA,KAAQ;AAC5B,MAAA,MAAM,QAAQ,aAAA,YAAyB,QAAA,GAAW,aAAA,CAAc,KAAA,EAAO,KAAK,CAAA,GAAI,aAAA;AAChF,MAAA,IAAI,aAAA,YAAyB,QAAA,IAAY,KAAA,KAAU,IAAA,EAAM,OAAO,IAAA;AAChE,MAAA,OAAO,KAAA,CAAM,GAAG,WAAA,CAAY,KAAA,EAAO,KAAK,IAAA,CAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,IAC5D,CAAA;AAAA,IACA,QAAA,KAAa,MAAA,GAAY,EAAE,QAAA,KAAa;AAAC,GAC3C;AACF;;;ACzBO,SAAS,UAAA,CACd,GAAA,EACA,OAAA,GAA6B,EAAC,EACrB;AACT,EAAA,MAAM,EAAE,SAAA,GAAY,CAAC,OAAA,EAAS,QAAQ,GAAE,GAAI,OAAA;AAE5C,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,GAAG,CAAA;AAC1B,IAAA,OAAO,SAAA,CAAU,QAAA,CAAS,MAAA,CAAO,QAAQ,CAAA;AAAA,EAC3C,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;ACjBA,SAAS,0BAA0B,UAAA,EAAoC;AAErE,EAAA,MAAM,UAAA,GAAa;AAAA,IACjB,KAAA,EAAO,IAAA;AAAA,IACP,IAAA,EAAM,IAAA;AAAA,IACN,MAAA,EAAQ,IAAA;AAAA,IACR,UAAU;AAAC,GACb;AAEA,EAAA,MAAM,UAAU,IAAI,gBAAA;AAAA,IAClB,EAAE,UAAA,EAAW;AAAA,IACb;AAAA,GACF;AACA,EAAA,OAAO,OAAA,CAAQ,MAAA;AACjB;AAMA,SAAS,WAAA,GAAwB;AAE/B,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,IAAA,OAAO,MAAA,CAAO,QAAA;AAAA,EAChB;AAGA,EAAA,IAAI;AAEF,IAAA,MAAM,QAAA,GAAW,UAAQ,UAAU,CAAA;AACnC,IAAA,MAAM,EAAE,QAAA,EAAAI,SAAAA,EAAS,GAAI,QAAA,CAAS,UAAU,2CAA2C,CAAA;AACnF,IAAA,OAAOA,SAAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AACF;AA2BO,SAAS,YAAA,CACd,OAAA,EACA,UAAA,EACA,OAAA,GAA+B,EAAC,EACxB;AACR,EAAA,MAAM,MAAA,GAAS,0BAA0B,UAAU,CAAA;AACnD,EAAA,MAAM,GAAA,GAAML,UAAAA,CAAO,QAAA,CAAS,MAAA,EAAQ,OAAO,CAAA;AAC3C,EAAA,MAAM,cAAA,GAAiB,OAAA,CAAQ,QAAA,IAAY,WAAA,EAAY;AAEvD,EAAA,MAAM,UAAA,GAAaM,mBAAA,CAAc,UAAA,CAAW,MAAM,CAAA;AAClD,EAAA,MAAM,QAAA,GAAW,UAAA,CAAW,iBAAA,CAAkB,GAAA,CAAI,OAAA,EAAS;AAAA,IACzD,QAAA,EAAU;AAAA,GACX,CAAA;AAED,EAAA,MAAM,SAAA,GAAY,cAAA,CAAe,aAAA,CAAc,KAAK,CAAA;AACpD,EAAA,SAAA,CAAU,YAAY,QAAQ,CAAA;AAE9B,EAAA,OAAO,SAAA,CAAU,SAAA;AACnB;AA2BO,SAAS,YAAA,CACd,IAAA,EACA,UAAA,EACA,OAAA,GAA+B,EAAC,EACnB;AACb,EAAA,MAAM,MAAA,GAAS,0BAA0B,UAAU,CAAA;AACnD,EAAA,MAAM,cAAA,GAAiB,OAAA,CAAQ,QAAA,IAAY,WAAA,EAAY;AAGvD,EAAA,MAAM,SAAA,GAAY,cAAA,CAAe,aAAA,CAAc,KAAK,CAAA;AACpD,EAAA,SAAA,CAAU,SAAA,GAAY,IAAA;AAGtB,EAAA,MAAM,MAAA,GAASC,eAAA,CAAY,UAAA,CAAW,MAAM,CAAA;AAC5C,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,KAAA,CAAM,SAAS,CAAA;AAElC,EAAA,OAAO,IAAI,MAAA,EAAO;AACpB;AA8BO,SAAS,YAAA,CACd,OAAA,EACA,UAAA,EACA,OAAA,GAA+B,EAAC,EACxB;AACR,EAAA,MAAM,EAAE,cAAA,GAAiB,MAAA,EAAO,GAAI,OAAA;AACpC,EAAA,MAAM,MAAA,GAAS,0BAA0B,UAAU,CAAA;AACnD,EAAA,MAAM,GAAA,GAAMP,UAAAA,CAAO,QAAA,CAAS,MAAA,EAAQ,OAAO,CAAA;AAE3C,EAAA,OAAO,IAAI,WAAA,CAAY,CAAA,EAAG,GAAA,CAAI,OAAA,CAAQ,MAAM,cAAc,CAAA;AAC5D;;;AC/KO,SAAS,YAAA,CACd,MACA,IAAA,EACuB;AACvB,EAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AAGpB,EAAA,IAAI,KAAA,GAAQ,MAAA,CAAO,UAAA,CAAW,IAAA,CAAK,YAAY,CAAA;AAE/C,EAAA,IAAI,CAAC,MAAM,IAAA,IAAQ,CAAC,KAAK,OAAA,CAAQ,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA,EAAG;AAClD,IAAA,KAAA,GAAQ,MAAA,CAAO,WAAA,CAAY,IAAA,CAAK,YAAY,CAAA;AAAA,EAC9C;AAEA,EAAA,IAAI,CAAC,MAAM,IAAA,IAAQ,CAAC,KAAK,OAAA,CAAQ,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA,EAAG;AAClD,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,IAAI,aAAa,KAAA,CAAM,KAAA;AACvB,EAAA,IAAI,QAAA,GAAW,IAAA,CAAK,KAAA,EAAM,GAAI,KAAA,CAAM,MAAA;AACpC,EAAA,IAAI,WAAW,UAAA,GAAa,CAAA;AAC5B,EAAA,IAAI,MAAA,GAAS,QAAA,GAAW,KAAA,CAAM,IAAA,CAAK,QAAA;AAGnC,EAAA,OAAO,UAAA,GAAa,CAAA,IAAK,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,MAAM,UAAA,GAAa,CAAC,CAAA,CAAE,KAAK,CAAA,EAAG;AACzE,IAAA,UAAA,IAAc,CAAA;AACd,IAAA,QAAA,IAAY,MAAA,CAAO,KAAA,CAAM,UAAU,CAAA,CAAE,QAAA;AAAA,EACvC;AAGA,EAAA,OAAO,QAAA,GAAW,MAAA,CAAO,UAAA,IAAc,IAAA,CAAK,OAAA,CAAQ,OAAO,KAAA,CAAM,QAAQ,CAAA,CAAE,KAAK,CAAA,EAAG;AACjF,IAAA,MAAA,IAAU,MAAA,CAAO,KAAA,CAAM,QAAQ,CAAA,CAAE,QAAA;AACjC,IAAA,QAAA,IAAY,CAAA;AAAA,EACd;AAEA,EAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,EAAA,EAAI,MAAA,EAAO;AACtC;;;AC/BO,IAAM,cAAA,GACX,CAAC,SAAA,KACD,CAAC,SAAA,KAA2D;AAC1D,EAAA,MAAM,EAAE,OAAM,GAAI,SAAA;AAElB,EAAA,KAAA,IAAS,KAAA,GAAQ,KAAA,CAAM,KAAA,EAAO,KAAA,GAAQ,GAAG,KAAA,EAAA,EAAS;AAChD,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA;AAE7B,IAAA,IAAI,SAAA,CAAU,IAAI,CAAA,EAAG;AACnB,MAAA,OAAO;AAAA,QACL,GAAA,EAAK,KAAA,CAAM,MAAA,CAAO,KAAK,CAAA;AAAA,QACvB,KAAA,EAAO,KAAA,CAAM,KAAA,CAAM,KAAK,CAAA;AAAA,QACxB,KAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;;;AC3BK,IAAM,YAAA,GAAe,CAC1B,IAAA,EACA,SAAA,KACsB;AACtB,EAAA,MAAM,SAA4B,EAAC;AAEnC,EAAA,IAAA,CAAK,OAAA,CAAQ,CAAC,KAAA,EAAOQ,OAAAA,KAAW;AAC9B,IAAA,IAAI,SAAA,CAAU,KAAK,CAAA,EAAG;AACpB,MAAA,MAAA,CAAO,KAAK,EAAE,IAAA,EAAM,KAAA,EAAO,GAAA,EAAKA,SAAQ,CAAA;AAAA,IAC1C;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO,MAAA;AACT;;;ACZO,IAAM,cAAA,GAAiB,CAAC,KAAA,KAAyC;AACtE,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,WAAW,CAAA,EAAA,EAAK;AACxC,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,KAAA,CAAM,KAAK,CAAC,CAAA;AAE7B,IAAA,IAAI,IAAA,CAAK,WAAA,IAAe,CAAC,IAAA,CAAK,kBAAiB,EAAG;AAChD,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;;;ACkBO,IAAM,UAAA,GACX,CAAC,OAAA,EAAkB,OAAA,GAA6B,EAAC,KACjD,CAAC,EAAE,KAAA,EAAO,EAAA,EAAI,QAAA,EAAS,KAAM;AAC3B,EAAA,MAAM,EAAE,UAAA,GAAa,IAAA,EAAM,YAAA,EAAa,GAAI,OAAA;AAC5C,EAAA,MAAM,EAAE,QAAO,GAAI,KAAA;AAGnB,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI;AACF,IAAA,GAAA,GAAM,cAAA,CAAe,OAAA,EAAS,MAAA,EAAQ,EAAE,cAAc,CAAA;AAAA,EACxD,CAAA,CAAA,MAAQ;AAEN,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,IAAA;AAAA,EACT;AAIA,EAAA,EAAA,CAAG,YAAY,CAAA,EAAG,EAAA,CAAG,IAAI,OAAA,CAAQ,IAAA,EAAM,IAAI,OAAO,CAAA;AAGlD,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,EAAA,CAAG,OAAA,CAAQ,gBAAgB,KAAK,CAAA;AAChC,IAAA,EAAA,CAAG,OAAA,CAAQ,cAAc,IAAI,CAAA;AAAA,EAC/B;AAEA,EAAA,QAAA,CAAS,EAAE,CAAA;AACX,EAAA,OAAO,IAAA;AACT;AAOK,IAAM,YAAA,GACX,CAAC,OAAA,GAA+B,EAAC,KACjC,CAAC,EAAE,KAAA,EAAO,EAAA,EAAI,QAAA,EAAS,KAAM;AAC3B,EAAA,MAAM,EAAE,UAAA,GAAa,IAAA,EAAK,GAAI,OAAA;AAC9B,EAAA,MAAM,EAAE,QAAO,GAAI,KAAA;AAGnB,EAAA,MAAM,GAAA,GAAM,cAAA,CAAe,IAAA,EAAM,MAAM,CAAA;AAGvC,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,IAAA;AAAA,EACT;AAIA,EAAA,EAAA,CAAG,YAAY,CAAA,EAAG,EAAA,CAAG,IAAI,OAAA,CAAQ,IAAA,EAAM,IAAI,OAAO,CAAA;AAElD,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,EAAA,CAAG,OAAA,CAAQ,gBAAgB,KAAK,CAAA;AAChC,IAAA,EAAA,CAAG,OAAA,CAAQ,cAAc,IAAI,CAAA;AAAA,EAC/B;AAEA,EAAA,QAAA,CAAS,EAAE,CAAA;AACX,EAAA,OAAO,IAAA;AACT;AAOK,IAAM,aACX,CAAC,IAAA,KACD,CAAC,EAAE,EAAA,EAAI,UAAS,KAAM;AAEpB,EAAA,MAAM,EAAE,IAAA,EAAM,EAAA,EAAG,GAAI,EAAA,CAAG,SAAA;AAIxB,EAAA,IAAI,EAAA,CAAG,qBAAqBf,mBAAAA,EAAe;AACzC,IAAA,MAAM,EAAE,KAAA,EAAM,GAAI,EAAA,CAAG,SAAA;AACrB,IAAA,IAAI,CAAC,KAAA,CAAM,MAAA,CAAO,aAAA,EAAe;AAC/B,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,EAAA,CAAG,UAAA,CAAW,IAAA,EAAM,IAAA,EAAM,EAAE,CAAA;AAC5B,EAAA,QAAA,CAAS,EAAE,CAAA;AACX,EAAA,OAAO,IAAA;AACT;AAOK,IAAM,aAAA,GACX,CAAC,OAAA,KACD,CAAC,EAAE,KAAA,EAAO,EAAA,EAAI,UAAS,KAAM;AAC3B,EAAA,MAAM,EAAE,QAAO,GAAI,KAAA;AACnB,EAAA,MAAM,EAAE,IAAA,EAAM,EAAA,EAAG,GAAI,EAAA,CAAG,SAAA;AAGxB,EAAA,IAAI,QAAA;AAEJ,EAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAE/B,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,MAAM,MAAA,GAASgB,eAAA,CAAqB,UAAA,CAAW,MAAM,CAAA;AACrD,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC5C,IAAA,OAAA,CAAQ,SAAA,GAAY,OAAA;AACpB,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA;AACnC,IAAA,QAAA,GAAW,MAAA,CAAO,OAAA;AAAA,EACpB,CAAA,MAAA,IAAW,OAAA,IAAW,OAAO,OAAA,KAAY,QAAA,EAAU;AAEjD,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AAE1B,MAAA,MAAM,QAAQ,OAAA,CAAQ,GAAA,CAAI,UAAQ,MAAA,CAAO,YAAA,CAAa,IAAI,CAAC,CAAA;AAC3D,MAAA,QAAA,GAAWC,cAAA,CAAS,KAAK,KAAK,CAAA;AAAA,IAChC,CAAA,MAAA,IAAW,UAAU,OAAA,EAAS;AAE5B,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,YAAA,CAAa,OAAO,CAAA;AAExC,MAAA,QAAA,GAAW,IAAA,CAAK,KAAK,IAAA,KAAS,KAAA,GAAQ,KAAK,OAAA,GAAUA,cAAA,CAAS,KAAK,IAAI,CAAA;AAAA,IACzE,CAAA,MAAO;AACL,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF,CAAA,MAAO;AACL,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,EAAA,CAAG,YAAA,CAAa,MAAM,EAAA,EAAI,IAAIC,YAAM,QAAA,EAAU,CAAA,EAAG,CAAC,CAAC,CAAA;AACnD,EAAA,QAAA,CAAS,EAAE,CAAA;AACX,EAAA,OAAO,IAAA;AACT;;;AC7IK,SAAS,4BAAA,CACd,cACA,cAAA,EACQ;AACR,EAAA,MAAM,MAAA,GAAS,YAAA;AACf,EAAA,MAAM,MAAA,GAAkC,EAAE,GAAG,MAAA,EAAO;AAEpD,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,cAAc,CAAA,EAAG;AACzD,IAAA,IAAI,OAAO,KAAA,KAAU,UAAA,IAAc,OAAO,MAAA,CAAO,GAAG,MAAM,UAAA,EAAY;AACpE,MAAA,MAAM,QAAA,GAAW,OAAO,GAAG,CAAA;AAC3B,MAAA,MAAM,OAAA,GAAU,KAAA;AAEhB,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,SAAA,GAA8B,IAAA,EAAiB;AAC3D,QAAA,MAAM,iBAAiB,IAAA,CAAK,MAAA;AAC5B,QAAA,IAAA,CAAK,SAAS,CAAA,GAAI,KAAA,KAAqB,SAAS,IAAA,CAAK,IAAA,EAAM,GAAG,KAAK,CAAA;AACnE,QAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,IAAA,CAAK,IAAA,EAAM,GAAG,IAAI,CAAA;AACzC,QAAA,IAAA,CAAK,MAAA,GAAS,cAAA;AACd,QAAA,OAAO,MAAA;AAAA,MACT,CAAA;AAAA,IACF,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,KAAA;AAAA,IAChB;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAmBO,IAAM,SAAA,GAAN,MAAM,UAAA,CAAgD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMlD,IAAA,GAAsC,WAAA;AAAA;AAAA;AAAA;AAAA,EAKtC,IAAA;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMT,OAAA;AAAA;AAAA;AAAA;AAAA,EAKS,MAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMT,MAAA,GAA0C,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO1C,MAAA;AAAA;AAAA;AAAA;AAAA,EAKU,YAAY,MAAA,EAA2C;AAE/D,IAAA,IAAI,CAAC,qBAAA,CAAsB,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA,EAAG;AAC5C,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,gBAAA,EAAmB,OAAO,IAAI,CAAA,6FAAA;AAAA,OAEhC;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,OAAO,MAAA,CAAO,IAAA;AAInB,IAAA,MAAM,cAAA,GAAiB,YAAA,CAAa,MAAA,CAAO,UAAA,EAAY,IAAI,CAAA;AAC3D,IAAA,IAAA,CAAK,OAAA,GAAW,kBAAkB,EAAC;AAInC,IAAA,MAAM,cAAA,GAAiB,YAAA,CAAa,MAAA,CAAO,UAAA,EAAY,IAAI,CAAA;AAC3D,IAAA,IAAA,CAAK,OAAA,GAAW,kBAAkB,EAAC;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,OAAO,OACL,MAAA,EACiB;AACjB,IAAA,OAAO,IAAI,WAAU,MAAM,CAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuBA,UAAU,OAAA,EAAwD;AAEhE,IAAA,MAAM,SAAA,GAA+C;AAAA,MACnD,GAAG,IAAA,CAAK,MAAA;AAAA;AAAA,MAER,YAAY,OAAO;AAAA,QACjB,GAAG,IAAA,CAAK,OAAA;AAAA,QACR,GAAG;AAAA,OACL;AAAA,KACF;AAEA,IAAA,OAAO,IAAI,WAAU,SAAS,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiCA,OACE,cAAA,EAE6C;AAC7C,IAAA,MAAM,SAAA,GAAY,4BAAA,CAA6B,IAAA,CAAK,MAAA,EAAQ,cAAc,CAAA;AAE1E,IAAA,OAAO,IAAI,WAAU,SAA8D,CAAA;AAAA,EACrF;AACF;;;AC/OO,SAAS,sBACd,cAAA,EACuC;AACvC,EAAA,MAAM,QAA+C,EAAC;AAEtD,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,QAAQ,KAAK,MAAA,CAAO,OAAA,CAAQ,cAAc,CAAA,EAAG;AAC7D,IAAA,MAAM,IAAA,GAAgC;AAAA,MACpC,SAAS,QAAA,CAAS;AAAA,KACpB;AAEA,IAAA,IAAI,SAAS,QAAA,EAAU;AACrB,MAAA,IAAA,CAAK,UAAU,IAAI,QAAA,CAAS,QAAA;AAAA,IAC9B;AACA,IAAA,KAAA,CAAM,IAAI,CAAA,GAAI,IAAA;AAAA,EAChB;AAEA,EAAA,OAAO,KAAA;AACT;AAYO,SAAS,mBAAA,CACd,OACA,SAAA,EACyB;AACzB,EAAA,MAAM,YAAqC,EAAC;AAE5C,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,QAAQ,KAAK,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA,EAAG;AAExD,IAAA,IAAI,QAAA,CAAS,aAAa,KAAA,EAAO;AAGjC,IAAA,IAAI,SAAS,UAAA,EAAY;AACvB,MAAA,MAAM,QAAA,GAAW,QAAA,CAAS,UAAA,CAAW,KAAK,CAAA;AAC1C,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,MAAA,CAAO,MAAA,CAAO,WAAW,QAAQ,CAAA;AAAA,MACnC;AAAA,IACF,CAAA,MAAA,IAAW,MAAM,IAAI,CAAA,KAAM,UAAa,KAAA,CAAM,IAAI,MAAM,IAAA,EAAM;AAE5D,MAAA,SAAA,CAAU,IAAI,CAAA,GAAI,KAAA,CAAM,IAAI,CAAA;AAAA,IAC9B;AAAA,EACF;AAEA,EAAA,OAAO,SAAA;AACT;;;ACjBO,IAAM,IAAA,GAAN,MAAM,KAAA,SAAmD,SAAA,CAG9D;AAAA;AAAA;AAAA;AAAA;AAAA,EAKkB,IAAA,GAAO,MAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYhB,MAAA,GAAqC,IAAA;AAAA;AAAA;AAAA;AAAA,EAKpC,YAAY,MAAA,EAAsC;AAC1D,IAAA,KAAA,CAAM,MAAM,CAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,YAAA,GAAwB;AAC1B,IAAA,OAAO,IAAA,CAAK,OAAO,YAAA,KAAiB,KAAA;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,IAAI,QAAA,GAA4B;AAC9B,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAO,KAAK,MAAA,CAAO,MAAA,CAAO,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,IAAK,IAAA;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,eAAA,GAA4B;AAC9B,IAAA,MAAM,OAAO,IAAA,CAAK,QAAA;AAClB,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,MAAA,EAAS,KAAK,IAAI,CAAA,gFAAA;AAAA,OAEpB;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,OAAgB,OACd,MAAA,EACY;AACZ,IAAA,OAAO,IAAI,MAAK,MAAM,CAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUS,UAAU,OAAA,EAAgF;AACjG,IAAA,MAAM,EAAE,YAAA,EAAc,GAAG,WAAA,EAAY,GAAI,OAAA;AACzC,IAAA,MAAM,SAAA,GAA0C;AAAA,MAC9C,GAAG,IAAA,CAAK,MAAA;AAAA,MACR,GAAI,YAAA,KAAiB,MAAA,GAAY,EAAE,YAAA,KAAiB,EAAC;AAAA,MACrD,YAAY,OAAO;AAAA,QACjB,GAAG,IAAA,CAAK,OAAA;AAAA,QACR,GAAG;AAAA,OACL;AAAA,KACF;AAEA,IAAA,OAAO,IAAI,MAAK,SAAS,CAAA;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA8BS,OACP,cAAA,EAEwC;AACxC,IAAA,MAAM,SAAA,GAAY,4BAAA,CAA6B,IAAA,CAAK,MAAA,EAAQ,cAAc,CAAA;AAE1E,IAAA,OAAO,IAAI,MAAK,SAAyD,CAAA;AAAA,EAC3E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,cAAA,GAA2B;AACzB,IAAA,MAAM,OAAiB,EAAC;AAGxB,IAAA,IAAI,IAAA,CAAK,OAAO,SAAA,KAAc,MAAA;AAC5B,MAAA,IAAA,CAAK,SAAA,GAAY,YAAA,CAAa,IAAA,CAAK,MAAA,CAAO,WAAW,IAAI,CAAA;AAC3D,IAAA,IAAI,IAAA,CAAK,OAAO,QAAA,KAAa,MAAA;AAC3B,MAAA,IAAA,CAAK,QAAA,GAAW,KAAK,MAAA,CAAO,QAAA;AAC9B,IAAA,IAAI,KAAK,MAAA,CAAO,KAAA,KAAU,QAAW,IAAA,CAAK,KAAA,GAAQ,KAAK,MAAA,CAAO,KAAA;AAC9D,IAAA,IAAI,IAAA,CAAK,OAAO,QAAA,KAAa,MAAA;AAC3B,MAAA,IAAA,CAAK,QAAA,GAAW,KAAK,MAAA,CAAO,QAAA;AAG9B,IAAA,MAAM,cAAA,GAAiB,YAAA,CAAa,IAAA,CAAK,MAAA,CAAO,eAAe,IAAI,CAAA;AACnE,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,IAAA,CAAK,KAAA,GAAQ,sBAAsB,cAAc,CAAA;AAAA,IACnD;AAGA,IAAA,MAAM,UAAA,GAAa,YAAA,CAAa,IAAA,CAAK,MAAA,CAAO,WAAW,IAAI,CAAA;AAC3D,IAAA,IAAI,UAAA,IAAc,UAAA,CAAW,MAAA,GAAS,CAAA,EAAG;AAEvC,MAAA,MAAM,aAAA,GAAgB,UAAA,CAAW,GAAA,CAAI,CAAC,IAAA,KAAS;AAE7C,QAAA,MAAM,YAQF,EAAC;AAEL,QAAA,IAAI,IAAA,CAAK,GAAA,EAAK,SAAA,CAAU,GAAA,GAAM,IAAA,CAAK,GAAA;AACnC,QAAA,IAAI,IAAA,CAAK,KAAA,EAAO,SAAA,CAAU,KAAA,GAAQ,IAAA,CAAK,KAAA;AACvC,QAAA,IAAI,IAAA,CAAK,QAAA,KAAa,MAAA,EAAW,SAAA,CAAU,WAAW,IAAA,CAAK,QAAA;AAC3D,QAAA,IAAI,IAAA,CAAK,SAAA,KAAc,MAAA,EAAW,SAAA,CAAU,YAAY,IAAA,CAAK,SAAA;AAG7D,QAAA,IAAI,IAAA,CAAK,YAAY,cAAA,EAAgB;AACnC,UAAA,SAAA,CAAU,QAAA,GAAW,CAAC,IAAA,KAA+B;AAEnD,YAAA,MAAM,YAAY,IAAA,CAAK,QAAA,GAAW,KAAK,QAAA,CAAS,IAAI,IAAI,EAAC;AAGzD,YAAA,IAAI,SAAA,KAAc,IAAA,IAAQ,SAAA,KAAc,KAAA,EAAO;AAC7C,cAAA,OAAO,SAAA;AAAA,YACT;AAGA,YAAA,MAAM,WAAA,GAAuC,EAAE,GAAG,SAAA,EAAU;AAK5D,YAAA,IAAI,cAAA,IAAkB,OAAO,IAAA,KAAS,QAAA,EAAU;AAC9C,cAAA,KAAA,MAAW,CAAC,IAAA,EAAM,QAAQ,KAAK,MAAA,CAAO,OAAA,CAAQ,cAAc,CAAA,EAAG;AAC7D,gBAAA,IAAI,SAAS,SAAA,EAAW;AACtB,kBAAA,WAAA,CAAY,IAAI,CAAA,GAAI,QAAA,CAAS,SAAA,CAAU,IAAI,CAAA;AAAA,gBAC7C;AAAA,cACF;AAAA,YACF;AAEA,YAAA,OAAO,WAAA;AAAA,UACT,CAAA;AAAA,QACF;AAEA,QAAA,OAAO,SAAA;AAAA,MACT,CAAC,CAAA;AAKD,MAAA,IAAA,CAAK,QAAA,GAAW,aAAA;AAAA,IAClB;AAGA,IAAA,IAAI,IAAA,CAAK,OAAO,UAAA,EAAY;AAC1B,MAAA,MAAM,QAAA,GAAW,KAAK,MAAA,CAAO,UAAA;AAC7B,MAAA,MAAM,SAAA,GAAY,cAAA;AAElB,MAAA,MAAM,YAAA,GAAe,IAAA;AAErB,MAAA,IAAA,CAAK,KAAA,GAAQ,CAAC,IAAA,EAAM,OAAA,KAAY;AAC9B,QAAA,MAAM,YAAY,SAAA,GACd,mBAAA,CAAoB,KAAK,KAAA,EAAO,SAAS,IACzC,EAAC;AAEL,QAAA,OAAO,SAAS,IAAA,CAAK,YAAA,EAAc,EAAE,IAAA,EAAM,cAAA,EAAgB,WAAW,CAAA;AAAA,MACxE,CAAA;AAAA,IACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AACF;;;AC1RA,SAAS,YAAA,CACP,KAAA,EACA,EAAA,EACA,QAAA,EACS;AACT,EAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAO,GAAI,EAAA,CAAG,SAAA;AAC7B,EAAA,MAAM,UAAA,GAAa,OAAO,CAAC,CAAA;AAC3B,EAAA,IAAI,CAAC,YAAY,OAAO,KAAA;AAExB,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,MAAM,OAAO,EAAA,CAAG,GAAA,CAAI,OAAA,CAAQ,UAAA,CAAW,MAAM,GAAG,CAAA;AAChD,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,aAAA,IAAiB,CAAC,KAAK,MAAA,CAAO,IAAA,CAAK,cAAA,CAAe,QAAQ,CAAA,EAAG;AAC5E,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,MAAM,cAAc,EAAA,CAAG,WAAA,IAAe,KAAA,CAAM,WAAA,IAAe,KAAK,KAAA,EAAM;AACtE,IAAA,IAAI,WAAA,CAAY,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,IAAK,CAAA,CAAE,IAAA,KAAS,QAAQ,CAAA,EAAG;AAC7E,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF,CAAA,MAAO;AACL,IAAA,MAAM,MAAM,EAAE,YAAA,EAAc,OAAO,OAAA,EAAS,KAAA,EAAO,mBAAmB,KAAA,EAAM;AAC5E,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,EAAA,CAAG,GAAA,CAAI,aAAa,KAAA,CAAM,KAAA,CAAM,KAAK,KAAA,CAAM,GAAA,CAAI,GAAA,EAAK,CAAC,IAAA,KAAS;AAC5D,QAAA,IAAI,KAAK,aAAA,IAAiB,IAAA,CAAK,IAAA,CAAK,cAAA,CAAe,QAAQ,CAAA,EAAG;AAC5D,UAAA,GAAA,CAAI,YAAA,GAAe,IAAA;AAAA,QACrB;AACA,QAAA,IAAI,KAAK,MAAA,EAAQ;AACf,UAAA,GAAA,CAAI,OAAA,GAAU,IAAA;AACd,UAAA,IAAI,CAAC,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,IAAK,CAAA,CAAE,IAAA,KAAS,QAAQ,CAAA,EAAG;AAC7E,YAAA,GAAA,CAAI,iBAAA,GAAoB,IAAA;AAAA,UAC1B;AAAA,QACF;AAAA,MACF,CAAC,CAAA;AAAA,IACH;AACA,IAAA,IAAI,CAAC,GAAA,CAAI,YAAA,IAAiB,IAAI,OAAA,IAAW,CAAC,IAAI,iBAAA,EAAoB;AAChE,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAYO,IAAM,UAAA,GACX,CAAC,QAAA,EAAkB,UAAA,KACnB,CAAC,EAAE,KAAA,EAAO,EAAA,EAAI,QAAA,EAAS,KAAM;AAC3B,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,QAAQ,CAAA;AAE5C,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAAC,YAAA,CAAa,KAAA,EAAO,EAAA,EAAI,QAAQ,CAAA,EAAG;AACtC,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAO,GAAI,EAAA,CAAG,SAAA;AAC7B,EAAA,MAAM,UAAA,GAAa,OAAO,CAAC,CAAA;AAC3B,EAAA,IAAI,CAAC,YAAY,OAAO,KAAA;AAExB,EAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAEtB,EAAA,IAAI,KAAA,EAAO;AAET,IAAA,MAAM,IAAA,GAAO,WAAW,KAAA,CAAM,GAAA;AAC9B,IAAA,MAAM,WAAA,GAAc,EAAA,CAAG,WAAA,IAClB,KAAA,CAAM,WAAA,IACN,GAAG,GAAA,CAAI,OAAA,CAAQ,IAAI,CAAA,CAAE,KAAA,EAAM;AAEhC,IAAA,IAAI,QAAA,CAAS,OAAA,CAAQ,WAAW,CAAA,EAAG;AACjC,MAAA,EAAA,CAAG,iBAAiB,QAAQ,CAAA;AAAA,IAC9B,CAAA,MAAO;AACL,MAAA,EAAA,CAAG,aAAA,CAAc,QAAA,CAAS,MAAA,CAAO,UAAA,IAAc,IAAI,CAAC,CAAA;AAAA,IACtD;AAAA,EACF,CAAA,MAAO;AAEL,IAAA,MAAM,UAAU,MAAA,CAAO,KAAA;AAAA,MAAM,CAAA,KAAA,KAC3B,EAAA,CAAG,GAAA,CAAI,YAAA,CAAa,KAAA,CAAM,MAAM,GAAA,EAAK,KAAA,CAAM,GAAA,CAAI,GAAA,EAAK,QAAQ;AAAA,KAC9D;AACA,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,EAAA,CAAG,WAAW,KAAA,CAAM,KAAA,CAAM,KAAK,KAAA,CAAM,GAAA,CAAI,KAAK,QAAQ,CAAA;AAAA,MACxD,CAAA,MAAO;AACL,QAAA,EAAA,CAAG,OAAA,CAAQ,KAAA,CAAM,KAAA,CAAM,GAAA,EAAK,KAAA,CAAM,GAAA,CAAI,GAAA,EAAK,QAAA,CAAS,MAAA,CAAO,UAAA,IAAc,IAAI,CAAC,CAAA;AAAA,MAChF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,QAAA,CAAS,EAAE,CAAA;AACX,EAAA,OAAO,IAAA;AACT;AAQK,IAAM,OAAA,GACX,CAAC,QAAA,EAAkB,UAAA,KACnB,CAAC,EAAE,KAAA,EAAO,EAAA,EAAI,QAAA,EAAS,KAAM;AAC3B,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,QAAQ,CAAA;AAE5C,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAAC,YAAA,CAAa,KAAA,EAAO,EAAA,EAAI,QAAQ,CAAA,EAAG;AACtC,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAO,GAAI,EAAA,CAAG,SAAA;AAC7B,EAAA,MAAM,UAAA,GAAa,OAAO,CAAC,CAAA;AAC3B,EAAA,IAAI,CAAC,YAAY,OAAO,KAAA;AAGxB,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAEtB,IAAA,MAAM,IAAA,GAAO,WAAW,KAAA,CAAM,GAAA;AAI9B,IAAA,MAAM,YAAA,GAAe,EAAA,CAAG,WAAA,EAAa,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,KAAS,QAAQ,CAAA,IAC7D,KAAA,CAAM,WAAA,EAAa,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,KAAS,QAAQ,CAAA,IAChD,EAAA,CAAG,GAAA,CAAI,OAAA,CAAQ,IAAI,CAAA,CAAE,KAAA,EAAM,CAAE,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,KAAS,QAAQ,CAAA,IAC1D,IAAA;AACL,IAAA,MAAM,WAAA,GAAc,eAChB,EAAE,GAAG,aAAa,KAAA,EAAO,GAAG,YAAW,GACvC,UAAA;AAEJ,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,MAAA,CAAO,WAAW,CAAA;AACxC,IAAA,EAAA,CAAG,cAAc,IAAI,CAAA;AACrB,IAAA,QAAA,CAAS,EAAE,CAAA;AACX,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,IAAA;AAAA,EACT;AAMA,EAAA,MAAM,YAA0D,EAAC;AACjE,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,CAAM,GAAA;AAC1B,IAAA,MAAM,GAAA,GAAM,MAAM,GAAA,CAAI,GAAA;AACtB,IAAA,EAAA,CAAG,IAAI,YAAA,CAAa,KAAA,EAAO,GAAA,EAAK,CAAC,MAAM,GAAA,KAAQ;AAC7C,MAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAClB,MAAA,MAAM,QAAA,GAAW,QAAA,CAAS,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA;AAC5C,MAAA,MAAM,SAAA,GAAY,QAAA,GACd,EAAE,GAAG,QAAA,CAAS,OAAO,GAAG,UAAA,EAAW,GAClC,UAAA,IAAc,EAAC;AACpB,MAAA,SAAA,CAAU,IAAA,CAAK;AAAA,QACb,IAAA,EAAM,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AAAA,QACzB,IAAI,IAAA,CAAK,GAAA,CAAI,GAAA,GAAM,IAAA,CAAK,UAAU,GAAG,CAAA;AAAA,QACrC,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,IAAA,KAAA,MAAW,MAAM,SAAA,EAAW;AAC1B,MAAA,EAAA,CAAG,OAAA,CAAQ,GAAG,IAAA,EAAM,EAAA,CAAG,IAAI,QAAA,CAAS,MAAA,CAAO,EAAA,CAAG,KAAK,CAAC,CAAA;AAAA,IACtD;AAAA,EACF,CAAA,MAAO;AAEL,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,EAAA,CAAG,OAAA,CAAQ,KAAA,CAAM,KAAA,CAAM,GAAA,EAAK,KAAA,CAAM,IAAI,GAAA,EAAK,QAAA,CAAS,MAAA,CAAO,UAAU,CAAC,CAAA;AAAA,IACxE;AAAA,EACF;AAEA,EAAA,QAAA,CAAS,EAAE,CAAA;AACX,EAAA,OAAO,IAAA;AACT;AAOK,IAAM,SAAA,GACX,CAAC,QAAA,KACD,CAAC,EAAE,KAAA,EAAO,EAAA,EAAI,UAAS,KAAM;AAC3B,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,QAAQ,CAAA;AAE5C,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAO,GAAI,EAAA,CAAG,SAAA;AAG7B,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,EAAA,CAAG,iBAAiB,QAAQ,CAAA;AAC5B,IAAA,QAAA,CAAS,EAAE,CAAA;AACX,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,EAAA,CAAG,WAAW,KAAA,CAAM,KAAA,CAAM,KAAK,KAAA,CAAM,GAAA,CAAI,KAAK,QAAQ,CAAA;AAAA,EACxD;AACA,EAAA,QAAA,CAAS,EAAE,CAAA;AACX,EAAA,OAAO,IAAA;AACT;AAWK,IAAM,aAAA,GACX,MACA,CAAC,EAAE,OAAO,EAAA,EAAI,QAAA,EAAU,QAAO,KAAM;AACnC,EAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAO,GAAI,EAAA,CAAG,SAAA;AAE7B,EAAA,IAAI,OAAO,OAAO,KAAA;AAClB,EAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAItB,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAY;AAClC,EAAA,MAAM,MAAO,MAAA,CAA+E,gBAAA;AAC5F,EAAA,KAAA,MAAW,GAAA,IAAO,IAAI,UAAA,EAAY;AAChC,IAAA,IAAI,GAAA,YAAe,IAAA,IAAQ,CAAC,GAAA,CAAI,YAAA,EAAc;AAC5C,MAAA,SAAA,CAAU,GAAA,CAAI,IAAI,IAAI,CAAA;AAAA,IACxB;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,YAAY,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,KAAK,CAAA,EAAG;AACtD,IAAA,IAAI,CAAC,SAAA,CAAU,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC5B,MAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,QAAA,EAAA,CAAG,UAAA,CAAW,KAAA,CAAM,KAAA,CAAM,GAAA,EAAK,KAAA,CAAM,GAAA,CAAI,GAAA,EAAK,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,QAAQ,CAAC,CAAA;AAAA,MAC5E;AAAA,IACF;AAAA,EACF;AACA,EAAA,EAAA,CAAG,cAAA,CAAe,EAAE,CAAA;AACpB,EAAA,QAAA,CAAS,EAAE,CAAA;AACX,EAAA,OAAO,IAAA;AACT;;;AC9QK,IAAM,uCAAuB,IAAI,GAAA,CAAI,CAAC,UAAA,EAAY,UAAU,CAAC;AAQ7D,SAAS,0BAA0B,IAAA,EAA2B;AACnE,EAAA,KAAA,IAAS,CAAA,GAAI,IAAA,CAAK,KAAA,EAAO,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AACpC,IAAA,IAAI,oBAAA,CAAqB,IAAI,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,EAAG,OAAO,CAAA;AAAA,EAC/D;AACA,EAAA,OAAO,EAAA;AACT;AAGO,SAAS,iBAAiB,IAAA,EAA4B;AAC3D,EAAA,OAAO,yBAAA,CAA0B,IAAI,CAAA,KAAM,EAAA;AAC7C;AAOO,SAAS,kBAAkB,IAAA,EAA4B;AAC5D,EAAA,MAAM,CAAA,GAAI,0BAA0B,IAAI,CAAA;AACxC,EAAA,IAAI,CAAA,KAAM,IAAI,OAAO,KAAA;AACrB,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,KAAM,CAAA;AAC3B;;;ACXO,SAAS,mBAAA,CACd,OACA,EAAA,EACS;AACT,EAAA,IAAI,CAAC,EAAA,CAAG,SAAA,CAAU,KAAA,EAAO,OAAO,KAAA;AAChC,EAAA,IAAI,EAAA,CAAG,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,KAAA;AAElC,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,EAAA,CAAG,SAAA;AACrB,EAAA,MAAM,aAAA,GAAgB,0BAA0B,KAAK,CAAA;AACrD,EAAA,IAAI,aAAA,KAAkB,IAAI,OAAO,KAAA;AACjC,EAAA,IAAI,KAAA,CAAM,KAAA,CAAM,aAAa,CAAA,KAAM,GAAG,OAAO,KAAA;AAE7C,EAAA,MAAM,YAAA,GAAe,KAAA,CAAM,IAAA,CAAK,aAAa,CAAA,CAAE,IAAA;AAC/C,EAAA,OAAOC,uBAAA,CAAa,YAAY,CAAA,CAAE,KAAA,EAAO,CAAC,MAAA,KAAW;AACnD,IAAA,KAAA,MAAW,IAAA,IAAQ,MAAA,CAAO,KAAA,EAAO,EAAA,CAAG,KAAK,IAAI,CAAA;AAC7C,IAAA,IAAI,MAAA,CAAO,YAAA,EAAc,EAAA,CAAG,YAAA,CAAa,OAAO,SAAS,CAAA;AAAA,EAC3D,CAAC,CAAA;AACH;;;AC1BO,IAAM,YAAA,GACX,CAAC,QAAA,EAAkB,UAAA,KACnB,CAAC,EAAE,KAAA,EAAO,EAAA,EAAI,QAAA,EAAS,KAAM;AAC3B,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,QAAQ,CAAA;AAE5C,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,MAAM,WAAW,EAAA,CAAG,SAAA,CAAU,MAAA,CAAO,IAAA,CAAK,CAAC,KAAA,KAAU;AACnD,IAAA,IAAI,KAAA,GAAQ,KAAA;AACZ,IAAA,EAAA,CAAG,GAAA,CAAI,YAAA,CAAa,KAAA,CAAM,KAAA,CAAM,GAAA,EAAK,MAAM,GAAA,CAAI,GAAA,EAAK,CAAC,IAAA,EAAM,GAAA,KAAQ;AACjE,MAAA,IAAI,OAAO,OAAO,KAAA;AAClB,MAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACvB,MAAA,MAAM,WAAA,GAAc,EAAE,GAAG,IAAA,CAAK,OAAO,GAAI,UAAA,IAAc,EAAC,EAAG;AAC3D,MAAA,IAAI,IAAA,CAAK,SAAA,CAAU,QAAA,EAAU,WAAW,CAAA,EAAG;AAC3C,MAAA,IAAI,IAAA,CAAK,SAAS,QAAA,EAAU;AAC1B,QAAA,KAAA,GAAQ,IAAA;AAAA,MACV,CAAA,MAAO;AACL,QAAA,MAAM,IAAA,GAAO,EAAA,CAAG,GAAA,CAAI,OAAA,CAAQ,GAAG,CAAA;AAC/B,QAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,EAAM;AACzB,QAAA,KAAA,GAAQ,KAAK,MAAA,CAAO,cAAA,CAAe,KAAA,EAAO,KAAA,GAAQ,GAAG,QAAQ,CAAA;AAAA,MAC/D;AACA,MAAA;AAAA,IACF,CAAC,CAAA;AACD,IAAA,OAAO,KAAA;AAAA,EACT,CAAC,CAAA;AAED,EAAA,IAAI,CAAC,QAAA,EAAU;AAOb,IAAA,MAAM,MAAA,GAAS,mBAAA,CAAoB,KAAA,EAAO,EAAE,CAAA;AAC5C,IAAA,IAAI,CAAC,QAAQ,OAAO,KAAA;AAQpB,IAAA,MAAM,UAAU,EAAA,CAAG,GAAA,CAAI,OAAA,CAAQ,EAAA,CAAG,UAAU,IAAI,CAAA;AAChD,IAAA,IAAI,OAAA,CAAQ,KAAA,GAAQ,CAAA,EAAG,OAAO,KAAA;AAC9B,IAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAClD,IAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAClD,IAAA,IAAI,CAAC,WAAA,CAAY,cAAA,CAAe,YAAY,UAAA,GAAa,CAAA,EAAG,QAAQ,CAAA,EAAG;AACrE,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAEtB,IAAA,EAAA,CAAG,YAAA;AAAA,MACD,GAAG,SAAA,CAAU,IAAA;AAAA,MACb,GAAG,SAAA,CAAU,EAAA;AAAA,MACb,QAAA;AAAA,MACA,CAAC,UAAU,EAAE,GAAG,KAAK,KAAA,EAAO,GAAI,UAAA,IAAc,EAAC,EAAG;AAAA,KACpD;AACA,IAAA,QAAA,CAAS,EAAA,CAAG,gBAAgB,CAAA;AAC5B,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAGtB,EAAA,KAAA,MAAW,KAAA,IAAS,EAAA,CAAG,SAAA,CAAU,MAAA,EAAQ;AACvC,IAAA,MAAM,IAAA,GAAO,MAAM,KAAA,CAAM,GAAA;AACzB,IAAA,MAAM,EAAA,GAAK,MAAM,GAAA,CAAI,GAAA;AACrB,IAAA,EAAA,CAAG,YAAA,CAAa,IAAA,EAAM,EAAA,EAAI,QAAA,EAAU,CAAC,IAAA,MAAU,EAAE,GAAG,IAAA,CAAK,KAAA,EAAO,GAAI,UAAA,IAAc,IAAI,CAAE,CAAA;AAAA,EAC1F;AAEA,EAAA,QAAA,CAAS,EAAA,CAAG,gBAAgB,CAAA;AAC5B,EAAA,OAAO,IAAA;AACT;AAaK,IAAM,kBACX,CAAC,QAAA,EAAkB,eAAA,EAAyB,UAAA,KAC5C,CAAC,KAAA,KAAU;AACT,EAAA,MAAM,EAAE,KAAA,EAAO,EAAA,EAAG,GAAI,KAAA;AACtB,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,QAAQ,CAAA;AAC5C,EAAA,MAAM,eAAA,GAAkB,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,eAAe,CAAA;AAE1D,EAAA,IAAI,CAAC,QAAA,IAAY,CAAC,eAAA,EAAiB;AACjC,IAAA,OAAO,KAAA;AAAA,EACT;AAKA,EAAA,MAAM,EAAE,IAAA,EAAM,EAAA,EAAG,GAAI,EAAA,CAAG,SAAA;AACxB,EAAA,MAAM,gBAAoC,EAAC;AAC3C,EAAA,EAAA,CAAG,GAAA,CAAI,YAAA,CAAa,IAAA,EAAM,EAAA,EAAI,CAAC,IAAA,KAAS;AACtC,IAAA,IAAI,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC7C,MAAA,aAAA,CAAc,IAAA,CAAK,EAAE,IAAA,EAAM,CAAA;AAAA,IAC7B;AAAA,EACF,CAAC,CAAA;AAED,EAAA,MAAM,QAAA,GAAW,cAAc,MAAA,GAAS,CAAA,IAAK,cAAc,KAAA,CAAM,CAAC,EAAE,IAAA,EAAK,KAAM;AAC7E,IAAA,MAAM,WAAA,GAAc,KAAK,IAAA,KAAS,QAAA;AAClC,IAAA,MAAM,aAAa,CAAC,UAAA,IAAc,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA,CAAE,KAAA;AAAA,MACxD,CAAC,GAAA,KAAQ,IAAA,CAAK,MAAM,GAAG,CAAA,KAAM,WAAW,GAAG;AAAA,KAC7C;AACA,IAAA,OAAO,WAAA,IAAe,UAAA;AAAA,EACxB,CAAC,CAAA;AAED,EAAA,IAAI,QAAA,EAAU;AAEZ,IAAA,OAAO,YAAA,CAAa,eAAe,CAAA,CAAE,KAAK,CAAA;AAAA,EAC5C;AAGA,EAAA,OAAO,YAAA,CAAa,QAAA,EAAU,UAAU,CAAA,CAAE,KAAK,CAAA;AACjD;AAUK,IAAM,MAAA,GACX,CAAC,QAAA,EAAkB,UAAA,KACnB,CAAC,EAAE,KAAA,EAAO,EAAA,EAAI,QAAA,EAAS,KAAM;AAC3B,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,QAAQ,CAAA;AAE5C,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,EAAE,KAAA,EAAO,GAAA,EAAI,GAAI,EAAA,CAAG,SAAA;AAC1B,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,UAAA,CAAW,GAAG,CAAA;AAClC,EAAA,IAAI,CAAC,OAAO,OAAO,KAAA;AAEnB,EAAA,MAAM,QAAA,GAAWT,sBAAAA,CAAa,KAAA,EAAO,QAAA,EAAU,UAAU,CAAA;AACzD,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AACtB,IAAA,EAAA,CAAG,IAAA,CAAK,KAAA,EAAO,QAAQ,CAAA,CAAE,cAAA,EAAe;AACxC,IAAA,QAAA,CAAS,EAAE,CAAA;AACX,IAAA,OAAO,IAAA;AAAA,EACT;AASA,EAAA,MAAM,MAAA,GAAS,mBAAA,CAAoB,KAAA,EAAO,EAAE,CAAA;AAC5C,EAAA,IAAI,CAAC,QAAQ,OAAO,KAAA;AAEpB,EAAA,MAAM,UAAU,EAAA,CAAG,GAAA,CAAI,OAAA,CAAQ,EAAA,CAAG,UAAU,IAAI,CAAA;AAChD,EAAA,MAAM,QAAQ,EAAA,CAAG,GAAA,CAAI,OAAA,CAAQ,EAAA,CAAG,UAAU,EAAE,CAAA;AAC5C,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,UAAA,CAAW,KAAK,CAAA;AACxC,EAAA,IAAI,CAAC,SAAS,OAAO,KAAA;AACrB,EAAA,MAAM,UAAA,GAAaA,sBAAAA,CAAa,OAAA,EAAS,QAAA,EAAU,UAAU,CAAA;AAC7D,EAAA,IAAI,CAAC,YAAY,OAAO,KAAA;AACxB,EAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAEtB,EAAA,EAAA,CAAG,IAAA,CAAK,OAAA,EAAS,UAAU,CAAA,CAAE,cAAA,EAAe;AAC5C,EAAA,QAAA,CAAS,EAAE,CAAA;AACX,EAAA,OAAO,IAAA;AACT;AAYK,IAAM,UAAA,GACX,CAAC,QAAA,EAAkB,UAAA,KACnB,CAAC,KAAA,KAAU;AACT,EAAA,MAAM,EAAE,KAAA,EAAO,EAAA,EAAI,QAAA,EAAS,GAAI,KAAA;AAChC,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,QAAQ,CAAA;AAE5C,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,EAAA,CAAG,SAAA;AAEtB,EAAA,MAAM,YAAA,GAAe,CAAC,GAAA,KAAyB;AAC7C,IAAA,MAAM,IAAA,GAAO,EAAA,CAAG,GAAA,CAAI,OAAA,CAAQ,GAAG,CAAA;AAC/B,IAAA,KAAA,IAAS,CAAA,GAAI,IAAA,CAAK,KAAA,EAAO,CAAA,GAAI,GAAG,CAAA,EAAA,EAAK;AACnC,MAAA,IAAI,KAAK,IAAA,CAAK,CAAC,CAAA,CAAE,IAAA,KAAS,UAAU,OAAO,IAAA;AAAA,IAC7C;AACA,IAAA,OAAO,KAAA;AAAA,EACT,CAAA;AAGA,EAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,IAAA,MAAMU,WAAAA,GAAa,OAAO,KAAA,CAAM,CAAA,KAAA,KAAS,aAAa,KAAA,CAAM,KAAA,CAAM,GAAG,CAAC,CAAA;AACtE,IAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAItB,IAAA,MAAM,aAAA,GAAgB,OACnB,GAAA,CAAI,CAAC,OAAO,EAAE,IAAA,EAAM,CAAA,CAAE,KAAA,CAAM,GAAA,EAAK,EAAA,EAAI,EAAE,GAAA,CAAI,GAAA,EAAI,CAAE,CAAA,CACjD,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,CAAA,CAAE,IAAA,GAAO,CAAA,CAAE,IAAI,CAAA;AAEjC,IAAA,KAAA,MAAW,QAAQ,aAAA,EAAe;AAChC,MAAA,MAAMC,KAAAA,GAAO,EAAA,CAAG,OAAA,CAAQ,GAAA,CAAI,KAAK,IAAI,CAAA;AACrC,MAAA,MAAMC,GAAAA,GAAK,EAAA,CAAG,OAAA,CAAQ,GAAA,CAAI,KAAK,EAAE,CAAA;AACjC,MAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,GAAA,CAAI,OAAA,CAAQD,KAAI,CAAA;AACjC,MAAA,MAAM,GAAA,GAAM,EAAA,CAAG,GAAA,CAAI,OAAA,CAAQC,GAAE,CAAA;AAC7B,MAAA,MAAM,UAAA,GAAa,KAAA,CAAM,UAAA,CAAW,GAAG,CAAA;AACvC,MAAA,IAAI,CAAC,UAAA,EAAY;AAEjB,MAAA,IAAIF,WAAAA,EAAY;AACd,QAAA,MAAM,MAAA,GAASG,qBAAW,UAAU,CAAA;AACpC,QAAA,IAAI,MAAA,KAAW,IAAA,EAAM,EAAA,CAAG,IAAA,CAAK,YAAY,MAAM,CAAA;AAAA,MACjD,CAAA,MAAO;AACL,QAAA,MAAM,QAAA,GAAWb,sBAAAA,CAAa,UAAA,EAAY,QAAA,EAAU,UAAU,CAAA;AAC9D,QAAA,IAAI,QAAA,EAAU,EAAA,CAAG,IAAA,CAAK,UAAA,EAAY,QAAQ,CAAA;AAAA,MAC5C;AAAA,IACF;AAEA,IAAA,QAAA,CAAS,EAAA,CAAG,gBAAgB,CAAA;AAC5B,IAAA,OAAO,IAAA;AAAA,EACT;AAMA,EAAA,MAAM,EAAE,IAAA,EAAM,EAAA,EAAG,GAAI,EAAA,CAAG,SAAA;AACxB,EAAA,MAAM,gBAAmC,EAAC;AAC1C,EAAA,EAAA,CAAG,IAAI,YAAA,CAAa,IAAA,EAAM,EAAA,EAAI,CAAC,MAAM,GAAA,KAAQ;AAC3C,IAAA,IAAI,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC7C,MAAA,aAAA,CAAc,IAAA,CAAK,EAAE,GAAA,EAAK,CAAA;AAAA,IAC5B;AAAA,EACF,CAAC,CAAA;AAED,EAAA,MAAM,UAAA,GAAa,aAAA,CAAc,MAAA,GAAS,CAAA,GACtC,cAAc,KAAA,CAAM,CAAC,EAAE,GAAA,OAAU,YAAA,CAAa,GAAG,CAAC,CAAA,GAClD,aAAa,IAAI,CAAA;AAErB,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,MAAM,KAAA,GAAQ,cAAc,CAAC,CAAA;AAC7B,IAAA,MAAM,IAAA,GAAO,aAAA,CAAc,aAAA,CAAc,MAAA,GAAS,CAAC,CAAA;AACnD,IAAA,IAAI,SAAS,IAAA,EAAM;AACjB,MAAA,MAAM,YAAY,EAAA,CAAG,GAAA,CAAI,OAAA,CAAQ,KAAA,CAAM,MAAM,CAAC,CAAA;AAC9C,MAAA,MAAM,UAAU,EAAA,CAAG,GAAA,CAAI,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAC,CAAA;AAC3C,MAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,UAAA,CAAW,OAAO,CAAA;AAC1C,MAAA,IAAI,CAAC,OAAO,OAAO,KAAA;AACnB,MAAA,MAAM,MAAA,GAASa,qBAAW,KAAK,CAAA;AAC/B,MAAA,IAAI,MAAA,KAAW,MAAM,OAAO,KAAA;AAC5B,MAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AACtB,MAAA,EAAA,CAAG,IAAA,CAAK,KAAA,EAAO,MAAM,CAAA,CAAE,cAAA,EAAe;AACtC,MAAA,QAAA,CAAS,EAAE,CAAA;AACX,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAO,IAAA,GAAO,KAAK,CAAA;AAAA,EACrB;AAEA,EAAA,OAAO,MAAA,CAAO,QAAA,EAAU,UAAU,CAAA,CAAE,KAAK,CAAA;AAC3C;AAQK,IAAM,OACX,MACA,CAAC,EAAE,EAAA,EAAI,UAAS,KAAM;AACpB,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,EAAA,CAAG,SAAA;AAGtB,EAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,IAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAEtB,IAAA,MAAM,aAAA,GAAgB,OACnB,GAAA,CAAI,CAAC,OAAO,EAAE,IAAA,EAAM,CAAA,CAAE,KAAA,CAAM,GAAA,EAAK,EAAA,EAAI,EAAE,GAAA,CAAI,GAAA,EAAI,CAAE,CAAA,CACjD,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,CAAA,CAAE,IAAA,GAAO,CAAA,CAAE,IAAI,CAAA;AAEjC,IAAA,KAAA,MAAW,QAAQ,aAAA,EAAe;AAChC,MAAA,MAAM,IAAA,GAAO,EAAA,CAAG,OAAA,CAAQ,GAAA,CAAI,KAAK,IAAI,CAAA;AACrC,MAAA,MAAM,EAAA,GAAK,EAAA,CAAG,OAAA,CAAQ,GAAA,CAAI,KAAK,EAAE,CAAA;AACjC,MAAA,MAAMC,MAAAA,GAAQ,EAAA,CAAG,GAAA,CAAI,OAAA,CAAQ,IAAI,CAAA;AACjC,MAAA,MAAMC,IAAAA,GAAM,EAAA,CAAG,GAAA,CAAI,OAAA,CAAQ,EAAE,CAAA;AAC7B,MAAA,MAAMC,MAAAA,GAAQF,MAAAA,CAAM,UAAA,CAAWC,IAAG,CAAA;AAClC,MAAA,IAAI,CAACC,MAAAA,EAAO;AACZ,MAAA,MAAMC,OAAAA,GAASJ,qBAAWG,MAAK,CAAA;AAC/B,MAAA,IAAIC,OAAAA,KAAW,IAAA,EAAM,EAAA,CAAG,IAAA,CAAKD,QAAOC,OAAM,CAAA;AAAA,IAC5C;AACA,IAAA,QAAA,CAAS,EAAA,CAAG,gBAAgB,CAAA;AAC5B,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,EAAE,KAAA,EAAO,GAAA,EAAI,GAAI,EAAA,CAAG,SAAA;AAC1B,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,UAAA,CAAW,GAAG,CAAA;AAClC,EAAA,IAAI,CAAC,OAAO,OAAO,KAAA;AAEnB,EAAA,MAAM,MAAA,GAASJ,qBAAW,KAAK,CAAA;AAC/B,EAAA,IAAI,MAAA,KAAW,MAAM,OAAO,KAAA;AAC5B,EAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAEtB,EAAA,EAAA,CAAG,IAAA,CAAK,KAAA,EAAO,MAAM,CAAA,CAAE,cAAA,EAAe;AACtC,EAAA,QAAA,CAAS,EAAE,CAAA;AACX,EAAA,OAAO,IAAA;AACT;;;ACjVF,IAAM,kCAAkB,IAAI,GAAA,CAAI,CAAC,UAAA,EAAY,UAAU,CAAC,CAAA;AAiCjD,SAAS,yBACd,KAAA,EAC8B;AAC9B,EAAA,IAAI,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,IAAA,KAAS,aAAa,OAAO,IAAA;AAEnD,EAAA,MAAM,SAAA,GAAY,MAAM,KAAA,GAAQ,CAAA;AAChC,EAAA,IAAI,SAAA,GAAY,GAAG,OAAO,IAAA;AAC1B,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,IAAA,CAAK,SAAS,CAAA;AACrC,EAAA,IAAI,CAAC,eAAA,CAAgB,GAAA,CAAI,SAAS,IAAA,CAAK,IAAI,GAAG,OAAO,IAAA;AAErD,EAAA,MAAM,eAAe,SAAA,GAAY,CAAA;AACjC,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,KAAA,CAAM,SAAS,CAAA;AAExC,EAAA,OAAO;AAAA,IACL,SAAA;AAAA,IACA,OAAA,EAAS,KAAA,CAAM,MAAA,CAAO,SAAS,CAAA;AAAA,IAC/B,UAAA,EAAY,KAAA,CAAM,MAAA,CAAO,YAAY,CAAA;AAAA,IACrC,kBAAkB,UAAA,GAAa,CAAA;AAAA,IAC/B,gBAAA,EAAkB,KAAA,CAAM,MAAA,CAAO,OAAA,CAAQ,IAAA,KAAS,CAAA;AAAA,IAChD,WAAA,EAAa,UAAA,KAAe,QAAA,CAAS,UAAA,GAAa,CAAA;AAAA,IAClD,UAAA;AAAA,IACA,kBAAA,EAAoB,KAAA,CAAM,KAAA,CAAM,YAAY;AAAA,GAC9C;AACF;;;AC3CA,SAAS,iBAAA,CAAkB,IAAiB,QAAA,EAA0B;AACpE,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,EAAA,CAAG,SAAA;AACrB,EAAA,KAAA,IAAS,CAAA,GAAI,KAAA,CAAM,KAAA,EAAO,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AACrC,IAAA,IAAI,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,CAAE,SAAS,QAAA,EAAU;AACnC,MAAA,MAAM,OAAA,GAAU,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA;AAC9B,MAAA,IAAI,UAAU,CAAA,IAAKZ,iBAAAA,CAAQ,EAAA,CAAG,GAAA,EAAK,OAAO,CAAA,EAAG;AAC3C,QAAA,MAAM,aAAa,EAAA,CAAG,GAAA,CAAI,OAAA,CAAQ,OAAA,GAAU,CAAC,CAAA,CAAE,MAAA;AAC/C,QAAA,IAAI,UAAA,CAAW,SAAS,QAAA,EAAU;AAChC,UAAA,EAAA,CAAG,KAAK,OAAO,CAAA;AAAA,QACjB;AAAA,MACF;AACA,MAAA;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,gBAAA,CAAiB,IAAiB,QAAA,EAA0B;AACnE,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,EAAA,CAAG,SAAA;AACrB,EAAA,KAAA,IAAS,CAAA,GAAI,KAAA,CAAM,KAAA,EAAO,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AACrC,IAAA,IAAI,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,CAAE,SAAS,QAAA,EAAU;AACnC,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA;AAC3B,MAAA,IAAI,KAAA,GAAQ,GAAG,GAAA,CAAI,OAAA,CAAQ,QAAQA,iBAAAA,CAAQ,EAAA,CAAG,GAAA,EAAK,KAAK,CAAA,EAAG;AACzD,QAAA,MAAM,SAAA,GAAY,EAAA,CAAG,GAAA,CAAI,MAAA,CAAO,KAAK,CAAA;AACrC,QAAA,IAAI,SAAA,EAAW,SAAS,QAAA,EAAU;AAChC,UAAA,EAAA,CAAG,KAAK,KAAK,CAAA;AAAA,QACf;AAAA,MACF;AACA,MAAA;AAAA,IACF;AAAA,EACF;AACF;AAaO,IAAM,UAAA,GACX,CAAC,YAAA,EAAsB,gBAAA,EAA0B,UAAA,KACjD,CAAC,SAAEZ,OAAA,EAAO,EAAA,EAAI,QAAA,EAAS,KAAM;AAC3B,EAAA,MAAM,QAAA,GAAWA,OAAA,CAAM,MAAA,CAAO,KAAA,CAAM,YAAY,CAAA;AAChD,EAAA,MAAM,YAAA,GAAeA,OAAA,CAAM,MAAA,CAAO,KAAA,CAAM,gBAAgB,CAAA;AAExD,EAAA,IAAI,CAAC,QAAA,IAAY,CAAC,YAAA,EAAc;AAC9B,IAAA,OAAO,KAAA;AAAA,EACT;AAOA,EAAA,MAAM,kBAAA,GAAqB,CAAC,GAAA,EAAa,KAAA,EAAe,GAAA,KAAgC;AACtF,IAAA,MAAM,SAAyB,EAAC;AAChC,IAAA,GAAA,CAAI,YAAA,CAAa,KAAA,EAAO,GAAA,EAAK,CAAC,MAAM,GAAA,KAAQ;AAC1C,MAAA,IAAI,CAAC,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAA,EAAG;AAClD,MAAA,IAAI,YAAA,GAAe,KAAA;AACnB,MAAA,IAAI,UAAA,GAAa,KAAA;AACjB,MAAA,IAAI,YAAA,GAA8B,IAAA;AAClC,MAAA,MAAM,IAAA,GAAO,GAAA,CAAI,OAAA,CAAQ,GAAG,CAAA;AAC5B,MAAA,KAAA,IAAS,CAAA,GAAI,IAAA,CAAK,KAAA,EAAO,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AACpC,QAAA,MAAM,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA;AACrB,QAAA,IAAI,CAAA,CAAE,SAAS,QAAA,EAAU;AACvB,UAAA,YAAA,GAAe,IAAA;AACf,UAAA,UAAA,GAAa,IAAA;AACb,UAAA;AAAA,QACF;AACA,QAAA,MAAM,UAAU,CAAA,CAAE,IAAA,CAAK,KAAK,KAAA,IAAS,EAAA,EAAI,MAAM,KAAK,CAAA;AACpD,QAAA,IAAI,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,EAAG;AAC3B,UAAA,UAAA,GAAa,IAAA;AACb,UAAA,YAAA,GAAe,IAAA,CAAK,OAAO,CAAC,CAAA;AAC5B,UAAA;AAAA,QACF;AAAA,MACF;AACA,MAAA,MAAA,CAAO,KAAK,EAAE,GAAA,EAAK,YAAA,EAAc,UAAA,EAAY,cAAc,CAAA;AAAA,IAC7D,CAAC,CAAA;AAKD,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,MAAA,MAAM,IAAA,GAAO,GAAA,CAAI,OAAA,CAAQ,KAAK,CAAA;AAC9B,MAAA,MAAM,OAAA,GAAU,KAAK,MAAA,CAAO,aAAA,GAAgB,KAAK,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,GAAI,KAAA;AACtE,MAAA,IAAI,YAAA,GAAe,KAAA;AACnB,MAAA,IAAI,UAAA,GAAa,KAAA;AACjB,MAAA,IAAI,YAAA,GAA8B,IAAA;AAClC,MAAA,KAAA,IAAS,CAAA,GAAI,IAAA,CAAK,KAAA,EAAO,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AACpC,QAAA,MAAM,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA;AACrB,QAAA,IAAI,CAAA,CAAE,SAAS,QAAA,EAAU;AAAE,UAAA,YAAA,GAAe,IAAA;AAAM,UAAA,UAAA,GAAa,IAAA;AAAM,UAAA;AAAA,QAAO;AAC1E,QAAA,MAAM,UAAU,CAAA,CAAE,IAAA,CAAK,KAAK,KAAA,IAAS,EAAA,EAAI,MAAM,KAAK,CAAA;AACpD,QAAA,IAAI,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,EAAG;AAAE,UAAA,UAAA,GAAa,IAAA;AAAM,UAAA,YAAA,GAAe,IAAA,CAAK,OAAO,CAAC,CAAA;AAAG,UAAA;AAAA,QAAO;AAAA,MAC1F;AACA,MAAA,MAAA,CAAO,KAAK,EAAE,GAAA,EAAK,SAAS,YAAA,EAAc,UAAA,EAAY,cAAc,CAAA;AAAA,IACtE;AAEA,IAAA,OAAO,MAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,EAAA,CAAG,SAAA;AAGtB,EAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AAGrB,IAAA,MAAM,aAAA,GAAgB,OACnB,GAAA,CAAI,CAAC,OAAO,EAAE,IAAA,EAAM,CAAA,CAAE,KAAA,CAAM,GAAA,EAAK,EAAA,EAAI,EAAE,GAAA,CAAI,GAAA,EAAI,CAAE,CAAA,CACjD,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,CAAA,CAAE,IAAA,GAAO,CAAA,CAAE,IAAI,CAAA;AAGjC,IAAA,MAAM,YAA4B,EAAC;AACnC,IAAA,KAAA,MAAW,QAAQ,aAAA,EAAe;AAChC,MAAA,SAAA,CAAU,IAAA,CAAK,GAAG,kBAAA,CAAmB,EAAA,CAAG,KAAK,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,IAClE;AACA,IAAA,MAAM6B,gBAAAA,GAAkB,UAAU,MAAA,GAAS,CAAA,IAAK,UAAU,KAAA,CAAM,CAAC,CAAA,KAAM,CAAA,CAAE,YAAY,CAAA;AACrF,IAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAEtB,IAAA,IAAIA,gBAAAA,EAAiB;AAEnB,MAAA,KAAA,MAAW,QAAQ,aAAA,EAAe;AAChC,QAAA,MAAMP,KAAAA,GAAO,EAAA,CAAG,OAAA,CAAQ,GAAA,CAAI,KAAK,IAAI,CAAA;AACrC,QAAA,MAAMC,GAAAA,GAAK,EAAA,CAAG,OAAA,CAAQ,GAAA,CAAI,KAAK,EAAE,CAAA;AACjC,QAAA,MAAM,UAAA,GAAa,kBAAA,CAAmB,EAAA,CAAG,GAAA,EAAKD,OAAMC,GAAE,CAAA;AACtD,QAAA,MAAM,KAAA,GAAQ,WAAW,CAAC,CAAA;AAC1B,QAAA,MAAM,IAAA,GAAO,UAAA,CAAW,UAAA,CAAW,MAAA,GAAS,CAAC,CAAA;AAC7C,QAAA,IAAI,CAAC,KAAA,IAAS,CAAC,IAAA,EAAM;AACrB,QAAA,MAAM,SAAA,GAAYtB,mBAAAA,CAAc,MAAA,CAAO,EAAA,CAAG,GAAA,EAAK,MAAM,GAAA,GAAM,CAAA,EAAG,IAAA,CAAK,GAAA,GAAM,CAAC,CAAA;AAC1E,QAAA,MAAM,WAAA,GAAc6B,kBAAY,MAAA,CAAO,EAAE,KAAK,EAAA,CAAG,GAAA,EAAK,SAAA,EAAW,SAAA,EAAW,CAAA;AAC5E,QAAAV,uBAAAA,CAAa,YAAY,CAAA,CAAE,WAAA,EAAa,CAAC,MAAA,KAAW;AAClD,UAAA,KAAA,MAAW,IAAA,IAAQ,OAAO,KAAA,EAAO;AAC/B,YAAA,EAAA,CAAG,KAAK,IAAI,CAAA;AAAA,UACd;AAAA,QACF,CAAC,CAAA;AAAA,MACH;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,KAAA,MAAW,QAAQ,aAAA,EAAe;AAChC,QAAA,MAAME,KAAAA,GAAO,EAAA,CAAG,OAAA,CAAQ,GAAA,CAAI,KAAK,IAAI,CAAA;AACrC,QAAA,MAAMC,GAAAA,GAAK,EAAA,CAAG,OAAA,CAAQ,GAAA,CAAI,KAAK,EAAE,CAAA;AACjC,QAAA,MAAM,UAAA,GAAa,kBAAA,CAAmB,EAAA,CAAG,GAAA,EAAKD,OAAMC,GAAE,CAAA;AACtD,QAAA,MAAM,YAAA,GAAe,WAAW,MAAA,GAAS,CAAA,IAAK,WAAW,KAAA,CAAM,CAAC,CAAA,KAAM,CAAA,CAAE,YAAY,CAAA;AACpF,QAAA,MAAM,cAAA,GAAiB,WAAW,MAAA,GAAS,CAAA,IAAK,WAAW,KAAA,CAAM,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,CAAA;AAEpF,QAAA,IAAI,YAAA,EAAc;AAChB,UAAA;AAAA,QACF,WAAW,cAAA,EAAgB;AAEzB,UAAA,MAAM,QAAA,GAAW,WAAW,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,YAAA,KAAiB,IAAI,CAAA,EAAG,YAAA;AAClE,UAAA,IAAI,QAAA,KAAa,IAAA,IAAQ,QAAA,KAAa,MAAA,EAAW;AACjD,UAAA,MAAM,QAAA,GAAW,EAAA,CAAG,GAAA,CAAI,MAAA,CAAO,QAAQ,CAAA;AACvC,UAAA,IAAI,CAAC,QAAA,EAAU;AACf,UAAA,MAAM,aAAa,QAAA,CAAS,UAAA;AAC5B,UAAA,IAAI,UAAA,IAAc,UAAA,CAAW,IAAA,KAAS,YAAA,EAAc;AAElD,YAAA,MAAM,WAAqB,EAAC;AAC5B,YAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,KAAA,KAAU;AAC1B,cAAA,QAAA,CAAS,IAAA,CAAK,aAAa,MAAA,CAAO,KAAA,CAAM,OAAO,KAAA,CAAM,OAAA,EAAS,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,YAC5E,CAAC,CAAA;AACD,YAAA,EAAA,CAAG,WAAA,CAAY,UAAU,QAAA,GAAW,QAAA,CAAS,UAAU,QAAA,CAAS,MAAA,CAAO,UAAA,EAAY,QAAQ,CAAC,CAAA;AAAA,UAC9F,CAAA,MAAO;AACL,YAAA,EAAA,CAAG,aAAA,CAAc,QAAA,EAAU,QAAA,EAAU,UAAU,CAAA;AAAA,UACjD;AAAA,QACF,CAAA,MAAO;AAEL,UAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,GAAA,CAAI,OAAA,CAAQD,KAAI,CAAA;AACjC,UAAA,MAAM,GAAA,GAAM,EAAA,CAAG,GAAA,CAAI,OAAA,CAAQC,GAAE,CAAA;AAC7B,UAAA,MAAM,UAAA,GAAa,KAAA,CAAM,UAAA,CAAW,GAAG,CAAA;AACvC,UAAA,IAAI,CAAC,UAAA,EAAY;AACjB,UAAAQ,0BAAA,CAAgB,EAAA,EAAI,UAAA,EAAY,QAAA,EAAU,UAAU,CAAA;AAAA,QACtD;AAAA,MACF;AAAA,IACF;AAEA,IAAA,QAAA,CAAS,EAAA,CAAG,gBAAgB,CAAA;AAC5B,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,MAAM,EAAE,IAAA,EAAM,EAAA,EAAG,GAAI,EAAA,CAAG,SAAA;AAmBxB,EAAA,IAAI,SAAS,EAAA,EAAI;AACf,IAAA,MAAM,GAAA,GAAM,wBAAA,CAAyB,EAAA,CAAG,SAAA,CAAU,KAAK,CAAA;AACvD,IAAA,IAAI,KAAK,gBAAA,EAAkB;AACzB,MAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AACtB,MAAA,MAAM,UAAA,GAAa,EAAA,CAAG,SAAA,CAAU,KAAA,CAAM,UAAA,EAAW;AACjD,MAAA,IAAI,cAAcA,0BAAA,CAAgB,EAAA,EAAI,UAAA,EAAY,QAAA,EAAU,UAAU,CAAA,EAAG;AACvE,QAAA,iBAAA,CAAkB,IAAI,QAAQ,CAAA;AAC9B,QAAA,gBAAA,CAAiB,IAAI,QAAQ,CAAA;AAC7B,QAAA,QAAA,CAAS,EAAA,CAAG,gBAAgB,CAAA;AAC5B,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IAIF;AAAA,EACF;AAEA,EAAA,MAAM,aAAA,GAAgB,kBAAA,CAAmB,EAAA,CAAG,GAAA,EAAK,MAAM,EAAE,CAAA;AAEzD,EAAA,MAAM,eAAA,GAAkB,cAAc,MAAA,GAAS,CAAA,IAAK,cAAc,KAAA,CAAM,CAAC,CAAA,KAAM,CAAA,CAAE,YAAY,CAAA;AAC7F,EAAA,MAAM,aAAA,GAAgB,cAAc,MAAA,GAAS,CAAA,IAAK,cAAc,KAAA,CAAM,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,CAAA;AAGzF,EAAA,IAAI,eAAA,EAAiB;AACnB,IAAA,MAAM,KAAA,GAAQ,cAAc,CAAC,CAAA;AAC7B,IAAA,MAAM,IAAA,GAAO,aAAA,CAAc,aAAA,CAAc,MAAA,GAAS,CAAC,CAAA;AACnD,IAAA,IAAI,CAAC,KAAA,IAAS,CAAC,IAAA,EAAM,OAAO,KAAA;AAC5B,IAAA,MAAM,SAAA,GAAY9B,mBAAAA,CAAc,MAAA,CAAO,EAAA,CAAG,GAAA,EAAK,MAAM,GAAA,GAAM,CAAA,EAAG,IAAA,CAAK,GAAA,GAAM,CAAC,CAAA;AAC1E,IAAA,MAAM,WAAA,GAAc6B,kBAAY,MAAA,CAAO;AAAA,MACrC,KAAK,EAAA,CAAG,GAAA;AAAA,MACR,SAAA,EAAW;AAAA,KACZ,CAAA;AACD,IAAA,OAAOV,uBAAAA,CAAa,YAAY,CAAA,CAAE,WAAA,EAAa,QAAQ,CAAA;AAAA,EACzD;AAGA,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,MAAM,QAAA,GAAW,cAAc,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,YAAA,KAAiB,IAAI,CAAA,EAAG,YAAA;AACrE,IAAA,IAAI,QAAA,KAAa,MAAA,IAAa,QAAA,KAAa,IAAA,EAAM,OAAO,KAAA;AAExD,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,QAAA,GAAW,EAAA,CAAG,GAAA,CAAI,MAAA,CAAO,QAAQ,CAAA;AACvC,IAAA,IAAI,CAAC,UAAU,OAAO,KAAA;AAEtB,IAAA,MAAM,aAAa,QAAA,CAAS,UAAA;AAC5B,IAAA,IAAI,UAAA,IAAc,UAAA,CAAW,IAAA,KAAS,YAAA,EAAc;AAClD,MAAA,MAAM,YAAA,GAAe,EAAA,CAAG,SAAA,CAAU,IAAA,GAAO,QAAA;AACzC,MAAA,MAAM,WAAqB,EAAC;AAC5B,MAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,KAAA,KAAU;AAC1B,QAAA,QAAA,CAAS,IAAA,CAAK,aAAa,MAAA,CAAO,KAAA,CAAM,OAAO,KAAA,CAAM,OAAA,EAAS,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,MAC5E,CAAC,CAAA;AACD,MAAA,MAAM,OAAA,GAAU,QAAA,CAAS,MAAA,CAAO,UAAA,EAAY,QAAQ,CAAA;AACpD,MAAA,EAAA,CAAG,WAAA,CAAY,QAAA,EAAU,QAAA,GAAW,QAAA,CAAS,UAAU,OAAO,CAAA;AAC9D,MAAA,MAAM,WAAW,QAAA,GAAW,IAAA,CAAK,IAAI,YAAA,EAAc,OAAA,CAAQ,WAAW,CAAC,CAAA;AACvE,MAAA,EAAA,CAAG,YAAA,CAAanB,oBAAc,IAAA,CAAK,EAAA,CAAG,IAAI,OAAA,CAAQ,QAAQ,CAAC,CAAC,CAAA;AAAA,IAC9D,CAAA,MAAO;AACL,MAAA,EAAA,CAAG,aAAA,CAAc,QAAA,EAAU,QAAA,EAAU,UAAU,CAAA;AAAA,IACjD;AAEA,IAAA,QAAA,CAAS,EAAE,CAAA;AACX,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,MAAM,eAAe,aAAA,CAAc,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,UAAU,CAAA;AAE7D,EAAA,IAAI,YAAA,CAAa,WAAW,CAAA,EAAG;AAE7B,IAAA,MAAM,EAAE,KAAA,EAAO,GAAA,EAAK,GAAA,EAAK,GAAA,KAAQ,EAAA,CAAG,SAAA;AACpC,IAAA,MAAM,EAAA,GAAK,GAAA,CAAI,UAAA,CAAW,GAAG,CAAA;AAC7B,IAAA,IAAI,CAAC,IAAI,OAAO,KAAA;AAChB,IAAA,IAAI,CAAC8B,2BAAgB,QAAA,GAAW,EAAA,GAAK,MAAM,EAAA,EAAI,QAAA,EAAU,UAAU,CAAA,EAAG,OAAO,KAAA;AAC7E,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,iBAAA,CAAkB,IAAI,QAAQ,CAAA;AAC9B,MAAA,gBAAA,CAAiB,IAAI,QAAQ,CAAA;AAC7B,MAAA,QAAA,CAAS,EAAA,CAAG,gBAAgB,CAAA;AAAA,IAC9B;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAKA,EAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAGtB,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,MAAM,gBAA0B,EAAC;AACjC,EAAA,KAAA,MAAW,SAAS,YAAA,EAAc;AAChC,IAAA,MAAM,IAAA,GAAO,EAAA,CAAG,GAAA,CAAI,OAAA,CAAQ,MAAM,GAAG,CAAA;AACrC,IAAA,KAAA,IAAS,CAAA,GAAI,IAAA,CAAK,KAAA,EAAO,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AACpC,MAAA,MAAM,MAAA,GAAA,CAAU,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,CAAE,KAAK,IAAA,CAAK,KAAA,IAAS,EAAA,EAAI,KAAA,CAAM,KAAK,CAAA;AAC/D,MAAA,IAAI,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,EAAG;AAC3B,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA;AAC1B,QAAA,IAAI,CAAC,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,EAAG;AACnB,UAAA,IAAA,CAAK,IAAI,IAAI,CAAA;AACb,UAAA,aAAA,CAAc,KAAK,IAAI,CAAA;AAAA,QACzB;AACA,QAAA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,aAAA,CAAc,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,CAAC,CAAA;AAClC,EAAA,KAAA,MAAW,OAAO,aAAA,EAAe;AAC/B,IAAA,MAAM,QAAA,GAAW,EAAA,CAAG,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA;AAClC,IAAA,IAAI,CAAC,QAAA,EAAU;AACf,IAAA,MAAM,WAAqB,EAAC;AAC5B,IAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,IAAA,KAAS;AACzB,MAAA,IAAA,CAAK,QAAQ,CAAC,KAAA,KAAU,QAAA,CAAS,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,IAC9C,CAAC,CAAA;AACD,IAAA,EAAA,CAAG,WAAA,CAAY,GAAA,EAAK,GAAA,GAAM,QAAA,CAAS,UAAU,QAAQ,CAAA;AAAA,EACvD;AAKA,EAAA,MAAM,UAAA,GAAa,EAAA,CAAG,OAAA,CAAQ,GAAA,CAAI,MAAM,EAAE,CAAA;AAC1C,EAAA,MAAM,QAAA,GAAW,EAAA,CAAG,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAC,CAAA;AACrC,EAAA,MAAM,SAAA,GAAY,EAAA,CAAG,GAAA,CAAI,OAAA,CAAQ,UAAU,CAAA;AAC3C,EAAA,MAAM,OAAA,GAAU,EAAA,CAAG,GAAA,CAAI,OAAA,CAAQ,QAAQ,CAAA;AACvC,EAAA,MAAM,SAAA,GAAY,SAAA,CAAU,UAAA,CAAW,OAAO,CAAA;AAC9C,EAAA,IAAI,CAAC,WAAW,OAAO,KAAA;AACvB,EAAAA,0BAAA,CAAgB,EAAA,EAAI,SAAA,EAAW,QAAA,EAAU,UAAU,CAAA;AAGnD,EAAA,iBAAA,CAAkB,IAAI,QAAQ,CAAA;AAC9B,EAAA,gBAAA,CAAiB,IAAI,QAAQ,CAAA;AAE7B,EAAA,QAAA,CAAS,EAAA,CAAG,gBAAgB,CAAA;AAC5B,EAAA,OAAO,IAAA;AACT;;;ACnVK,IAAM,gBAAA,GACX,CAAC,UAAA,EAAoB,UAAA,KACrB,CAAC,EAAE,KAAA,EAAO,EAAA,EAAI,QAAA,EAAS,KAAM;AAC3B,EAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,KAAA,CAAM,UAAU,CAAA,IAAK,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,UAAU,CAAA;AAE5E,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,EAAE,IAAA,EAAM,EAAA,EAAG,GAAI,EAAA,CAAG,SAAA;AACxB,EAAA,MAAM,cAAiE,EAAC;AACxE,EAAA,MAAM,cAAmF,EAAC;AAI1F,EAAA,IAAI,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,UAAU,CAAA,EAAG;AAClC,IAAA,EAAA,CAAG,IAAI,YAAA,CAAa,IAAA,EAAM,EAAA,EAAI,CAAC,MAAM,GAAA,KAAQ;AAC3C,MAAA,IAAI,IAAA,CAAK,IAAA,CAAK,IAAA,KAAS,UAAA,EAAY;AACjC,QAAA,WAAA,CAAY,IAAA,CAAK,EAAE,GAAA,EAAK,KAAA,EAAO,EAAE,GAAG,IAAA,CAAK,KAAA,EAAO,GAAG,UAAA,EAAW,EAAG,CAAA;AAAA,MACnE;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAGA,EAAA,IAAI,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,UAAU,CAAA,EAAG;AAClC,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,UAAU,CAAA;AAC9C,IAAA,EAAA,CAAG,IAAI,YAAA,CAAa,IAAA,EAAM,EAAA,EAAI,CAAC,MAAM,GAAA,KAAQ;AAC3C,MAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAEpB,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA;AACxC,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,WAAA,CAAY,IAAA,CAAK;AAAA,UACf,GAAA;AAAA,UACA,UAAU,IAAA,CAAK,QAAA;AAAA,UACf,OAAO,EAAE,GAAG,IAAA,CAAK,KAAA,EAAO,GAAG,UAAA;AAAW,SACvC,CAAA;AAAA,MACH;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,UAAA,GAAa,WAAA,CAAY,MAAA,GAAS,CAAA,IAAK,YAAY,MAAA,GAAS,CAAA;AAElE,EAAA,IAAI,cAAc,QAAA,EAAU;AAE1B,IAAA,KAAA,MAAW,UAAU,WAAA,EAAa;AAChC,MAAA,EAAA,CAAG,aAAA,CAAc,MAAA,CAAO,GAAA,EAAK,MAAA,EAAW,OAAO,KAAK,CAAA;AAAA,IACtD;AAGA,IAAA,IAAI,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,UAAU,CAAA,EAAG;AAClC,MAAA,MAAM,QAAA,GAAW,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,UAAU,CAAA;AAC9C,MAAA,KAAA,MAAW,UAAU,WAAA,EAAa;AAChC,QAAA,MAAM,OAAA,GAAU,QAAA,CAAS,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA;AAC5C,QAAA,EAAA,CAAG,WAAW,MAAA,CAAO,GAAA,EAAK,OAAO,GAAA,GAAM,MAAA,CAAO,UAAU,QAAQ,CAAA;AAChE,QAAA,EAAA,CAAG,QAAQ,MAAA,CAAO,GAAA,EAAK,OAAO,GAAA,GAAM,MAAA,CAAO,UAAU,OAAO,CAAA;AAAA,MAC9D;AAAA,IACF;AAEA,IAAA,QAAA,CAAS,EAAE,CAAA;AAAA,EACb;AAEA,EAAA,OAAO,UAAA;AACT;AAWK,IAAM,eAAA,GACX,CAAC,UAAA,EAAoB,aAAA,KACrB,CAAC,EAAE,KAAA,EAAO,EAAA,EAAI,QAAA,EAAS,KAAM;AAC3B,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,UAAU,CAAA;AAC9C,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,UAAU,CAAA;AAE9C,EAAA,IAAI,CAAC,QAAA,IAAY,CAAC,QAAA,EAAU;AAC1B,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,EAAE,IAAA,EAAM,EAAA,EAAG,GAAI,EAAA,CAAG,SAAA;AACxB,EAAA,MAAM,cAAiE,EAAC;AACxE,EAAA,MAAM,cAAmF,EAAC;AAI1F,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,MAAM,YAAA,GAAwB,QAAA,CAAS,IAAA,CAAK,KAAA,GAAQ,aAAa,CAAA,EAAG,OAAA;AAEpE,IAAA,EAAA,CAAG,IAAI,YAAA,CAAa,IAAA,EAAM,EAAA,EAAI,CAAC,MAAM,GAAA,KAAQ;AAC3C,MAAA,IAAI,IAAA,CAAK,SAAS,QAAA,EAAU;AAC1B,QAAA,WAAA,CAAY,IAAA,CAAK;AAAA,UACf,GAAA;AAAA,UACA,KAAA,EAAO,EAAE,GAAG,IAAA,CAAK,OAAO,CAAC,aAAa,GAAG,YAAA;AAAa,SACvD,CAAA;AAAA,MACH;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAGA,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,MAAM,YAAA,GAAwB,QAAA,CAAS,IAAA,CAAK,KAAA,GAAQ,aAAa,CAAA,EAAG,OAAA;AAEpE,IAAA,EAAA,CAAG,IAAI,YAAA,CAAa,IAAA,EAAM,EAAA,EAAI,CAAC,MAAM,GAAA,KAAQ;AAC3C,MAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAEpB,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA;AACxC,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,WAAA,CAAY,IAAA,CAAK;AAAA,UACf,GAAA;AAAA,UACA,UAAU,IAAA,CAAK,QAAA;AAAA,UACf,KAAA,EAAO,EAAE,GAAG,IAAA,CAAK,OAAO,CAAC,aAAa,GAAG,YAAA;AAAa,SACvD,CAAA;AAAA,MACH;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,UAAA,GAAa,WAAA,CAAY,MAAA,GAAS,CAAA,IAAK,YAAY,MAAA,GAAS,CAAA;AAElE,EAAA,IAAI,cAAc,QAAA,EAAU;AAE1B,IAAA,KAAA,MAAW,UAAU,WAAA,EAAa;AAChC,MAAA,EAAA,CAAG,aAAA,CAAc,MAAA,CAAO,GAAA,EAAK,MAAA,EAAW,OAAO,KAAK,CAAA;AAAA,IACtD;AAGA,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,KAAA,MAAW,UAAU,WAAA,EAAa;AAChC,QAAA,MAAM,OAAA,GAAU,QAAA,CAAS,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA;AAC5C,QAAA,EAAA,CAAG,WAAW,MAAA,CAAO,GAAA,EAAK,OAAO,GAAA,GAAM,MAAA,CAAO,UAAU,QAAQ,CAAA;AAChE,QAAA,EAAA,CAAG,QAAQ,MAAA,CAAO,GAAA,EAAK,OAAO,GAAA,GAAM,MAAA,CAAO,UAAU,OAAO,CAAA;AAAA,MAC9D;AAAA,IACF;AAEA,IAAA,QAAA,CAAS,EAAE,CAAA;AAAA,EACb;AAEA,EAAA,OAAO,UAAA;AACT;;;AC7FK,IAAM,eAAA,GAA8B;AAAA,EACzC,KAAA;AAAA,EACA,IAAA;AAAA,EACA,UAAA;AAAA,EACA,YAAA;AAAA,EACA,UAAA;AAAA,EACA,eAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA;AAAA,EACA,eAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA,IAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAA;AAAA,EACA,kBAAA;AAAA,EACA,gBAAA;AAAA,EACA;AACF;ACRO,SAAS,kBAAkB,OAAA,EAAiD;AACjF,EAAA,MAAM,EAAE,MAAA,EAAQ,EAAA,EAAI,UAAU,KAAA,EAAO,GAAA,EAAK,UAAS,GAAI,OAAA;AAEvD,EAAA,OAAO;AAAA;AAAA;AAAA,IAGL,MAAA;AAAA,IACA,KAAA,EAAO,OAAO,IAAA,CAAK,KAAA;AAAA,IACnB,EAAA;AAAA,IACA,QAAA;AAAA,IACA,KAAA;AAAA,IACA,GAAA;AAAA,IACA,UAAU,QAAA;AAAS,GACrB;AACF;AAcO,SAAS,2BAA2B,QAAA,EAAkD;AAC3F,EAAA,OAAO,CAAC,WAAA,KAAmC;AACzC,IAAA,IAAI,gBAAgB,QAAA,EAAU;AAC5B,MAAA,KAAA,MAAW,IAAA,IAAQ,YAAY,KAAA,EAAO;AACpC,QAAA,QAAA,CAAS,KAAK,IAAI,CAAA;AAAA,MACpB;AAOA,MAAA,MAAM,OAAQ,WAAA,CAA6D,IAAA;AAC3E,MAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,EAAG;AACnC,QAAA,QAAA,CAAS,OAAA,CAAQ,GAAA,EAAK,IAAA,CAAK,GAAG,CAAC,CAAA;AAAA,MACjC;AAOA,MAAA,IAAI,YAAY,YAAA,EAAc;AAC5B,QAAA,MAAM,EAAE,IAAA,EAAM,EAAA,EAAG,GAAI,WAAA,CAAY,SAAA;AACjC,QAAA,IAAI;AACF,UAAA,QAAA,CAAS,aAAa9B,mBAAAA,CAAc,MAAA,CAAO,SAAS,GAAA,EAAK,IAAA,EAAM,EAAE,CAAC,CAAA;AAAA,QACpE,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAA;AACF;;;AClFO,IAAM,eAAN,MAAmB;AAAA,EACP,MAAA;AAAA,EACA,WAAA;AAAA,EACA,EAAA;AAAA,EACT,cAAA,GAAiB,IAAA;AAAA;AAAA,EAEjB,YAAA,GAAuC,IAAA;AAAA;AAAA,EAEvC,QAAA,GAAgC,IAAA;AAAA;AAAA,EAEhC,aAAA,GAAgB,CAAA;AAAA;AAAA,EAEhB,YAAA,GAAoC,IAAA;AAAA;AAAA,EAEpC,qBAAA,GAA+C,IAAA;AAAA;AAAA,EAE/C,kBAAA,GAAyC,IAAA;AAAA,EAEjD,YAAY,OAAA,EAA8B;AACxC,IAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA;AACtB,IAAA,IAAA,CAAK,cAAc,OAAA,CAAQ,WAAA;AAE3B,IAAA,IAAA,CAAK,KAAK,OAAA,CAAQ,EAAA,IAAM,OAAA,CAAQ,MAAA,CAAO,KAAK,KAAA,CAAM,EAAA;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,iBAAA,GAAkC;AACxC,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,OAAO,IAAA,CAAK,YAAA;AAAA,IACd;AAEA,IAAA,MAAM,EAAE,MAAA,EAAQ,EAAA,EAAG,GAAI,IAAA;AAEvB,IAAA,IAAA,CAAK,eAAe,iBAAA,CAAkB;AAAA,MACpC,MAAA;AAAA,MACA,EAAA;AAAA,MACA,QAAA,EAAU,2BAA2B,EAAE,CAAA;AAAA,MACvC,KAAA,EAAO,MAAM,IAAA,CAAK,KAAA,EAAM;AAAA,MACxB,GAAA,EAAK,MAAM,IAAA,CAAK,gBAAA,EAAiB;AAAA,MACjC,QAAA,EAAU,MAAM,IAAA,CAAK,mBAAA;AAAoB,KAC1C,CAAA;AAED,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAA,GAAsC;AAC5C,IAAA,IAAI,KAAK,qBAAA,EAAuB;AAC9B,MAAA,OAAO,IAAA,CAAK,qBAAA;AAAA,IACd;AAEA,IAAA,MAAM,EAAE,aAAY,GAAI,IAAA;AAExB,IAAA,IAAA,CAAK,qBAAA,GAAwB,IAAI,KAAA,CAAM,EAAC,EAAqB;AAAA,MAC3D,GAAA,EAAK,CAAC,CAAA,EAAG,IAAA,KAAiB;AACxB,QAAA,MAAM,UAAA,GAAa,YAAY,IAAI,CAAA;AACnC,QAAA,IAAI,CAAC,UAAA,EAAY;AACf,UAAA,OAAO,MAAM,KAAA;AAAA,QACf;AACA,QAAA,OAAO,IAAI,IAAA,KAAoB;AAC7B,UAAA,MAAM,KAAA,GAAQ,KAAK,iBAAA,EAAkB;AACrC,UAAA,OAAQ,UAAA,CAA4C,GAAG,IAAI,CAAA,CAAE,KAAK,CAAA;AAAA,QACpE,CAAA;AAAA,MACF;AAAA,KACD,CAAA;AAED,IAAA,OAAO,IAAA,CAAK,qBAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAA,GAAgC;AACtC,IAAA,IAAI,KAAK,kBAAA,EAAoB;AAC3B,MAAA,OAAO,IAAA,CAAK,kBAAA;AAAA,IACd;AAEA,IAAA,MAAM,EAAE,MAAA,EAAQ,WAAA,EAAa,EAAA,EAAG,GAAI,IAAA;AAEpC,IAAA,IAAA,CAAK,kBAAA,GAAqB,IAAI,KAAA,CAAM,EAAC,EAAkB;AAAA,MACrD,GAAA,EAAK,CAAC,CAAA,EAAG,IAAA,KAAiB;AACxB,QAAA,IAAI,SAAS,OAAA,EAAS;AAEpB,UAAA,OAAO,MAAM,KAAK,qBAAA,EAAsB;AAAA,QAC1C;AAEA,QAAA,MAAM,UAAA,GAAa,YAAY,IAAI,CAAA;AACnC,QAAA,IAAI,CAAC,UAAA,EAAY;AACf,UAAA,OAAO,MAAM,KAAA;AAAA,QACf;AACA,QAAA,OAAO,IAAI,IAAA,KAAoB;AAE7B,UAAA,MAAM,KAAA,GAAsB;AAAA,YAC1B,MAAA;AAAA,YACA,KAAA,EAAO,OAAO,IAAA,CAAK,KAAA;AAAA,YACnB,EAAA;AAAA,YACA,QAAA,EAAU,MAAA;AAAA,YACV,KAAA,EAAO,MAAM,IAAA,CAAK,KAAA,EAAM;AAAA,YACxB,GAAA,EAAK,MAAM,IAAA,CAAK,gBAAA,EAAiB;AAAA,YACjC,QAAA,EAAU,KAAK,mBAAA;AAAoB,WACrC;AACA,UAAA,OAAQ,UAAA,CAA4C,GAAG,IAAI,CAAA,CAAE,KAAK,CAAA;AAAA,QACpE,CAAA;AAAA,MACF;AAAA,KACD,CAAA;AAED,IAAA,OAAO,IAAA,CAAK,kBAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKQ,qBAAA,GAAyC;AAC/C,IAAA,MAAM,EAAE,MAAA,EAAQ,WAAA,EAAa,EAAA,EAAG,GAAI,IAAA;AACpC,IAAA,IAAI,YAAA,GAAe,IAAA;AAEnB,IAAA,MAAM,aAAA,GAAgB,IAAI,KAAA,CAAM,EAAC,EAAsB;AAAA,MACrD,GAAA,EAAK,CAAC,CAAA,EAAG,IAAA,KAAiB;AACxB,QAAA,IAAI,SAAS,KAAA,EAAO;AAClB,UAAA,OAAO,MAAM,YAAA;AAAA,QACf;AAEA,QAAA,MAAM,UAAA,GAAa,YAAY,IAAI,CAAA;AACnC,QAAA,IAAI,CAAC,UAAA,EAAY;AACf,UAAA,OAAO,MAAM;AACX,YAAA,YAAA,GAAe,KAAA;AACf,YAAA,OAAO,aAAA;AAAA,UACT,CAAA;AAAA,QACF;AAEA,QAAA,OAAO,IAAI,IAAA,KAAoB;AAE7B,UAAA,MAAM,KAAA,GAAsB;AAAA,YAC1B,MAAA;AAAA,YACA,KAAA,EAAO,OAAO,IAAA,CAAK,KAAA;AAAA,YACnB,EAAA;AAAA,YACA,QAAA,EAAU,MAAA;AAAA,YACV,KAAA,EAAO,MAAM,IAAA,CAAK,KAAA,EAAM;AAAA,YACxB,GAAA,EAAK,MAAM,IAAA,CAAK,gBAAA,EAAiB;AAAA,YACjC,QAAA,EAAU,KAAK,mBAAA;AAAoB,WACrC;AACA,UAAA,MAAM,MAAA,GAAU,UAAA,CAA4C,GAAG,IAAI,EAAE,KAAK,CAAA;AAC1E,UAAA,IAAI,CAAC,MAAA,EAAQ;AACX,YAAA,YAAA,GAAe,KAAA;AAAA,UACjB;AACA,UAAA,OAAO,aAAA;AAAA,QACT,CAAA;AAAA,MACF;AAAA,KACD,CAAA;AAED,IAAA,OAAO,aAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,QAAQ,EAAA,EAA4C;AAClD,IAAA,MAAM,eAAe,IAAA,CAAK,aAAA,EAAA;AAC1B,IAAA,MAAM,KAAA,GAAQ,KAAK,iBAAA,EAAkB;AACrC,IAAA,MAAM,MAAA,GAAS,GAAG,KAAK,CAAA;AACvB,IAAA,IAAI,CAAC,MAAA,IAAU,CAAC,IAAA,CAAK,QAAA,EAAU;AAC7B,MAAA,IAAA,CAAK,cAAA,GAAiB,KAAA;AACtB,MAAA,IAAA,CAAK,QAAA,GAAW,EAAE,OAAA,EAAS,SAAA,EAAW,MAAM,CAAC,EAAE,CAAA,EAAG,KAAA,EAAO,YAAA,EAAa;AAAA,IACxE;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,UAAA,GAAkC;AAChC,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,GAAA,GAAe;AACb,IAAA,MAAM,EAAE,MAAA,EAAQ,EAAA,EAAI,cAAA,EAAe,GAAI,IAAA;AAEvC,IAAA,IAAI,OAAO,WAAA,EAAa;AACtB,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,MAAA,OAAO,KAAA;AAAA,IACT;AAGA,IAAA,IAAI,EAAA,CAAG,MAAM,MAAA,KAAW,CAAA,IAAK,CAAC,EAAA,CAAG,YAAA,IAAgB,CAAC,EAAA,CAAG,cAAA,EAAgB;AACnE,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAA,CAAO,IAAA,CAAK,SAAS,EAAE,CAAA;AACvB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,KAAA,GAAyB;AACvB,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,OAAO,IAAA,CAAK,YAAA;AAAA,IACd;AAEA,IAAA,MAAM,EAAE,aAAY,GAAI,IAAA;AAGxB,IAAA,MAAM,KAAA,GAAyB,IAAI,KAAA,CAAM,EAAC,EAAsB;AAAA,MAC9D,GAAA,EAAK,CAAC,CAAA,EAAG,IAAA,KAAiB;AAExB,QAAA,IAAI,SAAS,KAAA,EAAO;AAClB,UAAA,OAAO,MAAM,KAAK,GAAA,EAAI;AAAA,QACxB;AAEA,QAAA,IAAI,SAAS,YAAA,EAAc;AACzB,UAAA,OAAO,MAAM,KAAK,UAAA,EAAW;AAAA,QAC/B;AAEA,QAAA,IAAI,SAAS,SAAA,EAAW;AACtB,UAAA,OAAO,CAAC,EAAA,KAAyC;AAC/C,YAAA,IAAA,CAAK,QAAQ,EAAE,CAAA;AACf,YAAA,OAAO,KAAA;AAAA,UACT,CAAA;AAAA,QACF;AAGA,QAAA,MAAM,UAAA,GAAa,YAAY,IAAI,CAAA;AACnC,QAAA,IAAI,CAAC,UAAA,EAAY;AACf,UAAA,OAAO,IAAI,IAAA,KAAoB;AAC7B,YAAA,MAAM,eAAe,IAAA,CAAK,aAAA,EAAA;AAC1B,YAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAClB,cAAA,IAAA,CAAK,cAAA,GAAiB,KAAA;AACtB,cAAA,IAAA,CAAK,WAAW,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,OAAO,YAAA,EAAa;AAAA,YAC7D;AACA,YAAA,OAAO,KAAA;AAAA,UACT,CAAA;AAAA,QACF;AAEA,QAAA,OAAO,IAAI,IAAA,KAAoB;AAC7B,UAAA,MAAM,eAAe,IAAA,CAAK,aAAA,EAAA;AAC1B,UAAA,MAAM,KAAA,GAAQ,KAAK,iBAAA,EAAkB;AACrC,UAAA,MAAM,MAAA,GAAU,UAAA,CAA4C,GAAG,IAAI,EAAE,KAAK,CAAA;AAC1E,UAAA,IAAI,CAAC,MAAA,IAAU,CAAC,IAAA,CAAK,QAAA,EAAU;AAC7B,YAAA,IAAA,CAAK,cAAA,GAAiB,KAAA;AACtB,YAAA,IAAA,CAAK,WAAW,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,OAAO,YAAA,EAAa;AAAA,UAC7D;AACA,UAAA,OAAO,KAAA;AAAA,QACT,CAAA;AAAA,MACF;AAAA,KACD,CAAA;AAGD,IAAA,IAAA,CAAK,YAAA,GAAe,KAAA;AACpB,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAKO,SAAS,mBAAmB,OAAA,EAA+C;AAChF,EAAA,MAAM,OAAA,GAAU,IAAI,YAAA,CAAa,OAAO,CAAA;AACxC,EAAA,OAAO,QAAQ,KAAA,EAAM;AACvB;;;AC9RO,IAAM,aAAN,MAAiB;AAAA,EACL,MAAA;AAAA,EACA,WAAA;AAAA,EACA,kBAAA;AAAA,EACA,gBAAA;AAAA,EAEjB,YAAY,OAAA,EAA4B;AACtC,IAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA;AACtB,IAAA,IAAA,CAAK,cAAc,OAAA,CAAQ,WAAA;AAC3B,IAAA,IAAA,CAAK,qBAAqB,OAAA,CAAQ,kBAAA;AAClC,IAAA,IAAA,CAAK,mBAAmB,OAAA,CAAQ,gBAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,iBAAiB,EAAA,EAA+B;AACtD,IAAA,MAAM,EAAE,QAAO,GAAI,IAAA;AAEnB,IAAA,OAAO,iBAAA,CAAkB;AAAA,MACvB,MAAA;AAAA,MACA,EAAA;AAAA,MACA,QAAA,EAAU,MAAA;AAAA;AAAA,MACV,OAAO,IAAA,CAAK,kBAAA;AAAA,MACZ,GAAA,EAAK,MAAM,IAAA,CAAK,KAAA,EAAM;AAAA,MACtB,QAAA,EAAU,MAAM,IAAA,CAAK,mBAAA,CAAoB,EAAE;AAAA,KAC5C,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAAoB,EAAA,EAAiC;AAC3D,IAAA,MAAM,EAAE,aAAY,GAAI,IAAA;AAExB,IAAA,OAAO,IAAI,KAAA,CAAM,EAAC,EAAqB;AAAA,MACrC,GAAA,EAAK,CAAC,CAAA,EAAG,IAAA,KAAiB;AACxB,QAAA,MAAM,UAAA,GAAa,YAAY,IAAI,CAAA;AACnC,QAAA,IAAI,CAAC,UAAA,EAAY;AACf,UAAA,OAAO,MAAM,KAAA;AAAA,QACf;AACA,QAAA,OAAO,IAAI,IAAA,KAAoB;AAC7B,UAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,gBAAA,CAAiB,EAAE,CAAA;AACtC,UAAA,OAAQ,UAAA,CAA4C,GAAG,IAAI,CAAA,CAAE,KAAK,CAAA;AAAA,QACpE,CAAA;AAAA,MACF;AAAA,KACD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,KAAA,GAAqB;AACnB,IAAA,MAAM,EAAE,MAAA,EAAQ,WAAA,EAAY,GAAI,IAAA;AAEhC,IAAA,OAAO,IAAI,KAAA,CAAM,EAAC,EAAkB;AAAA,MAClC,GAAA,EAAK,CAAC,CAAA,EAAG,IAAA,KAAiB;AAExB,QAAA,IAAI,SAAS,OAAA,EAAS;AACpB,UAAA,OAAO,MAAM,KAAK,UAAA,EAAW;AAAA,QAC/B;AAGA,QAAA,MAAM,UAAA,GAAa,YAAY,IAAI,CAAA;AACnC,QAAA,IAAI,CAAC,UAAA,EAAY;AACf,UAAA,IAAA,CAAK,gBAAA,GAAmB,MAAM,QAAQ,CAAA;AACtC,UAAA,OAAO,MAAM,KAAA;AAAA,QACf;AAEA,QAAA,OAAO,IAAI,IAAA,KAAoB;AAC7B,UAAA,IAAI,OAAO,WAAA,EAAa;AACtB,YAAA,OAAO,KAAA;AAAA,UACT;AAEA,UAAA,MAAM,EAAA,GAAK,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,EAAA;AAC7B,UAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,gBAAA,CAAiB,EAAE,CAAA;AACtC,UAAA,OAAQ,UAAA,CAA4C,GAAG,IAAI,CAAA,CAAE,KAAK,CAAA;AAAA,QACpE,CAAA;AAAA,MACF;AAAA,KACD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAA,GAAiC;AAC/B,IAAA,MAAM,EAAE,MAAA,EAAQ,WAAA,EAAY,GAAI,IAAA;AAChC,IAAA,IAAI,YAAA,GAAe,IAAA;AACnB,IAAA,MAAM,EAAA,GAAK,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,EAAA;AAE7B,IAAA,MAAM,UAAA,GAAiC,IAAI,KAAA,CAAM,EAAC,EAAyB;AAAA,MACzE,GAAA,EAAK,CAAC,CAAA,EAAG,IAAA,KAAiB;AAExB,QAAA,IAAI,SAAS,KAAA,EAAO;AAClB,UAAA,OAAO,MAAM,YAAA;AAAA,QACf;AAGA,QAAA,MAAM,UAAA,GAAa,YAAY,IAAI,CAAA;AACnC,QAAA,IAAI,CAAC,UAAA,EAAY;AACf,UAAA,IAAA,CAAK,gBAAA,GAAmB,MAAM,OAAO,CAAA;AACrC,UAAA,OAAO,MAAM;AACX,YAAA,YAAA,GAAe,KAAA;AACf,YAAA,OAAO,UAAA;AAAA,UACT,CAAA;AAAA,QACF;AAEA,QAAA,OAAO,IAAI,IAAA,KAAoB;AAC7B,UAAA,IAAI,OAAO,WAAA,EAAa;AACtB,YAAA,YAAA,GAAe,KAAA;AACf,YAAA,OAAO,UAAA;AAAA,UACT;AAEA,UAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,gBAAA,CAAiB,EAAE,CAAA;AACtC,UAAA,MAAM,MAAA,GAAU,UAAA,CAA4C,GAAG,IAAI,EAAE,KAAK,CAAA;AAC1E,UAAA,IAAI,CAAC,MAAA,EAAQ;AACX,YAAA,YAAA,GAAe,KAAA;AAAA,UACjB;AACA,UAAA,OAAO,UAAA;AAAA,QACT,CAAA;AAAA,MACF;AAAA,KACD,CAAA;AAED,IAAA,OAAO,UAAA;AAAA,EACT;AACF;AAKO,SAAS,iBAAiB,OAAA,EAAyC;AACxE,EAAA,MAAM,OAAA,GAAU,IAAI,UAAA,CAAW,OAAO,CAAA;AACtC,EAAA,OAAO,QAAQ,KAAA,EAAM;AACvB;;;ACnJO,IAAM,iBAAN,MAAqB;AAAA,EACT,MAAA;AAAA;AAAA,EAGT,YAAA,GAAkC,IAAA;AAAA;AAAA,EAGlC,eAAA,GAAyC,IAAA;AAAA;AAAA,EAGhC,SAAA;AAAA,EAEjB,YAAY,MAAA,EAA8B;AACxC,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,SAAA,GAAY,CAAC,EAAA,KAA0B;AAC1C,MAAA,MAAA,CAAO,IAAA,CAAK,SAAS,EAAE,CAAA;AAAA,IACzB,CAAA;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,WAAA,GAA0B;AAC5B,IAAA,IAAA,CAAK,YAAA,KAAiB;AAAA,MACpB,GAAG,eAAA;AAAA,MACH,GAAG,IAAA,CAAK,MAAA,CAAO,gBAAA,CAAiB;AAAA,KAClC;AACA,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAA,CAAkB,IAAiB,QAAA,EAAoD;AAC7F,IAAA,MAAM,EAAE,QAAO,GAAI,IAAA;AAEnB,IAAA,OAAO;AAAA;AAAA;AAAA,MAGL,MAAA;AAAA,MACA,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,EAAA;AAAA,MACA,QAAA;AAAA,MACA,KAAA,EAAO,MAAM,IAAA,CAAK,KAAA,EAAM;AAAA,MACxB,GAAA,EAAK,MAAM,IAAA,CAAK,GAAA,EAAI;AAAA,MACpB,UAAU,IAAA,CAAK;AAAA,KACjB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,IAAI,QAAA,GAA2B;AAC7B,IAAA,IAAI,IAAA,CAAK,eAAA,EAAiB,OAAO,IAAA,CAAK,eAAA;AAEtC,IAAA,MAAM,EAAE,MAAA,EAAQ,WAAA,EAAY,GAAI,IAAA;AAEhC,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAI,KAAA,CAAM,EAAC,EAAqB;AAAA,MACrD,GAAA,EAAK,CAAC,CAAA,EAAG,IAAA,KAAiB;AACxB,QAAA,MAAM,UAAA,GAAa,YAAY,IAAI,CAAA;AACnC,QAAA,IAAI,CAAC,UAAA,EAAY;AACf,UAAA,OAAO,MAAM,KAAA;AAAA,QACf;AAEA,QAAA,OAAO,IAAI,IAAA,KAAoB;AAC7B,UAAA,IAAI,OAAO,WAAA,EAAa;AACtB,YAAA,OAAO,KAAA;AAAA,UACT;AAGA,UAAA,MAAM,EAAA,GAAK,OAAO,KAAA,CAAM,EAAA;AAExB,UAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,iBAAA,CAAkB,EAAA,EAAI,KAAK,SAAS,CAAA;AACvD,UAAA,OAAQ,UAAA,CAA4C,GAAG,IAAI,CAAA,CAAE,KAAK,CAAA;AAAA,QACpE,CAAA;AAAA,MACF;AAAA,KACD,CAAA;AAED,IAAA,OAAO,IAAA,CAAK,eAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,KAAA,GAAyB;AACvB,IAAA,MAAM,EAAE,MAAA,EAAQ,WAAA,EAAY,GAAI,IAAA;AAEhC,IAAA,OAAO,kBAAA,CAAmB;AAAA,MACxB,MAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,GAAA,GAAmB;AACjB,IAAA,MAAM,EAAE,MAAA,EAAQ,WAAA,EAAY,GAAI,IAAA;AAEhC,IAAA,OAAO,gBAAA,CAAiB;AAAA,MACtB,MAAA;AAAA,MACA,WAAA;AAAA,MACA,kBAAA,EAAoB,MAAM,IAAA,CAAK,KAAA;AAAM,KACtC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAA,GAAmB;AACjB,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AAAA,EACzB;AACF;;;ACxHA,IAAM,aAAA,GAAwC;AAAA;AAAA,EAE5C,aAAA,EAAe,SAAA;AAAA,EACf,cAAA,EAAgB,SAAA;AAAA,EAChB,mBAAA,EAAqB,SAAA;AAAA,EACrB,wBAAA,EAA0B,SAAA;AAAA,EAC1B,WAAA,EAAa,SAAA;AAAA;AAAA,EAGb,YAAA,EAAc,SAAA;AAAA;AAAA,EAGd,WAAA,EAAa,SAAA;AAAA,EACb,gBAAA,EAAkB,SAAA;AAAA,EAClB,cAAA,EAAgB,SAAA;AAAA,EAChB,WAAA,EAAa,SAAA;AAAA,EACb,aAAA,EAAe,SAAA;AAAA,EACf,eAAA,EAAiB,SAAA;AAAA,EACjB,eAAA,EAAiB,SAAA;AAAA,EACjB,oBAAA,EAAsB,SAAA;AAAA,EACtB,qBAAA,EAAuB,SAAA;AAAA,EACvB,kBAAA,EAAoB,SAAA;AAAA;AAAA,EAGpB,aAAA,EAAe,SAAA;AAAA,EACf,aAAA,EAAe,SAAA;AAAA;AAAA,EAGf,eAAA,EAAiB,SAAA;AAAA,EACjB,aAAA,EAAe,SAAA;AAAA;AAAA,EAGf,cAAA,EAAgB,SAAA;AAAA,EAChB,WAAA,EAAa,SAAA;AAAA,EACb,cAAA,EAAgB,SAAA;AAAA;AAAA,EAGhB,WAAA,EAAa,SAAA;AAAA,EACb,YAAA,EAAc,SAAA;AAAA,EACd,mBAAA,EAAqB,SAAA;AAAA,EACrB,sBAAA,EAAwB,SAAA;AAAA;AAAA,EAGxB,cAAA,EAAgB,SAAA;AAAA,EAChB,aAAA,EAAe,SAAA;AAAA;AAAA,EAGf,eAAA,EAAiB,SAAA;AAAA,EACjB,eAAA,EAAiB;AACnB,CAAA;AAQA,IAAM,QAAA,GAA0B;AAAA,EAC9B,gBAAA,EAAkB,mBAAA;AAAA,EAClB,eAAA,EAAiB,SAAA;AAAA,EACjB,WAAA,EAAa,mBAAA;AAAA,EACb,aAAA,EAAe,SAAA;AAAA,EACf,MAAA,EAAQ,SAAA;AAAA,EACR,QAAA,EAAU,uEAAA;AAAA,EACV,UAAA,EAAY,mBAAA;AAAA,EACZ,WAAA,EAAa,SAAA;AAAA,EACb,aAAA,EAAe,uEAAA;AAAA,EACf,QAAA,EAAU,mBAAA;AAAA,EACV,SAAA,EAAW,SAAA;AAAA,EACX,aAAA,EAAe,mBAAA;AAAA,EACf,SAAA,EAAW,SAAA;AAAA,EACX,iBAAA,EAAmB;AACrB,CAAA;AAMA,SAAS,iBAAiB,SAAA,EAAiD;AACzE,EAAA,IAAI,CAAC,WAAW,OAAO,QAAA;AACvB,EAAA,OAAO,EAAE,GAAG,QAAA,EAAU,GAAG,SAAA,EAAU;AACrC;AAMO,SAAS,iBAAA,CAAkB,WAAwB,SAAA,EAAwC;AAChG,EAAA,MAAM,CAAA,GAAI,iBAAiB,SAAS,CAAA;AAGpC,EAAA,IAAI,WAAW,eAAA,EAAiB;AAC9B,IAAA,MAAM,aAAa,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,gBAAA,CAAiB,YAAY,CAAC,CAAA;AACtE,IAAA,KAAA,MAAW,QAAQ,UAAA,EAAY;AAC7B,MAAA,MAAM,GAAA,GAAM,KAAK,WAAA,IAAe,EAAA;AAChC,MAAA,MAAM,SAAA,GAAY,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,SAAS,CAAA,CAAE,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,UAAA,CAAW,WAAW,CAAC,CAAA;AAChF,MAAA,MAAM,WAAW,SAAA,GAAY,SAAA,CAAU,KAAA,CAAM,WAAA,CAAY,MAAM,CAAA,GAAI,IAAA;AACnE,MAAA,MAAM,WAAA,GAAc,SAAA,CAAU,eAAA,CAAgB,GAAA,EAAK,QAAQ,CAAA;AAC3D,MAAA,IAAI,gBAAgB,IAAA,EAAM;AACxB,QAAA,IAAA,CAAK,SAAA,GAAY,WAAA;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,WAAW,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,gBAAA,CAAiB,mHAAmH,CAAC,CAAA;AAE3K,EAAA,KAAA,MAAW,MAAM,QAAA,EAAU;AACzB,IAAA,MAAM,MAAM,EAAA,CAAG,OAAA;AACf,IAAA,MAAM,QAAA,GAAW,EAAA,CAAG,YAAA,CAAa,OAAO,CAAA,IAAK,EAAA;AAC7C,IAAA,IAAI,MAAA,GAAS,EAAA;AAEb,IAAA,QAAQ,GAAA;AAAK,MACX,KAAK,YAAA;AACH,QAAA,MAAA,GAAS,CAAA,aAAA,EAAgB,CAAA,CAAE,gBAAgB,CAAA,SAAA,EAAY,EAAE,eAAe,CAAA,iDAAA,CAAA;AACxE,QAAA;AAAA,MAEF,KAAK,OAAA;AACH,QAAA,MAAA,GAAS,CAAA,yDAAA,CAAA;AACT,QAAA;AAAA,MAEF,KAAK,IAAA,EAAM;AACT,QAAA,MAAA,GAAS,CAAA,QAAA,EAAW,EAAE,WAAW,CAAA,kGAAA,CAAA;AACjC,QAAA,MAAM,WAAA,GAAc,EAAA,CAAG,YAAA,CAAa,iBAAiB,CAAA;AACrD,QAAA,IAAI,WAAA,EAAa,MAAA,IAAU,CAAA,aAAA,EAAgB,WAAW,CAAA,CAAA,CAAA;AACtD,QAAA,MAAM,eAAA,GAAkB,EAAA,CAAG,YAAA,CAAa,qBAAqB,CAAA;AAC7D,QAAA,IAAI,eAAA,EAAiB,MAAA,IAAU,CAAA,iBAAA,EAAoB,eAAe,CAAA,CAAA,CAAA;AAClE,QAAA;AAAA,MACF;AAAA,MAEA,KAAK,IAAA,EAAM;AACT,QAAA,MAAA,GAAS,CAAA,QAAA,EAAW,CAAA,CAAE,WAAW,CAAA,iIAAA,EAAoI,EAAE,aAAa,CAAA,mBAAA,CAAA;AACpL,QAAA,MAAM,WAAA,GAAc,EAAA,CAAG,YAAA,CAAa,iBAAiB,CAAA;AACrD,QAAA,IAAI,WAAA,EAAa,MAAA,IAAU,CAAA,aAAA,EAAgB,WAAW,CAAA,CAAA,CAAA;AACtD,QAAA,MAAM,eAAA,GAAkB,EAAA,CAAG,YAAA,CAAa,qBAAqB,CAAA;AAC7D,QAAA,IAAI,eAAA,EAAiB,MAAA,IAAU,CAAA,iBAAA,EAAoB,eAAe,CAAA,CAAA,CAAA;AAClE,QAAA;AAAA,MACF;AAAA,MAEA,KAAK,KAAA;AACH,QAAA,MAAA,GAAS,CAAA,YAAA,EAAe,CAAA,CAAE,WAAW,CAAA,eAAA,EAAkB,EAAE,aAAa,CAAA,gGAAA,CAAA;AACtE,QAAA;AAAA,MAEF,KAAK,MAAA,EAAQ;AACX,QAAA,MAAM,SAAS,EAAA,CAAG,aAAA;AAClB,QAAA,IAAI,MAAA,EAAQ,YAAY,KAAA,EAAO;AAE7B,UAAA,MAAA,GAAS,mFAAA;AAAA,QACX,CAAA,MAAO;AAEL,UAAA,MAAA,GAAS,CAAA,YAAA,EAAe,EAAE,MAAM,CAAA,eAAA,EAAkB,EAAE,QAAQ,CAAA,sDAAA,EAAyD,EAAE,UAAU,CAAA,yBAAA,CAAA;AAAA,QACnI;AACA,QAAA;AAAA,MACF;AAAA,MAEA,KAAK,IAAA;AACH,QAAA,MAAA,GAAS,CAAA,0BAAA,EAA6B,EAAE,QAAQ,CAAA,kBAAA,CAAA;AAChD,QAAA;AAAA,MAEF,KAAK,GAAA;AACH,QAAA,MAAA,GAAS,CAAA,OAAA,EAAU,EAAE,SAAS,CAAA,6BAAA,CAAA;AAC9B,QAAA;AAAA,MAEF,KAAK,KAAA;AACH,QAAA,MAAA,GAAS,kEAAA;AACT,QAAA;AAAA,MAEF,KAAK,IAAA;AACH,QAAA,MAAA,GAAS,6EAAA;AACT,QAAA;AAAA,MACF,KAAK,IAAA;AACH,QAAA,MAAA,GAAS,+EAAA;AACT,QAAA;AAAA,MACF,KAAK,IAAA;AACH,QAAA,MAAA,GAAS,gFAAA;AACT,QAAA;AAAA,MACF,KAAK,IAAA;AACH,QAAA,MAAA,GAAS,+EAAA;AACT,QAAA;AAAA,MACF,KAAK,IAAA;AACH,QAAA,MAAA,GAAS,6EAAA;AACT,QAAA;AAAA,MACF,KAAK,IAAA;AACH,QAAA,MAAA,GAAS,+EAAA;AACT,QAAA;AAAA,MAEF,KAAK,IAAA;AACH,QAAA,IAAI,EAAA,CAAG,YAAA,CAAa,WAAW,CAAA,KAAM,UAAA,EAAY;AAC/C,UAAA,MAAA,GAAS,sDAAA;AAAA,QACX,CAAA,MAAO;AACL,UAAA,MAAA,GAAS,wCAAA;AAAA,QACX;AACA,QAAA;AAAA,MAEF,KAAK,IAAA;AACH,QAAA,MAAA,GAAS,wCAAA;AACT,QAAA;AAAA,MAEF,KAAK,IAAA;AACH,QAAA,IAAI,EAAA,CAAG,YAAA,CAAa,WAAW,CAAA,KAAM,UAAA,EAAY;AAC/C,UAAA,MAAA,GAAS,uEAAA;AAET,UAAA,IAAI,EAAA,CAAG,YAAA,CAAa,cAAc,CAAA,KAAM,MAAA,EAAQ;AAC9C,YAAA,MAAM,UAAA,GAAa,EAAA,CAAG,aAAA,CAAc,cAAc,CAAA;AAClD,YAAA,IAAI,UAAA,EAAY;AACd,cAAA,MAAM,eAAA,GAAkB,UAAA,CAAW,YAAA,CAAa,OAAO,CAAA,IAAK,EAAA;AAC5D,cAAA,UAAA,CAAW,YAAA;AAAA,gBACT,OAAA;AAAA,gBACA,8CAAA,GAAiD;AAAA,eACnD;AAAA,YACF;AAAA,UACF;AAAA,QACF,CAAA,MAAO;AACL,UAAA,MAAA,GAAS,mBAAA;AAAA,QACX;AACA,QAAA;AAAA,MAEF,KAAK,SAAA;AACH,QAAA,MAAA,GAAS,CAAA,QAAA,EAAW,EAAE,aAAa,CAAA,4CAAA,CAAA;AACnC,QAAA;AAAA,MAEF,KAAK,SAAA;AACH,QAAA,MAAA,GAAS,CAAA,qDAAA,EAAwD,EAAE,SAAS,CAAA,0EAAA,CAAA;AAC5E,QAAA;AAAA,MAEF,KAAK,KAAA;AACH,QAAA,IAAI,EAAA,CAAG,YAAA,CAAa,sBAAsB,CAAA,EAAG;AAC3C,UAAA,MAAA,GAAS,CAAA,mCAAA,EAAsC,EAAE,aAAa,CAAA,CAAA,CAAA;AAAA,QAChE;AACA,QAAA;AAAA,MAEF,KAAK,MAAA,EAAQ;AACX,QAAA,IAAI,CAAC,GAAG,SAAA,EAAW;AAEnB,QAAA,MAAM,SAAA,GAAY,EAAA,CAAG,SAAA,CAAU,KAAA,CAAM,GAAG,CAAA;AACxC,QAAA,KAAA,MAAW,OAAO,SAAA,EAAW;AAC3B,UAAA,MAAM,KAAA,GAAQ,cAAc,GAAG,CAAA;AAC/B,UAAA,IAAI,KAAA,EAAO;AACT,YAAA,MAAA,GAAS,UAAU,KAAK,CAAA,CAAA,CAAA;AACxB,YAAA;AAAA,UACF;AAAA,QACF;AAEA,QAAA,IAAI,EAAA,CAAG,UAAU,QAAA,CAAS,cAAc,KAAK,EAAA,CAAG,SAAA,CAAU,QAAA,CAAS,aAAa,CAAA,EAAG;AACjF,UAAA,MAAA,IAAU,qBAAA;AAAA,QACZ;AACA,QAAA,IAAI,EAAA,CAAG,SAAA,CAAU,QAAA,CAAS,eAAe,CAAA,EAAG;AAC1C,UAAA,MAAA,IAAU,sBAAA;AAAA,QACZ;AAEA,QAAA,IAAI,EAAA,CAAG,SAAA,CAAU,QAAA,CAAS,eAAe,CAAA,EAAG;AAC1C,UAAA,MAAA,IAAU,6BAAA;AAAA,QACZ;AACA,QAAA,IAAI,EAAA,CAAG,SAAA,CAAU,QAAA,CAAS,eAAe,CAAA,EAAG;AAC1C,UAAA,MAAA,IAAU,6BAAA;AAAA,QACZ;AACA,QAAA;AAAA,MACF;AAAA;AAIF,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,EAAA,CAAG,YAAA,CAAa,OAAA,EAAS,MAAA,GAAS,GAAA,GAAM,QAAQ,CAAA;AAAA,IAClD;AAAA,EACF;AAGA,EAAA,IAAI,CAAA,CAAE,sBAAsB,MAAA,EAAQ;AAClC,IAAA,MAAM,SAAS,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,gBAAA,CAAiB,OAAO,CAAC,CAAA;AAC7D,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,MAAM,QAAA,GAAW,KAAA,CAAM,aAAA,CAAc,IAAI,CAAA;AACzC,MAAA,IAAI,CAAC,QAAA,EAAU;AAEf,MAAA,MAAM,gBAAgB,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,gBAAA,CAA8B,QAAQ,CAAC,CAAA;AAEjF,MAAA,MAAM,SAAmB,EAAC;AAC1B,MAAA,IAAI,aAAA,GAAgB,IAAA;AACpB,MAAA,KAAA,MAAW,QAAQ,aAAA,EAAe;AAChC,QAAA,MAAM,GAAA,GAAM,IAAA,CAAK,YAAA,CAAa,eAAe,CAAA;AAC7C,QAAA,IAAI,CAAC,GAAA,EAAK;AAAE,UAAA,aAAA,GAAgB,KAAA;AAAO,UAAA;AAAA,QAAO;AAC1C,QAAA,MAAM,SAAS,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA,CAAE,IAAI,MAAM,CAAA;AACxC,QAAA,IAAI,MAAA,CAAO,KAAK,CAAA,CAAA,KAAK,CAAC,KAAK,KAAA,CAAM,CAAC,CAAC,CAAA,EAAG;AAAE,UAAA,aAAA,GAAgB,KAAA;AAAO,UAAA;AAAA,QAAO;AACtE,QAAA,MAAA,CAAO,IAAA,CAAK,GAAG,MAAM,CAAA;AAAA,MACvB;AACA,MAAA,IAAI,CAAC,aAAA,IAAiB,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG;AAE3C,MAAA,MAAM,GAAA,GAAM,OAAO,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,GAAG,CAAC,CAAA;AAG5C,MAAA,MAAM,UAAA,GAAa,KAAA,CAAM,YAAA,CAAa,OAAO,CAAA,IAAK,EAAA;AAClD,MAAA,IAAI,CAAA,CAAE,sBAAsB,SAAA,EAAW;AACrC,QAAA,KAAA,CAAM,YAAA,CAAa,OAAA,EAAS,UAAA,GAAa,uBAAuB,CAAA;AAChE,QAAA,KAAA,MAAW,QAAQ,aAAA,EAAe;AAChC,UAAA,MAAM,GAAA,GAAM,IAAA,CAAK,YAAA,CAAa,eAAe,CAAA,IAAK,EAAA;AAClD,UAAA,MAAM,SAAS,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA,CAAE,IAAI,MAAM,CAAA;AACxC,UAAA,MAAM,WAAA,GAAc,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,EAAG,MAAM,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA,GAAI,GAAA,GAAM,GAAA;AAC9D,UAAA,MAAM,QAAA,GAAW,IAAA,CAAK,YAAA,CAAa,OAAO,CAAA,IAAK,EAAA;AAC/C,UAAA,IAAA,CAAK,YAAA,CAAa,SAAS,QAAA,GAAW,CAAA,QAAA,EAAW,YAAY,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAA,CAAI,CAAA;AAAA,QAC7E;AAAA,MACF,CAAA,MAAO;AAEL,QAAA,KAAA,CAAM,YAAA,CAAa,OAAA,EAAS,UAAA,CAAW,OAAA,CAAQ,eAAA,EAAiB,CAAA,OAAA,EAAU,MAAA,CAAO,GAAG,CAAC,CAAA,EAAA,CAAI,CAAA,GAAI,uBAAuB,CAAA;AACpH,QAAA,KAAA,MAAW,QAAQ,aAAA,EAAe;AAChC,UAAA,MAAM,GAAA,GAAM,IAAA,CAAK,YAAA,CAAa,eAAe,CAAA,IAAK,EAAA;AAClD,UAAA,MAAM,SAAS,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA,CAAE,IAAI,MAAM,CAAA;AACxC,UAAA,MAAM,SAAA,GAAY,OAAO,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,GAAG,CAAC,CAAA;AAClD,UAAA,MAAM,QAAA,GAAW,IAAA,CAAK,YAAA,CAAa,OAAO,CAAA,IAAK,EAAA;AAC/C,UAAA,IAAA,CAAK,aAAa,OAAA,EAAS,QAAA,GAAW,WAAW,MAAA,CAAO,SAAS,CAAC,CAAA,GAAA,CAAK,CAAA;AAAA,QACzE;AAAA,MACF;AAAA,IAGF;AAAA,EACF;AACF;AAqBO,SAAS,YAAA,CAAa,MAAc,SAAA,EAA0C;AACnF,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAElB,EAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACxC,EAAA,GAAA,CAAI,SAAA,GAAY,IAAA;AAChB,EAAA,iBAAA,CAAkB,KAAK,SAAS,CAAA;AAChC,EAAA,OAAO,GAAA,CAAI,SAAA;AACb;;;ACpZO,SAAS,eAAe,KAAA,EAAuB;AACpD,EAAA,MAAM,QAAA,GAAW,wCAAA,CAAyC,IAAA,CAAK,KAAK,CAAA;AACpE,EAAA,IAAI,QAAA,GAAW,CAAC,CAAA,IAAK,QAAA,CAAS,CAAC,CAAA,IAAK,QAAA,CAAS,CAAC,CAAA,EAAG;AAC/C,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,QAAA,CAAS,CAAC,GAAG,EAAE,CAAA;AAClC,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,QAAA,CAAS,CAAC,GAAG,EAAE,CAAA;AAClC,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,QAAA,CAAS,CAAC,GAAG,EAAE,CAAA;AAClC,IAAA,OAAO,CAAA,CAAA,EAAI,CAAA,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,EAAG,CAAA,CAAE,QAAA,CAAS,EAAE,EAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,EAAG,CAAA,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA;AAAA,EAChH;AACA,EAAA,OAAO,KAAA;AACT;;;ACsDO,IAAM,MAAA,GAAN,cAAqB,YAAA,CAA2B;AAAA;AAAA;AAAA;AAAA,EAI7C,OAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,iBAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMR,IAAI,gBAAA,GAAqC;AACvC,IAAA,OAAO,IAAA,CAAK,iBAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAA;AAAA;AAAA;AAAA;AAAA,EAKD,IAAA;AAAA;AAAA;AAAA;AAAA,EAKC,YAAA,GAAe,KAAA;AAAA;AAAA;AAAA;AAAA,EAKf,eAAA,GAAwD,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAShE,YAAY,OAAA,EAAwB;AAClC,IAAA,KAAA,EAAM;AAGN,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OAEF;AAAA,IACF;AAGA,IAAA,IAAI,CAAC,QAAQ,MAAA,KAAW,CAAC,QAAQ,UAAA,IAAc,OAAA,CAAQ,UAAA,CAAW,MAAA,KAAW,CAAA,CAAA,EAAI;AAC/E,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OAEF;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,OAAA,GAAU;AAAA,MACb,QAAA,EAAU,IAAA;AAAA,MACV,GAAG;AAAA,KACL;AAEA,IAAA,IAAA,CAAK,YAAA,EAAa;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,KAAA,GAAqB;AACvB,IAAA,OAAO,KAAK,IAAA,CAAK,KAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,MAAA,GAAiB;AACnB,IAAA,OAAO,KAAK,iBAAA,CAAkB,MAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,UAAA,GAAsB;AACxB,IAAA,OAAO,KAAK,IAAA,CAAK,QAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,OAAA,GAAmB;AACrB,IAAA,OAAO,eAAA,CAAgB,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,SAAA,GAAqB;AACvB,IAAA,OAAO,IAAA,CAAK,KAAK,QAAA,EAAS;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,WAAA,GAAuB;AACzB,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,QAAA,GAA2B;AAC7B,IAAA,OAAO,KAAK,cAAA,CAAe,QAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,KAAA,GAAyB;AACvB,IAAA,OAAO,IAAA,CAAK,eAAe,KAAA,EAAM;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,GAAA,GAAmB;AACjB,IAAA,OAAO,IAAA,CAAK,eAAe,GAAA,EAAI;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,OAAA,GAAmC;AACrC,IAAA,OAAO,KAAK,iBAAA,CAAkB,OAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,YAAA,GAA8B;AAChC,IAAA,OAAO,KAAK,iBAAA,CAAkB,YAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,iBAAA,GAAwC;AAC1C,IAAA,OAAO,KAAK,iBAAA,CAAkB,iBAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,QAAA,CACE,kBACA,UAAA,EACS;AAET,IAAA,MAAM,IAAA,GAAO,OAAO,gBAAA,KAAqB,QAAA,GAAW,mBAAmB,gBAAA,CAAiB,IAAA;AACxF,IAAA,MAAM,KAAA,GAAQ,OAAO,gBAAA,KAAqB,QAAA,GAAW,aAAa,gBAAA,CAAiB,UAAA;AAEnF,IAAA,MAAM,EAAE,OAAM,GAAI,IAAA;AAClB,IAAA,MAAM,EAAE,SAAA,EAAW,MAAA,EAAO,GAAI,KAAA;AAC9B,IAAA,MAAM,EAAE,IAAA,EAAM,EAAA,EAAI,KAAA,EAAM,GAAI,SAAA;AAG5B,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AAClC,IAAA,IAAI,QAAA,EAAU;AAEZ,MAAA,IAAI,UAAU,KAAA,EAAO;AACnB,QAAA,MAAM,WAAA,GAAc,KAAA,CAAM,WAAA,IAAe,KAAA,CAAM,KAAA,EAAM;AACrD,QAAA,MAAM,UAAU,WAAA,CAAY,IAAA,CAAK,CAAA,IAAA,KAAQ,IAAA,CAAK,SAAS,QAAQ,CAAA;AAC/D,QAAA,IAAI,CAAC,SAAS,OAAO,KAAA;AAGrB,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,MAAM,OAAO,WAAA,CAAY,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,QAAQ,CAAA;AACtD,UAAA,OAAO,OAAO,IAAA,CAAK,eAAA,CAAgB,IAAA,CAAK,KAAA,EAAO,KAAK,CAAA,GAAI,KAAA;AAAA,QAC1D;AACA,QAAA,OAAO,IAAA;AAAA,MACT;AAKA,MAAA,MAAM,KAAA,GAAQ,EAAE,iBAAA,EAAmB,KAAA,EAAO,SAAS,IAAA,EAAK;AACxD,MAAA,KAAA,CAAM,IAAI,YAAA,CAAa,IAAA,EAAM,IAAI,CAAC,IAAA,EAAM,MAAM,MAAA,KAAW;AACvD,QAAA,IAAI,KAAK,MAAA,EAAQ;AACf,UAAA,IAAI,UAAU,CAAC,MAAA,CAAO,IAAA,CAAK,cAAA,CAAe,QAAQ,CAAA,EAAG;AACnD,YAAA;AAAA,UACF;AACA,UAAA,IAAI,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,IAAK,CAAA,CAAE,IAAA,KAAS,QAAQ,CAAA,EAAG;AAC1E,YAAA;AAAA,UACF;AACA,UAAA,KAAA,CAAM,iBAAA,GAAoB,IAAA;AAC1B,UAAA,MAAM,WAAW,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,QAAQ,CAAA;AACzD,UAAA,IAAI,CAAC,QAAA,EAAU;AACb,YAAA,KAAA,CAAM,OAAA,GAAU,KAAA;AAChB,YAAA,OAAO,KAAA;AAAA,UACT;AACA,UAAA,IAAI,SAAS,CAAC,IAAA,CAAK,gBAAgB,QAAA,CAAS,KAAA,EAAO,KAAK,CAAA,EAAG;AACzD,YAAA,KAAA,CAAM,OAAA,GAAU,KAAA;AAChB,YAAA,OAAO,KAAA;AAAA,UACT;AAAA,QACF;AACA,QAAA,OAAO,IAAA;AAAA,MACT,CAAC,CAAA;AACD,MAAA,OAAO,KAAA,CAAM,qBAAqB,KAAA,CAAM,OAAA;AAAA,IAC1C;AAGA,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AAClC,IAAA,IAAI,QAAA,EAAU;AAEZ,MAAA,MAAM,UAAW,SAAA,CAAmF,IAAA;AACpG,MAAA,IAAI,OAAA,EAAS,SAAS,QAAA,EAAU;AAC9B,QAAA,OAAO,QAAQ,IAAA,CAAK,eAAA,CAAgB,OAAA,CAAQ,KAAA,EAAO,KAAK,CAAA,GAAI,IAAA;AAAA,MAC9D;AAIA,MAAA,MAAM,EAAE,KAAI,GAAI,SAAA;AAKhB,MAAA,MAAM,UAAA,GAAa,SAAS,IAAA,CAAK,KAAA,EAAO,MAAM,GAAG,CAAA,CAAE,QAAA,CAAS,MAAM,CAAA,IAAK,KAAA;AAEvE,MAAA,MAAM,UAAA,GAAa,CAAC,IAAA,KAAgC;AAClD,QAAA,KAAA,IAAS,KAAA,GAAQ,IAAA,CAAK,KAAA,EAAO,KAAA,IAAS,GAAG,KAAA,EAAA,EAAS;AAChD,UAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA;AAE5B,UAAA,IAAI,UAAA,EAAY;AACd,YAAA,MAAM,WAAA,GAAc,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,KAAA,EAAO,MAAM,GAAG,CAAA,CAAE,QAAA,CAAS,MAAM,CAAA,IAAK,KAAA;AACzE,YAAA,IAAI,WAAA,EAAa;AAEf,cAAA,IAAI,IAAA,CAAK,IAAA,KAAS,QAAA,EAAU,OAAO,KAAA;AACnC,cAAA,OAAO,QAAQ,IAAA,CAAK,eAAA,CAAgB,IAAA,CAAK,KAAA,EAAO,KAAK,CAAA,GAAI,IAAA;AAAA,YAC3D;AAAA,UACF,CAAA,MAAO;AACL,YAAA,IAAI,IAAA,CAAK,SAAS,QAAA,EAAU;AAC1B,cAAA,OAAO,QAAQ,IAAA,CAAK,eAAA,CAAgB,IAAA,CAAK,KAAA,EAAO,KAAK,CAAA,GAAI,IAAA;AAAA,YAC3D;AAAA,UACF;AAAA,QACF;AACA,QAAA,OAAO,KAAA;AAAA,MACT,CAAA;AAEA,MAAA,OAAO,UAAA,CAAW,KAAK,CAAA,IAAK,UAAA,CAAW,GAAG,CAAA;AAAA,IAC5C;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,cAAc,IAAA,EAAuC;AACnD,IAAA,MAAM,EAAE,OAAM,GAAI,IAAA;AAClB,IAAA,MAAM,EAAE,SAAA,EAAW,MAAA,EAAO,GAAI,KAAA;AAC9B,IAAA,MAAM,EAAE,OAAM,GAAI,SAAA;AAGlB,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AAClC,IAAA,IAAI,QAAA,EAAU;AAEZ,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,WAAA,IAAe,KAAA,CAAM,KAAA,EAAM;AAC/C,MAAA,MAAM,OAAO,KAAA,CAAM,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,QAAQ,CAAA;AAChD,MAAA,OAAO,OAAO,EAAE,GAAG,IAAA,CAAK,KAAA,KAAU,EAAC;AAAA,IACrC;AAGA,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AAClC,IAAA,IAAI,QAAA,EAAU;AAEZ,MAAA,KAAA,IAAS,KAAA,GAAQ,KAAA,CAAM,KAAA,EAAO,KAAA,IAAS,GAAG,KAAA,EAAA,EAAS;AACjD,QAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA;AAC7B,QAAA,IAAI,IAAA,CAAK,SAAS,QAAA,EAAU;AAC1B,UAAA,OAAO,EAAE,GAAG,IAAA,CAAK,KAAA,EAAM;AAAA,QACzB;AAAA,MACF;AACA,MAAA,OAAO,EAAC;AAAA,IACV;AAEA,IAAA,OAAO,EAAC;AAAA,EACV;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,eAAA,CACN,QACA,MAAA,EACS;AACT,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AACjD,MAAA,IAAI,MAAA,CAAO,GAAG,CAAA,KAAM,KAAA,EAAO;AACzB,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAA,GAAuB;AACrB,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,MAAA,EAAO;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,QAAQ,OAAA,EAA+D;AACrE,IAAA,MAAM,QAAA,GAAWa,mBAAAA,CAAc,UAAA,CAAW,IAAA,CAAK,MAAM,CAAA,CAAE,iBAAA;AAAA,MACrD,IAAA,CAAK,MAAM,GAAA,CAAI;AAAA,KACjB;AAEA,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACxC,IAAA,GAAA,CAAI,YAAY,QAAQ,CAAA;AAGxB,IAAA,MAAM,IAAA,GAAO,IAAI,SAAA,CAAU,OAAA;AAAA,MAAQ,kBAAA;AAAA,MAAoB,CAAC,MAAA,EAAQ,KAAA,KAC9D,SAAA,GACE,KAAA,CAAM,OAAA;AAAA,QACJ,yCAAA;AAAA,QACA,CAAC,QAAA,KAAa,cAAA,CAAe,QAAQ;AAAA,OACvC,GACA;AAAA,KACJ;AAEA,IAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,MAAA,MAAM,YAAY,OAAO,OAAA,CAAQ,MAAA,KAAW,QAAA,GAAW,QAAQ,MAAA,GAAS,MAAA;AACxE,MAAA,OAAO,YAAA,CAAa,MAAM,SAAS,CAAA;AAAA,IACrC;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAA,CAAQ,OAAA,GAAuC,EAAC,EAAW;AACzD,IAAA,MAAM,EAAE,cAAA,GAAiB,MAAA,EAAO,GAAI,OAAA;AACpC,IAAA,OAAO,IAAA,CAAK,MAAM,GAAA,CAAI,WAAA;AAAA,MACpB,CAAA;AAAA,MACA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,OAAA,CAAQ,IAAA;AAAA,MACvB;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,WAAW,OAAA,EAA2B;AAC5C,IAAA,MAAM,EAAA,GAAK,KAAK,KAAA,CAAM,EAAA;AACtB,IAAA,OAAO,OAAA,CAAQ;AAAA,MACb,MAAA,EAAQ,IAAA;AAAA,MACR,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,EAAA;AAAA,MACA,QAAA,EAAU,CAAC,CAAA,KAAM;AAAE,QAAA,IAAA,CAAK,IAAA,CAAK,SAAS,CAAC,CAAA;AAAA,MAAG,CAAA;AAAA,MAC1C,KAAA,EAAO,MAAM,IAAA,CAAK,KAAA,EAAM;AAAA,MACxB,GAAA,EAAK,MAAM,IAAA,CAAK,GAAA,EAAI;AAAA,MACpB,UAAU,IAAA,CAAK;AAAA,KAChB,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,UAAA,CAAW,OAAA,EAAkB,UAAA,GAAa,IAAA,EAAe;AACvD,IAAA,OAAO,KAAK,UAAA,CAAW,UAAA,CAAkB,SAAS,EAAE,UAAA,EAAY,CAAC,CAAA;AAAA,EACnE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,YAAA,CAAa,aAAa,IAAA,EAAe;AACvC,IAAA,OAAO,KAAK,UAAA,CAAW,YAAA,CAAoB,EAAE,UAAA,EAAY,CAAC,CAAA;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,YAAY,QAAA,EAAyB;AACnC,IAAA,IAAA,CAAK,QAAQ,QAAA,GAAW,QAAA;AAGxB,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,eAAA,CAAgB,eAAe,CAAA;AAAA,IAC/C,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,YAAA,CAAa,eAAA,EAAiB,MAAM,CAAA;AAAA,IACpD;AAIA,IAAA,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,EAAE,CAAA;AAEhC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KAAA,CAAM,WAA0B,IAAA,EAAY;AAC1C,IAAA,IAAA,CAAK,UAAA,CAAW,KAAA,CAAa,QAAQ,CAAC,CAAA;AACtC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,IAAA,GAAa;AACX,IAAA,IAAA,CAAK,UAAA,CAAW,MAAa,CAAA;AAC7B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,eAAe,MAAA,EAAsB;AAEnC,IAAA,IAAI,OAAO,IAAA,CAAK,GAAA,EAAK,IAAI,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA,EAAG;AAE3C,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY;AAAA,MAC3C,SAAS,CAAC,GAAG,KAAK,IAAA,CAAK,KAAA,CAAM,SAAS,MAAM;AAAA,KAC7C,CAAA;AACD,IAAA,IAAA,CAAK,IAAA,CAAK,YAAY,QAAQ,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,iBAAiB,GAAA,EAAsB;AACrC,IAAA,MAAM,cAAA,GAAiB,GAAA,CAAI,GAAA,CAAI,IAAA,CAAK,KAAK,KAAK,CAAA;AAC9C,IAAA,IAAI,CAAC,cAAA,EAAgB;AAErB,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY;AAAA,MAC3C,OAAA,EAAS,KAAK,IAAA,CAAK,KAAA,CAAM,QAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,KAAM,cAAc;AAAA,KACpE,CAAA;AACD,IAAA,IAAA,CAAK,IAAA,CAAK,YAAY,QAAQ,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAA,GAAgB;AACd,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,KAAK,eAAA,EAAiB;AACxB,MAAA,YAAA,CAAa,KAAK,eAAe,CAAA;AACjC,MAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AAAA,IACzB;AAEA,IAAA,IAAA,CAAK,KAAK,SAAS,CAAA;AACnB,IAAA,IAAA,CAAK,QAAQ,SAAA,IAAY;AAGzB,IAAA,IAAA,CAAK,KAAK,OAAA,EAAQ;AAGlB,IAAA,IAAA,CAAK,kBAAkB,OAAA,EAAQ;AAG/B,IAAA,IAAA,CAAK,kBAAA,EAAmB;AAExB,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,wBAAA,CACN,WACA,MAAA,EACwC;AACxC,IAAA,OAAO;AAAA,MACL,mBAAA,EAAqB;AAAA,QACnB,iBAAA,EAAmB,CAAC,QAAA,EAAmB,OAAA,KAAsC;AAC3E,UAAA,MAAM,IAAA,GAAOA,mBAAAA,CAAc,UAAA,CAAW,MAAM,CAAA;AAC5C,UAAA,MAAM,GAAA,GAAM,IAAA,CAAK,iBAAA,CAAkB,QAAA,EAAsB,OAAO,CAAA;AAChE,UAAA,MAAM,OAAA,GAAU,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC5C,UAAA,OAAA,CAAQ,YAAY,GAAG,CAAA;AACvB,UAAA,OAAA,CAAQ,SAAA,GAAY,SAAA,CAAU,OAAA,CAAQ,SAAS,CAAA;AAC/C,UAAA,MAAM,IAAA,GAAO,SAAS,sBAAA,EAAuB;AAC7C,UAAA,OAAO,OAAA,CAAQ,UAAA,EAAY,IAAA,CAAK,WAAA,CAAY,QAAQ,UAAU,CAAA;AAC9D,UAAA,OAAO,IAAA;AAAA,QACT;AAAA;AACF,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAA,GAAqB;AAE3B,IAAA,IAAA,CAAK,IAAA,CAAK,cAAA,EAAgB,EAAE,MAAA,EAAQ,MAAM,CAAA;AAC1C,IAAA,IAAA,CAAK,OAAA,CAAQ,cAAA,GAAiB,EAAE,MAAA,EAAQ,MAAM,CAAA;AAI9C,IAAA,IAAA,CAAK,oBAAoB,IAAI,gBAAA;AAAA,MAC3B;AAAA,QACE,UAAA,EAAY,KAAK,OAAA,CAAQ,UAAA;AAAA,QACzB,MAAA,EAAQ,KAAK,OAAA,CAAQ;AAAA,OACvB;AAAA,MACA;AAAA,KACF;AAGA,IAAA,IAAA,CAAK,kBAAkB,kBAAA,EAAmB;AAE1C,IAAA,IAAA,CAAK,kBAAkB,cAAA,EAAe;AAGtC,IAAA,IAAI,GAAA;AACJ,IAAA,IAAI;AACF,MAAA,GAAA,GAAM,cAAA;AAAA,QACJ,IAAA,CAAK,QAAQ,OAAA,IAAW,IAAA;AAAA,QACxB,KAAK,iBAAA,CAAkB;AAAA,OACzB;AAAA,IACF,SAAS,KAAA,EAAO;AAEd,MAAA,MAAM,YAAA,GAAe,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AAC7E,MAAA,IAAA,CAAK,KAAK,cAAA,EAAgB;AAAA,QACxB,MAAA,EAAQ,IAAA;AAAA,QACR,KAAA,EAAO,YAAA;AAAA,QACP,OAAA,EAAS,KAAK,OAAA,CAAQ;AAAA,OACvB,CAAA;AACD,MAAA,IAAA,CAAK,QAAQ,cAAA,GAAiB;AAAA,QAC5B,MAAA,EAAQ,IAAA;AAAA,QACR,KAAA,EAAO,YAAA;AAAA,QACP,OAAA,EAAS,KAAK,OAAA,CAAQ;AAAA,OACvB,CAAA;AAGD,MAAA,GAAA,GAAM,cAAA,CAAe,IAAA,EAAM,IAAA,CAAK,iBAAA,CAAkB,MAAM,CAAA;AAAA,IAC1D;AAEA,IAAA,MAAM,OAAA,GAAU,KAAK,iBAAA,CAAkB,OAAA;AAGvC,IAAA,MAAMd,OAAA,GAAQ8B,kBAAY,MAAA,CAAO;AAAA,MAC/B,MAAA,EAAQ,KAAK,iBAAA,CAAkB,MAAA;AAAA,MAC/B,GAAA;AAAA,MACA;AAAA,KACD,CAAA;AAGD,IAAA,MAAM,UAAU,IAAA,CAAK,OAAA,CAAQ,OAAA,IAAW,QAAA,CAAS,cAAc,KAAK,CAAA;AAGpE,IAAA,MAAM,SAAA,GAAY,KAAK,iBAAA,CAAkB,SAAA;AACzC,IAAA,IAAA,CAAK,IAAA,GAAO,IAAIE,eAAA,CAAW,OAAA,EAAS;AAAA,aAClChC,OAAA;AAAA,MACA,mBAAA,EAAqB,IAAA,CAAK,mBAAA,CAAoB,IAAA,CAAK,IAAI,CAAA;AAAA,MACvD,QAAA,EAAU,MAAM,IAAA,CAAK,OAAA,CAAQ,QAAA,IAAY,IAAA;AAAA,MACzC,YAAY,OAAO;AAAA,QACjB,IAAA,EAAM,SAAA;AAAA,QACN,gBAAA,EAAkB,MAAA;AAAA,QAClB,YAAA,EAAc,IAAA,CAAK,OAAA,CAAQ,SAAA,IAAa,kBAAA;AAAA,QACxC,GAAK,KAAK,OAAA,CAAQ,QAAA,IAAY,OAAQ,EAAC,GAAI,EAAE,eAAA,EAAiB,MAAA;AAAO,OACvE,CAAA;AAAA,MACA,GAAI,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA,CAAE,SAAS,CAAA,GAAI,EAAE,SAAA,EAAU,GAAI,EAAC;AAAA;AAAA,MAEzD,GAAI,IAAA,CAAK,OAAA,CAAQ,sBAAA,GACb,IAAA,CAAK,wBAAA,CAAyB,IAAA,CAAK,OAAA,CAAQ,sBAAA,EAAwB,IAAA,CAAK,iBAAA,CAAkB,MAAM,IAChG,EAAC;AAAA;AAAA,MAEL,eAAA,EAAiB;AAAA,QACf,KAAA,EAAO,CAAC,KAAA,EAAO,KAAA,KAAU;AACvB,UAAA,IAAA,CAAK,KAAK,OAAA,EAAS,EAAE,MAAA,EAAQ,IAAA,EAAM,OAAc,CAAA;AACjD,UAAA,IAAA,CAAK,QAAQ,OAAA,GAAU,EAAE,MAAA,EAAQ,IAAA,EAAM,OAAc,CAAA;AACrD,UAAA,IAAA,CAAK,iBAAA,CAAkB,WAAA,CAAY,EAAE,KAAA,EAAO,CAAA;AAC5C,UAAA,OAAO,KAAA;AAAA,QACT,CAAA;AAAA,QACA,IAAA,EAAM,CAAC,KAAA,EAAO,KAAA,KAAU;AACtB,UAAA,IAAA,CAAK,KAAK,MAAA,EAAQ,EAAE,MAAA,EAAQ,IAAA,EAAM,OAAc,CAAA;AAChD,UAAA,IAAA,CAAK,QAAQ,MAAA,GAAS,EAAE,MAAA,EAAQ,IAAA,EAAM,OAAc,CAAA;AACpD,UAAA,IAAA,CAAK,iBAAA,CAAkB,UAAA,CAAW,EAAE,KAAA,EAAO,CAAA;AAC3C,UAAA,OAAO,KAAA;AAAA,QACT;AAAA;AACF,KACD,CAAA;AAGD,IAAA,IAAA,CAAK,IAAA,CAAK,SAAS,EAAE,MAAA,EAAQ,MAAM,IAAA,EAAM,IAAA,CAAK,MAAM,CAAA;AACpD,IAAA,IAAA,CAAK,OAAA,CAAQ,UAAU,EAAE,MAAA,EAAQ,MAAM,IAAA,EAAM,IAAA,CAAK,MAAM,CAAA;AAGxD,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAI,cAAA,CAAe,IAAI,CAAA;AAG7C,IAAA,IAAI,IAAA,CAAK,QAAQ,SAAA,EAAW;AAG1B,MAAA,IAAA,CAAK,eAAA,GAAkB,WAAW,MAAM;AACtC,QAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AACvB,QAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACtB,UAAA,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAA;AAAA,QACnC;AAAA,MACF,GAAG,CAAC,CAAA;AAAA,IACN;AAGA,IAAA,IAAA,CAAK,EAAA,CAAG,OAAA,EAAS,CAAC,KAAA,KAAU;AAC1B,MAAA,IAAA,CAAK,OAAA,CAAQ,UAAU,KAAK,CAAA;AAAA,IAC9B,CAAC,CAAA;AAGD,IAAA,IAAA,CAAK,IAAA,CAAK,QAAA,EAAU,EAAE,MAAA,EAAQ,MAAM,CAAA;AACpC,IAAA,IAAA,CAAK,OAAA,CAAQ,QAAA,GAAW,EAAE,MAAA,EAAQ,MAAM,CAAA;AACxC,IAAA,IAAA,CAAK,kBAAkB,YAAA,EAAa;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAAoB,WAAA,EAAgC;AAC1D,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,MAAM,WAAW,CAAA;AAGlD,IAAA,IAAA,CAAK,IAAA,CAAK,YAAY,QAAQ,CAAA;AAG9B,IAAA,IAAA,CAAK,KAAK,aAAA,EAAe,EAAE,MAAA,EAAQ,IAAA,EAAM,aAAa,CAAA;AACtD,IAAA,IAAA,CAAK,QAAQ,aAAA,GAAgB,EAAE,MAAA,EAAQ,IAAA,EAAM,aAAa,CAAA;AAC1D,IAAA,IAAA,CAAK,iBAAA,CAAkB,iBAAA,CAAkB,EAAE,WAAA,EAAa,CAAA;AAGxD,IAAA,MAAM,UAAA,GAAa,WAAA,CAAY,OAAA,CAAQ,YAAY,CAAA;AAGnD,IAAA,IAAI,CAAC,WAAA,CAAY,UAAA,IAAc,WAAA,CAAY,YAAA,EAAc;AACvD,MAAA,IAAA,CAAK,KAAK,iBAAA,EAAmB,EAAE,MAAA,EAAQ,IAAA,EAAM,aAAa,CAAA;AAC1D,MAAA,IAAA,CAAK,QAAQ,iBAAA,GAAoB,EAAE,MAAA,EAAQ,IAAA,EAAM,aAAa,CAAA;AAC9D,MAAA,IAAA,CAAK,kBAAkB,qBAAA,EAAsB;AAAA,IAC/C;AAGA,IAAA,IAAI,WAAA,CAAY,UAAA,IAAc,CAAC,UAAA,EAAY;AACzC,MAAA,IAAA,CAAK,KAAK,QAAA,EAAU,EAAE,MAAA,EAAQ,IAAA,EAAM,aAAa,CAAA;AACjD,MAAA,IAAA,CAAK,QAAQ,QAAA,GAAW,EAAE,MAAA,EAAQ,IAAA,EAAM,aAAa,CAAA;AACrD,MAAA,IAAA,CAAK,kBAAkB,YAAA,EAAa;AAAA,IACtC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKS,IAAA,CACP,UACG,IAAA,EACG;AACN,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,KAAA,EAAO,GAAG,IAAI,CAAA;AAAA,EAClC;AACF;ACnuBO,SAAS,gBAAA,CACd,SAAA,EACA,QAAA,EACA,OAAA,EACY;AACZ,EAAA,MAAM,YAAA,GAAe,SAAS,SAAA,IAAa,QAAA;AAC3C,EAAA,MAAM,UAAA,GAAa,SAAS,OAAA,IAAW,EAAA;AACvC,EAAA,MAAM,UAAA,GAAa;AAAA,IACjBgB,UAAA,CAAO,OAAA,EAAS,WAAA,IAAe,CAAC,CAAA;AAAA,IAChCiB,QAAA,CAAK,EAAE,OAAA,EAAS,UAAA,EAAY,CAAA;AAAA,IAC5BC,SAAA,CAAM,EAAE,OAAA,EAAS,UAAA,EAAY,CAAA;AAAA,IAC7BC,QAAA;AAAK,GACP;AAEA,EAAA,MAAM,SAAS,MAAY;AACzB,IAAA,KAAKC,mBAAA;AAAA,MACH,SAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,QACE,QAAA,EAAU,OAAA;AAAA,QACV,SAAA,EAAW,YAAA;AAAA,QACX;AAAA;AACF,MACA,IAAA,CAAK,CAAC,EAAE,CAAA,EAAG,CAAA,EAAG,gBAAe,KAAM;AAGnC,MAAA,MAAA,CAAO,MAAA,CAAO,SAAS,KAAA,EAAO;AAAA,QAC5B,IAAA,EAAM,GAAA;AAAA,QACN,GAAA,EAAK,GAAA;AAAA,QACL,SAAA,EAAW,eAAe,MAAA,CAAO,CAAC,CAAC,CAAA,GAAA,EAAM,MAAA,CAAO,CAAC,CAAC,CAAA,KAAA;AAAA,OACnD,CAAA;AAGD,MAAA,MAAM,MAAA,GAAS,eAAe,IAAA,EAAM,eAAA;AACpC,MAAA,QAAA,CAAS,KAAA,CAAM,UAAA,GAAa,MAAA,GAAS,QAAA,GAAW,EAAA;AAAA,IAClD,CAAC,CAAA;AAAA,EACH,CAAA;AAUA,EAAA,MAAM,WAAA,GAAc,SAAS,WAAA,IAAe,IAAA;AAC5C,EAAA,OAAOC,cAAA,CAAW,SAAA,EAAsB,QAAA,EAAU,MAAA,EAAQ;AAAA,IACxD,cAAA,EAAgB,KAAA;AAAA,IAChB,cAAA,EAAgB;AAAA,GACjB,CAAA;AACH;AAiBO,SAAS,oBAAA,CACd,SAAA,EACA,QAAA,EACA,OAAA,EACY;AACZ,EAAA,MAAM,YAAA,GAAe,SAAS,SAAA,IAAa,QAAA;AAC3C,EAAA,MAAM,UAAA,GAAa,SAAS,OAAA,IAAW,EAAA;AACvC,EAAA,MAAM,UAAA,GAAa;AAAA,IACjBrB,UAAA,CAAO,OAAA,EAAS,WAAA,IAAe,CAAC,CAAA;AAAA,IAChCiB,QAAA,CAAK,EAAE,OAAA,EAAS,UAAA,EAAY,CAAA;AAAA,IAC5BC,SAAA,CAAM,EAAE,OAAA,EAAS,UAAA,EAAY;AAAA,GAC/B;AAEA,EAAA,MAAM,SAAS,MAAY;AACzB,IAAA,KAAKE,mBAAA;AAAA,MACH,SAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,QACE,QAAA,EAAU,UAAA;AAAA,QACV,SAAA,EAAW,YAAA;AAAA,QACX;AAAA;AACF,MACA,IAAA,CAAK,CAAC,EAAE,CAAA,EAAG,GAAE,KAAM;AACnB,MAAA,MAAA,CAAO,MAAA,CAAO,SAAS,KAAA,EAAO;AAAA,QAC5B,IAAA,EAAM,GAAA;AAAA,QACN,GAAA,EAAK,GAAA;AAAA,QACL,SAAA,EAAW,CAAA,YAAA,EAAe,MAAA,CAAO,IAAA,CAAK,MAAM,CAAC,CAAC,CAAC,CAAA,GAAA,EAAM,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAC,CAAA,KAAA;AAAA,OAC3E,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH,CAAA;AAKA,EAAA,MAAM,WAAA,GAAc,SAAS,WAAA,IAAe,IAAA;AAC5C,EAAA,OAAOC,cAAA,CAAW,SAAA,EAAsB,QAAA,EAAU,MAAA,EAAQ;AAAA,IACxD,cAAA,EAAgB,WAAA;AAAA,IAChB,WAAA,EAAa;AAAA,GACd,CAAA;AACH;;;ACzJA,eAAsB,iBAAiB,IAAA,EAAgC;AAMrE,EAAA,IAAI,OAAO,SAAA,KAAc,WAAA,IAAe,SAAA,CAAU,WAAW,SAAA,EAAW;AACtE,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,CAAU,SAAA,CAAU,SAAA,CAAU,IAAI,CAAA;AACxC,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAGA,EAAA,IAAI,OAAO,QAAA,KAAa,WAAA,EAAa,OAAO,KAAA;AAE5C,EAAA,MAAM,QAAA,GAAW,QAAA,CAAS,aAAA,CAAc,UAAU,CAAA;AAClD,EAAA,QAAA,CAAS,KAAA,GAAQ,IAAA;AAEjB,EAAA,QAAA,CAAS,MAAM,QAAA,GAAW,OAAA;AAC1B,EAAA,QAAA,CAAS,MAAM,GAAA,GAAM,SAAA;AACrB,EAAA,QAAA,CAAS,MAAM,IAAA,GAAO,SAAA;AACtB,EAAA,QAAA,CAAS,MAAM,OAAA,GAAU,GAAA;AACzB,EAAA,QAAA,CAAS,YAAA,CAAa,YAAY,EAAE,CAAA;AACpC,EAAA,QAAA,CAAS,IAAA,CAAK,YAAY,QAAQ,CAAA;AAElC,EAAA,IAAI;AACF,IAAA,QAAA,CAAS,MAAA,EAAO;AAChB,IAAA,QAAA,CAAS,iBAAA,CAAkB,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA;AAMzC,IAAA,OAAO,QAAA,CAAS,YAAY,MAAM,CAAA;AAAA,EACpC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT,CAAA,SAAE;AACA,IAAA,QAAA,CAAS,MAAA,EAAO;AAAA,EAClB;AACF;;;AC/CO,SAAS,cAAA,CAAe,MAAwB,MAAA,EAAuB;AAC5E,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,MAAA,CAAO,SAAA,CAAU,OAAA,CAAQ,CAAC,GAAA,KAAQ;AAChC,IAAA,IAAI,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG,KAAA,CAAM,KAAK,GAAG,CAAA;AAAA,EACjD,CAAC,CAAA;AACD,EAAA,KAAA,MAAW,GAAA,IAAO,KAAA,EAAO,MAAA,CAAO,SAAA,CAAU,OAAO,GAAG,CAAA;AAEpD,EAAA,MAAM,MAAA,GAAS,KAAK,GAAA,CAAI,OAAA,CAAQ,sBAAsB,CAAA,IAAK,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,YAAY,CAAA;AACxF,EAAA,IAAI,CAAC,MAAA,EAAQ;AACb,EAAA,MAAA,CAAO,SAAA,CAAU,OAAA,CAAQ,CAAC,GAAA,KAAQ;AAChC,IAAA,IAAI,IAAI,UAAA,CAAW,WAAW,GAAG,MAAA,CAAO,SAAA,CAAU,IAAI,GAAG,CAAA;AAAA,EAC3D,CAAC,CAAA;AACH;;;ACrBA,IAAM,iBAAA,GAAoB,gBAAA;AAE1B,IAAM,mBAAA,GAAyC,OAAO,MAAA,CAAO;AAAA,EAC3D,MAAA;AAAA,EAAQ,QAAA;AAAA,EAAU,WAAA;AAAA,EAAa,QAAA;AAAA,EAAU,MAAA;AAAA,EACzC,GAAA;AAAA,EAAK,MAAA;AAAA,EACL,GAAA;AAAA,EAAK;AACP,CAAC,CAAA;AAED,IAAM,qBAAA,GAA2C,OAAO,MAAA,CAAO;AAAA,EAC7D,MAAA;AAAA,EAAQ,QAAA;AAAA,EAAU,WAAA;AAAA,EAAa,QAAA;AAAA,EAAU,MAAA;AAAA,EACzC,GAAA;AAAA,EAAK;AACP,CAAC,CAAA;AAWM,SAAS,sBACd,MAAA,EAC0B;AAC1B,EAAA,MAAM,eAAe,MAAA,CAAO,IAAA,CAAK,IAAI,OAAA,CAAQ,GAAA,GAAM,iBAAiB,CAAA,KAAM,IAAA;AAC1E,EAAA,MAAM,IAAA,GAAO,eAAe,mBAAA,GAAsB,qBAAA;AAClD,EAAA,OAAO,EAAE,IAAA,EAAM,CAAC,GAAG,IAAI,CAAA,EAAE;AAC3B;;;AC3BA,IAAMC,mCAAkB,IAAI,GAAA,CAAI,CAAC,UAAA,EAAY,UAAU,CAAC,CAAA;AACxD,IAAM,qCAAqB,IAAI,GAAA,CAAI,CAAC,YAAA,EAAc,aAAA,EAAe,UAAU,CAAC,CAAA;AAyCrE,SAAS,sBACd,IAAA,EAC6B;AAC7B,EAAA,MAAM,EAAE,EAAA,EAAI,UAAA,EAAY,aAAA,EAAe,SAAA,EAAW,aAAY,GAAI,IAAA;AAElE,EAAA,IAAI,UAAA,GAAa,CAAA,IAAK,UAAA,IAAc,EAAA,CAAG,GAAA,CAAI,QAAQ,IAAA,EAAM,OAAO,EAAE,EAAA,EAAI,KAAA,EAAM;AAC5E,EAAA,MAAM,OAAA,GAAU,EAAA,CAAG,GAAA,CAAI,MAAA,CAAO,UAAU,CAAA;AACxC,EAAA,IAAI,CAAC,OAAA,IAAW,CAAC,kBAAA,CAAmB,GAAA,CAAI,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,EAAG,OAAO,EAAE,EAAA,EAAI,KAAA,EAAM;AAC/E,EAAA,IAAI,QAAQ,UAAA,KAAe,CAAA,EAAG,OAAO,EAAE,IAAI,KAAA,EAAM;AAEjD,EAAA,IAAI,UAAA;AACJ,EAAA,IAAI,eAAA;AACJ,EAAA,IAAI,kBAAkB,MAAA,EAAW;AAC/B,IAAA,IAAI,aAAA,GAAgB,CAAA,IAAK,aAAA,IAAiB,EAAA,CAAG,GAAA,CAAI,QAAQ,IAAA,EAAM,OAAO,EAAE,EAAA,EAAI,KAAA,EAAM;AAClF,IAAA,MAAM,SAAA,GAAY,EAAA,CAAG,GAAA,CAAI,MAAA,CAAO,aAAa,CAAA;AAC7C,IAAA,IAAI,CAAC,SAAA,IAAa,CAACA,gBAAAA,CAAgB,GAAA,CAAI,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA,EAAG,OAAO,EAAE,EAAA,EAAI,KAAA,EAAM;AAIhF,IAAA,IAAI,gBAAgB,UAAA,GAAa,CAAA,IAAK,aAAA,IAAiB,UAAA,GAAa,QAAQ,QAAA,EAAU;AACpF,MAAA,OAAO,EAAE,IAAI,KAAA,EAAM;AAAA,IACrB;AACA,IAAA,UAAA,GAAa,SAAA;AACb,IAAA,eAAA,GAAkB,aAAA;AAAA,EACpB,CAAA,MAAO;AACL,IAAA,MAAM,OAAO,OAAA,CAAQ,SAAA;AACrB,IAAA,IAAI,CAAC,IAAA,IAAQ,CAACA,gBAAAA,CAAgB,GAAA,CAAI,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,EAAG,OAAO,EAAE,EAAA,EAAI,KAAA,EAAM;AACtE,IAAA,IAAI,MAAM,UAAA,GAAa,CAAA;AACvB,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,UAAA,GAAa,GAAG,CAAA,EAAA,EAAK;AAC/C,MAAA,GAAA,IAAO,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAA,CAAE,QAAA;AAAA,IAC1B;AACA,IAAA,UAAA,GAAa,IAAA;AACb,IAAA,eAAA,GAAkB,GAAA;AAAA,EACpB;AAEA,EAAA,IAAI,CAAC,WAAW,cAAA,CAAe,UAAA,CAAW,YAAY,UAAA,CAAW,UAAA,EAAY,SAAA,CAAU,IAAI,CAAA,EAAG;AAC5F,IAAA,OAAO,EAAE,IAAI,KAAA,EAAM;AAAA,EACrB;AAKA,EAAA,MAAM,oBAAA,GAAuB,eAAA,GAAkB,UAAA,CAAW,QAAA,GAAW,CAAA;AAErE,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,MAAM,EAAE,IAAA,EAAM,EAAA,EAAG,GAAI,WAAA;AAIrB,IAAA,IAAI,oBAAA,IAAwB,IAAA,IAAQ,oBAAA,IAAwB,EAAA,EAAI;AAC9D,MAAA,OAAO,EAAE,IAAI,KAAA,EAAM;AAAA,IACrB;AACA,IAAA,EAAA,CAAG,MAAA,CAAO,MAAM,EAAE,CAAA;AAClB,IAAA,MAAM,iBAAA,GACJ,oBAAA,GAAuB,IAAA,GAAO,oBAAA,IAAwB,KAAK,IAAA,CAAA,GAAQ,oBAAA;AACrE,IAAA,EAAA,CAAG,MAAA,CAAO,mBAAmB,SAAS,CAAA;AACtC,IAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,UAAA,EAAY,iBAAA,EAAkB;AAAA,EACnD;AAEA,EAAA,EAAA,CAAG,MAAA,CAAO,sBAAsB,SAAS,CAAA;AACzC,EAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,UAAA,EAAY,oBAAA,EAAqB;AACtD;AC9FO,SAAS,8BAAA,CACdtC,OAAA,EACA,QAAA,EACA,GAAA,EACS;AACT,EAAA,IAAI,CAAC,GAAA,CAAI,gBAAA,IAAoB,CAAC,GAAA,CAAI,kBAAkB,OAAO,KAAA;AAE3D,EAAA,MAAM,EAAE,KAAA,EAAM,GAAIA,OAAA,CAAM,SAAA;AAExB,EAAA,IAAI,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,IAAA,KAAS,aAAa,OAAO,KAAA;AACnD,EAAA,IAAI,KAAA,CAAM,MAAA,CAAO,OAAA,CAAQ,IAAA,KAAS,GAAG,OAAO,KAAA;AAE5C,EAAA,MAAM,aAAA,GAAgBA,OAAA,CAAM,MAAA,CAAO,KAAA,CAAM,WAAW,CAAA;AACpD,EAAA,IAAI,CAAC,eAAe,OAAO,KAAA;AAG3B,EAAA,MAAM,KAAA,GAAQ,MAAM,UAAA,EAAW;AAC/B,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,MAAM,MAAA,GAASwB,qBAAW,KAAK,CAAA;AAC/B,IAAA,IAAI,WAAW,IAAA,EAAM;AACnB,MAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AACtB,MAAA,MAAMe,GAAAA,GAAKvC,OAAA,CAAM,EAAA,CAAG,IAAA,CAAK,OAAO,MAAM,CAAA;AACtC,MAAA,MAAM,YAAA,GAAe,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,KAAK,CAAA;AAC7C,MAAA,MAAM,YAAA,GAAeuC,GAAAA,CAAG,OAAA,CAAQ,GAAA,CAAI,YAAY,CAAA;AAChD,MAAAA,GAAAA,CAAG,aAAatC,mBAAAA,CAAc,MAAA,CAAOsC,IAAG,GAAA,EAAK,YAAA,GAAe,CAAC,CAAC,CAAA;AAC9D,MAAA,QAAA,CAASA,GAAAA,CAAG,gBAAgB,CAAA;AAC5B,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAKA,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,KAAK,CAAA;AAC1C,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,KAAA,CAAM,KAAA,CAAM,KAAK,CAAA;AAEvC,EAAA,MAAM,QAAA,GAAWvC,OAAA,CAAM,GAAA,CAAI,MAAA,CAAO,IAAI,OAAO,CAAA;AAC7C,EAAA,IAAI,CAAC,UAAU,OAAO,KAAA;AACtB,EAAA,MAAM,OAAA,GAAU,GAAA,CAAI,OAAA,GAAU,QAAA,CAAS,QAAA;AAEvC,EAAA,MAAM,WAAA,GAAcA,OAAA,CAAM,GAAA,CAAI,MAAA,CAAO,IAAI,UAAU,CAAA;AACnD,EAAA,IAAI,CAAC,aAAa,OAAO,KAAA;AACzB,EAAA,MAAM,UAAA,GAAa,GAAA,CAAI,UAAA,GAAa,WAAA,CAAY,QAAA;AAEhD,EAAA,MAAM,UAAA,GAAa,GAAA,CAAI,kBAAA,KAAuB,WAAA,CAAY,UAAA,GAAa,CAAA;AAIvE,EAAA,MAAM,kBAAA,GAAqB,IAAI,SAAA,GAAY,CAAA;AAC3C,EAAA,IAAI,kBAAA,GAAqB,GAAG,OAAO,KAAA;AACnC,EAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,IAAA,CAAK,kBAAkB,CAAA;AACnD,EAAA,MAAM,oBAAA,GAAuB,KAAA,CAAM,KAAA,CAAM,kBAAkB,CAAA;AAC3D,EAAA,IACE,CAAC,aAAA,CAAc,cAAA;AAAA,IACb,oBAAA,GAAuB,CAAA;AAAA,IACvB,oBAAA,GAAuB,CAAA;AAAA,IACvB;AAAA,GACF,EACA;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAEtB,EAAA,MAAM,OAAA,GAAU,cAAc,MAAA,EAAO;AACrC,EAAA,MAAM,KAAKA,OAAA,CAAM,EAAA;AAEjB,EAAA,IAAI,UAAA,EAAY;AAEd,IAAA,EAAA,CAAG,MAAA,CAAO,WAAW,OAAO,CAAA;AAC5B,IAAA,MAAM,SAAA,GAAY,EAAA,CAAG,OAAA,CAAQ,GAAA,CAAI,UAAU,CAAA;AAC3C,IAAA,EAAA,CAAG,MAAA,CAAO,WAAW,OAAO,CAAA;AAC5B,IAAA,EAAA,CAAG,aAAaC,mBAAAA,CAAc,MAAA,CAAO,GAAG,GAAA,EAAK,SAAA,GAAY,CAAC,CAAC,CAAA;AAAA,EAC7D,CAAA,MAAO;AAEL,IAAA,EAAA,CAAG,MAAA,CAAO,WAAW,OAAO,CAAA;AAC5B,IAAA,MAAM,OAAA,GAAU,EAAA,CAAG,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA;AACtC,IAAA,EAAA,CAAG,KAAA,CAAM,SAAS,CAAC,CAAA;AACnB,IAAA,MAAM,YAAY,OAAA,GAAU,CAAA;AAC5B,IAAA,EAAA,CAAG,MAAA,CAAO,WAAW,OAAO,CAAA;AAC5B,IAAA,EAAA,CAAG,aAAaA,mBAAAA,CAAc,MAAA,CAAO,GAAG,GAAA,EAAK,SAAA,GAAY,CAAC,CAAC,CAAA;AAAA,EAC7D;AAEA,EAAA,QAAA,CAAS,EAAA,CAAG,gBAAgB,CAAA;AAC5B,EAAA,OAAO,IAAA;AACT;ACvFO,SAAS,yBAAA,CACdD,OAAA,EACA,QAAA,EACA,GAAA,EACS;AACT,EAAA,IAAI,CAAC,GAAA,CAAI,gBAAA,IAAoB,CAAC,GAAA,CAAI,kBAAkB,OAAO,KAAA;AAE3D,EAAA,MAAM,aAAA,GAAgBA,OAAA,CAAM,MAAA,CAAO,KAAA,CAAM,WAAW,CAAA;AACpD,EAAA,IAAI,CAAC,eAAe,OAAO,KAAA;AAE3B,EAAA,MAAM,EAAE,KAAA,EAAM,GAAIA,OAAA,CAAM,SAAA;AAExB,EAAA,IAAI,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,IAAA,KAAS,aAAa,OAAO,KAAA;AACnD,EAAA,IAAI,KAAA,CAAM,MAAA,CAAO,OAAA,CAAQ,IAAA,KAAS,GAAG,OAAO,KAAA;AAE5C,EAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAEtB,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,KAAA,CAAM,KAAA,CAAM,KAAK,CAAA;AACzC,EAAA,MAAM,KAAKA,OAAA,CAAM,EAAA,CAAG,OAAO,SAAA,EAAW,aAAA,CAAc,QAAQ,CAAA;AAC5D,EAAA,EAAA,CAAG,aAAaC,mBAAAA,CAAc,MAAA,CAAO,GAAG,GAAA,EAAK,SAAA,GAAY,CAAC,CAAC,CAAA;AAC3D,EAAA,QAAA,CAAS,EAAA,CAAG,gBAAgB,CAAA;AAC5B,EAAA,OAAO,IAAA;AACT;ACYO,SAAS,kBAAA,CACd,OACA,EAAA,EACgC;AAChC,EAAA,IAAI,CAAC,EAAA,CAAG,SAAA,CAAU,KAAA,EAAO,OAAO,IAAA;AAChC,EAAA,IAAI,EAAA,CAAG,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAElC,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,EAAA,CAAG,SAAA;AACrB,EAAA,MAAM,aAAA,GAAgB,0BAA0B,KAAK,CAAA;AACrD,EAAA,IAAI,aAAA,KAAkB,IAAI,OAAO,IAAA;AACjC,EAAA,IAAI,KAAA,CAAM,KAAA,CAAM,aAAa,CAAA,KAAM,GAAG,OAAO,IAAA;AAE7C,EAAA,MAAM,YAAY,aAAA,GAAgB,CAAA;AAClC,EAAA,MAAM,YAAA,GAAe,KAAA,CAAM,IAAA,CAAK,aAAa,CAAA;AAC7C,EAAA,MAAM,iBAAiB,YAAA,CAAa,UAAA;AACpC,EAAA,MAAM,eACJ,YAAA,CAAa,UAAA,KAAe,MAAM,cAAA,EAAgB,OAAA,CAAQ,QAAQ,CAAA,MAAO,CAAA;AAa3E,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,MAAM,eAAe,YAAA,CAAa,IAAA;AAClC,IAAA,IAAI,WAAA,GAAc,EAAA;AAClB,IAAA,OAAO,gBAAgB,CAAA,EAAG;AACxB,MAAA,MAAM,SAAA,GAAY,KAAA,CAAM,KAAA,CAAM,EAAE,CAAA;AAChC,MAAA,MAAM,SAASmB,uBAAAA,CAAa,YAAY,CAAA,CAAE,SAAA,EAAW,CAAC,MAAA,KAAW;AAC/D,QAAA,KAAA,MAAW,IAAA,IAAQ,MAAA,CAAO,KAAA,EAAO,EAAA,CAAG,KAAK,IAAI,CAAA;AAC7C,QAAA,IAAI,MAAA,CAAO,YAAA,EAAc,EAAA,CAAG,YAAA,CAAa,OAAO,SAAS,CAAA;AAAA,MAC3D,CAAC,CAAA;AACD,MAAA,IAAI,CAAC,MAAA,EAAQ;AACb,MAAA,IAAI,CAAC,gBAAA,CAAiB,EAAA,CAAG,SAAA,CAAU,KAAK,CAAA,EAAG;AAAA,IAC7C;AAEA,IAAA,MAAM,UAAA,GAAa,GAAG,SAAA,CAAU,KAAA;AAChC,IAAA,IAAI,gBAAA,CAAiB,UAAU,CAAA,EAAG,OAAO,IAAA;AACzC,IAAA,OAAO,EAAE,MAAM,UAAA,CAAW,MAAA,IAAU,EAAA,EAAI,UAAA,CAAW,OAAM,EAAE;AAAA,EAC7D;AAGA,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,IAAA,CAAK,SAAS,CAAA;AACrC,EAAA,MAAM,WAAA,GAAc,KAAA,CAAM,KAAA,CAAM,SAAS,CAAA;AACzC,EAAA,MAAM,MAAA,GAAS,WAAA,KAAgB,QAAA,CAAS,UAAA,GAAa,CAAA;AACrD,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,MAAMoB,IAAAA,GAAM,KAAA,CAAM,KAAA,CAAM,SAAS,CAAA;AACjC,IAAA,OAAO,EAAE,IAAA,EAAMA,IAAAA,EAAK,EAAA,EAAIA,IAAAA,EAAI;AAAA,EAC9B;AAOA,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,KAAA,CAAM,aAAa,CAAA;AAC1C,EAAA,EAAA,CAAG,KAAA,CAAM,UAAU,CAAC,CAAA;AACpB,EAAA,MAAM,MAAM,QAAA,GAAW,CAAA;AACvB,EAAA,OAAO,EAAE,IAAA,EAAM,GAAA,EAAK,EAAA,EAAI,GAAA,EAAI;AAC9B;;;AC9DO,IAAMC,KAAAA,GAAN,MAAM,KAAA,SAAmD,SAAA,CAG9D;AAAA;AAAA;AAAA;AAAA;AAAA,EAKkB,IAAA,GAAO,MAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYhB,MAAA,GAAqC,IAAA;AAAA;AAAA;AAAA;AAAA,EAKpC,YAAY,MAAA,EAAsC;AAC1D,IAAA,KAAA,CAAM,MAAM,CAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,IAAI,QAAA,GAA4B;AAC9B,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAO,KAAK,MAAA,CAAO,MAAA,CAAO,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,IAAK,IAAA;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,eAAA,GAA4B;AAC9B,IAAA,MAAM,OAAO,IAAA,CAAK,QAAA;AAClB,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,MAAA,EAAS,KAAK,IAAI,CAAA,gFAAA;AAAA,OAEpB;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,OAAgB,OACd,MAAA,EACY;AACZ,IAAA,OAAO,IAAI,MAAK,MAAM,CAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUS,UAAU,OAAA,EAAmD;AACpE,IAAA,MAAM,SAAA,GAA0C;AAAA,MAC9C,GAAG,IAAA,CAAK,MAAA;AAAA,MACR,YAAY,OAAO;AAAA,QACjB,GAAG,IAAA,CAAK,OAAA;AAAA,QACR,GAAG;AAAA,OACL;AAAA,KACF;AAEA,IAAA,OAAO,IAAI,MAAK,SAAS,CAAA;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA8BS,OACP,cAAA,EAEwC;AACxC,IAAA,MAAM,SAAA,GAAY,4BAAA,CAA6B,IAAA,CAAK,MAAA,EAAQ,cAAc,CAAA;AAE1E,IAAA,OAAO,IAAI,MAAK,SAAyD,CAAA;AAAA,EAC3E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,cAAA,GAA2B;AACzB,IAAA,MAAM,OAAiB,EAAC;AAGxB,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,KAAA,KAAU,MAAA,EAAW,IAAA,CAAK,QAAQ,YAAA,CAAa,IAAA,CAAK,MAAA,CAAO,KAAA,EAAO,IAAI,CAAA;AACtF,IAAA,IAAI,KAAK,MAAA,CAAO,OAAA,KAAY,QAAW,IAAA,CAAK,OAAA,GAAU,KAAK,MAAA,CAAO,OAAA;AAClE,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,KAAW,MAAA,EAAW,IAAA,CAAK,SAAS,YAAA,CAAa,IAAA,CAAK,MAAA,CAAO,MAAA,EAAQ,IAAI,CAAA;AACzF,IAAA,IAAI,KAAK,MAAA,CAAO,IAAA,KAAS,QAAW,IAAA,CAAK,IAAA,GAAO,KAAK,MAAA,CAAO,IAAA;AAC5D,IAAA,IAAI,IAAA,CAAK,OAAO,UAAA,KAAe,MAAA;AAC7B,MAAA,IAAA,CAAK,UAAA,GAAa,KAAK,MAAA,CAAO,UAAA;AAChC,IAAA,IAAI,IAAA,CAAK,OAAO,SAAA,KAAc,MAAA;AAC5B,MAAA,IAAA,CAAK,SAAA,GAAY,KAAK,MAAA,CAAO,SAAA;AAC/B,IAAA,IAAI,KAAK,MAAA,CAAO,IAAA,KAAS,QAAW,IAAA,CAAK,IAAA,GAAO,KAAK,MAAA,CAAO,IAAA;AAC5D,IAAA,IAAI,IAAA,CAAK,OAAO,UAAA,KAAe,MAAA;AAC7B,MAAA,IAAA,CAAK,UAAA,GAAa,KAAK,MAAA,CAAO,UAAA;AAChC,IAAA,IAAI,IAAA,CAAK,OAAO,SAAA,KAAc,MAAA;AAC5B,MAAA,IAAA,CAAK,SAAA,GAAY,KAAK,MAAA,CAAO,SAAA;AAC/B,IAAA,IAAI,IAAA,CAAK,OAAO,QAAA,KAAa,MAAA;AAC3B,MAAA,IAAA,CAAK,QAAA,GAAW,KAAK,MAAA,CAAO,QAAA;AAC9B,IAAA,IAAI,KAAK,MAAA,CAAO,KAAA,KAAU,QAAW,IAAA,CAAK,KAAA,GAAQ,KAAK,MAAA,CAAO,KAAA;AAC9D,IAAA,IAAI,IAAA,CAAK,OAAO,cAAA,KAAmB,MAAA;AACjC,MAAC,IAAA,CAAiC,gBAAgB,CAAA,GAChD,IAAA,CAAK,MAAA,CAAO,cAAA;AAChB,IAAA,IAAI,IAAA,CAAK,OAAO,SAAA,KAAc,MAAA;AAC5B,MAAC,IAAA,CAAiC,WAAW,CAAA,GAC3C,IAAA,CAAK,MAAA,CAAO,SAAA;AAGhB,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,QAAA,KAAa,MAAA,EAAW;AACtC,MAAA,IAAI,OAAO,IAAA,CAAK,MAAA,CAAO,QAAA,KAAa,UAAA,EAAY;AAC9C,QAAA,MAAM,UAAA,GAAa,KAAK,MAAA,CAAO,QAAA;AAE/B,QAAA,MAAM,QAAA,GAAW,IAAA;AACjB,QAAA,IAAA,CAAK,WAAW,CAAC,IAAA,KAAS,UAAA,CAAW,IAAA,CAAK,UAAU,IAAI,CAAA;AAAA,MAC1D,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,QAAA;AAAA,MACpC;AAAA,IACF;AAGA,IAAA,MAAM,cAAA,GAAiB,YAAA,CAAa,IAAA,CAAK,MAAA,CAAO,eAAe,IAAI,CAAA;AACnE,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,IAAA,CAAK,KAAA,GAAQ,sBAAsB,cAAc,CAAA;AAAA,IACnD;AAGA,IAAA,MAAM,UAAA,GAAa,YAAA,CAAa,IAAA,CAAK,MAAA,CAAO,WAAW,IAAI,CAAA;AAC3D,IAAA,IAAI,UAAA,IAAc,UAAA,CAAW,MAAA,GAAS,CAAA,EAAG;AAGvC,MAAA,MAAM,aAAA,GAAgB,UAAA,CAAW,GAAA,CAAI,CAAC,IAAA,KAAS;AAE7C,QAAA,MAAM,YAUF,EAAC;AAEL,QAAA,IAAI,IAAA,CAAK,GAAA,EAAK,SAAA,CAAU,GAAA,GAAM,IAAA,CAAK,GAAA;AACnC,QAAA,IAAI,IAAA,CAAK,KAAA,EAAO,SAAA,CAAU,KAAA,GAAQ,IAAA,CAAK,KAAA;AACvC,QAAA,IAAI,IAAA,CAAK,QAAA,KAAa,MAAA,EAAW,SAAA,CAAU,WAAW,IAAA,CAAK,QAAA;AAC3D,QAAA,IAAI,IAAA,CAAK,SAAA,KAAc,MAAA,EAAW,SAAA,CAAU,YAAY,IAAA,CAAK,SAAA;AAC7D,QAAA,IAAI,IAAA,CAAK,OAAA,EAAS,SAAA,CAAU,OAAA,GAAU,IAAA,CAAK,OAAA;AAC3C,QAAA,IAAI,KAAK,kBAAA,KAAuB,MAAA;AAC9B,UAAA,SAAA,CAAU,qBAAqB,IAAA,CAAK,kBAAA;AAGtC,QAAA,IAAI,IAAA,CAAK,YAAY,cAAA,EAAgB;AACnC,UAAA,SAAA,CAAU,QAAA,GAAW,CAAC,IAAA,KAA+B;AAEnD,YAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,cAAA,OAAO,IAAA,CAAK,WACR,IAAA,CAAK,QAAA,CAAS,IAA8B,CAAA,IAAK,KACjD,EAAC;AAAA,YACP;AAGA,YAAA,MAAM,YAAY,IAAA,CAAK,QAAA,GAAW,KAAK,QAAA,CAAS,IAAI,IAAI,EAAC;AAGzD,YAAA,IAAI,SAAA,KAAc,IAAA,IAAQ,SAAA,KAAc,MAAA,EAAW;AACjD,cAAA,OAAO,KAAA;AAAA,YACT;AAGA,YAAA,MAAM,WAAA,GAAuC,EAAE,GAAG,SAAA,EAAU;AAC5D,YAAA,IAAI,cAAA,EAAgB;AAClB,cAAA,KAAA,MAAW,CAAC,IAAA,EAAM,QAAQ,KAAK,MAAA,CAAO,OAAA,CAAQ,cAAc,CAAA,EAAG;AAC7D,gBAAA,IAAI,SAAS,SAAA,EAAW;AACtB,kBAAA,WAAA,CAAY,IAAI,CAAA,GAAI,QAAA,CAAS,SAAA,CAAU,IAAI,CAAA;AAAA,gBAC7C;AAAA,cACF;AAAA,YACF;AAEA,YAAA,OAAO,WAAA;AAAA,UACT,CAAA;AAAA,QACF;AAEA,QAAA,OAAO,SAAA;AAAA,MACT,CAAC,CAAA;AAKD,MAAA,IAAA,CAAK,QAAA,GAAW,aAAA;AAAA,IAClB;AAGA,IAAA,IAAI,IAAA,CAAK,OAAO,UAAA,EAAY;AAC1B,MAAA,MAAM,QAAA,GAAW,KAAK,MAAA,CAAO,UAAA;AAC7B,MAAA,MAAM,SAAA,GAAY,cAAA;AAGlB,MAAA,MAAM,YAAA,GAAe,IAAA;AAErB,MAAA,IAAA,CAAK,KAAA,GAAQ,CAAC,IAAA,KAAS;AACrB,QAAA,MAAM,YAAY,SAAA,GACd,mBAAA,CAAoB,KAAK,KAAA,EAAO,SAAS,IACzC,EAAC;AAGL,QAAA,OAAO,SAAS,IAAA,CAAK,YAAA,EAAc,EAAE,IAAA,EAAM,cAAA,EAAgB,WAAW,CAAA;AAAA,MACxE,CAAA;AAAA,IACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AACF;;;ACtQO,IAAM,iBAAA,GAAN,MAAM,kBAAA,CAAkB;AAAA;AAAA;AAAA;AAAA;AAAA,EAK7B,OAAO,aAAA,CAAc,MAAA,EAA2B,IAAA,EAA8B;AAC5E,IAAA,IAAI,IAAA,CAAK,UAAA,EAAY,OAAO,IAAA,CAAK,WAAW,MAAM,CAAA;AAClD,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,EAAU,OAAO,KAAA;AAC3B,IAAA,IAAI,OAAO,KAAK,QAAA,KAAa,QAAA,SAAiB,MAAA,CAAO,QAAA,CAAS,KAAK,QAAQ,CAAA;AAC3E,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,QAAQ,CAAA,EAAG;AAChC,MAAA,OAAO,KAAK,QAAA,CAAS,IAAA,CAAK,CAAA,CAAA,KACxB,OAAO,MAAM,QAAA,GAAW,MAAA,CAAO,QAAA,CAAS,CAAC,IAAI,MAAA,CAAO,QAAA,CAAS,EAAE,IAAA,EAAM,CAAA,CAAE,UAAU,CAAC,CAAA;AAAA,IACtF;AACA,IAAA,OAAO,OAAO,QAAA,CAAS,IAAA,CAAK,SAAS,IAAA,EAAM,IAAA,CAAK,SAAS,UAAU,CAAA;AAAA,EACrE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,WAAA,CAAY,MAAA,EAA2B,IAAA,EAA2B;AACvE,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,OAAO,CAAA;AACxC,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,IAAI,IAAA,CAAK,aAAa,MAAA,EAAQ;AAC5B,QAAA,GAAA,CAAI,GAAG,KAAK,WAAW,CAAA;AAAA,MACzB,CAAA,MAAO;AACL,QAAA,GAAA,EAAI;AAAA,MACN;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,MAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,kBAAA,GAA0C,IAAA;AAAA;AAAA,EAG1C,UAA0B,EAAC;AAAA;AAAA,EAG3B,UAAA,uBAAiB,GAAA,EAAqB;AAAA;AAAA,EAGtC,YAAA,uBAAmB,GAAA,EAAqB;AAAA;AAAA,EAGxC,YAAA,uBAAmB,GAAA,EAAqB;AAAA;AAAA,EAGxC,aAAA,GAA+B,IAAA;AAAA;AAAA,EAG/B,aAAA,GAAgB,CAAA;AAAA;AAAA,EAGhB,eAA6B,EAAC;AAAA,EAEtC,WAAA,CAAY,MAAA,EAAiC,QAAA,EAAsB,MAAA,EAA+B;AAChG,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,IAAA,IAAA,CAAK,UAAU,MAAA,IAAU,IAAA;AACzB,IAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,EACf;AAAA;AAAA,EAIA,IAAI,MAAA,GAAyB;AAC3B,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA,EAEA,IAAI,SAAA,GAA0C;AAC5C,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EACd;AAAA,EAEA,IAAI,WAAA,GAA4C;AAC9C,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACd;AAAA,EAEA,IAAI,WAAA,GAA4C;AAC9C,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACd;AAAA,EAEA,IAAI,YAAA,GAA8B;AAChC,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,EACd;AAAA,EAEA,IAAI,YAAA,GAAuB;AACzB,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,EACd;AAAA,EAEA,IAAI,eAAA,GAA0B;AAC5B,IAAA,OAAO,KAAK,YAAA,CAAa,MAAA;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAS,IAAA,EAA8B;AACrC,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,IAAK,KAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,IAAA,EAA8B;AACvC,IAAA,OAAO,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,IAAK,KAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,IAAA,EAA2B;AACxC,IAAA,kBAAA,CAAkB,WAAA,CAAY,IAAA,CAAK,MAAA,EAAQ,IAAI,CAAA;AAC/C,IAAA,IAAA,CAAK,kBAAA,EAAmB;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,IAAA,EAAoB;AACjC,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAA,CAAK,aAAA,KAAkB,IAAA,GAAO,IAAA,GAAO,IAAA;AAC1D,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAAsB;AACpB,IAAA,IAAI,IAAA,CAAK,kBAAkB,IAAA,EAAM;AAC/B,MAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AACrB,MAAA,IAAA,CAAK,QAAA,EAAS;AAAA,IAChB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAAA,GAAuB;AACrB,IAAA,IAAI,IAAA,CAAK,YAAA,CAAa,MAAA,KAAW,CAAA,EAAG,OAAO,EAAA;AAC3C,IAAA,IAAA,CAAK,aAAA,GAAA,CAAiB,IAAA,CAAK,aAAA,GAAgB,CAAA,IAAK,KAAK,YAAA,CAAa,MAAA;AAClE,IAAA,IAAA,CAAK,QAAA,EAAS;AACd,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,GAAuB;AACrB,IAAA,IAAI,IAAA,CAAK,YAAA,CAAa,MAAA,KAAW,CAAA,EAAG,OAAO,EAAA;AAC3C,IAAA,IAAA,CAAK,aAAA,GAAA,CACF,KAAK,aAAA,GAAgB,CAAA,GAAI,KAAK,YAAA,CAAa,MAAA,IAAU,KAAK,YAAA,CAAa,MAAA;AAC1E,IAAA,IAAA,CAAK,QAAA,EAAS;AACd,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAAwB;AACtB,IAAA,IAAA,CAAK,aAAA,GAAgB,CAAA;AACrB,IAAA,IAAA,CAAK,QAAA,EAAS;AACd,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,GAAuB;AACrB,IAAA,IAAA,CAAK,gBAAgB,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,YAAA,CAAa,SAAS,CAAC,CAAA;AAC7D,IAAA,IAAA,CAAK,QAAA,EAAS;AACd,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,KAAA,EAAqB;AACnC,IAAA,IAAI,KAAA,IAAS,CAAA,IAAK,KAAA,GAAQ,IAAA,CAAK,aAAa,MAAA,EAAQ;AAClD,MAAA,IAAA,CAAK,aAAA,GAAgB,KAAA;AAAA,IACvB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,IAAA,EAAsB;AACjC,IAAA,OAAO,IAAA,CAAK,aAAa,SAAA,CAAU,CAAC,OAAO,EAAA,CAAG,IAAA,CAAK,SAAS,IAAI,CAAA;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAA,GAAkB;AAChB,IAAA,IAAA,CAAK,qBAAqB,MAAM;AAC9B,MAAA,IAAA,CAAK,kBAAA,EAAmB;AAAA,IAC1B,CAAA;AACA,IAAA,IAAA,CAAK,MAAA,CAAO,EAAA,CAAG,aAAA,EAAe,IAAA,CAAK,kBAAkB,CAAA;AACrD,IAAA,IAAA,CAAK,kBAAA,EAAmB;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,GAAgB;AACd,IAAA,IAAI,KAAK,kBAAA,EAAoB;AAC3B,MAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,aAAA,EAAe,IAAA,CAAK,kBAAkB,CAAA;AACtD,MAAA,IAAA,CAAK,kBAAA,GAAqB,IAAA;AAAA,IAC5B;AACA,IAAA,IAAA,CAAK,UAAU,EAAC;AAChB,IAAA,IAAA,CAAK,WAAW,KAAA,EAAM;AACtB,IAAA,IAAA,CAAK,aAAa,KAAA,EAAM;AACxB,IAAA,IAAA,CAAK,aAAa,KAAA,EAAM;AACxB,IAAA,IAAA,CAAK,eAAe,EAAC;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,OAAA,GAAgB;AACtB,IAAA,MAAM,KAAA,GAAQ,KAAK,MAAA,CAAO,YAAA;AAC1B,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA,CAAK,OAAA,GAChB,IAAA,CAAK,aAAA,CAAc,KAAA,EAAO,IAAA,CAAK,OAAO,CAAA,GACtC,IAAA,CAAK,UAAA,CAAW,KAAK,CAAA;AACzB,IAAA,IAAA,CAAK,YAAA,GAAe,KAAK,aAAA,EAAc;AACvC,IAAA,IAAA,CAAK,aAAA,GAAgB,CAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,WAAW,KAAA,EAAsC;AACvD,IAAA,MAAM,QAAA,uBAAe,GAAA,EAA2B;AAChD,IAAA,MAAM,aAAuB,EAAC;AAE9B,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AAExB,MAAA,IAAI,IAAA,CAAK,IAAA,KAAS,QAAA,IAAY,IAAA,CAAK,YAAY,KAAA,EAAO;AACtD,MAAA,MAAM,YAAa,OAAA,IAAW,IAAA,IAAQ,IAAA,CAAK,KAAA,GAAS,KAAK,KAAA,GAAQ,EAAA;AACjE,MAAA,IAAI,IAAA,GAAO,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA;AACjC,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,IAAA,GAAO,EAAC;AACR,QAAA,QAAA,CAAS,GAAA,CAAI,WAAW,IAAI,CAAA;AAC5B,QAAA,UAAA,CAAW,KAAK,SAAS,CAAA;AAAA,MAC3B;AACA,MAAA,IAAA,CAAK,KAAK,IAAI,CAAA;AAAA,IAChB;AAGA,IAAA,MAAM,SAAyB,EAAC;AAChC,IAAA,KAAA,MAAW,QAAQ,UAAA,EAAY;AAC7B,MAAA,MAAM,UAAA,GAAa,QAAA,CAAS,GAAA,CAAI,IAAI,KAAK,EAAC;AAC1C,MAAA,UAAA,CAAW,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AACxB,QAAA,MAAM,EAAA,GAAK,EAAE,QAAA,IAAY,GAAA;AACzB,QAAA,MAAM,EAAA,GAAK,EAAE,QAAA,IAAY,GAAA;AACzB,QAAA,OAAO,EAAA,GAAK,EAAA;AAAA,MACd,CAAC,CAAA;AACD,MAAA,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,KAAA,EAAO,YAAY,CAAA;AAAA,IACzC;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,aAAA,CAAc,OAAsB,MAAA,EAA8C;AAExF,IAAA,MAAM,SAAA,uBAAgB,GAAA,EAA2B;AACjD,IAAA,MAAM,WAAA,uBAAkB,GAAA,EAA6B;AAErD,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,IAAI,IAAA,CAAK,SAAS,QAAA,EAAU;AAC1B,QAAA,SAAA,CAAU,GAAA,CAAI,IAAA,CAAK,IAAA,EAAM,IAAI,CAAA;AAAA,MAC/B,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,UAAA,EAAY;AACnC,QAAA,WAAA,CAAY,GAAA,CAAI,IAAA,CAAK,IAAA,EAAM,IAAI,CAAA;AAC/B,QAAA,KAAA,MAAW,GAAA,IAAO,KAAK,KAAA,EAAO;AAC5B,UAAA,SAAA,CAAU,GAAA,CAAI,GAAA,CAAI,IAAA,EAAM,GAAG,CAAA;AAAA,QAC7B;AAAA,MACF;AAAA,IACF;AAGA,IAAA,MAAM,SAAyB,EAAC;AAChC,IAAA,IAAI,UAAyB,EAAC;AAC9B,IAAA,IAAI,QAAA,GAAW,CAAA;AAEf,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,IAAI,UAAU,GAAA,EAAK;AACjB,QAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,UAAA,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,CAAA,OAAA,EAAU,MAAA,CAAO,UAAU,CAAC,CAAA,CAAA,EAAI,KAAA,EAAO,OAAA,EAAS,CAAA;AACpE,UAAA,OAAA,GAAU,EAAC;AAAA,QACb;AACA,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,QAAA,MAAM,EAAA,GAAK,WAAA,CAAY,GAAA,CAAI,KAAK,CAAA;AAChC,QAAA,IAAI,EAAA,EAAI;AACN,UAAA,OAAA,CAAQ,KAAK,EAAE,CAAA;AAAA,QACjB,CAAA,MAAO;AACL,UAAA,MAAM,GAAA,GAAM,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA;AAC/B,UAAA,IAAI,GAAA,EAAK,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAA;AAAA,QAC3B;AACA,QAAA;AAAA,MACF;AAGA,MAAA,MAAM,WAA4B,EAAC;AACnC,MAAA,KAAA,MAAW,OAAA,IAAW,MAAM,KAAA,EAAO;AACjC,QAAA,MAAM,GAAA,GAAM,SAAA,CAAU,GAAA,CAAI,OAAO,CAAA;AACjC,QAAA,IAAI,GAAA,EAAK,QAAA,CAAS,IAAA,CAAK,GAAG,CAAA;AAAA,MAC5B;AACA,MAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,QAAA,MAAM,EAAA,GAAsB;AAAA,UAC1B,IAAA,EAAM,UAAA;AAAA,UACN,IAAA,EAAM,CAAA,UAAA,EAAa,KAAA,CAAM,QAAQ,CAAA,CAAA;AAAA,UACjC,MAAM,KAAA,CAAM,IAAA;AAAA,UACZ,OAAO,KAAA,CAAM,QAAA;AAAA,UACb,KAAA,EAAO;AAAA,SACT;AACA,QAAA,IAAI,KAAA,CAAM,WAAA,EAAa,EAAA,CAAG,WAAA,GAAc,KAAA,CAAM,WAAA;AAC9C,QAAA,IAAI,KAAA,CAAM,WAAA,EAAa,EAAA,CAAG,WAAA,GAAc,KAAA,CAAM,WAAA;AAC9C,QAAA,OAAA,CAAQ,KAAK,EAAE,CAAA;AAAA,MACjB;AAAA,IACF;AAEA,IAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,MAAA,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,CAAA,OAAA,EAAU,MAAA,CAAO,QAAQ,CAAC,CAAA,CAAA,EAAI,KAAA,EAAO,OAAA,EAAS,CAAA;AAAA,IACpE;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAA,GAA8B;AACpC,IAAA,MAAM,OAAqB,EAAC;AAC5B,IAAA,KAAA,MAAW,CAAC,EAAA,EAAI,KAAK,KAAK,IAAA,CAAK,OAAA,CAAQ,SAAQ,EAAG;AAChD,MAAA,KAAA,MAAW,CAAC,EAAA,EAAI,IAAI,KAAK,KAAA,CAAM,KAAA,CAAM,SAAQ,EAAG;AAC9C,QAAA,IAAI,IAAA,CAAK,IAAA,KAAS,QAAA,IAAY,IAAA,CAAK,SAAS,UAAA,EAAY;AACtD,UAAA,IAAA,CAAK,KAAK,EAAE,IAAA,EAAM,YAAY,EAAA,EAAI,SAAA,EAAW,IAAI,CAAA;AAAA,QACnD;AAAA,MACF;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAA,GAA2B;AAEjC,IAAA,IAAI,QAAA,GAAmE,IAAA;AACvE,IAAA,IAAI;AACF,MAAA,QAAA,GAAW,IAAA,CAAK,OAAO,GAAA,EAAI;AAAA,IAC7B,CAAA,CAAA,MAAQ;AAAA,IAER;AAEA,IAAA,KAAA,MAAW,KAAA,IAAS,KAAK,OAAA,EAAS;AAChC,MAAA,KAAA,MAAW,IAAA,IAAQ,MAAM,KAAA,EAAO;AAC9B,QAAA,IAAI,IAAA,CAAK,SAAS,QAAA,EAAU;AAC1B,UAAA,IAAA,CAAK,kBAAkB,IAAI,CAAA;AAC3B,UAAA,IAAA,CAAK,mBAAA,CAAoB,MAAM,QAAQ,CAAA;AACvC,UAAA,IAAA,CAAK,oBAAoB,IAAI,CAAA;AAAA,QAC/B,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,UAAA,EAAY;AACnC,UAAA,KAAA,MAAW,GAAA,IAAO,KAAK,KAAA,EAAO;AAC5B,YAAA,IAAA,CAAK,kBAAkB,GAAG,CAAA;AAC1B,YAAA,IAAA,CAAK,mBAAA,CAAoB,KAAK,QAAQ,CAAA;AAAA,UACxC;AAEA,UAAA,MAAM,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,KACnC,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,CAAA,GAAA,KAAO,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,GAAA,CAAI,IAAI,CAAC,CAAA;AAC5D,UAAA,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,IAAA,CAAK,IAAA,EAAM,WAAW,CAAA;AAAA,QAC9C;AAAA,MACF;AAAA,IACF;AAMA,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EAChB;AAAA,EAEQ,mBAAA,CACN,MACA,QAAA,EACS;AACT,IAAA,MAAM,cAAc,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,IAAK,KAAA;AACxD,IAAA,IAAI,WAAA,GAAc,KAAA;AAElB,IAAA,IAAI;AACF,MAAA,IAAI,KAAK,SAAA,EAAW;AAIlB,QAAA,WAAA,GAAc,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,WAAW,CAAA;AAAA,MAChD,WAAW,QAAA,EAAU;AACnB,QAAA,MAAM,MAAA,GAAS,QAAA,CAAS,IAAA,CAAK,OAAO,CAAA;AACpC,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,WAAA,GAAc,IAAA,CAAK,WAAA,EAAa,MAAA,GAC5B,CAAC,MAAA,CAAO,GAAG,IAAA,CAAK,WAAW,CAAA,GAC3B,CAAC,MAAA,EAAO;AAAA,QACd;AAAA,MACF;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAEA,IAAA,IAAI,gBAAgB,WAAA,EAAa;AAC/B,MAAA,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,IAAA,CAAK,IAAA,EAAM,WAAW,CAAA;AAC5C,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEQ,kBAAkB,IAAA,EAA8B;AACtD,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,IAAY,CAAC,IAAA,CAAK,YAAY,OAAO,KAAA;AAE/C,IAAA,MAAM,YAAY,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,IAAK,KAAA;AACpD,IAAA,MAAM,SAAA,GAAY,kBAAA,CAAkB,aAAA,CAAc,IAAA,CAAK,QAAQ,IAAI,CAAA;AAEnE,IAAA,IAAI,cAAc,SAAA,EAAW;AAC3B,MAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,IAAA,CAAK,IAAA,EAAM,SAAS,CAAA;AACxC,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEQ,oBAAoB,IAAA,EAA8B;AACxD,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,EAAW,OAAO,KAAA;AAE5B,IAAA,MAAM,cAAc,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,IAAK,KAAA;AACxD,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,IAAI,CAAA;AACzC,IAAA,MAAM,WAAA,GAAc,GAAA,GAAM,QAAQ,CAAA,KAAM,IAAA;AAExC,IAAA,IAAI,gBAAgB,WAAA,EAAa;AAC/B,MAAA,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,IAAA,CAAK,IAAA,EAAM,WAAW,CAAA;AAC5C,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AACF;;;ACvfO,SAAS,uBAAuB,KAAA,EAAgD;AACrF,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAgC;AAChD,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,IAAA,GAAO,KAAK,KAAA,IAAS,EAAA;AAC3B,IAAA,IAAI,IAAA,GAAO,GAAA,CAAI,GAAA,CAAI,IAAI,CAAA;AACvB,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,IAAA,GAAO,EAAC;AACR,MAAA,GAAA,CAAI,GAAA,CAAI,MAAM,IAAI,CAAA;AAClB,MAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,IACjB;AACA,IAAA,IAAA,CAAK,KAAK,IAAI,CAAA;AAAA,EAChB;AAEA,EAAA,MAAM,SAA8B,EAAC;AACrC,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,QAAQ,GAAA,CAAI,GAAA,CAAI,IAAI,CAAA,IAAK,IAAI,KAAA,EAAM;AACzC,IAAA,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAA,CAAO,EAAE,QAAA,IAAY,GAAA,KAAQ,CAAA,CAAE,QAAA,IAAY,GAAA,CAAI,CAAA;AAC7D,IAAA,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AAAA,EACnC;AACA,EAAA,OAAO,MAAA;AACT;;;ACjBO,IAAM,sBAAA,GAAyB;AAE/B,IAAM,sBAAA,GAAN,MAAM,uBAAA,CAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMlC,OAAO,YAAA,CACL,MAAA,EACA,QAAA,EACoB;AACpB,IAAA,MAAM,WAAW,MAAA,CAAO,iBAAA;AACxB,IAAA,IAAI,CAAC,UAAU,OAAO,QAAA;AACtB,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,EAAG,OAAO,QAAA;AACpC,IAAA,IAAI;AACF,MAAA,OAAO,QAAA,CAAS,UAAU,MAAM,CAAA;AAAA,IAClC,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,QAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,WAAA,CAAY,MAAA,EAAgB,IAAA,EAA8B;AAC/D,IAAA,IAAI,OAAO,IAAA,CAAK,OAAA,KAAY,UAAA,EAAY;AACtC,MAAA,IAAA,CAAK,QAAQ,MAAM,CAAA;AACnB,MAAA;AAAA,IACF;AACA,IAAA,MAAM,WAAW,MAAA,CAAO,QAAA;AACxB,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAA;AACjC,IAAA,IAAI,CAAC,GAAA,EAAK;AACV,IAAA,IAAI,IAAA,CAAK,aAAa,MAAA,EAAQ;AAC5B,MAAA,GAAA,CAAI,GAAG,KAAK,WAAW,CAAA;AAAA,IACzB,CAAA,MAAO;AACL,MAAA,GAAA,EAAI;AAAA,IACN;AAAA,EACF;AAAA,EAEQ,MAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,kBAAA,GAA0C,IAAA;AAAA,EAE1C,UAA+B,EAAC;AAAA,EAChC,aAAiC,EAAC;AAAA,EAClC,YAAA,uBAAmB,GAAA,EAAqB;AAAA,EACxC,aAAA,GAAgB,sBAAA;AAAA,EAExB,WAAA,CAAY,MAAA,EAAgB,QAAA,EAAsB,QAAA,EAAsC;AACtF,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,IAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,EACf;AAAA;AAAA,EAIA,IAAI,MAAA,GAA8B;AAChC,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA,EAEA,IAAI,SAAA,GAAgC;AAClC,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EACd;AAAA,EAEA,IAAI,WAAA,GAA4C;AAC9C,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACd;AAAA,EAEA,IAAI,YAAA,GAAuB;AACzB,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,EACd;AAAA;AAAA,EAGA,IAAI,SAAA,GAAqB;AACvB,IAAA,OAAO,KAAK,aAAA,IAAiB,CAAA;AAAA,EAC/B;AAAA,EAEA,IAAI,SAAA,GAAoB;AACtB,IAAA,OAAO,KAAK,UAAA,CAAW,MAAA;AAAA,EACzB;AAAA;AAAA,EAIA,WAAW,IAAA,EAAiC;AAC1C,IAAA,OAAO,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,IAAK,KAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ,IAAA,EAA8B;AACpC,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA,EAAG;AAC3B,IAAA,uBAAA,CAAuB,WAAA,CAAY,IAAA,CAAK,MAAA,EAAQ,IAAI,CAAA;AACpD,IAAA,IAAA,CAAK,aAAA,GAAgB,sBAAA;AACrB,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,OAAA,GAAgB;AACd,IAAA,MAAM,QAAQ,uBAAA,CAAuB,YAAA,CAAa,IAAA,CAAK,MAAA,EAAQ,KAAK,QAAQ,CAAA;AAC5E,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA,CAAK,UAAA,CAAW,KAAK,CAAA;AACpC,IAAA,IAAA,CAAK,aAAa,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAC,CAAA,KAAM,EAAE,KAAK,CAAA;AACrD,IAAA,IAAI,IAAA,CAAK,aAAA,IAAiB,IAAA,CAAK,UAAA,CAAW,MAAA,EAAQ;AAChD,MAAA,IAAA,CAAK,aAAA,GAAgB,sBAAA;AAAA,IACvB;AACA,IAAA,IAAA,CAAK,oBAAA,EAAqB;AAAA,EAC5B;AAAA;AAAA;AAAA,EAKA,SAAA,GAAoB;AAClB,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG;AAChC,MAAA,IAAA,CAAK,aAAA,GAAgB,sBAAA;AACrB,MAAA,OAAO,IAAA,CAAK,aAAA;AAAA,IACd;AACA,IAAA,IAAA,CAAK,aAAA,GAAgB,CAAA;AACrB,IAAA,IAAA,CAAK,QAAA,EAAS;AACd,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,EACd;AAAA;AAAA,EAGA,SAAA,GAAkB;AAChB,IAAA,IAAI,IAAA,CAAK,kBAAkB,sBAAA,EAAwB;AACnD,IAAA,IAAA,CAAK,aAAA,GAAgB,sBAAA;AACrB,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EAChB;AAAA;AAAA,EAGA,IAAA,GAAe;AACb,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG,OAAO,sBAAA;AACzC,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,aAAA,GAAgB,CAAA,GAAI,KAAK,IAAA,CAAK,aAAA;AAC/C,IAAA,IAAA,CAAK,aAAA,GAAA,CAAiB,GAAA,GAAM,CAAA,IAAK,IAAA,CAAK,UAAA,CAAW,MAAA;AACjD,IAAA,IAAA,CAAK,QAAA,EAAS;AACd,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,EACd;AAAA;AAAA,EAGA,IAAA,GAAe;AACb,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG,OAAO,sBAAA;AACzC,IAAA,MAAM,GAAA,GAAM,KAAK,UAAA,CAAW,MAAA;AAC5B,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,aAAA,GAAgB,CAAA,GAAI,MAAM,IAAA,CAAK,aAAA;AAChD,IAAA,IAAA,CAAK,aAAA,GAAA,CAAiB,GAAA,GAAM,CAAA,GAAI,GAAA,IAAO,GAAA;AACvC,IAAA,IAAA,CAAK,QAAA,EAAS;AACd,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,EACd;AAAA,EAEA,KAAA,GAAgB;AACd,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG,OAAO,sBAAA;AACzC,IAAA,IAAA,CAAK,aAAA,GAAgB,CAAA;AACrB,IAAA,IAAA,CAAK,QAAA,EAAS;AACd,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,EACd;AAAA,EAEA,IAAA,GAAe;AACb,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG,OAAO,sBAAA;AACzC,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAA,CAAK,UAAA,CAAW,MAAA,GAAS,CAAA;AAC9C,IAAA,IAAA,CAAK,QAAA,EAAS;AACd,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,EACd;AAAA;AAAA,EAGA,gBAAgB,KAAA,EAAqB;AACnC,IAAA,IAAI,KAAA,GAAQ,CAAA,IAAK,KAAA,IAAS,IAAA,CAAK,WAAW,MAAA,EAAQ;AAClD,IAAA,IAAI,IAAA,CAAK,kBAAkB,KAAA,EAAO;AAClC,IAAA,IAAA,CAAK,aAAA,GAAgB,KAAA;AACrB,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EAChB;AAAA;AAAA,EAGA,WAAA,GAAuC;AACrC,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,aAAa,CAAA,IAAK,IAAA;AAAA,EAChD;AAAA;AAAA,EAGA,aAAa,IAAA,EAAsB;AACjC,IAAA,OAAO,KAAK,UAAA,CAAW,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,IAAI,CAAA;AAAA,EACzD;AAAA;AAAA;AAAA,EAKA,SAAA,GAAkB;AAChB,IAAA,IAAA,CAAK,qBAAqB,MAAM;AAC9B,MAAA,IAAA,CAAK,oBAAA,EAAqB;AAAA,IAC5B,CAAA;AACA,IAAA,IAAA,CAAK,MAAA,CAAO,EAAA,CAAG,aAAA,EAAe,IAAA,CAAK,kBAAkB,CAAA;AAAA,EACvD;AAAA;AAAA,EAGA,OAAA,GAAgB;AACd,IAAA,IAAI,KAAK,kBAAA,EAAoB;AAC3B,MAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,aAAA,EAAe,IAAA,CAAK,kBAAkB,CAAA;AACtD,MAAA,IAAA,CAAK,kBAAA,GAAqB,IAAA;AAAA,IAC5B;AACA,IAAA,IAAA,CAAK,UAAU,EAAC;AAChB,IAAA,IAAA,CAAK,aAAa,EAAC;AACnB,IAAA,IAAA,CAAK,aAAa,KAAA,EAAM;AACxB,IAAA,IAAA,CAAK,aAAA,GAAgB,sBAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUQ,WAAW,KAAA,EAAgD;AACjE,IAAA,OAAO,uBAAuB,KAAK,CAAA;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,oBAAA,GAA6B;AACnC,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,IAAI,QAAA,GAAmE,IAAA;AACvE,IAAA,IAAI;AACF,MAAA,QAAA,GAAW,IAAA,CAAK,OAAO,GAAA,EAAI;AAAA,IAC7B,CAAA,CAAA,MAAQ;AACN,MAAA,QAAA,GAAW,IAAA;AAAA,IACb;AAEA,IAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,UAAA,EAAY;AAClC,MAAA,MAAM,MAAM,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,IAAK,KAAA;AAChD,MAAA,IAAI,GAAA,GAAM,KAAA;AAEV,MAAA,IAAI,KAAK,UAAA,EAAY;AACnB,QAAA,IAAI;AACF,UAAA,GAAA,GAAM,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,MAAM,CAAA;AAAA,QACnC,CAAA,CAAA,MAAQ;AACN,UAAA,GAAA,GAAM,KAAA;AAAA,QACR;AAAA,MACF,CAAA,MAAA,IAAW,OAAO,IAAA,CAAK,OAAA,KAAY,YAAY,QAAA,EAAU;AACvD,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,GAAS,QAAA,CAAS,IAAA,CAAK,OAAO,CAAA;AACpC,UAAA,IAAI,MAAA,EAAQ;AACV,YAAA,GAAA,GAAM,IAAA,CAAK,WAAA,EAAa,MAAA,GACpB,CAAC,MAAA,CAAO,GAAG,IAAA,CAAK,WAAW,CAAA,GAC3B,CAAC,MAAA,EAAO;AAAA,UACd;AAAA,QACF,CAAA,CAAA,MAAQ;AACN,UAAA,GAAA,GAAM,KAAA;AAAA,QACR;AAAA,MACF;AAEA,MAAA,IAAI,QAAQ,GAAA,EAAK;AACf,QAAA,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,IAAA,CAAK,IAAA,EAAM,GAAG,CAAA;AACpC,QAAA,OAAA,GAAU,IAAA;AAAA,MACZ;AAAA,IACF;AAEA,IAAA,IAAI,OAAA,OAAc,QAAA,EAAS;AAAA,EAC7B;AACF;;;ACpSO,IAAM,YAAA,GAAwB;AAAA;AAAA,EAEnC,KAAA,EACE,qQAAA;AAAA,EAEF,UAAA,EACE,wOAAA;AAAA,EAEF,aAAA,EACE,0RAAA;AAAA,EAEF,iBAAA,EACE,mnBAAA;AAAA,EAEF,IAAA,EACE,qcAAA;AAAA,EAEF,iBAAA,EACE,8YAAA;AAAA,EAEF,aAAA,EACE,wdAAA;AAAA,EAEF,eAAA,EACE,2bAAA;AAAA,EAEF,IAAA,EACE,orBAAA;AAAA;AAAA,EAGF,SAAA,EACE,sOAAA;AAAA,EAEF,KAAA,EACE,qMAAA;AAAA,EAEF,QAAA,EACE,gTAAA;AAAA,EAEF,QAAA,EACE,4WAAA;AAAA,EAEF,UAAA,EACE,gYAAA;AAAA,EAEF,SAAA,EACE,sVAAA;AAAA,EAEF,MAAA,EACE,kZAAA;AAAA,EAEF,SAAA,EACE,ucAAA;AAAA,EAEF,KAAA,EACE,qKAAA;AAAA;AAAA,EAGF,IAAA,EACE,+PAAA;AAAA,EAEF,WAAA,EACE,0XAAA;AAAA,EAEF,WAAA,EACE,wqBAAA;AAAA,EAEF,UAAA,EACE,yjBAAA;AAAA;AAAA,EAGF,aAAA,EACE,sSAAA;AAAA,EAEF,eAAA,EACE,oSAAA;AAAA,EAEF,cAAA,EACE,oSAAA;AAAA,EAEF,gBAAA,EACE,oSAAA;AAAA;AAAA,EAGF,cAAA,EACE,+QAAA;AAAA,EAEF,OAAA,EACE,gsBAAA;AAAA,EAEF,MAAA,EACE,ojBAAA;AAAA,EAEF,QAAA,EACE,ulBAAA;AAAA,EAEF,WAAA,EACE,sbAAA;AAAA;AAAA,EAGF,SAAA,EACE,0tBAAA;AAAA,EAEF,KAAA,EACE,yNAAA;AAAA;AAAA,EAGF,QAAA,EACE,4SAAA;AAAA;AAAA,EAGF,gBAAA,EACE,0TAAA;AAAA;AAAA,EAGF,KAAA,EACE,kZAAA;AAAA,EAEF,MAAA,EACE,0bAAA;AAAA,EAEF,UAAA,EACE,oYAAA;AAAA;AAAA,EAGF,KAAA,EACE,yYAAA;AAAA;AAAA,EAGF,KAAA,EACE,gPAAA;AAAA,EAEF,UAAA,EACE,0ZAAA;AAAA;AAAA,EAGF,qBAAA,EACE,uUAAA;AAAA,EAEF,cAAA,EACE,0SAAA;AAAA;AAAA,EAGF,KAAA,EACE,wRAAA;AAAA,EAEF,QAAA,EACE,oWAAA;AAAA;AAAA,EAGF,IAAA,EACE,sNAAA;AAAA,EAEF,eAAA,EACE,kXAAA;AAAA,EAEF,SAAA,EACE,+OAAA;AAAA,EAEF,IAAA,EACE;AACJ;;;AC5JO,IAAM,QAAA,GAAWA,MAAK,MAAA,CAAO;AAAA,EAClC,IAAA,EAAM,KAAA;AAAA,EACN,OAAA,EAAS,IAAA;AAAA,EACT,OAAA,EAAS;AACX,CAAC;;;ACJM,IAAM,IAAA,GAAOA,MAAK,MAAA,CAAO;AAAA,EAC9B,IAAA,EAAM,MAAA;AAAA,EACN,KAAA,EAAO;AACT,CAAC;;;ACQM,IAAM,SAAA,GAAYA,MAAK,MAAA,CAAyB;AAAA,EACrD,IAAA,EAAM,WAAA;AAAA,EACN,KAAA,EAAO,OAAA;AAAA,EACP,OAAA,EAAS,SAAA;AAAA,EACT,QAAA,EAAU,GAAA;AAAA,EAEV,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,gBAAgB;AAAC,KACnB;AAAA,EACF,CAAA;AAAA,EAEA,SAAA,GAAY;AACV,IAAA,OAAO,CAAC,EAAE,GAAA,EAAK,GAAA,EAAK,CAAA;AAAA,EACtB,CAAA;AAAA,EAEA,UAAA,CAAW,EAAE,cAAA,EAAe,EAAG;AAC7B,IAAA,OAAO,CAAC,GAAA,EAAK,EAAE,GAAG,IAAA,CAAK,QAAQ,cAAA,EAAgB,GAAG,cAAA,EAAe,EAAG,CAAC,CAAA;AAAA,EACvE,CAAA;AAAA,EAEA,WAAA,GAAc;AACZ,IAAA,MAAM,EAAE,MAAK,GAAI,IAAA;AACjB,IAAA,OAAO;AAAA,MACL,YAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM;AAChB,QAAA,OAAO,QAAA,CAAS,aAAa,IAAI,CAAA;AAAA,MACnC;AAAA,KACJ;AAAA,EACF,CAAA;AAAA,EAEA,oBAAA,GAAuB;AACrB,IAAA,MAAM,EAAE,QAAO,GAAI,IAAA;AACnB,IAAA,OAAO;AAAA,MACL,aAAa,MAAM;AACjB,QAAA,OAAO,MAAA,EAAQ,QAAA,CAAS,cAAc,CAAA,IAAI,IAAK,KAAA;AAAA,MACjD;AAAA,KACF;AAAA,EACF;AACF,CAAC;AC/BM,IAAM,OAAA,GAAUA,MAAK,MAAA,CAAuB;AAAA,EACjD,IAAA,EAAM,SAAA;AAAA,EACN,KAAA,EAAO,OAAA;AAAA,EACP,OAAA,EAAS,SAAA;AAAA,EACT,QAAA,EAAU,IAAA;AAAA,EAEV,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,CAAC,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAAA,MACnB,gBAAgB;AAAC,KACnB;AAAA,EACF,CAAA;AAAA,EAEA,aAAA,GAAgB;AACd,IAAA,OAAO;AAAA,MACL,KAAA,EAAO;AAAA,QACL,OAAA,EAAS,CAAA;AAAA,QACT,SAAA,EAAW,CAAC,OAAA,KAAyB;AACnC,UAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAA;AAC7C,UAAA,OAAO,KAAA,GAAQ,CAAC,CAAA,GAAI,QAAA,CAAS,MAAM,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI,CAAA;AAAA,QAC/C,CAAA;AAAA,QACA,YAAY,MAAM;AAEhB,UAAA,OAAO,EAAC;AAAA,QACV;AAAA;AACF,KACF;AAAA,EACF,CAAA;AAAA,EAEA,SAAA,GAAY;AAEV,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,MACzC,GAAA,EAAK,CAAA,CAAA,EAAI,MAAA,CAAO,KAAK,CAAC,CAAA,CAAA;AAAA,MACtB,KAAA,EAAO,EAAE,KAAA;AAAM,KACjB,CAAE,CAAA;AAAA,EACJ,CAAA;AAAA,EAEA,UAAA,CAAW,EAAE,IAAA,EAAM,cAAA,EAAe,EAAG;AACnC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAEhC,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,GAAI,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA;AACtF,IAAA,OAAO,CAAC,CAAA,CAAA,EAAI,MAAA,CAAO,UAAU,CAAC,CAAA,CAAA,EAAI,EAAE,GAAG,IAAA,CAAK,OAAA,CAAQ,cAAA,EAAgB,GAAG,cAAA,IAAkB,CAAC,CAAA;AAAA,EAC5F,CAAA;AAAA,EAEA,WAAA,GAAc;AACZ,IAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAI,IAAA;AAC1B,IAAA,OAAO;AAAA,MACL,YACE,CAAC,UAAA,KACD,CAAC,EAAE,UAAS,KAAM;AAChB,QAAA,MAAM,QAAQ,UAAA,EAAY,KAAA,IAAS,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,IAAK,CAAA;AACxD,QAAA,IAAI,CAAC,OAAA,CAAQ,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG;AACnC,UAAA,OAAO,KAAA;AAAA,QACT;AACA,QAAA,OAAO,QAAA,CAAS,YAAA,CAAa,IAAA,EAAM,EAAE,OAAO,CAAA;AAAA,MAC9C,CAAA;AAAA,MACF,eACE,CAAC,UAAA,KACD,CAAC,EAAE,UAAS,KAAM;AAChB,QAAA,MAAM,QAAQ,UAAA,EAAY,KAAA,IAAS,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,IAAK,CAAA;AACxD,QAAA,IAAI,CAAC,OAAA,CAAQ,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG;AACnC,UAAA,OAAO,KAAA;AAAA,QACT;AACA,QAAA,OAAO,SAAS,eAAA,CAAgB,IAAA,EAAM,WAAA,EAAa,EAAE,OAAO,CAAA;AAAA,MAC9D;AAAA,KACJ;AAAA,EACF,CAAA;AAAA,EAEA,oBAAA,GAAuB;AACrB,IAAA,MAAM,YAA2C,EAAC;AAClD,IAAA,MAAM,EAAE,OAAA,EAAS,MAAA,EAAO,GAAI,IAAA;AAE5B,IAAA,OAAA,CAAQ,MAAA,CAAO,OAAA,CAAQ,CAAC,KAAA,KAAU;AAChC,MAAA,SAAA,CAAU,WAAW,MAAA,CAAO,KAAK,CAAC,CAAA,CAAE,IAAI,MAAM;AAC5C,QAAA,OAAO,QAAQ,QAAA,CAAS,eAAe,IAAI,EAAE,KAAA,EAAO,CAAA,IAAK,KAAA;AAAA,MAC3D,CAAA;AAAA,IACF,CAAC,CAAA;AAsBD,IAAA,SAAA,CAAU,OAAO,IAAI,MAAe;AAClC,MAAA,IAAI,CAAC,QAAQ,OAAO,KAAA;AACpB,MAAA,MAAM,SAAEzC,OAAA,EAAO,IAAA,EAAK,GAAI,MAAA;AACxB,MAAA,MAAM,EAAE,WAAU,GAAIA,OAAA;AACtB,MAAA,IAAI,CAAC,SAAA,CAAU,KAAA,EAAO,OAAO,KAAA;AAC7B,MAAA,MAAM,EAAE,OAAM,GAAI,SAAA;AAClB,MAAA,IAAI,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,IAAA,KAAS,WAAW,OAAO,KAAA;AAEjD,MAAA,MAAM,aAAA,GAAgBA,OAAA,CAAM,MAAA,CAAO,KAAA,CAAM,WAAW,CAAA;AACpD,MAAA,IAAI,CAAC,eAAe,OAAO,KAAA;AAG3B,MAAA,IAAI,KAAA,CAAM,MAAA,CAAO,OAAA,CAAQ,IAAA,KAAS,CAAA,EAAG;AACnC,QAAA,IAAA,CAAK,QAAA;AAAA,UACHA,OAAA,CAAM,EAAA,CAAG,aAAA,CAAc,KAAA,CAAM,MAAA,CAAO,MAAM,KAAK,CAAA,EAAG,aAAa,CAAA,CAAE,cAAA;AAAe,SAClF;AACA,QAAA,OAAO,IAAA;AAAA,MACT;AAGA,MAAA,IAAI,MAAM,YAAA,KAAiB,KAAA,CAAM,MAAA,CAAO,OAAA,CAAQ,MAAM,OAAO,KAAA;AAE7D,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,KAAA,CAAM,KAAK,CAAA;AACrC,MAAA,MAAM,MAAA,GAASA,OAAA,CAAM,GAAA,CAAI,OAAA,CAAQ,KAAK,CAAA;AACtC,MAAA,MAAM,UAAA,GAAa,OAAO,KAAA,EAAM;AAIhC,MAAA,IAAI,CAAC,MAAA,CAAO,MAAA,CAAO,eAAe,UAAA,EAAY,UAAA,EAAY,aAAa,CAAA,EAAG;AACxE,QAAA,OAAO,KAAA;AAAA,MACT;AAEA,MAAA,MAAM,KAAKA,OAAA,CAAM,EAAA,CAAG,OAAO,KAAA,EAAO,aAAA,CAAc,QAAQ,CAAA;AAGxD,MAAA,EAAA,CAAG,aAAaC,mBAAAA,CAAc,MAAA,CAAO,GAAG,GAAA,EAAK,KAAA,GAAQ,CAAC,CAAC,CAAA;AACvD,MAAA,IAAA,CAAK,QAAA,CAAS,EAAA,CAAG,cAAA,EAAgB,CAAA;AACjC,MAAA,OAAO,IAAA;AAAA,IACT,CAAA;AAEA,IAAA,OAAO,SAAA;AAAA,EACT,CAAA;AAAA,EAEA,eAAA,GAAiC;AAC/B,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,CAAA,EAAG,UAAA;AAAA,MACH,CAAA,EAAG,UAAA;AAAA,MACH,CAAA,EAAG,YAAA;AAAA,MACH,CAAA,EAAG;AAAA,KACL;AAEA,IAAA,MAAM,YAAA,GAAgC,IAAA,CAAK,OAAA,CAAQ,MAAA,CAChD,MAAA,CAAO,CAAC,KAAA,KAAU,KAAA,IAAS,CAAC,CAAA,CAC5B,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,MACf,IAAA,EAAM,QAAA;AAAA,MACN,IAAA,EAAM,CAAA,OAAA,EAAU,MAAA,CAAO,KAAK,CAAC,CAAA,CAAA;AAAA,MAC7B,OAAA,EAAS,eAAA;AAAA,MACT,WAAA,EAAa,CAAC,EAAE,KAAA,EAAO,CAAA;AAAA,MACvB,UAAU,EAAE,IAAA,EAAM,WAAW,UAAA,EAAY,EAAE,OAAM,EAAE;AAAA,MACnD,IAAA,EAAM,OAAA,CAAQ,KAAK,CAAA,IAAK,OAAA;AAAA,MACxB,KAAA,EAAO,CAAA,QAAA,EAAW,MAAA,CAAO,KAAK,CAAC,CAAA,CAAA;AAAA,MAC/B,QAAA,EAAU,CAAA,QAAA,EAAW,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,KACpC,CAAE,CAAA;AAEJ,IAAA,MAAM,aAAA,GAA+B;AAAA,MACnC,IAAA,EAAM,QAAA;AAAA,MACN,IAAA,EAAM,WAAA;AAAA,MACN,OAAA,EAAS,cAAA;AAAA,MACT,QAAA,EAAU,WAAA;AAAA,MACV,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO,aAAA;AAAA,MACP,QAAA,EAAU;AAAA,KACZ;AAEA,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,UAAA;AAAA,QACN,IAAA,EAAM,SAAA;AAAA,QACN,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,SAAA;AAAA,QACP,KAAA,EAAO,CAAC,aAAA,EAAe,GAAG,YAAY,CAAA;AAAA,QACtC,KAAA,EAAO,QAAA;AAAA,QACP,QAAA,EAAU,GAAA;AAAA,QACV,WAAA,EAAa;AAAA;AACf,KACF;AAAA,EACF,CAAA;AAAA,EAEA,oBAAA,GAA2C;AACzC,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,CAAA,EAAG,UAAA;AAAA,MACH,CAAA,EAAG,UAAA;AAAA,MACH,CAAA,EAAG;AAAA,KACL;AACA,IAAA,MAAM,cAAA,GAAyC;AAAA,MAC7C,CAAA,EAAG,qBAAA;AAAA,MACH,CAAA,EAAG,wBAAA;AAAA,MACH,CAAA,EAAG;AAAA,KACL;AAEA,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,MAAA,CACjB,MAAA,CAAO,CAAC,KAAA,KAAU,KAAA,IAAS,CAAC,CAAA,CAC5B,GAAA,CAAI,CAAC,KAAA,MAA6B;AAAA,MACjC,IAAA,EAAM,CAAA,QAAA,EAAW,MAAA,CAAO,KAAK,CAAC,CAAA,CAAA;AAAA,MAC9B,KAAA,EAAO,CAAA,QAAA,EAAW,MAAA,CAAO,KAAK,CAAC,CAAA,CAAA;AAAA,MAC/B,WAAA,EAAa,cAAA,CAAe,KAAK,CAAA,IAAK,iBAAA;AAAA,MACtC,IAAA,EAAM,OAAA,CAAQ,KAAK,CAAA,IAAK,OAAA;AAAA,MACxB,KAAA,EAAO,OAAA;AAAA,MACP,QAAA,EAAU,MAAM,KAAA,GAAQ,EAAA;AAAA,MACxB,QAAA,EAAU,CAAC,SAAA,EAAW,CAAA,CAAA,EAAI,OAAO,KAAK,CAAC,IAAI,OAAO,CAAA;AAAA,MAClD,QAAA,EAAU,GAAA,CAAI,MAAA,CAAO,KAAK,CAAA,GAAI,GAAA;AAAA,MAC9B,OAAA,EAAS,eAAA;AAAA,MACT,WAAA,EAAa,CAAC,EAAE,KAAA,EAAO;AAAA,KACzB,CAAE,CAAA;AAAA,EACN,CAAA;AAAA,EAEA,qBAAA,GAAwB;AACtB,IAAA,MAAM,EAAE,OAAA,EAAS,MAAA,EAAO,GAAI,IAAA;AAK5B,IAAA,MAAM,cAAsC,EAAC;AAC7C,IAAA,KAAA,MAAW,KAAA,IAAS,QAAQ,MAAA,EAAQ;AAClC,MAAA,WAAA,CAAY,CAAA,KAAA,EAAQ,MAAA,CAAO,KAAK,CAAC,EAAE,CAAA,GAAI,KAAA;AAAA,IACzC;AAEA,IAAA,WAAA,CAAY,QAAQ,CAAA,GAAI,CAAA;AAExB,IAAA,OAAO;AAAA,MACL,IAAIC,YAAAA,CAAO;AAAA,QACT,GAAA,EAAK,IAAIwC,eAAA,CAAU,mBAAmB,CAAA;AAAA,QACtC,KAAA,EAAO;AAAA,UACL,eAAA,EAAiB;AAAA,YACf,OAAA,CAAQ,OAAO,KAAA,EAAO;AACpB,cAAA,IAAI,CAAC,MAAM,MAAA,IAAU,EAAE,MAAM,OAAA,IAAW,KAAA,CAAM,UAAU,OAAO,KAAA;AAC/D,cAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,KAAA,CAAM,IAAI,CAAA;AACpC,cAAA,IAAI,KAAA,KAAU,QAAW,OAAO,KAAA;AAEhC,cAAA,KAAA,CAAM,cAAA,EAAe;AACrB,cAAA,IAAI,UAAU,CAAA,EAAG;AACf,gBAAA,MAAA,EAAQ,QAAA,CAAS,cAAc,CAAA,IAAI;AAAA,cACrC,CAAA,MAAO;AACL,gBAAA,MAAA,EAAQ,QAAA,CAAS,eAAe,CAAA,GAAI,EAAE,OAAO,CAAA;AAAA,cAC/C;AACA,cAAA,OAAO,IAAA;AAAA,YACT;AAAA;AACF;AACF,OACD,CAAA;AAAA,MACDtC,aAAAA,CAAO;AAAA,QACL,SAAA,GAAY,CAAC,KAAA,EAAO,QAAA,KAAa;AAC/B,UAAA,MAAM,EAAE,WAAU,GAAI,KAAA;AACtB,UAAA,IAAI,CAAC,SAAA,CAAU,KAAA,EAAO,OAAO,KAAA;AAE7B,UAAA,MAAM,EAAE,OAAM,GAAI,SAAA;AAClB,UAAA,IAAI,KAAA,CAAM,YAAA,KAAiB,CAAA,EAAG,OAAO,KAAA;AACrC,UAAA,IAAI,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,IAAA,KAAS,WAAW,OAAO,KAAA;AAEjD,UAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,WAAW,CAAA;AACpD,UAAA,IAAI,CAAC,eAAe,OAAO,KAAA;AAE3B,UAAA,IAAI,QAAA,EAAU;AACZ,YAAA,QAAA;AAAA,cACE,KAAA,CAAM,EAAA,CAAG,aAAA,CAAc,KAAA,CAAM,MAAA,CAAO,MAAM,KAAK,CAAA,EAAG,aAAa,CAAA,CAAE,cAAA;AAAe,aAClF;AAAA,UACF;AACA,UAAA,OAAO,IAAA;AAAA,QACT,CAAA;AAAA,OACD;AAAA,KACH;AAAA,EACF,CAAA;AAAA,EAEA,aAAA,GAAgB;AACd,IAAA,MAAM,EAAE,QAAA,EAAU,OAAA,EAAQ,GAAI,IAAA;AAE9B,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,OAAO,EAAC;AAAA,IACV;AAEA,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,GAAG,QAAQ,MAAM,CAAA;AAC3C,IAAA,OAAO;AAAA,MACL,sBAAA,CAAuB;AAAA,QACrB,MAAM,IAAI,MAAA,CAAO,SAAS,MAAA,CAAO,QAAQ,CAAC,CAAA,MAAA,CAAQ,CAAA;AAAA,QAClD,IAAA,EAAM,QAAA;AAAA,QACN,aAAA,EAAe,CAAC,KAAA,KAAU;AACxB,UAAA,MAAM,MAAA,GAAS,MAAM,CAAC,CAAA;AACtB,UAAA,IAAI,CAAC,MAAA,EAAQ;AACX,YAAA,OAAO,IAAA;AAAA,UACT;AACA,UAAA,MAAM,QAAQ,MAAA,CAAO,MAAA;AAErB,UAAA,IAAI,CAAC,OAAA,CAAQ,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG;AACnC,YAAA,OAAO,IAAA;AAAA,UACT;AACA,UAAA,OAAO,EAAE,KAAA,EAAM;AAAA,QACjB;AAAA,OACD;AAAA,KACH;AAAA,EACF;AACF,CAAC;;;AC7SM,IAAM,UAAA,GAAaqC,MAAK,MAAA,CAA0B;AAAA,EACvD,IAAA,EAAM,YAAA;AAAA,EACN,KAAA,EAAO,OAAA;AAAA,EACP,OAAA,EAAS,QAAA;AAAA,EACT,QAAA,EAAU,IAAA;AAAA,EAEV,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,gBAAgB;AAAC,KACnB;AAAA,EACF,CAAA;AAAA,EAEA,SAAA,GAAY;AACV,IAAA,OAAO,CAAC,EAAE,GAAA,EAAK,YAAA,EAAc,CAAA;AAAA,EAC/B,CAAA;AAAA,EAEA,UAAA,CAAW,EAAE,cAAA,EAAe,EAAG;AAC7B,IAAA,OAAO,CAAC,YAAA,EAAc,EAAE,GAAG,IAAA,CAAK,QAAQ,cAAA,EAAgB,GAAG,cAAA,EAAe,EAAG,CAAC,CAAA;AAAA,EAChF,CAAA;AAAA,EAEA,WAAA,GAAc;AACZ,IAAA,MAAM,EAAE,MAAK,GAAI,IAAA;AACjB,IAAA,OAAO;AAAA,MACL,aAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM;AAChB,QAAA,OAAO,QAAA,CAAS,OAAO,IAAI,CAAA;AAAA,MAC7B,CAAA;AAAA,MACF,gBAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM;AAChB,QAAA,OAAO,QAAA,CAAS,WAAW,IAAI,CAAA;AAAA,MACjC,CAAA;AAAA,MACF,eAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM;AAChB,QAAA,OAAO,SAAS,IAAA,EAAK;AAAA,MACvB;AAAA,KACJ;AAAA,EACF,CAAA;AAAA,EAEA,oBAAA,GAAuB;AACrB,IAAA,MAAM,EAAE,QAAO,GAAI,IAAA;AACnB,IAAA,OAAO;AAAA,MACL,eAAe,MAAM;AACnB,QAAA,OAAO,MAAA,EAAQ,QAAA,CAAS,kBAAkB,CAAA,IAAI,IAAK,KAAA;AAAA,MACrD;AAAA,KACF;AAAA,EACF,CAAA;AAAA,EAEA,eAAA,GAAiC;AAC/B,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,YAAA;AAAA,QACN,OAAA,EAAS,kBAAA;AAAA,QACT,QAAA,EAAU,YAAA;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,KAAA,EAAO,YAAA;AAAA,QACP,QAAA,EAAU,aAAA;AAAA,QACV,KAAA,EAAO,QAAA;AAAA,QACP,QAAA,EAAU;AAAA;AACZ,KACF;AAAA,EACF,CAAA;AAAA,EAEA,oBAAA,GAA2C;AACzC,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,YAAA;AAAA,QACN,KAAA,EAAO,OAAA;AAAA,QACP,WAAA,EAAa,iBAAA;AAAA,QACb,IAAA,EAAM,QAAA;AAAA,QACN,KAAA,EAAO,OAAA;AAAA,QACP,QAAA,EAAU,GAAA;AAAA,QACV,QAAA,EAAU,CAAC,OAAA,EAAS,YAAA,EAAc,UAAU,CAAA;AAAA,QAC5C,QAAA,EAAU,IAAA;AAAA,QACV,OAAA,EAAS;AAAA;AACX,KACF;AAAA,EACF,CAAA;AAAA,EAEA,aAAA,GAAgB;AACd,IAAA,MAAM,EAAE,UAAS,GAAI,IAAA;AAErB,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,OAAO,EAAC;AAAA,IACV;AAEA,IAAA,OAAO;AAAA,MACL,kBAAkB,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,UAAU;AAAA,KACxD;AAAA,EACF;AACF,CAAC;ACtFM,IAAM,SAAA,GAAYA,MAAK,MAAA,CAAyB;AAAA,EACrD,IAAA,EAAM,WAAA;AAAA,EACN,KAAA,EAAO,OAAA;AAAA,EACP,OAAA,EAAS,OAAA;AAAA,EACT,KAAA,EAAO,EAAA;AAAA,EACP,IAAA,EAAM,IAAA;AAAA,EACN,QAAA,EAAU,IAAA;AAAA,EAEV,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,mBAAA,EAAqB,WAAA;AAAA,MACrB,gBAAgB,EAAC;AAAA,MACjB,iBAAA,EAAmB;AAAA,KACrB;AAAA,EACF,CAAA;AAAA,EAEA,aAAA,GAAgB;AACd,IAAA,MAAM,EAAE,SAAQ,GAAI,IAAA;AACpB,IAAA,OAAO;AAAA,MACL,QAAA,EAAU;AAAA,QACR,OAAA,EAAS,IAAA;AAAA,QACT,SAAA,EAAW,CAAC,OAAA,KAAyB;AACnC,UAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,aAAA,CAAc,MAAM,CAAA;AAC3C,UAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAEpB,UAAA,MAAM,SAAS,OAAA,CAAQ,mBAAA;AAGvB,UAAA,MAAM,OAAA,GAAU,MAAA,CAAO,SAAA,CAAU,KAAA,CAAM,KAAK,CAAA;AAC5C,UAAA,KAAA,MAAW,OAAO,OAAA,EAAS;AACzB,YAAA,IAAI,GAAA,CAAI,UAAA,CAAW,MAAM,CAAA,EAAG;AAC1B,cAAA,OAAO,GAAA,CAAI,KAAA,CAAM,MAAA,CAAO,MAAM,CAAA,IAAK,IAAA;AAAA,YACrC;AAAA,UACF;AACA,UAAA,OAAO,IAAA;AAAA,QACT,CAAA;AAAA,QACA,YAAY,MAAM;AAEhB,UAAA,OAAO,EAAC;AAAA,QACV;AAAA;AACF,KACF;AAAA,EACF,CAAA;AAAA,EAEA,SAAA,GAAY;AACV,IAAA,OAAO;AAAA,MACL;AAAA,QACE,GAAA,EAAK,KAAA;AAAA,QACL,kBAAA,EAAoB;AAAA;AACtB,KACF;AAAA,EACF,CAAA;AAAA,EAEA,UAAA,CAAW,EAAE,IAAA,EAAM,cAAA,EAAe,EAAG;AACnC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA;AAEtC,IAAA,MAAM,YAAqC,EAAC;AAC5C,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,SAAA,CAAU,OAAO,CAAA,GAAI,CAAA,EAAG,KAAK,OAAA,CAAQ,mBAAmB,GAAG,QAAQ,CAAA,CAAA;AAAA,IACrE;AAEA,IAAA,OAAO;AAAA,MACL,KAAA;AAAA,MACA,EAAE,GAAG,IAAA,CAAK,OAAA,CAAQ,cAAA,EAAgB,GAAG,cAAA,EAAe;AAAA,MACpD,CAAC,MAAA,EAAQ,SAAA,EAAW,CAAC;AAAA,KACvB;AAAA,EACF,CAAA;AAAA,EAEA,WAAA,GAAc;AACZ,IAAA,MAAM,EAAE,MAAK,GAAI,IAAA;AACjB,IAAA,OAAO;AAAA,MACL,cACE,CAAC,UAAA,KACD,CAAC,EAAE,UAAS,KAAM;AAChB,QAAA,OAAO,QAAA,CAAS,YAAA,CAAa,IAAA,EAAM,UAAU,CAAA;AAAA,MAC/C,CAAA;AAAA,MACF,iBACE,CAAC,UAAA,KACD,CAAC,EAAE,UAAS,KAAM;AAChB,QAAA,OAAO,QAAA,CAAS,eAAA,CAAgB,IAAA,EAAM,WAAA,EAAa,UAAU,CAAA;AAAA,MAC/D;AAAA,KACJ;AAAA,EACF,CAAA;AAAA,EAEA,oBAAA,GAAuB;AACrB,IAAA,MAAM,EAAE,QAAO,GAAI,IAAA;AAEnB,IAAA,MAAM,gBAAgB,MAAe;AACnC,MAAA,IAAI,CAAC,QAAQ,OAAO,KAAA;AACpB,MAAA,MAAM,SAAEzC,OAAA,EAAO,IAAA,EAAK,GAAI,MAAA;AACxB,MAAA,MAAM,KAAA,GAAQA,OAAA,CAAM,SAAA,CAAU,KAAA,CAAM,KAAA,EAAM;AAC1C,MAAA,MAAM,YAAYA,OAAA,CAAM,MAAA,CAAO,KAAA,CAAM,WAAW,GAAG,aAAA,EAAc;AACjE,MAAA,IAAI,CAAC,WAAW,OAAO,KAAA;AACvB,MAAA,MAAM,EAAA,GAAKA,OAAA,CAAM,EAAA,CAAG,MAAA,CAAO,OAAO,SAAS,CAAA;AAC3C,MAAA,EAAA,CAAG,YAAA,CAAaC,oBAAc,IAAA,CAAK,EAAA,CAAG,IAAI,OAAA,CAAQ,KAAA,GAAQ,CAAC,CAAC,CAAC,CAAA;AAC7D,MAAA,IAAA,CAAK,QAAA,CAAS,EAAA,CAAG,cAAA,EAAgB,CAAA;AACjC,MAAA,OAAO,IAAA;AAAA,IACT,CAAA;AAEA,IAAA,OAAO;AAAA,MACL,aAAa,MAAM,MAAA,EAAQ,QAAA,CAAS,iBAAiB,KAAI,IAAK,KAAA;AAAA,MAE9D,OAAO,MAAM;AACX,QAAA,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,iBAAA,IAAqB,CAAC,QAAQ,OAAO,KAAA;AACvD,QAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAA,CAAO,KAAA,CAAM,SAAA;AAC/B,QAAA,IAAI,KAAA,CAAM,MAAA,CAAO,IAAA,KAAS,IAAA,CAAK,UAAU,OAAO,KAAA;AAChD,QAAA,MAAM,MAAM,KAAA,CAAM,YAAA;AAClB,QAAA,IAAI,MAAM,CAAA,IAAK,GAAA,KAAQ,MAAM,MAAA,CAAO,OAAA,CAAQ,MAAM,OAAO,KAAA;AACzD,QAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,WAAA;AAC1B,QAAA,IAAI,IAAA,CAAK,GAAA,GAAM,CAAC,CAAA,KAAM,IAAA,IAAQ,KAAK,GAAA,GAAM,CAAC,CAAA,KAAM,IAAA,EAAM,OAAO,KAAA;AAC7D,QAAA,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,KAAA,CAAM,EAAA,CAAG,MAAA,CAAO,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,KAAA,CAAM,GAAG,CAAC,CAAA;AACrE,QAAA,OAAO,aAAA,EAAc;AAAA,MACvB,CAAA;AAAA,MAEA,WAAW,MAAM;AACf,QAAA,IAAI,CAAC,QAAQ,OAAO,KAAA;AACpB,QAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAA,CAAO,KAAA,CAAM,SAAA;AAC/B,QAAA,IAAI,KAAA,CAAM,MAAA,CAAO,IAAA,KAAS,IAAA,CAAK,UAAU,OAAO,KAAA;AAChD,QAAA,IAAI,MAAM,YAAA,KAAiB,KAAA,CAAM,MAAA,CAAO,OAAA,CAAQ,MAAM,OAAO,KAAA;AAC7D,QAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,EAAM;AAC1B,QAAA,IAAI,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,GAAA,CAAI,OAAA,CAAQ,IAAA,IAAQ,MAAA,CAAO,KAAA,CAAM,GAAA,CAAI,OAAA,CAAQ,KAAK,CAAA,CAAE,WAAW,OAAO,KAAA;AAC/F,QAAA,OAAO,aAAA,EAAc;AAAA,MACvB;AAAA,KACF;AAAA,EACF,CAAA;AAAA,EAEA,eAAA,GAAiC;AAC/B,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,WAAA;AAAA,QACN,OAAA,EAAS,iBAAA;AAAA,QACT,QAAA,EAAU,WAAA;AAAA,QACV,IAAA,EAAM,WAAA;AAAA,QACN,KAAA,EAAO,YAAA;AAAA,QACP,QAAA,EAAU,WAAA;AAAA,QACV,KAAA,EAAO,QAAA;AAAA,QACP,QAAA,EAAU;AAAA;AACZ,KACF;AAAA,EACF,CAAA;AAAA,EAEA,oBAAA,GAA2C;AACzC,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,YAAA;AAAA,QACN,KAAA,EAAO,YAAA;AAAA,QACP,WAAA,EAAa,wBAAA;AAAA,QACb,IAAA,EAAM,WAAA;AAAA,QACN,KAAA,EAAO,OAAA;AAAA,QACP,QAAA,EAAU,GAAA;AAAA,QACV,QAAA,EAAU,CAAC,MAAA,EAAQ,SAAA,EAAW,KAAK,CAAA;AAAA,QACnC,QAAA,EAAU,MAAA;AAAA,QACV,OAAA,EAAS;AAAA;AACX,KACF;AAAA,EACF,CAAA;AAAA,EAEA,aAAA,GAAgB;AACd,IAAA,MAAM,EAAE,UAAS,GAAI,IAAA;AAErB,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,OAAO,EAAC;AAAA,IACV;AAEA,IAAA,OAAO;AAAA,MACL,sBAAA,CAAuB;AAAA,QACrB,IAAA,EAAM,sBAAA;AAAA,QACN,IAAA,EAAM,QAAA;AAAA,QACN,aAAA,EAAe,CAAC,KAAA,KAAU;AACxB,UAAA,MAAM,QAAA,GAAW,KAAA,CAAM,CAAC,CAAA,IAAK,IAAA;AAC7B,UAAA,OAAO,EAAE,QAAA,EAAS;AAAA,QACpB;AAAA,OACD;AAAA,KACH;AAAA,EACF;AACF,CAAC;ACvLD,IAAM,mCAAmB,IAAI,GAAA,CAAI,CAAC,YAAA,EAAc,aAAA,EAAe,UAAU,CAAC,CAAA;AAa1E,SAAS,kBAAA,CACP,QACA,YAAA,EACyE;AACzE,EAAA,MAAM,EAAE,KAAA,EAAO,IAAA,EAAK,GAAI,MAAA;AACxB,EAAA,MAAM,YAAA,GAAe,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,YAAY,CAAA;AACpD,EAAA,IAAI,CAAC,cAAc,OAAO,IAAA;AAE1B,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,KAAA,CAAM,SAAA;AACxB,EAAA,KAAA,IAAS,CAAA,GAAI,KAAA,CAAM,KAAA,EAAO,CAAA,GAAI,GAAG,CAAA,EAAA,EAAK;AACpC,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA;AAEzB,IAAA,IAAI,IAAA,CAAK,KAAK,IAAA,CAAK,QAAA,IAAY,KAAK,IAAA,KAAS,YAAA,IAAgB,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS;AAC9E,MAAA,MAAM,SAAS,CAAA,GAAI,CAAA,GAAI,MAAM,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA,GAAI,IAAA;AAC3C,MAAA,IAAI,QAAQ,IAAA,CAAK,IAAA,CAAK,KAAA,EAAO,QAAA,CAAS,MAAM,CAAA,EAAG;AAC7C,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF;AACA,IAAA,IAAI,IAAA,CAAK,SAAS,YAAA,EAAc;AAC9B,MAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,YAAA,EAAa;AAAA,IACrC;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAEO,IAAM,UAAA,GAAa,UAAU,MAAA,CAA0B;AAAA,EAC5D,IAAA,EAAM,YAAA;AAAA,EAEN,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,QAAA,EAAU;AAAA,KACZ;AAAA,EACF,CAAA;AAAA,EAEA,oBAAA,GAAuB;AACrB,IAAA,OAAO;AAAA;AAAA,MAEL,KAAK,MAAM;AACT,QAAA,IAAI,CAAC,IAAA,CAAK,MAAA,EAAQ,OAAO,KAAA;AACzB,QAAA,MAAM,MAAM,kBAAA,CAAmB,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,QAAQ,QAAQ,CAAA;AACjE,QAAA,IAAI,CAAC,KAAK,OAAO,KAAA;AACjB,QAAA,OAAO0C,uBAAA,CAAa,IAAI,YAAY,CAAA,CAAE,IAAI,KAAA,EAAO,GAAA,CAAI,KAAK,QAAQ,CAAA;AAAA,MACpE,CAAA;AAAA;AAAA,MAGA,aAAa,MAAM;AACjB,QAAA,IAAI,CAAC,IAAA,CAAK,MAAA,EAAQ,OAAO,KAAA;AACzB,QAAA,MAAM,MAAM,kBAAA,CAAmB,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,QAAQ,QAAQ,CAAA;AACjE,QAAA,IAAI,CAAC,KAAK,OAAO,KAAA;AACjB,QAAA,OAAOvB,uBAAAA,CAAa,IAAI,YAAY,CAAA,CAAE,IAAI,KAAA,EAAO,GAAA,CAAI,KAAK,QAAQ,CAAA;AAAA,MACpE,CAAA;AAAA;AAAA,MAGA,WAAW,MAAM;AACf,QAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,QAAA,IAAI,CAAC,QAAQ,OAAO,KAAA;AAEpB,QAAA,MAAM,SAAEpB,OAAA,EAAO,IAAA,EAAK,GAAI,MAAA;AACxB,QAAA,MAAM,EAAE,KAAA,EAAO,KAAA,EAAM,GAAIA,OAAA,CAAM,SAAA;AAG/B,QAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,YAAA,KAAiB,GAAG,OAAO,KAAA;AAc/C,QAAA,IACE,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,IAAA,KAAS,WAAA,IAC3B,KAAA,CAAM,MAAA,CAAO,OAAA,CAAQ,IAAA,KAAS,CAAA,IAC9B,KAAA,CAAM,KAAA,IAAS,CAAA,EACf;AACA,UAAA,MAAM,cAAA,GAAiB,MAAM,KAAA,GAAQ,CAAA;AACrC,UAAA,MAAM,GAAA,GAAM,KAAA,CAAM,KAAA,CAAM,cAAc,CAAA;AACtC,UAAA,IAAI,MAAM,CAAA,EAAG;AACX,YAAA,MAAM,SAAA,GAAY,KAAA,CAAM,IAAA,CAAK,cAAc,CAAA;AAC3C,YAAA,MAAM,IAAA,GAAO,SAAA,CAAU,KAAA,CAAM,GAAA,GAAM,CAAC,CAAA;AACpC,YAAA,IAAI,gBAAA,CAAiB,GAAA,CAAI,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,EAAG;AACxC,cAAA,MAAM,SAAA,GAAY,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,KAAK,CAAA;AAC1C,cAAA,MAAM,OAAA,GAAU,KAAA,CAAM,KAAA,CAAM,KAAA,CAAM,KAAK,CAAA;AACvC,cAAA,MAAM,OAAA,GAAU,SAAA;AAChB,cAAA,MAAM,SAAA,GAAY,UAAU,IAAA,CAAK,QAAA;AACjC,cAAA,IAAI,gBAAA,GAAmB,EAAA;AACvB,cAAAA,OAAA,CAAM,IAAI,YAAA,CAAa,SAAA,EAAW,OAAA,EAAS,CAAC,GAAG,CAAA,KAAM;AACnD,gBAAA,IAAI,EAAE,WAAA,EAAa,gBAAA,GAAmB,CAAA,GAAI,CAAA,GAAI,EAAE,OAAA,CAAQ,IAAA;AACxD,gBAAA,OAAO,IAAA;AAAA,cACT,CAAC,CAAA;AACD,cAAA,IAAI,qBAAqB,EAAA,EAAI;AAC3B,gBAAA,MAAM,EAAA,GAAKA,OAAA,CAAM,EAAA,CAAG,MAAA,CAAO,WAAW,OAAO,CAAA;AAS7C,gBAAA,MAAM,IAAA,GAAO,MAAM,CAAA,GAAI,SAAA,CAAU,aAC7B,SAAA,CAAU,KAAA,CAAM,GAAA,GAAM,CAAC,CAAA,GACvB,IAAA;AACJ,gBAAA,IAAI,IAAA,EAAM,SAAS,IAAA,CAAK,IAAA,IAAQY,kBAAQ,EAAA,CAAG,GAAA,EAAK,SAAS,CAAA,EAAG;AAC1D,kBAAA,EAAA,CAAG,KAAK,SAAS,CAAA;AAAA,gBACnB;AAEA,gBAAA,EAAA,CAAG,aAAaX,mBAAAA,CAAc,MAAA,CAAO,EAAA,CAAG,GAAA,EAAK,gBAAgB,CAAC,CAAA;AAC9D,gBAAA,IAAA,CAAK,QAAA,CAAS,EAAA,CAAG,cAAA,EAAgB,CAAA;AACjC,gBAAA,OAAO,IAAA;AAAA,cACT;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAEA,QAAA,MAAM,eAAeD,OAAA,CAAM,MAAA,CAAO,KAAA,CAAM,IAAA,CAAK,QAAQ,QAAQ,CAAA;AAC7D,QAAA,IAAI,CAAC,cAAc,OAAO,KAAA;AAG1B,QAAA,IAAI,aAAA,GAAgB,EAAA;AACpB,QAAA,KAAA,IAAS,CAAA,GAAI,KAAA,CAAM,KAAA,EAAO,CAAA,GAAI,GAAG,CAAA,EAAA,EAAK;AACpC,UAAA,IAAI,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,CAAE,SAAS,YAAA,EAAc;AACvC,YAAA,aAAA,GAAgB,CAAA;AAChB,YAAA;AAAA,UACF;AAAA,QACF;AAEA,QAAA,IAAI,aAAA,KAAkB,IAAI,OAAO,KAAA;AAIjC,QAAA,MAAM,YAAA,GAAe,KAAA,CAAM,IAAA,CAAK,aAAa,CAAA;AAC7C,QAAA,MAAM,aAAa,YAAA,CAAa,UAAA;AAEhC,QAAA,IAAI,YAAY,WAAA,EAAa;AAE3B,UAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,GAAA,GAAM,KAAA,CAAM,MAAM,aAAa,CAAA;AAC3D,UAAA,IAAI,iBAAiB,CAAA,EAAG;AACtB,YAAA,OAAOoB,uBAAAA,CAAa,YAAY,CAAA,CAAEpB,OAAA,EAAO,KAAK,QAAQ,CAAA;AAAA,UACxD;AAAA,QACF;AAEA,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,KACF;AAAA,EACF;AACF,CAAC;;;AClKM,IAAM,QAAA,GAAWyC,MAAK,MAAA,CAAwB;AAAA,EACnD,IAAA,EAAM,UAAA;AAAA;AAAA;AAAA,EAGN,OAAA,EAAS,kBAAA;AAAA,EACT,QAAA,EAAU,IAAA;AAAA,EAEV,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,gBAAgB;AAAC,KACnB;AAAA,EACF,CAAA;AAAA,EAEA,SAAA,GAAY;AACV,IAAA,OAAO,CAAC,EAAE,GAAA,EAAK,IAAA,EAAM,CAAA;AAAA,EACvB,CAAA;AAAA,EAEA,UAAA,CAAW,EAAE,cAAA,EAAe,EAAG;AAC7B,IAAA,OAAO,CAAC,IAAA,EAAM,EAAE,GAAG,IAAA,CAAK,QAAQ,cAAA,EAAgB,GAAG,cAAA,EAAe,EAAG,CAAC,CAAA;AAAA,EACxE,CAAA;AAAA,EAEA,aAAA,GAAgB;AACd,IAAA,OAAO,CAAC,UAAU,CAAA;AAAA,EACpB,CAAA;AAAA,EAEA,oBAAA,GAAuB;AACrB,IAAA,OAAO;AAAA,MACL,OAAO,MAAM;AACX,QAAA,IAAI,CAAC,IAAA,CAAK,MAAA,IAAU,CAAC,IAAA,CAAK,UAAU,OAAO,KAAA;AAC3C,QAAA,MAAM,SAAEzC,OAAA,EAAO,IAAA,EAAK,GAAI,IAAA,CAAK,MAAA;AAC7B,QAAA,MAAM,EAAE,KAAA,EAAM,GAAIA,OAAA,CAAM,SAAA;AACxB,QAAA,IAAI,KAAA,CAAM,KAAA,GAAQ,CAAA,IAAK,KAAA,CAAM,IAAA,CAAK,EAAE,CAAA,CAAE,IAAA,KAAS,IAAA,CAAK,QAAA,EAAU,OAAO,KAAA;AAGrE,QAAA,IAAI,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,IAAA,KAAS,aAAa,OAAO,KAAA;AAInD,QAAA,MAAM,GAAA,GAAM,yBAAyB,KAAK,CAAA;AAC1C,QAAA,IAAI,KAAK,gBAAA,EAAkB;AACzB,UAAA,IAAI,IAAI,gBAAA,EAAkB;AACxB,YAAA,IAAI,0BAA0BA,OAAA,EAAO,IAAA,CAAK,QAAA,EAAU,GAAG,GAAG,OAAO,IAAA;AAAA,UACnE,CAAA,MAAO;AACL,YAAA,IAAI4C,mBAAA,CAAW5C,OAAA,EAAO,IAAA,CAAK,QAAQ,GAAG,OAAO,IAAA;AAAA,UAC/C;AAAA,QACF;AAEA,QAAA,IAAI6C,wBAAA,CAAc,KAAK,QAAQ,CAAA,CAAE7C,SAAO,IAAA,CAAK,QAAQ,GAAG,OAAO,IAAA;AAM/D,QAAA,MAAM,SAAA,GAAY,MAAM,KAAA,GAAQ,CAAA;AAChC,QAAA,MAAM,YAAA,GAAeA,OAAA,CAAM,MAAA,CAAO,KAAA,CAAM,UAAU,CAAA;AAClD,QAAA,IAAI,KAAA,CAAM,MAAA,CAAO,OAAA,CAAQ,IAAA,KAAS,KAAK,SAAA,GAAY,CAAA,IAC9C,YAAA,IAAgB,KAAA,CAAM,IAAA,CAAK,SAAA,GAAY,CAAC,CAAA,CAAE,SAAS,YAAA,EAAc;AACpE,UAAA,MAAM,KAAKA,OAAA,CAAM,EAAA;AACjB,UAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,SAAS,EAAE,UAAA,IAAc,CAAA,GAAI,SAAA,GAAY,KAAA,CAAM,KAAA,GAAQ,CAAA;AACnF,UAAA,EAAA,CAAG,MAAA,CAAO,MAAM,MAAA,CAAO,QAAQ,GAAG,KAAA,CAAM,KAAA,CAAM,QAAQ,CAAC,CAAA;AACvD,UAAA,MAAM,gBAAgB,SAAA,GAAY,CAAA;AAClC,UAAA,MAAM,MAAM,EAAA,CAAG,OAAA,CAAQ,IAAI,KAAA,CAAM,KAAA,CAAM,aAAa,CAAC,CAAA;AACrD,UAAA,MAAM,IAAA,GAAO,aAAa,aAAA,EAAc;AACxC,UAAA,IAAI,IAAA,EAAM;AACR,YAAA,EAAA,CAAG,MAAA,CAAO,KAAK,IAAI,CAAA;AACnB,YAAA,EAAA,CAAG,YAAA,CAAa8C,gBAAU,IAAA,CAAK,EAAA,CAAG,IAAI,OAAA,CAAQ,GAAA,GAAM,CAAC,CAAC,CAAC,CAAA;AACvD,YAAA,IAAA,CAAK,QAAA,CAAS,EAAA,CAAG,cAAA,EAAgB,CAAA;AACjC,YAAA,OAAO,IAAA;AAAA,UACT;AAAA,QACF;AAEA,QAAA,OAAO1B,wBAAa,IAAA,CAAK,QAAQ,CAAA,CAAEpB,OAAA,EAAO,KAAK,QAAQ,CAAA;AAAA,MACzD,CAAA;AAAA,MAEA,WAAW,MAAM;AACf,QAAA,IAAI,CAAC,IAAA,CAAK,MAAA,IAAU,CAAC,IAAA,CAAK,UAAU,OAAO,KAAA;AAC3C,QAAA,MAAM,EAAE,KAAA,EAAO,IAAA,EAAK,GAAI,IAAA,CAAK,MAAA;AAC7B,QAAA,MAAM,EAAE,KAAA,EAAO,KAAA,EAAM,GAAI,KAAA,CAAM,SAAA;AAC/B,QAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,YAAA,KAAiB,GAAG,OAAO,KAAA;AAC/C,QAAA,IAAI,KAAA,CAAM,MAAA,CAAO,OAAA,CAAQ,IAAA,KAAS,GAAG,OAAO,KAAA;AAI5C,QAAA,MAAM,GAAA,GAAM,yBAAyB,KAAK,CAAA;AAC1C,QAAA,IAAI,GAAA,IAAO,GAAA,CAAI,gBAAA,IAAoB,GAAA,CAAI,gBAAA,EAAkB;AACvD,UAAA,IAAI,+BAA+B,KAAA,EAAO,IAAA,CAAK,QAAA,EAAU,GAAG,GAAG,OAAO,IAAA;AAAA,QACxE;AAEA,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,KACF;AAAA,EACF;AACF,CAAC;;;AC/FM,IAAM,UAAA,GAAayC,MAAK,MAAA,CAA0B;AAAA,EACvD,IAAA,EAAM,YAAA;AAAA,EACN,KAAA,EAAO,YAAA;AAAA,EACP,OAAA,EAAS,WAAA;AAAA,EAET,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,gBAAgB,EAAC;AAAA,MACjB,YAAA,EAAc;AAAA,KAChB;AAAA,EACF,CAAA;AAAA,EAEA,SAAA,GAAY;AACV,IAAA,OAAO,CAAC,EAAE,GAAA,EAAK,IAAA,EAAM,CAAA;AAAA,EACvB,CAAA;AAAA,EAEA,UAAA,CAAW,EAAE,cAAA,EAAe,EAAG;AAC7B,IAAA,OAAO,CAAC,IAAA,EAAM,EAAE,GAAG,IAAA,CAAK,QAAQ,cAAA,EAAgB,GAAG,cAAA,EAAe,EAAG,CAAC,CAAA;AAAA,EACxE,CAAA;AAAA,EAEA,WAAA,GAAc;AACZ,IAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAI,IAAA;AAC1B,IAAA,OAAO;AAAA,MACL,gBAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM;AAChB,QAAA,OAAO,QAAA,CAAS,UAAA,CAAW,IAAA,EAAM,OAAA,CAAQ,YAAY,CAAA;AAAA,MACvD;AAAA,KACJ;AAAA,EACF,CAAA;AAAA,EAEA,eAAA,GAAiC;AAC/B,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,YAAA;AAAA,QACN,OAAA,EAAS,kBAAA;AAAA,QACT,QAAA,EAAU,YAAA;AAAA,QACV,IAAA,EAAM,aAAA;AAAA,QACN,KAAA,EAAO,aAAA;AAAA,QACP,QAAA,EAAU,aAAA;AAAA,QACV,KAAA,EAAO,OAAA;AAAA,QACP,QAAA,EAAU;AAAA;AACZ,KACF;AAAA,EACF,CAAA;AAAA,EAEA,oBAAA,GAA2C;AACzC,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,aAAA;AAAA,QACN,KAAA,EAAO,eAAA;AAAA,QACP,WAAA,EAAa,+BAAA;AAAA,QACb,IAAA,EAAM,aAAA;AAAA,QACN,KAAA,EAAO,OAAA;AAAA,QACP,QAAA,EAAU,GAAA;AAAA,QACV,QAAA,EAAU,CAAC,QAAA,EAAU,MAAA,EAAQ,aAAa,IAAI,CAAA;AAAA,QAC9C,QAAA,EAAU,IAAA;AAAA,QACV,OAAA,EAAS,kBAAA;AAAA;AAAA;AAAA,QAGT,cAAA,EAAgB,CAAC,YAAY;AAAA;AAC/B,KACF;AAAA,EACF,CAAA;AAAA,EAEA,oBAAA,GAAuB;AACrB,IAAA,MAAM,EAAE,QAAO,GAAI,IAAA;AACnB,IAAA,OAAO;AAAA,MACL,eAAe,MAAM;AACnB,QAAA,OAAO,MAAA,EAAQ,QAAA,CAAS,kBAAkB,CAAA,IAAI,IAAK,KAAA;AAAA,MACrD;AAAA,KACF;AAAA,EACF,CAAA;AAAA,EAEA,aAAA,GAAgB;AACd,IAAA,OAAO,CAAC,QAAQ,CAAA;AAAA,EAClB,CAAA;AAAA,EAEA,aAAA,GAAgB;AACd,IAAA,MAAM,EAAE,UAAS,GAAI,IAAA;AAErB,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,OAAO,EAAC;AAAA,IACV;AAEA,IAAA,OAAO;AAAA;AAAA,MAEL,iBAAA,CAAkB,EAAE,IAAA,EAAM,YAAA,EAAc,MAAM,QAAA,EAAU,KAAA,EAAO,eAAe,CAAA;AAAA;AAAA,MAE9E,iBAAA,CAAkB,EAAE,IAAA,EAAM,YAAA,EAAc,MAAM,QAAA,EAAU,KAAA,EAAO,eAAe,CAAA;AAAA;AAAA,MAE9E,iBAAA,CAAkB,EAAE,IAAA,EAAM,YAAA,EAAc,MAAM,QAAA,EAAU,KAAA,EAAO,eAAe;AAAA,KAChF;AAAA,EACF;AACF,CAAC;;;AC/FM,IAAM,WAAA,GAAcA,MAAK,MAAA,CAA2B;AAAA,EACzD,IAAA,EAAM,aAAA;AAAA,EACN,KAAA,EAAO,YAAA;AAAA,EACP,OAAA,EAAS,WAAA;AAAA,EAET,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,gBAAgB,EAAC;AAAA,MACjB,YAAA,EAAc;AAAA,KAChB;AAAA,EACF,CAAA;AAAA,EAEA,aAAA,GAAgB;AACd,IAAA,OAAO;AAAA,MACL,KAAA,EAAO;AAAA,QACL,OAAA,EAAS,CAAA;AAAA,QACT,SAAA,EAAW,CAAC,OAAA,KAAyB;AACnC,UAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,YAAA,CAAa,OAAO,CAAA;AAC1C,UAAA,OAAO,KAAA,GAAQ,QAAA,CAAS,KAAA,EAAO,EAAE,CAAA,GAAI,CAAA;AAAA,QACvC,CAAA;AAAA,QACA,UAAA,EAAY,CAAC,UAAA,KAAwC;AACnD,UAAA,MAAM,KAAA,GAAQ,WAAW,OAAO,CAAA;AAChC,UAAA,IAAI,UAAU,CAAA,EAAG;AACf,YAAA,OAAO,EAAC;AAAA,UACV;AACA,UAAA,OAAO,EAAE,KAAA,EAAO,MAAA,CAAO,KAAK,CAAA,EAAE;AAAA,QAChC;AAAA;AACF,KACF;AAAA,EACF,CAAA;AAAA,EAEA,SAAA,GAAY;AACV,IAAA,OAAO,CAAC,EAAE,GAAA,EAAK,IAAA,EAAM,CAAA;AAAA,EACvB,CAAA;AAAA,EAEA,UAAA,CAAW,EAAE,cAAA,EAAe,EAAG;AAC7B,IAAA,OAAO,CAAC,IAAA,EAAM,EAAE,GAAG,IAAA,CAAK,QAAQ,cAAA,EAAgB,GAAG,cAAA,EAAe,EAAG,CAAC,CAAA;AAAA,EACxE,CAAA;AAAA,EAEA,WAAA,GAAc;AACZ,IAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAI,IAAA;AAC1B,IAAA,OAAO;AAAA,MACL,iBAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM;AAChB,QAAA,OAAO,QAAA,CAAS,UAAA,CAAW,IAAA,EAAM,OAAA,CAAQ,YAAY,CAAA;AAAA,MACvD;AAAA,KACJ;AAAA,EACF,CAAA;AAAA,EAEA,eAAA,GAAiC;AAC/B,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,aAAA;AAAA,QACN,OAAA,EAAS,mBAAA;AAAA,QACT,QAAA,EAAU,aAAA;AAAA,QACV,IAAA,EAAM,aAAA;AAAA,QACN,KAAA,EAAO,cAAA;AAAA,QACP,QAAA,EAAU,aAAA;AAAA,QACV,KAAA,EAAO,OAAA;AAAA,QACP,QAAA,EAAU;AAAA;AACZ,KACF;AAAA,EACF,CAAA;AAAA,EAEA,oBAAA,GAA2C;AACzC,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,cAAA;AAAA,QACN,KAAA,EAAO,eAAA;AAAA,QACP,WAAA,EAAa,wBAAA;AAAA,QACb,IAAA,EAAM,aAAA;AAAA,QACN,KAAA,EAAO,OAAA;AAAA,QACP,QAAA,EAAU,GAAA;AAAA,QACV,UAAU,CAAC,SAAA,EAAW,UAAA,EAAY,MAAA,EAAQ,MAAM,IAAI,CAAA;AAAA,QACpD,QAAA,EAAU,KAAA;AAAA,QACV,OAAA,EAAS,mBAAA;AAAA,QACT,cAAA,EAAgB,CAAC,aAAa;AAAA;AAChC,KACF;AAAA,EACF,CAAA;AAAA,EAEA,oBAAA,GAAuB;AACrB,IAAA,MAAM,EAAE,QAAO,GAAI,IAAA;AACnB,IAAA,OAAO;AAAA,MACL,eAAe,MAAM;AACnB,QAAA,OAAO,MAAA,EAAQ,QAAA,CAAS,mBAAmB,CAAA,IAAI,IAAK,KAAA;AAAA,MACtD;AAAA,KACF;AAAA,EACF,CAAA;AAAA,EAEA,aAAA,GAAgB;AACd,IAAA,OAAO,CAAC,QAAQ,CAAA;AAAA,EAClB,CAAA;AAAA,EAEA,aAAA,GAAgB;AACd,IAAA,MAAM,EAAE,UAAS,GAAI,IAAA;AAErB,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,OAAO,EAAC;AAAA,IACV;AAEA,IAAA,OAAO;AAAA;AAAA,MAEL,iBAAA,CAAkB;AAAA,QAChB,IAAA,EAAM,aAAA;AAAA,QACN,IAAA,EAAM,QAAA;AAAA,QACN,KAAA,EAAO,aAAA;AAAA,QACP,aAAA,EAAe,CAAC,KAAA,KAAU;AACxB,UAAA,MAAM,GAAA,GAAM,MAAM,CAAC,CAAA;AACnB,UAAA,OAAO,EAAE,KAAA,EAAO,GAAA,GAAM,SAAS,GAAA,EAAK,EAAE,IAAI,CAAA,EAAE;AAAA,QAC9C;AAAA,OACD;AAAA,KACH;AAAA,EACF;AACF,CAAC;ACnHM,IAAM,cAAA,GAAiBA,MAAK,MAAA,CAA8B;AAAA,EAC/D,IAAA,EAAM,gBAAA;AAAA,EACN,KAAA,EAAO,OAAA;AAAA,EAEP,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,gBAAgB;AAAC,KACnB;AAAA,EACF,CAAA;AAAA,EAEA,SAAA,GAAY;AACV,IAAA,OAAO,CAAC,EAAE,GAAA,EAAK,IAAA,EAAM,CAAA;AAAA,EACvB,CAAA;AAAA,EAEA,UAAA,CAAW,EAAE,cAAA,EAAe,EAAG;AAC7B,IAAA,OAAO,CAAC,MAAM,EAAE,GAAG,KAAK,OAAA,CAAQ,cAAA,EAAgB,GAAG,cAAA,EAAgB,CAAA;AAAA,EACrE,CAAA;AAAA,EAEA,WAAA,GAAc;AACZ,IAAA,OAAO;AAAA,MACL,mBACE,MACA,CAAC,SAAEzC,OAAA,EAAO,EAAA,EAAI,UAAS,KAAM;AAC3B,QAAA,IAAI,CAAC,IAAA,CAAK,QAAA,EAAU,OAAO,KAAA;AAE3B,QAAA,MAAM,EAAE,KAAA,EAAM,GAAI,EAAA,CAAG,SAAA;AACrB,QAAA,MAAM,SAAS,KAAA,CAAM,MAAA;AAIrB,QAAA,IAAI,CAAC,MAAA,CAAO,WAAA,EAAa,OAAO,KAAA;AAEhC,QAAA,MAAM,aAAA,GAAgBA,OAAA,CAAM,MAAA,CAAO,KAAA,CAAM,WAAW,CAAA;AACpD,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,MAAA,EAAO;AACpC,QAAA,MAAM,iBAAA,GAAoB,eAAe,MAAA,EAAO;AAChD,QAAA,MAAM,QAAQ,iBAAA,GAAoB,CAAC,QAAQ,iBAAiB,CAAA,GAAI,CAAC,MAAM,CAAA;AAOvE,QAAA,MAAM,SAAA,GAAY,kBAAA,CAAmBA,OAAA,EAAO,EAAE,CAAA;AAC9C,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AACtB,UAAA,EAAA,CAAG,WAAA,CAAY,SAAA,CAAU,IAAA,EAAM,SAAA,CAAU,IAAI,KAAK,CAAA;AAClD,UAAA,MAAM,MAAMC,mBAAAA,CAAc,QAAA;AAAA,YACxB,EAAA,CAAG,GAAA,CAAI,OAAA,CAAQ,SAAA,CAAU,OAAO,CAAC,CAAA;AAAA,YACjC;AAAA,WACF;AACA,UAAA,IAAI,GAAA,EAAK,EAAA,CAAG,YAAA,CAAa,GAAG,CAAA;AAC5B,UAAA,QAAA,CAAS,EAAA,CAAG,gBAAgB,CAAA;AAC5B,UAAA,OAAO,IAAA;AAAA,QACT;AAEA,QAAA,IAAI,QAAA,EAAU;AAEZ,UAAA,IAAI,OAAO,OAAA,CAAQ,IAAA,KAAS,KAAK,MAAA,CAAO,IAAA,CAAK,SAAS,WAAA,EAAa;AACjE,YAAA,MAAM,IAAA,GAAO,MAAM,MAAA,EAAO;AAC1B,YAAA,MAAM,EAAA,GAAK,MAAM,KAAA,EAAM;AACvB,YAAA,EAAA,CAAG,WAAA,CAAY,IAAA,EAAM,EAAA,EAAI,KAAK,CAAA;AAC9B,YAAA,MAAM,GAAA,GAAMA,oBAAc,QAAA,CAAS,EAAA,CAAG,IAAI,OAAA,CAAQ,IAAA,GAAO,CAAC,CAAA,EAAG,CAAC,CAAA;AAC9D,YAAA,IAAI,GAAA,EAAK,EAAA,CAAG,YAAA,CAAa,GAAG,CAAA;AAAA,UAC9B,CAAA,MAAO;AAEL,YAAA,MAAM,GAAA,GAAM,MAAM,KAAA,EAAM;AACxB,YAAA,EAAA,CAAG,MAAA,CAAO,KAAK,KAAK,CAAA;AACpB,YAAA,MAAM,GAAA,GAAMA,oBAAc,QAAA,CAAS,EAAA,CAAG,IAAI,OAAA,CAAQ,GAAA,GAAM,CAAC,CAAA,EAAG,CAAC,CAAA;AAC7D,YAAA,IAAI,GAAA,EAAK,EAAA,CAAG,YAAA,CAAa,GAAG,CAAA;AAAA,UAC9B;AAEA,UAAA,QAAA,CAAS,EAAE,CAAA;AAAA,QACb;AAEA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,KACJ;AAAA,EACF,CAAA;AAAA,EAEA,eAAA,GAAiC;AAC/B,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,gBAAA;AAAA,QACN,OAAA,EAAS,mBAAA;AAAA,QACT,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,iBAAA;AAAA,QACP,KAAA,EAAO,QAAA;AAAA,QACP,QAAA,EAAU;AAAA;AACZ,KACF;AAAA,EACF,CAAA;AAAA,EAEA,oBAAA,GAA2C;AACzC,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,iBAAA;AAAA,QACN,KAAA,EAAO,SAAA;AAAA,QACP,WAAA,EAAa,0BAAA;AAAA,QACb,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,OAAA;AAAA,QACP,QAAA,EAAU,GAAA;AAAA,QACV,UAAU,CAAC,SAAA,EAAW,IAAA,EAAM,MAAA,EAAQ,aAAa,iBAAiB,CAAA;AAAA,QAClE,QAAA,EAAU,MAAA;AAAA,QACV,OAAA,EAAS;AAAA;AACX,KACF;AAAA,EACF,CAAA;AAAA,EAEA,aAAA,GAAgB;AACd,IAAA,MAAM,EAAE,UAAS,GAAI,IAAA;AAErB,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,OAAO,EAAC;AAAA,IACV;AAEA,IAAA,OAAO;AAAA,MACL,IAAIS,oBAAAA;AAAA,QACF,2BAAA;AAAA,QACA,CAACV,OAAA,EAAoB,KAAA,EAAyB,KAAA,KAAkB;AAC9D,UAAA,MAAM,EAAE,IAAG,GAAIA,OAAA;AAEf,UAAA,IAAI,KAAA,CAAM,CAAC,CAAA,EAAG;AACZ,YAAA,MAAM,MAAA,GAASA,OAAA,CAAM,GAAA,CAAI,OAAA,CAAQ,KAAK,CAAA;AAEtC,YAAA,MAAM,IAAA,GAAO,OAAO,MAAA,EAAO;AAC3B,YAAA,MAAM,EAAA,GAAK,OAAO,KAAA,EAAM;AACxB,YAAA,MAAM,YAAYA,OAAA,CAAM,MAAA,CAAO,KAAA,CAAM,WAAW,GAAG,MAAA,EAAO;AAC1D,YAAA,MAAM,KAAA,GAAQ,SAAA,GACV,CAAC,QAAA,CAAS,MAAA,EAAO,EAAG,SAAS,CAAA,GAC7B,CAAC,QAAA,CAAS,MAAA,EAAQ,CAAA;AACtB,YAAA,EAAA,CAAG,WAAA,CAAY,IAAA,EAAM,EAAA,EAAI,KAAK,CAAA;AAG9B,YAAA,MAAM,GAAA,GAAMC,oBAAc,QAAA,CAAS,EAAA,CAAG,IAAI,OAAA,CAAQ,IAAA,GAAO,CAAC,CAAA,EAAG,CAAC,CAAA;AAC9D,YAAA,IAAI,GAAA,EAAK;AACP,cAAA,EAAA,CAAG,aAAa,GAAG,CAAA;AAAA,YACrB;AAAA,UACF;AAEA,UAAA,OAAO,EAAA;AAAA,QACT;AAAA;AACF,KACF;AAAA,EACF;AACF,CAAC;;;ACrJM,IAAM,SAAA,GAAYwC,MAAK,MAAA,CAAyB;AAAA,EACrD,IAAA,EAAM,WAAA;AAAA,EACN,KAAA,EAAO,QAAA;AAAA,EACP,MAAA,EAAQ,IAAA;AAAA,EACR,UAAA,EAAY,KAAA;AAAA,EAEZ,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,gBAAgB;AAAC,KACnB;AAAA,EACF,CAAA;AAAA,EAEA,SAAA,GAAY;AACV,IAAA,OAAO,CAAC,EAAE,GAAA,EAAK,IAAA,EAAM,CAAA;AAAA,EACvB,CAAA;AAAA,EAEA,UAAA,CAAW,EAAE,cAAA,EAAe,EAAG;AAC7B,IAAA,OAAO,CAAC,MAAM,EAAE,GAAG,KAAK,OAAA,CAAQ,cAAA,EAAgB,GAAG,cAAA,EAAgB,CAAA;AAAA,EACrE,CAAA;AAAA,EAEA,WAAA,GAAc;AACZ,IAAA,MAAM,EAAE,MAAK,GAAI,IAAA;AACjB,IAAA,OAAO;AAAA,MACL,YAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM;AAChB,QAAA,OAAO,QAAA,CAAS,aAAA,CAAc,EAAE,IAAA,EAAM,MAAM,CAAA;AAAA,MAC9C,CAAA;AAAA,MACF,YACE,MACA,CAAC,EAAE,EAAA,EAAI,UAAS,KAAM;AACpB,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,EAAA,CAAG,WAAW,MAAQ,CAAA;AACtB,UAAA,QAAA,CAAS,EAAE,CAAA;AAAA,QACb;AACA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,KACJ;AAAA,EACF,CAAA;AAAA,EAEA,eAAA,GAAiC;AAC/B,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,WAAA;AAAA,QACN,OAAA,EAAS,cAAA;AAAA,QACT,IAAA,EAAM,WAAA;AAAA,QACN,KAAA,EAAO,YAAA;AAAA,QACP,QAAA,EAAU,aAAA;AAAA,QACV,KAAA,EAAO,QAAA;AAAA,QACP,QAAA,EAAU;AAAA;AACZ,KACF;AAAA,EACF,CAAA;AAAA,EAEA,oBAAA,GAAuB;AACrB,IAAA,MAAM,EAAE,QAAO,GAAI,IAAA;AACnB,IAAA,OAAO;AAAA,MACL,aAAa,MAAM;AACjB,QAAA,OAAO,MAAA,EAAQ,QAAA,CAAS,cAAc,CAAA,IAAI,IAAK,KAAA;AAAA,MACjD,CAAA;AAAA,MACA,eAAe,MAAM;AACnB,QAAA,OAAO,MAAA,EAAQ,QAAA,CAAS,cAAc,CAAA,IAAI,IAAK,KAAA;AAAA,MACjD,CAAA;AAAA,MACA,mBAAmB,MAAM;AACvB,QAAA,OAAO,MAAA,EAAQ,QAAA,CAAS,YAAY,CAAA,IAAI,IAAK,KAAA;AAAA,MAC/C;AAAA,KACF;AAAA,EACF;AACF,CAAC;;;ACrEM,IAAM,mBAAN,MAA2C;AAAA,EACvC,GAAA;AAAA,EACA,UAAA;AAAA,EACQ,KAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACT,IAAA;AAAA,EAER,YAAY,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,QAAO,EAAyB;AACjE,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK,IAAA;AACrB,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAEd,IAAA,IAAA,CAAK,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,IAAI,CAAA;AAGtC,IAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,OAAA,CAAQ,cAAc,CAAA,EAAG;AACjE,MAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW;AACzC,QAAA,IAAA,CAAK,GAAA,CAAI,YAAA,CAAa,GAAA,EAAK,OAAO,KAAA,KAAU,WAAW,KAAA,GAAQ,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,MACtF;AAAA,IACF;AACA,IAAA,IAAA,CAAK,GAAA,CAAI,YAAA,CAAa,WAAA,EAAa,UAAU,CAAA;AAC7C,IAAA,IAAA,CAAK,GAAA,CAAI,aAAa,cAAA,EAAgB,IAAA,CAAK,MAAM,SAAS,CAAA,GAAI,SAAS,OAAO,CAAA;AAE9E,IAAA,IAAA,CAAK,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAC3C,IAAA,IAAA,CAAK,KAAA,CAAM,YAAA,CAAa,iBAAA,EAAmB,OAAO,CAAA;AAElD,IAAA,IAAA,CAAK,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAC3C,IAAA,IAAA,CAAK,MAAM,IAAA,GAAO,UAAA;AAClB,IAAA,IAAA,CAAK,MAAM,OAAA,GAAU,CAAC,CAAC,IAAA,CAAK,MAAM,SAAS,CAAA;AAC3C,IAAA,IAAA,CAAK,KAAA,CAAM,QAAA,GAAW,CAAC,IAAA,CAAK,QAAA;AAC5B,IAAA,IAAA,CAAK,KAAA,CAAM,YAAA,CAAa,YAAA,EAAc,aAAa,CAAA;AAEnD,IAAA,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,IAAA,CAAK,KAAK,CAAA;AACjC,IAAA,IAAA,CAAK,GAAA,CAAI,WAAA,CAAY,IAAA,CAAK,KAAK,CAAA;AAE/B,IAAA,IAAA,CAAK,UAAA,GAAa,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC9C,IAAA,IAAA,CAAK,GAAA,CAAI,WAAA,CAAY,IAAA,CAAK,UAAU,CAAA;AAEpC,IAAA,IAAA,CAAK,KAAA,CAAM,gBAAA,CAAiB,QAAA,EAAU,IAAA,CAAK,YAAY,CAAA;AAAA,EACzD;AAAA,EAEQ,YAAA,GAAe,CAAC,KAAA,KAAuB;AAC7C,IAAA,KAAA,CAAM,cAAA,EAAe;AACrB,IAAA,IAAI,CAAC,IAAA,CAAK,IAAA,CAAK,QAAA,EAAU;AAEvB,MAAA,IAAA,CAAK,MAAM,OAAA,GAAU,CAAC,CAAC,IAAA,CAAK,IAAA,CAAK,MAAM,SAAS,CAAA;AAChD,MAAA;AAAA,IACF;AACA,IAAA,MAAM,GAAA,GAAM,KAAK,MAAA,EAAO;AACxB,IAAA,IAAI,QAAQ,MAAA,EAAW;AACvB,IAAA,MAAM,EAAE,KAAA,EAAO,QAAA,EAAS,GAAI,IAAA,CAAK,IAAA;AACjC,IAAA,MAAM,EAAA,GAAK,KAAA,CAAM,EAAA,CAAG,aAAA,CAAc,KAAK,MAAA,EAAW;AAAA,MAChD,GAAG,KAAK,IAAA,CAAK,KAAA;AAAA,MACb,OAAA,EAAS,KAAK,KAAA,CAAM;AAAA,KACrB,CAAA;AACD,IAAA,QAAA,CAAS,EAAE,CAAA;AAAA,EACb,CAAA;AAAA,EAEA,OAAO,IAAA,EAAuB;AAG5B,IAAA,IAAI,IAAA,CAAK,IAAA,KAAS,IAAA,CAAK,QAAA,EAAU,OAAO,KAAA;AACxC,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,MAAM,OAAA,GAAU,CAAC,CAAC,IAAA,CAAK,MAAM,SAAS,CAAA;AACtC,IAAA,IAAA,CAAK,GAAA,CAAI,YAAA,CAAa,cAAA,EAAgB,OAAA,GAAU,SAAS,OAAO,CAAA;AAChE,IAAA,IAAA,CAAK,MAAM,OAAA,GAAU,OAAA;AACrB,IAAA,IAAA,CAAK,KAAA,CAAM,QAAA,GAAW,CAAC,IAAA,CAAK,IAAA,CAAK,QAAA;AACjC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,UAAU,KAAA,EAAuB;AAI/B,IAAA,OAAO,MAAM,MAAA,YAAkB,IAAA,IAAQ,KAAK,KAAA,CAAM,QAAA,CAAS,MAAM,MAAM,CAAA;AAAA,EACzE;AAAA,EAEA,eAAe,QAAA,EAAuC;AAGpD,IAAA,OAAO,SAAS,MAAA,YAAkB,IAAA,IAAQ,KAAK,KAAA,CAAM,QAAA,CAAS,SAAS,MAAM,CAAA;AAAA,EAC/E;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,KAAA,CAAM,mBAAA,CAAoB,QAAA,EAAU,IAAA,CAAK,YAAY,CAAA;AAAA,EAC5D;AACF,CAAA;;;AC1EO,IAAM,QAAA,GAAWA,MAAK,MAAA,CAAwB;AAAA,EACnD,IAAA,EAAM,UAAA;AAAA;AAAA;AAAA,EAIN,OAAA,EAAS,kBAAA;AAAA,EAET,QAAA,EAAU,IAAA;AAAA,EAEV,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,gBAAgB,EAAC;AAAA,MACjB,MAAA,EAAQ;AAAA,KACV;AAAA,EACF,CAAA;AAAA,EAEA,aAAA,GAAgB;AACd,IAAA,OAAO;AAAA,MACL,OAAA,EAAS;AAAA,QACP,OAAA,EAAS,KAAA;AAAA,QACT,WAAA,EAAa,KAAA;AAAA,QACb,SAAA,EAAW,CAAC,OAAA,KAAyB;AACnC,UAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,YAAA,CAAa,cAAc,CAAA;AACvD,UAAA,OAAO,WAAA,KAAgB,UAAU,WAAA,KAAgB,EAAA;AAAA,QACnD,CAAA;AAAA,QACA,UAAA,EAAY,CAAC,UAAA,MAAyC;AAAA,UACpD,cAAA,EAAgB,UAAA,CAAW,SAAS,CAAA,GAAI,MAAA,GAAS;AAAA,SACnD;AAAA;AACF,KACF;AAAA,EACF,CAAA;AAAA,EAEA,SAAA,GAAY;AACV,IAAA,OAAO;AAAA,MACL;AAAA,QACE,GAAA,EAAK,CAAA,cAAA,EAAiB,IAAA,CAAK,IAAI,CAAA,EAAA,CAAA;AAAA,QAC/B,QAAA,EAAU;AAAA;AACZ,KACF;AAAA,EACF,CAAA;AAAA,EAEA,UAAA,CAAW,EAAE,IAAA,EAAM,cAAA,EAAe,EAAG;AACnC,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MACA;AAAA,QACE,GAAG,KAAK,OAAA,CAAQ,cAAA;AAAA,QAChB,GAAG,cAAA;AAAA,QACH,aAAa,IAAA,CAAK;AAAA,OACpB;AAAA,MACA;AAAA,QACE,OAAA;AAAA,QACA,EAAE,iBAAiB,OAAA,EAAQ;AAAA,QAC3B;AAAA,UACE,OAAA;AAAA,UACA;AAAA,YACE,IAAA,EAAM,UAAA;AAAA,YACN,OAAA,EAAS,IAAA,CAAK,KAAA,CAAM,SAAS,IAAI,SAAA,GAAY,IAAA;AAAA,YAC7C,YAAA,EAAc;AAAA;AAChB;AACF,OACF;AAAA,MACA,CAAC,OAAO,CAAC;AAAA,KACX;AAAA,EACF,CAAA;AAAA,EAEA,WAAA,GAAc;AACZ,IAAA,MAAM,UAAU,IAAA,CAAK,OAAA;AACrB,IAAA,OAAO,CAAC,IAAA,EAAM,IAAA,EAAM,MAAA,KAClB,IAAI,gBAAA,CAAiB,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,MAAA,EAAQ,CAAA;AAAA,EACxD,CAAA;AAAA,EAEA,WAAA,GAAc;AACZ,IAAA,MAAM,EAAE,MAAK,GAAI,IAAA;AACjB,IAAA,OAAO;AAAA,MACL,YACE,MACA,CAAC,EAAE,KAAA,EAAO,UAAS,KAAM;AACvB,QAAA,MAAM,EAAE,WAAU,GAAI,KAAA;AACtB,QAAA,MAAM,EAAE,OAAM,GAAI,SAAA;AAGlB,QAAA,IAAI,WAAA,GAA6B,IAAA;AACjC,QAAA,IAAI,YAAA,GAAe,IAAA;AAEnB,QAAA,KAAA,IAAS,KAAA,GAAQ,KAAA,CAAM,KAAA,EAAO,KAAA,IAAS,GAAG,KAAA,EAAA,EAAS;AACjD,UAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA;AAC7B,UAAA,IAAI,IAAA,CAAK,IAAA,CAAK,IAAA,KAAS,IAAA,EAAM;AAC3B,YAAA,WAAA,GAAc,KAAA,CAAM,OAAO,KAAK,CAAA;AAChC,YAAA,YAAA,GAAe,IAAA;AACf,YAAA;AAAA,UACF;AAAA,QACF;AAEA,QAAA,IAAI,WAAA,KAAgB,IAAA,IAAQ,CAAC,YAAA,EAAc,OAAO,KAAA;AAElD,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,MAAM,EAAA,GAAK,KAAA,CAAM,EAAA,CAAG,aAAA,CAAc,aAAa,MAAA,EAAW;AAAA,YACxD,GAAG,YAAA,CAAa,KAAA;AAAA,YAChB,OAAA,EAAS,CAAC,YAAA,CAAa,KAAA,CAAM,SAAS;AAAA,WACvC,CAAA;AACD,UAAA,QAAA,CAAS,EAAE,CAAA;AAAA,QACb;AAEA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,KACJ;AAAA,EACF,CAAA;AAAA,EAEA,oBAAA,GAAuB;AACrB,IAAA,OAAO;AAAA,MACL,OAAO,MAAM;AACX,QAAA,IAAI,CAAC,IAAA,CAAK,MAAA,IAAU,CAAC,IAAA,CAAK,UAAU,OAAO,KAAA;AAC3C,QAAA,MAAM,SAAEzC,OAAA,EAAO,IAAA,EAAK,GAAI,IAAA,CAAK,MAAA;AAC7B,QAAA,MAAM,EAAE,KAAA,EAAM,GAAIA,OAAA,CAAM,SAAA;AACxB,QAAA,IAAI,KAAA,CAAM,KAAA,GAAQ,CAAA,IAAK,KAAA,CAAM,IAAA,CAAK,EAAE,CAAA,CAAE,IAAA,KAAS,IAAA,CAAK,QAAA,EAAU,OAAO,KAAA;AAGrE,QAAA,IAAI,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,IAAA,KAAS,aAAa,OAAO,KAAA;AAGnD,QAAA,MAAM,GAAA,GAAM,yBAAyB,KAAK,CAAA;AAC1C,QAAA,IAAI,KAAK,gBAAA,EAAkB;AACzB,UAAA,IAAI,IAAI,gBAAA,EAAkB;AACxB,YAAA,IAAI,0BAA0BA,OAAA,EAAO,IAAA,CAAK,QAAA,EAAU,GAAG,GAAG,OAAO,IAAA;AAAA,UACnE,CAAA,MAAO;AACL,YAAA,IAAI4C,mBAAAA,CAAW5C,OAAA,EAAO,IAAA,CAAK,QAAQ,GAAG,OAAO,IAAA;AAAA,UAC/C;AAAA,QACF;AAQA,QAAA,IAAI6C,wBAAAA,CAAc,IAAA,CAAK,QAAA,EAAU,EAAE,OAAA,EAAS,KAAA,EAAO,CAAA,CAAE7C,OAAA,EAAO,IAAA,CAAK,QAAQ,CAAA,EAAG,OAAO,IAAA;AAKnF,QAAA,IAAI,KAAA,CAAM,MAAA,CAAO,OAAA,CAAQ,IAAA,KAAS,CAAA,EAAG;AACnC,UAAA,MAAM,YAAA,GAAeA,OAAA,CAAM,MAAA,CAAO,KAAA,CAAM,UAAU,CAAA;AAClD,UAAA,IAAI,YAAA,EAAc;AAChB,YAAA,IAAI,mBAAA,GAAsB,EAAA;AAC1B,YAAA,KAAA,IAAS,IAAI,KAAA,CAAM,KAAA,GAAQ,CAAA,EAAG,CAAA,GAAI,GAAG,CAAA,EAAA,EAAK;AACxC,cAAA,IAAI,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,CAAE,SAAS,YAAA,EAAc;AACvC,gBAAA,mBAAA,GAAsB,CAAA;AACtB,gBAAA;AAAA,cACF;AAAA,YACF;AAEA,YAAA,IAAI,sBAAsB,CAAA,EAAG;AAC3B,cAAA,MAAM,KAAKA,OAAA,CAAM,EAAA;AACjB,cAAA,MAAM,aAAA,GAAgB,MAAM,KAAA,GAAQ,CAAA;AACpC,cAAA,MAAM,YAAA,GAAe,KAAA,CAAM,IAAA,CAAK,aAAa,CAAA;AAE7C,cAAA,IAAI,YAAA,CAAa,aAAa,CAAA,EAAG;AAG/B,gBAAA,EAAA,CAAG,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,KAAK,GAAG,KAAA,CAAM,KAAA,CAAM,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,cAC/D,CAAA,MAAO;AACL,gBAAA,MAAM,gBAAgB,aAAA,GAAgB,CAAA;AACtC,gBAAA,MAAM,YAAA,GAAe,KAAA,CAAM,IAAA,CAAK,aAAa,CAAA;AAE7C,gBAAA,IAAI,YAAA,CAAa,cAAc,CAAA,EAAG;AAIhC,kBAAA,EAAA,CAAG,MAAA,CAAO,MAAM,MAAA,CAAO,aAAa,GAAG,KAAA,CAAM,KAAA,CAAM,aAAa,CAAC,CAAA;AAAA,gBACnE,CAAA,MAAO;AAEL,kBAAA,EAAA,CAAG,MAAA,CAAO,MAAM,MAAA,CAAO,aAAa,GAAG,KAAA,CAAM,KAAA,CAAM,aAAa,CAAC,CAAA;AAAA,gBACnE;AAAA,cACF;AAGA,cAAA,MAAM,cAAc,EAAA,CAAG,OAAA,CAAQ,IAAI,KAAA,CAAM,KAAA,CAAM,mBAAmB,CAAC,CAAA;AACnE,cAAA,MAAM,OAAA,GAAU,aAAa,aAAA,EAAc;AAC3C,cAAA,IAAI,OAAA,EAAS;AACX,gBAAA,EAAA,CAAG,MAAA,CAAO,aAAa,OAAO,CAAA;AAC9B,gBAAA,EAAA,CAAG,YAAA,CAAa8C,gBAAU,IAAA,CAAK,EAAA,CAAG,IAAI,OAAA,CAAQ,WAAA,GAAc,CAAC,CAAC,CAAC,CAAA;AAC/D,gBAAA,IAAA,CAAK,QAAA,CAAS,EAAA,CAAG,cAAA,EAAgB,CAAA;AACjC,gBAAA,OAAO,IAAA;AAAA,cACT;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAGA,QAAA,OAAO1B,wBAAa,IAAA,CAAK,QAAQ,CAAA,CAAEpB,OAAA,EAAO,KAAK,QAAQ,CAAA;AAAA,MACzD,CAAA;AAAA,MACA,KAAK,MAAM;AACT,QAAA,IAAI,CAAC,IAAA,CAAK,MAAA,IAAU,CAAC,IAAA,CAAK,UAAU,OAAO,KAAA;AAC3C,QAAA,MAAM,EAAE,KAAA,EAAM,GAAI,IAAA,CAAK,OAAO,KAAA,CAAM,SAAA;AACpC,QAAA,IAAI,KAAA,CAAM,KAAA,GAAQ,CAAA,IAAK,KAAA,CAAM,IAAA,CAAK,EAAE,CAAA,CAAE,IAAA,KAAS,IAAA,CAAK,QAAA,EAAU,OAAO,KAAA;AACrE,QAAA,OAAO2C,uBAAAA,CAAa,IAAA,CAAK,QAAQ,CAAA,CAAE,IAAA,CAAK,OAAO,KAAA,EAAO,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA;AAAA,MACjF,CAAA;AAAA,MACA,aAAa,MAAM;AACjB,QAAA,IAAI,CAAC,IAAA,CAAK,MAAA,IAAU,CAAC,IAAA,CAAK,UAAU,OAAO,KAAA;AAC3C,QAAA,MAAM,EAAE,KAAA,EAAM,GAAI,IAAA,CAAK,OAAO,KAAA,CAAM,SAAA;AACpC,QAAA,IAAI,KAAA,CAAM,KAAA,GAAQ,CAAA,IAAK,KAAA,CAAM,IAAA,CAAK,EAAE,CAAA,CAAE,IAAA,KAAS,IAAA,CAAK,QAAA,EAAU,OAAO,KAAA;AACrE,QAAA,OAAOvB,uBAAAA,CAAa,IAAA,CAAK,QAAQ,CAAA,CAAE,IAAA,CAAK,OAAO,KAAA,EAAO,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA;AAAA,MACjF,CAAA;AAAA,MACA,WAAW,MAAM;AACf,QAAA,IAAI,CAAC,IAAA,CAAK,MAAA,IAAU,CAAC,IAAA,CAAK,UAAU,OAAO,KAAA;AAC3C,QAAA,MAAM,EAAE,KAAA,EAAO,IAAA,EAAK,GAAI,IAAA,CAAK,MAAA;AAC7B,QAAA,MAAM,EAAE,KAAA,EAAO,KAAA,EAAM,GAAI,KAAA,CAAM,SAAA;AAG/B,QAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,YAAA,KAAiB,GAAG,OAAO,KAAA;AAG/C,QAAA,IAAI,KAAA,CAAM,MAAA,CAAO,OAAA,CAAQ,IAAA,KAAS,CAAA,EAAG;AACnC,UAAA,MAAM,GAAA,GAAM,yBAAyB,KAAK,CAAA;AAC1C,UAAA,IAAI,GAAA,IAAO,GAAA,CAAI,gBAAA,IAAoB,GAAA,CAAI,gBAAA,EAAkB;AACvD,YAAA,IAAI,+BAA+B,KAAA,EAAO,IAAA,CAAK,QAAA,EAAU,GAAG,GAAG,OAAO,IAAA;AAAA,UACxE;AAAA,QACF;AAGA,QAAA,IAAI,aAAA,GAAgB,EAAA;AACpB,QAAA,KAAA,IAAS,CAAA,GAAI,KAAA,CAAM,KAAA,EAAO,CAAA,GAAI,GAAG,CAAA,EAAA,EAAK;AACpC,UAAA,IAAI,MAAM,IAAA,CAAK,CAAC,CAAA,CAAE,IAAA,KAAS,KAAK,QAAA,EAAU;AACxC,YAAA,aAAA,GAAgB,CAAA;AAChB,YAAA;AAAA,UACF;AAAA,QACF;AACA,QAAA,IAAI,aAAA,KAAkB,IAAI,OAAO,KAAA;AAGjC,QAAA,IAAI,KAAA,CAAM,KAAA,CAAM,aAAa,CAAA,KAAM,GAAG,OAAO,KAAA;AAE7C,QAAA,OAAOA,wBAAa,IAAA,CAAK,QAAQ,CAAA,CAAE,KAAA,EAAO,KAAK,QAAQ,CAAA;AAAA,MACzD,CAAA;AAAA,MACA,aAAa,MAAM;AACjB,QAAA,OAAO,IAAA,CAAK,MAAA,EAAQ,QAAA,CAAS,YAAY,KAAI,IAAK,KAAA;AAAA,MACpD;AAAA,KACF;AAAA,EACF;AACF,CAAC;;;AC5PM,IAAM,QAAA,GAAWqB,MAAK,MAAA,CAAwB;AAAA,EACnD,IAAA,EAAM,UAAA;AAAA,EACN,KAAA,EAAO,YAAA;AAAA,EACP,OAAA,EAAS,WAAA;AAAA,EAET,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,gBAAgB,EAAC;AAAA,MACjB,YAAA,EAAc;AAAA,KAChB;AAAA,EACF,CAAA;AAAA,EAEA,SAAA,GAAY;AACV,IAAA,OAAO;AAAA,MACL;AAAA,QACE,GAAA,EAAK,CAAA,cAAA,EAAiB,IAAA,CAAK,IAAI,CAAA,EAAA,CAAA;AAAA,QAC/B,QAAA,EAAU;AAAA;AAAA;AACZ,KACF;AAAA,EACF,CAAA;AAAA,EAEA,UAAA,CAAW,EAAE,cAAA,EAAe,EAAG;AAC7B,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MACA;AAAA,QACE,GAAG,KAAK,OAAA,CAAQ,cAAA;AAAA,QAChB,GAAG,cAAA;AAAA,QACH,aAAa,IAAA,CAAK;AAAA,OACpB;AAAA,MACA;AAAA,KACF;AAAA,EACF,CAAA;AAAA,EAEA,WAAA,GAAc;AACZ,IAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAI,IAAA;AAC1B,IAAA,OAAO;AAAA,MACL,cAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM;AAChB,QAAA,OAAO,QAAA,CAAS,UAAA,CAAW,IAAA,EAAM,OAAA,CAAQ,YAAY,CAAA;AAAA,MACvD;AAAA,KACJ;AAAA,EACF,CAAA;AAAA,EAEA,oBAAA,GAAuB;AACrB,IAAA,MAAM,EAAE,QAAO,GAAI,IAAA;AACnB,IAAA,OAAO;AAAA,MACL,eAAe,MAAM;AACnB,QAAA,OAAO,MAAA,EAAQ,QAAA,CAAS,gBAAgB,CAAA,IAAI,IAAK,KAAA;AAAA,MACnD;AAAA,KACF;AAAA,EACF,CAAA;AAAA,EAEA,eAAA,GAAiC;AAC/B,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,UAAA;AAAA,QACN,OAAA,EAAS,gBAAA;AAAA,QACT,QAAA,EAAU,UAAA;AAAA,QACV,IAAA,EAAM,YAAA;AAAA,QACN,KAAA,EAAO,WAAA;AAAA,QACP,QAAA,EAAU,aAAA;AAAA,QACV,KAAA,EAAO,OAAA;AAAA,QACP,QAAA,EAAU;AAAA;AACZ,KACF;AAAA,EACF,CAAA;AAAA,EAEA,oBAAA,GAA2C;AACzC,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,WAAA;AAAA,QACN,KAAA,EAAO,YAAA;AAAA,QACP,WAAA,EAAa,kCAAA;AAAA,QACb,IAAA,EAAM,YAAA;AAAA,QACN,KAAA,EAAO,OAAA;AAAA,QACP,QAAA,EAAU,GAAA;AAAA,QACV,QAAA,EAAU,CAAC,MAAA,EAAQ,MAAA,EAAQ,YAAY,OAAO,CAAA;AAAA,QAC9C,QAAA,EAAU,MAAA;AAAA,QACV,OAAA,EAAS,gBAAA;AAAA,QACT,cAAA,EAAgB,CAAC,UAAU;AAAA;AAC7B,KACF;AAAA,EACF,CAAA;AAAA,EAEA,aAAA,GAAgB;AACd,IAAA,OAAO,CAAC,QAAQ,CAAA;AAAA,EAClB,CAAA;AAAA,EAEA,aAAA,GAAgB;AACd,IAAA,MAAM,EAAE,UAAS,GAAI,IAAA;AAErB,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,OAAO,EAAC;AAAA,IACV;AAEA,IAAA,OAAO;AAAA;AAAA,MAEL,iBAAA,CAAkB,EAAE,IAAA,EAAM,gBAAA,EAAkB,MAAM,QAAA,EAAU,KAAA,EAAO,eAAe,CAAA;AAAA;AAAA,MAElF,iBAAA,CAAkB,EAAE,IAAA,EAAM,iBAAA,EAAmB,MAAM,QAAA,EAAU,KAAA,EAAO,eAAe;AAAA,KACrF;AAAA,EACF;AACF,CAAC;;;AC7FM,IAAM,IAAA,GAAO,KAAK,MAAA,CAAoB;AAAA,EAC3C,IAAA,EAAM,MAAA;AAAA,EAEN,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,gBAAgB;AAAC,KACnB;AAAA,EACF,CAAA;AAAA,EAEA,SAAA,GAAY;AACV,IAAA,OAAO;AAAA,MACL,EAAE,KAAK,QAAA,EAAS;AAAA,MAChB;AAAA,QACE,GAAA,EAAK,GAAA;AAAA,QACL,QAAA,EAAU,CAAC,IAAA,KAAS;AAClB,UAAA,IAAI,OAAO,IAAA,KAAS,QAAA,EAAU,OAAO,EAAC;AACtC,UAAA,MAAM,UAAA,GAAa,KAAK,KAAA,CAAM,UAAA;AAG9B,UAAA,IAAI,UAAA,KAAe,QAAA,IAAY,UAAA,KAAe,KAAA,EAAO;AACnD,YAAA,OAAO,KAAA;AAAA,UACT;AAEA,UAAA,OAAO,EAAC;AAAA,QACV;AAAA,OACF;AAAA,MACA;AAAA,QACE,KAAA,EAAO,aAAA;AAAA,QACP,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,UAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA;AAGtC,UAAA,MAAM,SAAA,GAAY,QAAA,CAAS,KAAA,EAAO,EAAE,CAAA;AACpC,UAAA,IAAI,CAAC,KAAA,CAAM,SAAS,KAAK,SAAA,IAAa,GAAA,SAAY,EAAC;AAGnD,UAAA,IAAI,kBAAA,CAAmB,IAAA,CAAK,KAAK,CAAA,SAAU,EAAC;AAE5C,UAAA,OAAO,KAAA;AAAA,QACT;AAAA;AACF,KACF;AAAA,EACF,CAAA;AAAA,EAEA,UAAA,CAAW,EAAE,cAAA,EAAe,EAAG;AAC7B,IAAA,OAAO,CAAC,QAAA,EAAU,EAAE,GAAG,IAAA,CAAK,QAAQ,cAAA,EAAgB,GAAG,cAAA,EAAe,EAAG,CAAC,CAAA;AAAA,EAC5E,CAAA;AAAA,EAEA,oBAAA,GAAuB;AACrB,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,MAAM,IAAA,CAAK,MAAA,EAAQ,SAAS,YAAY,CAAA,GAAI,MAAM,CAAA,IAAK;AAAA,KAClE;AAAA,EACF,CAAA;AAAA,EAEA,WAAA,GAAc;AACZ,IAAA,OAAO;AAAA,MACL,OAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM,QAAA,CAAS,QAAQ,MAAM,CAAA;AAAA,MAC3C,SAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM,QAAA,CAAS,UAAU,MAAM,CAAA;AAAA,MAC7C,UAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM,QAAA,CAAS,WAAW,MAAM;AAAA,KAChD;AAAA,EACF,CAAA;AAAA,EAEA,eAAA,GAAiC;AAC/B,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,MAAA;AAAA,QACN,OAAA,EAAS,YAAA;AAAA,QACT,QAAA,EAAU,MAAA;AAAA,QACV,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,MAAA;AAAA,QACP,QAAA,EAAU,OAAA;AAAA,QACV,KAAA,EAAO,QAAA;AAAA,QACP,QAAA,EAAU;AAAA;AACZ,KACF;AAAA,EACF,CAAA;AAAA,EAEA,aAAA,GAAgB;AACd,IAAA,MAAM,WAAW,IAAA,CAAK,QAAA;AACtB,IAAA,IAAI,CAAC,QAAA,EAAU,OAAO,EAAC;AAEvB,IAAA,OAAO;AAAA;AAAA,MAEL,aAAA,CAAc;AAAA,QACZ,MAAM,qBAAA,CAAsB,IAAA;AAAA,QAC5B,IAAA,EAAM;AAAA,OACP;AAAA,KACH;AAAA,EACF;AACF,CAAC;;;AChGM,IAAM,MAAA,GAAS,KAAK,MAAA,CAAsB;AAAA,EAC/C,IAAA,EAAM,QAAA;AAAA,EAEN,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,gBAAgB;AAAC,KACnB;AAAA,EACF,CAAA;AAAA,EAEA,SAAA,GAAY;AACV,IAAA,OAAO;AAAA,MACL,EAAE,KAAK,IAAA,EAAK;AAAA,MACZ;AAAA,QACE,GAAA,EAAK,GAAA;AAAA,QACL,QAAA,EAAU,CAAC,IAAA,KAAS;AAClB,UAAA,IAAI,OAAO,IAAA,KAAS,QAAA,EAAU,OAAO,EAAC;AACtC,UAAA,MAAM,SAAA,GAAY,KAAK,KAAA,CAAM,SAAA;AAG7B,UAAA,IAAI,cAAc,QAAA,EAAU;AAC1B,YAAA,OAAO,KAAA;AAAA,UACT;AAEA,UAAA,OAAO,EAAC;AAAA,QACV;AAAA,OACF;AAAA,MACA;AAAA,QACE,KAAA,EAAO,YAAA;AAAA,QACP,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,UAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA;AACtC,UAAA,OAAO,WAAA,CAAY,IAAA,CAAK,KAAK,CAAA,GAAI,EAAC,GAAI,KAAA;AAAA,QACxC;AAAA;AACF,KACF;AAAA,EACF,CAAA;AAAA,EAEA,UAAA,CAAW,EAAE,cAAA,EAAe,EAAG;AAC7B,IAAA,OAAO,CAAC,IAAA,EAAM,EAAE,GAAG,IAAA,CAAK,QAAQ,cAAA,EAAgB,GAAG,cAAA,EAAe,EAAG,CAAC,CAAA;AAAA,EACxE,CAAA;AAAA,EAEA,oBAAA,GAAuB;AACrB,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,MAAM,IAAA,CAAK,MAAA,EAAQ,SAAS,YAAY,CAAA,GAAI,QAAQ,CAAA,IAAK;AAAA,KACpE;AAAA,EACF,CAAA;AAAA,EAEA,WAAA,GAAc;AACZ,IAAA,OAAO;AAAA,MACL,SAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM,QAAA,CAAS,QAAQ,QAAQ,CAAA;AAAA,MAC7C,WAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM,QAAA,CAAS,UAAU,QAAQ,CAAA;AAAA,MAC/C,YAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM,QAAA,CAAS,WAAW,QAAQ;AAAA,KAClD;AAAA,EACF,CAAA;AAAA,EAEA,eAAA,GAAiC;AAC/B,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,QAAA;AAAA,QACN,OAAA,EAAS,cAAA;AAAA,QACT,QAAA,EAAU,QAAA;AAAA,QACV,IAAA,EAAM,YAAA;AAAA,QACN,KAAA,EAAO,QAAA;AAAA,QACP,QAAA,EAAU,OAAA;AAAA,QACV,KAAA,EAAO,QAAA;AAAA,QACP,QAAA,EAAU;AAAA;AACZ,KACF;AAAA,EACF,CAAA;AAAA,EAEA,aAAA,GAAgB;AACd,IAAA,MAAM,WAAW,IAAA,CAAK,QAAA;AACtB,IAAA,IAAI,CAAC,QAAA,EAAU,OAAO,EAAC;AAEvB,IAAA,OAAO;AAAA;AAAA,MAEL,aAAA,CAAc;AAAA,QACZ,IAAA,EAAM,qBAAA;AAAA,QACN,IAAA,EAAM;AAAA,OACP,CAAA;AAAA;AAAA,MAED,aAAA,CAAc;AAAA,QACZ,IAAA,EAAM,kBAAA;AAAA,QACN,IAAA,EAAM;AAAA,OACP;AAAA,KACH;AAAA,EACF;AACF,CAAC;;;AChGM,IAAM,SAAA,GAAY,KAAK,MAAA,CAAyB;AAAA,EACrD,IAAA,EAAM,WAAA;AAAA,EAEN,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,gBAAgB;AAAC,KACnB;AAAA,EACF,CAAA;AAAA,EAEA,SAAA,GAAY;AACV,IAAA,OAAO;AAAA,MACL,EAAE,KAAK,GAAA,EAAI;AAAA,MACX;AAAA,QACE,KAAA,EAAO,iBAAA;AAAA,QACP,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,UAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA;AAEtC,UAAA,OAAO,KAAA,CAAM,QAAA,CAAS,WAAW,CAAA,GAAI,EAAC,GAAI,KAAA;AAAA,QAC5C;AAAA;AACF,KACF;AAAA,EACF,CAAA;AAAA,EAEA,UAAA,CAAW,EAAE,cAAA,EAAe,EAAG;AAC7B,IAAA,OAAO,CAAC,GAAA,EAAK,EAAE,GAAG,IAAA,CAAK,QAAQ,cAAA,EAAgB,GAAG,cAAA,EAAe,EAAG,CAAC,CAAA;AAAA,EACvE,CAAA;AAAA,EAEA,oBAAA,GAAuB;AACrB,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,MAAM,IAAA,CAAK,MAAA,EAAQ,SAAS,YAAY,CAAA,GAAI,WAAW,CAAA,IAAK;AAAA,KACvE;AAAA,EACF,CAAA;AAAA,EAEA,WAAA,GAAc;AACZ,IAAA,OAAO;AAAA,MACL,YAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM,QAAA,CAAS,QAAQ,WAAW,CAAA;AAAA,MAChD,cAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM,QAAA,CAAS,UAAU,WAAW,CAAA;AAAA,MAClD,eAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM,QAAA,CAAS,WAAW,WAAW;AAAA,KACrD;AAAA,EACF,CAAA;AAAA,EAEA,eAAA,GAAiC;AAC/B,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,WAAA;AAAA,QACN,OAAA,EAAS,iBAAA;AAAA,QACT,QAAA,EAAU,WAAA;AAAA,QACV,IAAA,EAAM,eAAA;AAAA,QACN,KAAA,EAAO,WAAA;AAAA,QACP,QAAA,EAAU,OAAA;AAAA,QACV,KAAA,EAAO,QAAA;AAAA,QACP,QAAA,EAAU;AAAA;AACZ,KACF;AAAA,EACF;AACF,CAAC;;;AC5DM,IAAM,MAAA,GAAS,KAAK,MAAA,CAAsB;AAAA,EAC/C,IAAA,EAAM,QAAA;AAAA,EAEN,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,gBAAgB;AAAC,KACnB;AAAA,EACF,CAAA;AAAA,EAEA,SAAA,GAAY;AACV,IAAA,OAAO;AAAA,MACL,EAAE,KAAK,GAAA,EAAI;AAAA,MACX,EAAE,KAAK,KAAA,EAAM;AAAA,MACb,EAAE,KAAK,QAAA,EAAS;AAAA;AAAA,MAChB;AAAA,QACE,KAAA,EAAO,iBAAA;AAAA,QACP,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,UAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA;AACtC,UAAA,OAAO,KAAA,CAAM,QAAA,CAAS,cAAc,CAAA,GAAI,EAAC,GAAI,KAAA;AAAA,QAC/C;AAAA;AACF,KACF;AAAA,EACF,CAAA;AAAA,EAEA,UAAA,CAAW,EAAE,cAAA,EAAe,EAAG;AAC7B,IAAA,OAAO,CAAC,GAAA,EAAK,EAAE,GAAG,IAAA,CAAK,QAAQ,cAAA,EAAgB,GAAG,cAAA,EAAe,EAAG,CAAC,CAAA;AAAA,EACvE,CAAA;AAAA,EAEA,oBAAA,GAAuB;AACrB,IAAA,OAAO;AAAA,MACL,aAAA,EAAe,MAAM,IAAA,CAAK,MAAA,EAAQ,SAAS,YAAY,CAAA,GAAI,QAAQ,CAAA,IAAK;AAAA,KAC1E;AAAA,EACF,CAAA;AAAA,EAEA,WAAA,GAAc;AACZ,IAAA,OAAO;AAAA,MACL,SAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM,QAAA,CAAS,QAAQ,QAAQ,CAAA;AAAA,MAC7C,WAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM,QAAA,CAAS,UAAU,QAAQ,CAAA;AAAA,MAC/C,YAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM,QAAA,CAAS,WAAW,QAAQ;AAAA,KAClD;AAAA,EACF,CAAA;AAAA,EAEA,eAAA,GAAiC;AAC/B,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,QAAA;AAAA,QACN,OAAA,EAAS,cAAA;AAAA,QACT,QAAA,EAAU,QAAA;AAAA,QACV,IAAA,EAAM,mBAAA;AAAA,QACN,KAAA,EAAO,eAAA;AAAA,QACP,QAAA,EAAU,aAAA;AAAA,QACV,KAAA,EAAO,QAAA;AAAA,QACP,QAAA,EAAU;AAAA;AACZ,KACF;AAAA,EACF,CAAA;AAAA,EAEA,aAAA,GAAgB;AACd,IAAA,MAAM,WAAW,IAAA,CAAK,QAAA;AACtB,IAAA,IAAI,CAAC,QAAA,EAAU,OAAO,EAAC;AAEvB,IAAA,OAAO;AAAA;AAAA,MAEL,aAAA,CAAc;AAAA,QACZ,MAAM,qBAAA,CAAsB,MAAA;AAAA,QAC5B,IAAA,EAAM;AAAA,OACP;AAAA,KACH;AAAA,EACF;AACF,CAAC;;;AC3EM,IAAM,IAAA,GAAO,KAAK,MAAA,CAAoB;AAAA,EAC3C,IAAA,EAAM,MAAA;AAAA,EAEN,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,gBAAgB;AAAC,KACnB;AAAA,EACF,CAAA;AAAA;AAAA;AAAA,EAIA,QAAA,EAAU,GAAA;AAAA;AAAA,EAGV,QAAA,EAAU,KAAA;AAAA,EAEV,SAAA,GAAY;AACV,IAAA,OAAO,CAAC,EAAE,GAAA,EAAK,MAAA,EAAQ,CAAA;AAAA,EACzB,CAAA;AAAA,EAEA,UAAA,CAAW,EAAE,cAAA,EAAe,EAAG;AAC7B,IAAA,OAAO,CAAC,MAAA,EAAQ,EAAE,GAAG,IAAA,CAAK,QAAQ,cAAA,EAAgB,GAAG,cAAA,EAAe,EAAG,CAAC,CAAA;AAAA,EAC1E,CAAA;AAAA,EAEA,oBAAA,GAAuB;AACrB,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,MAAM,IAAA,CAAK,MAAA,EAAQ,SAAS,YAAY,CAAA,GAAI,MAAM,CAAA,IAAK;AAAA,KAClE;AAAA,EACF,CAAA;AAAA,EAEA,WAAA,GAAc;AACZ,IAAA,OAAO;AAAA,MACL,OAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM,QAAA,CAAS,QAAQ,MAAM,CAAA;AAAA,MAC3C,SAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM,QAAA,CAAS,UAAU,MAAM,CAAA;AAAA,MAC7C,UAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM,QAAA,CAAS,WAAW,MAAM;AAAA,KAChD;AAAA,EACF,CAAA;AAAA,EAEA,eAAA,GAAiC;AAC/B,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,MAAA;AAAA,QACN,OAAA,EAAS,YAAA;AAAA,QACT,QAAA,EAAU,MAAA;AAAA,QACV,IAAA,EAAM,MAAA;AAAA,QACN,KAAA,EAAO,MAAA;AAAA,QACP,QAAA,EAAU,OAAA;AAAA,QACV,KAAA,EAAO,QAAA;AAAA,QACP,QAAA,EAAU;AAAA;AACZ,KACF;AAAA,EACF,CAAA;AAAA,EAEA,aAAA,GAAgB;AACd,IAAA,MAAM,WAAW,IAAA,CAAK,QAAA;AACtB,IAAA,IAAI,CAAC,QAAA,EAAU,OAAO,EAAC;AAEvB,IAAA,OAAO;AAAA;AAAA,MAEL,aAAA,CAAc;AAAA,QACZ,MAAM,qBAAA,CAAsB,IAAA;AAAA,QAC5B,IAAA,EAAM;AAAA,OACP;AAAA,KACH;AAAA,EACF;AACF,CAAC;ACtEM,IAAM,kBAAA,GAAqB,IAAIC,eAAAA,CAAU,WAAW;AAQpD,SAAS,gBAAgB,OAAA,EAAyC;AACvE,EAAA,MAAM,EAAE,IAAA,EAAM,WAAA,GAAc,IAAA,EAAM,oBAAA,GAAuB,OAAM,GAAI,OAAA;AAEnE,EAAA,OAAO,IAAIxC,YAAAA,CAAO;AAAA,IAChB,GAAA,EAAK,kBAAA;AAAA,IAEL,KAAA,EAAO;AAAA,MACL,WAAA,CAAY,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO;AAE7B,QAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,UAAA,OAAO,KAAA;AAAA,QACT;AAGA,QAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAClB,UAAA,OAAO,KAAA;AAAA,QACT;AAGA,QAAA,IAAI,IAAA,GAAiC,IAAA;AAErC,QAAA,IAAI,KAAA,CAAM,kBAAkB,iBAAA,EAAmB;AAC7C,UAAA,IAAA,GAAO,KAAA,CAAM,MAAA;AAAA,QACf,CAAA,MAAO;AACL,UAAA,MAAM,SAAS,KAAA,CAAM,MAAA;AACrB,UAAA,IAAI,CAAC,MAAA,EAAQ;AACX,YAAA,OAAO,KAAA;AAAA,UACT;AACA,UAAA,IAAA,GAAO,MAAA,CAAO,QAA2B,GAAG,CAAA;AAC5C,UAAA,IAAI,QAAQ,CAAC,IAAA,CAAK,GAAA,CAAI,QAAA,CAAS,IAAI,CAAA,EAAG;AACpC,YAAA,IAAA,GAAO,IAAA;AAAA,UACT;AAAA,QACF;AAEA,QAAA,IAAI,CAAC,IAAA,EAAM;AACT,UAAA,OAAO,KAAA;AAAA,QACT;AAGA,QAAA,IAAI,oBAAA,EAAsB;AACxB,UAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,IAAA,EAAM,CAAC,CAAA;AACjC,UAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,QAAQ,GAAG,CAAA;AAEvC,UAAA,IAAI,IAAA,CAAK,OAAM,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,IAAI,CAAA,EAAG;AAE7C,YAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,YAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,YAAA;AAC9B,YAAA,IAAI,UAAA,GAAa,GAAA;AACjB,YAAA,IAAI,QAAA,GAAW,GAAA;AAEf,YAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,KAAA,EAAO,WAAA,KAAgB;AACrC,cAAA,MAAM,aAAa,UAAA,GAAa,WAAA;AAChC,cAAA,MAAM,QAAA,GAAW,aAAa,KAAA,CAAM,QAAA;AACpC,cAAA,IAAI,IAAA,CAAK,QAAQ,KAAA,CAAM,KAAK,KAAK,UAAA,IAAc,QAAA,IAAY,YAAY,UAAA,EAAY;AACjF,gBAAA,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,UAAA,EAAY,UAAU,CAAA;AAC5C,gBAAA,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,QAAQ,CAAA;AAAA,cACxC;AAAA,YACF,CAAC,CAAA;AAED,YAAA,MAAM,EAAA,GAAK,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,YAAA;AAAA,cACvBD,oBAAc,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,GAAA,EAAK,YAAY,QAAQ;AAAA,aAC3D;AACA,YAAA,IAAA,CAAK,SAAS,EAAE,CAAA;AAChB,YAAA,OAAO,IAAA;AAAA,UACT;AAAA,QACF;AAEA,QAAA,IAAI,WAAA,EAAa;AAEf,UAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,IAAA,EAAM,CAAC,CAAA;AACjC,UAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,QAAQ,GAAG,CAAA;AACvC,UAAA,MAAM,QAAA,GAAW,KAAK,KAAA,EAAM,CAAE,KAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,IAAI,CAAA;AAEzD,UAAA,MAAM,IAAA,GAAQ,QAAA,EAAU,KAAA,CAAM,MAAM,KAA4B,IAAA,CAAK,IAAA;AACrE,UAAA,MAAM,UAAA,GAAc,QAAA,EAAU,KAAA,CAAM,QAAQ,KAA4B,IAAA,CAAK,MAAA;AAE7E,UAAA,IAAI,IAAA,EAAM;AACR,YAAA,MAAA,CAAO,IAAA,CAAK,IAAA,EAAM,UAAA,IAAc,QAAQ,CAAA;AACxC,YAAA,OAAO,IAAA;AAAA,UACT;AAAA,QACF;AAEA,QAAA,OAAO,KAAA;AAAA,MACT;AAAA;AACF,GACD,CAAA;AACH;ACjGO,IAAM,kBAAA,GAAqB,IAAIyC,eAAAA,CAAU,WAAW;AAYpD,SAAS,gBAAgB,OAAA,EAAyC;AACvE,EAAA,MAAM,EAAE,MAAM,SAAA,GAAY,CAAC,SAAS,QAAQ,CAAA,EAAG,UAAS,GAAI,OAAA;AAE5D,EAAA,OAAO,IAAIxC,YAAAA,CAAO;AAAA,IAChB,GAAA,EAAK,kBAAA;AAAA,IAEL,KAAA,EAAO;AAAA,MACL,WAAA,CAAY,MAAM,KAAA,EAAO;AAEvB,QAAA,MAAM,OAAO,KAAA,CAAM,aAAA,EAAe,OAAA,CAAQ,YAAY,EAAE,IAAA,EAAK;AAC7D,QAAA,IAAI,CAAC,MAAM,OAAO,KAAA;AAGlB,QAAA,IAAI,GAAA;AACJ,QAAA,IAAI;AACF,UAAA,GAAA,GAAM,IAAI,IAAI,IAAI,CAAA;AAAA,QACpB,CAAA,CAAA,MAAQ;AACN,UAAA,OAAO,KAAA;AAAA,QACT;AAGA,QAAA,IAAI,CAAC,SAAA,CAAU,QAAA,CAAS,GAAA,CAAI,QAAQ,CAAA,EAAG;AACrC,UAAA,OAAO,KAAA;AAAA,QACT;AAGA,QAAA,IAAI,QAAA,IAAY,CAAC,QAAA,CAAS,IAAI,CAAA,EAAG;AAC/B,UAAA,OAAO,KAAA;AAAA,QACT;AAEA,QAAA,MAAM,EAAE,KAAA,EAAO,QAAA,EAAS,GAAI,IAAA;AAC5B,QAAA,MAAM,EAAE,IAAA,EAAM,EAAA,EAAI,KAAA,KAAU,KAAA,CAAM,SAAA;AAClC,QAAA,MAAM,KAAK,KAAA,CAAM,EAAA;AAEjB,QAAA,IAAI,KAAA,EAAO;AAET,UAAA,EAAA,CAAG,UAAA,CAAW,IAAA,EAAM,IAAA,EAAM,EAAE,CAAA;AAC5B,UAAA,EAAA,CAAG,OAAA,CAAQ,IAAA,EAAM,IAAA,GAAO,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,MAAA,CAAO,EAAE,IAAA,EAAM,IAAA,EAAM,CAAC,CAAA;AAAA,QAClE,CAAA,MAAO;AAEL,UAAA,EAAA,CAAG,OAAA,CAAQ,MAAM,EAAA,EAAI,IAAA,CAAK,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,CAAC,CAAA;AAAA,QAClD;AAEA,QAAA,QAAA,CAAS,EAAE,CAAA;AACX,QAAA,OAAO,IAAA;AAAA,MACT;AAAA;AACF,GACD,CAAA;AACH;ACrDO,IAAM,iBAAA,GAAoB,IAAIwC,eAAAA,CAAU,UAAU;AAKzD,IAAM,aAAA,GAAgB,cAAA;AAWf,SAAS,eAAe,OAAA,EAAwC;AACrE,EAAA,MAAM;AAAA,IACJ,IAAA;AAAA,IACA,SAAA,GAAY,CAAC,OAAA,EAAS,QAAQ,CAAA;AAAA,IAC9B,eAAA,GAAkB,OAAA;AAAA,IAClB;AAAA,GACF,GAAI,OAAA;AAEJ,EAAA,OAAO,IAAIxC,YAAAA,CAAO;AAAA,IAChB,GAAA,EAAK,iBAAA;AAAA,IAEL,KAAA,EAAO;AAAA,MACL,eAAA,CAAgB,IAAA,EAAM,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM;AAEpC,QAAA,IAAI,CAAC,aAAA,CAAc,IAAA,CAAK,IAAI,CAAA,EAAG;AAC7B,UAAA,OAAO,KAAA;AAAA,QACT;AAEA,QAAA,MAAM,EAAE,OAAM,GAAI,IAAA;AAClB,QAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,GAAA,CAAI,OAAA,CAAQ,IAAI,CAAA;AAGpC,QAAA,MAAM,UAAA,GAAa,MAAM,MAAA,CAAO,WAAA;AAAA,UAC9B,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAA,CAAM,eAAe,GAAG,CAAA;AAAA;AAAA,UACpC,KAAA,CAAM,YAAA;AAAA,UACN,MAAA;AAAA,UACA;AAAA,SACF;AAGA,QAAA,MAAM,OAAA,GAAUO,eAAK,UAAA,EAAY;AAAA,UAC/B;AAAA,SACD,CAAA;AAGD,QAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA;AAC5C,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA,OAAO,KAAA;AAAA,QACT;AAGA,QAAA,IAAI,SAAA,CAAU,SAAS,KAAA,EAAO;AAC5B,UAAA,OAAO,KAAA;AAAA,QACT;AAGA,QAAA,IAAI,SAAA,CAAU,GAAA,KAAQ,UAAA,CAAW,MAAA,EAAQ;AACvC,UAAA,OAAO,KAAA;AAAA,QACT;AAEA,QAAA,MAAM,OAAO,SAAA,CAAU,IAAA;AAGvB,QAAA,IAAI;AACF,UAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,IAAI,CAAA;AACxB,UAAA,IAAI,CAAC,SAAA,CAAU,QAAA,CAAS,GAAA,CAAI,QAAQ,CAAA,EAAG;AACrC,YAAA,OAAO,KAAA;AAAA,UACT;AAAA,QACF,CAAA,CAAA,MAAQ;AACN,UAAA,OAAO,KAAA;AAAA,QACT;AAGA,QAAA,IAAI,cAAA,IAAkB,CAAC,cAAA,CAAe,IAAI,CAAA,EAAG;AAC3C,UAAA,OAAO,KAAA;AAAA,QACT;AAGA,QAAA,MAAM,UAAA,GAAa,OAAO,KAAA,CAAM,YAAA;AAChC,QAAA,MAAM,SAAA,GAAY,aAAa,SAAA,CAAU,KAAA;AACzC,QAAA,MAAM,OAAA,GAAU,aAAa,SAAA,CAAU,GAAA;AAGvC,QAAA,MAAM,UAAA,GAAa,KAAA,CAAM,GAAA,CAAI,OAAA,CAAQ,SAAS,CAAA;AAC9C,QAAA,IAAI,UAAA,CAAW,OAAM,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,IAAI,CAAA,EAAG;AACnD,UAAA,OAAO,KAAA;AAAA,QACT;AAGA,QAAA,MAAM,KAAK,KAAA,CAAM,EAAA;AACjB,QAAA,EAAA,CAAG,OAAA,CAAQ,WAAW,OAAA,EAAS,IAAA,CAAK,OAAO,EAAE,IAAA,EAAM,CAAC,CAAA;AACpD,QAAA,EAAA,CAAG,UAAA,CAAW,IAAA,EAAM,IAAA,EAAM,EAAE,CAAA;AAE5B,QAAA,IAAA,CAAK,SAAS,EAAE,CAAA;AAChB,QAAA,OAAO,IAAA;AAAA,MACT;AAAA;AACF,GACD,CAAA;AACH;ACzHO,IAAM,iBAAA,GAAoB,IAAIiC,eAAAA,CAAU,UAAU;AAalD,SAAS,eAAe,OAAA,EAAwC;AACrE,EAAA,MAAM,EAAE,MAAK,GAAI,OAAA;AAEjB,EAAA,OAAO,IAAIxC,YAAAA,CAAO;AAAA,IAChB,GAAA,EAAK,iBAAA;AAAA,IAEL,KAAA,EAAO;AAAA,MACL,aAAA,CAAc,MAAM,KAAA,EAAO;AACzB,QAAA,IAAI,KAAA,CAAM,GAAA,KAAQ,YAAA,EAAc,OAAO,KAAA;AAEvC,QAAA,MAAM,SAAEF,SAAM,GAAI,IAAA;AAClB,QAAA,MAAM,EAAE,WAAU,GAAIA,OAAA;AAGtB,QAAA,IAAI,EAAE,SAAA,YAAqBC,mBAAAA,CAAAA,IAAkB,CAAC,UAAU,KAAA,EAAO;AAC7D,UAAA,OAAO,KAAA;AAAA,QACT;AAEA,QAAA,MAAM,UAAU,SAAA,CAAU,OAAA;AAC1B,QAAA,IAAI,CAAC,SAAS,OAAO,KAAA;AAMrB,QAAA,MAAM,aAAa,OAAA,CAAQ,UAAA;AAC3B,QAAA,IAAI,CAAC,YAAY,OAAO,KAAA;AAExB,QAAA,MAAM,cAAc,UAAA,CAAW,KAAA;AAC/B,QAAA,MAAM,UAAU,WAAA,CAAY,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,IAAI,CAAA;AACvD,QAAA,IAAI,CAAC,SAAS,OAAO,KAAA;AAIrB,QAAA,MAAM,QAAQ,OAAA,CAAQ,SAAA;AACtB,QAAA,MAAM,YAAA,GAAe,OAAO,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,IAAI,CAAA,IAAK,KAAA;AAElE,QAAA,IAAI,CAAC,YAAA,EAAc;AAEjB,UAAA,MAAM,mBAAmB,WAAA,CAAY,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,IAAI,CAAA;AAClE,UAAA,MAAM,EAAA,GAAKD,OAAA,CAAM,EAAA,CAAG,cAAA,CAAe,gBAAgB,CAAA;AACnD,UAAA,IAAA,CAAK,SAAS,EAAE,CAAA;AAEhB,UAAA,OAAO,KAAA;AAAA,QACT;AAEA,QAAA,OAAO,KAAA;AAAA,MACT;AAAA;AACF,GACD,CAAA;AACH;;;ACTO,IAAM,IAAA,GAAO,KAAK,MAAA,CAAoB;AAAA,EAC3C,IAAA,EAAM,MAAA;AAAA;AAAA;AAAA;AAAA,EAKN,YAAA,EAAc,KAAA;AAAA;AAAA,EAGd,QAAA,EAAU,GAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMV,SAAA,GAAY;AACV,IAAA,OAAO,KAAK,OAAA,CAAQ,QAAA;AAAA,EACtB,CAAA;AAAA,EAEA,UAAA,GAA0B;AACxB,IAAA,OAAO;AAAA,MACL,gBAAgB,EAAC;AAAA,MACjB,SAAA,EAAW,CAAC,OAAA,EAAS,QAAA,EAAU,WAAW,MAAM,CAAA;AAAA,MAChD,WAAA,EAAa,IAAA;AAAA,MACb,cAAA,EAAgB,IAAA;AAAA,MAChB,QAAA,EAAU,IAAA;AAAA,MACV,WAAA,EAAa,IAAA;AAAA,MACb,eAAA,EAAiB,OAAA;AAAA,MACjB,oBAAA,EAAsB;AAAA,KACxB;AAAA,EACF,CAAA;AAAA,EAEA,aAAA,GAAgB;AACd,IAAA,OAAO;AAAA,MACL,IAAA,EAAM;AAAA,QACJ,OAAA,EAAS;AAAA,OACX;AAAA,MACA,MAAA,EAAQ;AAAA,QACN,OAAA,EAAS;AAAA,OACX;AAAA,MACA,GAAA,EAAK;AAAA,QACH,OAAA,EAAS;AAAA,OACX;AAAA,MACA,KAAA,EAAO;AAAA,QACL,OAAA,EAAS;AAAA,OACX;AAAA,MACA,KAAA,EAAO;AAAA,QACL,OAAA,EAAS;AAAA;AACX,KACF;AAAA,EACF,CAAA;AAAA,EAEA,SAAA,GAAY;AACV,IAAA,OAAO;AAAA,MACL;AAAA,QACE,GAAA,EAAK,SAAA;AAAA,QACL,QAAA,EAAU,CAAC,IAAA,KAAS;AAClB,UAAA,IAAI,OAAO,IAAA,KAAS,QAAA,EAAU,OAAO,KAAA;AACrC,UAAA,MAAM,IAAA,GAAO,IAAA,CAAK,YAAA,CAAa,MAAM,CAAA;AAGrC,UAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,UAAA,CAAW,IAAA,EAAM,EAAE,SAAA,EAAW,IAAA,CAAK,OAAA,CAAQ,SAAA,EAAW,CAAA,EAAG;AACrE,YAAA,OAAO,KAAA;AAAA,UACT;AAEA,UAAA,OAAO;AAAA,YACL,IAAA;AAAA,YACA,MAAA,EAAQ,IAAA,CAAK,YAAA,CAAa,QAAQ,CAAA;AAAA,YAClC,GAAA,EAAK,IAAA,CAAK,YAAA,CAAa,KAAK,CAAA;AAAA,YAC5B,KAAA,EAAO,IAAA,CAAK,YAAA,CAAa,OAAO,CAAA;AAAA,YAChC,KAAA,EAAO,IAAA,CAAK,YAAA,CAAa,OAAO;AAAA,WAClC;AAAA,QACF;AAAA;AACF,KACF;AAAA,EACF,CAAA;AAAA,EAEA,UAAA,CAAW,EAAE,cAAA,EAAe,EAAG;AAC7B,IAAA,MAAM,QAAQ,EAAE,GAAG,KAAK,OAAA,CAAQ,cAAA,EAAgB,GAAG,cAAA,EAAe;AAGlE,IAAA,IACE,OAAO,KAAA,CAAM,MAAM,CAAA,KAAM,QAAA,IACzB,CAAC,UAAA,CAAW,KAAA,CAAM,MAAM,CAAA,EAAG,EAAE,SAAA,EAAW,IAAA,CAAK,OAAA,CAAQ,SAAA,EAAW,CAAA,EAChE;AAEA,MAAA,MAAM,EAAE,IAAA,EAAM,CAAA,EAAG,GAAG,MAAK,GAAI,KAAA;AAC7B,MAAA,OAAO,CAAC,GAAA,EAAK,IAAA,EAAM,CAAC,CAAA;AAAA,IACtB;AAGA,IAAA,IACE,IAAA,CAAK,OAAA,CAAQ,cAAA,IACb,KAAA,CAAM,QAAQ,MAAM,QAAA,IACpB,CAAC,KAAA,CAAM,KAAK,CAAA,EACZ;AACA,MAAA,KAAA,CAAM,KAAK,CAAA,GAAI,qBAAA;AAAA,IACjB;AAEA,IAAA,OAAO,CAAC,GAAA,EAAK,KAAA,EAAO,CAAC,CAAA;AAAA,EACvB,CAAA;AAAA,EAEA,WAAA,GAAc;AACZ,IAAA,OAAO;AAAA,MACL,SACE,CAAC,UAAA,KACD,CAAC,EAAE,UAAS,KAAM;AAChB,QAAA,IAAI,CAAC,UAAA,CAAW,UAAA,CAAW,IAAA,EAAM,EAAE,WAAW,IAAA,CAAK,OAAA,CAAQ,SAAA,EAAW,CAAA,EAAG;AACvE,UAAA,OAAO,KAAA;AAAA,QACT;AACA,QAAA,OAAO,QAAA,CAAS,OAAA,CAAQ,MAAA,EAAQ,UAAU,CAAA;AAAA,MAC5C,CAAA;AAAA,MACF,WACE,MACA,CAAC,EAAE,EAAA,EAAI,KAAA,EAAO,UAAS,KAAM;AAC3B,QAAA,MAAM,QAAA,GAAW,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA;AAC1C,QAAA,IAAI,CAAC,UAAU,OAAO,KAAA;AAEtB,QAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAO,GAAI,EAAA,CAAG,SAAA;AAE7B,QAAA,IAAI,KAAA,EAAO;AAET,UAAA,MAAM,OAAO,EAAA,CAAG,GAAA,CAAI,OAAA,CAAQ,EAAA,CAAG,UAAU,IAAI,CAAA;AAC7C,UAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,IAAA,EAAM,QAAQ,CAAA;AACzC,UAAA,IAAI,CAAC,OAAO,OAAO,KAAA;AACnB,UAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AACtB,UAAA,EAAA,CAAG,UAAA,CAAW,KAAA,CAAM,IAAA,EAAM,KAAA,CAAM,IAAI,QAAQ,CAAA;AAAA,QAC9C,CAAA,MAAO;AAGL,UAAA,MAAM,GAAA,GAAM,EAAE,iBAAA,EAAmB,KAAA,EAAM;AACvC,UAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,YAAA,EAAA,CAAG,GAAA,CAAI,YAAA,CAAa,KAAA,CAAM,KAAA,CAAM,GAAA,EAAK,KAAA,CAAM,GAAA,CAAI,GAAA,EAAK,CAAC,IAAA,EAAM,IAAA,EAAM,MAAA,KAAW;AAC1E,cAAA,IAAI,IAAA,CAAK,UAAU,MAAA,EAAQ,IAAA,CAAK,eAAe,QAAQ,CAAA,IAClD,CAAC,IAAA,CAAK,KAAA,CAAM,KAAK,CAAC,CAAA,KAAM,EAAE,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,IAAK,CAAA,CAAE,IAAA,KAAS,QAAQ,CAAA,EAAG;AAC9E,gBAAA,GAAA,CAAI,iBAAA,GAAoB,IAAA;AAAA,cAC1B;AAAA,YACF,CAAC,CAAA;AAAA,UACH;AACA,UAAA,IAAI,CAAC,GAAA,CAAI,iBAAA,EAAmB,OAAO,KAAA;AACnC,UAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAEtB,UAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,YAAA,EAAA,CAAG,WAAW,KAAA,CAAM,KAAA,CAAM,KAAK,KAAA,CAAM,GAAA,CAAI,KAAK,QAAQ,CAAA;AAAA,UACxD;AAAA,QACF;AAEA,QAAA,QAAA,CAAS,EAAE,CAAA;AACX,QAAA,OAAO,IAAA;AAAA,MACT,CAAA;AAAA,MACF,UAAA,EACE,CAAC,UAAA,KACD,CAAC,EAAE,EAAA,EAAI,KAAA,EAAO,UAAS,KAAM;AAC3B,QAAA,IAAI,CAAC,UAAA,CAAW,UAAA,CAAW,IAAA,EAAM,EAAE,WAAW,IAAA,CAAK,OAAA,CAAQ,SAAA,EAAW,CAAA,EAAG;AACvE,UAAA,OAAO,KAAA;AAAA,QACT;AAEA,QAAA,MAAM,QAAA,GAAW,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA;AAC1C,QAAA,IAAI,CAAC,UAAU,OAAO,KAAA;AAEtB,QAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAO,GAAI,EAAA,CAAG,SAAA;AAE7B,QAAA,IAAI,KAAA,EAAO;AAET,UAAA,MAAM,OAAO,EAAA,CAAG,GAAA,CAAI,OAAA,CAAQ,EAAA,CAAG,UAAU,IAAI,CAAA;AAC7C,UAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,IAAA,EAAM,QAAQ,CAAA;AAEzC,UAAA,IAAI,KAAA,IAAS,GAAG,GAAA,CAAI,YAAA,CAAa,MAAM,IAAA,EAAM,KAAA,CAAM,EAAA,EAAI,QAAQ,CAAA,EAAG;AAEhE,YAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AACtB,YAAA,EAAA,CAAG,UAAA,CAAW,KAAA,CAAM,IAAA,EAAM,KAAA,CAAM,IAAI,QAAQ,CAAA;AAAA,UAC9C,CAAA,MAAO;AAEL,YAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AACtB,YAAA,MAAM,cAAc,EAAA,CAAG,WAAA,IAAe,KAAA,CAAM,WAAA,IAAe,KAAK,KAAA,EAAM;AACtE,YAAA,IAAI,QAAA,CAAS,OAAA,CAAQ,WAAW,CAAA,EAAG;AACjC,cAAA,EAAA,CAAG,iBAAiB,QAAQ,CAAA;AAAA,YAC9B,CAAA,MAAO;AACL,cAAA,EAAA,CAAG,aAAA,CAAc,QAAA,CAAS,MAAA,CAAO,UAAU,CAAC,CAAA;AAAA,YAC9C;AAAA,UACF;AAAA,QACF,CAAA,MAAO;AACL,UAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAEtB,UAAA,MAAM,UAAU,MAAA,CAAO,KAAA;AAAA,YAAM,CAAA,KAAA,KAC3B,EAAA,CAAG,GAAA,CAAI,YAAA,CAAa,KAAA,CAAM,MAAM,GAAA,EAAK,KAAA,CAAM,GAAA,CAAI,GAAA,EAAK,QAAQ;AAAA,WAC9D;AACA,UAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,YAAA,IAAI,OAAA,EAAS;AACX,cAAA,EAAA,CAAG,WAAW,KAAA,CAAM,KAAA,CAAM,KAAK,KAAA,CAAM,GAAA,CAAI,KAAK,QAAQ,CAAA;AAAA,YACxD,CAAA,MAAO;AACL,cAAA,EAAA,CAAG,OAAA,CAAQ,KAAA,CAAM,KAAA,CAAM,GAAA,EAAK,KAAA,CAAM,IAAI,GAAA,EAAK,QAAA,CAAS,MAAA,CAAO,UAAU,CAAC,CAAA;AAAA,YACxE;AAAA,UACF;AAAA,QACF;AAEA,QAAA,QAAA,CAAS,EAAE,CAAA;AACX,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,KACJ;AAAA,EACF,CAAA;AAAA,EAEA,oBAAA,GAAuB;AACrB,IAAA,OAAO;AAAA,MACL,SAAS,MAAM;AACb,QAAC,IAAA,CAAK,MAAA,CAA6B,IAAA,CAAK,UAAA,EAAY,EAAE,CAAA;AACtD,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,KACF;AAAA,EACF,CAAA;AAAA,EAEA,eAAA,GAAiC;AAC/B,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,MAAA;AAAA,QACN,OAAA,EAAS,WAAA;AAAA,QACT,SAAA,EAAW,UAAA;AAAA,QACX,QAAA,EAAU,MAAA;AAAA,QACV,IAAA,EAAM,MAAA;AAAA,QACN,KAAA,EAAO,MAAA;AAAA,QACP,QAAA,EAAU,OAAA;AAAA,QACV,KAAA,EAAO,QAAA;AAAA,QACP,QAAA,EAAU;AAAA;AACZ,KACF;AAAA,EACF,CAAA;AAAA,EAEA,qBAAA,GAAwB;AACtB,IAAA,MAAM,WAAW,IAAA,CAAK,QAAA;AACtB,IAAA,IAAI,CAAC,QAAA,EAAU,OAAO,EAAC;AAEvB,IAAA,MAAM,UAAU,EAAC;AAIjB,IAAA,OAAA,CAAQ,IAAA;AAAA,MACN,eAAA,CAAgB;AAAA,QACd,IAAA,EAAM,QAAA;AAAA,QACN,aAAa,IAAA,CAAK,OAAA,CAAQ,gBAAgB,iBAAA,GACtC,IAAA,GACA,KAAK,OAAA,CAAQ,WAAA;AAAA,QACjB,oBAAA,EAAsB,KAAK,OAAA,CAAQ;AAAA,OACpC;AAAA,KACH;AAGA,IAAA,IAAI,IAAA,CAAK,QAAQ,WAAA,EAAa;AAC5B,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN,eAAA,CAAgB;AAAA,UACd,IAAA,EAAM,QAAA;AAAA,UACN,SAAA,EAAW,KAAK,OAAA,CAAQ;AAAA,SACzB;AAAA,OACH;AAAA,IACF;AAGA,IAAA,OAAA,CAAQ,KAAK,cAAA,CAAe,EAAE,IAAA,EAAM,QAAA,EAAU,CAAC,CAAA;AAI/C,IAAA,OAAA,CAAQ,IAAA;AAAA,MACN,IAAIE,YAAAA,CAAO;AAAA,QACT,GAAA,EAAK,IAAIwC,eAAAA,CAAU,iBAAiB,CAAA;AAAA,QACpC,iBAAA,CAAkB,YAAA,EAAc,SAAA,EAAW,QAAA,EAAU;AACnD,UAAA,MAAM,aAAa,YAAA,CAAa,IAAA,CAAK,CAAC,EAAA,KAAO,GAAG,UAAU,CAAA;AAC1D,UAAA,IAAI,CAAC,YAAY,OAAO,IAAA;AAExB,UAAA,MAAM,EAAE,WAAU,GAAI,QAAA;AACtB,UAAA,IAAI,EAAE,SAAA,YAAqBzC,mBAAAA,CAAAA,IAAkB,CAAC,SAAA,CAAU,OAAO,OAAO,IAAA;AAEtE,UAAA,MAAM,UAAU,SAAA,CAAU,OAAA;AAC1B,UAAA,IAAI,OAAA,EAAS,YAAA,KAAiB,CAAA,EAAG,OAAO,IAAA;AAExC,UAAA,MAAM,SAAS,QAAA,CAAS,WAAA;AACxB,UAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAEpB,UAAA,MAAM,UAAU,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,QAAQ,CAAA;AACtD,UAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AAErB,UAAA,OAAO,QAAA,CAAS,EAAA,CAAG,cAAA,CAAe,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,QAAQ,CAAC,CAAA;AAAA,QAC7E;AAAA,OACD;AAAA,KACH;AAGA,IAAA,IAAI,IAAA,CAAK,QAAQ,QAAA,EAAU;AACzB,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN,cAAA,CAAe;AAAA,UACb,IAAA,EAAM,QAAA;AAAA,UACN,SAAA,EAAW,KAAK,OAAA,CAAQ,SAAA;AAAA,UACxB,eAAA,EAAiB,KAAK,OAAA,CAAQ,eAAA;AAAA,UAC9B,GAAI,IAAA,CAAK,OAAA,CAAQ,cAAA,IAAkB;AAAA,YACjC,cAAA,EAAgB,KAAK,OAAA,CAAQ;AAAA;AAC/B,SACD;AAAA,OACH;AAAA,IACF;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AACF,CAAC;;;AC3VM,IAAM,SAAA,GAAY,KAAK,MAAA,CAAyB;AAAA,EACrD,IAAA,EAAM,WAAA;AAAA;AAAA;AAAA,EAIN,QAAA,EAAU,EAAA;AAAA,EAEV,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,gBAAgB;AAAC,KACnB;AAAA,EACF,CAAA;AAAA,EAEA,SAAA,GAAY;AACV,IAAA,OAAO;AAAA,MACL,EAAE,KAAK,KAAA,EAAM;AAAA,MACb;AAAA,QACE,KAAA,EAAO,gBAAA;AAAA,QACP,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,UAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA;AACtC,UAAA,OAAO,KAAA,KAAU,KAAA,GAAQ,EAAC,GAAI,KAAA;AAAA,QAChC;AAAA;AACF,KACF;AAAA,EACF,CAAA;AAAA,EAEA,UAAA,CAAW,EAAE,cAAA,EAAe,EAAG;AAC7B,IAAA,OAAO,CAAC,KAAA,EAAO,EAAE,GAAG,IAAA,CAAK,QAAQ,cAAA,EAAgB,GAAG,cAAA,EAAe,EAAG,CAAC,CAAA;AAAA,EACzE,CAAA;AAAA,EAEA,oBAAA,GAAuB;AACrB,IAAA,OAAO;AAAA,MACL,SAAS,MAAM,IAAA,CAAK,QAAQ,QAAA,CAAS,iBAAiB,KAAI,IAAK;AAAA,KACjE;AAAA,EACF,CAAA;AAAA,EAEA,WAAA,GAAc;AACZ,IAAA,OAAO;AAAA,MACL,YAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM;AAChB,QAAA,QAAA,CAAS,UAAU,aAAa,CAAA;AAChC,QAAA,OAAO,QAAA,CAAS,QAAQ,WAAW,CAAA;AAAA,MACrC,CAAA;AAAA,MACF,cAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM,QAAA,CAAS,UAAU,WAAW,CAAA;AAAA,MAClD,eAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM;AAChB,QAAA,QAAA,CAAS,UAAU,aAAa,CAAA;AAChC,QAAA,OAAO,QAAA,CAAS,WAAW,WAAW,CAAA;AAAA,MACxC;AAAA,KACJ;AAAA,EACF,CAAA;AAAA,EACA,eAAA,GAAiC;AAC/B,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,WAAA;AAAA,QACN,OAAA,EAAS,iBAAA;AAAA,QACT,QAAA,EAAU,WAAA;AAAA,QACV,IAAA,EAAM,eAAA;AAAA,QACN,KAAA,EAAO,WAAA;AAAA,QACP,QAAA,EAAU,OAAA;AAAA,QACV,KAAA,EAAO,QAAA;AAAA,QACP,QAAA,EAAU;AAAA;AACZ,KACF;AAAA,EACF;AACF,CAAC;;;ACtEM,IAAM,WAAA,GAAc,KAAK,MAAA,CAA2B;AAAA,EACzD,IAAA,EAAM,aAAA;AAAA;AAAA;AAAA,EAIN,QAAA,EAAU,EAAA;AAAA,EAEV,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,gBAAgB;AAAC,KACnB;AAAA,EACF,CAAA;AAAA,EAEA,SAAA,GAAY;AACV,IAAA,OAAO;AAAA,MACL,EAAE,KAAK,KAAA,EAAM;AAAA,MACb;AAAA,QACE,KAAA,EAAO,gBAAA;AAAA,QACP,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,UAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA;AACtC,UAAA,OAAO,KAAA,KAAU,OAAA,GAAU,EAAC,GAAI,KAAA;AAAA,QAClC;AAAA;AACF,KACF;AAAA,EACF,CAAA;AAAA,EAEA,UAAA,CAAW,EAAE,cAAA,EAAe,EAAG;AAC7B,IAAA,OAAO,CAAC,KAAA,EAAO,EAAE,GAAG,IAAA,CAAK,QAAQ,cAAA,EAAgB,GAAG,cAAA,EAAe,EAAG,CAAC,CAAA;AAAA,EACzE,CAAA;AAAA,EAEA,oBAAA,GAAuB;AACrB,IAAA,OAAO;AAAA,MACL,SAAS,MAAM,IAAA,CAAK,QAAQ,QAAA,CAAS,mBAAmB,KAAI,IAAK;AAAA,KACnE;AAAA,EACF,CAAA;AAAA,EAEA,WAAA,GAAc;AACZ,IAAA,OAAO;AAAA,MACL,cAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM;AAChB,QAAA,QAAA,CAAS,UAAU,WAAW,CAAA;AAC9B,QAAA,OAAO,QAAA,CAAS,QAAQ,aAAa,CAAA;AAAA,MACvC,CAAA;AAAA,MACF,gBAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM,QAAA,CAAS,UAAU,aAAa,CAAA;AAAA,MACpD,iBAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM;AAChB,QAAA,QAAA,CAAS,UAAU,WAAW,CAAA;AAC9B,QAAA,OAAO,QAAA,CAAS,WAAW,aAAa,CAAA;AAAA,MAC1C;AAAA,KACJ;AAAA,EACF,CAAA;AAAA,EACA,eAAA,GAAiC;AAC/B,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,aAAA;AAAA,QACN,OAAA,EAAS,mBAAA;AAAA,QACT,QAAA,EAAU,aAAA;AAAA,QACV,IAAA,EAAM,iBAAA;AAAA,QACN,KAAA,EAAO,aAAA;AAAA,QACP,QAAA,EAAU,OAAA;AAAA,QACV,KAAA,EAAO,QAAA;AAAA,QACP,QAAA,EAAU;AAAA;AACZ,KACF;AAAA,EACF;AACF,CAAC;;;ACpEM,IAAM,SAAA,GAAY,KAAK,MAAA,CAAyB;AAAA,EACrD,IAAA,EAAM,WAAA;AAAA;AAAA,EAGN,QAAA,EAAU,GAAA;AAAA,EAEV,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,gBAAgB;AAAC,KACnB;AAAA,EACF,CAAA;AAAA,EAEA,SAAA,GAAY;AACV,IAAA,OAAO;AAAA,MACL;AAAA,QACE,GAAA,EAAK,MAAA;AAAA,QACL,QAAA,EAAU,CAAC,OAAA,KAAY;AACrB,UAAA,IAAI,OAAO,OAAA,KAAY,QAAA,EAAU,OAAO,KAAA;AAIxC,UAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,YAAA,CAAa,OAAO,CAAA;AAC9C,UAAA,MAAM,iBACJ,OAAA,CAAQ,YAAA,CAAa,iBAAiB,CAAA,IACtC,OAAA,CAAQ,aAAa,eAAe,CAAA;AACtC,UAAA,IAAI,CAAC,SAAA,IAAa,CAAC,cAAA,EAAgB,OAAO,KAAA;AAC1C,UAAA,OAAO,EAAC;AAAA,QACV;AAAA,OACF;AAAA;AAAA,MAEA,EAAE,KAAK,MAAA;AAAO,KAChB;AAAA,EACF,CAAA;AAAA,EAEA,UAAA,CAAW,EAAE,cAAA,EAAe,EAAG;AAC7B,IAAA,OAAO,CAAC,MAAA,EAAQ,EAAE,GAAG,IAAA,CAAK,QAAQ,cAAA,EAAgB,GAAG,cAAA,EAAe,EAAG,CAAC,CAAA;AAAA,EAC1E,CAAA;AAAA,EAEA,WAAA,GAAc;AACZ,IAAA,OAAO;AAAA,MACL,YAAA,EACE,CAAC,UAAA,KACD,CAAC,EAAE,UAAS,KAAM,QAAA,CAAS,OAAA,CAAQ,WAAA,EAAa,UAAU,CAAA;AAAA,MAE5D,eAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM,QAAA,CAAS,UAAU,WAAW,CAAA;AAAA,MAElD,sBACE,MACA,CAAC,EAAE,KAAA,EAAO,EAAA,EAAI,UAAS,KAAM;AAC3B,QAAA,MAAM,EAAE,IAAA,EAAM,EAAA,EAAI,KAAA,KAAU,EAAA,CAAG,SAAA;AAC/B,QAAA,MAAM,WAAW,IAAA,CAAK,QAAA;AAEtB,QAAA,IAAI,CAAC,UAAU,OAAO,KAAA;AAMtB,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,MAAM,WAAA,GAAc,EAAA,CAAG,WAAA,IAAe,KAAA,CAAM,WAAA;AAC5C,UAAA,IAAI,WAAA,EAAa;AACf,YAAA,MAAM,kBAAkB,WAAA,CAAY,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,QAAQ,CAAA;AACjE,YAAA,IAAI,eAAA,EAAiB;AACnB,cAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,MAAA,CAAO,eAAA,CAAgB,KAAK,CAAA,CAAE,IAAA;AAAA,gBAC1D,CAAC,GAAA,KAAQ,GAAA,KAAQ,IAAA,IAAQ,GAAA,KAAQ;AAAA,eACnC;AACA,cAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,gBAAA,IAAI,QAAA,EAAU;AACZ,kBAAA,EAAA,CAAG,iBAAiB,QAAQ,CAAA;AAC5B,kBAAA,QAAA,CAAS,EAAE,CAAA;AAAA,gBACb;AACA,gBAAA,OAAO,IAAA;AAAA,cACT;AAAA,YACF;AAAA,UACF;AACA,UAAA,OAAO,KAAA;AAAA,QACT;AAGA,QAAA,IAAI,iBAAA,GAAoB,KAAA;AAExB,QAAA,EAAA,CAAG,GAAA,CAAI,YAAA,CAAa,IAAA,EAAM,EAAA,EAAI,CAAC,IAAA,KAAS;AACtC,UAAA,MAAM,aAAA,GAAgB,KAAK,KAAA,CAAM,IAAA;AAAA,YAC/B,CAAC,IAAA,KAAS,IAAA,CAAK,IAAA,CAAK,SAAS,IAAA,CAAK;AAAA,WACpC;AACA,UAAA,IAAI,aAAA,EAAe;AACjB,YAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,MAAA,CAAO,aAAA,CAAc,KAAK,CAAA,CAAE,IAAA;AAAA,cACxD,CAAC,GAAA,KAAQ,GAAA,KAAQ,IAAA,IAAQ,GAAA,KAAQ;AAAA,aACnC;AACA,YAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,cAAA,iBAAA,GAAoB,IAAA;AAAA,YACtB;AAAA,UACF;AAAA,QACF,CAAC,CAAA;AAGD,QAAA,IAAI,CAAC,mBAAmB,OAAO,KAAA;AAE/B,QAAA,IAAI,QAAA,EAAU;AAIZ,UAAA,EAAA,CAAG,IAAI,YAAA,CAAa,IAAA,EAAM,EAAA,EAAI,CAAC,MAAM,GAAA,KAAQ;AAC3C,YAAA,MAAM,OAAO,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,QAAQ,CAAA;AACrD,YAAA,IAAI,IAAA,EAAM;AACR,cAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,CAAE,IAAA;AAAA,gBAC9C,CAAA,CAAA,KAAK,CAAA,KAAM,IAAA,IAAQ,CAAA,KAAM;AAAA,eAC3B;AACA,cAAA,IAAI,CAAC,aAAA,EAAe;AAClB,gBAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,IAAI,CAAA;AACnC,gBAAA,MAAM,SAAS,IAAA,CAAK,GAAA,CAAI,GAAA,GAAM,IAAA,CAAK,UAAU,EAAE,CAAA;AAC/C,gBAAA,EAAA,CAAG,UAAA,CAAW,QAAA,EAAU,MAAA,EAAQ,QAAQ,CAAA;AAAA,cAC1C;AAAA,YACF;AAAA,UACF,CAAC,CAAA;AACD,UAAA,QAAA,CAAS,EAAE,CAAA;AAAA,QACb;AAEA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,KACJ;AAAA,EACF;AACF,CAAC;AChHD,IAAM,YAAA,GAAwB8C,sBAAA;AAAA,EAC5BC,sBAAA;AAAA,EACAC,4BAAA;AAAA,EACAC,uBAAA;AAAA,EACAN;AACF,CAAA;AAEO,IAAM,UAAA,GAAa,UAAU,MAAA,CAA0B;AAAA,EAC5D,IAAA,EAAM,YAAA;AAAA,EAEN,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,KAAA,EAAO;AAAA,KACT;AAAA,EACF,CAAA;AAAA,EAEA,qBAAA,GAAwB;AACtB,IAAA,MAAM,QAAA,GAAW,EAAE,GAAGO,mBAAA,EAAW;AAGjC,IAAA,IAAI,IAAA,CAAK,QAAQ,KAAA,EAAO;AACtB,MAAA,QAAA,CAAS,OAAO,CAAA,GAAI,YAAA;AAAA,IACtB;AAEA,IAAA,OAAO,CAAC/C,aAAAA,CAAO,QAAQ,CAAC,CAAA;AAAA,EAC1B;AACF,CAAC;ACzCM,IAAM,OAAA,GAAU,UAAU,MAAA,CAAuB;AAAA,EACtD,IAAA,EAAM,SAAA;AAAA,EAEN,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,GAAA;AAAA,MACP,aAAA,EAAe;AAAA,KACjB;AAAA,EACF,CAAA;AAAA,EAEA,WAAA,GAAc;AACZ,IAAA,OAAO;AAAA,MACL,IAAA,EACE,MACA,CAAC,EAAE,OAAO,QAAA,EAAS,KACjBgD,YAAA,CAAK,KAAA,EAAO,QAAQ,CAAA;AAAA,MAExB,IAAA,EACE,MACA,CAAC,EAAE,OAAO,QAAA,EAAS,KACjBC,YAAA,CAAK,KAAA,EAAO,QAAQ;AAAA,KAC1B;AAAA,EACF,CAAA;AAAA,EAEA,eAAA,GAAiC;AAC/B,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,MAAA;AAAA,QACN,OAAA,EAAS,MAAA;AAAA,QACT,IAAA,EAAM,uBAAA;AAAA,QACN,KAAA,EAAO,MAAA;AAAA,QACP,QAAA,EAAU,OAAA;AAAA,QACV,KAAA,EAAO,SAAA;AAAA,QACP,QAAA,EAAU;AAAA,OACZ;AAAA,MACA;AAAA,QACE,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,MAAA;AAAA,QACN,OAAA,EAAS,MAAA;AAAA,QACT,IAAA,EAAM,gBAAA;AAAA,QACN,KAAA,EAAO,MAAA;AAAA,QACP,QAAA,EAAU,aAAA;AAAA,QACV,KAAA,EAAO,SAAA;AAAA,QACP,QAAA,EAAU;AAAA;AACZ,KACF;AAAA,EACF,CAAA;AAAA,EAEA,oBAAA,GAAuB;AACrB,IAAA,OAAO;AAAA,MACL,SAAS,MAAM,IAAA,CAAK,MAAA,EAAQ,QAAA,CAAS,MAAK,IAAK,KAAA;AAAA,MAC/C,eAAe,MAAM,IAAA,CAAK,MAAA,EAAQ,QAAA,CAAS,MAAK,IAAK,KAAA;AAAA,MACrD,SAAS,MAAM,IAAA,CAAK,MAAA,EAAQ,QAAA,CAAS,MAAK,IAAK;AAAA,KACjD;AAAA,EACF,CAAA;AAAA,EAEA,qBAAA,GAAwB;AACtB,IAAA,OAAO;AAAA,MACLC,eAAA,CAAQ;AAAA,QACN,KAAA,EAAO,KAAK,OAAA,CAAQ,KAAA;AAAA,QACpB,aAAA,EAAe,KAAK,OAAA,CAAQ;AAAA,OAC7B;AAAA,KACH;AAAA,EACF;AACF,CAAC;ACpEM,IAAM,UAAA,GAAa,UAAU,MAAA,CAA0B;AAAA,EAC5D,IAAA,EAAM,YAAA;AAAA,EAEN,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,cAAA;AAAA,MACP,KAAA,EAAO;AAAA,KACT;AAAA,EACF,CAAA;AAAA,EAEA,qBAAA,GAAwB;AACtB,IAAA,OAAO;AAAA,MACLC,qBAAA,CAAW;AAAA,QACT,KAAA,EAAO,KAAK,OAAA,CAAQ,KAAA;AAAA,QACpB,KAAA,EAAO,KAAK,OAAA,CAAQ,KAAA;AAAA,QACpB,GAAI,IAAA,CAAK,OAAA,CAAQ,KAAA,GAAQ,EAAE,OAAO,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAM,GAAI;AAAC,OAC3D;AAAA,KACH;AAAA,EACF;AACF,CAAC;ACvCM,IAAM,SAAA,GAAY,UAAU,MAAA,CAAO;AAAA,EACxC,IAAA,EAAM,WAAA;AAAA,EAEN,qBAAA,GAAwB;AACtB,IAAA,OAAO,CAACC,qBAAW,CAAA;AAAA,EACrB;AACF,CAAC;ACWD,IAAM,eAAA,GAAkB,IAAId,eAAAA,CAAU,cAAc,CAAA;AAE7C,IAAM,YAAA,GAAe,UAAU,MAAA,CAA4B;AAAA,EAChE,IAAA,EAAM,cAAA;AAAA,EAEN,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,WAAA;AAAA,MACN,QAAA,EAAU,CAAC,WAAW;AAAA,KACxB;AAAA,EACF,CAAA;AAAA,EAEA,qBAAA,GAAkC;AAChC,IAAA,MAAM,EAAE,IAAA,EAAM,QAAA,EAAU,QAAA,KAAa,IAAA,CAAK,OAAA;AAC1C,IAAA,MAAM,+BAAe,IAAI,GAAA,CAAI,CAAC,GAAG,QAAA,EAAU,QAAQ,CAAC,CAAA;AACpD,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI,YAAA;AAEJ,IAAA,OAAO;AAAA,MACL,IAAIxC,YAAAA,CAAO;AAAA,QACT,GAAA,EAAK,eAAA;AAAA,QACL,iBAAA,CAAkB,CAAA,EAAG,EAAA,EAAI,KAAA,EAAO;AAC9B,UAAA,IAAI,CAAC,eAAA,CAAgB,QAAA,CAAS,KAAK,CAAA,EAAG;AACtC,UAAA,OAAO,KAAA,CAAM,GAAG,MAAA,CAAO,KAAA,CAAM,IAAI,OAAA,CAAQ,IAAA,EAAM,IAAA,CAAK,MAAA,EAAQ,CAAA;AAAA,QAC9D,CAAA;AAAA,QACA,KAAA,EAAO;AAAA,UACL,IAAA,CAAK,CAAA,EAAG,EAAE,GAAA,EAAK,QAAO,EAAG;AACvB,YAAA,MAAM,QAAA,GAAW,MAAA,CAAO,KAAA,CAAM,QAAQ,CAAA;AACtC,YAAA,IAAI,CAAC,QAAA,EAAU;AACb,cAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iCAAA,EAAoC,QAAQ,CAAA,CAAA,CAAG,CAAA;AAAA,YACjE;AACA,YAAA,IAAA,GAAO,QAAA;AACP,YAAA,YAAA,GAAe,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA,CACtC,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,YAAA,CAAa,GAAA,CAAI,CAAA,CAAE,IAAI,CAAC,CAAA;AAC1C,YAAA,MAAM,QAAA,GAAW,IAAI,SAAA,EAAW,IAAA;AAChC,YAAA,OAAO,CAAC,CAAC,QAAA,IAAY,YAAA,CAAa,SAAS,QAAQ,CAAA;AAAA,UACrD,CAAA;AAAA,UACA,KAAA,CAAM,IAAI,KAAA,EAAO;AACf,YAAA,IAAI,CAAC,EAAA,CAAG,UAAA,EAAY,OAAO,KAAA;AAC3B,YAAA,MAAM,QAAA,GAAW,EAAA,CAAG,GAAA,CAAI,SAAA,EAAW,IAAA;AACnC,YAAA,OAAO,CAAC,CAAC,QAAA,IAAY,YAAA,CAAa,SAAS,QAAQ,CAAA;AAAA,UACrD;AAAA;AACF,OACD;AAAA,KACH;AAAA,EACF;AACF,CAAC;ACvBM,IAAM,oBAAA,GAAuB,IAAIwC,eAAAA,CAAU,aAAa;AAExD,IAAM,WAAA,GAAc,UAAU,MAAA,CAA2B;AAAA,EAC9D,IAAA,EAAM,aAAA;AAAA,EAEN,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,WAAA,EAAa,wBAAA;AAAA,MACb,oBAAA,EAAsB,IAAA;AAAA,MACtB,cAAA,EAAgB,UAAA;AAAA,MAChB,gBAAA,EAAkB,iBAAA;AAAA,MAClB,eAAA,EAAiB,IAAA;AAAA,MACjB,eAAA,EAAiB;AAAA,KACnB;AAAA,EACF,CAAA;AAAA,EAEA,qBAAA,GAAwB;AACtB,IAAA,OAAO;AAAA,MACL,IAAIxC,YAAAA,CAAO;AAAA,QACT,GAAA,EAAK,oBAAA;AAAA,QACL,KAAA,EAAO;AAAA,UACL,WAAA,EAAa,CAAC,EAAE,GAAA,EAAK,WAAU,KAAM;AACnC,YAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,YAAA,IAAI,CAAC,MAAA,EAAQ,IAAA,EAAM,OAAOuD,kBAAA,CAAc,KAAA;AACxC,YAAA,MAAM,UAAA,GAAa,OAAO,IAAA,CAAK,QAAA;AAE/B,YAAA,IAAI,CAAC,UAAA,IAAc,IAAA,CAAK,OAAA,CAAQ,oBAAA,EAAsB;AACpD,cAAA,OAAOA,kBAAA,CAAc,KAAA;AAAA,YACvB;AAGA,YAAA,MAAM,UAAA,GACJ,GAAA,CAAI,UAAA,KAAe,CAAA,IACnB,GAAA,CAAI,YAAY,WAAA,IAChB,GAAA,CAAI,UAAA,CAAW,OAAA,CAAQ,IAAA,KAAS,CAAA;AAElC,YAAA,MAAM,EAAE,eAAA,EAAiB,eAAA,EAAiB,cAAA,EAAgB,gBAAA,KAAqB,IAAA,CAAK,OAAA;AAEpF,YAAA,MAAMC,YAAAA,GAAc,CAAC,IAAA,KACnB,eAAA,GACI,KAAK,OAAA,CAAQ,IAAA,KAAS,IACtB,IAAA,CAAK,UAAA,KAAe,KACnB,IAAA,CAAK,UAAA,KAAe,KACnB,CAAC,CAAC,KAAK,UAAA,EAAY,MAAA,IACnB,CAAC,IAAA,CAAK,UAAA,CAAW,IAAA;AAEzB,YAAA,MAAM,qBAAqB,CAAC,IAAA,EAAc,QACxC,OAAO,IAAA,CAAK,QAAQ,WAAA,KAAgB,UAAA,GAChC,IAAA,CAAK,OAAA,CAAQ,YAAY,EAAE,IAAA,EAAM,KAAK,CAAA,GACtC,KAAK,OAAA,CAAQ,WAAA;AAEnB,YAAA,MAAM,cAAA,GAAiB,CAAC,IAAA,EAAc,GAAA,KACpCC,gBAAW,IAAA,CAAK,GAAA,EAAK,GAAA,GAAM,IAAA,CAAK,QAAA,EAAU;AAAA,cACxC,KAAA,EAAO,GAAG,cAAc,CAAA,EAAG,aAAa,CAAA,CAAA,EAAI,gBAAgB,KAAK,EAAE,CAAA,CAAA;AAAA,cACnE,kBAAA,EAAoB,kBAAA,CAAmB,IAAA,EAAM,GAAG;AAAA,aACjD,CAAA;AAGH,YAAA,IAAI,eAAA,EAAiB;AACnB,cAAA,MAAM,EAAE,SAAQ,GAAI,SAAA;AACpB,cAAA,IAAI,OAAA,CAAQ,KAAA,KAAU,CAAA,EAAG,OAAOF,kBAAA,CAAc,KAAA;AAC9C,cAAA,MAAM,OAAO,OAAA,CAAQ,MAAA;AACrB,cAAA,IAAI,CAAC,KAAK,WAAA,IAAe,CAACC,aAAY,IAAI,CAAA,SAAUD,kBAAA,CAAc,KAAA;AAClE,cAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA;AACxC,cAAA,OAAOA,kBAAA,CAAc,OAAO,GAAA,EAAK,CAAC,eAAe,IAAA,EAAM,GAAG,CAAC,CAAC,CAAA;AAAA,YAC9D;AAGA,YAAA,MAAM,cAA4B,EAAC;AACnC,YAAA,GAAA,CAAI,WAAA,CAAY,CAAC,IAAA,EAAM,GAAA,KAAQ;AAC7B,cAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACvB,cAAA,IAAI,CAACC,YAAAA,CAAY,IAAI,CAAA,EAAG;AACxB,cAAA,WAAA,CAAY,IAAA,CAAK,cAAA,CAAe,IAAA,EAAM,GAAG,CAAC,CAAA;AAAA,YAC5C,CAAC,CAAA;AAED,YAAA,OAAOD,kBAAA,CAAc,MAAA,CAAO,GAAA,EAAK,WAAW,CAAA;AAAA,UAC9C;AAAA;AACF,OACD;AAAA,KACH;AAAA,EACF;AACF,CAAC;ACrGD,IAAMnB,mCAAkB,IAAI,GAAA,CAAI,CAAC,UAAA,EAAY,UAAU,CAAC,CAAA;AACxD,IAAMsB,sCAAqB,IAAI,GAAA,CAAI,CAAC,YAAA,EAAc,aAAA,EAAe,UAAU,CAAC,CAAA;AAQ5E,SAAS,uBAAuB,KAAA,EAA6B;AAC3D,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,KAAA,CAAM,SAAA;AACxB,EAAA,KAAA,IAAS,CAAA,GAAI,KAAA,CAAM,KAAA,EAAO,CAAA,GAAI,GAAG,CAAA,EAAA,EAAK;AACpC,IAAA,IAAItB,gBAAAA,CAAgB,IAAI,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,EAAG,OAAO,IAAA;AAAA,EAC3D;AACA,EAAA,OAAO,KAAA;AACT;AASO,SAAS,sBAAA,CACdtC,SACA,QAAA,EACS;AACT,EAAA,MAAM,EAAE,WAAU,GAAIA,OAAA;AAStB,EAAA,IAAI,UAAA;AACJ,EAAA,IAAI,SAAA;AACJ,EAAA,IAAI,UAAA;AACJ,EAAA,IAAI,QAAA;AAEJ,EAAA,IAAI,qBAAqB6D,mBAAA,EAAe;AACtC,IAAA,MAAM,OAAO,SAAA,CAAU,IAAA;AACvB,IAAA,MAAM,OAAO,SAAA,CAAU,KAAA;AAGvB,IAAA,IAAI,IAAA,CAAK,KAAA,KAAU,CAAA,EAAG,OAAO,KAAA;AAC7B,IAAA,IAAI,sBAAA,CAAuB7D,OAAK,CAAA,EAAG,OAAO,KAAA;AAC1C,IAAA,UAAA,GAAa,IAAA,CAAK,MAAM,CAAC,CAAA;AACzB,IAAA,SAAA,GAAY,IAAA;AACZ,IAAA,UAAA,GAAa,SAAA,CAAU,IAAA;AACvB,IAAA,QAAA,GAAW,SAAA,CAAU,EAAA;AAAA,EACvB,CAAA,MAAO;AACL,IAAA,IAAI,CAAC,SAAA,CAAU,KAAA,EAAO,OAAO,KAAA;AAC7B,IAAA,IAAI,sBAAA,CAAuBA,OAAK,CAAA,EAAG,OAAO,KAAA;AAC1C,IAAA,MAAM,EAAE,OAAM,GAAI,SAAA;AAClB,IAAA,IAAI,KAAA,CAAM,KAAA,KAAU,CAAA,EAAG,OAAO,KAAA;AAC9B,IAAA,UAAA,GAAa,KAAA,CAAM,MAAM,CAAC,CAAA;AAC1B,IAAA,SAAA,GAAY,KAAA,CAAM,KAAK,CAAC,CAAA;AACxB,IAAA,UAAA,GAAa,KAAA,CAAM,OAAO,CAAC,CAAA;AAC3B,IAAA,QAAA,GAAW,KAAA,CAAM,MAAM,CAAC,CAAA;AAAA,EAC1B;AAEA,EAAA,IAAI,UAAA,KAAe,GAAG,OAAO,KAAA;AAE7B,EAAA,MAAM,WAAA,GAAcA,OAAA,CAAM,GAAA,CAAI,KAAA,CAAM,aAAa,CAAC,CAAA;AAClD,EAAA,IAAI,CAAC4D,mBAAAA,CAAmB,GAAA,CAAI,YAAY,IAAA,CAAK,IAAI,GAAG,OAAO,KAAA;AAK3D,EAAA,IAAI,UAAA,GAAa,CAAA;AACjB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,UAAA,GAAa,GAAG,CAAA,EAAA,EAAK;AACvC,IAAA,UAAA,IAAc5D,OAAA,CAAM,GAAA,CAAI,KAAA,CAAM,CAAC,CAAA,CAAE,QAAA;AAAA,EACnC;AAEA,EAAA,MAAM,KAAKA,OAAA,CAAM,EAAA;AACjB,EAAA,MAAM,SAAS,qBAAA,CAAsB;AAAA,IACnC,EAAA;AAAA,IACA,UAAA;AAAA,IACA,SAAA;AAAA,IACA,WAAA,EAAa,EAAE,IAAA,EAAM,UAAA,EAAY,IAAI,QAAA;AAAS,GAC/C,CAAA;AACD,EAAA,IAAI,CAAC,MAAA,CAAO,EAAA,IAAM,MAAA,CAAO,UAAA,KAAe,QAAW,OAAO,KAAA;AAC1D,EAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAGtB,EAAA,EAAA,CAAG,YAAA,CAAa8C,eAAAA,CAAU,IAAA,CAAK,EAAA,CAAG,GAAA,CAAI,QAAQ,MAAA,CAAO,UAAA,GAAa,CAAC,CAAC,CAAC,CAAA;AACrE,EAAA,QAAA,CAAS,EAAA,CAAG,gBAAgB,CAAA;AAC5B,EAAA,OAAO,IAAA;AACT;AAsBO,SAAS,wBAAA,CACd9C,SACA,QAAA,EACS;AACT,EAAA,MAAM,EAAE,WAAU,GAAIA,OAAA;AACtB,EAAA,IAAI,CAAC,SAAA,CAAU,KAAA,EAAO,OAAO,KAAA;AAE7B,EAAA,MAAM,EAAE,OAAM,GAAI,SAAA;AAGlB,EAAA,IAAI,aAAA,GAAgB,EAAA;AACpB,EAAA,KAAA,IAAS,CAAA,GAAI,KAAA,CAAM,KAAA,EAAO,CAAA,GAAI,GAAG,CAAA,EAAA,EAAK;AACpC,IAAA,IAAIsC,gBAAAA,CAAgB,IAAI,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,EAAG;AAChD,MAAA,aAAA,GAAgB,CAAA;AAChB,MAAA;AAAA,IACF;AAAA,EACF;AACA,EAAA,IAAI,aAAA,KAAkB,IAAI,OAAO,KAAA;AAOjC,EAAA,MAAM,aAAa,aAAA,GAAgB,CAAA;AACnC,EAAA,IAAI,KAAA,CAAM,KAAA,GAAQ,UAAA,EAAY,OAAO,KAAA;AAErC,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,IAAA,CAAK,aAAa,CAAA;AACzC,EAAA,MAAM,gBAAA,GAAmB,KAAA,CAAM,KAAA,CAAM,aAAa,CAAA;AAGlD,EAAA,IAAI,gBAAA,KAAqB,GAAG,OAAO,KAAA;AAEnC,EAAA,IAAI,gBAAA,KAAqB,QAAA,CAAS,UAAA,GAAa,CAAA,EAAG,OAAO,KAAA;AAIzD,EAAA,MAAM,eAAe,aAAA,GAAgB,CAAA;AACrC,EAAA,IAAI,YAAA,GAAe,GAAG,OAAO,KAAA;AAI7B,EAAA,MAAM,gBAAA,GAAmB,KAAA,CAAM,KAAA,CAAM,YAAY,CAAA;AACjD,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,IAAA,CAAK,YAAY,CAAA;AACvC,EAAA,IAAI,gBAAA,KAAqB,OAAA,CAAQ,UAAA,GAAa,CAAA,EAAG,OAAO,KAAA;AAOxD,EAAA,IAAI,YAAA,GAAe,CAAA,GAAI,CAAA,EAAG,OAAO,KAAA;AACjC,EAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,IAAA,CAAK,YAAA,GAAe,CAAC,CAAA;AACjD,EAAA,MAAM,oBAAA,GAAuB,KAAA,CAAM,KAAA,CAAM,YAAA,GAAe,CAAC,CAAA;AACzD,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,IAAA,CAAK,UAAU,CAAA;AACvC,EAAA,IACE,CAAC,aAAA,CAAc,cAAA;AAAA,IACb,oBAAA,GAAuB,CAAA;AAAA,IACvB,oBAAA,GAAuB,CAAA;AAAA,IACvB,SAAA,CAAU;AAAA,GACZ,EACA;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAEtB,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,MAAA,CAAO,UAAU,CAAA;AAC1C,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,KAAA,CAAM,UAAU,CAAA;AACvC,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,KAAA,CAAM,YAAY,CAAA;AAE3C,EAAA,MAAM,KAAKtC,OAAA,CAAM,EAAA;AAIjB,EAAA,MAAM,YAAY,QAAA,GAAW,UAAA;AAC7B,EAAA,EAAA,CAAG,MAAA,CAAO,YAAY,QAAQ,CAAA;AAC9B,EAAA,MAAM,WAAW,UAAA,GAAa,SAAA;AAC9B,EAAA,EAAA,CAAG,MAAA,CAAO,UAAU,SAAS,CAAA;AAE7B,EAAA,EAAA,CAAG,YAAA,CAAa8C,gBAAU,IAAA,CAAK,EAAA,CAAG,IAAI,OAAA,CAAQ,QAAA,GAAW,CAAC,CAAC,CAAC,CAAA;AAC5D,EAAA,QAAA,CAAS,EAAA,CAAG,gBAAgB,CAAA;AAC5B,EAAA,OAAO,IAAA;AACT;AAEO,IAAM,UAAA,GAAa,UAAU,MAAA,CAAO;AAAA,EACzC,IAAA,EAAM,YAAA;AAAA,EAEN,oBAAA,GAAuB;AACrB,IAAA,MAAM,EAAE,QAAO,GAAI,IAAA;AACnB,IAAA,OAAO;AAAA,MACL,KAAK,MAAM;AACT,QAAA,IAAI,CAAC,QAAQ,OAAO,KAAA;AACpB,QAAA,OAAO,sBAAA,CAAuB,MAAA,CAAO,KAAA,EAAO,MAAA,CAAO,KAAK,QAAQ,CAAA;AAAA,MAClE,CAAA;AAAA,MACA,aAAa,MAAM;AACjB,QAAA,IAAI,CAAC,QAAQ,OAAO,KAAA;AACpB,QAAA,OAAO,wBAAA,CAAyB,MAAA,CAAO,KAAA,EAAO,MAAA,CAAO,KAAK,QAAQ,CAAA;AAAA,MACpE;AAAA,KACF;AAAA,EACF;AACF,CAAC;AC/KM,IAAM,uBAAA,GAA0B,IAAIJ,eAAAA,CAAU,gBAAgB;AAE9D,IAAM,cAAA,GAAiB,UAAU,MAAA,CAGtC;AAAA,EACA,IAAA,EAAM,gBAAA;AAAA,EAEN,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,IAAA;AAAA,MACP,SAAA,EAAW,IAAA;AAAA,MACX,IAAA,EAAM;AAAA,KACR;AAAA,EACF,CAAA;AAAA,EAEA,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,YAAY,MAAM,CAAA;AAAA,MAClB,OAAO,MAAM,CAAA;AAAA,MACb,YAAY,MAAM,CAAA;AAAA,MAClB,WAAW,MAAM,QAAA;AAAA,MACjB,gBAAgB,MAAM,CAAA;AAAA,MACtB,eAAe,MAAM,QAAA;AAAA,MACrB,iBAAiB,MAAM;AAAA,KACzB;AAAA,EACF,CAAA;AAAA,EAEA,QAAA,GAAW;AACT,IAAA,MAAM,gBAAgB,MAAc;AAClC,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,KAAA,CAAM,GAAA;AACpC,MAAA,IAAI,CAAC,KAAK,OAAO,CAAA;AAEjB,MAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,IAAA,KAAS,UAAA,EAAY;AACpC,QAAA,OAAO,GAAA,CAAI,QAAA;AAAA,MACb;AAEA,MAAA,OAAO,IAAI,WAAA,CAAY,MAAA;AAAA,IACzB,CAAA;AAEA,IAAA,MAAM,WAAW,MAAc;AAC7B,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,KAAA,CAAM,GAAA;AACpC,MAAA,IAAI,CAAC,KAAK,OAAO,CAAA;AAEjB,MAAA,MAAM,OAAO,GAAA,CAAI,WAAA;AACjB,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA,CAAE,OAAO,CAAC,IAAA,KAAS,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA;AAChE,MAAA,OAAO,KAAA,CAAM,MAAA;AAAA,IACf,CAAA;AAEA,IAAA,IAAA,CAAK,QAAQ,UAAA,GAAa,aAAA;AAC1B,IAAA,IAAA,CAAK,QAAQ,KAAA,GAAQ,QAAA;AAErB,IAAA,IAAA,CAAK,OAAA,CAAQ,aAAa,MAAM;AAC9B,MAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,KAAA,KAAU,IAAA,EAAM,OAAO,CAAA;AACxC,MAAA,MAAM,QAAQ,aAAA,EAAc;AAC5B,MAAA,OAAO,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,IAAA,CAAK,KAAA,CAAO,QAAQ,IAAA,CAAK,OAAA,CAAQ,KAAA,GAAS,GAAG,CAAC,CAAA;AAAA,IACrE,CAAA;AAEA,IAAA,IAAA,CAAK,OAAA,CAAQ,YAAY,MAAM;AAC7B,MAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,KAAA,KAAU,IAAA,EAAM,OAAO,QAAA;AACxC,MAAA,OAAO,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,OAAA,CAAQ,KAAA,GAAQ,eAAe,CAAA;AAAA,IACzD,CAAA;AAEA,IAAA,IAAA,CAAK,OAAA,CAAQ,iBAAiB,MAAM;AAClC,MAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,SAAA,KAAc,IAAA,EAAM,OAAO,CAAA;AAC5C,MAAA,MAAM,QAAQ,QAAA,EAAS;AACvB,MAAA,OAAO,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,IAAA,CAAK,KAAA,CAAO,QAAQ,IAAA,CAAK,OAAA,CAAQ,SAAA,GAAa,GAAG,CAAC,CAAA;AAAA,IACzE,CAAA;AAEA,IAAA,IAAA,CAAK,OAAA,CAAQ,gBAAgB,MAAM;AACjC,MAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,SAAA,KAAc,IAAA,EAAM,OAAO,QAAA;AAC5C,MAAA,OAAO,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,OAAA,CAAQ,SAAA,GAAY,UAAU,CAAA;AAAA,IACxD,CAAA;AAEA,IAAA,IAAA,CAAK,OAAA,CAAQ,kBAAkB,MAAM;AACnC,MAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,KAAA,KAAU,IAAA,EAAM;AAC/B,QAAA,IAAI,aAAA,EAAc,GAAI,IAAA,CAAK,OAAA,CAAQ,OAAO,OAAO,IAAA;AAAA,MACnD;AACA,MAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,SAAA,KAAc,IAAA,EAAM;AACnC,QAAA,IAAI,QAAA,EAAS,GAAI,IAAA,CAAK,OAAA,CAAQ,WAAW,OAAO,IAAA;AAAA,MAClD;AACA,MAAA,OAAO,KAAA;AAAA,IACT,CAAA;AAAA,EACF,CAAA;AAAA,EAEA,qBAAA,GAAwB;AACtB,IAAA,MAAM,EAAE,KAAA,EAAO,SAAA,EAAW,IAAA,KAAS,IAAA,CAAK,OAAA;AAGxC,IAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,SAAA,KAAc,IAAA,SAAa,EAAC;AAElD,IAAA,OAAO;AAAA,MACL,IAAIxC,YAAAA,CAAO;AAAA,QACT,GAAA,EAAK,uBAAA;AAAA,QACL,iBAAA,EAAmB,CAAC,WAAA,KAAgB;AAElC,UAAA,IAAI,CAAC,WAAA,CAAY,UAAA,EAAY,OAAO,IAAA;AAEpC,UAAA,MAAM,SAAS,WAAA,CAAY,GAAA;AAG3B,UAAA,IAAI,UAAU,IAAA,EAAM;AAClB,YAAA,MAAM,QAAQ,IAAA,KAAS,UAAA,GACnB,MAAA,CAAO,QAAA,GACP,OAAO,WAAA,CAAY,MAAA;AACvB,YAAA,IAAI,KAAA,GAAQ,OAAO,OAAO,KAAA;AAAA,UAC5B;AAGA,UAAA,IAAI,cAAc,IAAA,EAAM;AACtB,YAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,WAAA,CAAY,KAAA,CAAM,KAAK,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,GAAS,CAAC,CAAA;AACxE,YAAA,IAAI,KAAA,CAAM,SAAS,SAAA,EAAW;AAC5B,cAAA,OAAO,KAAA;AAAA,YACT;AAAA,UACF;AAEA,UAAA,OAAO,IAAA;AAAA,QACT;AAAA,OACD;AAAA,KACH;AAAA,EACF;AACF,CAAC;ACtGM,IAAM,UAAA,GAAa,UAAU,MAAA,CAA0B;AAAA,EAC5D,IAAA,EAAM,YAAA;AAAA,EAEN,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,IAAA;AAAA,MACR,QAAA,EAAU,IAAA;AAAA,MACV,MAAA,EAAQ,IAAA;AAAA,MACR,SAAA,EAAW,IAAA;AAAA,MACX,OAAA,EAAS,IAAA;AAAA,MACT,IAAA,EAAM,IAAA;AAAA,MACN,UAAA,EAAY,IAAA;AAAA,MACZ,WAAA,EAAa,IAAA;AAAA,MACb,eAAA,EAAiB,QAAA;AAAA;AAAA,MACjB,gBAAA,EAAkB,QAAA;AAAA;AAAA,MAClB,eAAA,EAAiB,QAAA;AAAA;AAAA,MACjB,gBAAA,EAAkB;AAAA;AAAA,KACpB;AAAA,EACF,CAAA;AAAA,EAEA,aAAA,GAAgB;AACd,IAAA,MAAM,QAAqB,EAAC;AAE5B,IAAA,IAAI,IAAA,CAAK,QAAQ,MAAA,EAAQ;AACvB,MAAA,KAAA,CAAM,IAAA,CAAK,cAAc,EAAE,IAAA,EAAM,OAAO,OAAA,EAAS,QAAA,EAAU,CAAC,CAAA;AAAA,IAC9D;AAEA,IAAA,IAAI,IAAA,CAAK,QAAQ,QAAA,EAAU;AACzB,MAAA,KAAA,CAAM,IAAA,CAAK,cAAc,EAAE,IAAA,EAAM,WAAW,OAAA,EAAS,QAAA,EAAU,CAAC,CAAA;AAAA,IAClE;AAEA,IAAA,IAAI,IAAA,CAAK,QAAQ,MAAA,EAAQ;AACvB,MAAA,KAAA,CAAM,IAAA,CAAK,cAAc,EAAE,IAAA,EAAM,OAAO,OAAA,EAAS,QAAA,EAAU,CAAC,CAAA;AAC5D,MAAA,KAAA,CAAM,IAAA,CAAK,cAAc,EAAE,IAAA,EAAM,OAAO,OAAA,EAAS,QAAA,EAAU,CAAC,CAAA;AAC5D,MAAA,KAAA,CAAM,IAAA,CAAK,cAAc,EAAE,IAAA,EAAM,OAAO,OAAA,EAAS,QAAA,EAAU,CAAC,CAAA;AAAA,IAC9D;AAEA,IAAA,IAAI,IAAA,CAAK,QAAQ,SAAA,EAAW;AAC1B,MAAA,KAAA,CAAM,IAAA,CAAK,cAAc,EAAE,IAAA,EAAM,SAAS,OAAA,EAAS,MAAA,EAAU,CAAC,CAAA;AAC9D,MAAA,KAAA,CAAM,IAAA,CAAK,cAAc,EAAE,IAAA,EAAM,SAAS,OAAA,EAAS,MAAA,EAAU,CAAC,CAAA;AAC9D,MAAA,KAAA,CAAM,IAAA,CAAK,cAAc,EAAE,IAAA,EAAM,SAAS,OAAA,EAAS,MAAA,EAAU,CAAC,CAAA;AAC9D,MAAA,KAAA,CAAM,IAAA,CAAK,cAAc,EAAE,IAAA,EAAM,SAAS,OAAA,EAAS,QAAA,EAAU,CAAC,CAAA;AAC9D,MAAA,KAAA,CAAM,IAAA,CAAK,cAAc,EAAE,IAAA,EAAM,SAAS,OAAA,EAAS,QAAA,EAAU,CAAC,CAAA;AAAA,IAChE;AAEA,IAAA,IAAI,IAAA,CAAK,QAAQ,OAAA,EAAS;AACxB,MAAA,KAAA,CAAM,IAAA,CAAK,cAAc,EAAE,IAAA,EAAM,WAAW,OAAA,EAAS,MAAA,EAAU,CAAC,CAAA;AAChE,MAAA,KAAA,CAAM,IAAA,CAAK,cAAc,EAAE,IAAA,EAAM,WAAW,OAAA,EAAS,MAAA,EAAU,CAAC,CAAA;AAChE,MAAA,KAAA,CAAM,IAAA,CAAK,cAAc,EAAE,IAAA,EAAM,YAAY,OAAA,EAAS,QAAA,EAAU,CAAC,CAAA;AACjE,MAAA,KAAA,CAAM,IAAA,CAAK,cAAc,EAAE,IAAA,EAAM,YAAY,OAAA,EAAS,QAAA,EAAU,CAAC,CAAA;AAAA,IACnE;AAEA,IAAA,IAAI,IAAA,CAAK,QAAQ,IAAA,EAAM;AACrB,MAAA,KAAA,CAAM,IAAA,CAAK,cAAc,EAAE,IAAA,EAAM,UAAU,OAAA,EAAS,MAAA,EAAU,CAAC,CAAA;AAC/D,MAAA,KAAA,CAAM,IAAA,CAAK,cAAc,EAAE,IAAA,EAAM,OAAO,OAAA,EAAS,QAAA,EAAU,CAAC,CAAA;AAC5D,MAAA,KAAA,CAAM,IAAA,CAAK,cAAc,EAAE,IAAA,EAAM,OAAO,OAAA,EAAS,QAAA,EAAU,CAAC,CAAA;AAC5D,MAAA,KAAA,CAAM,IAAA,CAAK,cAAc,EAAE,IAAA,EAAM,OAAO,OAAA,EAAS,QAAA,EAAU,CAAC,CAAA;AAAA,IAC9D;AAEA,IAAA,IAAI,IAAA,CAAK,QAAQ,UAAA,EAAY;AAC3B,MAAA,KAAA,CAAM,IAAA,CAAK,cAAc,EAAE,IAAA,EAAM,OAAO,OAAA,EAAS,MAAA,EAAU,CAAC,CAAA;AAC5D,MAAA,KAAA,CAAM,IAAA,CAAK,cAAc,EAAE,IAAA,EAAM,OAAO,OAAA,EAAS,MAAA,EAAU,CAAC,CAAA;AAAA,IAC9D;AAGA,IAAA,IAAI,IAAA,CAAK,QAAQ,WAAA,EAAa;AAC5B,MAAA,MAAM,EAAE,eAAA,EAAiB,gBAAA,EAAkB,eAAA,EAAiB,gBAAA,KAAqB,IAAA,CAAK,OAAA;AAGtF,MAAA,KAAA,CAAM,IAAA;AAAA,QACJ,IAAIQ,oBAAAA,CAAU,YAAA,EAAc,CAAC,KAAA,EAAO,KAAA,EAAO,OAAO,GAAA,KAAQ;AACxD,UAAA,MAAM,IAAA,GAAO,KAAA,CAAM,CAAC,CAAA,IAAK,EAAA;AACzB,UAAA,OAAO,MAAM,EAAA,CAAG,WAAA;AAAA,YACd,KAAA;AAAA,YACA,GAAA;AAAA,YACA,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,eAAA,GAAkB,OAAO,gBAAgB;AAAA,WAC7D;AAAA,QACF,CAAC;AAAA,OACH;AAIA,MAAA,KAAA,CAAM,IAAA;AAAA,QACJ,IAAIA,oBAAAA,CAAU,yBAAA,EAA2B,CAAC,KAAA,EAAO,KAAA,EAAO,OAAO,GAAA,KAAQ;AACrE,UAAA,MAAM,IAAA,GAAO,KAAA,CAAM,CAAC,CAAA,IAAK,EAAA;AACzB,UAAA,MAAM,MAAA,GAAS,KAAA,CAAM,CAAC,CAAA,CAAE,OAAO,CAAC,CAAA;AAEhC,UAAA,MAAM,YAAY,MAAA,KAAW,GAAA;AAC7B,UAAA,OAAO,MAAM,EAAA,CAAG,WAAA;AAAA,YACd,KAAA;AAAA,YACA,GAAA;AAAA,YACA,MAAM,MAAA,CAAO,IAAA;AAAA,cACX,YACI,MAAA,GAAS,eAAA,GAAkB,IAAA,GAAO,gBAAA,GAClC,kBAAkB,IAAA,GAAO;AAAA;AAC/B,WACF;AAAA,QACF,CAAC;AAAA,OACH;AAAA,IACF;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AACF,CAAC;;;ACzJM,IAAM,SAAA,GAAY,UAAU,MAAA,CAAyB;AAAA,EAC1D,IAAA,EAAM,WAAA;AAAA,EAEN,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,CAAC,SAAA,EAAW,WAAW,CAAA;AAAA,MAC9B,UAAA,EAAY,CAAC,MAAA,EAAQ,QAAA,EAAU,SAAS,SAAS,CAAA;AAAA,MACjD,gBAAA,EAAkB;AAAA,KACpB;AAAA,EACF,CAAA;AAAA,EAEA,mBAAA,GAAsB;AACpB,IAAA,OAAO;AAAA,MACL;AAAA,QACE,KAAA,EAAO,KAAK,OAAA,CAAQ,KAAA;AAAA,QACpB,UAAA,EAAY;AAAA,UACV,SAAA,EAAW;AAAA,YACT,OAAA,EAAS,KAAK,OAAA,CAAQ,gBAAA;AAAA,YACtB,WAAW,CAAC,OAAA,KACV,QAAQ,KAAA,CAAM,SAAA,IAAa,KAAK,OAAA,CAAQ,gBAAA;AAAA,YAC1C,UAAA,EAAY,CAAC,UAAA,KAAwC;AACnD,cAAA,MAAM,SAAA,GAAY,WAAW,WAAW,CAAA;AACxC,cAAA,IAAI,SAAA,KAAc,IAAA,CAAK,OAAA,CAAQ,gBAAA,EAAkB;AAC/C,gBAAA,OAAO,IAAA;AAAA,cACT;AACA,cAAA,OAAO,EAAE,KAAA,EAAO,CAAA,YAAA,EAAe,SAAS,CAAA,CAAA,EAAG;AAAA,YAC7C;AAAA;AACF;AACF;AACF,KACF;AAAA,EACF,CAAA;AAAA,EAEA,WAAA,GAAc;AACZ,IAAA,OAAO;AAAA,MACL,cACE,CAAC,SAAA,KACD,CAAC,EAAE,UAAS,KAAM;AAChB,QAAA,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,QAAA,CAAS,SAAS,CAAA,EAAG;AAChD,UAAA,OAAO,KAAA;AAAA,QACT;AAEA,QAAA,OAAO,KAAK,OAAA,CAAQ,KAAA,CACjB,GAAA,CAAI,CAAC,SAAS,QAAA,CAAS,gBAAA,CAAiB,IAAA,EAAM,EAAE,WAAW,SAAA,EAAW,CAAC,CAAA,CACvE,KAAK,OAAO,CAAA;AAAA,MACjB,CAAA;AAAA,MAEF,cAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM;AAChB,QAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,KAAA,CACjB,GAAA,CAAI,CAAC,IAAA,KAAS,QAAA,CAAS,eAAA,CAAgB,IAAA,EAAM,WAAW,CAAC,CAAA,CACzD,KAAK,OAAO,CAAA;AAAA,MACjB;AAAA,KACJ;AAAA,EACF,CAAA;AAAA,EAEA,oBAAA,GAAuB;AACrB,IAAA,OAAO;AAAA,MACL,eAAe,MACb,IAAA,CAAK,QAAQ,QAAA,CAAS,YAAA,CAAa,MAAM,CAAA,IAAK,KAAA;AAAA,MAChD,eAAe,MACb,IAAA,CAAK,QAAQ,QAAA,CAAS,YAAA,CAAa,QAAQ,CAAA,IAAK,KAAA;AAAA,MAClD,eAAe,MACb,IAAA,CAAK,QAAQ,QAAA,CAAS,YAAA,CAAa,OAAO,CAAA,IAAK,KAAA;AAAA,MACjD,eAAe,MACb,IAAA,CAAK,QAAQ,QAAA,CAAS,YAAA,CAAa,SAAS,CAAA,IAAK;AAAA,KACrD;AAAA,EACF,CAAA;AAAA,EAEA,eAAA,GAAiC;AAC/B,IAAA,MAAM,KAAA,GAAQ,KAAK,OAAA,CAAQ,KAAA;AAC3B,IAAA,MAAM,UAAA,GAAa,CAAC,SAAA,KAClB,KAAA,CAAM,IAAI,CAAC,CAAA,MAAO,EAAE,IAAA,EAAM,GAAG,UAAA,EAAY,EAAE,SAAA,EAAW,SAAA,IAAY,CAAE,CAAA;AAEtE,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,UAAA;AAAA,QACN,IAAA,EAAM,WAAA;AAAA,QACN,IAAA,EAAM,eAAA;AAAA,QACN,KAAA,EAAO,gBAAA;AAAA,QACP,KAAA,EAAO,WAAA;AAAA,QACP,QAAA,EAAU,GAAA;AAAA,QACV,WAAA,EAAa,IAAA;AAAA,QACb,KAAA,EAAO;AAAA,UACL;AAAA,YACE,IAAA,EAAM,QAAA;AAAA,YACN,IAAA,EAAM,WAAA;AAAA,YACN,OAAA,EAAS,cAAA;AAAA,YACT,WAAA,EAAa,CAAC,MAAM,CAAA;AAAA,YACpB,QAAA,EAAU,WAAW,MAAM,CAAA;AAAA,YAC3B,IAAA,EAAM,eAAA;AAAA,YACN,KAAA,EAAO,YAAA;AAAA,YACP,QAAA,EAAU;AAAA,WACZ;AAAA,UACA;AAAA,YACE,IAAA,EAAM,QAAA;AAAA,YACN,IAAA,EAAM,aAAA;AAAA,YACN,OAAA,EAAS,cAAA;AAAA,YACT,WAAA,EAAa,CAAC,QAAQ,CAAA;AAAA,YACtB,QAAA,EAAU,WAAW,QAAQ,CAAA;AAAA,YAC7B,IAAA,EAAM,iBAAA;AAAA,YACN,KAAA,EAAO,cAAA;AAAA,YACP,QAAA,EAAU;AAAA,WACZ;AAAA,UACA;AAAA,YACE,IAAA,EAAM,QAAA;AAAA,YACN,IAAA,EAAM,YAAA;AAAA,YACN,OAAA,EAAS,cAAA;AAAA,YACT,WAAA,EAAa,CAAC,OAAO,CAAA;AAAA,YACrB,QAAA,EAAU,WAAW,OAAO,CAAA;AAAA,YAC5B,IAAA,EAAM,gBAAA;AAAA,YACN,KAAA,EAAO,aAAA;AAAA,YACP,QAAA,EAAU;AAAA,WACZ;AAAA,UACA;AAAA,YACE,IAAA,EAAM,QAAA;AAAA,YACN,IAAA,EAAM,cAAA;AAAA,YACN,OAAA,EAAS,cAAA;AAAA,YACT,WAAA,EAAa,CAAC,SAAS,CAAA;AAAA,YACvB,QAAA,EAAU,WAAW,SAAS,CAAA;AAAA,YAC9B,IAAA,EAAM,kBAAA;AAAA,YACN,KAAA,EAAO,SAAA;AAAA,YACP,QAAA,EAAU;AAAA;AACZ;AACF;AACF,KACF;AAAA,EACF;AACF,CAAC;AC3IM,IAAM,cAAA,GAAiB,IAAIgC,eAAAA,CAAU,OAAO;AAE5C,IAAM,KAAA,GAAQ,UAAU,MAAA,CAAqB;AAAA,EAClD,IAAA,EAAM,OAAA;AAAA,EAEN,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,SAAA,EAAW,WAAA;AAAA,MACX,IAAA,EAAM;AAAA,KACR;AAAA,EACF,CAAA;AAAA,EAEA,qBAAA,GAAwB;AACtB,IAAA,OAAO;AAAA,MACL,IAAIxC,YAAAA,CAAO;AAAA,QACT,GAAA,EAAK,cAAA;AAAA,QACL,KAAA,EAAO;AAAA,UACL,WAAA,EAAa,CAAC,EAAE,GAAA,EAAK,WAAU,KAAM;AACnC,YAAA,MAAM,EAAE,IAAA,EAAM,EAAA,EAAG,GAAI,SAAA;AACrB,YAAA,MAAM,cAA4B,EAAC;AACnC,YAAA,MAAM,eAAoD,EAAC;AAG3D,YAAA,GAAA,CAAI,YAAA,CAAa,IAAA,EAAM,EAAA,EAAI,CAAC,MAAM,GAAA,KAAQ;AACxC,cAAA,IAAI,KAAK,MAAA,EAAQ;AAGjB,cAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,QAAA;AAC3B,cAAA,IAAI,GAAA,IAAO,EAAA,IAAM,OAAA,IAAW,IAAA,EAAM;AAChC,gBAAA,YAAA,CAAa,KAAK,EAAE,GAAA,EAAK,QAAA,EAAU,IAAA,CAAK,UAAU,CAAA;AAAA,cACpD;AAAA,YACF,CAAC,CAAA;AAED,YAAA,IAAI,YAAA,CAAa,WAAW,CAAA,EAAG;AAC7B,cAAA,OAAOuD,kBAAAA,CAAc,KAAA;AAAA,YACvB;AAGA,YAAA,IAAI,eAAA,GAAkB,YAAA;AAEtB,YAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,IAAA,KAAS,SAAA,EAAW;AAEnC,cAAA,MAAM,IAAA,GAAO,YAAA,CAAa,YAAA,CAAa,MAAA,GAAS,CAAC,CAAA;AACjD,cAAA,eAAA,GAAkB,IAAA,GAAO,CAAC,IAAI,CAAA,GAAI,EAAC;AAAA,YACrC,CAAA,MAAA,IAAW,IAAA,CAAK,OAAA,CAAQ,IAAA,KAAS,YAAA,EAAc;AAE7C,cAAA,MAAM,KAAA,GAAQ,aAAa,CAAC,CAAA;AAC5B,cAAA,eAAA,GAAkB,KAAA,GAAQ,CAAC,KAAK,CAAA,GAAI,EAAC;AAAA,YACvC;AAGA,YAAA,KAAA,MAAW,EAAE,GAAA,EAAK,QAAA,EAAS,IAAK,eAAA,EAAiB;AAC/C,cAAA,WAAA,CAAY,IAAA;AAAA,gBACVE,eAAAA,CAAW,IAAA,CAAK,GAAA,EAAK,GAAA,GAAM,QAAA,EAAU;AAAA,kBACnC,KAAA,EAAO,KAAK,OAAA,CAAQ;AAAA,iBACrB;AAAA,eACH;AAAA,YACF;AAEA,YAAA,OAAOF,kBAAAA,CAAc,MAAA,CAAO,GAAA,EAAK,WAAW,CAAA;AAAA,UAC9C;AAAA;AACF,OACD;AAAA,KACH;AAAA,EACF;AACF,CAAC;;;ACrCM,IAAM,UAAA,GAAa,UAAU,MAAA,CAA0B;AAAA,EAC5D,IAAA,EAAM,YAAA;AAAA,EAEN,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,CAAC,WAAA,EAAa,SAAS,CAAA;AAAA,MAC9B,aAAa,CAAC,GAAA,EAAK,MAAA,EAAQ,MAAA,EAAQ,OAAO,GAAG,CAAA;AAAA,MAC7C,iBAAA,EAAmB;AAAA,KACrB;AAAA,EACF,CAAA;AAAA,EAEA,mBAAA,GAAsB;AACpB,IAAA,OAAO;AAAA,MACL;AAAA,QACE,KAAA,EAAO,KAAK,OAAA,CAAQ,KAAA;AAAA,QACpB,UAAA,EAAY;AAAA,UACV,UAAA,EAAY;AAAA,YACV,OAAA,EAAS,KAAK,OAAA,CAAQ,iBAAA;AAAA,YACtB,SAAA,EAAW,CAAC,OAAA,KAAyB;AACnC,cAAA,OAAO,OAAA,CAAQ,KAAA,CAAM,UAAA,IAAc,IAAA,CAAK,OAAA,CAAQ,iBAAA;AAAA,YAClD,CAAA;AAAA,YACA,UAAA,EAAY,CAAC,UAAA,KAAwC;AACnD,cAAA,MAAM,UAAA,GAAa,WAAW,YAAY,CAAA;AAG1C,cAAA,IAAI,CAAC,UAAA,IAAc,UAAA,KAAe,IAAA,CAAK,QAAQ,iBAAA,EAAmB;AAChE,gBAAA,OAAO,IAAA;AAAA,cACT;AAGA,cAAA,IACE,IAAA,CAAK,OAAA,CAAQ,WAAA,CAAY,MAAA,GAAS,CAAA,IAClC,CAAC,IAAA,CAAK,OAAA,CAAQ,WAAA,CAAY,QAAA,CAAS,UAAU,CAAA,EAC7C;AACA,gBAAA,OAAO,IAAA;AAAA,cACT;AAEA,cAAA,OAAO,EAAE,KAAA,EAAO,CAAA,aAAA,EAAgB,UAAU,CAAA,CAAA,EAAG;AAAA,YAC/C;AAAA;AACF;AACF;AACF,KACF;AAAA,EACF,CAAA;AAAA,EAEA,WAAA,GAAc;AACZ,IAAA,OAAO;AAAA,MACL,eACE,CAAC,UAAA,KACD,CAAC,EAAE,UAAS,KAAM;AAEhB,QAAA,IACE,IAAA,CAAK,OAAA,CAAQ,WAAA,CAAY,MAAA,GAAS,CAAA,IAClC,CAAC,IAAA,CAAK,OAAA,CAAQ,WAAA,CAAY,QAAA,CAAS,UAAU,CAAA,EAC7C;AACA,UAAA,OAAO,KAAA;AAAA,QACT;AAEA,QAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,KAAA,CACjB,GAAA,CAAI,CAAC,IAAA,KAAS,QAAA,CAAS,gBAAA,CAAiB,IAAA,EAAM,EAAE,UAAA,EAAY,CAAC,CAAA,CAC7D,KAAK,OAAO,CAAA;AAAA,MACjB,CAAA;AAAA,MAEF,eAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM;AAChB,QAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,KAAA,CACjB,GAAA,CAAI,CAAC,IAAA,KAAS,QAAA,CAAS,eAAA,CAAgB,IAAA,EAAM,YAAY,CAAC,CAAA,CAC1D,KAAK,OAAO,CAAA;AAAA,MACjB;AAAA,KACJ;AAAA,EACF,CAAA;AAAA,EAEA,eAAA,GAAiC;AAC/B,IAAA,IAAI,KAAK,OAAA,CAAQ,WAAA,CAAY,MAAA,KAAW,CAAA,SAAU,EAAC;AAEnD,IAAA,MAAM,KAAA,GAAQ,KAAK,OAAA,CAAQ,KAAA;AAC3B,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,UAAA;AAAA,QACN,IAAA,EAAM,YAAA;AAAA,QACN,IAAA,EAAM,aAAA;AAAA,QACN,KAAA,EAAO,aAAA;AAAA,QACP,KAAA,EAAO,WAAA;AAAA,QACP,QAAA,EAAU,EAAA;AAAA,QACV,WAAA,EAAa,MAAA;AAAA,QACb,YAAA,EAAc,IAAA;AAAA,QACd,KAAA,EAAO;AAAA,UACL,GAAG,IAAA,CAAK,OAAA,CAAQ,YAAY,GAAA,CAAI,CAAC,IAAI,CAAA,MAAO;AAAA,YAC1C,IAAA,EAAM,QAAA;AAAA,YACN,IAAA,EAAM,cAAc,EAAE,CAAA,CAAA;AAAA,YACtB,OAAA,EAAS,eAAA;AAAA,YACT,WAAA,EAAa,CAAC,EAAE,CAAA;AAAA,YAChB,QAAA,EAAU,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,IAAA,EAAM,CAAA,EAAG,UAAA,EAAY,EAAE,UAAA,EAAY,EAAA,IAAK,CAAE,CAAA;AAAA,YACxE,IAAA,EAAM,aAAA;AAAA,YACN,KAAA,EAAO,EAAA;AAAA,YACP,UAAU,GAAA,GAAM;AAAA,WAClB,CAAE,CAAA;AAAA,UACF;AAAA,YACE,IAAA,EAAM,QAAA;AAAA,YACN,IAAA,EAAM,iBAAA;AAAA,YACN,OAAA,EAAS,iBAAA;AAAA,YACT,IAAA,EAAM,aAAA;AAAA,YACN,KAAA,EAAO;AAAA;AACT;AACF;AACF,KACF;AAAA,EACF;AACF,CAAC;AC1JD,SAAS,YAAA,GAAuB;AAK9B,EAAA,IAAI,OAAO,eAAe,WAAA,EAAa;AACrC,IAAA,MAAM,IAAK,UAAA,CAA0D,MAAA;AACrE,IAAA,IAAI,KAAK,OAAO,CAAA,CAAE,eAAe,UAAA,EAAY,OAAO,EAAE,UAAA,EAAW;AAAA,EACnE;AACA,EAAA,OAAO,sCAAA,CAAuC,OAAA,CAAQ,OAAA,EAAS,CAAC,CAAA,KAAM;AACpE,IAAA,MAAM,CAAA,GAAK,IAAA,CAAK,MAAA,EAAO,GAAI,EAAA,GAAM,CAAA;AACjC,IAAA,MAAM,CAAA,GAAI,CAAA,KAAM,GAAA,GAAM,CAAA,GAAK,IAAI,CAAA,GAAO,CAAA;AACtC,IAAA,OAAO,CAAA,CAAE,SAAS,EAAE,CAAA;AAAA,EACtB,CAAC,CAAA;AACH;AAEO,IAAM,iBAAA,GAAoB,IAAIf,eAAAA,CAAU,UAAU;AA4BlD,IAAM,QAAA,GAAW,UAAU,MAAA,CAAwB;AAAA,EACxD,IAAA,EAAM,UAAA;AAAA,EAEN,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,KAAA,EAAO;AAAA,QACL,WAAA;AAAA,QACA,SAAA;AAAA,QACA,YAAA;AAAA,QACA,WAAA;AAAA,QACA,YAAA;AAAA,QACA,aAAA;AAAA,QACA,UAAA;AAAA,QACA,UAAA;AAAA,QACA,UAAA;AAAA,QACA,OAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,aAAA,EAAe,IAAA;AAAA,MACf,UAAA,EAAY,YAAA;AAAA,MACZ,gBAAA,EAAkB;AAAA,KACpB;AAAA,EACF,CAAA;AAAA,EAEA,mBAAA,GAAsB;AACpB,IAAA,OAAO;AAAA,MACL;AAAA,QACE,KAAA,EAAO,KAAK,OAAA,CAAQ,KAAA;AAAA,QACpB,UAAA,EAAY;AAAA,UACV,CAAC,IAAA,CAAK,OAAA,CAAQ,aAAa,GAAG;AAAA,YAC5B,OAAA,EAAS,IAAA;AAAA,YACT,WAAW,CAAC,OAAA,KACV,QAAQ,YAAA,CAAa,IAAA,CAAK,QAAQ,aAAa,CAAA;AAAA,YACjD,UAAA,EAAY,CAAC,UAAA,KAAwC;AACnD,cAAA,MAAM,EAAA,GAAK,UAAA,CAAW,IAAA,CAAK,OAAA,CAAQ,aAAa,CAAA;AAChD,cAAA,IAAI,CAAC,IAAI,OAAO,IAAA;AAChB,cAAA,OAAO,EAAE,CAAC,IAAA,CAAK,OAAA,CAAQ,aAAa,GAAG,EAAA,EAAG;AAAA,YAC5C;AAAA;AACF;AACF;AACF,KACF;AAAA,EACF,CAAA;AAAA,EAEA,qBAAA,GAAwB;AACtB,IAAA,MAAM,EAAE,KAAA,EAAO,aAAA,EAAe,UAAA,EAAY,gBAAA,KAAqB,IAAA,CAAK,OAAA;AACpE,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AAEpB,IAAA,MAAM,oBAAA,GAAuB,CAAC,KAAA,KAAwB;AACpD,MAAA,MAAM,WAAA,uBAAkB,GAAA,EAAY;AAGpC,MAAA,MAAA,EAAQ,KAAA,CAAM,GAAA,CAAI,WAAA,CAAY,CAAC,IAAA,KAAiB;AAC9C,QAAA,MAAM,EAAA,GAAK,IAAA,CAAK,KAAA,CAAM,aAAa,CAAA;AACnC,QAAA,IAAI,EAAA,EAAI,WAAA,CAAY,GAAA,CAAI,EAAE,CAAA;AAAA,MAC5B,CAAC,CAAA;AAGD,MAAA,MAAM,aAAA,GAAgB,CAAC,IAAA,KAAyB;AAC9C,QAAA,IAAI,CAAC,KAAA,CAAM,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,EAAG;AACnC,UAAA,OAAO,IAAA,CAAK,IAAA,CAAK,iBAAA,CAAkB,IAAA,CAAK,OAAO,CAAC,CAAA;AAAA,QAClD;AAEA,QAAA,MAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,aAAa,CAAA;AAC3C,QAAA,IAAI,UAAA,IAAc,WAAA,CAAY,GAAA,CAAI,UAAU,CAAA,EAAG;AAE7C,UAAA,OAAO,KAAK,IAAA,CAAK,MAAA;AAAA,YACf,EAAE,GAAG,IAAA,CAAK,KAAA,EAAO,CAAC,aAAa,GAAG,YAAW,EAAE;AAAA,YAC/C,iBAAA,CAAkB,KAAK,OAAO,CAAA;AAAA,YAC9B,IAAA,CAAK;AAAA,WACP;AAAA,QACF;AAGA,QAAA,IAAI,UAAA,EAAY,WAAA,CAAY,GAAA,CAAI,UAAU,CAAA;AAC1C,QAAA,OAAO,IAAA,CAAK,IAAA,CAAK,iBAAA,CAAkB,IAAA,CAAK,OAAO,CAAC,CAAA;AAAA,MAClD,CAAA;AAEA,MAAA,MAAM,iBAAA,GAAoB,CAAC,QAAA,KAAiC;AAC1D,QAAA,MAAM,QAAkB,EAAC;AACzB,QAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,IAAA,KAAS;AACzB,UAAA,KAAA,CAAM,IAAA,CAAK,aAAA,CAAc,IAAI,CAAC,CAAA;AAAA,QAChC,CAAC,CAAA;AACD,QAAA,OAAOxB,cAAAA,CAAS,KAAK,KAAK,CAAA;AAAA,MAC5B,CAAA;AAEA,MAAA,OAAO,IAAIC,WAAAA;AAAA,QACT,iBAAA,CAAkB,MAAM,OAAO,CAAA;AAAA,QAC/B,KAAA,CAAM,SAAA;AAAA,QACN,KAAA,CAAM;AAAA,OACR;AAAA,IACF,CAAA;AAiBA,IAAA,MAAM,gBAAA,GAAmB,CAAC,GAAA,EAAa,EAAA,KAA0B;AAC/D,MAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,MAAA,GAAA,CAAI,WAAA,CAAY,CAAC,IAAA,EAAM,GAAA,KAAQ;AAC7B,QAAA,IAAI,CAAC,KAAA,CAAM,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,EAAG;AAErC,QAAA,MAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,aAAa,CAAA;AAC3C,QAAA,IAAI,CAAC,UAAA,EAAY;AAIf,UAAA,IAAI,KAAK,UAAA,EAAW;AACpB,UAAA,OAAO,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,OAAQ,UAAA,EAAW;AACrC,UAAA,IAAA,CAAK,IAAI,EAAE,CAAA;AAMX,UAAA,EAAA,CAAG,cAAc,EAAA,CAAG,OAAA,CAAQ,GAAA,CAAI,GAAG,GAAG,MAAA,EAAW;AAAA,YAC/C,GAAG,IAAA,CAAK,KAAA;AAAA,YACR,CAAC,aAAa,GAAG;AAAA,WAClB,CAAA;AACD,UAAA;AAAA,QACF;AACA,QAAA,IAAI,IAAA,CAAK,GAAA,CAAI,UAAU,CAAA,EAAG;AAIxB,UAAA,IAAI,KAAK,UAAA,EAAW;AACpB,UAAA,OAAO,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,OAAQ,UAAA,EAAW;AACrC,UAAA,IAAA,CAAK,IAAI,EAAE,CAAA;AACX,UAAA,EAAA,CAAG,cAAc,EAAA,CAAG,OAAA,CAAQ,GAAA,CAAI,GAAG,GAAG,MAAA,EAAW;AAAA,YAC/C,GAAG,IAAA,CAAK,KAAA;AAAA,YACR,CAAC,aAAa,GAAG;AAAA,WAClB,CAAA;AACD,UAAA;AAAA,QACF;AACA,QAAA,IAAA,CAAK,IAAI,UAAU,CAAA;AAAA,MACrB,CAAC,CAAA;AAAA,IACH,CAAA;AAEA,IAAA,OAAO;AAAA,MACL,IAAIjB,YAAAA,CAAO;AAAA,QACT,GAAA,EAAK,iBAAA;AAAA;AAAA,QAGL,KAAK,UAAA,EAAY;AAIf,UAAA,MAAM,SAAA,GAAY,WAAW,MAAM;AACjC,YAAA,MAAM,EAAA,GAAK,WAAW,KAAA,CAAM,EAAA;AAC5B,YAAA,gBAAA,CAAiB,UAAA,CAAW,KAAA,CAAM,GAAA,EAAK,EAAE,CAAA;AACzC,YAAA,IAAI,GAAG,UAAA,EAAY;AACjB,cAAA,UAAA,CAAW,SAAS,EAAE,CAAA;AAAA,YACxB;AAAA,UACF,GAAG,CAAC,CAAA;AACJ,UAAA,OAAO;AAAA,YACL,OAAA,GAAU;AACR,cAAA,YAAA,CAAa,SAAS,CAAA;AAAA,YACxB;AAAA,WACF;AAAA,QACF,CAAA;AAAA;AAAA,QAGA,iBAAA,CAAkB,YAAA,EAAc,SAAA,EAAW,QAAA,EAAU;AACnD,UAAA,MAAM,aAAa,YAAA,CAAa,IAAA,CAAK,CAACqC,GAAAA,KAAOA,IAAG,UAAU,CAAA;AAC1D,UAAA,IAAI,CAAC,YAAY,OAAO,IAAA;AAExB,UAAA,MAAM,KAAK,QAAA,CAAS,EAAA;AACpB,UAAA,gBAAA,CAAiB,QAAA,CAAS,KAAK,EAAE,CAAA;AAEjC,UAAA,OAAO,EAAA,CAAG,aAAa,EAAA,GAAK,IAAA;AAAA,QAC9B,CAAA;AAAA;AAAA,QAGA,OAAO,gBAAA,GACH;AAAA,UACE,eAAA,EAAiB;AAAA,YAEnB;AAAC,OACN;AAAA,KACH;AAAA,EACF;AACF,CAAC;;;AC/NM,IAAM,oBAAA,GAAiC;AAAA,EAC5C,MAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF;AAQO,IAAM,yBAAA,GAAsC;AAAA,EACjD,WAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF;AAqCO,SAAS,yBAAA,CACd,EAAA,EACA,KAAA,EACA,IAAA,EACA,IACA,KAAA,EACM;AACN,EAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,WAAW,CAAA;AACpD,EAAA,IAAI,CAAC,aAAA,EAAe;AACpB,EAAA,MAAM,aAAuB,EAAC;AAC9B,EAAA,IAAI,UAAU,MAAA,IAAU,KAAA,KAAU,QAAQ,UAAA,CAAW,IAAA,CAAK,SAAS,YAAY,CAAA;AAC/E,EAAA,IAAI,UAAU,IAAA,IAAQ,KAAA,KAAU,QAAQ,UAAA,CAAW,IAAA,CAAK,mBAAmB,sBAAsB,CAAA;AACjG,EAAA,KAAA,CAAM,IAAI,YAAA,CAAa,IAAA,EAAM,EAAA,EAAI,CAAC,MAAM,GAAA,KAAQ;AAC9C,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,EAAQ,OAAO,IAAA;AACzB,IAAA,MAAM,QAAA,GAAW,KAAK,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,aAAa,CAAA;AAChE,IAAA,IAAI,CAAC,UAAU,OAAO,KAAA;AACtB,IAAA,MAAM,WAAA,GAAc,UAAA,CAAW,IAAA,CAAK,CAAC,MAAM,QAAA,CAAS,KAAA,CAAM,CAAC,CAAA,KAAM,IAAA,IAAQ,QAAA,CAAS,KAAA,CAAM,CAAC,MAAM,MAAS,CAAA;AACxG,IAAA,IAAI,CAAC,aAAa,OAAO,KAAA;AACzB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,IAAI,CAAA;AAChC,IAAA,MAAM,MAAM,IAAA,CAAK,GAAA,CAAI,GAAA,GAAM,IAAA,CAAK,UAAU,EAAE,CAAA;AAC5C,IAAA,MAAM,QAAA,GAAoC,EAAE,GAAG,QAAA,CAAS,KAAA,EAAM;AAC9D,IAAA,KAAA,MAAW,CAAA,IAAK,UAAA,EAAY,QAAA,CAAS,CAAC,CAAA,GAAI,IAAA;AAC1C,IAAA,MAAM,SAAA,GAAY,MAAA,CAAO,MAAA,CAAO,QAAQ,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,KAAM,IAAA,IAAQ,CAAA,KAAM,MAAS,CAAA;AACnF,IAAA,EAAA,CAAG,UAAA,CAAW,KAAA,EAAO,GAAA,EAAK,QAAQ,CAAA;AAClC,IAAA,IAAI,SAAA,KAAc,OAAA,CAAQ,KAAA,EAAO,KAAK,aAAA,CAAc,MAAA,CAAO,QAAQ,CAAC,CAAA;AACpE,IAAA,OAAO,KAAA;AAAA,EACT,CAAC,CAAA;AACH;AAEO,IAAM,UAAA,GAAa,UAAU,MAAA,CAA0B;AAAA,EAC5D,IAAA,EAAM,YAAA;AAAA,EAEN,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,yBAAA;AAAA,MACP,QAAA,EAAU,oBAAA;AAAA,MACV,UAAA,EAAY;AAAA,KACd;AAAA,EACF,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,cAAA,GAAiB;AACf,IAAA,IAAI,KAAK,OAAA,CAAQ,QAAA,CAAS,WAAW,CAAA,EAAG,IAAA,CAAK,QAAQ,QAAA,GAAW,oBAAA;AAChE,IAAA,IAAI,KAAK,OAAA,CAAQ,UAAA,CAAW,WAAW,CAAA,EAAG,IAAA,CAAK,QAAQ,UAAA,GAAa,oBAAA;AAAA,EACtE,CAAA;AAAA,EAEA,mBAAA,GAAsB;AACpB,IAAA,OAAO;AAAA,MACL;AAAA,QACE,KAAA,EAAO,KAAK,OAAA,CAAQ,KAAA;AAAA,QACpB,UAAA,EAAY;AAAA,UACV,OAAA,EAAS;AAAA,YACP,OAAA,EAAS,IAAA;AAAA,YACT,SAAA,EAAW,CAAC,OAAA,KAAyB,OAAA,CAAQ,aAAa,eAAe,CAAA;AAAA,YACzE,UAAA,EAAY,CAAC,UAAA,KAAwC;AACnD,cAAA,MAAM,CAAA,GAAI,WAAW,SAAS,CAAA;AAC9B,cAAA,IAAI,CAAC,GAAG,OAAO,IAAA;AACf,cAAA,OAAO,EAAE,iBAAiB,CAAA,EAAE;AAAA,YAC9B;AAAA,WACF;AAAA,UACA,SAAA,EAAW;AAAA,YACT,OAAA,EAAS,IAAA;AAAA,YACT,SAAA,EAAW,CAAC,OAAA,KAAyB,OAAA,CAAQ,aAAa,iBAAiB,CAAA;AAAA,YAC3E,UAAA,EAAY,CAAC,UAAA,KAAwC;AACnD,cAAA,MAAM,CAAA,GAAI,WAAW,WAAW,CAAA;AAChC,cAAA,IAAI,CAAC,GAAG,OAAO,IAAA;AACf,cAAA,OAAO,EAAE,mBAAmB,CAAA,EAAE;AAAA,YAChC;AAAA;AACF;AACF;AACF,KACF;AAAA,EACF,CAAA;AAAA,EAEA,WAAA,GAAc;AACZ,IAAA,MAAM,KAAA,GAAQ,KAAK,OAAA,CAAQ,KAAA;AAC3B,IAAA,MAAM,QAAA,GAAW,KAAK,OAAA,CAAQ,QAAA;AAC9B,IAAA,MAAM,UAAA,GAAa,KAAK,OAAA,CAAQ,UAAA;AAOhC,IAAA,SAAS,cAAc,KAAA,EAAmC;AACxD,MAAA,MAAM,EAAE,KAAA,EAAM,GAAI,KAAA,CAAM,SAAA;AACxB,MAAA,KAAA,IAAS,KAAA,GAAQ,KAAA,CAAM,KAAA,EAAO,KAAA,IAAS,GAAG,KAAA,EAAA,EAAS;AACjD,QAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA;AAC7B,QAAA,IAAI,KAAA,CAAM,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,EAAG;AAElC,UAAA,OAAO,KAAA,KAAU,CAAA,GAAI,CAAA,GAAI,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,QAC7C;AAAA,MACF;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,SAAS,OAAA,CAAQ,MAA+B,OAAA,EAAmB;AACjE,MAAA,OAAO,CAAC,KAAA,KACN,CAAC,EAAE,KAAA,EAAO,UAAS,KAAM;AAEvB,QAAA,IAAI,UAAU,IAAA,IAAQ,CAAC,QAAQ,QAAA,CAAS,KAAK,GAAG,OAAO,KAAA;AACvD,QAAA,MAAM,GAAA,GAAM,cAAc,KAAK,CAAA;AAC/B,QAAA,IAAI,GAAA,KAAQ,MAAM,OAAO,KAAA;AACzB,QAAA,MAAM,IAAA,GAAO,KAAA,CAAM,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA;AACjC,QAAA,IAAI,CAAC,MAAM,OAAO,KAAA;AAClB,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,MAAM,EAAA,GAAK,KAAA,CAAM,EAAA,CAAG,aAAA,CAAc,KAAK,MAAA,EAAW,EAAE,GAAG,IAAA,CAAK,KAAA,EAAO,CAAC,IAAI,GAAG,OAAO,CAAA;AAClF,UAAA,yBAAA,CAA0B,EAAA,EAAI,OAAO,GAAA,EAAK,GAAA,GAAM,KAAK,QAAA,EAAU,IAAA,KAAS,WAAA,GAAc,MAAA,GAAS,IAAI,CAAA;AACnG,UAAA,QAAA,CAAS,EAAE,CAAA;AAAA,QACb;AACA,QAAA,OAAO,IAAA;AAAA,MACT,CAAA;AAAA,IACJ;AAEA,IAAA,OAAO;AAAA,MACL,eAAA,EAAiB,OAAA,CAAQ,SAAA,EAAW,QAAQ,CAAA;AAAA,MAC5C,iBAAA,EAAmB,OAAA,CAAQ,WAAA,EAAa,UAAU,CAAA;AAAA,MAClD,kBACE,MACA,CAAC,EAAE,KAAA,EAAO,UAAS,KAAM;AACvB,QAAA,MAAM,GAAA,GAAM,cAAc,KAAK,CAAA;AAC/B,QAAA,IAAI,GAAA,KAAQ,MAAM,OAAO,KAAA;AACzB,QAAA,MAAM,IAAA,GAAO,KAAA,CAAM,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA;AACjC,QAAA,IAAI,CAAC,MAAM,OAAO,KAAA;AAClB,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,MAAM,EAAA,GAAK,KAAA,CAAM,EAAA,CAAG,aAAA,CAAc,KAAK,MAAA,EAAW;AAAA,YAChD,GAAG,IAAA,CAAK,KAAA;AAAA,YACR,OAAA,EAAS,IAAA;AAAA,YACT,SAAA,EAAW;AAAA,WACZ,CAAA;AACD,UAAA,yBAAA,CAA0B,IAAI,KAAA,EAAO,GAAA,EAAK,GAAA,GAAM,IAAA,CAAK,UAAU,MAAM,CAAA;AACrE,UAAA,QAAA,CAAS,EAAE,CAAA;AAAA,QACb;AACA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,KACJ;AAAA,EACF;AACF,CAAC;ACxJM,IAAMO,UAAAA,GAAY,UAAU,MAAA,CAA2C;AAAA,EAC5E,IAAA,EAAM,WAAA;AAAA,EAEN,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,SAAS,MAAM,EAAA;AAAA,MACf,SAAS,MAAM,IAAA;AAAA,MACf,SAAS,MAAM,IAAA;AAAA,MACf,UAAU,OAAO,EAAE,IAAA,EAAM,CAAA,EAAG,IAAI,CAAA,EAAE,CAAA;AAAA,MAClC,WAAW,MAAM;AAAA,KACnB;AAAA,EACF,CAAA;AAAA,EAEA,QAAA,GAAW;AACT,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AAGpB,IAAA,IAAA,CAAK,OAAA,CAAQ,UAAU,MAAM;AAC3B,MAAA,MAAM,QAAQ,MAAA,EAAQ,KAAA;AACtB,MAAA,IAAI,CAAC,OAAO,OAAO,EAAA;AAEnB,MAAA,MAAM,EAAE,SAAA,EAAW,GAAA,EAAI,GAAI,KAAA;AAC3B,MAAA,MAAM,EAAE,IAAA,EAAM,EAAA,EAAG,GAAI,SAAA;AACrB,MAAA,OAAO,GAAA,CAAI,WAAA,CAAY,IAAA,EAAM,EAAA,EAAI,GAAG,CAAA;AAAA,IACtC,CAAA;AAEA,IAAA,IAAA,CAAK,OAAA,CAAQ,UAAU,MAAM;AAC3B,MAAA,MAAM9C,UAAQ,MAAA,EAAQ,KAAA;AACtB,MAAA,IAAI,CAACA,SAAO,OAAO,IAAA;AAEnB,MAAA,MAAM,EAAE,WAAU,GAAIA,OAAA;AACtB,MAAA,IAAI,qBAAqB6D,mBAAAA,EAAe;AACtC,QAAA,OAAO,SAAA,CAAU,IAAA;AAAA,MACnB;AAEA,MAAA,OAAO,IAAA;AAAA,IACT,CAAA;AAEA,IAAA,IAAA,CAAK,OAAA,CAAQ,UAAU,MAAM;AAC3B,MAAA,MAAM,QAAQ,MAAA,EAAQ,KAAA;AACtB,MAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,MAAA,OAAO,MAAM,SAAA,CAAU,KAAA;AAAA,IACzB,CAAA;AAEA,IAAA,IAAA,CAAK,OAAA,CAAQ,WAAW,MAAM;AAC5B,MAAA,MAAM,QAAQ,MAAA,EAAQ,KAAA;AACtB,MAAA,IAAI,CAAC,KAAA,EAAO,OAAO,EAAE,IAAA,EAAM,CAAA,EAAG,IAAI,CAAA,EAAE;AACpC,MAAA,OAAO,EAAE,MAAM,KAAA,CAAM,SAAA,CAAU,MAAM,EAAA,EAAI,KAAA,CAAM,UAAU,EAAA,EAAG;AAAA,IAC9D,CAAA;AAEA,IAAA,IAAA,CAAK,OAAA,CAAQ,YAAY,MAAM;AAC7B,MAAA,MAAM,QAAQ,MAAA,EAAQ,KAAA;AACtB,MAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,MAAA,MAAM,EAAE,WAAU,GAAI,KAAA;AACtB,MAAA,IAAI,CAAC,SAAA,CAAU,KAAA,EAAO,OAAO,IAAA;AAC7B,MAAA,OAAO,SAAA,CAAU,IAAA;AAAA,IACnB,CAAA;AAAA,EACF,CAAA;AAAA,EAEA,WAAA,GAAc;AACZ,IAAA,OAAO;AAAA,MACL,YAAA,EACE,CAAC,IAAA,EAAc,EAAA,KACf,CAAC,EAAE,EAAA,EAAI,UAAS,KAAM;AACpB,QAAA,MAAM,aAAa,EAAA,IAAM,IAAA;AAGzB,QAAA,IAAI,OAAO,CAAA,IAAK,UAAA,GAAa,EAAA,CAAG,GAAA,CAAI,QAAQ,IAAA,EAAM;AAChD,UAAA,OAAO,KAAA;AAAA,QACT;AAEA,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,MAAM,YAAY5D,mBAAAA,CAAc,MAAA,CAAO,EAAA,CAAG,GAAA,EAAK,MAAM,UAAU,CAAA;AAC/D,UAAA,EAAA,CAAG,aAAa,SAAS,CAAA;AACzB,UAAA,QAAA,CAAS,EAAE,CAAA;AAAA,QACb;AAEA,QAAA,OAAO,IAAA;AAAA,MACT,CAAA;AAAA,MAEF,YACE,CAAC,GAAA,KACD,CAAC,EAAE,EAAA,EAAI,UAAS,KAAM;AAEpB,QAAA,IAAI,MAAM,CAAA,IAAK,GAAA,IAAO,EAAA,CAAG,GAAA,CAAI,QAAQ,IAAA,EAAM;AACzC,UAAA,OAAO,KAAA;AAAA,QACT;AAEA,QAAA,MAAM,IAAA,GAAO,EAAA,CAAG,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA;AAE9B,QAAA,IAAI,CAAC,MAAM,OAAO,KAAA;AAElB,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,MAAM,SAAA,GAAY4D,mBAAAA,CAAc,MAAA,CAAO,EAAA,CAAG,KAAK,GAAG,CAAA;AAClD,UAAA,EAAA,CAAG,aAAa,SAAS,CAAA;AACzB,UAAA,QAAA,CAAS,EAAE,CAAA;AAAA,QACb;AAEA,QAAA,OAAO,IAAA;AAAA,MACT,CAAA;AAAA,MAEF,kBACE,MACA,CAAC,EAAE,EAAA,EAAI,UAAS,KAAM;AAEpB,QAAA,MAAM,EAAE,KAAA,EAAM,GAAI,EAAA,CAAG,SAAA;AAGrB,QAAA,KAAA,IAAS,KAAA,GAAQ,KAAA,CAAM,KAAA,EAAO,KAAA,GAAQ,GAAG,KAAA,EAAA,EAAS;AAChD,UAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA;AAC7B,UAAA,MAAM,GAAA,GAAM,KAAA,CAAM,MAAA,CAAO,KAAK,CAAA;AAE9B,UAAA,IAAI,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,UAAA,KAAe,KAAA,EAAO;AACvC,YAAA,IAAI,QAAA,EAAU;AACZ,cAAA,MAAM,GAAA,GAAMA,mBAAAA,CAAc,MAAA,CAAO,EAAA,CAAG,KAAK,GAAG,CAAA;AAC5C,cAAA,EAAA,CAAG,aAAa,GAAG,CAAA;AACnB,cAAA,QAAA,CAAS,EAAE,CAAA;AAAA,YACb;AACA,YAAA,OAAO,IAAA;AAAA,UACT;AAAA,QACF;AAEA,QAAA,OAAO,KAAA;AAAA,MACT,CAAA;AAAA,MAEF,iBACE,CAAC,SAAA,KACD,CAAC,EAAE,EAAA,EAAI,UAAS,KAAM;AAEpB,QAAA,IAAI,EAAE,IAAA,EAAM,EAAA,EAAG,GAAI,EAAA,CAAG,SAAA;AAMtB,QAAA,QAAQ,SAAA;AAAW,UACjB,KAAK,MAAA;AACH,YAAA,IAAA,GAAO,IAAA,CAAK,IAAIC,eAAA,CAAY,OAAA,CAAQ,GAAG,GAAG,CAAA,CAAE,IAAA,EAAM,IAAA,GAAO,CAAC,CAAA;AAC1D,YAAA;AAAA,UACF,KAAK,OAAA;AACH,YAAA,EAAA,GAAK,IAAA,CAAK,IAAIA,eAAA,CAAY,KAAA,CAAM,GAAG,GAAG,CAAA,CAAE,EAAA,EAAI,EAAA,GAAK,CAAC,CAAA;AAClD,YAAA;AAAA,UACF,KAAK,OAAA;AACH,YAAA,IAAA,GAAOA,eAAA,CAAY,OAAA,CAAQ,EAAA,CAAG,GAAG,CAAA,CAAE,IAAA;AACnC,YAAA;AAAA,UACF,KAAK,KAAA;AACH,YAAA,EAAA,GAAKA,eAAA,CAAY,KAAA,CAAM,EAAA,CAAG,GAAG,CAAA,CAAE,EAAA;AAC/B,YAAA;AAAA;AAGJ,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,MAAM,eAAe7D,mBAAAA,CAAc,MAAA,CAAO,EAAA,CAAG,GAAA,EAAK,MAAM,EAAE,CAAA;AAC1D,UAAA,EAAA,CAAG,aAAa,YAAY,CAAA;AAC5B,UAAA,QAAA,CAAS,EAAE,CAAA;AAAA,QACb;AAEA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,KACJ;AAAA,EACF;AACF,CAAC;AC5NM,IAAM,+BAA+B,IAAIyC,eAAAA;AAAA,EAC9C;AACF;AAEO,IAAM,sBAAsB,SAAA,CAAU,MAAA;AAAA,EAC3C;AAAA,IACE,IAAA,EAAM,qBAAA;AAAA,IAEN,qBAAA,GAAwB;AACtB,MAAA,OAAO;AAAA,QACL,IAAIxC,YAAAA,CAAO;AAAA,UACT,GAAA,EAAK,4BAAA;AAAA,UACL,KAAA,EAAO;AAAA,YACL,eAAA,EAAiB;AAAA,cACf,IAAA,CAAK,MAAM,KAAA,EAAO;AAKhB,gBAAA,MAAM,UAAU,KAAA,CAAM,aAAA;AACtB,gBAAA,IACE,OAAA,YAAmB,WAAA,KAClB,OAAA,CAAQ,OAAA,CAAQ,qBAAqB,CAAA,IACrC,OAAA,CAAQ,OAAA,CAAQ,aAAa,CAAA,IAC7B,OAAA,CAAQ,OAAA,CAAQ,iBAAiB,CAAA,CAAA,EAClC;AACA,kBAAA,OAAO,KAAA;AAAA,gBACT;AAEA,gBAAA,MAAM,EAAE,IAAA,EAAM,EAAA,EAAG,GAAI,KAAK,KAAA,CAAM,SAAA;AAChC,gBAAA,IAAI,SAAS,EAAA,EAAI;AACf,kBAAA,IAAA,CAAK,QAAA;AAAA,oBACH,IAAA,CAAK,MAAM,EAAA,CAAG,YAAA;AAAA,sBACZD,mBAAAA,CAAc,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,KAAK,IAAI;AAAA;AAC3C,mBACF;AAAA,gBACF;AACA,gBAAA,OAAO,KAAA;AAAA,cACT;AAAA;AACF;AACF,SACD;AAAA,OACH;AAAA,IACF;AAAA;AAEJ;ACbO,IAAM,uBAAA,GAA0B,IAAIyC,eAAAA,CAAU,gBAAgB;AAGrE,IAAM,KAAA,GAAQ;AAAA,EACZ,SAAA,EAAW,MAAA;AAAA,EACX,SAAA,EAAW,QAGb,CAAA;AAOA,SAAS,gBAAA,CACP,KACA,OAAA,EACe;AACf,EAAA,MAAM,cAA4B,EAAC;AAEnC,EAAA,GAAA,CAAI,WAAA,CAAY,CAAC,IAAA,EAAM,GAAA,KAAQ;AAC7B,IAAA,IAAI,OAAA,CAAQ,SAAA,IAAa,IAAA,CAAK,IAAA,CAAK,SAAS,WAAA,EAAa;AACvD,MAAA,MAAM,MAAA,GAAS,GAAA,GAAM,IAAA,CAAK,QAAA,GAAW,CAAA;AACrC,MAAA,WAAA,CAAY,IAAA;AAAA,QACViB,eAAAA,CAAW,MAAA;AAAA,UACT,MAAA;AAAA,UACA,MAAM;AACJ,YAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC1C,YAAA,IAAA,CAAK,YAAY,CAAA,EAAG,OAAA,CAAQ,SAAS,CAAA,CAAA,EAAI,QAAQ,SAAS,CAAA,WAAA,CAAA;AAC1D,YAAA,IAAA,CAAK,cAAc,KAAA,CAAM,SAAA;AACzB,YAAA,OAAO,IAAA;AAAA,UACT,CAAA;AAAA,UACA,EAAE,MAAM,EAAA;AAAG;AACb,OACF;AAAA,IACF;AAEA,IAAA,IAAI,OAAA,CAAQ,SAAA,IAAa,IAAA,CAAK,IAAA,CAAK,SAAS,WAAA,EAAa;AACvD,MAAA,WAAA,CAAY,IAAA;AAAA,QACVA,eAAAA,CAAW,MAAA;AAAA,UACT,GAAA;AAAA,UACA,MAAM;AACJ,YAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC1C,YAAA,IAAA,CAAK,YAAY,CAAA,EAAG,OAAA,CAAQ,SAAS,CAAA,CAAA,EAAI,QAAQ,SAAS,CAAA,WAAA,CAAA;AAC1D,YAAA,IAAA,CAAK,cAAc,KAAA,CAAM,SAAA;AACzB,YAAA,OAAO,IAAA;AAAA,UACT,CAAA;AAAA,UACA,EAAE,MAAM,EAAA;AAAG;AACb,OACF;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,IAAA,EAAM;AAC5B,MAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,QAAA,MAAM,IAAA,GAAO,KAAK,CAAC,CAAA;AACnB,QAAA,MAAM,UAAU,GAAA,GAAM,CAAA;AAEtB,QAAA,IAAI,OAAA,CAAQ,KAAA,IAAS,IAAA,KAAS,GAAA,EAAK;AACjC,UAAA,WAAA,CAAY,IAAA;AAAA,YACVA,eAAAA,CAAW,MAAA,CAAO,OAAA,EAAS,OAAA,GAAU,CAAA,EAAG;AAAA,cACtC,OAAO,CAAA,EAAG,OAAA,CAAQ,SAAS,CAAA,CAAA,EAAI,QAAQ,SAAS,CAAA,OAAA,CAAA;AAAA,cAChD,WAAA,EAAa;AAAA,aACd;AAAA,WACH;AAAA,QACF;AAEA,QAAA,IAAI,OAAA,CAAQ,IAAA,IAAQ,IAAA,KAAS,MAAA,EAAU;AACrC,UAAA,WAAA,CAAY,IAAA;AAAA,YACVA,eAAAA,CAAW,MAAA,CAAO,OAAA,EAAS,OAAA,GAAU,CAAA,EAAG;AAAA,cACtC,OAAO,CAAA,EAAG,OAAA,CAAQ,SAAS,CAAA,CAAA,EAAI,QAAQ,SAAS,CAAA,MAAA,CAAA;AAAA,cAChD,WAAA,EAAa;AAAA,aACd;AAAA,WACH;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAOF,kBAAAA,CAAc,MAAA,CAAO,GAAA,EAAK,WAAW,CAAA;AAC9C;AAoDO,IAAM,cAAA,GAAiB,UAAU,MAAA,CAGtC;AAAA,EACA,IAAA,EAAM,gBAAA;AAAA,EAEN,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,SAAA,EAAW,IAAA;AAAA,MACX,SAAA,EAAW,IAAA;AAAA,MACX,KAAA,EAAO,IAAA;AAAA,MACP,IAAA,EAAM,IAAA;AAAA,MACN,SAAA,EAAW;AAAA,KACb;AAAA,EACF,CAAA;AAAA,EAEA,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,QAAQ,MAAY;AAAA,MAEpB,CAAA;AAAA,MACA,WAAW,MAAM;AAAA,KACnB;AAAA,EACF,CAAA;AAAA,EAEA,QAAA,GAAW;AACT,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,MAAM,UAAU,IAAA,CAAK,OAAA;AAErB,IAAA,IAAA,CAAK,OAAA,CAAQ,SAAS,MAAY;AAChC,MAAA,MAAM,QAAQ,MAAA,EAAQ,KAAA;AACtB,MAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,MAAA,MAAM,WAAA,GAAc,uBAAA,CAAwB,QAAA,CAAS,KAAK,CAAA;AAG1D,MAAA,MAAM,cAAA,GAAiB,WAAA,EAAa,OAAA,IAAW,OAAA,CAAQ,OAAA;AAEvD,MAAA,MAAM,EAAA,GAAK,KAAA,CAAM,EAAA,CAAG,OAAA,CAAQ,uBAAA,EAAyB;AAAA,QACnD,SAAS,CAAC;AAAA,OACX,CAAA;AACD,MAAA,MAAA,CAAO,IAAA,CAAK,SAAS,EAAE,CAAA;AAAA,IACzB,CAAA;AAEA,IAAA,IAAA,CAAK,OAAA,CAAQ,YAAY,MAAe;AACtC,MAAA,MAAM,QAAQ,MAAA,EAAQ,KAAA;AACtB,MAAA,IAAI,CAAC,KAAA,EAAO,OAAO,OAAA,CAAQ,OAAA;AAC3B,MAAA,MAAM,WAAA,GAAc,uBAAA,CAAwB,QAAA,CAAS,KAAK,CAAA;AAG1D,MAAA,OAAO,WAAA,EAAa,WAAW,OAAA,CAAQ,OAAA;AAAA,IACzC,CAAA;AAAA,EACF,CAAA;AAAA,EAEA,WAAA,GAAc;AACZ,IAAA,OAAO;AAAA,MACL,oBAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM;AAChB,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,IAAA,CAAK,QAAQ,MAAA,EAAO;AAAA,QACtB;AACA,QAAA,OAAO,IAAA;AAAA,MACT,CAAA;AAAA,MAEF,kBAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM;AAChB,QAAA,IAAI,QAAA,IAAY,CAAC,IAAA,CAAK,OAAA,CAAQ,WAAU,EAAG;AACzC,UAAA,IAAA,CAAK,QAAQ,MAAA,EAAO;AAAA,QACtB;AACA,QAAA,OAAO,IAAA;AAAA,MACT,CAAA;AAAA,MAEF,kBAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM;AAChB,QAAA,IAAI,QAAA,IAAY,IAAA,CAAK,OAAA,CAAQ,SAAA,EAAU,EAAG;AACxC,UAAA,IAAA,CAAK,QAAQ,MAAA,EAAO;AAAA,QACtB;AACA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,KACJ;AAAA,EACF,CAAA;AAAA,EAEA,oBAAA,GAAuB;AACrB,IAAA,OAAO;AAAA,MACL,eAAe,MAAM;AACnB,QAAA,OAAO,IAAA,CAAK,MAAA,EAAQ,QAAA,CAAS,oBAAA,EAAqB,IAAK,KAAA;AAAA,MACzD;AAAA,KACF;AAAA,EACF,CAAA;AAAA,EAEA,eAAA,GAAiC;AAC/B,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,gBAAA;AAAA,QACN,OAAA,EAAS,sBAAA;AAAA,QACT,IAAA,EAAM,WAAA;AAAA,QACN,KAAA,EAAO,sBAAA;AAAA,QACP,QAAA,EAAU,aAAA;AAAA,QACV,KAAA,EAAO,SAAA;AAAA,QACP,QAAA,EAAU,GAAA;AAAA,QACV,UAAA,EAAY,CAAC,MAAA,KAAW;AACtB,UAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,gBAAgB,CAAA;AAG/C,UAAA,OAAO,OAAA,EAAS,aAAY,IAAK,KAAA;AAAA,QACnC;AAAA;AACF,KACF;AAAA,EACF,CAAA;AAAA,EAEA,qBAAA,GAAwB;AACtB,IAAA,MAAM,UAAU,IAAA,CAAK,OAAA;AAErB,IAAA,OAAO;AAAA,MACL,IAAIvD,YAAAA,CAAO;AAAA,QACT,GAAA,EAAK,uBAAA;AAAA,QAEL,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,CAAC,CAAA,EAAG,KAAA,MAAsC;AAAA,YAC9C,SAAS,OAAA,CAAQ,OAAA;AAAA,YACjB,WAAA,EAAa,QAAQ,OAAA,GACjB,gBAAA,CAAiB,MAAM,GAAA,EAAK,OAAO,IACnCuD,kBAAAA,CAAc;AAAA,WACpB,CAAA;AAAA,UACA,KAAA,EAAO,CAAC,EAAA,EAAI,IAAA,EAAiC,WAAW,QAAA,KAAwC;AAC9F,YAAA,MAAM,IAAA,GAAO,EAAA,CAAG,OAAA,CAAQ,uBAAuB,CAAA;AAG/C,YAAA,MAAM,OAAA,GAAU,IAAA,EAAM,OAAA,IAAW,IAAA,CAAK,OAAA;AAEtC,YAAA,IAAI,CAAC,OAAA,EAAS;AACZ,cAAA,IAAI,CAAC,IAAA,CAAK,OAAA,EAAS,OAAO,IAAA;AAC1B,cAAA,OAAO,EAAE,OAAA,EAAS,WAAA,EAAaA,kBAAAA,CAAc,KAAA,EAAM;AAAA,YACrD;AAGA,YAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,cAAA,OAAO,EAAE,OAAA,EAAS,WAAA,EAAa,iBAAiB,QAAA,CAAS,GAAA,EAAK,OAAO,CAAA,EAAE;AAAA,YACzE;AAGA,YAAA,IAAI,GAAG,UAAA,EAAY;AACjB,cAAA,OAAO,EAAE,OAAA,EAAS,WAAA,EAAa,iBAAiB,QAAA,CAAS,GAAA,EAAK,OAAO,CAAA,EAAE;AAAA,YACzE;AAGA,YAAA,OAAO,IAAA;AAAA,UACT;AAAA,SACF;AAAA,QAEA,KAAA,EAAO;AAAA,UACL,WAAA,EAAa,CAAC,KAAA,KAAU;AACtB,YAAA,MAAM,WAAA,GAAc,uBAAA,CAAwB,QAAA,CAAS,KAAK,CAAA;AAG1D,YAAA,OAAO,WAAA,EAAa,eAAeA,kBAAAA,CAAc,KAAA;AAAA,UACnD;AAAA;AACF,OACD;AAAA,KACH;AAAA,EACF;AACF,CAAC;;;AC5SM,IAAM,mBAAA,GAAgC;AAAA;AAAA,EAE3C,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA;AAAA,EAE5C,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA;AAAA,EAE5C,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA;AAAA,EAE5C,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA;AAAA,EAE5C,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW;AAC9C;AAiBO,IAAM,SAAA,GAAY,UAAU,MAAA,CAAyB;AAAA,EAC1D,IAAA,EAAM,WAAA;AAAA,EAEN,YAAA,EAAc,CAAC,WAAW,CAAA;AAAA,EAE1B,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,mBAAA;AAAA,MACR,OAAA,EAAS;AAAA,KACX;AAAA,EACF,CAAA;AAAA,EAEA,mBAAA,GAAsB;AACpB,IAAA,OAAO;AAAA,MACL;AAAA,QACE,KAAA,EAAO,CAAC,WAAW,CAAA;AAAA,QACnB,UAAA,EAAY;AAAA,UACV,KAAA,EAAO;AAAA,YACL,OAAA,EAAS,IAAA;AAAA,YACT,SAAA,EAAW,CAAC,OAAA,KAAyB;AACnC,cAAA,MAAM,MAAM,OAAA,CAAQ,KAAA,CAAM,KAAA,CAAM,OAAA,CAAQ,UAAU,EAAE,CAAA;AACpD,cAAA,OAAO,GAAA,GAAM,cAAA,CAAe,GAAG,CAAA,GAAI,IAAA;AAAA,YACrC,CAAA;AAAA,YACA,UAAA,EAAY,CAAC,UAAA,KAAwC;AACnD,cAAA,MAAM,KAAA,GAAQ,WAAW,OAAO,CAAA;AAIhC,cAAA,MAAM,KAAA,GAAQ,WAAW,YAAY,CAAA;AACrC,cAAA,IAAI,CAAC,KAAA,IAAS,KAAA,EAAO,OAAO,IAAA;AAC5B,cAAA,OAAO,EAAE,KAAA,EAAO,CAAA,OAAA,EAAU,KAAK,CAAA,CAAA,EAAG;AAAA,YACpC;AAAA,WACF;AAAA,UACA,UAAA,EAAY;AAAA,YACV,OAAA,EAAS,IAAA;AAAA,YACT,SAAA,EAAW,CAAC,OAAA,KAAyB,OAAA,CAAQ,aAAa,iBAAiB,CAAA;AAAA,YAC3E,UAAA,EAAY,CAAC,UAAA,KAAwC;AACnD,cAAA,MAAM,KAAA,GAAQ,WAAW,YAAY,CAAA;AACrC,cAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,cAAA,OAAO,EAAE,mBAAmB,KAAA,EAAM;AAAA,YACpC;AAAA;AACF;AACF;AACF,KACF;AAAA,EACF,CAAA;AAAA,EAEA,WAAA,GAAc;AACZ,IAAA,OAAO;AAAA;AAAA;AAAA;AAAA,MAIL,cACE,CAAC,KAAA,KACD,CAAC,EAAE,UAAS,KAAM;AAChB,QAAA,OAAO,SAAS,OAAA,CAAQ,WAAA,EAAa,EAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA;AAAA,MAClE,CAAA;AAAA,MAEF,cAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM;AAChB,QAAA,IAAI,CAAC,SAAS,OAAA,CAAQ,WAAA,EAAa,EAAE,KAAA,EAAO,IAAA,EAAM,CAAA,EAAG,OAAO,KAAA;AAC5D,QAAA,QAAA,CAAS,oBAAA,EAAqB;AAC9B,QAAA,OAAO,IAAA;AAAA,MACT,CAAA;AAAA;AAAA;AAAA,MAIF,mBACE,CAAC,KAAA,KACD,CAAC,EAAE,UAAS,KAAM;AAChB,QAAA,IAAI,CAAC,QAAA,CAAS,OAAA,CAAQ,WAAA,EAAa,EAAE,UAAA,EAAY,KAAA,EAAO,KAAA,EAAO,IAAA,EAAM,CAAA,EAAG,OAAO,KAAA;AAC/E,QAAA,IAAI,KAAA,KAAU,IAAA,EAAM,QAAA,CAAS,oBAAA,EAAqB;AAClD,QAAA,OAAO,IAAA;AAAA,MACT,CAAA;AAAA,MAEF,mBAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM;AAChB,QAAA,IAAI,CAAC,SAAS,OAAA,CAAQ,WAAA,EAAa,EAAE,UAAA,EAAY,IAAA,EAAM,CAAA,EAAG,OAAO,KAAA;AACjE,QAAA,QAAA,CAAS,oBAAA,EAAqB;AAC9B,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,KACJ;AAAA,EACF,CAAA;AAAA,EAEA,aAAA,GAAgB;AACd,IAAA,OAAO,CAAC,SAAS,CAAA;AAAA,EACnB,CAAA;AAAA,EAEA,eAAA,GAAiC;AAC/B,IAAA,IAAI,KAAK,OAAA,CAAQ,MAAA,CAAO,MAAA,KAAW,CAAA,SAAU,EAAC;AAE9C,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,UAAA;AAAA,QACN,IAAA,EAAM,WAAA;AAAA,QACN,IAAA,EAAM,gBAAA;AAAA,QACN,KAAA,EAAO,YAAA;AAAA,QACP,KAAA,EAAO,WAAA;AAAA,QACP,QAAA,EAAU,GAAA;AAAA,QACV,MAAA,EAAQ,MAAA;AAAA,QACR,WAAA,EAAa,KAAK,OAAA,CAAQ,OAAA;AAAA,QAC1B,qBAAA,EAAuB,SAAA;AAAA,QACvB,KAAA,EAAO;AAAA,UACL;AAAA,YACE,IAAA,EAAM,QAAA;AAAA,YACN,IAAA,EAAM,gBAAA;AAAA,YACN,OAAA,EAAS,gBAAA;AAAA,YACT,IAAA,EAAM,UAAA;AAAA,YACN,KAAA,EAAO;AAAA,WACT;AAAA,UACA,GAAG,IAAA,CAAK,OAAA,CAAQ,OAAO,GAAA,CAAI,CAAC,OAAO,CAAA,MAAO;AAAA,YACxC,IAAA,EAAM,QAAA;AAAA,YACN,IAAA,EAAM,aAAa,KAAK,CAAA,CAAA;AAAA,YACxB,OAAA,EAAS,cAAA;AAAA,YACT,WAAA,EAAa,CAAC,KAAK,CAAA;AAAA,YACnB,UAAU,EAAE,IAAA,EAAM,aAAa,UAAA,EAAY,EAAE,OAAM,EAAE;AAAA,YACrD,IAAA,EAAM,EAAA;AAAA,YACN,KAAA,EAAO,KAAA;AAAA,YACP,KAAA;AAAA,YACA,UAAU,GAAA,GAAM;AAAA,WAClB,CAAE;AAAA;AACJ;AACF,KACF;AAAA,EACF;AACF,CAAC;AC7JM,IAAM,wBAAA,GAAqC;AAAA;AAAA,EAEhD,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA;AAAA,EAE5C,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA;AAAA,EAE5C,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA;AAAA,EAE5C,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA;AAAA,EAE5C,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW;AAC9C;AAsBO,IAAM,SAAA,GAAY,UAAU,MAAA,CAAyB;AAAA,EAC1D,IAAA,EAAM,WAAA;AAAA,EAEN,YAAA,EAAc,CAAC,WAAW,CAAA;AAAA,EAE1B,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,wBAAA;AAAA,MACR,OAAA,EAAS,CAAA;AAAA,MACT,YAAA,EAAc;AAAA,KAChB;AAAA,EACF,CAAA;AAAA,EAEA,mBAAA,GAAsB;AACpB,IAAA,MAAM,EAAE,SAAQ,GAAI,IAAA;AACpB,IAAA,OAAO;AAAA,MACL;AAAA,QACE,KAAA,EAAO,CAAC,WAAW,CAAA;AAAA,QACnB,UAAA,EAAY;AAAA,UACV,eAAA,EAAiB;AAAA,YACf,OAAA,EAAS,IAAA;AAAA,YACT,SAAA,EAAW,CAAC,OAAA,KAAyB;AACnC,cAAA,MAAM,MAAM,OAAA,CAAQ,KAAA,CAAM,eAAA,CAAgB,OAAA,CAAQ,UAAU,EAAE,CAAA;AAC9D,cAAA,IAAI,GAAA,EAAK,OAAO,cAAA,CAAe,GAAG,CAAA;AAElC,cAAA,IAAI,OAAA,CAAQ,OAAA,KAAY,MAAA,EAAQ,OAAO,OAAA,CAAQ,YAAA;AAC/C,cAAA,OAAO,IAAA;AAAA,YACT,CAAA;AAAA,YACA,UAAA,EAAY,CAAC,UAAA,KAAwC;AACnD,cAAA,MAAM,EAAA,GAAK,WAAW,iBAAiB,CAAA;AAGvC,cAAA,MAAM,KAAA,GAAQ,WAAW,sBAAsB,CAAA;AAC/C,cAAA,IAAI,CAAC,EAAA,IAAM,KAAA,EAAO,OAAO,IAAA;AACzB,cAAA,OAAO,EAAE,KAAA,EAAO,CAAA,kBAAA,EAAqB,EAAE,CAAA,CAAA,EAAG;AAAA,YAC5C;AAAA,WACF;AAAA,UACA,oBAAA,EAAsB;AAAA,YACpB,OAAA,EAAS,IAAA;AAAA,YACT,SAAA,EAAW,CAAC,OAAA,KAAyB,OAAA,CAAQ,aAAa,eAAe,CAAA;AAAA,YACzE,UAAA,EAAY,CAAC,UAAA,KAAwC;AACnD,cAAA,MAAM,KAAA,GAAQ,WAAW,sBAAsB,CAAA;AAC/C,cAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,cAAA,OAAO,EAAE,iBAAiB,KAAA,EAAM;AAAA,YAClC;AAAA;AACF;AACF;AACF,KACF;AAAA,EACF,CAAA;AAAA,EAEA,WAAA,GAAc;AACZ,IAAA,MAAM,YAAA,GAAe,KAAK,OAAA,CAAQ,YAAA;AAClC,IAAA,OAAO;AAAA;AAAA;AAAA;AAAA,MAIL,cACE,CAAC,UAAA,KACD,CAAC,EAAE,UAAS,KAAM;AAChB,QAAA,MAAM,KAAA,GAAQ,YAAY,KAAA,IAAS,YAAA;AACnC,QAAA,OAAO,QAAA,CAAS,QAAQ,WAAA,EAAa,EAAE,iBAAiB,KAAA,EAAO,oBAAA,EAAsB,MAAM,CAAA;AAAA,MAC7F,CAAA;AAAA,MAEF,cAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM;AAChB,QAAA,IAAI,CAAC,SAAS,OAAA,CAAQ,WAAA,EAAa,EAAE,eAAA,EAAiB,IAAA,EAAM,CAAA,EAAG,OAAO,KAAA;AACtE,QAAA,QAAA,CAAS,oBAAA,EAAqB;AAC9B,QAAA,OAAO,IAAA;AAAA,MACT,CAAA;AAAA,MAEF,iBACE,CAAC,UAAA,KACD,CAAC,EAAE,QAAA,EAAU,OAAM,KAAM;AACvB,QAAA,MAAM,KAAA,GAAQ,YAAY,KAAA,IAAS,YAAA;AACnC,QAAA,MAAM,QAAA,GAAW,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,WAAW,CAAA;AAC/C,QAAA,IAAI,CAAC,UAAU,OAAO,KAAA;AAEtB,QAAA,MAAM,EAAE,IAAA,EAAM,EAAA,EAAI,KAAA,KAAU,KAAA,CAAM,SAAA;AAClC,QAAA,IAAI,YAAA,GAAe,KAAA;AAEnB,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,MAAM,KAAA,GAAQ,MAAM,WAAA,IAAe,KAAA,CAAM,IAAI,OAAA,CAAQ,IAAI,EAAE,KAAA,EAAM;AACjE,UAAA,MAAM,IAAA,GAAO,QAAA,CAAS,OAAA,CAAQ,KAAK,CAAA;AACnC,UAAA,YAAA,GACE,CAAC,CAAC,IAAA,EAAM,KAAA,CAAM,iBAAiB,KAAK,CAAC,CAAC,IAAA,EAAM,KAAA,CAAM,sBAAsB,CAAA;AAAA,QAC5E,CAAA,MAAO;AACL,UAAA,KAAA,CAAM,GAAA,CAAI,YAAA,CAAa,IAAA,EAAM,EAAA,EAAI,CAAC,IAAA,KAAS;AACzC,YAAA,IAAI,cAAc,OAAO,KAAA;AACzB,YAAA,MAAM,IAAA,GAAO,QAAA,CAAS,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA;AACxC,YAAA,IAAI,MAAM,KAAA,CAAM,iBAAiB,KAAK,IAAA,EAAM,KAAA,CAAM,sBAAsB,CAAA,EAAG;AACzE,cAAA,YAAA,GAAe,IAAA;AACf,cAAA,OAAO,KAAA;AAAA,YACT;AACA,YAAA,OAAO,IAAA;AAAA,UACT,CAAC,CAAA;AAAA,QACH;AAEA,QAAA,IAAI,YAAA,EAAc;AAChB,UAAA,QAAA,CAAS,QAAQ,WAAA,EAAa,EAAE,iBAAiB,IAAA,EAAM,oBAAA,EAAsB,MAAM,CAAA;AACnF,UAAA,QAAA,CAAS,oBAAA,EAAqB;AAC9B,UAAA,OAAO,IAAA;AAAA,QACT;AAEA,QAAA,OAAO,QAAA,CAAS,QAAQ,WAAA,EAAa,EAAE,iBAAiB,KAAA,EAAO,oBAAA,EAAsB,MAAM,CAAA;AAAA,MAC7F,CAAA;AAAA;AAAA;AAAA;AAAA,MAKF,yBACE,CAAC,KAAA,KACD,CAAC,EAAE,UAAS,KAAM;AAChB,QAAA,IAAI,CAAC,QAAA,CAAS,OAAA,CAAQ,WAAA,EAAa,EAAE,sBAAsB,KAAA,EAAO,eAAA,EAAiB,IAAA,EAAM,CAAA,EAAG;AAC1F,UAAA,OAAO,KAAA;AAAA,QACT;AACA,QAAA,IAAI,KAAA,KAAU,IAAA,EAAM,QAAA,CAAS,oBAAA,EAAqB;AAClD,QAAA,OAAO,IAAA;AAAA,MACT,CAAA;AAAA,MAEF,yBAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM;AAChB,QAAA,IAAI,CAAC,SAAS,OAAA,CAAQ,WAAA,EAAa,EAAE,oBAAA,EAAsB,IAAA,EAAM,CAAA,EAAG,OAAO,KAAA;AAC3E,QAAA,QAAA,CAAS,oBAAA,EAAqB;AAC9B,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,KACJ;AAAA,EACF,CAAA;AAAA,EAEA,oBAAA,GAAuB;AACrB,IAAA,OAAO;AAAA,MACL,eAAe,MACb,IAAA,CAAK,MAAA,EAAQ,QAAA,CAAS,iBAAgB,IAAK;AAAA,KAC/C;AAAA,EACF,CAAA;AAAA,EAEA,aAAA,GAAgB;AACd,IAAA,MAAM,YAAA,GAAe,KAAK,OAAA,CAAQ,YAAA;AAClC,IAAA,OAAO;AAAA,MACL,IAAI/C,oBAAAA;AAAA,QACF,sBAAA;AAAA,QACA,CAAC,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,GAAA,KAAQ;AAC5B,UAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,WAAW,CAAA;AACpD,UAAA,IAAI,CAAC,eAAe,OAAO,IAAA;AAE3B,UAAA,MAAM,OAAA,GAAU,MAAM,CAAC,CAAA;AACvB,UAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AAErB,UAAA,MAAM,EAAE,IAAG,GAAI,KAAA;AACf,UAAA,EAAA,CAAG,YAAY,KAAA,EAAO,GAAA,EAAK,MAAM,MAAA,CAAO,IAAA,CAAK,OAAO,CAAC,CAAA;AACrD,UAAA,EAAA,CAAG,OAAA;AAAA,YACD,KAAA;AAAA,YACA,QAAQ,OAAA,CAAQ,MAAA;AAAA,YAChB,aAAA,CAAc,MAAA,CAAO,EAAE,eAAA,EAAiB,cAAc;AAAA,WACxD;AACA,UAAA,EAAA,CAAG,iBAAiB,aAAa,CAAA;AACjC,UAAA,OAAO,EAAA;AAAA,QACT;AAAA;AACF,KACF;AAAA,EACF,CAAA;AAAA,EAEA,eAAA,GAAiC;AAC/B,IAAA,MAAM,YAAA,GAAe,KAAK,OAAA,CAAQ,YAAA;AAElC,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG;AACpC,MAAA,OAAO;AAAA,QACL;AAAA,UACE,IAAA,EAAM,QAAA;AAAA,UACN,IAAA,EAAM,WAAA;AAAA,UACN,OAAA,EAAS,iBAAA;AAAA,UACT,QAAA,EAAU,EAAE,IAAA,EAAM,WAAA,EAAa,YAAY,EAAE,eAAA,EAAiB,cAAa,EAAE;AAAA,UAC7E,IAAA,EAAM,mBAAA;AAAA,UACN,KAAA,EAAO,WAAA;AAAA,UACP,QAAA,EAAU,aAAA;AAAA,UACV,KAAA,EAAO,QAAA;AAAA,UACP,QAAA,EAAU;AAAA;AACZ,OACF;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,UAAA;AAAA,QACN,IAAA,EAAM,WAAA;AAAA,QACN,IAAA,EAAM,mBAAA;AAAA,QACN,KAAA,EAAO,WAAA;AAAA,QACP,KAAA,EAAO,QAAA;AAAA,QACP,QAAA,EAAU,GAAA;AAAA,QACV,MAAA,EAAQ,MAAA;AAAA,QACR,WAAA,EAAa,KAAK,OAAA,CAAQ,OAAA;AAAA,QAC1B,KAAA,EAAO;AAAA,UACL;AAAA,YACE,IAAA,EAAM,QAAA;AAAA,YACN,IAAA,EAAM,gBAAA;AAAA,YACN,OAAA,EAAS,gBAAA;AAAA,YACT,IAAA,EAAM,UAAA;AAAA,YACN,KAAA,EAAO;AAAA,WACT;AAAA,UACA,GAAG,IAAA,CAAK,OAAA,CAAQ,OAAO,GAAA,CAAI,CAAC,OAAO,CAAA,MAAO;AAAA,YACxC,IAAA,EAAM,QAAA;AAAA,YACN,IAAA,EAAM,aAAa,KAAK,CAAA,CAAA;AAAA,YACxB,OAAA,EAAS,cAAA;AAAA,YACT,WAAA,EAAa,CAAC,EAAE,KAAA,EAAO,CAAA;AAAA,YACvB,QAAA,EAAU,EAAE,IAAA,EAAM,WAAA,EAAa,YAAY,EAAE,eAAA,EAAiB,OAAM,EAAE;AAAA,YACtE,IAAA,EAAM,EAAA;AAAA,YACN,KAAA,EAAO,KAAA;AAAA,YACP,KAAA;AAAA,YACA,UAAU,GAAA,GAAM;AAAA,WAClB,CAAE;AAAA;AACJ;AACF,KACF;AAAA,EACF;AACF,CAAC;;;ACzPM,IAAM,UAAA,GAAa,UAAU,MAAA,CAA0B;AAAA,EAC5D,IAAA,EAAM,YAAA;AAAA,EAEN,YAAA,EAAc,CAAC,WAAW,CAAA;AAAA,EAE1B,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,YAAA,EAAc,CAAC,OAAA,EAAS,SAAA,EAAW,UAAU,cAAA,EAAgB,iBAAA,EAAmB,SAAA,EAAW,mBAAA,EAAqB,aAAa;AAAA,KAC/H;AAAA,EACF,CAAA;AAAA,EAEA,mBAAA,GAAsB;AACpB,IAAA,OAAO;AAAA,MACL;AAAA,QACE,KAAA,EAAO,CAAC,WAAW,CAAA;AAAA,QACnB,UAAA,EAAY;AAAA,UACV,UAAA,EAAY;AAAA,YACV,OAAA,EAAS,IAAA;AAAA,YACT,SAAA,EAAW,CAAC,OAAA,KAAyB;AACnC,cAAA,OAAO,QAAQ,KAAA,CAAM,UAAA,CAAW,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA,IAAK,IAAA;AAAA,YAC3D,CAAA;AAAA,YACA,UAAA,EAAY,CAAC,UAAA,KAAwC;AACnD,cAAA,MAAM,UAAA,GAAa,WAAW,YAAY,CAAA;AAC1C,cAAA,IAAI,CAAC,YAAY,OAAO,IAAA;AAExB,cAAA,MAAM,QAAQ,UAAA,CAAW,QAAA,CAAS,GAAG,CAAA,GAAI,CAAA,CAAA,EAAI,UAAU,CAAA,CAAA,CAAA,GAAM,UAAA;AAC7D,cAAA,OAAO,EAAE,KAAA,EAAO,CAAA,aAAA,EAAgB,KAAK,CAAA,CAAA,EAAG;AAAA,YAC1C;AAAA;AACF;AACF;AACF,KACF;AAAA,EACF,CAAA;AAAA,EAEA,WAAA,GAAc;AACZ,IAAA,OAAO;AAAA,MACL,eACE,CAAC,UAAA,KACD,CAAC,EAAE,UAAS,KAAM;AAChB,QAAA,OAAO,QAAA,CAAS,OAAA,CAAQ,WAAA,EAAa,EAAE,YAAY,CAAA;AAAA,MACrD,CAAA;AAAA,MAEF,eAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM;AAChB,QAAA,IAAI,CAAC,SAAS,OAAA,CAAQ,WAAA,EAAa,EAAE,UAAA,EAAY,IAAA,EAAM,CAAA,EAAG,OAAO,KAAA;AACjE,QAAA,QAAA,CAAS,oBAAA,EAAqB;AAC9B,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,KACJ;AAAA,EACF,CAAA;AAAA,EAEA,aAAA,GAAgB;AACd,IAAA,OAAO,CAAC,SAAS,CAAA;AAAA,EACnB,CAAA;AAAA,EAEA,eAAA,GAAiC;AAC/B,IAAA,IAAI,KAAK,OAAA,CAAQ,YAAA,CAAa,MAAA,KAAW,CAAA,SAAU,EAAC;AAEpD,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,UAAA;AAAA,QACN,IAAA,EAAM,YAAA;AAAA,QACN,IAAA,EAAM,QAAA;AAAA,QACN,KAAA,EAAO,aAAA;AAAA,QACP,KAAA,EAAO,WAAA;AAAA,QACP,QAAA,EAAU,GAAA;AAAA,QACV,WAAA,EAAa,MAAA;AAAA,QACb,YAAA,EAAc,IAAA;AAAA,QACd,qBAAA,EAAuB,aAAA;AAAA,QACvB,OAAO,IAAA,CAAK,OAAA,CAAQ,aAAa,GAAA,CAAI,CAAC,MAAM,CAAA,MAAO;AAAA,UACjD,IAAA,EAAM,QAAA;AAAA,UACN,IAAA,EAAM,cAAc,IAAI,CAAA,CAAA;AAAA,UACxB,OAAA,EAAS,eAAA;AAAA,UACT,WAAA,EAAa,CAAC,IAAI,CAAA;AAAA,UAClB,QAAA,EAAU,EAAE,IAAA,EAAM,WAAA,EAAa,YAAY,EAAE,UAAA,EAAY,MAAK,EAAE;AAAA,UAChE,IAAA,EAAM,QAAA;AAAA,UACN,KAAA,EAAO,IAAA;AAAA,UACP,KAAA,EAAO,gBAAgB,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,GAAI,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,CAAA,GAAM,IAAI,CAAA,CAAA;AAAA,UAC9D,UAAU,GAAA,GAAM;AAAA,SAClB,CAAE;AAAA;AACJ,KACF;AAAA,EACF;AACF,CAAC;;;AC9EM,IAAM,QAAA,GAAW,UAAU,MAAA,CAAwB;AAAA,EACxD,IAAA,EAAM,UAAA;AAAA,EAEN,YAAA,EAAc,CAAC,WAAW,CAAA;AAAA,EAE1B,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,WAAW,CAAC,MAAA,EAAQ,QAAQ,MAAA,EAAQ,MAAA,EAAQ,QAAQ,MAAM,CAAA;AAAA,MAC1D,SAAA,EAAW;AAAA,KACb;AAAA,EACF,CAAA;AAAA,EAEA,mBAAA,GAAsB;AACpB,IAAA,OAAO;AAAA,MACL;AAAA,QACE,KAAA,EAAO,CAAC,WAAW,CAAA;AAAA,QACnB,UAAA,EAAY;AAAA,UACV,QAAA,EAAU;AAAA,YACR,OAAA,EAAS,IAAA;AAAA,YACT,SAAA,EAAW,CAAC,OAAA,KAAyB;AACnC,cAAA,OAAO,OAAA,CAAQ,MAAM,QAAA,IAAY,IAAA;AAAA,YACnC,CAAA;AAAA,YACA,UAAA,EAAY,CAAC,UAAA,KAAwC;AACnD,cAAA,MAAM,QAAA,GAAW,WAAW,UAAU,CAAA;AACtC,cAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAEtB,cAAA,OAAO,EAAE,KAAA,EAAO,CAAA,WAAA,EAAc,QAAQ,CAAA,CAAA,EAAG;AAAA,YAC3C;AAAA;AACF;AACF;AACF,KACF;AAAA,EACF,CAAA;AAAA,EAEA,WAAA,GAAc;AACZ,IAAA,OAAO;AAAA,MACL,aACE,CAAC,QAAA,KACD,CAAC,EAAE,UAAS,KAAM;AAChB,QAAA,OAAO,QAAA,CAAS,OAAA,CAAQ,WAAA,EAAa,EAAE,UAAU,CAAA;AAAA,MACnD,CAAA;AAAA,MAEF,aAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM;AAChB,QAAA,IAAI,CAAC,SAAS,OAAA,CAAQ,WAAA,EAAa,EAAE,QAAA,EAAU,IAAA,EAAM,CAAA,EAAG,OAAO,KAAA;AAC/D,QAAA,QAAA,CAAS,oBAAA,EAAqB;AAC9B,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,KACJ;AAAA,EACF,CAAA;AAAA,EAEA,aAAA,GAAgB;AACd,IAAA,OAAO,CAAC,SAAS,CAAA;AAAA,EACnB,CAAA;AAAA,EAEA,eAAA,GAAiC;AAC/B,IAAA,IAAI,KAAK,OAAA,CAAQ,SAAA,CAAU,MAAA,KAAW,CAAA,SAAU,EAAC;AAEjD,IAAA,MAAM,KAAA,GAAQ,KAAK,OAAA,CAAQ,SAAA;AAE3B,IAAA,MAAM,KAAA,GAAyB,KAAA,CAAM,GAAA,CAAI,CAAC,MAAM,CAAA,MAAO;AAAA,MACrD,IAAA,EAAM,QAAA;AAAA,MACN,IAAA,EAAM,YAAY,IAAI,CAAA,CAAA;AAAA,MACtB,OAAA,EAAS,aAAA;AAAA,MACT,WAAA,EAAa,CAAC,IAAI,CAAA;AAAA,MAClB,QAAA,EAAU,EAAE,IAAA,EAAM,WAAA,EAAa,YAAY,EAAE,QAAA,EAAU,MAAK,EAAE;AAAA,MAC9D,IAAA,EAAM,UAAA;AAAA,MACN,KAAA,EAAO,IAAA;AAAA,MACP,UAAU,GAAA,GAAM;AAAA,KAClB,CAAE,CAAA;AAEF,IAAA,IAAI,IAAA,CAAK,QAAQ,SAAA,EAAW;AAC1B,MAAA,KAAA,CAAM,IAAA,CAAK;AAAA,QACT,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,eAAA;AAAA,QACN,OAAA,EAAS,eAAA;AAAA,QACT,IAAA,EAAM,UAAA;AAAA,QACN,KAAA,EAAO,QAAA;AAAA,QACP,QAAA,EAAU;AAAA,OACX,CAAA;AAAA,IACH;AAEA,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,UAAA;AAAA,QACN,IAAA,EAAM,UAAA;AAAA,QACN,IAAA,EAAM,UAAA;AAAA,QACN,KAAA,EAAO,WAAA;AAAA,QACP,KAAA,EAAO,WAAA;AAAA,QACP,QAAA,EAAU,GAAA;AAAA,QACV,WAAA,EAAa,MAAA;AAAA,QACb,YAAA,EAAc,IAAA;AAAA,QACd,oBAAA,EAAsB,MAAA;AAAA,QACtB,qBAAA,EAAuB,WAAA;AAAA,QACvB;AAAA;AACF,KACF;AAAA,EACF;AACF,CAAC;;;AChHM,IAAM,4BAAA,GAAkD,OAAO,MAAA,CAAO;AAAA,EAC3E,MAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAC;AAkBM,IAAM,iBAAA,GAAoB,UAAU,MAAA,CAGzC;AAAA,EACA,IAAA,EAAM,mBAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMN,YAAA,EAAc,CAAC,WAAW,CAAA;AAAA,EAE1B,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,OAAA,EAAS;AAAA,KACX;AAAA,EACF,CAAA;AAAA,EAEA,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ;AAAA,KACV;AAAA,EACF,CAAA;AAAA,EAEA,eAAA,GAAiC;AAC/B,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,aAAA;AAAA;AAAA;AAAA;AAAA,QAIN,OAAA,EAAS,OAAA;AAAA;AAAA;AAAA;AAAA,QAIT,IAAA,EAAM,gBAAA;AAAA,QACN,KAAA,EAAO,2BAAA;AAAA,QACP,SAAA,EAAW,iBAAA;AAAA,QACX,KAAA,EAAO,WAAA;AAAA,QACP,QAAA,EAAU,GAAA;AAAA;AAAA;AAAA;AAAA,QAIV,OAAA,EAAS;AAAA;AACX,KACF;AAAA,EACF;AACF,CAAC;;;ACzFM,IAAM,eAAA,GAAkB,UAAU,MAAA,CAAO;AAAA,EAC9C,IAAA,EAAM,iBAAA;AAAA,EAEN,eAAA,GAAiC;AAC/B,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,iBAAA;AAAA,QACN,OAAA,EAAS,eAAA;AAAA,QACT,IAAA,EAAM,YAAA;AAAA,QACN,KAAA,EAAO,kBAAA;AAAA,QACP,KAAA,EAAO,WAAA;AAAA,QACP,QAAA,EAAU;AAAA;AACZ,KACF;AAAA,EACF;AACF,CAAC;ACAD,IAAM,oBAAA,GAAuB,IAAIgC,eAAAA,CAAU,aAAa,CAAA;AAExD,SAAS,iBAAA,CAAkB,EAAE,MAAA,EAAQ,QAAA,EAAU,WAAU,EAAqC;AAE5F,EAAA,MAAM,EAAA,GAAK,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACvC,EAAA,EAAA,CAAG,SAAA,GAAY,iBAAA;AACf,EAAA,EAAA,CAAG,YAAA,CAAa,qBAAqB,EAAE,CAAA;AACvC,EAAA,EAAA,CAAG,MAAM,OAAA,GAAU,MAAA;AAEnB,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAC5C,EAAA,KAAA,CAAM,IAAA,GAAO,KAAA;AACb,EAAA,KAAA,CAAM,WAAA,GAAc,cAAA;AACpB,EAAA,KAAA,CAAM,SAAA,GAAY,uBAAA;AAClB,EAAA,KAAA,CAAM,YAAA,CAAa,cAAc,KAAK,CAAA;AAEtC,EAAA,MAAM,QAAA,GAAW,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAChD,EAAA,QAAA,CAAS,IAAA,GAAO,QAAA;AAChB,EAAA,QAAA,CAAS,SAAA,GAAY,2CAAA;AACrB,EAAA,QAAA,CAAS,KAAA,GAAQ,YAAA;AACjB,EAAA,QAAA,CAAS,YAAA,CAAa,cAAc,YAAY,CAAA;AAChD,EAAA,QAAA,CAAS,SAAA,GAAY,YAAA,CAAa,OAAO,CAAA,IAAK,EAAA;AAE9C,EAAA,MAAM,SAAA,GAAY,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AACjD,EAAA,SAAA,CAAU,IAAA,GAAO,QAAA;AACjB,EAAA,SAAA,CAAU,SAAA,GAAY,4CAAA;AACtB,EAAA,SAAA,CAAU,KAAA,GAAQ,aAAA;AAClB,EAAA,SAAA,CAAU,YAAA,CAAa,cAAc,aAAa,CAAA;AAClD,EAAA,SAAA,CAAU,SAAA,GAAY,YAAA,CAAa,WAAW,CAAA,IAAK,EAAA;AAEnD,EAAA,EAAA,CAAG,YAAY,KAAK,CAAA;AACpB,EAAA,EAAA,CAAG,YAAY,QAAQ,CAAA;AACvB,EAAA,EAAA,CAAG,YAAY,SAAS,CAAA;AAExB,EAAA,IAAI,MAAA,GAAS,KAAA;AACb,EAAA,IAAI,eAAA,GAAkB,KAAA;AACtB,EAAA,IAAI,eAAA,GAAuC,IAAA;AAC3C,EAAA,IAAI,YAAA,GAAmC,IAAA;AAGvC,EAAA,MAAM,kBAAA,GAAqB,CAAC,KAAA,KAAyB;AACnD,IAAA,MAAM,WAAA,GAAc,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA;AACzC,IAAA,IAAI,WAAA,EAAa,WAAA,CAAY,QAAQ,CAAA,GAAI,KAAA;AAAA,EAC3C,CAAA;AAEA,EAAA,MAAM,IAAA,GAAO,CAAC,aAAA,KAAsC;AAClD,IAAA,YAAA,GAAe,aAAA,IAAiB,IAAA;AAEhC,IAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAA,CAAO,IAAA;AACzB,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,KAAA,CAAM,SAAA;AAC9B,IAAA,IAAI,YAAA,GAA8B,IAAA;AAElC,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,GAAA,CAAI,OAAA,CAAQ,IAAI,CAAA;AACnC,MAAA,MAAM,QAAA,GAAW,KAAK,KAAA,EAAM,CAAE,KAAK,CAAC,CAAA,KAAkC,CAAA,CAAE,IAAA,KAAS,QAAQ,CAAA;AACzF,MAAA,YAAA,GAAe,QAAA,GAAY,QAAA,CAAS,KAAA,CAAkC,MAAM,CAAA,GAAc,IAAA;AAAA,IAC5F,CAAA,MAAO;AAEL,MAAA,MAAM,EAAE,EAAA,EAAG,GAAI,KAAA,CAAM,SAAA;AACrB,MAAA,KAAA,CAAM,GAAA,CAAI,YAAA,CAAa,IAAA,EAAM,EAAA,EAAI,CAAC,IAAA,KAAS;AACzC,QAAA,IAAI,cAAc,OAAO,KAAA;AACzB,QAAA,MAAM,QAAA,GAAW,KAAK,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAkC,CAAA,CAAE,SAAS,QAAQ,CAAA;AACvF,QAAA,IAAI,QAAA,EAAU,YAAA,GAAgB,QAAA,CAAS,KAAA,CAAkC,MAAM,CAAA;AAC/E,QAAA,OAAO,IAAA;AAAA,MACT,CAAC,CAAA;AAAA,IACH;AAEA,IAAA,eAAA,GAAkB,YAAA,KAAiB,IAAA;AACnC,IAAA,KAAA,CAAM,QAAQ,YAAA,IAAgB,EAAA;AAC9B,IAAA,SAAA,CAAU,KAAA,CAAM,OAAA,GAAU,eAAA,GAAkB,EAAA,GAAK,MAAA;AAEjD,IAAA,EAAA,CAAG,MAAM,OAAA,GAAU,EAAA;AACnB,IAAA,EAAA,CAAG,YAAA,CAAa,aAAa,EAAE,CAAA;AAC/B,IAAA,MAAA,GAAS,IAAA;AACT,IAAA,kBAAA,CAAmB,IAAI,CAAA;AAOvB,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,MAAM,EAAE,EAAA,EAAG,GAAI,KAAA,CAAM,SAAA;AACrB,MAAA,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,KAAA,CAAM,EAAA,CAAG,OAAA,CAAQ,sBAAsB,EAAE,IAAA,EAAM,EAAA,EAAI,CAAC,CAAA;AAAA,IAC3E,CAAA,MAAO;AAEL,MAAA,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,IAAA,CAAK,MAAM,EAAE,CAAA;AAAA,IAC3C;AAGA,IAAA,MAAM,YAAgE,aAAA,IAAiB;AAAA,MACrF,uBAAuB,MAAM;AAC3B,QAAA,MAAM,MAAA,GAAS,MAAA,CAAO,IAAA,CAAK,WAAA,CAAY,IAAI,CAAA;AAC3C,QAAA,OAAO,IAAI,OAAA,CAAQ,MAAA,CAAO,IAAA,EAAM,MAAA,CAAO,KAAK,CAAA,EAAG,MAAA,CAAO,MAAA,GAAS,MAAA,CAAO,GAAG,CAAA;AAAA,MAC3E;AAAA,KACF;AAQA,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,MAAM,QAAA,GAAW,aAAA,CAAc,OAAA,CAAqB,YAAY,CAAA;AAChE,MAAA,IAAI,QAAA,IAAY,EAAA,CAAG,aAAA,KAAkB,QAAA,EAAU;AAC7C,QAAA,QAAA,CAAS,YAAY,EAAE,CAAA;AAAA,MACzB;AAAA,IACF,CAAA,MAAA,IAAW,EAAA,CAAG,aAAA,KAAkB,QAAA,CAAS,IAAA,EAAM;AAC7C,MAAA,QAAA,CAAS,IAAA,CAAK,YAAY,EAAE,CAAA;AAAA,IAC9B;AAKA,IAAA,cAAA,CAAe,MAAA,CAAO,MAAM,EAAE,CAAA;AAE9B,IAAA,eAAA,IAAkB;AAClB,IAAA,eAAA,GAAkB,gBAAA,CAAiB,WAAW,EAAA,EAAI;AAAA,MAChD,SAAA,EAAW,gBAAgB,cAAA,GAAiB,QAAA;AAAA,MAC5C,WAAA,EAAa;AAAA,KACd,CAAA;AAED,IAAA,KAAA,CAAM,KAAA,EAAM;AACZ,IAAA,KAAA,CAAM,MAAA,EAAO;AAAA,EACf,CAAA;AAEA,EAAA,MAAMP,QAAO,MAAY;AACvB,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,YAAA,GAAe,IAAA;AACf,IAAA,eAAA,IAAkB;AAClB,IAAA,eAAA,GAAkB,IAAA;AAClB,IAAA,EAAA,CAAG,gBAAgB,WAAW,CAAA;AAC9B,IAAA,EAAA,CAAG,MAAM,OAAA,GAAU,MAAA;AACnB,IAAA,MAAA,GAAS,KAAA;AACT,IAAA,kBAAA,CAAmB,KAAK,CAAA;AAGxB,IAAA,MAAA,CAAO,IAAA,CAAK,SAAS,MAAA,CAAO,IAAA,CAAK,MAAM,EAAA,CAAG,OAAA,CAAQ,oBAAA,EAAsB,IAAI,CAAC,CAAA;AAC7E,IAAA,KAAA,CAAM,KAAA,GAAQ,EAAA;AAAA,EAChB,CAAA;AAEA,EAAA,MAAM,YAAY,MAAY;AAC5B,IAAA,IAAI,IAAA,GAAO,KAAA,CAAM,KAAA,CAAM,IAAA,EAAK;AAC5B,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAAA,KAAAA,EAAK;AACL,MAAA,MAAA,CAAO,KAAK,KAAA,EAAM;AAClB,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,CAAC,sBAAA,CAAuB,IAAA,CAAK,IAAI,CAAA,EAAG;AACtC,MAAA,IAAA,GAAO,UAAA,GAAa,IAAA;AAAA,IACtB;AAEA,IAAA,IAAI,CAAC,UAAA,CAAW,IAAA,EAAM,EAAE,SAAA,EAAW,CAAA,EAAG;AACpC,MAAAA,KAAAA,EAAK;AACL,MAAA,MAAA,CAAO,KAAK,KAAA,EAAM;AAClB,MAAA;AAAA,IACF;AAIA,IAAA,MAAM,SAAEnC,OAAA,EAAM,GAAI,MAAA,CAAO,IAAA;AACzB,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAIA,OAAA,CAAM,SAAA;AAE9B,IAAA,IAAI,SAAS,eAAA,EAAiB;AAC5B,MAAA,MAAM,IAAA,GAAOA,OAAA,CAAM,GAAA,CAAI,OAAA,CAAQ,IAAI,CAAA;AACnC,MAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,IAAA,EAAM,QAAQ,CAAA;AACzC,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,MAAM,EAAA,GAAKA,OAAA,CAAM,EAAA,CACd,YAAA,CAAaC,mBAAAA,CAAc,OAAOD,OAAA,CAAM,GAAA,EAAK,KAAA,CAAM,IAAA,EAAM,KAAA,CAAM,EAAE,CAAC,CAAA,CAClE,OAAA,CAAQ,KAAA,CAAM,IAAA,EAAM,KAAA,CAAM,EAAA,EAAI,SAAS,MAAA,CAAO,EAAE,IAAA,EAAM,CAAC,CAAA;AAC1D,QAAA,MAAA,CAAO,IAAA,CAAK,SAAS,EAAE,CAAA;AACvB,QAAAmC,KAAAA,EAAK;AACL,QAAA,MAAA,CAAO,KAAK,KAAA,EAAM;AAClB,QAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,EAAE,IAAA,EAAM,CAAA;AAChC,IAAAA,KAAAA,EAAK;AACL,IAAA,MAAA,CAAO,KAAK,KAAA,EAAM;AAAA,EACpB,CAAA;AAEA,EAAA,MAAM,aAAa,MAAY;AAC7B,IAAA,MAAA,CAAO,SAAS,SAAA,EAAU;AAC1B,IAAAA,KAAAA,EAAK;AACL,IAAA,MAAA,CAAO,KAAK,KAAA,EAAM;AAAA,EACpB,CAAA;AAGA,EAAA,MAAM,UAAA,GAAa,CAAC,IAAA,KAAgD;AAClE,IAAA,IAAI,MAAA,EAAQ;AACV,MAAAA,KAAAA,EAAK;AACL,MAAA,MAAA,CAAO,KAAK,KAAA,EAAM;AAAA,IACpB,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,KAAK,aAAa,CAAA;AAAA,IACzB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,cAAA,GAAiB,CAAC,CAAA,KAA2B;AACjD,IAAA,IAAI,CAAA,CAAE,QAAQ,OAAA,EAAS;AACrB,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,SAAA,EAAU;AAAA,IACZ,CAAA,MAAA,IAAW,CAAA,CAAE,GAAA,KAAQ,QAAA,EAAU;AAC7B,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAAA,KAAAA,EAAK;AACL,MAAA,MAAA,CAAO,KAAK,KAAA,EAAM;AAAA,IACpB,CAAA,MAAA,IAAW,CAAA,CAAE,GAAA,KAAQ,KAAA,EAAO;AAC1B,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,IAAI,EAAE,QAAA,EAAU;AACd,QAAA,CAAC,eAAA,GAAkB,SAAA,GAAY,QAAA,EAAU,KAAA,EAAM;AAAA,MACjD,CAAA,MAAO;AACL,QAAA,QAAA,CAAS,KAAA,EAAM;AAAA,MACjB;AAAA,IACF;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,eAAA,GAAkB,CAAC,CAAA,KAA2B;AAClD,IAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AACtB,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAAA,KAAAA,EAAK;AACL,MAAA,MAAA,CAAO,KAAK,KAAA,EAAM;AAAA,IACpB,CAAA,MAAA,IAAW,CAAA,CAAE,GAAA,KAAQ,KAAA,EAAO;AAC1B,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,MAAM,SAAS,CAAA,CAAE,MAAA;AACjB,MAAA,IAAI,EAAE,QAAA,EAAU;AACd,QAAA,IAAI,WAAW,QAAA,EAAU;AACvB,UAAA,KAAA,CAAM,KAAA,EAAM;AAAA,QACd,CAAA,MAAO;AACL,UAAA,QAAA,CAAS,KAAA,EAAM;AAAA,QACjB;AAAA,MACF,CAAA,MAAO;AACL,QAAA,IAAI,MAAA,KAAW,YAAY,eAAA,EAAiB;AAC1C,UAAA,SAAA,CAAU,KAAA,EAAM;AAAA,QAClB,CAAA,MAAO;AACL,UAAA,KAAA,CAAM,KAAA,EAAM;AAAA,QACd;AAAA,MACF;AAAA,IACF,CAAA,MAAA,IAAW,CAAA,CAAE,GAAA,KAAQ,OAAA,EAAS;AAC5B,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAC,CAAA,CAAE,OAAuB,KAAA,EAAM;AAAA,IAClC;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,cAAA,GAAiB,CAAC,CAAA,KAAwB;AAC9C,IAAA,IAAI,CAAC,MAAA,IAAU,EAAA,CAAG,QAAA,CAAS,CAAA,CAAE,MAAc,CAAA,EAAG;AAG9C,IAAA,IAAI,YAAA,KAAiB,iBAAiB,CAAA,CAAE,MAAA,IAAU,aAAa,QAAA,CAAS,CAAA,CAAE,MAAc,CAAA,CAAA,EAAI;AAC5F,IAAAA,KAAAA,EAAK;AAAA,EACP,CAAA;AAEA,EAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAAwB;AAC7C,IAAA,CAAA,CAAE,cAAA,EAAe;AAAA,EACnB,CAAA;AAEA,EAAA,OAAO,IAAIjC,YAAAA,CAAO;AAAA,IAChB,GAAA,EAAK,oBAAA;AAAA,IAEL,KAAA,EAAO;AAAA,MACL,IAAA,GAAO;AACL,QAAA,OAAOuD,kBAAAA,CAAc,KAAA;AAAA,MACvB,CAAA;AAAA,MACA,KAAA,CAAM,IAAI,WAAA,EAAa;AACrB,QAAA,MAAM,IAAA,GAAO,EAAA,CAAG,OAAA,CAAQ,oBAAoB,CAAA;AAC5C,QAAA,IAAI,IAAA,KAAS,IAAA,EAAM,OAAOA,kBAAAA,CAAc,KAAA;AACxC,QAAA,IAAI,IAAA,EAAM;AACR,UAAA,OAAOA,kBAAAA,CAAc,MAAA,CAAO,EAAA,CAAG,GAAA,EAAK;AAAA,YAClCE,eAAAA,CAAW,OAAO,IAAA,CAAK,IAAA,EAAM,KAAK,EAAA,EAAI,EAAE,KAAA,EAAO,iBAAA,EAAmB;AAAA,WACnE,CAAA;AAAA,QACH;AACA,QAAA,OAAO,WAAA,CAAY,GAAA,CAAI,EAAA,CAAG,OAAA,EAAS,GAAG,GAAG,CAAA;AAAA,MAC3C;AAAA,KACF;AAAA,IAEA,KAAA,EAAO;AAAA,MACL,YAAY,KAAA,EAAO;AACjB,QAAA,OAAO,oBAAA,CAAqB,SAAS,KAAK,CAAA;AAAA,MAC5C;AAAA,KACF;AAAA,IAEA,MAAM,MAAM;AAEV,MAAA,QAAA,CAAS,IAAA,CAAK,YAAY,EAAE,CAAA;AAI5B,MAAA,KAAA,CAAM,gBAAA,CAAiB,WAAW,cAAc,CAAA;AAChD,MAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,aAAa,CAAA;AACpD,MAAA,QAAA,CAAS,gBAAA,CAAiB,SAAS,SAAS,CAAA;AAC5C,MAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,eAAe,CAAA;AACpD,MAAA,SAAA,CAAU,gBAAA,CAAiB,aAAa,aAAa,CAAA;AACrD,MAAA,SAAA,CAAU,gBAAA,CAAiB,SAAS,UAAU,CAAA;AAC9C,MAAA,SAAA,CAAU,gBAAA,CAAiB,WAAW,eAAe,CAAA;AACrD,MAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,cAAc,CAAA;AACrD,MAAA,MAAA,CAAO,EAAA,CAAG,YAAY,UAAU,CAAA;AAEhC,MAAA,OAAO;AAAA,QACL,SAAS,MAAM;AACb,UAAAxB,KAAAA,EAAK;AACL,UAAA,KAAA,CAAM,mBAAA,CAAoB,WAAW,cAAc,CAAA;AACnD,UAAA,QAAA,CAAS,mBAAA,CAAoB,aAAa,aAAa,CAAA;AACvD,UAAA,QAAA,CAAS,mBAAA,CAAoB,SAAS,SAAS,CAAA;AAC/C,UAAA,QAAA,CAAS,mBAAA,CAAoB,WAAW,eAAe,CAAA;AACvD,UAAA,SAAA,CAAU,mBAAA,CAAoB,aAAa,aAAa,CAAA;AACxD,UAAA,SAAA,CAAU,mBAAA,CAAoB,SAAS,UAAU,CAAA;AACjD,UAAA,SAAA,CAAU,mBAAA,CAAoB,WAAW,eAAe,CAAA;AACxD,UAAA,QAAA,CAAS,mBAAA,CAAoB,aAAa,cAAc,CAAA;AACxD,UAAA,MAAA,CAAO,GAAA,CAAI,YAAY,UAAU,CAAA;AACjC,UAAA,EAAA,CAAG,MAAA,EAAO;AAAA,QACZ;AAAA,OACF;AAAA,IACF;AAAA,GACD,CAAA;AACH;AAEO,IAAM,WAAA,GAAc,UAAU,MAAA,CAA2B;AAAA,EAC9D,IAAA,EAAM,aAAA;AAAA,EAEN,YAAA,EAAc,CAAC,MAAM,CAAA;AAAA,EAErB,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,SAAA,EAAW,CAAC,OAAA,EAAS,QAAA,EAAU,WAAW,MAAM;AAAA,KAClD;AAAA,EACF,CAAA;AAAA,EAEA,qBAAA,GAAwB;AACtB,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA;AAC3C,IAAA,IAAI,CAAC,QAAA,EAAU,OAAO,EAAC;AAEvB,IAAA,OAAO;AAAA,MACL,iBAAA,CAAkB;AAAA,QAChB,MAAA;AAAA,QACA,QAAA;AAAA,QACA,SAAA,EAAW,KAAK,OAAA,CAAQ;AAAA,OACzB;AAAA,KACH;AAAA,EACF;AACF,CAAC;ACpXM,IAAM,mBAAA,GAAsB,IAAIO,eAAAA,CAAU,YAAY;AAG7D,SAAS,iBAAA,CAAkB;AAAA,EACzB,MAAA;AAAA,SACA1C,OAAA;AAAA,EACA,IAAA;AAAA,EACA;AACF,CAAA,EAMY;AACV,EAAA,MAAM,EAAE,WAAU,GAAIA,OAAA;AAGtB,EAAA,IAAI,SAAA,CAAU,OAAO,OAAO,KAAA;AAG5B,EAAA,IAAI,EAAE,SAAA,YAAqBC,mBAAAA,CAAAA,EAAgB,OAAO,KAAA;AAGlD,EAAA,IAAI,CAACD,QAAM,GAAA,CAAI,WAAA,CAAY,MAAM,EAAE,CAAA,CAAE,QAAQ,OAAO,KAAA;AAGpD,EAAA,IAAI,CAAC,MAAA,CAAO,UAAA,EAAY,OAAO,KAAA;AAI/B,EAAA,MAAM,KAAA,GAAQA,OAAA,CAAM,GAAA,CAAI,OAAA,CAAQ,IAAI,CAAA;AACpC,EAAA,KAAA,IAAS,CAAA,GAAI,KAAA,CAAM,KAAA,EAAO,CAAA,GAAI,GAAG,CAAA,EAAA,EAAK;AACpC,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,CAAC,EAAE,IAAA,CAAK,IAAA;AAChC,IAAA,IAAI,IAAA,KAAS,WAAA,IAAe,IAAA,KAAS,aAAA,EAAe,OAAO,KAAA;AAAA,EAC7D;AAEA,EAAA,OAAO,IAAA;AACT;AA6DO,SAAS,uBAAuB,OAAA,EAAgD;AACrF,EAAA,MAAM;AAAA,IACJ,SAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA;AAAA,IACA,UAAA,GAAa,iBAAA;AAAA,IACb,SAAA,GAAY,KAAA;AAAA,IACZ,QAAAgB,OAAAA,GAAS,CAAA;AAAA,IACT,WAAA,GAAc;AAAA,GAChB,GAAI,OAAA;AAEJ,EAAA,IAAI,aAAA,GAAsD,IAAA;AAC1D,EAAA,IAAI,YAAA,GAAqD,IAAA;AACzD,EAAA,IAAI,cAAA,GAAuD,IAAA;AAC3D,EAAA,IAAI,eAAA,GAAuC,IAAA;AAE3C,EAAA,MAAM,cAAA,GAAiB,CAAC,IAAA,EAAkB,IAAA,EAAc,EAAA,KAAqB;AAC3E,IAAA,eAAA,IAAkB;AAKlB,IAAA,MAAM,GAAA,GAAM,KAAK,KAAA,CAAM,SAAA;AACvB,IAAA,IAAI,SAAA,GAAuE,IAAA;AAC3E,IAAA,IAAI,UAAU,GAAA,EAAK;AACjB,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAA;AAC7B,MAAA,IAAI,GAAA,YAAe,aAAa,SAAA,GAAY,GAAA;AAAA,IAC9C;AACA,IAAA,SAAA,KAAc;AAAA,MACZ,uBAAuB,MAAM;AAC3B,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,WAAA,CAAY,IAAI,CAAA;AACnC,QAAA,MAAM,GAAA,GAAM,IAAA,CAAK,WAAA,CAAY,EAAE,CAAA;AAC/B,QAAA,OAAO,IAAI,OAAA;AAAA,UACT,KAAA,CAAM,IAAA;AAAA,UACN,KAAA,CAAM,GAAA;AAAA,UACN,GAAA,CAAI,QAAQ,KAAA,CAAM,IAAA;AAAA,UAClB,GAAA,CAAI,SAAS,KAAA,CAAM;AAAA,SACrB;AAAA,MACF;AAAA,KACF;AAEA,IAAA,eAAA,GAAkB,oBAAA,CAAqB,WAAW,OAAA,EAAS;AAAA,MACzD,SAAA;AAAA,MACA,WAAA,EAAaA;AAAA,KACd,CAAA;AAED,IAAA,OAAA,CAAQ,YAAA,CAAa,aAAa,EAAE,CAAA;AAAA,EACtC,CAAA;AAEA,EAAA,MAAM,WAAW,MAAY;AAC3B,IAAA,eAAA,IAAkB;AAClB,IAAA,eAAA,GAAkB,IAAA;AAClB,IAAA,OAAA,CAAQ,gBAAgB,WAAW,CAAA;AAAA,EACrC,CAAA;AAIA,EAAA,IAAI,UAAA,GAAa,KAAA;AAMjB,EAAA,IAAI,SAAA,GAAY,KAAA;AAEhB,EAAA,MAAM,mBAAA,GAAsB,CAAC,CAAA,KAAwB;AACnD,IAAA,MAAM,SAAS,CAAA,CAAE,MAAA;AACjB,IAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,IAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA,EAAG;AAE9B,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,QAAA,CAAS,MAAM,CAAA,EAAG;AAKtC,IAAA,IAAI,MAAA,YAAkB,WAAA,IAAe,MAAA,CAAO,OAAA,CAAQ,qBAAqB,CAAA,EAAG;AAE5E,IAAA,QAAA,EAAS;AACT,IAAA,UAAA,GAAa,IAAA;AAAA,EACf,CAAA;AAGA,EAAA,MAAM,eAAA,GAAkB,CAAC,CAAA,KAAmB;AAC1C,IAAA,CAAA,CAAE,cAAA,EAAe;AAAA,EACnB,CAAA;AAGA,EAAA,QAAA,EAAS;AAET,EAAA,OAAO,IAAId,YAAAA,CAAO;AAAA,IAChB,GAAA,EAAK,SAAA;AAAA,IAEL,KAAA,EAAO;AAAA,MACL,MAAM,OAA8B;AAAA,QAClC,OAAA,EAAS,KAAA;AAAA,QACT,IAAA,EAAM,CAAA;AAAA,QACN,EAAA,EAAI;AAAA,OACN,CAAA;AAAA,MACA,KAAA,EAAO,CAAC,GAAA,EAAK,SAAA,EAAW,WAAW,QAAA,KAAoC;AACrE,QAAA,MAAM,EAAE,WAAU,GAAI,QAAA;AACtB,QAAA,MAAM,EAAE,IAAA,EAAM,EAAA,EAAG,GAAI,SAAA;AAGrB,QAAA,IAAI,IAAA,KAAS,SAAA,CAAU,IAAA,IAAQ,EAAA,KAAO,UAAU,EAAA,EAAI;AAClD,UAAA,UAAA,GAAa,KAAA;AAAA,QACf;AAGA,QAAA,MAAM,UACJ,CAAC,UAAA,IACD,CAAC,SAAA,CAAU,SACX,UAAA,CAAW;AAAA,UACT,MAAA;AAAA,UACA,MAAM,MAAA,CAAO,IAAA;AAAA,UACb,KAAA,EAAO,QAAA;AAAA,UACP,IAAA;AAAA,UACA;AAAA,SACD,CAAA;AAEH,QAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,EAAA,EAAG;AAAA,MAC7B;AAAA,KACF;AAAA,IAEA,IAAA,EAAM,CAAC,UAAA,KAAe;AAGpB,MAAA,MAAM,QAAA,GAAW,UAAA,CAAW,GAAA,CAAI,OAAA,CAAQ,YAAY,CAAA;AACpD,MAAA,IAAI,QAAA,IAAY,OAAA,CAAQ,aAAA,KAAkB,QAAA,EAAU;AAClD,QAAA,QAAA,CAAS,YAAY,OAAO,CAAA;AAAA,MAC9B;AAGA,MAAA,MAAM,iBAAA,GAAoB,CAAC,CAAA,KAAwB;AACjD,QAAA,IAAI,CAAA,CAAE,WAAW,CAAA,EAAG;AACpB,QAAA,SAAA,GAAY,IAAA;AACZ,QAAA,QAAA,EAAS;AAAA,MACX,CAAA;AACA,MAAA,MAAM,oBAAoB,MAAY;AACpC,QAAA,IAAI,CAAC,SAAA,EAAW;AAChB,QAAA,SAAA,GAAY,KAAA;AAEZ,QAAA,cAAA,GAAiB,WAAW,MAAM;AAChC,UAAA,IAAI,SAAA,EAAW;AACf,UAAA,MAAM,YAAA,GAAe,SAAA,CAAU,QAAA,CAAS,MAAA,CAAO,KAAK,KAAK,CAAA;AAGzD,UAAA,IAAI,cAAc,OAAA,EAAS;AACzB,YAAA,cAAA,CAAe,MAAA,CAAO,IAAA,EAAM,YAAA,CAAa,IAAA,EAAM,aAAa,EAAE,CAAA;AAAA,UAChE;AAAA,QACF,CAAC,CAAA;AAAA,MACH,CAAA;AAEA,MAAA,MAAM,UAAU,MAAY;AAK1B,QAAA,YAAA,GAAe,WAAW,MAAM;AAC9B,UAAA,IAAI,UAAA,EAAY;AACd,YAAA,QAAA,EAAS;AACT,YAAA;AAAA,UACF;AACA,UAAA,IAAI,SAAA,EAAW;AACf,UAAA,MAAM,EAAE,SAAA,EAAU,GAAI,MAAA,CAAO,IAAA,CAAK,KAAA;AAClC,UAAA,MAAM,EAAE,IAAA,EAAM,EAAA,EAAG,GAAI,SAAA;AACrB,UAAA,MAAM,IAAA,GACJ,CAAC,SAAA,CAAU,KAAA,IACX,UAAA,CAAW;AAAA,YACT,MAAA;AAAA,YACA,MAAM,MAAA,CAAO,IAAA;AAAA,YACb,KAAA,EAAO,OAAO,IAAA,CAAK,KAAA;AAAA,YACnB,IAAA;AAAA,YACA;AAAA,WACD,CAAA;AACH,UAAA,IAAI,IAAA,EAAM;AACR,YAAA,cAAA,CAAe,MAAA,CAAO,IAAA,EAAM,IAAA,EAAM,EAAE,CAAA;AAAA,UACtC,CAAA,MAAO;AACL,YAAA,QAAA,EAAS;AAAA,UACX;AAAA,QACF,CAAC,CAAA;AAAA,MACH,CAAA;AAEA,MAAA,MAAM,MAAA,GAAS,CAAC,EAAE,KAAA,EAAM,KAAmC;AAMzD,QAAA,MAAM,UAAU,KAAA,CAAM,aAAA;AACtB,QAAA,IAAI,mBAAmB,WAAA,EAAa;AAClC,UAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,OAAO,CAAA,EAAG;AAC/B,UAAA,IAAI,OAAA,CAAQ,OAAA,CAAQ,qBAAqB,CAAA,EAAG;AAAA,QAC9C;AACA,QAAA,QAAA,EAAS;AAAA,MACX,CAAA;AAGA,MAAA,MAAM,oBAAoB,MAAY;AACpC,QAAA,QAAA,EAAS;AACT,QAAA,UAAA,GAAa,IAAA;AAAA,MACf,CAAA;AAEA,MAAA,OAAA,CAAQ,iBAAiB,WAAA,EAAa,eAAA,EAAiB,EAAE,OAAA,EAAS,MAAM,CAAA;AACxE,MAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,mBAAmB,CAAA;AAC1D,MAAA,UAAA,CAAW,GAAA,CAAI,gBAAA,CAAiB,WAAA,EAAa,iBAAiB,CAAA;AAC9D,MAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,iBAAiB,CAAA;AACtD,MAAA,QAAA,EAAU,gBAAA,CAAiB,uBAAuB,iBAAiB,CAAA;AACnE,MAAA,MAAA,CAAO,EAAA,CAAG,SAAS,OAAO,CAAA;AAC1B,MAAA,MAAA,CAAO,EAAA,CAAG,QAAQ,MAAM,CAAA;AAExB,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,CAAC,IAAA,EAAM,SAAA,KAAc;AAE3B,UAAA,IAAI,KAAK,SAAA,EAAW;AAEpB,UAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,QAAA,CAAS,IAAA,CAAK,KAAK,CAAA;AAG3C,UAAA,MAAM,eAAA,GAAkB,SAAA,CAAU,QAAA,CAAS,SAAS,CAAA;AAOpD,UAAA,IACE,OAAO,OAAA,KAAY,eAAA,EAAiB,WACpC,KAAA,EAAO,IAAA,KAAS,iBAAiB,IAAA,IACjC,KAAA,EAAO,OAAO,eAAA,EAAiB,EAAA,IAC/B,EAAE,KAAA,EAAO,OAAA,IAAW,KAAK,KAAA,CAAM,GAAA,KAAQ,UAAU,GAAA,CAAA,EACjD;AAEA,YAAA,IAAI,CAAC,KAAA,EAAO,OAAA,IAAW,OAAA,CAAQ,YAAA,CAAa,WAAW,CAAA,EAAG;AACxD,cAAA,QAAA,EAAS;AAAA,YACX;AACA,YAAA;AAAA,UACF;AAGA,UAAA,IAAI,aAAA,EAAe;AACjB,YAAA,YAAA,CAAa,aAAa,CAAA;AAC1B,YAAA,aAAA,GAAgB,IAAA;AAAA,UAClB;AAEA,UAAA,IAAI,KAAA,EAAO,OAAA,IAAW,CAAC,SAAA,EAAW;AAEhC,YAAA,IAAI,cAAc,CAAA,EAAG;AACnB,cAAA,aAAA,GAAgB,WAAW,MAAM;AAC/B,gBAAA,cAAA,CAAe,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,KAAA,CAAM,EAAE,CAAA;AAAA,cAC3C,GAAG,WAAW,CAAA;AAAA,YAChB,CAAA,MAAO;AACL,cAAA,cAAA,CAAe,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,KAAA,CAAM,EAAE,CAAA;AAAA,YAC3C;AAAA,UACF,CAAA,MAAO;AACL,YAAA,QAAA,EAAS;AAAA,UACX;AAAA,QACF,CAAA;AAAA,QAEA,SAAS,MAAM;AACb,UAAA,MAAA,CAAO,GAAA,CAAI,SAAS,OAAO,CAAA;AAC3B,UAAA,MAAA,CAAO,GAAA,CAAI,QAAQ,MAAM,CAAA;AACzB,UAAA,OAAA,CAAQ,mBAAA,CAAoB,aAAa,eAAA,EAAiB;AAAA,YACxD,OAAA,EAAS;AAAA,WACV,CAAA;AACD,UAAA,QAAA,CAAS,mBAAA,CAAoB,aAAa,mBAAmB,CAAA;AAC7D,UAAA,UAAA,CAAW,GAAA,CAAI,mBAAA,CAAoB,WAAA,EAAa,iBAAiB,CAAA;AACjE,UAAA,QAAA,CAAS,mBAAA,CAAoB,WAAW,iBAAiB,CAAA;AACzD,UAAA,QAAA,EAAU,mBAAA,CAAoB,uBAAuB,iBAAiB,CAAA;AACtE,UAAA,IAAI,aAAA,EAAe;AACjB,YAAA,YAAA,CAAa,aAAa,CAAA;AAAA,UAC5B;AACA,UAAA,IAAI,YAAA,EAAc;AAChB,YAAA,YAAA,CAAa,YAAY,CAAA;AAAA,UAC3B;AACA,UAAA,IAAI,cAAA,EAAgB;AAClB,YAAA,YAAA,CAAa,cAAc,CAAA;AAAA,UAC7B;AACA,UAAA,QAAA,EAAS;AAAA,QACX;AAAA,OACF;AAAA,IACF;AAAA,GACD,CAAA;AACH;AAEO,IAAM,UAAA,GAAa,UAAU,MAAA,CAA0B;AAAA,EAC5D,IAAA,EAAM,YAAA;AAAA,EAEN,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA;AAAA,MACT,WAAA,EAAa,CAAA;AAAA,MACb,UAAA,EAAY,iBAAA;AAAA,MACZ,SAAA,EAAW,KAAA;AAAA,MACX,MAAA,EAAQ;AAAA,KACV;AAAA,EACF,CAAA;AAAA,EAEA,qBAAA,GAAwB;AACtB,IAAA,MAAM,EAAE,SAAS,WAAA,EAAa,UAAA,EAAY,WAAW,MAAA,EAAAc,OAAAA,KACnD,IAAA,CAAK,OAAA;AAEP,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAO,EAAC;AAAA,IACV;AAEA,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,OAAO,EAAC;AAAA,IACV;AAEA,IAAA,OAAO;AAAA,MACL,sBAAA,CAAuB;AAAA,QACrB,SAAA,EAAW,mBAAA;AAAA,QACX,MAAA;AAAA,QACA,OAAA;AAAA,QACA,UAAA;AAAA,QACA,SAAA;AAAA,QACA,MAAA,EAAAA,OAAAA;AAAA,QACA;AAAA,OACD;AAAA,KACH;AAAA,EACF;AACF,CAAC;;;ACrQM,IAAM,UAAA,GAAa,UAAU,MAAA,CAA0B;AAAA,EAC5D,IAAA,EAAM,YAAA;AAAA,EAEN,UAAA,GAAa;AACX,IAAA,OAAO,EAAC;AAAA,EACV,CAAA;AAAA,EAEA,aAAA,GAAgB;AACd,IAAA,MAAM,aAAmC,EAAC;AAG1C,IAAA,MAAM,QAAA,GAAW,CACf,GAAA,EACA,IAAA,KACS;AACT,MAAA,IAAI,SAAS,KAAA,EAAO;AACpB,MAAA,IAAI,QAAQ,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,CAAE,SAAS,CAAA,EAAG;AACxC,QAAA,UAAA,CAAW,IAAA,CAAK,GAAA,CAAI,SAAA,CAAU,IAAI,CAAC,CAAA;AAAA,MACrC,CAAA,MAAO;AACL,QAAA,UAAA,CAAW,KAAK,GAAG,CAAA;AAAA,MACrB;AAAA,IACF,CAAA;AAGA,IAAA,QAAA,CAAS,QAAA,EAAmB,IAAA,CAAK,OAAA,CAAQ,QAAiB,CAAA;AAC1D,IAAA,QAAA,CAAS,IAAA,EAAe,IAAA,CAAK,OAAA,CAAQ,IAAa,CAAA;AAClD,IAAA,QAAA,CAAS,SAAA,EAAW,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAA;AAC1C,IAAA,QAAA,CAAS,OAAA,EAAS,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAA;AACtC,IAAA,QAAA,CAAS,UAAA,EAAY,IAAA,CAAK,OAAA,CAAQ,UAAU,CAAA;AAC5C,IAAA,QAAA,CAAS,SAAA,EAAW,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAA;AAC1C,IAAA,QAAA,CAAS,UAAA,EAAY,IAAA,CAAK,OAAA,CAAQ,UAAU,CAAA;AAC5C,IAAA,QAAA,CAAS,WAAA,EAAa,IAAA,CAAK,OAAA,CAAQ,WAAW,CAAA;AAC9C,IAAA,QAAA,CAAS,QAAA,EAAU,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA;AACxC,IAAA,QAAA,CAAS,cAAA,EAAgB,IAAA,CAAK,OAAA,CAAQ,cAAc,CAAA;AACpD,IAAA,QAAA,CAAS,SAAA,EAAW,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAA;AAC1C,IAAA,QAAA,CAAS,QAAA,EAAU,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA;AACxC,IAAA,QAAA,CAAS,QAAA,EAAU,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA;AAGxC,IAAA,QAAA,CAAS,IAAA,EAAM,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAA;AAChC,IAAA,QAAA,CAAS,MAAA,EAAQ,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA;AACpC,IAAA,QAAA,CAAS,SAAA,EAAW,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAA;AAC1C,IAAA,QAAA,CAAS,MAAA,EAAQ,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA;AACpC,IAAA,QAAA,CAAS,IAAA,EAAM,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAA;AAChC,IAAA,QAAA,CAAS,IAAA,EAAM,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAA;AAGhC,IAAA,QAAA,CAAS,UAAA,EAAY,IAAA,CAAK,OAAA,CAAQ,UAAU,CAAA;AAC5C,IAAA,QAAA,CAAS,OAAA,EAAS,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAA;AACtC,IAAA,QAAA,CAAS,UAAA,EAAY,IAAA,CAAK,OAAA,CAAQ,UAAU,CAAA;AAC5C,IAAA,QAAA,CAAS,SAAA,EAAoB,IAAA,CAAK,OAAA,CAAQ,SAAkB,CAAA;AAC5D,IAAA,QAAA,CAAS,YAAA,EAAc,IAAA,CAAK,OAAA,CAAQ,YAAY,CAAA;AAChD,IAAA,QAAA,CAAS,UAAA,EAAY,IAAA,CAAK,OAAA,CAAQ,UAAU,CAAA;AAM5C,IAAA,QAAA,CAAS,UAAA,EAAqB,IAAA,CAAK,OAAA,CAAQ,UAAmB,CAAA;AAC9D,IAAA,QAAA,CAAS,WAAA,EAAa,IAAA,CAAK,OAAA,CAAQ,WAAW,CAAA;AAC9C,IAAA,QAAA,CAAS,mBAAA,EAA8B,IAAA,CAAK,OAAA,CAAQ,mBAA4B,CAAA;AAEhF,IAAA,OAAO,UAAA;AAAA,EACT;AACF,CAAC;;;ACtOM,IAAM,OAAA,GAAU","file":"index.cjs","sourcesContent":["/**\n * Callback type for event handlers\n * - Events with payload: (data: T) => void\n * - Events without payload (undefined): () => void\n */\ntype EventCallback<T> = T extends undefined ? () => void : (data: T) => void;\n\n/**\n * Generic, type-safe event emitter\n *\n * @example\n * ```typescript\n * interface MyEvents {\n * update: { value: number };\n * destroy: undefined;\n * }\n *\n * const emitter = new EventEmitter<MyEvents>();\n * emitter.on('update', ({ value }) => console.log(value));\n * emitter.on('destroy', () => console.log('destroyed'));\n * ```\n */\nexport class EventEmitter<Events extends { [K in keyof Events]: unknown } = Record<string, never>> {\n // Protected so Editor subclass can access if needed\n protected callbacks = new Map<keyof Events, Set<EventCallback<unknown>>>();\n\n /**\n * Register an event listener\n */\n on<E extends keyof Events>(event: E, callback: EventCallback<Events[E]>): this {\n const listeners = this.callbacks.get(event);\n\n if (listeners) {\n listeners.add(callback as EventCallback<unknown>);\n } else {\n this.callbacks.set(event, new Set([callback as EventCallback<unknown>]));\n }\n\n return this;\n }\n\n /**\n * Remove an event listener, or all listeners for an event if no callback specified\n */\n off<E extends keyof Events>(event: E, callback?: EventCallback<Events[E]>): this {\n const listeners = this.callbacks.get(event);\n\n if (listeners) {\n if (callback) {\n // Remove specific callback\n listeners.delete(callback as EventCallback<unknown>);\n\n // Clean up empty sets\n if (listeners.size === 0) {\n this.callbacks.delete(event);\n }\n } else {\n // Remove all listeners for this event\n this.callbacks.delete(event);\n }\n }\n\n return this;\n }\n\n /**\n * Emit an event to all registered listeners\n * Uses .call(this) to preserve context for callbacks\n */\n emit<E extends keyof Events>(\n event: E,\n ...args: Events[E] extends undefined ? [] : [Events[E]]\n ): this {\n const listeners = this.callbacks.get(event);\n\n if (listeners) {\n listeners.forEach((callback) => {\n if (args.length > 0) {\n (callback as (data: unknown) => void).call(this, args[0]);\n } else {\n (callback as () => void).call(this);\n }\n });\n }\n\n return this;\n }\n\n /**\n * Register an event listener that fires only once\n */\n once<E extends keyof Events>(event: E, callback: EventCallback<Events[E]>): this {\n const onceWrapper = ((...args: unknown[]) => {\n this.off(event, onceWrapper);\n\n if (args.length > 0) {\n (callback as (data: unknown) => void).call(this, args[0]);\n } else {\n (callback as () => void).call(this);\n }\n }) as EventCallback<Events[E]>;\n\n return this.on(event, onceWrapper);\n }\n\n /**\n * Remove all listeners for a specific event, or all events if no event specified\n */\n removeAllListeners(event?: keyof Events): this {\n if (event !== undefined) {\n this.callbacks.delete(event);\n } else {\n this.callbacks.clear();\n }\n\n return this;\n }\n\n /**\n * Get the number of listeners for a specific event\n */\n listenerCount(event: keyof Events): number {\n return this.callbacks.get(event)?.size ?? 0;\n }\n\n /**\n * Get all event names that have listeners\n */\n eventNames(): (keyof Events)[] {\n return Array.from(this.callbacks.keys());\n }\n}\n","/**\n * Custom inputRules plugin with built-in Backspace undo.\n *\n * Two enhancements over ProseMirror's built-in inputRules plugin:\n *\n * 1. Preserves undo state across appendTransaction (e.g. TrailingNode).\n * PM's plugin clears state on any docChanged transaction, so\n * appendTransaction handlers that fire after an input rule erase the\n * undo info before the user can press Backspace.\n *\n * 2. Handles Backspace directly via handleKeyDown (highest priority in\n * ProseMirror's event dispatch) so no other keymap can intercept it\n * first. If the plugin has stored undo state, Backspace inverts the\n * input rule steps and restores the original typed text.\n */\nimport { Plugin } from '@domternal/pm/state';\nimport type { InputRule } from '@domternal/pm/inputrules';\nimport type { EditorView } from '@domternal/pm/view';\nimport { TextSelection } from '@domternal/pm/state';\nimport type { EditorState, Transaction } from '@domternal/pm/state';\n\ninterface InternalRule {\n match: RegExp;\n handler: (state: EditorState, match: RegExpExecArray, start: number, end: number) => Transaction | null;\n undoable: boolean;\n inCode: boolean | 'only';\n inCodeMark: boolean;\n}\n\nconst MAX_MATCH = 500;\n\nfunction run(\n view: EditorView,\n from: number,\n to: number,\n text: string,\n rules: InputRule[],\n plugin: Plugin,\n): boolean {\n if (view.composing) return false;\n\n const state = view.state;\n const $from = state.doc.resolve(from);\n const textBefore =\n $from.parent.textBetween(\n Math.max(0, $from.parentOffset - MAX_MATCH),\n $from.parentOffset,\n null,\n '\\ufffc',\n ) + text;\n\n for (const rawRule of rules) {\n const rule = rawRule as InputRule & InternalRule;\n\n if (!rule.inCodeMark && $from.marks().some((m) => m.type.spec.code)) continue;\n if ($from.parent.type.spec.code) {\n if (!rule.inCode) continue;\n } else if (rule.inCode === 'only') {\n continue;\n }\n\n const match = rule.match.exec(textBefore);\n if (!match || match[0].length < text.length) continue;\n\n const startPos = from - (match[0].length - text.length);\n\n if (!rule.inCodeMark) {\n const codeMarks: boolean[] = [];\n state.doc.nodesBetween(startPos, $from.pos, (node) => {\n if (node.isInline && node.marks.some((m) => m.type.spec.code)) codeMarks.push(true);\n });\n if (codeMarks.length > 0) continue;\n }\n\n const tr = rule.handler(state, match, startPos, to);\n if (!tr) continue;\n\n if (rule.undoable) {\n tr.setMeta(plugin, { transform: tr, from, to, text });\n }\n view.dispatch(tr);\n return true;\n }\n return false;\n}\n\ninterface InputRulesState {\n transform: Transaction;\n from: number;\n to: number;\n text: string;\n}\n\n/**\n * Undo the last input rule by inverting its steps and restoring\n * the original typed text.\n */\nfunction undoInputRule(plugin: Plugin, state: EditorState, dispatch?: (tr: Transaction) => void): boolean {\n const undoable = plugin.getState(state) as InputRulesState | null;\n if (!undoable) return false;\n\n if (dispatch) {\n const tr = state.tr;\n const toUndo = undoable.transform;\n for (let j = toUndo.steps.length - 1; j >= 0; j--) {\n const step = toUndo.steps[j];\n const doc = toUndo.docs[j];\n if (step && doc) tr.step(step.invert(doc));\n }\n if (undoable.text) {\n const marks = tr.doc.resolve(undoable.from).marks();\n tr.replaceWith(undoable.from, undoable.to, state.schema.text(undoable.text, marks));\n // Place cursor at the end of the restored text\n const endPos = undoable.from + undoable.text.length;\n if (endPos <= tr.doc.content.size) {\n tr.setSelection(TextSelection.create(tr.doc, endPos));\n }\n } else {\n tr.delete(undoable.from, undoable.to);\n }\n dispatch(tr);\n }\n return true;\n}\n\n/**\n * Creates an input rules plugin with built-in Backspace undo.\n *\n * Drop-in replacement for ProseMirror's `inputRules({ rules })`.\n */\nexport function inputRulesPlugin({ rules }: { rules: InputRule[] }): Plugin {\n const plugin: Plugin = new Plugin({\n state: {\n init(): InputRulesState | null {\n return null;\n },\n apply(tr: Transaction, prev: InputRulesState | null): InputRulesState | null {\n const stored = tr.getMeta(plugin) as InputRulesState | undefined;\n if (stored) return stored;\n\n // Preserve state across appendTransaction (e.g. TrailingNode)\n if (tr.getMeta('appendedTransaction')) return prev;\n\n return tr.selectionSet || tr.docChanged ? null : prev;\n },\n },\n props: {\n handleTextInput(view: EditorView, from: number, to: number, text: string) {\n return run(view, from, to, text, rules, plugin);\n },\n handleKeyDown(view: EditorView, event: KeyboardEvent) {\n // Intercept Backspace to undo the last input rule.\n // handleKeyDown fires before any keymap plugin, so this\n // cannot be blocked by extension Backspace handlers.\n if (event.key === 'Backspace' && !event.ctrlKey && !event.metaKey && !event.altKey) {\n return undoInputRule(plugin, view.state, (tr) => { view.dispatch(tr); });\n }\n return false;\n },\n handleDOMEvents: {\n compositionend: (view: EditorView) => {\n setTimeout(() => {\n const { $cursor } = view.state.selection as { $cursor?: { pos: number } };\n if ($cursor) { run(view, $cursor.pos, $cursor.pos, '', rules, plugin); }\n });\n },\n },\n },\n // Tag so external undoInputRule can also find this plugin\n isInputRules: true,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } as ConstructorParameters<typeof Plugin<any>>[0] & { isInputRules: boolean });\n\n return plugin;\n}\n","/**\n * callOrReturn - Helper for context binding in extension config\n *\n * Used to call config functions with proper `this` context,\n * or return the value directly if it's not a function.\n *\n * This enables patterns like:\n * ```typescript\n * const Bold = Mark.create({\n * name: 'bold',\n * addCommands() {\n * return {\n * toggleBold: () => ({ commands }) => {\n * return commands.toggleMark(this.name); // this.name = 'bold'\n * },\n * };\n * },\n * });\n * ```\n */\n\n/**\n * Calls a function with the given context, or returns the value if not a function\n *\n * @param value - Function to call or value to return\n * @param context - The `this` context to bind when calling the function\n * @param args - Additional arguments to pass to the function\n * @returns The function result or the value itself\n */\nexport function callOrReturn<T>(\n value: T | ((...args: unknown[]) => T),\n context: unknown,\n ...args: unknown[]\n): T {\n if (typeof value === 'function') {\n return (value as (...args: unknown[]) => T).call(context, ...args);\n }\n return value;\n}\n","/**\n * ExtensionManager - manages extensions and schema.\n *\n * Handles:\n * - Extension lifecycle (flatten, resolve, bind)\n * - Schema building from Node/Mark extensions\n * - Plugin collection from all extensions\n * - Extension storage management\n * - Conflict detection (duplicate extension names)\n */\nimport { Schema } from '@domternal/pm/model';\nimport type { NodeSpec, MarkSpec } from '@domternal/pm/model';\nimport type { Plugin, Transaction } from '@domternal/pm/state';\nimport type { NodeViewConstructor } from '@domternal/pm/view';\nimport { keymap } from '@domternal/pm/keymap';\nimport type { InputRule } from '@domternal/pm/inputrules';\nimport { inputRulesPlugin as createInputRulesPlugin } from './helpers/inputRulesPlugin.js';\n\nimport type { Command as PMCommand } from '@domternal/pm/state';\n\nimport type { AnyExtension } from './types/EditorOptions.js';\nimport type { CommandMap } from './types/Commands.js';\nimport type { GlobalAttributes, GlobalAttributeSpec } from './types/ExtensionConfig.js';\nimport type { ToolbarItem } from './types/Toolbar.js';\nimport type { FloatingMenuItem } from './types/FloatingMenu.js';\nimport type { Extension } from './Extension.js';\nimport type { Node } from './Node.js';\nimport type { Mark } from './Mark.js';\nimport { callOrReturn } from './helpers/callOrReturn.js';\n\n/**\n * Error event props for safeCall\n */\ninterface ErrorEventProps {\n error: Error;\n context: string;\n}\n\n/**\n * Editor interface for ExtensionManager\n * Forward declaration to avoid circular dependency\n */\nexport interface ExtensionManagerEditor {\n readonly schema: Schema;\n emit?(event: 'error', props: ErrorEventProps): void;\n}\n\n/**\n * Context attached to node view constructors for framework wrappers.\n * Accessible via `(constructor as any).__domternalContext`.\n */\nexport interface NodeViewContext {\n editor: ExtensionManagerEditor;\n extension: { name: string; options: Record<string, unknown> };\n}\n\n/**\n * Options for ExtensionManager constructor\n */\nexport interface ExtensionManagerOptions {\n /**\n * Extensions to process\n * If provided, schema is built from extensions\n */\n extensions?: AnyExtension[] | undefined;\n\n /**\n * Direct schema. If provided, extensions are ignored for schema building.\n */\n schema?: Schema | undefined;\n}\n\n/**\n * Manages editor extensions and schema\n *\n * Supports two modes:\n * 1. Extensions mode: Schema built from Node/Mark extensions\n * 2. Schema mode: Direct schema passed (backward compatible)\n */\n/**\n * Merge HTML attribute objects, concatenating 'style' and 'class' values\n * instead of overwriting them.\n */\nfunction mergeHTMLAttrs(\n target: Record<string, unknown>,\n source: Record<string, unknown>\n): Record<string, unknown> {\n const result = { ...target };\n\n for (const [key, value] of Object.entries(source)) {\n if (key === 'style' && typeof result[key] === 'string' && typeof value === 'string') {\n result[key] = `${result[key]}; ${value}`;\n } else if (key === 'class' && typeof result[key] === 'string' && typeof value === 'string') {\n result[key] = `${result[key]} ${value}`;\n } else {\n result[key] = value;\n }\n }\n\n return result;\n}\n\nexport class ExtensionManager {\n /**\n * Processed extensions (flattened, sorted by priority)\n */\n private readonly _extensions: AnyExtension[];\n\n /**\n * ProseMirror schema (built from extensions or passed directly)\n */\n private readonly _schema: Schema;\n\n /**\n * Reference to the editor instance\n */\n readonly editor: ExtensionManagerEditor;\n\n /**\n * Extension storage (keyed by extension name)\n */\n private readonly _storage: Record<string, unknown> = {};\n\n /**\n * Whether the manager has been destroyed\n */\n private isDestroyed = false;\n\n /**\n * Cached plugins (built lazily)\n */\n private _plugins: Plugin[] | null = null;\n\n /**\n * Cached commands (collected lazily)\n */\n private _commands: CommandMap | null = null;\n\n /**\n * Cached toolbar items (collected lazily)\n */\n private _toolbarItems: ToolbarItem[] | null = null;\n\n /**\n * Cached floating-menu items (collected lazily)\n */\n private _floatingMenuItems: FloatingMenuItem[] | null = null;\n\n /**\n * Cached node views (collected lazily)\n */\n private _nodeViews: Record<string, NodeViewConstructor> | null = null;\n\n /**\n * Creates a new ExtensionManager\n *\n * @param options - Extensions or direct schema\n * @param editor - Editor instance\n */\n constructor(options: ExtensionManagerOptions, editor: ExtensionManagerEditor) {\n this.editor = editor;\n\n // Schema mode (backward compatibility)\n if (options.schema) {\n this._extensions = [];\n this._schema = options.schema;\n return;\n }\n\n // Extensions mode\n if (!options.extensions || options.extensions.length === 0) {\n throw new Error(\n 'ExtensionManager requires either extensions or schema. ' +\n 'Provide at least Document, Text, and Paragraph extensions.'\n );\n }\n\n // Process extensions following the pipeline:\n // 1. Flatten (expand addExtensions)\n // 2. Deduplicate (keep last occurrence - explicit configs override auto-included defaults)\n // 3. Resolve (sort by priority)\n // 4. Detect conflicts\n // 5. Check dependencies\n // 6. Bind editor to extensions\n // 7. Build schema\n // 8. Initialize storage\n\n const flattened = this.flattenExtensions(options.extensions);\n const deduped = this.deduplicateExtensions(flattened);\n this._extensions = this.resolveExtensions(deduped);\n this.detectConflicts();\n this.checkDependencies();\n this.bindEditorToExtensions();\n this._schema = this.buildSchema();\n this.initializeStorage();\n }\n\n // === Getters ===\n\n /**\n * Gets the processed extensions array\n */\n get extensions(): readonly AnyExtension[] {\n return this._extensions;\n }\n\n /**\n * Gets the ProseMirror schema\n */\n get schema(): Schema {\n return this._schema;\n }\n\n /**\n * Gets extension storage (accessed via editor.storage)\n */\n get storage(): Record<string, unknown> {\n return this._storage;\n }\n\n /**\n * Gets plugins from all extensions\n * Cached after first call\n */\n get plugins(): Plugin[] {\n this._plugins ??= this.buildPlugins();\n return this._plugins;\n }\n\n /**\n * Gets commands from all extensions\n */\n get commands(): CommandMap {\n this._commands ??= this.collectCommands();\n return this._commands;\n }\n\n /**\n * Gets toolbar items from all extensions\n * Cached after first call\n */\n get toolbarItems(): ToolbarItem[] {\n this._toolbarItems ??= this.collectToolbarItems();\n return this._toolbarItems;\n }\n\n /**\n * Gets floating-menu items from all extensions\n * Cached after first call\n */\n get floatingMenuItems(): FloatingMenuItem[] {\n this._floatingMenuItems ??= this.collectFloatingMenuItems();\n return this._floatingMenuItems;\n }\n\n /**\n * Gets node views from all Node extensions that define addNodeView\n */\n get nodeViews(): Record<string, NodeViewConstructor> {\n this._nodeViews ??= this.collectNodeViews();\n return this._nodeViews;\n }\n\n // === Cache Invalidation ===\n\n /**\n * Clears all caches (plugins, commands)\n * Call when extensions change dynamically\n */\n clearAllCaches(): void {\n this._plugins = null;\n this._commands = null;\n this._toolbarItems = null;\n this._floatingMenuItems = null;\n this._nodeViews = null;\n }\n\n // === Extension Processing ===\n\n /**\n * Recursively flattens extensions by expanding addExtensions()\n * This allows extension bundles like StarterKit to work\n */\n private flattenExtensions(extensions: AnyExtension[]): AnyExtension[] {\n const result: AnyExtension[] = [];\n\n for (const ext of extensions) {\n result.push(ext);\n\n // Check for nested extensions (bundles like StarterKit)\n const nested = callOrReturn(\n (ext as Extension).config.addExtensions,\n ext\n ) as AnyExtension[] | undefined;\n\n if (nested && nested.length > 0) {\n result.push(...this.flattenExtensions(nested));\n }\n }\n\n return result;\n }\n\n /**\n * Removes duplicate extensions by name, keeping the last occurrence.\n * This allows parent extensions to auto-include children via addExtensions()\n * while letting users override with explicitly configured versions.\n */\n private deduplicateExtensions(extensions: AnyExtension[]): AnyExtension[] {\n const seen = new Map<string, number>();\n for (let i = 0; i < extensions.length; i++) {\n const ext = extensions[i];\n if (ext) seen.set(ext.name, i);\n }\n return extensions.filter((ext, i) => seen.get(ext.name) === i);\n }\n\n /**\n * Sorts extensions by priority (higher priority first)\n * Default priority is 100\n */\n private resolveExtensions(extensions: AnyExtension[]): AnyExtension[] {\n return [...extensions].sort((a, b) => {\n const priorityA = (a as Extension).config.priority ?? 100;\n const priorityB = (b as Extension).config.priority ?? 100;\n return priorityB - priorityA;\n });\n }\n\n /**\n * Detects duplicate extension names.\n * @throws Error if duplicate names found\n */\n private detectConflicts(): void {\n const names = new Set<string>();\n\n for (const ext of this._extensions) {\n if (names.has(ext.name)) {\n throw new Error(\n `Extension name conflict: \"${ext.name}\" is defined multiple times. ` +\n `Each extension must have a unique name.`\n );\n }\n names.add(ext.name);\n }\n }\n\n /**\n * Validates that all extension dependencies are present\n * @throws Error if required dependency is missing\n */\n private checkDependencies(): void {\n const extensionNames = new Set(this._extensions.map((e) => e.name));\n\n for (const ext of this._extensions) {\n const deps = (ext as Extension).config.dependencies;\n if (!deps) continue;\n\n for (const dep of deps) {\n if (!extensionNames.has(dep)) {\n throw new Error(\n `Extension \"${ext.name}\" requires \"${dep}\" extension. ` +\n `Please add it to your extensions array.`\n );\n }\n }\n }\n }\n\n /**\n * Sets editor reference on all extensions\n */\n private bindEditorToExtensions(): void {\n for (const ext of this._extensions) {\n (ext as Extension).editor = this.editor as ExtensionManagerEditor &\n Extension['editor'];\n }\n }\n\n /**\n * Collects global attributes from all extensions.\n * Returns a map of type name -> attribute specs to merge.\n */\n private collectGlobalAttributes(): Map<string, Record<string, GlobalAttributeSpec>> {\n const globalAttrs = new Map<string, Record<string, GlobalAttributeSpec>>();\n\n for (const ext of this._extensions) {\n const addGlobalAttributes = (ext as Extension).config.addGlobalAttributes;\n if (!addGlobalAttributes) continue;\n\n const attrs = this.safeCall(\n () => callOrReturn(addGlobalAttributes, ext) as GlobalAttributes[] | undefined,\n `${ext.name}.addGlobalAttributes`\n );\n\n if (!attrs) continue;\n\n for (const { types, attributes } of attrs) {\n for (const typeName of types) {\n const existing = globalAttrs.get(typeName) ?? {};\n globalAttrs.set(typeName, { ...existing, ...attributes });\n }\n }\n }\n\n return globalAttrs;\n }\n\n /**\n * Applies global attributes to a node or mark spec.\n * Merges extra attrs into spec.attrs, wraps parseDOM getAttrs to parse\n * global attributes from DOM elements, and wraps toDOM to inject rendered\n * global HTML attributes into the output.\n */\n private applyGlobalAttributes(\n spec: NodeSpec | MarkSpec,\n extraAttrs: Record<string, GlobalAttributeSpec>,\n ): void {\n // 1. Convert global attrs to PM attrs and merge\n const convertedAttrs: Record<string, { default?: unknown }> = {};\n for (const [attrName, attrSpec] of Object.entries(extraAttrs)) {\n convertedAttrs[attrName] = { default: attrSpec.default };\n }\n spec.attrs = { ...spec.attrs, ...convertedAttrs };\n\n // 2. Wrap parseDOM handlers to include global attribute parsing\n if (spec.parseDOM) {\n spec.parseDOM = spec.parseDOM.map((rule) => {\n const originalGetAttrs = rule.getAttrs as\n | ((dom: HTMLElement | string) => Record<string, unknown> | false | null)\n | undefined;\n return {\n ...rule,\n getAttrs: (dom: HTMLElement | string) => {\n const baseAttrs = originalGetAttrs\n ? originalGetAttrs(dom)\n : rule.attrs ?? {};\n\n if (baseAttrs === false) return false;\n\n // Parse global attributes from DOM (only if element, not style string)\n const globalParsed: Record<string, unknown> = {};\n if (typeof dom !== 'string') {\n for (const [name, attrSpec] of Object.entries(extraAttrs)) {\n if (attrSpec.parseHTML) {\n globalParsed[name] = attrSpec.parseHTML(dom);\n }\n }\n }\n\n return { ...baseAttrs, ...globalParsed };\n },\n };\n });\n }\n\n // 3. Wrap toDOM to inject rendered global HTML attributes\n const originalToDOM = spec.toDOM;\n if (originalToDOM) {\n // Use a generic wrapper - first arg is always a node or mark with .attrs\n const wrappedToDOM = (...args: unknown[]): unknown => {\n const result = (originalToDOM as (...a: unknown[]) => unknown)(...args);\n if (!Array.isArray(result)) return result;\n\n // First arg is always the node or mark, which has .attrs\n const nodeOrMark = args[0] as { attrs: Record<string, unknown> };\n\n let extraHtmlAttrs: Record<string, string> = {};\n for (const [, attrSpec] of Object.entries(extraAttrs)) {\n if (attrSpec.renderHTML) {\n const rendered = attrSpec.renderHTML(nodeOrMark.attrs);\n if (rendered) {\n extraHtmlAttrs = mergeHTMLAttrs(extraHtmlAttrs, rendered) as Record<string, string>;\n }\n }\n }\n\n // Merge into result[1] if it's an attributes object\n if (\n result.length >= 2 &&\n typeof result[1] === 'object' &&\n result[1] !== null &&\n !Array.isArray(result[1])\n ) {\n const existingAttrs = result[1] as Record<string, unknown>;\n result[1] = { ...existingAttrs, ...extraHtmlAttrs };\n } else if (Object.keys(extraHtmlAttrs).length > 0) {\n // Insert attributes object at position 1\n const rest = result.slice(1) as unknown[];\n return [result[0], extraHtmlAttrs, ...rest];\n }\n\n return result;\n };\n // Cast needed: wrappedToDOM is generic but spec.toDOM expects specific signatures.\n // The wrapper preserves the original signature by forwarding all arguments.\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any\n (spec as any).toDOM = wrappedToDOM;\n }\n }\n\n /**\n * Builds ProseMirror Schema from Node and Mark extensions\n */\n private buildSchema(): Schema {\n // First, collect global attributes from all extensions\n const globalAttrs = this.collectGlobalAttributes();\n\n const nodes: Record<string, NodeSpec> = {};\n const marks: Record<string, MarkSpec> = {};\n let topNode: string | undefined;\n\n for (const ext of this._extensions) {\n if (ext.type === 'node') {\n const nodeExt = ext as Node;\n const spec = nodeExt.createNodeSpec();\n\n const extraAttrs = globalAttrs.get(ext.name);\n if (extraAttrs) {\n this.applyGlobalAttributes(spec, extraAttrs);\n }\n\n nodes[ext.name] = spec;\n\n // Check for topNode (usually 'doc')\n if (nodeExt.config.topNode) {\n topNode = ext.name;\n }\n } else if (ext.type === 'mark') {\n const markExt = ext as Mark;\n const spec = markExt.createMarkSpec();\n\n const extraAttrs = globalAttrs.get(ext.name);\n if (extraAttrs) {\n this.applyGlobalAttributes(spec, extraAttrs);\n }\n\n marks[ext.name] = spec;\n }\n }\n\n return new Schema({\n nodes,\n marks,\n ...(topNode && { topNode }),\n });\n }\n\n /**\n * Initializes storage for all extensions\n */\n private initializeStorage(): void {\n for (const ext of this._extensions) {\n const storageFactory = (ext as Extension).config.addStorage;\n if (storageFactory) {\n const storage = this.safeCall(\n () => callOrReturn(storageFactory, ext),\n `${ext.name}.addStorage`\n );\n if (storage !== undefined) {\n this._storage[ext.name] = storage;\n (ext as Extension).storage = storage;\n }\n }\n // Always expose ext.storage via editor.storage[name], even for\n // extensions without addStorage(). The Extension constructor\n // initialises storage to {} by default - make it accessible.\n if (!(ext.name in this._storage)) {\n this._storage[ext.name] = (ext as Extension).storage;\n }\n }\n }\n\n // === Plugin Collection ===\n\n /**\n * Builds all ProseMirror plugins from extensions\n */\n private buildPlugins(): Plugin[] {\n const plugins: Plugin[] = [];\n\n // Collect input rules and create inputRules plugin.\n // The plugin includes a built-in Backspace handler (via handleKeyDown)\n // that undoes the last input rule before any keymap plugin can intercept it.\n const rules = this.collectInputRules();\n if (rules.length > 0) {\n plugins.push(createInputRulesPlugin({ rules }));\n }\n\n // Collect keyboard shortcuts and create keymap plugin\n const shortcuts = this.collectKeyboardShortcuts();\n if (Object.keys(shortcuts).length > 0) {\n plugins.push(keymap(shortcuts));\n }\n\n // Collect custom plugins from extensions\n for (const ext of this._extensions) {\n const addPlugins = (ext as Extension).config.addProseMirrorPlugins;\n if (addPlugins) {\n const extPlugins = this.safeCall(\n () => callOrReturn(addPlugins, ext) as Plugin[] | undefined,\n `${ext.name}.addProseMirrorPlugins`\n );\n if (extPlugins && extPlugins.length > 0) {\n plugins.push(...extPlugins);\n }\n }\n }\n\n return plugins;\n }\n\n /**\n * Collects keyboard shortcuts from all extensions\n * Returns ProseMirror-compatible commands for keymap plugin\n *\n * Note: Extensions should return PM-compatible commands from addKeyboardShortcuts()\n */\n private collectKeyboardShortcuts(): Record<string, PMCommand> {\n const shortcuts: Record<string, PMCommand> = {};\n\n for (const ext of this._extensions) {\n const addShortcuts = (ext as Extension).config.addKeyboardShortcuts;\n if (addShortcuts) {\n const extShortcuts = this.safeCall(\n () => callOrReturn(addShortcuts, ext),\n `${ext.name}.addKeyboardShortcuts`\n );\n if (extShortcuts) {\n const cast = extShortcuts as unknown as Record<string, PMCommand>;\n for (const [key, handler] of Object.entries(cast)) {\n if (shortcuts[key]) {\n // Chain: try new handler first, fall back to previous\n const prev = shortcuts[key];\n shortcuts[key] = (state, dispatch, view) => {\n return handler(state, dispatch, view) || prev(state, dispatch, view);\n };\n } else {\n shortcuts[key] = handler;\n }\n }\n }\n }\n }\n\n return shortcuts;\n }\n\n /**\n * Collects input rules from all extensions\n */\n private collectInputRules(): InputRule[] {\n const rules: InputRule[] = [];\n\n for (const ext of this._extensions) {\n const addRules = (ext as Extension).config.addInputRules;\n if (addRules) {\n const extRules = this.safeCall(\n () => callOrReturn(addRules, ext) as InputRule[] | undefined,\n `${ext.name}.addInputRules`\n );\n if (extRules && extRules.length > 0) {\n rules.push(...extRules);\n }\n }\n }\n\n return rules;\n }\n\n /**\n * Collects commands from all extensions\n *\n * Note: Commands with the same name will be overwritten by later extensions\n * (lower priority extensions override higher priority). This is intentional\n * to allow customization of built-in commands.\n */\n private collectCommands(): CommandMap {\n const commands: CommandMap = {};\n\n for (const ext of this._extensions) {\n const addCommands = (ext as Extension).config.addCommands;\n if (addCommands) {\n const extCommands = this.safeCall(\n () => callOrReturn(addCommands, ext) as CommandMap | undefined,\n `${ext.name}.addCommands`\n );\n if (extCommands) {\n // Later extensions override earlier ones (intentional for customization)\n Object.assign(commands, extCommands);\n }\n }\n }\n\n return commands;\n }\n\n /**\n * Collects toolbar items from all extensions\n */\n private collectToolbarItems(): ToolbarItem[] {\n const items: ToolbarItem[] = [];\n\n for (const ext of this._extensions) {\n const addItems = (ext as Extension).config.addToolbarItems;\n if (addItems) {\n const extItems = this.safeCall(\n () => callOrReturn(addItems, ext) as ToolbarItem[] | undefined,\n `${ext.name}.addToolbarItems`\n );\n if (extItems && extItems.length > 0) {\n items.push(...extItems);\n }\n }\n }\n\n return items;\n }\n\n /**\n * Collects floating-menu items from all extensions via `addFloatingMenuItems()`.\n */\n private collectFloatingMenuItems(): FloatingMenuItem[] {\n const items: FloatingMenuItem[] = [];\n\n for (const ext of this._extensions) {\n const addItems = (ext as Extension).config.addFloatingMenuItems;\n if (addItems) {\n const extItems = this.safeCall(\n () => callOrReturn(addItems, ext) as FloatingMenuItem[] | undefined,\n `${ext.name}.addFloatingMenuItems`\n );\n if (extItems && extItems.length > 0) {\n items.push(...extItems);\n }\n }\n }\n\n return items;\n }\n\n /**\n * Collects node views from all Node extensions.\n * Returns a map of node name to NodeViewConstructor for EditorView.\n *\n * Each constructor is annotated with `__domternalContext` containing\n * the editor and extension metadata so framework wrappers (React, Vue)\n * can access them without changing the ProseMirror calling convention.\n */\n private collectNodeViews(): Record<string, NodeViewConstructor> {\n const nodeViews: Record<string, NodeViewConstructor> = {};\n\n for (const ext of this._extensions) {\n if (ext.type !== 'node') continue;\n const nodeExt = ext as Node;\n const addNodeView = nodeExt.config.addNodeView;\n if (addNodeView) {\n const nodeView = this.safeCall(\n () => callOrReturn(addNodeView, nodeExt) as NodeViewConstructor | undefined,\n `${ext.name}.addNodeView`\n );\n if (nodeView) {\n // Annotate with editor + extension context for framework wrappers\n (nodeView as NodeViewConstructor & { __domternalContext?: NodeViewContext }).__domternalContext = {\n editor: this.editor,\n extension: { name: nodeExt.name, options: nodeExt.options as Record<string, unknown> },\n };\n nodeViews[ext.name] = nodeView;\n }\n }\n }\n\n return nodeViews;\n }\n\n // === Validation ===\n\n /**\n * Validates that the schema has required nodes\n * @throws Error if schema is missing 'doc' or 'text' nodes\n */\n validateSchema(): void {\n if (this.isDestroyed) {\n throw new Error('ExtensionManager has been destroyed');\n }\n\n const { nodes } = this._schema.spec;\n\n if (!nodes.get('doc')) {\n throw new Error(\n 'Invalid schema: missing required \"doc\" node. ' +\n 'The schema must define a \"doc\" node as the document root.'\n );\n }\n\n if (!nodes.get('text')) {\n throw new Error(\n 'Invalid schema: missing required \"text\" node. ' +\n 'The schema must define a \"text\" node for inline text content.'\n );\n }\n }\n\n // === Lifecycle ===\n\n /**\n * Cleans up the extension manager\n * Calls onDestroy on all extensions and clears all caches\n */\n destroy(): void {\n if (this.isDestroyed) {\n return;\n }\n\n // Call onDestroy on all extensions (wrapped in safeCall)\n for (const ext of this._extensions) {\n const onDestroy = (ext as Extension).config.onDestroy;\n if (onDestroy) {\n this.safeCall(() => {\n callOrReturn(onDestroy, ext);\n }, `${ext.name}.onDestroy`);\n }\n }\n\n // Clear all caches to prevent memory leaks\n // Note: ProseMirror's EditorView.destroy() handles plugin view cleanup\n // Storage is not cleared explicitly - it will be garbage collected\n // when the ExtensionManager instance is no longer referenced\n this.clearAllCaches();\n\n this.isDestroyed = true;\n }\n\n // === Error Handling (2.7: Extension Error Isolation) ===\n\n /**\n * Safely executes a function, catching and reporting errors\n * Prevents a single extension error from crashing the entire editor\n *\n * Handles both synchronous errors and async promise rejections.\n *\n * @param fn - Function to execute\n * @param context - Context for error reporting (e.g., 'Bold.onUpdate')\n * @returns The function result, or undefined if an error occurred\n */\n safeCall<T>(fn: () => T, context: string): T | undefined {\n try {\n const result = fn();\n\n // Handle async functions - catch promise rejections\n if (result instanceof Promise) {\n result.catch((error: unknown) => {\n const errorObj = error instanceof Error ? error : new Error(String(error));\n this.editor.emit?.('error', { error: errorObj, context });\n });\n }\n\n return result;\n } catch (error) {\n const errorObj = error instanceof Error ? error : new Error(String(error));\n\n // Emit error event (Editor will call onError callback via event listener)\n this.editor.emit?.('error', { error: errorObj, context });\n\n return undefined;\n }\n }\n\n // === Extension Lifecycle Hook Calls ===\n\n /**\n * Calls onBeforeCreate on all extensions\n */\n callOnBeforeCreate(): void {\n for (const ext of this._extensions) {\n const hook = (ext as Extension).config.onBeforeCreate;\n if (hook) {\n this.safeCall(() => {\n callOrReturn(hook, ext);\n }, `${ext.name}.onBeforeCreate`);\n }\n }\n }\n\n /**\n * Calls onCreate on all extensions\n */\n callOnCreate(): void {\n for (const ext of this._extensions) {\n const hook = (ext as Extension).config.onCreate;\n if (hook) {\n this.safeCall(() => {\n callOrReturn(hook, ext);\n }, `${ext.name}.onCreate`);\n }\n }\n }\n\n /**\n * Calls onUpdate on all extensions\n */\n callOnUpdate(): void {\n for (const ext of this._extensions) {\n const hook = (ext as Extension).config.onUpdate;\n if (hook) {\n this.safeCall(() => {\n callOrReturn(hook, ext);\n }, `${ext.name}.onUpdate`);\n }\n }\n }\n\n /**\n * Calls onSelectionUpdate on all extensions\n */\n callOnSelectionUpdate(): void {\n for (const ext of this._extensions) {\n const hook = (ext as Extension).config.onSelectionUpdate;\n if (hook) {\n this.safeCall(() => {\n callOrReturn(hook, ext);\n }, `${ext.name}.onSelectionUpdate`);\n }\n }\n }\n\n /**\n * Calls onTransaction on all extensions\n * @param props - Transaction props\n */\n callOnTransaction(props: { transaction: Transaction }): void {\n for (const ext of this._extensions) {\n const hook = (ext as Extension).config.onTransaction;\n if (hook) {\n this.safeCall(() => {\n hook.call(ext, props);\n }, `${ext.name}.onTransaction`);\n }\n }\n }\n\n /**\n * Calls onFocus on all extensions\n * @param props - Focus event props\n */\n callOnFocus(props: { event: FocusEvent }): void {\n for (const ext of this._extensions) {\n const hook = (ext as Extension).config.onFocus;\n if (hook) {\n this.safeCall(() => {\n hook.call(ext, props);\n }, `${ext.name}.onFocus`);\n }\n }\n }\n\n /**\n * Calls onBlur on all extensions\n * @param props - Blur event props\n */\n callOnBlur(props: { event: FocusEvent }): void {\n for (const ext of this._extensions) {\n const hook = (ext as Extension).config.onBlur;\n if (hook) {\n this.safeCall(() => {\n hook.call(ext, props);\n }, `${ext.name}.onBlur`);\n }\n }\n }\n}\n","/**\n * Selection commands - focus, blur, selectAll, selectNodeBackward, deleteSelection\n */\nimport { TextSelection, AllSelection } from '@domternal/pm/state';\nimport type { EditorView } from '@domternal/pm/view';\nimport { selectNodeBackward as pmSelectNodeBackward } from '@domternal/pm/commands';\nimport type { CommandSpec } from '../types/Commands.js';\nimport type { FocusPosition } from '../types/index.js';\n\n/**\n * Resolves focus position to a numeric position in the document\n *\n * Uses the provided doc (tr.doc) rather than view.state.doc to support\n * chain context where prior commands may have modified the document.\n */\nfunction resolveFocusPosition(\n doc: { content: { size: number } },\n position: FocusPosition\n): number | null {\n if (position === null || position === false) {\n return null;\n }\n\n if (position === true || position === 'end') {\n return doc.content.size - 1;\n }\n\n if (position === 'start') {\n return 1;\n }\n\n if (position === 'all') {\n return null;\n }\n\n if (typeof position === 'number') {\n return Math.max(0, Math.min(position, doc.content.size));\n }\n\n return null;\n}\n\n/**\n * Focus command - focuses the editor at the specified position\n *\n * @param position - Where to place the cursor\n * - true/'end': End of document\n * - 'start': Start of document\n * - 'all': Select all content\n * - number: Specific position\n * - null/false: Just focus without changing selection\n */\nexport const focus: CommandSpec<[position?: FocusPosition]> =\n (position: FocusPosition = null) =>\n ({ editor, tr, dispatch }) => {\n const view = editor.view as EditorView;\n\n // Check if view is attached to DOM (dry-run always returns true)\n if (!dispatch) {\n return true;\n }\n\n if (!view.dom.isConnected) {\n return false;\n }\n\n // Focus the editor\n view.focus();\n\n if (position === 'all') {\n const selection = new AllSelection(tr.doc);\n dispatch(tr.setSelection(selection));\n return true;\n }\n\n // Resolve position\n const resolvedPos = resolveFocusPosition(tr.doc, position);\n\n if (resolvedPos !== null) {\n // Use TextSelection.near() to find nearest valid text position\n // (e.g., position 1 inside a blockquote resolves to the paragraph within)\n const $pos = tr.doc.resolve(resolvedPos);\n const selection = TextSelection.near($pos);\n dispatch(tr.setSelection(selection));\n } else {\n dispatch(tr);\n }\n\n return true;\n };\n\n/**\n * Blur command - removes focus from the editor\n */\nexport const blur: CommandSpec =\n () =>\n ({ editor, dispatch }) => {\n const view = editor.view as EditorView;\n\n if (!dispatch) {\n return true;\n }\n\n // blur() is not part of ProseMirror API, but works on the DOM element\n view.dom.blur();\n return true;\n };\n\n/**\n * SelectAll command - selects all content in the editor\n *\n * Uses AllSelection to select the entire document.\n * Uses tr.doc to support chain context.\n */\nexport const selectAll: CommandSpec =\n () =>\n ({ tr, dispatch }) => {\n if (!dispatch) {\n return true;\n }\n\n tr.setSelection(new AllSelection(tr.doc));\n dispatch(tr);\n return true;\n };\n\n/**\n * SelectNodeBackward command - selects the node before the cursor\n *\n * When the cursor is at the start of a textblock, this selects the node before it.\n */\nexport const selectNodeBackward: CommandSpec =\n () =>\n ({ state, dispatch }) => {\n return pmSelectNodeBackward(state, dispatch);\n };\n\n/**\n * DeleteSelection command - deletes the current selection\n *\n * Uses tr.selection to support chain context.\n */\nexport const deleteSelection: CommandSpec =\n () =>\n ({ tr, dispatch }) => {\n const { empty, from, to } = tr.selection;\n\n if (empty) {\n return false;\n }\n\n if (!dispatch) {\n return true;\n }\n\n tr.deleteRange(from, to);\n dispatch(tr);\n return true;\n };\n","/**\n * Create a ProseMirror document from content\n *\n * Supports JSON and HTML content formats (AD-11).\n * Plain text is NOT supported - use HTML or JSON explicitly.\n */\nimport type { Schema} from '@domternal/pm/model';\nimport { Node as PMNode, DOMParser } from '@domternal/pm/model';\nimport type { Content, JSONContent } from '../types/index.js';\n\n/**\n * Options for createDocument\n */\nexport interface CreateDocumentOptions {\n /**\n * Parse options passed to DOMParser\n */\n parseOptions?: Parameters<DOMParser['parse']>[1];\n}\n\n/**\n * Checks if content is a JSON object (has 'type' property)\n */\nfunction isJSONContent(content: unknown): content is JSONContent {\n return (\n typeof content === 'object' &&\n content !== null &&\n 'type' in content &&\n typeof (content as JSONContent).type === 'string'\n );\n}\n\n/**\n * Checks if content is an HTML string (starts with '<')\n *\n * SECURITY NOTE: This function only checks if the string looks like HTML.\n * It does NOT sanitize content. If you're accepting user-provided content,\n * sanitize it before passing to the editor (e.g., using DOMPurify).\n */\nfunction isHTMLContent(content: unknown): content is string {\n return typeof content === 'string' && content.trim().startsWith('<');\n}\n\n/**\n * Creates an empty document with a single empty paragraph\n */\nfunction createEmptyDocument(schema: Schema): PMNode {\n const paragraphType = schema.nodes['paragraph'];\n\n if (paragraphType) {\n return schema.node('doc', null, [paragraphType.create()]);\n }\n\n // Fallback: create doc with whatever the first block type is\n // Try to find the first allowed node type\n for (const [name, nodeType] of Object.entries(schema.nodes)) {\n if (name !== 'doc' && name !== 'text' && nodeType.isBlock) {\n return schema.node('doc', null, [nodeType.create()]);\n }\n }\n\n // Last resort: empty doc (might be invalid for some schemas)\n return schema.node('doc', null, []);\n}\n\n/**\n * Parses HTML string into a ProseMirror document\n */\nfunction parseHTMLContent(\n html: string,\n schema: Schema,\n options?: CreateDocumentOptions\n): PMNode {\n // Create a temporary DOM element to parse the HTML\n const element = document.createElement('div');\n element.innerHTML = html;\n\n const parser = DOMParser.fromSchema(schema);\n return parser.parse(element, options?.parseOptions);\n}\n\n/**\n * Creates a ProseMirror document from content\n *\n * **Security:** Content is NOT sanitized. If accepting user-provided HTML,\n * sanitize it first (e.g., using DOMPurify) to prevent XSS attacks.\n *\n * @param content - JSON content object, HTML string, or null/undefined\n * @param schema - ProseMirror schema to use\n * @param options - Optional parse options\n * @returns ProseMirror Node (document)\n *\n * @throws Error if content format is invalid (plain text without HTML tags)\n *\n * @example\n * ```ts\n * // JSON content\n * const doc = createDocument(\n * { type: 'doc', content: [{ type: 'paragraph' }] },\n * schema\n * );\n *\n * // HTML content\n * const doc = createDocument('<p>Hello world</p>', schema);\n *\n * // Empty document\n * const doc = createDocument(null, schema);\n * ```\n */\nexport function createDocument(\n content: Content | null | undefined,\n schema: Schema,\n options?: CreateDocumentOptions\n): PMNode {\n // Handle null/undefined/empty string - create empty document\n if (content === null || content === undefined || content === '') {\n return createEmptyDocument(schema);\n }\n\n // Handle JSON content\n if (isJSONContent(content)) {\n return PMNode.fromJSON(schema, content);\n }\n\n // Handle HTML string\n if (isHTMLContent(content)) {\n return parseHTMLContent(content, schema, options);\n }\n\n // Handle plain text string (not allowed per AD-11)\n if (typeof content === 'string') {\n throw new Error(\n 'Invalid content format: plain text is not supported. ' +\n 'Use HTML string (e.g., \"<p>Hello</p>\") or JSON content object instead.'\n );\n }\n\n // Unknown content type\n throw new Error(\n `Invalid content format: expected JSON object with 'type' property or HTML string, ` +\n `got ${typeof content}`\n );\n}\n","/**\n * Check if a ProseMirror node is empty\n */\nimport type { Node as PMNode } from '@domternal/pm/model';\n\n/**\n * Options for isNodeEmpty check\n */\nexport interface IsNodeEmptyOptions {\n /**\n * Check child nodes recursively\n * @default true\n */\n checkChildren?: boolean;\n\n /**\n * Ignore hardBreak nodes when checking emptiness\n * @default true\n */\n ignoreHardBreaks?: boolean;\n}\n\n/**\n * Checks if a ProseMirror node is considered empty\n *\n * A node is considered empty if:\n * - It has no content (childCount === 0)\n * - It only contains empty child nodes (when checkChildren is true)\n * - It only contains hardBreaks (when ignoreHardBreaks is true)\n *\n * @param node - ProseMirror node to check\n * @param options - Options for emptiness check\n * @returns true if node is empty\n *\n * @example\n * ```ts\n * // Check if document is empty\n * const empty = isNodeEmpty(editor.state.doc);\n *\n * // Check without recursion\n * const empty = isNodeEmpty(node, { checkChildren: false });\n * ```\n */\nexport function isNodeEmpty(\n node: PMNode,\n options: IsNodeEmptyOptions = {}\n): boolean {\n const { checkChildren = true, ignoreHardBreaks = true } = options;\n\n // Leaf nodes with no content\n if (node.isLeaf) {\n // Text node is empty if it has no text\n if (node.isText) {\n return !node.text || node.text.length === 0;\n }\n\n // HardBreak is considered \"empty\" if ignoreHardBreaks is true\n if (ignoreHardBreaks && node.type.name === 'hardBreak') {\n return true;\n }\n\n // Other leaf nodes (like images, horizontal rules) are not empty\n return false;\n }\n\n // No children = empty\n if (node.childCount === 0) {\n return true;\n }\n\n // If not checking children, has children = not empty\n if (!checkChildren) {\n return false;\n }\n\n // Check all children recursively (with early exit for performance)\n for (let i = 0; i < node.childCount; i++) {\n if (!isNodeEmpty(node.child(i), options)) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Checks if a document node is empty\n *\n * Convenience wrapper for isNodeEmpty with document-specific defaults.\n * A document is empty if it only contains empty paragraphs or no content.\n *\n * @param doc - Document node to check\n * @returns true if document is empty\n */\nexport function isDocumentEmpty(doc: PMNode): boolean {\n return isNodeEmpty(doc, {\n checkChildren: true,\n ignoreHardBreaks: true,\n });\n}\n","/**\n * Mark Input Rule Helper\n *\n * Creates input rules for applying marks based on regex patterns.\n * Used for markdown-style shortcuts like **bold**, *italic*, ~~strike~~, etc.\n */\nimport { InputRule } from '@domternal/pm/inputrules';\nimport type { MarkType } from '@domternal/pm/model';\nimport type { EditorState } from '@domternal/pm/state';\n\n/**\n * Options for creating a mark input rule\n */\nexport interface MarkInputRuleOptions {\n /**\n * The regex pattern to match.\n * Must have a capture group for the content to be marked.\n *\n * @example\n * // Match **text**\n * /(?:\\*\\*)([^*]+)(?:\\*\\*)$/\n */\n find: RegExp;\n\n /**\n * The mark type to apply\n */\n type: MarkType;\n\n /**\n * Whether Backspace can undo this input rule immediately after it fires.\n * @default true\n */\n undoable?: boolean;\n\n /**\n * Optional: get attributes from the match\n *\n * @param match - The regex match array\n * @returns Mark attributes or null to skip\n */\n getAttributes?: (match: RegExpMatchArray) => Record<string, unknown> | null;\n}\n\n/**\n * Creates an input rule that applies a mark to matched text.\n *\n * When the user types text matching the pattern, the delimiters are removed\n * and the mark is applied to the content.\n *\n * @example\n * // **text** → applies bold mark to \"text\"\n * markInputRule({\n * find: /(?:\\*\\*)([^*]+)(?:\\*\\*)$/,\n * type: schema.marks.bold,\n * });\n *\n * @example\n * // `text` → applies code mark to \"text\"\n * markInputRule({\n * find: /(?:`)([^`]+)(?:`)$/,\n * type: schema.marks.code,\n * });\n *\n * @param options - Configuration options\n * @returns ProseMirror InputRule\n */\nexport function markInputRule(options: MarkInputRuleOptions): InputRule {\n const { find, type, getAttributes, undoable } = options;\n\n return new InputRule(\n find,\n (state: EditorState, match: RegExpMatchArray, start: number, end: number) => {\n const attributes = getAttributes ? getAttributes(match) : null;\n\n // If getAttributes returned null, skip this rule\n if (getAttributes && attributes === null) {\n return null;\n }\n\n // match[0] = full match (e.g., \"**text**\")\n // match[1] = captured content (e.g., \"text\")\n const textContent = match[1];\n if (!textContent) {\n return null;\n }\n\n const { tr } = state;\n\n // Replace the matched text (including delimiters) with just the content\n tr.replaceWith(start, end, state.schema.text(textContent));\n\n // Apply the mark to the inserted text\n tr.addMark(start, start + textContent.length, type.create(attributes ?? undefined));\n\n // Remove the mark at the end so typing continues without the mark\n tr.removeStoredMark(type);\n\n return tr;\n },\n undoable !== undefined ? { undoable } : {},\n );\n}\n\n/**\n * Pre-built regex patterns for common mark input rules\n */\nexport const markInputRulePatterns = {\n /**\n * Bold: **text** or __text__\n * Matches text wrapped in double asterisks or underscores\n */\n bold: /(?:\\*\\*|__)([^*_]+)(?:\\*\\*|__)$/,\n\n /**\n * Strike: ~~text~~\n * Matches text wrapped in double tildes\n */\n strike: /(?:~~)([^~]+)(?:~~)$/,\n\n /**\n * Code: `text`\n * Matches text wrapped in backticks\n */\n code: /(?:`)([^`]+)(?:`)$/,\n\n /**\n * Highlight: ==text==\n * Matches text wrapped in double equals\n */\n highlight: /(?:==)([^=]+)(?:==)$/,\n} as const;\n","/**\n * Wrapping Input Rule Helper\n *\n * Drop-in replacement for ProseMirror's wrappingInputRule that exposes\n * the `undoable` option so extension authors can opt out of Backspace undo.\n */\nimport { InputRule } from '@domternal/pm/inputrules';\nimport { findWrapping, canJoin } from '@domternal/pm/transform';\nimport type { NodeType, Node, Attrs } from '@domternal/pm/model';\nimport type { EditorState } from '@domternal/pm/state';\n\nexport interface WrappingInputRuleOptions {\n /**\n * The regex pattern to match. Should start with `^` so it only\n * fires at the start of a textblock.\n */\n find: RegExp;\n\n /**\n * The node type to wrap in.\n */\n type: NodeType;\n\n /**\n * Whether Backspace can undo this input rule immediately after it fires.\n * @default true\n */\n undoable?: boolean;\n\n /**\n * Node attributes, or a function that computes them from the match.\n */\n getAttributes?: Attrs | null | ((match: RegExpMatchArray) => Attrs | null);\n\n /**\n * Predicate that decides whether to join with an adjacent node of\n * the same type above the newly wrapped node.\n */\n joinPredicate?: (match: RegExpMatchArray, node: Node) => boolean;\n\n /**\n * Optional guard predicate. When provided, the rule only fires if\n * this returns true. Use this to prevent wrapping in certain contexts\n * (e.g. don't create a nested list inside an existing list item).\n */\n guard?: (state: EditorState) => boolean;\n}\n\n/**\n * Creates an input rule that wraps a textblock in a given node type.\n *\n * @example\n * // `> ` at start of line wraps in blockquote\n * wrappingInputRule({\n * find: /^\\s*>\\s$/,\n * type: schema.nodes.blockquote,\n * });\n *\n * @example\n * // Non-undoable wrapping rule\n * wrappingInputRule({\n * find: /^\\s*>\\s$/,\n * type: schema.nodes.blockquote,\n * undoable: false,\n * });\n */\nexport function wrappingInputRule(options: WrappingInputRuleOptions): InputRule {\n const { find, type, getAttributes = null, joinPredicate, undoable, guard } = options;\n\n return new InputRule(\n find,\n (state, match, start, end) => {\n if (guard && !guard(state)) return null;\n const attrs = getAttributes instanceof Function ? getAttributes(match) : getAttributes;\n const tr = state.tr.delete(start, end);\n const $start = tr.doc.resolve(start);\n const range = $start.blockRange();\n const wrapping = range && findWrapping(range, type, attrs);\n if (!wrapping) return null;\n tr.wrap(range, wrapping);\n const before = tr.doc.resolve(start - 1).nodeBefore;\n if (before?.type === type && canJoin(tr.doc, start - 1) &&\n (!joinPredicate || joinPredicate(match, before))) {\n tr.join(start - 1);\n }\n return tr;\n },\n undoable !== undefined ? { undoable } : {},\n );\n}\n\n/**\n * Guard predicate that prevents a wrapping input rule from firing\n * when the cursor is already inside a list item (listItem or taskItem).\n * Pass as the `guard` option to `wrappingInputRule`.\n */\nexport function notInsideList(state: EditorState): boolean {\n const { $from } = state.selection;\n for (let d = $from.depth; d > 0; d--) {\n const name = $from.node(d).type.name;\n if (name === 'listItem' || name === 'taskItem') return false;\n }\n return true;\n}\n","/**\n * Textblock Type Input Rule Helper\n *\n * Drop-in replacement for ProseMirror's textblockTypeInputRule that exposes\n * the `undoable` option so extension authors can opt out of Backspace undo.\n */\nimport { InputRule } from '@domternal/pm/inputrules';\nimport type { NodeType, Attrs } from '@domternal/pm/model';\n\nexport interface TextblockTypeInputRuleOptions {\n /**\n * The regex pattern to match. Should start with `^` so it only\n * fires at the start of a textblock.\n */\n find: RegExp;\n\n /**\n * The node type to change the textblock to.\n */\n type: NodeType;\n\n /**\n * Whether Backspace can undo this input rule immediately after it fires.\n * @default true\n */\n undoable?: boolean;\n\n /**\n * Node attributes, or a function that computes them from the match.\n */\n getAttributes?: Attrs | null | ((match: RegExpMatchArray) => Attrs | null);\n}\n\n/**\n * Creates an input rule that changes the type of a textblock.\n *\n * @example\n * // `## ` at start of line converts to heading level 2\n * textblockTypeInputRule({\n * find: /^(#{1,4})\\s$/,\n * type: schema.nodes.heading,\n * getAttributes: (match) => ({ level: match[1].length }),\n * });\n */\nexport function textblockTypeInputRule(options: TextblockTypeInputRuleOptions): InputRule {\n const { find, type, getAttributes = null, undoable } = options;\n\n return new InputRule(\n find,\n (state, match, start, end) => {\n const $start = state.doc.resolve(start);\n const attrs = getAttributes instanceof Function ? getAttributes(match) : getAttributes;\n if (!$start.node(-1).canReplaceWith($start.index(-1), $start.indexAfter(-1), type)) return null;\n return state.tr\n .delete(start, end)\n .setBlockType(start, start, type, attrs);\n },\n undoable !== undefined ? { undoable } : {},\n );\n}\n","/**\n * Text Input Rule Helper\n *\n * Creates input rules for simple text replacements (e.g. `--` to em dash).\n */\nimport { InputRule } from '@domternal/pm/inputrules';\n\nexport interface TextInputRuleOptions {\n /**\n * The regex pattern to match.\n */\n find: RegExp;\n\n /**\n * The replacement text.\n */\n replace: string;\n\n /**\n * Whether Backspace can undo this input rule immediately after it fires.\n * @default true\n */\n undoable?: boolean;\n}\n\n/**\n * Creates an input rule that replaces matched text with a string.\n *\n * @example\n * // `--` converts to em dash\n * textInputRule({ find: /--$/, replace: '\\u2014' });\n *\n * @example\n * // Non-undoable replacement\n * textInputRule({ find: /->$/, replace: '\\u2192', undoable: false });\n */\nexport function textInputRule(options: TextInputRuleOptions): InputRule {\n const { find, replace, undoable } = options;\n\n return new InputRule(\n find,\n (state, _match, start, end) => state.tr.replaceWith(start, end, state.schema.text(replace)),\n undoable !== undefined ? { undoable } : {},\n );\n}\n","/**\n * Node Input Rule Helper\n *\n * Creates input rules that replace matched text with a node.\n * Used for nodes like HorizontalRule, Image, Emoji, etc.\n */\nimport { InputRule } from '@domternal/pm/inputrules';\nimport type { NodeType, Attrs } from '@domternal/pm/model';\nimport type { EditorState } from '@domternal/pm/state';\n\nexport interface NodeInputRuleOptions {\n /**\n * The regex pattern to match.\n */\n find: RegExp;\n\n /**\n * The node type to insert.\n */\n type: NodeType;\n\n /**\n * Whether Backspace can undo this input rule immediately after it fires.\n * @default true\n */\n undoable?: boolean;\n\n /**\n * Node attributes, or a function that computes them from the match.\n */\n getAttributes?: Attrs | null | ((match: RegExpMatchArray, state: EditorState) => Attrs | null);\n}\n\n/**\n * Creates an input rule that replaces matched text with a node.\n *\n * @example\n * // `:smile:` inserts an emoji node\n * nodeInputRule({\n * find: /:([a-zA-Z0-9_+-]+):$/,\n * type: schema.nodes.emoji,\n * getAttributes: (match) => ({ name: match[1] }),\n * });\n */\nexport function nodeInputRule(options: NodeInputRuleOptions): InputRule {\n const { find, type, getAttributes = null, undoable } = options;\n\n return new InputRule(\n find,\n (state, match, start, end) => {\n const attrs = getAttributes instanceof Function ? getAttributes(match, state) : getAttributes;\n if (getAttributes instanceof Function && attrs === null) return null;\n return state.tr.replaceWith(start, end, type.create(attrs));\n },\n undoable !== undefined ? { undoable } : {},\n );\n}\n","/**\n * URL Validation Helper\n *\n * Provides a utility for validating URLs.\n */\n\n/**\n * Options for URL validation\n */\nexport interface IsValidUrlOptions {\n /**\n * List of allowed URL protocols\n * @default ['http:', 'https:']\n */\n protocols?: string[];\n}\n\n/**\n * Checks if a string is a valid URL\n *\n * @param url - The string to validate\n * @param options - Validation options\n * @returns True if the string is a valid URL with an allowed protocol\n *\n * @example\n * ```ts\n * isValidUrl('https://example.com'); // true\n * isValidUrl('javascript:alert(1)'); // false (protocol not allowed)\n * isValidUrl('not a url'); // false\n * ```\n */\nexport function isValidUrl(\n url: string,\n options: IsValidUrlOptions = {}\n): boolean {\n const { protocols = ['http:', 'https:'] } = options;\n\n try {\n const parsed = new URL(url);\n return protocols.includes(parsed.protocol);\n } catch {\n return false;\n }\n}\n","/**\n * SSR Helpers\n *\n * Utilities for server-side rendering and content conversion.\n * - generateHTML: Convert JSON content to HTML string\n * - generateJSON: Convert HTML string to JSON content\n * - generateText: Extract plain text from JSON content\n *\n * Note: SSR environment requires 'linkedom' package (optional peer dependency).\n */\nimport {\n Node as PMNode,\n DOMSerializer,\n DOMParser as PMDOMParser,\n} from '@domternal/pm/model';\nimport type { Schema } from '@domternal/pm/model';\nimport type { AnyExtension, JSONContent } from '../types/index.js';\nimport { ExtensionManager } from '../ExtensionManager.js';\n\n// Declare global require for Node.js environment\ndeclare const require: (id: string) => unknown;\n\n/**\n * Build a ProseMirror schema from extensions.\n * Used internally by SSR helpers.\n */\nfunction buildSchemaFromExtensions(extensions: AnyExtension[]): Schema {\n // Create a minimal editor-like object for ExtensionManager\n const mockEditor = {\n state: null,\n view: null,\n schema: null,\n commands: {},\n };\n\n const manager = new ExtensionManager(\n { extensions },\n mockEditor as never\n );\n return manager.schema;\n}\n\n/**\n * Get a DOM document for parsing/serialization.\n * Uses native document in browser, linkedom in Node.js.\n */\nfunction getDocument(): Document {\n // Browser environment\n if (typeof window !== 'undefined') {\n return window.document;\n }\n\n // Server environment - try linkedom\n try {\n // Dynamic require to avoid bundling linkedom in browser builds\n const linkedom = require('linkedom') as { parseHTML: (html: string) => { document: Document } };\n const { document } = linkedom.parseHTML('<!DOCTYPE html><html><body></body></html>');\n return document;\n } catch {\n throw new Error(\n 'SSR requires \"linkedom\" package. Install it with: pnpm add linkedom'\n );\n }\n}\n\nexport interface GenerateHTMLOptions {\n /**\n * Custom document implementation. If not provided, uses native document\n * in browser or linkedom in Node.js.\n */\n document?: Document;\n}\n\n/**\n * Generate HTML string from JSON content.\n *\n * @param content - The JSON content to convert\n * @param extensions - Extensions that define the schema\n * @param options - Optional configuration\n * @returns HTML string\n *\n * @example\n * ```ts\n * const html = generateHTML(\n * { type: 'doc', content: [{ type: 'paragraph', content: [{ type: 'text', text: 'Hello' }] }] },\n * [Document, Paragraph, Text]\n * );\n * // Returns: '<p>Hello</p>'\n * ```\n */\nexport function generateHTML(\n content: JSONContent,\n extensions: AnyExtension[],\n options: GenerateHTMLOptions = {}\n): string {\n const schema = buildSchemaFromExtensions(extensions);\n const doc = PMNode.fromJSON(schema, content);\n const targetDocument = options.document ?? getDocument();\n\n const serializer = DOMSerializer.fromSchema(schema);\n const fragment = serializer.serializeFragment(doc.content, {\n document: targetDocument,\n });\n\n const container = targetDocument.createElement('div');\n container.appendChild(fragment);\n\n return container.innerHTML;\n}\n\nexport interface GenerateJSONOptions {\n /**\n * Custom document implementation. If not provided, uses native document\n * in browser or linkedom in Node.js.\n */\n document?: Document;\n}\n\n/**\n * Generate JSON content from HTML string.\n *\n * @param html - The HTML string to convert\n * @param extensions - Extensions that define the schema\n * @param options - Optional configuration\n * @returns JSON content object\n *\n * @example\n * ```ts\n * const json = generateJSON(\n * '<p>Hello</p>',\n * [Document, Paragraph, Text]\n * );\n * // Returns: { type: 'doc', content: [{ type: 'paragraph', content: [{ type: 'text', text: 'Hello' }] }] }\n * ```\n */\nexport function generateJSON(\n html: string,\n extensions: AnyExtension[],\n options: GenerateJSONOptions = {}\n): JSONContent {\n const schema = buildSchemaFromExtensions(extensions);\n const targetDocument = options.document ?? getDocument();\n\n // Parse HTML into DOM\n const container = targetDocument.createElement('div');\n container.innerHTML = html;\n\n // Use ProseMirror's DOMParser\n const parser = PMDOMParser.fromSchema(schema);\n const doc = parser.parse(container);\n\n return doc.toJSON() as JSONContent;\n}\n\nexport interface GenerateTextOptions {\n /**\n * Separator between block elements.\n * @default '\\n\\n'\n */\n blockSeparator?: string;\n}\n\n/**\n * Generate plain text from JSON content.\n *\n * @param content - The JSON content to extract text from\n * @param extensions - Extensions that define the schema\n * @param options - Optional configuration\n * @returns Plain text string\n *\n * @example\n * ```ts\n * const text = generateText(\n * { type: 'doc', content: [\n * { type: 'paragraph', content: [{ type: 'text', text: 'Hello' }] },\n * { type: 'paragraph', content: [{ type: 'text', text: 'World' }] }\n * ]},\n * [Document, Paragraph, Text]\n * );\n * // Returns: 'Hello\\n\\nWorld'\n * ```\n */\nexport function generateText(\n content: JSONContent,\n extensions: AnyExtension[],\n options: GenerateTextOptions = {}\n): string {\n const { blockSeparator = '\\n\\n' } = options;\n const schema = buildSchemaFromExtensions(extensions);\n const doc = PMNode.fromJSON(schema, content);\n\n return doc.textBetween(0, doc.content.size, blockSeparator);\n}\n","/**\n * Get the range of a mark at a resolved position.\n *\n * Walks backward and forward from the position to find contiguous\n * text nodes that share the same mark type, returning the full range.\n */\nimport type { MarkType, ResolvedPos } from '@domternal/pm/model';\n\nexport interface MarkRange {\n from: number;\n to: number;\n}\n\n/**\n * Returns the contiguous range of a mark around the given resolved position.\n * Returns undefined if the mark is not present at the position.\n */\nexport function getMarkRange(\n $pos: ResolvedPos,\n type: MarkType,\n): MarkRange | undefined {\n const parent = $pos.parent;\n\n // Try the node at/after cursor first, then the node before\n let start = parent.childAfter($pos.parentOffset);\n\n if (!start.node || !type.isInSet(start.node.marks)) {\n start = parent.childBefore($pos.parentOffset);\n }\n\n if (!start.node || !type.isInSet(start.node.marks)) {\n return undefined;\n }\n\n let startIndex = start.index;\n let startPos = $pos.start() + start.offset;\n let endIndex = startIndex + 1;\n let endPos = startPos + start.node.nodeSize;\n\n // Walk backward\n while (startIndex > 0 && type.isInSet(parent.child(startIndex - 1).marks)) {\n startIndex -= 1;\n startPos -= parent.child(startIndex).nodeSize;\n }\n\n // Walk forward\n while (endIndex < parent.childCount && type.isInSet(parent.child(endIndex).marks)) {\n endPos += parent.child(endIndex).nodeSize;\n endIndex += 1;\n }\n\n return { from: startPos, to: endPos };\n}\n","/**\n * Find the closest parent node matching a predicate\n *\n * Returns a curried function: findParentNode(predicate)(selection)\n *\n * @example\n * const details = findParentNode(node => node.type.name === 'details')(selection);\n * if (details) {\n * console.log(details.pos, details.node);\n * }\n */\nimport type { Node as PMNode } from '@domternal/pm/model';\nimport type { Selection } from '@domternal/pm/state';\n\nexport interface FindParentNodeResult {\n pos: number;\n start: number;\n depth: number;\n node: PMNode;\n}\n\nexport const findParentNode =\n (predicate: (node: PMNode) => boolean) =>\n (selection: Selection): FindParentNodeResult | undefined => {\n const { $from } = selection;\n\n for (let depth = $from.depth; depth > 0; depth--) {\n const node = $from.node(depth);\n\n if (predicate(node)) {\n return {\n pos: $from.before(depth),\n start: $from.start(depth),\n depth,\n node,\n };\n }\n }\n\n return undefined;\n };\n","/**\n * Find all children of a node matching a predicate\n *\n * @example\n * const summaries = findChildren(detailsNode, node => node.type.name === 'detailsSummary');\n */\nimport type { Node as PMNode } from '@domternal/pm/model';\n\nexport interface FindChildResult {\n node: PMNode;\n pos: number;\n}\n\nexport const findChildren = (\n node: PMNode,\n predicate: (node: PMNode) => boolean,\n): FindChildResult[] => {\n const result: FindChildResult[] = [];\n\n node.forEach((child, offset) => {\n if (predicate(child)) {\n result.push({ node: child, pos: offset });\n }\n });\n\n return result;\n};\n","/**\n * Get the default block type at a given content match position\n *\n * Finds the first textblock type that can be created without required attributes.\n * Useful for creating new empty blocks (e.g., paragraph after details).\n *\n * @example\n * const type = defaultBlockAt(parent.contentMatchAt(index));\n * if (type) {\n * const node = type.createAndFill();\n * }\n */\nimport type { ContentMatch, NodeType } from '@domternal/pm/model';\n\nexport const defaultBlockAt = (match: ContentMatch): NodeType | null => {\n for (let i = 0; i < match.edgeCount; i++) {\n const { type } = match.edge(i);\n\n if (type.isTextblock && !type.hasRequiredAttrs()) {\n return type;\n }\n }\n\n return null;\n};\n","/**\n * Content commands - setContent, clearContent, insertText, insertContent\n */\nimport { TextSelection } from '@domternal/pm/state';\nimport { Fragment, Slice, DOMParser as ProseMirrorDOMParser } from '@domternal/pm/model';\nimport type { CommandSpec } from '../types/Commands.js';\nimport type { Content } from '../types/index.js';\nimport { createDocument } from '../helpers/index.js';\n\n/**\n * Options for setContent command\n */\nexport interface SetContentOptions {\n /**\n * Emit update event after setting content\n * @default true\n */\n emitUpdate?: boolean;\n\n /**\n * Parse options for HTML content\n */\n parseOptions?: Record<string, unknown>;\n}\n\n/**\n * Options for clearContent command\n */\nexport interface ClearContentOptions {\n /**\n * Emit update event after clearing content\n * @default true\n */\n emitUpdate?: boolean;\n}\n\n/**\n * SetContent command - sets the editor content\n *\n * @param content - JSON or HTML content\n * @param options - Options for setting content\n */\nexport const setContent: CommandSpec<[content: Content, options?: SetContentOptions]> =\n (content: Content, options: SetContentOptions = {}) =>\n ({ state, tr, dispatch }) => {\n const { emitUpdate = true, parseOptions } = options;\n const { schema } = state;\n\n // Parse content into document (with graceful error handling)\n let doc;\n try {\n doc = createDocument(content, schema, { parseOptions });\n } catch {\n // Invalid content - return false to indicate command failed\n return false;\n }\n\n // In dry-run mode, just check if content can be created\n if (!dispatch) {\n return true;\n }\n\n // Replace entire document\n // Use tr.doc for chain compatibility - prior commands may have modified the document\n tr.replaceWith(0, tr.doc.content.size, doc.content);\n\n // Mark transaction to potentially skip update event\n if (!emitUpdate) {\n tr.setMeta('addToHistory', false);\n tr.setMeta('skipUpdate', true);\n }\n\n dispatch(tr);\n return true;\n };\n\n/**\n * ClearContent command - clears the editor content to empty state\n *\n * @param options - Options for clearing content\n */\nexport const clearContent: CommandSpec<[options?: ClearContentOptions]> =\n (options: ClearContentOptions = {}) =>\n ({ state, tr, dispatch }) => {\n const { emitUpdate = true } = options;\n const { schema } = state;\n\n // Create empty document\n const doc = createDocument(null, schema);\n\n // In dry-run mode, just return true\n if (!dispatch) {\n return true;\n }\n\n // Replace entire document\n // Use tr.doc for chain compatibility - prior commands may have modified the document\n tr.replaceWith(0, tr.doc.content.size, doc.content);\n\n if (!emitUpdate) {\n tr.setMeta('addToHistory', false);\n tr.setMeta('skipUpdate', true);\n }\n\n dispatch(tr);\n return true;\n };\n\n/**\n * InsertText command - inserts text at the current selection\n *\n * @param text - Text to insert\n */\nexport const insertText: CommandSpec<[text: string]> =\n (text: string) =>\n ({ tr, dispatch }) => {\n // Use tr.selection for chain compatibility - reflects current position\n const { from, to } = tr.selection;\n\n // For TextSelection, check if parent allows inline content\n // For other selections (AllSelection, NodeSelection), let ProseMirror handle validation\n if (tr.selection instanceof TextSelection) {\n const { $from } = tr.selection;\n if (!$from.parent.inlineContent) {\n return false;\n }\n }\n\n if (!dispatch) {\n return true;\n }\n\n tr.insertText(text, from, to);\n dispatch(tr);\n return true;\n };\n\n/**\n * InsertContent command - inserts content at the current selection\n *\n * @param content - The content to insert (JSON object, array, or HTML string)\n */\nexport const insertContent: CommandSpec<[content: Content]> =\n (content: Content) =>\n ({ state, tr, dispatch }) => {\n const { schema } = state;\n const { from, to } = tr.selection;\n\n // Parse content based on type\n let fragment: Fragment;\n\n if (typeof content === 'string') {\n // HTML string - parse using DOMParser\n if (typeof window === 'undefined') {\n return false; // Can't parse HTML in SSR without DOM\n }\n\n const parser = ProseMirrorDOMParser.fromSchema(schema);\n const wrapper = document.createElement('div');\n wrapper.innerHTML = content;\n const parsed = parser.parse(wrapper);\n fragment = parsed.content;\n } else if (content && typeof content === 'object') {\n // JSON content\n if (Array.isArray(content)) {\n // Array of nodes\n const nodes = content.map(item => schema.nodeFromJSON(item));\n fragment = Fragment.from(nodes);\n } else if ('type' in content) {\n // Single node or document\n const node = schema.nodeFromJSON(content);\n // If it's a doc, use its content; otherwise wrap in fragment\n fragment = node.type.name === 'doc' ? node.content : Fragment.from(node);\n } else {\n return false;\n }\n } else {\n return false;\n }\n\n if (!dispatch) {\n return true;\n }\n\n // Insert the content\n tr.replaceRange(from, to, new Slice(fragment, 0, 0));\n dispatch(tr);\n return true;\n };\n","/**\n * Extension - Base class for all extensions\n *\n * Extensions provide functionality without contributing to the schema.\n * For schema contributions, use Node (for block/inline nodes) or Mark (for inline formatting).\n *\n * Three-tier model:\n * - Extension (type: 'extension') → Pure functionality (History, Placeholder, etc.)\n * - Node (type: 'node') → Schema nodes (Paragraph, Heading, etc.)\n * - Mark (type: 'mark') → Schema marks (Bold, Italic, etc.)\n *\n * @example\n * const History = Extension.create({\n * name: 'history',\n * addOptions() {\n * return { depth: 100 };\n * },\n * addKeyboardShortcuts() {\n * return {\n * 'Mod-z': () => this.editor.commands.undo(),\n * 'Mod-Shift-z': () => this.editor.commands.redo(),\n * };\n * },\n * });\n */\n\nimport type { ExtensionConfig, ExtensionConfigBase, ExtensionContext } from './types/ExtensionConfig.js';\nimport type { SingleCommands } from './types/Commands.js';\nimport type { EditorState } from '@domternal/pm/state';\nimport type { EditorView } from '@domternal/pm/view';\nimport { callOrReturn } from './helpers/callOrReturn.js';\n\n/**\n * Merges extension config with parent binding support.\n *\n * For each function in `extendedConfig` that overrides a function in `parentConfig`,\n * wraps the override so that `this.parent` temporarily points to the parent's version.\n * This enables the `this.parent?.()` pattern in extend():\n *\n * ```typescript\n * Paragraph.extend({\n * addAttributes() {\n * return { ...this.parent?.(), align: { default: 'left' } };\n * },\n * });\n * ```\n */\nexport function mergeConfigWithParentBinding(\n parentConfig: object,\n extendedConfig: object,\n): object {\n const parent = parentConfig as Record<string, unknown>;\n const merged: Record<string, unknown> = { ...parent };\n\n for (const [key, value] of Object.entries(extendedConfig)) {\n if (typeof value === 'function' && typeof parent[key] === 'function') {\n const parentFn = parent[key] as (...args: unknown[]) => unknown;\n const childFn = value as (...args: unknown[]) => unknown;\n\n merged[key] = function (this: Extension, ...args: unknown[]) {\n const previousParent = this.parent;\n this.parent = (...pArgs: unknown[]) => parentFn.call(this, ...pArgs);\n const result = childFn.call(this, ...args);\n this.parent = previousParent;\n return result;\n };\n } else {\n merged[key] = value;\n }\n }\n\n return merged;\n}\n\n/**\n * Editor interface for Extension\n * Forward declaration to avoid circular dependency\n */\nexport interface ExtensionEditorInterface {\n readonly state: EditorState;\n readonly view: EditorView;\n readonly schema: unknown;\n readonly commands: SingleCommands;\n}\n\n/**\n * Base class for all extensions\n *\n * @typeParam Options - Extension options type\n * @typeParam Storage - Extension storage type\n */\nexport class Extension<Options = unknown, Storage = unknown> {\n /**\n * Extension type identifier\n * Used to distinguish between Extension, Node, and Mark\n * Subclasses override this to 'node' or 'mark'\n */\n readonly type: 'extension' | 'node' | 'mark' = 'extension';\n\n /**\n * Unique extension name\n */\n readonly name: string;\n\n /**\n * Extension options (immutable after creation)\n */\n readonly options: Options;\n\n /**\n * Extension storage (mutable state)\n * Accessible via editor.storage[extensionName]\n */\n storage: Storage;\n\n /**\n * The original configuration object\n */\n readonly config: ExtensionConfig<Options, Storage>;\n\n /**\n * Editor instance (set by ExtensionManager after creation)\n * null until ExtensionManager binds it\n */\n editor: ExtensionEditorInterface | null = null;\n\n /**\n * Reference to the parent config method when using extend().\n * Set temporarily during config method execution so overridden\n * methods can call `this.parent?.()` to invoke the original.\n */\n parent?: ((...args: unknown[]) => unknown) | undefined;\n\n /**\n * Protected constructor - use Extension.create() instead\n */\n protected constructor(config: ExtensionConfig<Options, Storage>) {\n // Validate extension name (must be camelCase starting with lowercase letter)\n if (!/^[a-z][a-zA-Z0-9]*$/.test(config.name)) {\n throw new Error(\n `Extension name '${config.name}' is invalid. ` +\n `Names must be camelCase starting with a lowercase letter (e.g., 'myExtension').`\n );\n }\n\n this.config = config;\n this.name = config.name;\n\n // Initialize options using addOptions() with `this` context\n // If addOptions is not defined, default to empty object\n const defaultOptions = callOrReturn(config.addOptions, this);\n this.options = (defaultOptions ?? {}) as Options;\n\n // Initialize storage using addStorage() with `this` context\n // If addStorage is not defined, default to empty object\n const defaultStorage = callOrReturn(config.addStorage, this);\n this.storage = (defaultStorage ?? {}) as Storage;\n }\n\n /**\n * Creates a new extension instance\n *\n * @param config - Extension configuration\n * @returns New extension instance\n *\n * @example\n * const MyExtension = Extension.create({\n * name: 'myExtension',\n * addOptions() {\n * return { enabled: true };\n * },\n * });\n */\n static create<O = unknown, S = unknown>(\n config: ExtensionConfig<O, S>\n ): Extension<O, S> {\n return new Extension(config);\n }\n\n /**\n * Creates a new extension with merged options\n * Original extension is not modified\n *\n * **Note:** Options are merged shallowly using object spread (`...`).\n * Nested objects are replaced entirely, not deeply merged.\n *\n * @param options - Options to merge with existing options\n * @returns New extension instance with merged options\n *\n * @example\n * const configured = MyExtension.configure({ enabled: false });\n *\n * @example\n * // Shallow merge behavior with nested objects:\n * // Given: options = { nested: { a: 1, b: 2 } }\n * // configure({ nested: { b: 3 } })\n * // Result: { nested: { b: 3 } } - 'a' is lost!\n * // To preserve nested values, spread manually:\n * // configure({ nested: { ...original.options.nested, b: 3 } })\n */\n configure(options: Partial<Options>): Extension<Options, Storage> {\n // Create new config with merged options\n const newConfig: ExtensionConfig<Options, Storage> = {\n ...this.config,\n // Override addOptions to return merged options\n addOptions: () => ({\n ...this.options,\n ...options,\n }),\n };\n\n return new Extension(newConfig);\n }\n\n /**\n * Creates a new extension with extended configuration\n * Original extension is not modified\n *\n * **Note:** Config is merged shallowly using object spread (`...`).\n * Config properties (like `addCommands`, `addKeyboardShortcuts`) are\n * replaced entirely, not combined with the base extension's config.\n *\n * @param extendedConfig - Configuration to extend/override\n * @returns New extension instance with extended config\n *\n * @example\n * const Extended = MyExtension.extend({\n * name: 'extendedExtension',\n * addCommands() {\n * return { customCommand: () => ({ tr }) => true };\n * },\n * });\n *\n * @example\n * // To preserve base extension's commands while adding new ones:\n * const Extended = BaseExtension.extend({\n * addCommands() {\n * const baseCommands = BaseExtension.config.addCommands?.call(this) ?? {};\n * return {\n * ...baseCommands,\n * newCommand: () => ({ tr }) => true,\n * };\n * },\n * });\n */\n extend<ExtendedOptions = Options, ExtendedStorage = Storage>(\n extendedConfig: Partial<ExtensionConfigBase<ExtendedOptions, ExtendedStorage>> &\n ThisType<ExtensionContext<ExtendedOptions, ExtendedStorage>>\n ): Extension<ExtendedOptions, ExtendedStorage> {\n const newConfig = mergeConfigWithParentBinding(this.config, extendedConfig);\n\n return new Extension(newConfig as ExtensionConfig<ExtendedOptions, ExtendedStorage>);\n }\n}\n","/**\n * Shared helpers for building ProseMirror node/mark specs.\n *\n * Used by both Node.createNodeSpec() and Mark.createMarkSpec() to\n * eliminate duplicated attribute conversion and HTML attribute building.\n */\nimport type { AttributeSpecs } from '../types/AttributeSpec.js';\n\n/**\n * Converts extension AttributeSpecs to ProseMirror-compatible `attrs` object.\n *\n * @example\n * spec.attrs = buildProseMirrorAttrs(attributeSpecs);\n */\nexport function buildProseMirrorAttrs(\n attributeSpecs: AttributeSpecs,\n): Record<string, { default?: unknown }> {\n const attrs: Record<string, { default?: unknown }> = {};\n\n for (const [name, attrSpec] of Object.entries(attributeSpecs)) {\n const attr: Record<string, unknown> = {\n default: attrSpec.default,\n };\n // Add validate if defined (ProseMirror 1.22.0+)\n if (attrSpec.validate) {\n attr['validate'] = attrSpec.validate;\n }\n attrs[name] = attr;\n }\n\n return attrs;\n}\n\n/**\n * Builds an HTML attributes object from a node/mark's attrs using the\n * attribute specs' renderHTML functions.\n *\n * Used inside toDOM wrappers for both nodes and marks.\n *\n * @example\n * const htmlAttrs = buildHTMLAttributes(node.attrs, attrSpecs);\n * return renderFn.call(instance, { node, HTMLAttributes: htmlAttrs });\n */\nexport function buildHTMLAttributes(\n attrs: Record<string, unknown>,\n attrSpecs: AttributeSpecs,\n): Record<string, unknown> {\n const htmlAttrs: Record<string, unknown> = {};\n\n for (const [name, attrSpec] of Object.entries(attrSpecs)) {\n // Skip if not rendered\n if (attrSpec.rendered === false) continue;\n\n // Use renderHTML if defined, otherwise add directly\n if (attrSpec.renderHTML) {\n const rendered = attrSpec.renderHTML(attrs);\n if (rendered) {\n Object.assign(htmlAttrs, rendered);\n }\n } else if (attrs[name] !== undefined && attrs[name] !== null) {\n // Default: use attribute value directly\n htmlAttrs[name] = attrs[name];\n }\n }\n\n return htmlAttrs;\n}\n","/**\n * Mark - Base class for mark extensions\n *\n * Marks define inline formatting that can be applied to text.\n * Examples: Bold, Italic, Link, Code, etc.\n *\n * Three-tier model:\n * - Extension (type: 'extension') → Pure functionality (History, Placeholder, etc.)\n * - Node (type: 'node') → Schema nodes (Paragraph, Heading, etc.)\n * - Mark (type: 'mark') → Schema marks (Bold, Italic, etc.)\n *\n * @example\n * const Bold = Mark.create({\n * name: 'bold',\n * parseHTML() {\n * return [\n * { tag: 'strong' },\n * { tag: 'b' },\n * { style: 'font-weight=bold' },\n * ];\n * },\n * renderHTML({ HTMLAttributes }) {\n * return ['strong', HTMLAttributes, 0];\n * },\n * });\n */\n\nimport type { MarkSpec, MarkType, ParseRule } from '@domternal/pm/model';\nimport { Extension, type ExtensionEditorInterface, mergeConfigWithParentBinding } from './Extension.js';\nimport type { MarkConfig, MarkContext } from './types/MarkConfig.js';\nimport { callOrReturn } from './helpers/callOrReturn.js';\nimport { buildProseMirrorAttrs, buildHTMLAttributes } from './helpers/specBuilder.js';\n\n/**\n * Extended editor interface for Mark\n * Includes schema access for MarkType getter\n */\nexport interface MarkEditorInterface extends ExtensionEditorInterface {\n readonly schema: {\n marks: Record<string, MarkType>;\n };\n}\n\n/**\n * Base class for mark extensions\n *\n * @typeParam Options - Mark options type\n * @typeParam Storage - Mark storage type\n */\nexport class Mark<Options = unknown, Storage = unknown> extends Extension<\n Options,\n Storage\n> {\n /**\n * Mark type identifier\n * Distinguishes marks from extensions and nodes\n */\n override readonly type = 'mark' as const;\n\n /**\n * The original configuration object\n * Typed as MarkConfig for mark-specific properties\n */\n declare readonly config: MarkConfig<Options, Storage>;\n\n /**\n * Editor instance with schema access\n * null until set by ExtensionManager\n */\n override editor: MarkEditorInterface | null = null;\n\n /**\n * Protected constructor - use Mark.create() instead\n */\n protected constructor(config: MarkConfig<Options, Storage>) {\n super(config);\n }\n\n /**\n * Whether this mark represents visual formatting.\n * Returns false for semantic marks (links, comments) that should\n * survive `unsetAllMarks`. Defaults to true.\n */\n get isFormatting(): boolean {\n return this.config.isFormatting !== false;\n }\n\n /**\n * Get the ProseMirror MarkType from schema\n *\n * This is a lazy getter because schema doesn't exist at mark creation time.\n * Schema is built FROM marks by ExtensionManager.\n *\n * Returns null if editor is not yet initialized.\n * Always check editor is set before using markType.\n */\n get markType(): MarkType | null {\n if (!this.editor) {\n return null;\n }\n return this.editor.schema.marks[this.name] ?? null;\n }\n\n /**\n * Get MarkType or throw if not initialized.\n * Use in contexts where editor is guaranteed to be set (like addCommands).\n */\n get markTypeOrThrow(): MarkType {\n const type = this.markType;\n if (!type) {\n throw new Error(\n `Mark \"${this.name}\" is not initialized. ` +\n `Make sure the editor is created before accessing markType.`\n );\n }\n return type;\n }\n\n /**\n * Creates a new mark instance\n *\n * @param config - Mark configuration\n * @returns New mark instance\n *\n * @example\n * const Bold = Mark.create({\n * name: 'bold',\n * parseHTML() {\n * return [{ tag: 'strong' }, { tag: 'b' }];\n * },\n * });\n */\n static override create<O = unknown, S = unknown>(\n config: MarkConfig<O, S>\n ): Mark<O, S> {\n return new Mark(config);\n }\n\n /**\n * Creates a new mark with merged options. Original mark is not modified.\n * Options merge shallowly (object spread); see {@link Extension.configure}\n * for the nested-object gotcha and a workaround.\n *\n * @example\n * const CustomBold = Bold.configure({ HTMLAttributes: { class: 'custom-bold' } });\n */\n override configure(options: Partial<Options> & { isFormatting?: boolean }): Mark<Options, Storage> {\n const { isFormatting, ...restOptions } = options as Record<string, unknown> & { isFormatting?: boolean };\n const newConfig: MarkConfig<Options, Storage> = {\n ...this.config,\n ...(isFormatting !== undefined ? { isFormatting } : {}),\n addOptions: () => ({\n ...this.options,\n ...restOptions as Partial<Options>,\n }),\n };\n\n return new Mark(newConfig);\n }\n\n /**\n * Creates a new mark with extended configuration\n * Original mark is not modified\n *\n * **Note:** Config is merged shallowly using object spread (`...`).\n * Config properties (like `addAttributes`, `parseHTML`) are\n * replaced entirely, not combined with the base mark's config.\n *\n * @param extendedConfig - Configuration to extend/override\n * @returns New mark instance with extended config\n *\n * @example\n * const CustomBold = Bold.extend({\n * name: 'customBold',\n * addAttributes() {\n * return { ...this.parent?.(), weight: { default: 'bold' } };\n * },\n * });\n *\n * @example\n * // To preserve base mark's parse rules while adding new ones:\n * const Extended = BaseMark.extend({\n * parseHTML() {\n * const baseRules = BaseMark.config.parseHTML?.call(this) ?? [];\n * return [...baseRules, { tag: 'custom-tag' }];\n * },\n * });\n */\n override extend<ExtendedOptions = Options, ExtendedStorage = Storage>(\n extendedConfig: Partial<MarkConfig<ExtendedOptions, ExtendedStorage>> &\n ThisType<MarkContext<ExtendedOptions, ExtendedStorage>>\n ): Mark<ExtendedOptions, ExtendedStorage> {\n const newConfig = mergeConfigWithParentBinding(this.config, extendedConfig);\n\n return new Mark(newConfig as MarkConfig<ExtendedOptions, ExtendedStorage>);\n }\n\n /**\n * Creates a ProseMirror MarkSpec from this mark's configuration\n *\n * Called by ExtensionManager when building the schema.\n * Converts our config format to ProseMirror's MarkSpec format.\n *\n * @returns ProseMirror MarkSpec\n */\n createMarkSpec(): MarkSpec {\n const spec: MarkSpec = {};\n\n // Schema properties - copy directly if defined\n if (this.config.inclusive !== undefined)\n spec.inclusive = callOrReturn(this.config.inclusive, this);\n if (this.config.excludes !== undefined)\n spec.excludes = this.config.excludes;\n if (this.config.group !== undefined) spec.group = this.config.group;\n if (this.config.spanning !== undefined)\n spec.spanning = this.config.spanning;\n\n // Attributes - convert AttributeSpecs to ProseMirror attrs\n const attributeSpecs = callOrReturn(this.config.addAttributes, this);\n if (attributeSpecs) {\n spec.attrs = buildProseMirrorAttrs(attributeSpecs);\n }\n\n // Parse rules - convert to parseDOM\n const parseRules = callOrReturn(this.config.parseHTML, this);\n if (parseRules && parseRules.length > 0) {\n // Build parseDOM array with proper typing\n const parseDOMRules = parseRules.map((rule) => {\n // Build parse rule object\n const parseRule: {\n tag?: string;\n style?: string;\n priority?: number;\n consuming?: boolean;\n getAttrs?: (\n node: HTMLElement | string\n ) => Record<string, unknown> | false | null;\n } = {};\n\n if (rule.tag) parseRule.tag = rule.tag;\n if (rule.style) parseRule.style = rule.style;\n if (rule.priority !== undefined) parseRule.priority = rule.priority;\n if (rule.consuming !== undefined) parseRule.consuming = rule.consuming;\n\n // Handle getAttrs - need to merge with attribute parseHTML\n if (rule.getAttrs || attributeSpecs) {\n parseRule.getAttrs = (node: HTMLElement | string) => {\n // Get attrs from rule\n const ruleAttrs = rule.getAttrs ? rule.getAttrs(node) : {};\n\n // If rule returned null or false, skip this rule\n if (ruleAttrs === null || ruleAttrs === false) {\n return ruleAttrs;\n }\n\n // Get attrs from attribute parseHTML functions\n const parsedAttrs: Record<string, unknown> = { ...ruleAttrs };\n\n // Only run attribute parseHTML for element-based rules\n // For style-based rules (where node is a string), the rule.getAttrs\n // already handles extracting values from the style string\n if (attributeSpecs && typeof node !== 'string') {\n for (const [name, attrSpec] of Object.entries(attributeSpecs)) {\n if (attrSpec.parseHTML) {\n parsedAttrs[name] = attrSpec.parseHTML(node);\n }\n }\n }\n\n return parsedAttrs;\n };\n }\n\n return parseRule;\n });\n\n // Cast required: Our MarkParseRule type is structurally compatible with\n // ProseMirror's ParseRule but TypeScript can't infer this due to\n // our custom getAttrs return type. The cast is safe.\n spec.parseDOM = parseDOMRules as unknown as readonly ParseRule[];\n }\n\n // Render - convert renderHTML to toDOM\n if (this.config.renderHTML) {\n const renderFn = this.config.renderHTML;\n const attrSpecs = attributeSpecs;\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const markInstance = this;\n\n spec.toDOM = (mark, _inline) => {\n const htmlAttrs = attrSpecs\n ? buildHTMLAttributes(mark.attrs, attrSpecs)\n : {};\n\n return renderFn.call(markInstance, { mark, HTMLAttributes: htmlAttrs });\n };\n }\n\n return spec;\n }\n}\n","/**\n * Mark commands - toggleMark, setMark, unsetMark, unsetAllMarks\n */\nimport type { Attrs, MarkType } from '@domternal/pm/model';\nimport type { EditorState, Transaction } from '@domternal/pm/state';\nimport type { CommandSpec } from '../types/Commands.js';\nimport { Mark } from '../Mark.js';\n\n/**\n * Checks if a mark can be applied in the current selection context.\n * Shared by toggleMark and setMark to avoid duplicated logic.\n *\n * For empty selections: checks that the cursor is in inline content,\n * the parent allows the mark type, and no existing marks exclude it.\n *\n * For range selections: checks that at least one parent allows the mark\n * and that applicable text exists (text not excluded by other marks).\n */\nfunction canApplyMark(\n state: EditorState,\n tr: Transaction,\n markType: MarkType,\n): boolean {\n const { empty, ranges } = tr.selection;\n const firstRange = ranges[0];\n if (!firstRange) return false;\n\n if (empty) {\n const $pos = tr.doc.resolve(firstRange.$from.pos);\n if (!$pos.parent.inlineContent || !$pos.parent.type.allowsMarkType(markType)) {\n return false;\n }\n const cursorMarks = tr.storedMarks ?? state.storedMarks ?? $pos.marks();\n if (cursorMarks.some((m) => m.type.excludes(markType) && m.type !== markType)) {\n return false;\n }\n } else {\n const ctx = { parentAllows: false, hasText: false, hasApplicableText: false };\n for (const range of ranges) {\n tr.doc.nodesBetween(range.$from.pos, range.$to.pos, (node) => {\n if (node.inlineContent && node.type.allowsMarkType(markType)) {\n ctx.parentAllows = true;\n }\n if (node.isText) {\n ctx.hasText = true;\n if (!node.marks.some((m) => m.type.excludes(markType) && m.type !== markType)) {\n ctx.hasApplicableText = true;\n }\n }\n });\n }\n if (!ctx.parentAllows || (ctx.hasText && !ctx.hasApplicableText)) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * ToggleMark command - toggles a mark on the current selection\n *\n * In cursor mode (empty selection): toggles stored mark.\n * In range mode: applies/removes mark across the entire selection,\n * respecting CellSelection ranges.\n *\n * @param markName - The name of the mark to toggle\n * @param attributes - Optional attributes for the mark\n */\nexport const toggleMark: CommandSpec<[markName: string, attributes?: Attrs]> =\n (markName: string, attributes?: Attrs) =>\n ({ state, tr, dispatch }) => {\n const markType = state.schema.marks[markName];\n\n if (!markType) {\n return false;\n }\n\n if (!canApplyMark(state, tr, markType)) {\n return false;\n }\n\n const { empty, ranges } = tr.selection;\n const firstRange = ranges[0];\n if (!firstRange) return false;\n\n if (!dispatch) return true;\n\n if (empty) {\n // Cursor mode - toggle stored mark\n const from = firstRange.$from.pos;\n const cursorMarks = tr.storedMarks\n ?? state.storedMarks\n ?? tr.doc.resolve(from).marks();\n\n if (markType.isInSet(cursorMarks)) {\n tr.removeStoredMark(markType);\n } else {\n tr.addStoredMark(markType.create(attributes ?? null));\n }\n } else {\n // Range mode - iterate over selection ranges (handles CellSelection)\n const hasMark = ranges.every(range =>\n tr.doc.rangeHasMark(range.$from.pos, range.$to.pos, markType),\n );\n for (const range of ranges) {\n if (hasMark) {\n tr.removeMark(range.$from.pos, range.$to.pos, markType);\n } else {\n tr.addMark(range.$from.pos, range.$to.pos, markType.create(attributes ?? null));\n }\n }\n }\n\n dispatch(tr);\n return true;\n };\n\n/**\n * SetMark command - adds a mark to the current selection\n *\n * @param markName - The name of the mark to set\n * @param attributes - Optional attributes for the mark\n */\nexport const setMark: CommandSpec<[markName: string, attributes?: Attrs]> =\n (markName: string, attributes?: Attrs) =>\n ({ state, tr, dispatch }) => {\n const markType = state.schema.marks[markName];\n\n if (!markType) {\n return false;\n }\n\n if (!canApplyMark(state, tr, markType)) {\n return false;\n }\n\n const { empty, ranges } = tr.selection;\n const firstRange = ranges[0];\n if (!firstRange) return false;\n\n // Cursor mode - add to stored marks\n if (empty) {\n if (!dispatch) return true;\n\n const from = firstRange.$from.pos;\n // Merge with existing mark attributes to preserve sibling attributes\n // (e.g., fontFamily should not be lost when setting fontSize on textStyle)\n // Priority: stored marks on tr > stored marks on state > marks at cursor position\n const existingMark = tr.storedMarks?.find(m => m.type === markType)\n ?? state.storedMarks?.find(m => m.type === markType)\n ?? tr.doc.resolve(from).marks().find(m => m.type === markType)\n ?? null;\n const mergedAttrs = existingMark\n ? { ...existingMark.attrs, ...attributes }\n : attributes;\n\n const mark = markType.create(mergedAttrs);\n tr.addStoredMark(mark);\n dispatch(tr);\n return true;\n }\n\n if (!dispatch) {\n return true;\n }\n\n // Merge per-node to preserve each node's own attributes.\n // E.g., one word has fontFamily: 'Arial', another has 'Georgia';\n // setting fontSize should preserve each node's fontFamily independently.\n // Iterate over selection ranges to handle CellSelection (multiple ranges)\n const nodeMarks: { from: number; to: number; attrs: Attrs }[] = [];\n for (const range of ranges) {\n const rfrom = range.$from.pos;\n const rto = range.$to.pos;\n tr.doc.nodesBetween(rfrom, rto, (node, pos) => {\n if (!node.isText) return;\n const existing = markType.isInSet(node.marks);\n const nodeAttrs = existing\n ? { ...existing.attrs, ...attributes }\n : (attributes ?? {});\n nodeMarks.push({\n from: Math.max(pos, rfrom),\n to: Math.min(pos + node.nodeSize, rto),\n attrs: nodeAttrs,\n });\n });\n }\n\n if (nodeMarks.length > 0) {\n for (const nm of nodeMarks) {\n tr.addMark(nm.from, nm.to, markType.create(nm.attrs));\n }\n } else {\n // No text nodes found (e.g., selection across empty blocks) - apply globally\n for (const range of ranges) {\n tr.addMark(range.$from.pos, range.$to.pos, markType.create(attributes));\n }\n }\n\n dispatch(tr);\n return true;\n };\n\n/**\n * UnsetMark command - removes a mark from the current selection\n *\n * @param markName - The name of the mark to remove\n */\nexport const unsetMark: CommandSpec<[markName: string]> =\n (markName: string) =>\n ({ state, tr, dispatch }) => {\n const markType = state.schema.marks[markName];\n\n if (!markType) {\n return false;\n }\n\n const { empty, ranges } = tr.selection;\n\n // For empty selection, remove from stored marks\n if (empty) {\n if (!dispatch) {\n return true;\n }\n\n tr.removeStoredMark(markType);\n dispatch(tr);\n return true;\n }\n\n if (!dispatch) {\n return true;\n }\n\n for (const range of ranges) {\n tr.removeMark(range.$from.pos, range.$to.pos, markType);\n }\n dispatch(tr);\n return true;\n };\n\n/**\n * UnsetAllMarks command - removes all formatting marks from the current selection\n *\n * Iterates over all mark types in the schema and removes those with\n * `isFormatting !== false`. Marks like Link that set `isFormatting: false`\n * are preserved.\n *\n * Returns false for empty selections (no range to clear).\n */\nexport const unsetAllMarks: CommandSpec =\n () =>\n ({ state, tr, dispatch, editor }) => {\n const { empty, ranges } = tr.selection;\n\n if (empty) return false;\n if (!dispatch) return true;\n\n // Build set of non-formatting mark names to skip.\n // Mark extensions with isFormatting: false (e.g. Link) survive clear formatting.\n const skipMarks = new Set<string>();\n const mgr = (editor as unknown as { extensionManager: { extensions: readonly unknown[] } }).extensionManager;\n for (const ext of mgr.extensions) {\n if (ext instanceof Mark && !ext.isFormatting) {\n skipMarks.add(ext.name);\n }\n }\n\n for (const markName of Object.keys(state.schema.marks)) {\n if (!skipMarks.has(markName)) {\n for (const range of ranges) {\n tr.removeMark(range.$from.pos, range.$to.pos, state.schema.marks[markName]);\n }\n }\n }\n tr.setStoredMarks([]);\n dispatch(tr);\n return true;\n };\n","/**\n * Shared helpers for locating a list/task item ancestor of a resolved\n * position. Centralises the `LIST_ITEM_TYPE_NAMES` constant + ancestor\n * walk so the four+ consumers (liftCurrentListItem, splitListForInsert,\n * TaskItem keymap, Details proactive lift, slash menu filtering) stay\n * in sync.\n */\nimport type { ResolvedPos } from '@domternal/pm/model';\n\nexport const LIST_ITEM_TYPE_NAMES = new Set(['listItem', 'taskItem']);\n\n/**\n * Returns the depth at which the nearest list/task item ancestor sits,\n * or -1 if none.\n *\n * Walks UP from `$pos.depth` toward 1 (we skip depth 0 = doc itself).\n */\nexport function findListItemAncestorDepth($pos: ResolvedPos): number {\n for (let d = $pos.depth; d >= 1; d--) {\n if (LIST_ITEM_TYPE_NAMES.has($pos.node(d).type.name)) return d;\n }\n return -1;\n}\n\n/** Convenience: true when the cursor has a list/task item ancestor. */\nexport function isInsideListItem($pos: ResolvedPos): boolean {\n return findListItemAncestorDepth($pos) !== -1;\n}\n\n/**\n * True when the cursor sits in the LABEL paragraph (index 0) of its\n * nearest list/task item ancestor. Used to gate Notion-style \"operate\n * on the label\" commands (slash menu CONVERT, INSERT, etc.).\n */\nexport function isInListItemLabel($pos: ResolvedPos): boolean {\n const d = findListItemAncestorDepth($pos);\n if (d === -1) return false;\n return $pos.index(d) === 0;\n}\n","/**\n * Lifts the list/task item that contains the cursor when the cursor sits\n * in the LABEL paragraph (first child) of that item. PM's `liftListItem`\n * splits the parent list naturally so siblings before/after end up in\n * separate lists, and the lifted item becomes a top-level paragraph\n * carrying the original content.\n *\n * Used by \"CONVERT\" slash-menu commands (Heading, Code block, Quote,\n * Details) to escape a list-item label before re-typing or wrapping\n * the now top-level paragraph.\n */\nimport { liftListItem } from '@domternal/pm/schema-list';\nimport type { EditorState, Transaction } from '@domternal/pm/state';\nimport { findListItemAncestorDepth } from './listItemAncestor.js';\n\n/**\n * Activation conditions (single-cursor only):\n * - selection is empty (single caret)\n * - cursor's nearest list-item ancestor exists\n * - cursor's containing block is at index 0 (label slot) of that item\n * - `tr` has no prior steps (lift steps captured from a fresh state must\n * replay against the same starting state as `tr`)\n *\n * Returns true if the lift was applied to `tr`. The caller can keep\n * chaining work on `tr` (e.g. `setBlockType`, `wrapIn`) on the new\n * top-level paragraph.\n */\nexport function liftCurrentListItem(\n state: EditorState,\n tr: Transaction,\n): boolean {\n if (!tr.selection.empty) return false;\n if (tr.steps.length !== 0) return false;\n\n const { $from } = tr.selection;\n const listItemDepth = findListItemAncestorDepth($from);\n if (listItemDepth === -1) return false;\n if ($from.index(listItemDepth) !== 0) return false;\n\n const listItemType = $from.node(listItemDepth).type;\n return liftListItem(listItemType)(state, (liftTr) => {\n for (const step of liftTr.steps) tr.step(step);\n if (liftTr.selectionSet) tr.setSelection(liftTr.selection);\n });\n}\n","/**\n * Node commands - setBlockType, toggleBlockType, wrapIn, toggleWrap, lift\n */\nimport { findWrapping, liftTarget } from '@domternal/pm/transform';\nimport type { Attrs, Node as PMNode } from '@domternal/pm/model';\nimport type { CommandSpec } from '../types/Commands.js';\nimport { liftCurrentListItem } from '../utils/liftCurrentListItem.js';\n\n/**\n * SetBlockType command - changes the block type of the selection\n *\n * Uses tr.doc/tr.selection for chain compatibility. Preserves global\n * attributes (textAlign, lineHeight, etc.) by merging existing node\n * attrs with the provided ones via tr.setBlockType's function form.\n *\n * @param nodeName - The name of the node type to set\n * @param attributes - Optional attributes for the node\n */\nexport const setBlockType: CommandSpec<[nodeName: string, attributes?: Attrs]> =\n (nodeName: string, attributes?: Attrs) =>\n ({ state, tr, dispatch }) => {\n const nodeType = state.schema.nodes[nodeName];\n\n if (!nodeType) {\n return false;\n }\n\n // Check if any textblock in the selection can be changed\n const canApply = tr.selection.ranges.some((range) => {\n let found = false;\n tr.doc.nodesBetween(range.$from.pos, range.$to.pos, (node, pos) => {\n if (found) return false;\n if (!node.isTextblock) return;\n const mergedAttrs = { ...node.attrs, ...(attributes ?? {}) };\n if (node.hasMarkup(nodeType, mergedAttrs)) return;\n if (node.type === nodeType) {\n found = true;\n } else {\n const $pos = tr.doc.resolve(pos);\n const index = $pos.index();\n found = $pos.parent.canReplaceWith(index, index + 1, nodeType);\n }\n return;\n });\n return found;\n });\n\n if (!canApply) {\n // Notion-style fallback: cursor sits in the LABEL paragraph (the\n // schema-required first child) of a list/task item and the\n // requested block type cannot fit there. Dissolve the list item\n // by lifting it out, then retry the convert on the (now\n // top-level) paragraph - the user types `/heading 1` in a\n // to-do label and the to-do becomes a heading.\n const liftOk = liftCurrentListItem(state, tr);\n if (!liftOk) return false;\n\n // After the lift, the (formerly) label paragraph sits one\n // wrapper level higher. Verify the new BLOCK PARENT accepts the\n // requested node type at the paragraph's index. We check the\n // BLOCK PARENT, not `$reFrom.parent` (which is the textblock\n // itself), because `canReplaceWith` applies at the parent's\n // content slot.\n const $reFrom = tr.doc.resolve(tr.selection.from);\n if ($reFrom.depth < 1) return false;\n const blockParent = $reFrom.node($reFrom.depth - 1);\n const blockIndex = $reFrom.index($reFrom.depth - 1);\n if (!blockParent.canReplaceWith(blockIndex, blockIndex + 1, nodeType)) {\n return false;\n }\n if (!dispatch) return true;\n\n tr.setBlockType(\n tr.selection.from,\n tr.selection.to,\n nodeType,\n (node) => ({ ...node.attrs, ...(attributes ?? {}) }),\n );\n dispatch(tr.scrollIntoView());\n return true;\n }\n if (!dispatch) return true;\n\n // Apply: use function attrs to preserve global attributes (textAlign, lineHeight, etc.)\n for (const range of tr.selection.ranges) {\n const from = range.$from.pos;\n const to = range.$to.pos;\n tr.setBlockType(from, to, nodeType, (node) => ({ ...node.attrs, ...(attributes ?? {}) }));\n }\n\n dispatch(tr.scrollIntoView());\n return true;\n };\n\n/**\n * ToggleBlockType command - toggles between a block type and a default type\n *\n * If the current block is of the target type, changes it to the default type.\n * If the current block is not of the target type, changes it to the target type.\n * Preserves global attributes (textAlign, lineHeight) on toggle.\n *\n * @param nodeName - The name of the node type to toggle to\n * @param defaultNodeName - The name of the default node type (usually 'paragraph')\n * @param attributes - Optional attributes for the node\n */\nexport const toggleBlockType: CommandSpec<[nodeName: string, defaultNodeName: string, attributes?: Attrs]> =\n (nodeName: string, defaultNodeName: string, attributes?: Attrs) =>\n (props) => {\n const { state, tr } = props;\n const nodeType = state.schema.nodes[nodeName];\n const defaultNodeType = state.schema.nodes[defaultNodeName];\n\n if (!nodeType || !defaultNodeType) {\n return false;\n }\n\n // Collect non-empty textblocks in the selection. Empty textblocks\n // (e.g., trailing node from TrailingNode extension) are excluded so they\n // don't affect toggle direction. This handles AllSelection correctly.\n const { from, to } = tr.selection;\n const contentBlocks: { node: PMNode }[] = [];\n tr.doc.nodesBetween(from, to, (node) => {\n if (node.isTextblock && node.content.size > 0) {\n contentBlocks.push({ node });\n }\n });\n\n const allMatch = contentBlocks.length > 0 && contentBlocks.every(({ node }) => {\n const typeMatches = node.type === nodeType;\n const attrsMatch = !attributes || Object.keys(attributes).every(\n (key) => node.attrs[key] === attributes[key]\n );\n return typeMatches && attrsMatch;\n });\n\n if (allMatch) {\n // Toggle OFF → switch to default type, preserving global attrs\n return setBlockType(defaultNodeName)(props);\n }\n\n // Toggle ON → switch to target type with attrs, preserving global attrs\n return setBlockType(nodeName, attributes)(props);\n };\n\n/**\n * WrapIn command - wraps the selection in a node type\n *\n * Uses tr.doc/tr.selection for chain compatibility.\n *\n * @param nodeName - The name of the wrapping node type\n * @param attributes - Optional attributes for the node\n */\nexport const wrapIn: CommandSpec<[nodeName: string, attributes?: Attrs]> =\n (nodeName: string, attributes?: Attrs) =>\n ({ state, tr, dispatch }) => {\n const nodeType = state.schema.nodes[nodeName];\n\n if (!nodeType) {\n return false;\n }\n\n const { $from, $to } = tr.selection;\n const range = $from.blockRange($to);\n if (!range) return false;\n\n const wrapping = findWrapping(range, nodeType, attributes);\n if (wrapping) {\n if (!dispatch) return true;\n tr.wrap(range, wrapping).scrollIntoView();\n dispatch(tr);\n return true;\n }\n\n // Notion-style fallback: `findWrapping` returns null when the cursor\n // sits in the LABEL paragraph of a list/task item and the wrapper\n // (e.g. blockquote, details) cannot occupy the schema-required\n // first-child paragraph slot. Lift the list item out so the now\n // top-level paragraph can be wrapped instead - the user types\n // `/quote` in a bullet label and the bullet becomes a top-level\n // quote.\n const liftOk = liftCurrentListItem(state, tr);\n if (!liftOk) return false;\n\n const $reFrom = tr.doc.resolve(tr.selection.from);\n const $reTo = tr.doc.resolve(tr.selection.to);\n const reRange = $reFrom.blockRange($reTo);\n if (!reRange) return false;\n const reWrapping = findWrapping(reRange, nodeType, attributes);\n if (!reWrapping) return false;\n if (!dispatch) return true;\n\n tr.wrap(reRange, reWrapping).scrollIntoView();\n dispatch(tr);\n return true;\n };\n\n/**\n * ToggleWrap command - toggles wrapping of the selection in a node type\n *\n * If the selection is already wrapped in the node type, lifts it out.\n * Otherwise, wraps the selection in the node type.\n * Uses tr.doc/tr.selection for chain compatibility.\n *\n * @param nodeName - The name of the wrapping node type\n * @param attributes - Optional attributes for the node\n */\nexport const toggleWrap: CommandSpec<[nodeName: string, attributes?: Attrs]> =\n (nodeName: string, attributes?: Attrs) =>\n (props) => {\n const { state, tr, dispatch } = props;\n const nodeType = state.schema.nodes[nodeName];\n\n if (!nodeType) {\n return false;\n }\n\n const { ranges } = tr.selection;\n\n const isInsideWrap = (pos: number): boolean => {\n const $pos = tr.doc.resolve(pos);\n for (let d = $pos.depth; d > 0; d--) {\n if ($pos.node(d).type === nodeType) return true;\n }\n return false;\n };\n\n // Multi-range selection (CellSelection): handle each cell independently\n if (ranges.length > 1) {\n const allWrapped = ranges.every(range => isInsideWrap(range.$from.pos));\n if (!dispatch) return true;\n\n // Snapshot positions and sort descending so bottom-of-doc modifications\n // don't shift positions of cells still to be processed.\n const cellPositions = ranges\n .map((r) => ({ from: r.$from.pos, to: r.$to.pos }))\n .sort((a, b) => b.from - a.from);\n\n for (const cell of cellPositions) {\n const from = tr.mapping.map(cell.from);\n const to = tr.mapping.map(cell.to);\n const $from = tr.doc.resolve(from);\n const $to = tr.doc.resolve(to);\n const blockRange = $from.blockRange($to);\n if (!blockRange) continue;\n\n if (allWrapped) {\n const target = liftTarget(blockRange);\n if (target !== null) tr.lift(blockRange, target);\n } else {\n const wrapping = findWrapping(blockRange, nodeType, attributes);\n if (wrapping) tr.wrap(blockRange, wrapping);\n }\n }\n\n dispatch(tr.scrollIntoView());\n return true;\n }\n\n // Single-range selection: existing logic\n // Collect non-empty textblocks in the selection with their positions.\n // Empty textblocks (e.g., trailing node) are excluded so they don't\n // affect toggle direction. This handles AllSelection correctly.\n const { from, to } = tr.selection;\n const contentBlocks: { pos: number }[] = [];\n tr.doc.nodesBetween(from, to, (node, pos) => {\n if (node.isTextblock && node.content.size > 0) {\n contentBlocks.push({ pos });\n }\n });\n\n const allWrapped = contentBlocks.length > 0\n ? contentBlocks.every(({ pos }) => isInsideWrap(pos))\n : isInsideWrap(from);\n\n if (allWrapped) {\n const first = contentBlocks[0];\n const last = contentBlocks[contentBlocks.length - 1];\n if (first && last) {\n const $liftFrom = tr.doc.resolve(first.pos + 1);\n const $liftTo = tr.doc.resolve(last.pos + 1);\n const range = $liftFrom.blockRange($liftTo);\n if (!range) return false;\n const target = liftTarget(range);\n if (target === null) return false;\n if (!dispatch) return true;\n tr.lift(range, target).scrollIntoView();\n dispatch(tr);\n return true;\n }\n return lift()(props);\n }\n\n return wrapIn(nodeName, attributes)(props);\n };\n\n/**\n * Lift command - lifts the current block out of its parent wrapper\n *\n * Uses tr.doc/tr.selection for chain compatibility.\n * For example, lifts a paragraph out of a blockquote.\n */\nexport const lift: CommandSpec =\n () =>\n ({ tr, dispatch }) => {\n const { ranges } = tr.selection;\n\n // Multi-range selection (CellSelection): lift each cell independently\n if (ranges.length > 1) {\n if (!dispatch) return true;\n\n const cellPositions = ranges\n .map((r) => ({ from: r.$from.pos, to: r.$to.pos }))\n .sort((a, b) => b.from - a.from);\n\n for (const cell of cellPositions) {\n const from = tr.mapping.map(cell.from);\n const to = tr.mapping.map(cell.to);\n const $from = tr.doc.resolve(from);\n const $to = tr.doc.resolve(to);\n const range = $from.blockRange($to);\n if (!range) continue;\n const target = liftTarget(range);\n if (target !== null) tr.lift(range, target);\n }\n dispatch(tr.scrollIntoView());\n return true;\n }\n\n const { $from, $to } = tr.selection;\n const range = $from.blockRange($to);\n if (!range) return false;\n\n const target = liftTarget(range);\n if (target === null) return false;\n if (!dispatch) return true;\n\n tr.lift(range, target).scrollIntoView();\n dispatch(tr);\n return true;\n };\n","import type { ResolvedPos } from '@domternal/pm/model';\n\nconst LIST_ITEM_TYPES = new Set(['listItem', 'taskItem']);\n\n/**\n * Cursor context relative to the INNERMOST containing list/task item,\n * resolved only when the cursor's parent paragraph is a DIRECT child of\n * that item. Innermost so nested lists hand control to the deepest item;\n * direct-child so paragraphs inside blockquote/table-cell/etc. inside a\n * list item fall through to the container's own Enter/Backspace.\n */\nexport interface ListItemCursorContext {\n /** Depth of the containing list item ancestor in the resolved pos. */\n itemDepth: number;\n /** Position right BEFORE the containing list item in the doc. */\n itemPos: number;\n /** Position right BEFORE the containing list wrapper (one depth above the item). */\n wrapperPos: number;\n /** `true` when the parent paragraph is not the first child of the list item. */\n isInChildrenZone: boolean;\n /** `true` when the parent paragraph has no inline content. */\n paragraphIsEmpty: boolean;\n /** `true` when the parent paragraph is the LAST child of the list item. */\n isLastChild: boolean;\n /** Index of the parent paragraph within the list item (0 = label). */\n childIndex: number;\n /** Index of the containing list item within its wrapper. */\n itemIndexInWrapper: number;\n}\n\n/**\n * Resolve list-item cursor context. Returns `null` when the cursor's\n * shape does not match `(wrapper > item > paragraph)`; callers should\n * fall through to default Enter/Backspace in that case.\n */\nexport function getListItemCursorContext(\n $from: ResolvedPos,\n): ListItemCursorContext | null {\n if ($from.parent.type.name !== 'paragraph') return null;\n\n const itemDepth = $from.depth - 1;\n if (itemDepth < 1) return null;\n const itemNode = $from.node(itemDepth);\n if (!LIST_ITEM_TYPES.has(itemNode.type.name)) return null;\n\n const wrapperDepth = itemDepth - 1;\n const childIndex = $from.index(itemDepth);\n\n return {\n itemDepth,\n itemPos: $from.before(itemDepth),\n wrapperPos: $from.before(wrapperDepth),\n isInChildrenZone: childIndex > 0,\n paragraphIsEmpty: $from.parent.content.size === 0,\n isLastChild: childIndex === itemNode.childCount - 1,\n childIndex,\n itemIndexInWrapper: $from.index(wrapperDepth),\n };\n}\n","/**\n * List commands, toggleList\n */\nimport { TextSelection, EditorState } from '@domternal/pm/state';\nimport type { Transaction } from '@domternal/pm/state';\nimport { wrapRangeInList, liftListItem } from '@domternal/pm/schema-list';\nimport { canJoin } from '@domternal/pm/transform';\nimport type { Attrs, NodeType, Node as PMNode } from '@domternal/pm/model';\nimport type { CommandSpec } from '../types/Commands.js';\nimport { getListItemCursorContext } from '../utils/listItemCursorContext.js';\n\n/**\n * Find the innermost list of the given type around the selection,\n * then join it with an adjacent list of the same type if possible.\n */\nfunction joinListBackwards(tr: Transaction, listType: NodeType): void {\n const { $from } = tr.selection;\n for (let d = $from.depth; d >= 0; d--) {\n if ($from.node(d).type === listType) {\n const listPos = $from.before(d);\n if (listPos > 0 && canJoin(tr.doc, listPos)) {\n const nodeBefore = tr.doc.resolve(listPos - 1).parent;\n if (nodeBefore.type === listType) {\n tr.join(listPos);\n }\n }\n return;\n }\n }\n}\n\nfunction joinListForwards(tr: Transaction, listType: NodeType): void {\n const { $from } = tr.selection;\n for (let d = $from.depth; d >= 0; d--) {\n if ($from.node(d).type === listType) {\n const after = $from.after(d);\n if (after < tr.doc.content.size && canJoin(tr.doc, after)) {\n const nodeAfter = tr.doc.nodeAt(after);\n if (nodeAfter?.type === listType) {\n tr.join(after);\n }\n }\n return;\n }\n }\n}\n\n/**\n * ToggleList command - toggles a list type on the current selection\n *\n * If the selection is not in a list, wraps it in the specified list type.\n * If it's in the same list type, lifts the list items out.\n * If it's in a different list type, converts to the new list type in-place.\n *\n * @param listNodeName - The name of the list node type (e.g., 'bulletList', 'orderedList')\n * @param listItemNodeName - The name of the list item node type (usually 'listItem')\n * @param attributes - Optional attributes for the list node\n */\nexport const toggleList: CommandSpec<[listNodeName: string, listItemNodeName: string, attributes?: Attrs]> =\n (listNodeName: string, listItemNodeName: string, attributes?: Attrs) =>\n ({ state, tr, dispatch }) => {\n const listType = state.schema.nodes[listNodeName];\n const listItemType = state.schema.nodes[listItemNodeName];\n\n if (!listType || !listItemType) {\n return false;\n }\n\n interface ListBlockCtx { pos: number; inTargetList: boolean; inSomeList: boolean; otherListPos: number | null }\n\n /** Collect list context for non-empty textblocks in a range.\n * If no textblocks are found (cursor in empty block), falls back to the\n * resolved position's ancestor context so toggle/convert/lift still work. */\n const collectListContext = (doc: PMNode, rfrom: number, rto: number): ListBlockCtx[] => {\n const blocks: ListBlockCtx[] = [];\n doc.nodesBetween(rfrom, rto, (node, pos) => {\n if (!node.isTextblock || node.content.size === 0) return;\n let inTargetList = false;\n let inSomeList = false;\n let otherListPos: number | null = null;\n const $pos = doc.resolve(pos);\n for (let d = $pos.depth; d >= 0; d--) {\n const n = $pos.node(d);\n if (n.type === listType) {\n inTargetList = true;\n inSomeList = true;\n break;\n }\n const groups = (n.type.spec.group ?? '').split(/\\s+/);\n if (groups.includes('list')) {\n inSomeList = true;\n otherListPos = $pos.before(d);\n break;\n }\n }\n blocks.push({ pos, inTargetList, inSomeList, otherListPos });\n });\n\n // Empty-textblock fallback: cursor in empty list item etc.\n // Use the textblock node position (not cursor position) so that\n // pos + 1 points into the textblock content, not past it.\n if (blocks.length === 0) {\n const $cur = doc.resolve(rfrom);\n const nodePos = $cur.parent.inlineContent ? $cur.before($cur.depth) : rfrom;\n let inTargetList = false;\n let inSomeList = false;\n let otherListPos: number | null = null;\n for (let d = $cur.depth; d >= 0; d--) {\n const n = $cur.node(d);\n if (n.type === listType) { inTargetList = true; inSomeList = true; break; }\n const groups = (n.type.spec.group ?? '').split(/\\s+/);\n if (groups.includes('list')) { inSomeList = true; otherListPos = $cur.before(d); break; }\n }\n blocks.push({ pos: nodePos, inTargetList, inSomeList, otherListPos });\n }\n\n return blocks;\n };\n\n const { ranges } = tr.selection;\n\n // Multi-range selection (CellSelection): handle each cell independently\n if (ranges.length > 1) {\n // Snapshot raw positions and sort descending (process bottom-of-doc first\n // so modifications don't shift positions of cells still to be processed)\n const cellPositions = ranges\n .map((r) => ({ from: r.$from.pos, to: r.$to.pos }))\n .sort((a, b) => b.from - a.from);\n\n // Determine global toggle direction on unmodified doc\n const allBlocks: ListBlockCtx[] = [];\n for (const cell of cellPositions) {\n allBlocks.push(...collectListContext(tr.doc, cell.from, cell.to));\n }\n const allInTargetList = allBlocks.length > 0 && allBlocks.every((b) => b.inTargetList);\n if (!dispatch) return true;\n\n if (allInTargetList) {\n // Lift: remove target list from all cells\n for (const cell of cellPositions) {\n const from = tr.mapping.map(cell.from);\n const to = tr.mapping.map(cell.to);\n const cellBlocks = collectListContext(tr.doc, from, to);\n const first = cellBlocks[0];\n const last = cellBlocks[cellBlocks.length - 1];\n if (!first || !last) continue;\n const narrowSel = TextSelection.create(tr.doc, first.pos + 1, last.pos + 1);\n const narrowState = EditorState.create({ doc: tr.doc, selection: narrowSel });\n liftListItem(listItemType)(narrowState, (liftTr) => {\n for (const step of liftTr.steps) {\n tr.step(step);\n }\n });\n }\n } else {\n // Per-cell: skip if already target, convert if in other list, wrap if no list\n for (const cell of cellPositions) {\n const from = tr.mapping.map(cell.from);\n const to = tr.mapping.map(cell.to);\n const cellBlocks = collectListContext(tr.doc, from, to);\n const cellInTarget = cellBlocks.length > 0 && cellBlocks.every((b) => b.inTargetList);\n const cellInSomeList = cellBlocks.length > 0 && cellBlocks.every((b) => b.inSomeList);\n\n if (cellInTarget) {\n continue; // already has target list type\n } else if (cellInSomeList) {\n // Convert: change list type in-place\n const otherPos = cellBlocks.find((b) => b.otherListPos !== null)?.otherListPos;\n if (otherPos === null || otherPos === undefined) continue;\n const listNode = tr.doc.nodeAt(otherPos);\n if (!listNode) continue;\n const firstChild = listNode.firstChild;\n if (firstChild && firstChild.type !== listItemType) {\n // Cross-type (e.g. taskItem → listItem): rebuild items\n const newItems: PMNode[] = [];\n listNode.forEach((child) => {\n newItems.push(listItemType.create(child.attrs, child.content, child.marks));\n });\n tr.replaceWith(otherPos, otherPos + listNode.nodeSize, listType.create(attributes, newItems));\n } else {\n tr.setNodeMarkup(otherPos, listType, attributes);\n }\n } else {\n // Not in any list → wrap\n const $from = tr.doc.resolve(from);\n const $to = tr.doc.resolve(to);\n const blockRange = $from.blockRange($to);\n if (!blockRange) continue;\n wrapRangeInList(tr, blockRange, listType, attributes);\n }\n }\n }\n\n dispatch(tr.scrollIntoView());\n return true;\n }\n\n // Single-range selection\n const { from, to } = tr.selection;\n\n // Children-zone exception. When the cursor is collapsed and sits in\n // a paragraph that is a CHILDREN-ZONE block of a list/task item\n // (i.e. NOT the first-child label paragraph), the user typically\n // wants the slash command, toolbar, etc. to insert a NEW list of\n // the target type at this position rather than to convert the\n // ancestor list. Without this branch, `collectListContext`'s\n // ancestor walk finds the parent list wrapper and the \"convert in\n // place\" path runs, which silently re-types the surrounding bullet\n // list. We wrap the cursor's paragraph in a fresh list of the\n // target type as a sibling within the same children-zone, then\n // run the standard adjacency joins so the new list merges with\n // sibling lists of the same type when applicable (Notion-style\n // \"extend the list\" feel).\n //\n // Only paragraphs are considered: heading / codeBlock have their\n // own slash/Enter semantics and `getListItemCursorContext` already\n // returns null for them.\n if (from === to) {\n const ctx = getListItemCursorContext(tr.selection.$from);\n if (ctx?.isInChildrenZone) {\n if (!dispatch) return true;\n const blockRange = tr.selection.$from.blockRange();\n if (blockRange && wrapRangeInList(tr, blockRange, listType, attributes)) {\n joinListBackwards(tr, listType);\n joinListForwards(tr, listType);\n dispatch(tr.scrollIntoView());\n return true;\n }\n // wrapRangeInList rejected by schema. Fall through to default\n // toggle/convert path so the command still has a chance to do\n // something rather than silently no-op.\n }\n }\n\n const contentBlocks = collectListContext(tr.doc, from, to);\n\n const allInTargetList = contentBlocks.length > 0 && contentBlocks.every((b) => b.inTargetList);\n const allInSomeList = contentBlocks.length > 0 && contentBlocks.every((b) => b.inSomeList);\n\n // Case 1: All non-empty textblocks are in the target list type → lift items out\n if (allInTargetList) {\n const first = contentBlocks[0];\n const last = contentBlocks[contentBlocks.length - 1];\n if (!first || !last) return false;\n const narrowSel = TextSelection.create(tr.doc, first.pos + 1, last.pos + 1);\n const narrowState = EditorState.create({\n doc: tr.doc,\n selection: narrowSel,\n });\n return liftListItem(listItemType)(narrowState, dispatch);\n }\n\n // Case 2: All non-empty textblocks are in some list but not target → convert\n if (allInSomeList) {\n const otherPos = contentBlocks.find((b) => b.otherListPos !== null)?.otherListPos;\n if (otherPos === undefined || otherPos === null) return false;\n\n if (!dispatch) {\n return true; // Can convert\n }\n\n const listNode = tr.doc.nodeAt(otherPos);\n if (!listNode) return false;\n\n const firstChild = listNode.firstChild;\n if (firstChild && firstChild.type !== listItemType) {\n const cursorOffset = tr.selection.from - otherPos;\n const newItems: PMNode[] = [];\n listNode.forEach((child) => {\n newItems.push(listItemType.create(child.attrs, child.content, child.marks));\n });\n const newList = listType.create(attributes, newItems);\n tr.replaceWith(otherPos, otherPos + listNode.nodeSize, newList);\n const restored = otherPos + Math.min(cursorOffset, newList.nodeSize - 1);\n tr.setSelection(TextSelection.near(tr.doc.resolve(restored)));\n } else {\n tr.setNodeMarkup(otherPos, listType, attributes);\n }\n\n dispatch(tr);\n return true;\n }\n\n // Case 3: Not in a list (or mixed) → flatten lists if needed, then wrap\n const blocksInList = contentBlocks.filter((b) => b.inSomeList);\n\n if (blocksInList.length === 0) {\n // Pure wrap: no blocks in any list\n const { $from: $wf, $to: $wt } = tr.selection;\n const wr = $wf.blockRange($wt);\n if (!wr) return false;\n if (!wrapRangeInList(dispatch ? tr : null, wr, listType, attributes)) return false;\n if (dispatch) {\n joinListBackwards(tr, listType);\n joinListForwards(tr, listType);\n dispatch(tr.scrollIntoView());\n }\n return true;\n }\n\n // Mixed selection: some blocks in lists, some not.\n // Flatten existing lists to their child blocks first, then wrap\n // everything in the target list.\n if (!dispatch) return true;\n\n // Collect unique list positions\n const seen = new Set<number>();\n const listPositions: number[] = [];\n for (const block of blocksInList) {\n const $pos = tr.doc.resolve(block.pos);\n for (let d = $pos.depth; d >= 0; d--) {\n const groups = ($pos.node(d).type.spec.group ?? '').split(/\\s+/);\n if (groups.includes('list')) {\n const lpos = $pos.before(d);\n if (!seen.has(lpos)) {\n seen.add(lpos);\n listPositions.push(lpos);\n }\n break;\n }\n }\n }\n\n // Process bottom-to-top so earlier positions stay stable\n listPositions.sort((a, b) => b - a);\n for (const pos of listPositions) {\n const listNode = tr.doc.nodeAt(pos);\n if (!listNode) continue;\n const children: PMNode[] = [];\n listNode.forEach((item) => {\n item.forEach((child) => children.push(child));\n });\n tr.replaceWith(pos, pos + listNode.nodeSize, children);\n }\n\n // Wrap everything in the target list.\n // Use original from/to mapped through the transaction (tr.selection may\n // have collapsed after replaceWith, so we map the raw positions instead).\n const mappedFrom = tr.mapping.map(from, -1);\n const mappedTo = tr.mapping.map(to, 1);\n const $wrapFrom = tr.doc.resolve(mappedFrom);\n const $wrapTo = tr.doc.resolve(mappedTo);\n const wrapRange = $wrapFrom.blockRange($wrapTo);\n if (!wrapRange) return false;\n wrapRangeInList(tr, wrapRange, listType, attributes);\n\n // Merge with adjacent lists of the same type\n joinListBackwards(tr, listType);\n joinListForwards(tr, listType);\n\n dispatch(tr.scrollIntoView());\n return true;\n };\n","/**\n * Attribute commands - updateAttributes, resetAttributes\n */\nimport type { CommandSpec } from '../types/Commands.js';\n\n/**\n * UpdateAttributes command - updates attributes on nodes matching a type\n *\n * Updates attributes on all nodes of the specified type within the selection.\n *\n * @param typeOrName - The node type name or NodeType to update\n * @param attributes - The attributes to merge into existing attributes\n */\nexport const updateAttributes: CommandSpec<[typeOrName: string, attributes: Record<string, unknown>]> =\n (typeOrName: string, attributes: Record<string, unknown>) =>\n ({ state, tr, dispatch }) => {\n const type = state.schema.nodes[typeOrName] ?? state.schema.marks[typeOrName];\n\n if (!type) {\n return false;\n }\n\n const { from, to } = tr.selection;\n const nodeChanges: { pos: number; attrs: Record<string, unknown> }[] = [];\n const markChanges: { pos: number; nodeSize: number; attrs: Record<string, unknown> }[] = [];\n\n // Use tr.doc to support chain context where prior commands may have modified the document\n // For nodes - collect changes\n if (state.schema.nodes[typeOrName]) {\n tr.doc.nodesBetween(from, to, (node, pos) => {\n if (node.type.name === typeOrName) {\n nodeChanges.push({ pos, attrs: { ...node.attrs, ...attributes } });\n }\n });\n }\n\n // For marks - collect changes\n if (state.schema.marks[typeOrName]) {\n const markType = state.schema.marks[typeOrName];\n tr.doc.nodesBetween(from, to, (node, pos) => {\n if (!node.isInline) return;\n\n const mark = markType.isInSet(node.marks);\n if (mark) {\n markChanges.push({\n pos,\n nodeSize: node.nodeSize,\n attrs: { ...mark.attrs, ...attributes },\n });\n }\n });\n }\n\n const hasChanges = nodeChanges.length > 0 || markChanges.length > 0;\n\n if (hasChanges && dispatch) {\n // Apply node changes\n for (const change of nodeChanges) {\n tr.setNodeMarkup(change.pos, undefined, change.attrs);\n }\n\n // Apply mark changes\n if (state.schema.marks[typeOrName]) {\n const markType = state.schema.marks[typeOrName];\n for (const change of markChanges) {\n const newMark = markType.create(change.attrs);\n tr.removeMark(change.pos, change.pos + change.nodeSize, markType);\n tr.addMark(change.pos, change.pos + change.nodeSize, newMark);\n }\n }\n\n dispatch(tr);\n }\n\n return hasChanges;\n };\n\n/**\n * ResetAttributes command - resets an attribute to its default value\n *\n * Resets the specified attribute on all nodes of the given type within the selection\n * to the default value defined in the schema.\n *\n * @param typeOrName - The node type name to update\n * @param attributeName - The name of the attribute to reset\n */\nexport const resetAttributes: CommandSpec<[typeOrName: string, attributeName: string]> =\n (typeOrName: string, attributeName: string) =>\n ({ state, tr, dispatch }) => {\n const nodeType = state.schema.nodes[typeOrName];\n const markType = state.schema.marks[typeOrName];\n\n if (!nodeType && !markType) {\n return false;\n }\n\n const { from, to } = tr.selection;\n const nodeChanges: { pos: number; attrs: Record<string, unknown> }[] = [];\n const markChanges: { pos: number; nodeSize: number; attrs: Record<string, unknown> }[] = [];\n\n // Use tr.doc to support chain context where prior commands may have modified the document\n // For nodes - collect changes\n if (nodeType) {\n const defaultValue: unknown = nodeType.spec.attrs?.[attributeName]?.default;\n\n tr.doc.nodesBetween(from, to, (node, pos) => {\n if (node.type === nodeType) {\n nodeChanges.push({\n pos,\n attrs: { ...node.attrs, [attributeName]: defaultValue },\n });\n }\n });\n }\n\n // For marks - collect changes\n if (markType) {\n const defaultValue: unknown = markType.spec.attrs?.[attributeName]?.default;\n\n tr.doc.nodesBetween(from, to, (node, pos) => {\n if (!node.isInline) return;\n\n const mark = markType.isInSet(node.marks);\n if (mark) {\n markChanges.push({\n pos,\n nodeSize: node.nodeSize,\n attrs: { ...mark.attrs, [attributeName]: defaultValue },\n });\n }\n });\n }\n\n const hasChanges = nodeChanges.length > 0 || markChanges.length > 0;\n\n if (hasChanges && dispatch) {\n // Apply node changes\n for (const change of nodeChanges) {\n tr.setNodeMarkup(change.pos, undefined, change.attrs);\n }\n\n // Apply mark changes\n if (markType) {\n for (const change of markChanges) {\n const newMark = markType.create(change.attrs);\n tr.removeMark(change.pos, change.pos + change.nodeSize, markType);\n tr.addMark(change.pos, change.pos + change.nodeSize, newMark);\n }\n }\n\n dispatch(tr);\n }\n\n return hasChanges;\n };\n","/**\n * Built-in commands for @domternal/core\n *\n * Re-exports from domain-specific command files and assembles the\n * builtInCommands map consumed by CommandManager.\n */\nimport type { CommandMap } from '../types/Commands.js';\n\n// Selection commands\nexport {\n focus,\n blur,\n selectAll,\n selectNodeBackward,\n deleteSelection,\n} from './selectionCommands.js';\n\n// Content commands\nexport {\n setContent,\n clearContent,\n insertText,\n insertContent,\n type SetContentOptions,\n type ClearContentOptions,\n} from './contentCommands.js';\n\n// Mark commands\nexport {\n toggleMark,\n setMark,\n unsetMark,\n unsetAllMarks,\n} from './markCommands.js';\n\n// Node / block commands\nexport {\n setBlockType,\n toggleBlockType,\n wrapIn,\n toggleWrap,\n lift,\n} from './nodeCommands.js';\n\n// List commands\nexport { toggleList } from './listCommands.js';\n\n// Attribute commands\nexport {\n updateAttributes,\n resetAttributes,\n} from './attributeCommands.js';\n\n// --- Assemble the builtInCommands map ---\nimport { focus, blur, selectAll, selectNodeBackward, deleteSelection } from './selectionCommands.js';\nimport { setContent, clearContent, insertText, insertContent } from './contentCommands.js';\nimport { toggleMark, setMark, unsetMark, unsetAllMarks } from './markCommands.js';\nimport { setBlockType, toggleBlockType, wrapIn, toggleWrap, lift } from './nodeCommands.js';\nimport { toggleList } from './listCommands.js';\nimport { updateAttributes, resetAttributes } from './attributeCommands.js';\n\nexport const builtInCommands: CommandMap = {\n focus,\n blur,\n setContent,\n clearContent,\n insertText,\n deleteSelection,\n selectAll,\n toggleMark,\n setMark,\n unsetMark,\n unsetAllMarks,\n setBlockType,\n toggleBlockType,\n wrapIn,\n toggleWrap,\n lift,\n toggleList,\n insertContent,\n selectNodeBackward,\n updateAttributes,\n resetAttributes,\n} as CommandMap;\n\n// Module augmentation: register built-in commands with typed signatures\nimport type { Attrs } from '@domternal/pm/model';\nimport type { CommandSpec } from '../types/Commands.js';\nimport type { FocusPosition, Content } from '../types/index.js';\nimport type { SetContentOptions, ClearContentOptions } from './contentCommands.js';\n\ndeclare module '@domternal/core' {\n interface RawCommands {\n focus: CommandSpec<[position?: FocusPosition]>;\n blur: CommandSpec;\n setContent: CommandSpec<[content: Content, options?: SetContentOptions]>;\n clearContent: CommandSpec<[options?: ClearContentOptions]>;\n insertText: CommandSpec<[text: string]>;\n deleteSelection: CommandSpec;\n selectAll: CommandSpec;\n toggleMark: CommandSpec<[markName: string, attributes?: Attrs]>;\n setMark: CommandSpec<[markName: string, attributes?: Attrs]>;\n unsetMark: CommandSpec<[markName: string]>;\n unsetAllMarks: CommandSpec;\n setBlockType: CommandSpec<[nodeName: string, attributes?: Attrs]>;\n toggleBlockType: CommandSpec<[nodeName: string, defaultNodeName: string, attributes?: Attrs]>;\n wrapIn: CommandSpec<[nodeName: string, attributes?: Attrs]>;\n toggleWrap: CommandSpec<[nodeName: string, attributes?: Attrs]>;\n lift: CommandSpec;\n toggleList: CommandSpec<[listNodeName: string, listItemNodeName: string, attributes?: Attrs]>;\n insertContent: CommandSpec<[content: Content]>;\n selectNodeBackward: CommandSpec;\n updateAttributes: CommandSpec<[typeOrName: string, attributes: Record<string, unknown>]>;\n resetAttributes: CommandSpec<[typeOrName: string, attributeName: string]>;\n }\n}\n","/**\n * Command Props Builder - Shared utility for building CommandProps\n *\n * Provides a factory for creating CommandProps objects with configurable\n * dispatch behavior, used by both ChainBuilder and CanChecker.\n */\nimport { TextSelection } from '@domternal/pm/state';\nimport type { EditorState, Transaction } from '@domternal/pm/state';\nimport type { EditorView } from '@domternal/pm/view';\nimport type {\n CommandProps,\n ChainedCommands,\n CanCommands,\n SingleCommands,\n} from './types/Commands.js';\n\n/**\n * Minimal editor interface for command props building\n */\nexport interface CommandPropsEditor {\n readonly view: EditorView;\n readonly state: EditorState;\n}\n\n/**\n * Options for building CommandProps\n */\nexport interface BuildCommandPropsOptions {\n /** The editor instance */\n editor: CommandPropsEditor;\n\n /** The transaction to use */\n tr: Transaction;\n\n /**\n * Dispatch function - undefined for dry-run mode\n * In chain mode, this accumulates changes on shared transaction\n */\n dispatch: ((tr: Transaction) => void) | undefined;\n\n /** Function to create chain commands */\n chain: () => ChainedCommands;\n\n /** Function to create can commands */\n can: () => CanCommands;\n\n /** Function to create single commands */\n commands: () => SingleCommands;\n}\n\n/**\n * Builds a CommandProps object with the given options\n *\n * @example\n * // For chain mode with dispatch\n * const props = buildCommandProps({\n * editor,\n * tr,\n * dispatch: (transaction) => { ... },\n * chain: () => this.proxy(),\n * can: () => this.buildCanCommands(),\n * commands: () => this.buildSingleCommands(),\n * });\n *\n * @example\n * // For dry-run mode (can check)\n * const props = buildCommandProps({\n * editor,\n * tr,\n * dispatch: undefined,\n * chain: () => createChainBuilder(),\n * can: () => this.proxy(),\n * commands: () => this.buildSingleCommands(tr),\n * });\n */\nexport function buildCommandProps(options: BuildCommandPropsOptions): CommandProps {\n const { editor, tr, dispatch, chain, can, commands } = options;\n\n return {\n // Cast required: CommandPropsEditor is a minimal interface, but CommandProps\n // expects full Editor. Callers ensure the actual editor instance is passed.\n editor: editor as CommandProps['editor'],\n state: editor.view.state,\n tr,\n dispatch,\n chain,\n can,\n commands: commands(),\n };\n}\n\n/**\n * Creates a dispatch function that accumulates steps on a shared transaction\n *\n * Used in chain mode where multiple commands share the same transaction.\n * If a command creates a new transaction, its steps and metadata are copied\n * to the shared one.\n *\n * Metadata propagation is critical for commands like undo/redo:\n * prosemirror-history sets metadata (addToHistory, plugin state) on its\n * transactions. Without copying this metadata, the shared transaction\n * would be recorded as a new history entry, causing undo to oscillate.\n */\nexport function createAccumulatingDispatch(sharedTr: Transaction): (tr: Transaction) => void {\n return (transaction: Transaction): void => {\n if (transaction !== sharedTr) {\n for (const step of transaction.steps) {\n sharedTr.step(step);\n }\n\n // Copy metadata from accumulated transaction to shared transaction.\n // ProseMirror stores metadata as a plain object (tr.meta) accessed\n // via getMeta/setMeta. We access it directly to iterate all entries.\n // Critical for undo/redo: prosemirror-history sets addToHistory and\n // plugin state metadata that must be on the dispatched transaction.\n const meta = (transaction as unknown as { meta: Record<string, unknown> }).meta;\n for (const key of Object.keys(meta)) {\n sharedTr.setMeta(key, meta[key]);\n }\n\n // Copy selection if the accumulated transaction explicitly set one.\n // This ensures commands like undo/redo restore the cursor to the\n // correct position (mapped back through inverted steps).\n // We must re-create the selection against sharedTr.doc because\n // ResolvedPos objects are bound to their document instance.\n if (transaction.selectionSet) {\n const { from, to } = transaction.selection;\n try {\n sharedTr.setSelection(TextSelection.create(sharedTr.doc, from, to));\n } catch {\n // Positions may be invalid if documents diverged - skip\n }\n }\n }\n };\n}\n","/**\n * ChainBuilder - Chainable command builder\n *\n * Provides fluent API for chaining multiple commands with a shared transaction.\n * Commands accumulate changes on the transaction, which is dispatched on run().\n *\n * @example\n * editor.chain()\n * .focus()\n * .insertText('Hello')\n * .toggleBold()\n * .run();\n */\nimport type { EditorState, Transaction } from '@domternal/pm/state';\nimport type { EditorView } from '@domternal/pm/view';\nimport type {\n CommandProps,\n Command,\n CommandMap,\n ChainedCommands,\n SingleCommands,\n CanCommands,\n ChainFailure,\n} from './types/Commands.js';\nimport {\n buildCommandProps,\n createAccumulatingDispatch,\n} from './commandPropsBuilder.js';\n\n/**\n * Editor interface for ChainBuilder\n */\nexport interface ChainBuilderEditor {\n readonly view: EditorView;\n readonly state: EditorState;\n readonly isDestroyed: boolean;\n}\n\n/**\n * Options for creating a ChainBuilder\n */\nexport interface ChainBuilderOptions {\n editor: ChainBuilderEditor;\n rawCommands: CommandMap;\n tr?: Transaction;\n}\n\n/**\n * Builds chainable commands with shared transaction\n *\n * Uses JavaScript Proxy to dynamically generate command methods.\n * Each command method returns `this` for fluent chaining.\n */\nexport class ChainBuilder {\n private readonly editor: ChainBuilderEditor;\n private readonly rawCommands: CommandMap;\n private readonly tr: Transaction;\n private shouldDispatch = true;\n /** Cached proxy instance for performance (avoids creating new Proxy per command) */\n private _cachedProxy: ChainedCommands | null = null;\n /** Tracks the first command failure in the chain */\n private _failure: ChainFailure | null = null;\n /** Current command index in the chain */\n private _commandIndex = 0;\n /** Cached CommandProps for performance */\n private _cachedProps: CommandProps | null = null;\n /** Cached SingleCommands proxy for performance */\n private _cachedSingleCommands: SingleCommands | null = null;\n /** Cached CanCommands proxy for performance */\n private _cachedCanCommands: CanCommands | null = null;\n\n constructor(options: ChainBuilderOptions) {\n this.editor = options.editor;\n this.rawCommands = options.rawCommands;\n // Use provided transaction or create new one from current state\n this.tr = options.tr ?? options.editor.view.state.tr;\n }\n\n /**\n * Gets cached CommandProps or builds new one\n * In chain mode, dispatch adds to shared transaction\n */\n private buildCommandProps(): CommandProps {\n if (this._cachedProps) {\n return this._cachedProps;\n }\n\n const { editor, tr } = this;\n\n this._cachedProps = buildCommandProps({\n editor,\n tr,\n dispatch: createAccumulatingDispatch(tr),\n chain: () => this.proxy(),\n can: () => this.buildCanCommands(),\n commands: () => this.buildSingleCommands(),\n });\n\n return this._cachedProps;\n }\n\n /**\n * Gets cached SingleCommands proxy or builds new one\n */\n private buildSingleCommands(): SingleCommands {\n if (this._cachedSingleCommands) {\n return this._cachedSingleCommands;\n }\n\n const { rawCommands } = this;\n\n this._cachedSingleCommands = new Proxy({} as SingleCommands, {\n get: (_, name: string) => {\n const rawCommand = rawCommands[name];\n if (!rawCommand) {\n return () => false;\n }\n return (...args: unknown[]) => {\n const props = this.buildCommandProps();\n return (rawCommand as (...a: unknown[]) => Command)(...args)(props);\n };\n },\n });\n\n return this._cachedSingleCommands;\n }\n\n /**\n * Gets cached CanCommands proxy or builds new one\n */\n private buildCanCommands(): CanCommands {\n if (this._cachedCanCommands) {\n return this._cachedCanCommands;\n }\n\n const { editor, rawCommands, tr } = this;\n\n this._cachedCanCommands = new Proxy({} as CanCommands, {\n get: (_, name: string) => {\n if (name === 'chain') {\n // Return a function that creates a CanChainBuilder\n return () => this.buildCanChainCommands();\n }\n\n const rawCommand = rawCommands[name];\n if (!rawCommand) {\n return () => false;\n }\n return (...args: unknown[]) => {\n // Dry run - dispatch is undefined\n const props: CommandProps = {\n editor: editor as CommandProps['editor'],\n state: editor.view.state,\n tr,\n dispatch: undefined,\n chain: () => this.proxy(),\n can: () => this.buildCanCommands(),\n commands: this.buildSingleCommands(),\n };\n return (rawCommand as (...a: unknown[]) => Command)(...args)(props);\n };\n },\n });\n\n return this._cachedCanCommands;\n }\n\n /**\n * Builds CanChainedCommands for chained dry-run checks\n */\n private buildCanChainCommands(): ChainedCommands {\n const { editor, rawCommands, tr } = this;\n let allSucceeded = true;\n\n const canChainProxy = new Proxy({} as ChainedCommands, {\n get: (_, name: string) => {\n if (name === 'run') {\n return () => allSucceeded;\n }\n\n const rawCommand = rawCommands[name];\n if (!rawCommand) {\n return () => {\n allSucceeded = false;\n return canChainProxy;\n };\n }\n\n return (...args: unknown[]) => {\n // Dry run - dispatch is undefined\n const props: CommandProps = {\n editor: editor as CommandProps['editor'],\n state: editor.view.state,\n tr,\n dispatch: undefined,\n chain: () => this.proxy(),\n can: () => this.buildCanCommands(),\n commands: this.buildSingleCommands(),\n };\n const result = (rawCommand as (...a: unknown[]) => Command)(...args)(props);\n if (!result) {\n allSucceeded = false;\n }\n return canChainProxy;\n };\n },\n });\n\n return canChainProxy;\n }\n\n /**\n * Execute a custom command within the chain\n *\n * @example\n * editor.chain()\n * .focus()\n * .command(({ tr }) => {\n * tr.insertText('custom');\n * return true;\n * })\n * .run();\n */\n command(fn: (props: CommandProps) => boolean): this {\n const commandIndex = this._commandIndex++;\n const props = this.buildCommandProps();\n const result = fn(props);\n if (!result && !this._failure) {\n this.shouldDispatch = false;\n this._failure = { command: 'command', args: [fn], index: commandIndex };\n }\n return this;\n }\n\n /**\n * Get information about the first command that failed in the chain\n *\n * @returns ChainFailure object or null if no failure occurred\n *\n * @example\n * const chain = editor.chain().toggleBold().setHeading(1);\n * if (!chain.run()) {\n * console.log('Failed:', chain.getFailure());\n * }\n */\n getFailure(): ChainFailure | null {\n return this._failure;\n }\n\n /**\n * Execute the command chain\n * Dispatches the accumulated transaction\n *\n * @returns true if chain was executed successfully\n */\n run(): boolean {\n const { editor, tr, shouldDispatch } = this;\n\n if (editor.isDestroyed) {\n return false;\n }\n\n if (!shouldDispatch) {\n return false;\n }\n\n // Only dispatch if there are actual changes\n if (tr.steps.length === 0 && !tr.selectionSet && !tr.storedMarksSet) {\n return true;\n }\n\n editor.view.dispatch(tr);\n return true;\n }\n\n /**\n * Creates a Proxy that provides dynamic command methods\n * Each method returns `this` for chaining\n *\n * Caches the proxy instance for performance - avoids creating\n * new Proxy objects for each command in the chain.\n */\n proxy(): ChainedCommands {\n if (this._cachedProxy) {\n return this._cachedProxy;\n }\n\n const { rawCommands } = this;\n\n // Create proxy with local const - handlers reference this directly (no assertion needed)\n const proxy: ChainedCommands = new Proxy({} as ChainedCommands, {\n get: (_, name: string) => {\n // Handle special methods\n if (name === 'run') {\n return () => this.run();\n }\n\n if (name === 'getFailure') {\n return () => this.getFailure();\n }\n\n if (name === 'command') {\n return (fn: (props: CommandProps) => boolean) => {\n this.command(fn);\n return proxy;\n };\n }\n\n // Handle dynamic commands\n const rawCommand = rawCommands[name];\n if (!rawCommand) {\n return (...args: unknown[]) => {\n const commandIndex = this._commandIndex++;\n if (!this._failure) {\n this.shouldDispatch = false;\n this._failure = { command: name, args, index: commandIndex };\n }\n return proxy;\n };\n }\n\n return (...args: unknown[]) => {\n const commandIndex = this._commandIndex++;\n const props = this.buildCommandProps();\n const result = (rawCommand as (...a: unknown[]) => Command)(...args)(props);\n if (!result && !this._failure) {\n this.shouldDispatch = false;\n this._failure = { command: name, args, index: commandIndex };\n }\n return proxy;\n };\n },\n });\n\n // Cache for subsequent calls\n this._cachedProxy = proxy;\n return proxy;\n }\n}\n\n/**\n * Creates a new ChainBuilder instance\n */\nexport function createChainBuilder(options: ChainBuilderOptions): ChainedCommands {\n const builder = new ChainBuilder(options);\n return builder.proxy();\n}\n","/**\n * CanChecker - Dry-run command checker\n *\n * Provides API for checking if commands CAN be executed without actually executing them.\n * Commands receive dispatch=undefined to indicate dry-run mode.\n *\n * @example\n * // Check single command\n * if (editor.can().toggleBold()) {\n * // Bold can be applied\n * }\n *\n * // Check command chain\n * if (editor.can().chain().toggleBold().toggleItalic().run()) {\n * // Both commands can be executed\n * }\n */\nimport type { EditorState, Transaction } from '@domternal/pm/state';\nimport type { EditorView } from '@domternal/pm/view';\nimport type {\n CommandProps,\n Command,\n CommandMap,\n CanCommands,\n CanChainedCommands,\n SingleCommands,\n ChainedCommands,\n} from './types/Commands.js';\nimport { buildCommandProps } from './commandPropsBuilder.js';\n\n/**\n * Editor interface for CanChecker\n */\nexport interface CanCheckerEditor {\n readonly view: EditorView;\n readonly state: EditorState;\n readonly isDestroyed: boolean;\n}\n\n/**\n * Options for creating a CanChecker\n */\nexport interface CanCheckerOptions {\n editor: CanCheckerEditor;\n rawCommands: CommandMap;\n /** Function to create a ChainBuilder for chain() within commands */\n createChainBuilder: () => ChainedCommands;\n /**\n * Optional callback when an unknown command is accessed\n * Useful for debugging - called with command name and context\n */\n onUnknownCommand?: (name: string, context: 'single' | 'chain') => void;\n}\n\n/**\n * Checks if commands can be executed (dry-run mode)\n *\n * Uses JavaScript Proxy to dynamically generate command methods.\n * Each command is executed with dispatch=undefined.\n */\nexport class CanChecker {\n private readonly editor: CanCheckerEditor;\n private readonly rawCommands: CommandMap;\n private readonly createChainBuilder: () => ChainedCommands;\n private readonly onUnknownCommand: ((name: string, context: 'single' | 'chain') => void) | undefined;\n\n constructor(options: CanCheckerOptions) {\n this.editor = options.editor;\n this.rawCommands = options.rawCommands;\n this.createChainBuilder = options.createChainBuilder;\n this.onUnknownCommand = options.onUnknownCommand;\n }\n\n /**\n * Builds CommandProps for dry-run checks\n * dispatch is undefined to indicate dry-run mode\n */\n private buildDryRunProps(tr: Transaction): CommandProps {\n const { editor } = this;\n\n return buildCommandProps({\n editor,\n tr,\n dispatch: undefined, // Key difference: undefined for dry-run\n chain: this.createChainBuilder,\n can: () => this.proxy(),\n commands: () => this.buildSingleCommands(tr),\n });\n }\n\n /**\n * Builds SingleCommands for use within can() checks\n */\n private buildSingleCommands(tr: Transaction): SingleCommands {\n const { rawCommands } = this;\n\n return new Proxy({} as SingleCommands, {\n get: (_, name: string) => {\n const rawCommand = rawCommands[name];\n if (!rawCommand) {\n return () => false;\n }\n return (...args: unknown[]) => {\n const props = this.buildDryRunProps(tr);\n return (rawCommand as (...a: unknown[]) => Command)(...args)(props);\n };\n },\n });\n }\n\n /**\n * Creates a Proxy that provides dynamic can() methods\n * Each method returns boolean indicating if command can execute\n */\n proxy(): CanCommands {\n const { editor, rawCommands } = this;\n\n return new Proxy({} as CanCommands, {\n get: (_, name: string) => {\n // Handle chain() method\n if (name === 'chain') {\n return () => this.chainProxy();\n }\n\n // Handle dynamic commands\n const rawCommand = rawCommands[name];\n if (!rawCommand) {\n this.onUnknownCommand?.(name, 'single');\n return () => false;\n }\n\n return (...args: unknown[]) => {\n if (editor.isDestroyed) {\n return false;\n }\n\n const tr = editor.view.state.tr;\n const props = this.buildDryRunProps(tr);\n return (rawCommand as (...a: unknown[]) => Command)(...args)(props);\n };\n },\n });\n }\n\n /**\n * Creates a chain proxy for can().chain()\n * Tracks if all commands in chain can execute\n */\n chainProxy(): CanChainedCommands {\n const { editor, rawCommands } = this;\n let allSucceeded = true;\n const tr = editor.view.state.tr;\n\n const chainProxy: CanChainedCommands = new Proxy({} as CanChainedCommands, {\n get: (_, name: string) => {\n // Handle run() - returns accumulated result\n if (name === 'run') {\n return () => allSucceeded;\n }\n\n // Handle dynamic commands\n const rawCommand = rawCommands[name];\n if (!rawCommand) {\n this.onUnknownCommand?.(name, 'chain');\n return () => {\n allSucceeded = false;\n return chainProxy;\n };\n }\n\n return (...args: unknown[]) => {\n if (editor.isDestroyed) {\n allSucceeded = false;\n return chainProxy;\n }\n\n const props = this.buildDryRunProps(tr);\n const result = (rawCommand as (...a: unknown[]) => Command)(...args)(props);\n if (!result) {\n allSucceeded = false;\n }\n return chainProxy;\n };\n },\n });\n\n return chainProxy;\n }\n}\n\n/**\n * Creates a new CanChecker instance\n */\nexport function createCanChecker(options: CanCheckerOptions): CanCommands {\n const checker = new CanChecker(options);\n return checker.proxy();\n}\n","/**\n * CommandManager - Manages editor commands\n *\n * Provides unified command API with:\n * - Dynamic commands from extensions\n * - Built-in commands (focus, blur, setContent, etc.)\n * - chain() for chainable commands\n * - can() for checking command availability\n */\nimport type { Transaction } from '@domternal/pm/state';\nimport type { EditorView } from '@domternal/pm/view';\nimport type {\n CommandProps,\n Command,\n CommandMap,\n SingleCommands,\n ChainedCommands,\n CanCommands,\n} from './types/Commands.js';\nimport { builtInCommands } from './commands/index.js';\nimport { createChainBuilder } from './ChainBuilder.js';\nimport { createCanChecker } from './CanChecker.js';\n\n// Re-export option types for backward compatibility\nexport type { SetContentOptions, ClearContentOptions } from './commands/index.js';\n\n/**\n * Editor interface for CommandManager\n * Forward declaration to avoid circular dependency\n */\nexport interface CommandManagerEditor {\n readonly view: EditorView;\n readonly state: CommandManagerEditor['view']['state'];\n readonly isDestroyed: boolean;\n emit(event: string, props?: unknown): void;\n /** Extension manager for collecting extension commands */\n readonly extensionManager: {\n readonly commands: CommandMap;\n };\n}\n\n/**\n * Manages editor commands\n *\n * Provides:\n * - editor.commands.* - Single commands that execute immediately\n * - editor.chain().*.run() - Chainable commands with shared transaction\n * - editor.can().* - Dry-run checks if commands can execute\n */\nexport class CommandManager {\n private readonly editor: CommandManagerEditor;\n\n /** Cached raw commands (built-in + extension) */\n private _rawCommands: CommandMap | null = null;\n\n /** Cached commands proxy to avoid allocation on every access */\n private _cachedCommands: SingleCommands | null = null;\n\n /** Cached dispatch function to avoid allocation on every command */\n private readonly _dispatch: (tr: Transaction) => void;\n\n constructor(editor: CommandManagerEditor) {\n this.editor = editor;\n this._dispatch = (tr: Transaction): void => {\n editor.view.dispatch(tr);\n };\n }\n\n /**\n * Gets all raw commands (built-in + extension commands)\n * Cached after first access\n */\n get rawCommands(): CommandMap {\n this._rawCommands ??= {\n ...builtInCommands,\n ...this.editor.extensionManager.commands,\n };\n return this._rawCommands;\n }\n\n /**\n * Builds CommandProps for executing a command\n */\n private buildCommandProps(tr: Transaction, dispatch?: (tr: Transaction) => void): CommandProps {\n const { editor } = this;\n\n return {\n // Cast needed: CommandManagerEditor is a minimal interface for dependency injection,\n // but CommandProps expects the full Editor type. Callers pass the actual Editor instance.\n editor: editor as unknown as CommandProps['editor'],\n state: editor.state,\n tr,\n dispatch,\n chain: () => this.chain(),\n can: () => this.can(),\n commands: this.commands,\n };\n }\n\n /**\n * Single commands that execute immediately.\n * Uses a Proxy to dynamically generate command methods.\n *\n * @example\n * editor.commands.focus('end');\n * editor.commands.insertText('Hello');\n */\n get commands(): SingleCommands {\n if (this._cachedCommands) return this._cachedCommands;\n\n const { editor, rawCommands } = this;\n\n this._cachedCommands = new Proxy({} as SingleCommands, {\n get: (_, name: string) => {\n const rawCommand = rawCommands[name];\n if (!rawCommand) {\n return () => false;\n }\n\n return (...args: unknown[]) => {\n if (editor.isDestroyed) {\n return false;\n }\n\n // Create fresh transaction for each command\n const tr = editor.state.tr;\n\n const props = this.buildCommandProps(tr, this._dispatch);\n return (rawCommand as (...a: unknown[]) => Command)(...args)(props);\n };\n },\n });\n\n return this._cachedCommands;\n }\n\n /**\n * Creates a chainable command builder\n *\n * Commands accumulate on a shared transaction, dispatched on run()\n *\n * @example\n * editor.chain()\n * .focus()\n * .insertText('Hello')\n * .run();\n */\n chain(): ChainedCommands {\n const { editor, rawCommands } = this;\n\n return createChainBuilder({\n editor,\n rawCommands,\n });\n }\n\n /**\n * Creates a command availability checker (dry-run mode)\n *\n * Commands are executed with dispatch=undefined to check if they can run\n *\n * @example\n * if (editor.can().toggleBold()) {\n * // Bold can be applied\n * }\n *\n * if (editor.can().chain().toggleBold().toggleItalic().run()) {\n * // Both can be applied\n * }\n */\n can(): CanCommands {\n const { editor, rawCommands } = this;\n\n return createCanChecker({\n editor,\n rawCommands,\n createChainBuilder: () => this.chain(),\n });\n }\n\n /**\n * Clears cached commands\n * Call this if extensions change dynamically\n */\n clearCache(): void {\n this._rawCommands = null;\n this._cachedCommands = null;\n }\n}\n","/**\n * Inline Styles Utility\n *\n * Applies inline CSS styles to serialized HTML so it renders correctly\n * when pasted outside the editor (email clients, CMS, Google Docs, etc.).\n *\n * Uses hardcoded light-theme defaults (same approach as Google Docs, Notion,\n * TinyMCE). Optionally accepts overrides for custom styling.\n *\n * Only structural styles are inlined (borders, padding, margins, fonts).\n * Colors are NOT inlined - explicit colors (TextColor, Highlight, cell bg)\n * are already inline from renderHTML, and default text color is browser default.\n */\n\n// ---------------------------------------------------------------------------\n// Override keys - users can override any of these\n// ---------------------------------------------------------------------------\n\nexport interface InlineStyleOverrides {\n blockquoteBorder?: string;\n blockquoteColor?: string;\n tableBorder?: string;\n tableHeaderBg?: string;\n codeBg?: string;\n codeFont?: string;\n codeBorder?: string;\n codeBlockBg?: string;\n codeBlockFont?: string;\n hrBorder?: string;\n linkColor?: string;\n detailsBorder?: string;\n detailsBg?: string;\n /**\n * How to export table column widths from `data-colwidth` attributes.\n * - `'percent'` (default): convert to percentage widths on first-row cells\n * - `'pixel'`: convert to pixel widths on first-row cells, table gets fixed width\n * - `'none'`: leave `data-colwidth` as-is, no width styles applied\n */\n tableColumnWidths?: 'percent' | 'pixel' | 'none';\n /**\n * Optional callback to syntax-highlight code blocks.\n * Receives the raw text content and optional language, returns highlighted HTML\n * with `<span class=\"hljs-*\">` markup (or any spans with inline styles).\n *\n * @example\n * ```ts\n * import { createLowlight, common } from 'lowlight';\n * import { toHtml } from 'hast-util-to-html';\n * const lowlight = createLowlight(common);\n *\n * inlineStyles(html, {\n * codeHighlighter: (code, language) => {\n * if (language && lowlight.registered(language)) {\n * return toHtml(lowlight.highlight(language, code));\n * }\n * return null; // no highlighting\n * },\n * });\n * ```\n */\n codeHighlighter?: (code: string, language: string | null) => string | null;\n}\n\n// ---------------------------------------------------------------------------\n// Syntax highlighting colors (from packages/theme/src/_syntax.scss)\n// GitHub-style light theme - hardcoded for consistent export.\n// ---------------------------------------------------------------------------\n\nconst SYNTAX_COLORS: Record<string, string> = {\n // Keywords, types, doctags\n 'hljs-doctag': '#d73a49',\n 'hljs-keyword': '#d73a49',\n 'hljs-template-tag': '#d73a49',\n 'hljs-template-variable': '#d73a49',\n 'hljs-type': '#d73a49',\n\n // Function & class names\n 'hljs-title': '#6f42c1',\n\n // Constants, numbers, operators, attributes\n 'hljs-attr': '#005cc5',\n 'hljs-attribute': '#005cc5',\n 'hljs-literal': '#005cc5',\n 'hljs-meta': '#005cc5',\n 'hljs-number': '#005cc5',\n 'hljs-operator': '#005cc5',\n 'hljs-variable': '#e36209',\n 'hljs-selector-attr': '#005cc5',\n 'hljs-selector-class': '#005cc5',\n 'hljs-selector-id': '#005cc5',\n\n // Strings & regex\n 'hljs-regexp': '#032f62',\n 'hljs-string': '#032f62',\n\n // Built-ins & symbols\n 'hljs-built_in': '#e36209',\n 'hljs-symbol': '#e36209',\n\n // Comments\n 'hljs-comment': '#6a737d',\n 'hljs-code': '#6a737d',\n 'hljs-formula': '#6a737d',\n\n // HTML/XML tag names, selectors\n 'hljs-name': '#22863a',\n 'hljs-quote': '#22863a',\n 'hljs-selector-tag': '#22863a',\n 'hljs-selector-pseudo': '#22863a',\n\n // Markup\n 'hljs-section': '#005cc5',\n 'hljs-bullet': '#22863a',\n\n // Diff\n 'hljs-addition': '#22863a',\n 'hljs-deletion': '#b31d28',\n};\n\n// ---------------------------------------------------------------------------\n// Light-theme defaults (from packages/theme/src/_variables.scss)\n// ---------------------------------------------------------------------------\n\ntype StyleDefaults = Required<Omit<InlineStyleOverrides, 'codeHighlighter'>>;\n\nconst DEFAULTS: StyleDefaults = {\n blockquoteBorder: '3px solid #6a6a6a',\n blockquoteColor: '#6a6a6a',\n tableBorder: '1px solid #e5e7eb',\n tableHeaderBg: '#f8f9fa',\n codeBg: '#f0f0f0',\n codeFont: '\"SF Mono\", \"Fira Code\", Consolas, \"Liberation Mono\", Menlo, monospace',\n codeBorder: '1px solid #e5e7eb',\n codeBlockBg: '#f0f0f0',\n codeBlockFont: '\"SF Mono\", \"Fira Code\", Consolas, \"Liberation Mono\", Menlo, monospace',\n hrBorder: '2px solid #e5e7eb',\n linkColor: '#2563eb',\n detailsBorder: '1px solid #e5e7eb',\n detailsBg: '#f8f9fa',\n tableColumnWidths: 'percent' as const,\n};\n\n// ---------------------------------------------------------------------------\n// Core implementation\n// ---------------------------------------------------------------------------\n\nfunction resolveOverrides(overrides?: InlineStyleOverrides): StyleDefaults {\n if (!overrides) return DEFAULTS;\n return { ...DEFAULTS, ...overrides };\n}\n\n/**\n * Applies inline styles to all elements in a container.\n * Exported for use in clipboardSerializer (operates on DOM directly).\n */\nexport function applyInlineStyles(container: HTMLElement, overrides?: InlineStyleOverrides): void {\n const v = resolveOverrides(overrides);\n\n // Syntax-highlight code blocks if a highlighter is provided\n if (overrides?.codeHighlighter) {\n const codeBlocks = Array.from(container.querySelectorAll('pre > code'));\n for (const code of codeBlocks) {\n const raw = code.textContent || '';\n const langClass = Array.from(code.classList).find(c => c.startsWith('language-'));\n const language = langClass ? langClass.slice('language-'.length) : null;\n const highlighted = overrides.codeHighlighter(raw, language);\n if (highlighted !== null) {\n code.innerHTML = highlighted;\n }\n }\n }\n\n const elements = Array.from(container.querySelectorAll('blockquote, table, td, th, pre, code, hr, a, img, h1, h2, h3, h4, h5, h6, ul, ol, li, details, summary, div, span'));\n\n for (const el of elements) {\n const tag = el.tagName;\n const existing = el.getAttribute('style') ?? '';\n let styles = '';\n\n switch (tag) {\n case 'BLOCKQUOTE':\n styles = `border-left: ${v.blockquoteBorder}; color: ${v.blockquoteColor}; margin: 0.75em 0; padding: 0.25em 0 0.25em 1em;`;\n break;\n\n case 'TABLE':\n styles = `border-collapse: collapse; width: 100%; margin: 0.75em 0;`;\n break;\n\n case 'TD': {\n styles = `border: ${v.tableBorder}; padding: 0.5em 0.75em; overflow-wrap: break-word; word-wrap: break-word; box-sizing: border-box;`;\n const tdTextAlign = el.getAttribute('data-text-align');\n if (tdTextAlign) styles += ` text-align: ${tdTextAlign};`;\n const tdVerticalAlign = el.getAttribute('data-vertical-align');\n if (tdVerticalAlign) styles += ` vertical-align: ${tdVerticalAlign};`;\n break;\n }\n\n case 'TH': {\n styles = `border: ${v.tableBorder}; padding: 0.5em 0.75em; overflow-wrap: break-word; word-wrap: break-word; box-sizing: border-box; font-weight: 600; background: ${v.tableHeaderBg}; text-align: left;`;\n const thTextAlign = el.getAttribute('data-text-align');\n if (thTextAlign) styles += ` text-align: ${thTextAlign};`;\n const thVerticalAlign = el.getAttribute('data-vertical-align');\n if (thVerticalAlign) styles += ` vertical-align: ${thVerticalAlign};`;\n break;\n }\n\n case 'PRE':\n styles = `background: ${v.codeBlockBg}; font-family: ${v.codeBlockFont}; font-size: 0.875em; padding: 1em; border-radius: 0.375rem; overflow-x: auto; margin: 0.75em 0;`;\n break;\n\n case 'CODE': {\n const parent = el.parentElement;\n if (parent?.tagName === 'PRE') {\n // Code inside pre - reset inline code styles\n styles = 'background: none; padding: 0; border: none; border-radius: 0; font-size: inherit;';\n } else {\n // Inline code\n styles = `background: ${v.codeBg}; font-family: ${v.codeFont}; font-size: 0.875em; padding: 0.15em 0.35em; border: ${v.codeBorder}; border-radius: 0.25rem;`;\n }\n break;\n }\n\n case 'HR':\n styles = `border: none; border-top: ${v.hrBorder}; margin: 1.5em 0;`;\n break;\n\n case 'A':\n styles = `color: ${v.linkColor}; text-decoration: underline;`;\n break;\n\n case 'IMG':\n styles = 'max-width: 100%; height: auto; display: block; margin: 0.75em 0;';\n break;\n\n case 'H1':\n styles = 'font-size: 2em; font-weight: 700; line-height: 1.25; margin: 1.5em 0 0.5em;';\n break;\n case 'H2':\n styles = 'font-size: 1.5em; font-weight: 700; line-height: 1.25; margin: 1.5em 0 0.5em;';\n break;\n case 'H3':\n styles = 'font-size: 1.25em; font-weight: 700; line-height: 1.25; margin: 1.5em 0 0.5em;';\n break;\n case 'H4':\n styles = 'font-size: 1.1em; font-weight: 700; line-height: 1.25; margin: 1.5em 0 0.5em;';\n break;\n case 'H5':\n styles = 'font-size: 1em; font-weight: 700; line-height: 1.25; margin: 1.5em 0 0.5em;';\n break;\n case 'H6':\n styles = 'font-size: 0.9em; font-weight: 700; line-height: 1.25; margin: 1.5em 0 0.5em;';\n break;\n\n case 'UL':\n if (el.getAttribute('data-type') === 'taskList') {\n styles = 'list-style: none; padding-left: 0; margin: 0.75em 0;';\n } else {\n styles = 'margin: 0.75em 0; padding-left: 1.5em;';\n }\n break;\n\n case 'OL':\n styles = 'margin: 0.75em 0; padding-left: 1.5em;';\n break;\n\n case 'LI':\n if (el.getAttribute('data-type') === 'taskItem') {\n styles = 'display: flex; align-items: flex-start; gap: 0.5em; margin: 0.25em 0;';\n // Checked task item - style the content div\n if (el.getAttribute('data-checked') === 'true') {\n const contentDiv = el.querySelector(':scope > div');\n if (contentDiv) {\n const contentExisting = contentDiv.getAttribute('style') ?? '';\n contentDiv.setAttribute(\n 'style',\n 'text-decoration: line-through; opacity: 0.6;' + contentExisting,\n );\n }\n }\n } else {\n styles = 'margin: 0.25em 0;';\n }\n break;\n\n case 'DETAILS':\n styles = `border: ${v.detailsBorder}; border-radius: 0.375rem; margin: 0.75em 0;`;\n break;\n\n case 'SUMMARY':\n styles = `font-weight: 600; padding: 0.5em 0.75em; background: ${v.detailsBg}; border-radius: 0.375rem 0.375rem 0 0; cursor: pointer; list-style: none;`;\n break;\n\n case 'DIV':\n if (el.hasAttribute('data-details-content')) {\n styles = `padding: 0.5em 0.75em; border-top: ${v.detailsBorder};`;\n }\n break;\n\n case 'SPAN': {\n if (!el.className) break;\n // Syntax highlighting - apply inline color for hljs-* classes\n const classList = el.className.split(' ');\n for (const cls of classList) {\n const color = SYNTAX_COLORS[cls];\n if (color) {\n styles = `color: ${color};`;\n break;\n }\n }\n // hljs-section is bold, hljs-emphasis italic, hljs-strong bold\n if (el.classList.contains('hljs-section') || el.classList.contains('hljs-strong')) {\n styles += ' font-weight: bold;';\n }\n if (el.classList.contains('hljs-emphasis')) {\n styles += ' font-style: italic;';\n }\n // Diff backgrounds\n if (el.classList.contains('hljs-addition')) {\n styles += ' background-color: #f0fff4;';\n }\n if (el.classList.contains('hljs-deletion')) {\n styles += ' background-color: #ffeef0;';\n }\n break;\n }\n }\n\n // Merge: theme defaults first, then existing inline styles (user-set wins)\n if (styles) {\n el.setAttribute('style', styles + ' ' + existing);\n }\n }\n\n // --- Table column widths (second pass) ---\n if (v.tableColumnWidths !== 'none') {\n const tables = Array.from(container.querySelectorAll('table'));\n for (const table of tables) {\n const firstRow = table.querySelector('tr');\n if (!firstRow) continue;\n\n const firstRowCells = Array.from(firstRow.querySelectorAll<HTMLElement>('td, th'));\n // Collect all column widths from first-row cells (handles colspan via comma-separated values)\n const widths: number[] = [];\n let allHaveWidths = true;\n for (const cell of firstRowCells) {\n const raw = cell.getAttribute('data-colwidth');\n if (!raw) { allHaveWidths = false; break; }\n const parsed = raw.split(',').map(Number);\n if (parsed.some(n => !n || isNaN(n))) { allHaveWidths = false; break; }\n widths.push(...parsed);\n }\n if (!allHaveWidths || widths.length === 0) continue;\n\n const sum = widths.reduce((s, w) => s + w, 0);\n\n // table-layout: fixed ensures the browser respects the exact widths\n const tableStyle = table.getAttribute('style') ?? '';\n if (v.tableColumnWidths === 'percent') {\n table.setAttribute('style', tableStyle + ' table-layout: fixed;');\n for (const cell of firstRowCells) {\n const raw = cell.getAttribute('data-colwidth') ?? '';\n const parsed = raw.split(',').map(Number);\n const cellPercent = parsed.reduce((s, w) => s + w, 0) / sum * 100;\n const existing = cell.getAttribute('style') ?? '';\n cell.setAttribute('style', existing + ` width: ${cellPercent.toFixed(2)}%;`);\n }\n } else {\n // pixel mode\n table.setAttribute('style', tableStyle.replace(/width:\\s*100%/, `width: ${String(sum)}px`) + ' table-layout: fixed;');\n for (const cell of firstRowCells) {\n const raw = cell.getAttribute('data-colwidth') ?? '';\n const parsed = raw.split(',').map(Number);\n const cellWidth = parsed.reduce((s, w) => s + w, 0);\n const existing = cell.getAttribute('style') ?? '';\n cell.setAttribute('style', existing + ` width: ${String(cellWidth)}px;`);\n }\n }\n\n // Keep data-colwidth on cells for round-trip back into the editor\n }\n }\n}\n\n/**\n * Takes an HTML string and returns it with inline CSS styles applied\n * to all elements, so it renders correctly outside the editor.\n *\n * @param html - Serialized HTML string from editor.getHTML()\n * @param overrides - Optional style overrides for custom theming\n *\n * @example\n * ```ts\n * // Default light-theme styles\n * const styled = inlineStyles(editor.getHTML());\n *\n * // With custom overrides\n * const styled = inlineStyles(editor.getHTML(), {\n * blockquoteBorder: '5px solid red',\n * linkColor: '#ff6600',\n * });\n * ```\n */\nexport function inlineStyles(html: string, overrides?: InlineStyleOverrides): string {\n if (!html) return html;\n\n const div = document.createElement('div');\n div.innerHTML = html;\n applyInlineStyles(div, overrides);\n return div.innerHTML;\n}\n","/**\n * Normalizes browser-computed color values (rgb/rgba) to hex format.\n * Browsers convert hex colors to rgb() in element.style, causing\n * isActive mismatches when comparing stored values after HTML re-parsing.\n */\nexport function normalizeColor(color: string): string {\n const rgbMatch = /^rgba?\\(\\s*(\\d+)[\\s,]+(\\d+)[\\s,]+(\\d+)/.exec(color);\n if (rgbMatch?.[1] && rgbMatch[2] && rgbMatch[3]) {\n const r = parseInt(rgbMatch[1], 10);\n const g = parseInt(rgbMatch[2], 10);\n const b = parseInt(rgbMatch[3], 10);\n return `#${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${b.toString(16).padStart(2, '0')}`;\n }\n return color;\n}\n","/**\n * Editor - Main editor class wrapping ProseMirror\n *\n * Manages extensions, schema, commands, and the ProseMirror EditorView/State.\n */\nimport type { Transaction, Plugin, PluginKey } from '@domternal/pm/state';\nimport { EditorState } from '@domternal/pm/state';\nimport { EditorView } from '@domternal/pm/view';\nimport { DOMSerializer } from '@domternal/pm/model';\nimport type { Schema, Fragment } from '@domternal/pm/model';\n\nimport { EventEmitter } from './EventEmitter.js';\nimport { ExtensionManager } from './ExtensionManager.js';\nimport { CommandManager } from './CommandManager.js';\nimport { createDocument, isDocumentEmpty } from './helpers/index.js';\nimport { inlineStyles, type InlineStyleOverrides } from './utils/inlineStyles.js';\nimport { normalizeColor } from './helpers/normalizeColor.js';\nimport {\n focus as focusCommand,\n blur as blurCommand,\n setContent as setContentCommand,\n clearContent as clearContentCommand,\n} from './commands/index.js';\nimport type {\n EditorOptions,\n EditorEvents,\n Content,\n JSONContent,\n FocusPosition,\n SingleCommands,\n ChainedCommands,\n CanCommands,\n Command,\n ToolbarItem,\n FloatingMenuItem,\n} from './types/index.js';\n\n/**\n * Main editor class\n *\n * Wraps ProseMirror's EditorView and EditorState with a cleaner API.\n *\n * @example\n * ```ts\n * import { Editor } from '@domternal/core';\n * import { Schema } from '@domternal/pm/model';\n *\n * const schema = new Schema({\n * nodes: { doc: { content: 'paragraph+' }, paragraph: { content: 'text*' }, text: {} }\n * });\n *\n * const editor = new Editor({\n * schema,\n * element: document.getElementById('editor'),\n * content: '<p>Hello world</p>',\n * });\n *\n * // Get content\n * const json = editor.getJSON();\n * const html = editor.getHTML();\n *\n * // Set content\n * editor.commands.setContent('<p>New content</p>');\n *\n * // Cleanup\n * editor.destroy();\n * ```\n */\nexport class Editor extends EventEmitter<EditorEvents> {\n /**\n * Editor configuration options\n */\n private options: EditorOptions;\n\n /**\n * Manages extensions and schema\n * @internal Exposed for CommandManager, not for public use\n */\n private _extensionManager!: ExtensionManager;\n\n /**\n * Gets the extension manager\n * @internal For CommandManager use only\n */\n get extensionManager(): ExtensionManager {\n return this._extensionManager;\n }\n\n /**\n * Manages commands\n */\n private commandManager!: CommandManager;\n\n /**\n * ProseMirror EditorView instance\n */\n public view!: EditorView;\n\n /**\n * Whether the editor has been destroyed\n */\n private _isDestroyed = false;\n\n /**\n * Timer for autofocus (cleared on destroy to prevent memory leaks)\n */\n private _autofocusTimer: ReturnType<typeof setTimeout> | null = null;\n\n /**\n * Creates a new Editor instance\n *\n * @param options - Editor configuration\n * @throws Error if running in SSR environment (no window)\n * @throws Error if schema is not provided\n */\n constructor(options: EditorOptions) {\n super();\n\n // SSR Guard - Editor requires browser environment\n if (typeof window === 'undefined') {\n throw new Error(\n 'Editor requires a browser environment. ' +\n 'For server-side rendering, use generateHTML() and generateJSON() helpers instead.'\n );\n }\n\n // Validate: need either schema or extensions\n if (!options.schema && (!options.extensions || options.extensions.length === 0)) {\n throw new Error(\n 'Editor requires either schema or extensions. ' +\n 'Provide a ProseMirror schema directly, or use extensions like [Document, Paragraph, Text].'\n );\n }\n\n this.options = {\n editable: true,\n ...options,\n };\n\n this.createEditor();\n }\n\n // === Getters ===\n\n /**\n * Gets the current EditorState\n */\n get state(): EditorState {\n return this.view.state;\n }\n\n /**\n * Gets the ProseMirror schema\n */\n get schema(): Schema {\n return this._extensionManager.schema;\n }\n\n /**\n * Checks if the editor is editable\n */\n get isEditable(): boolean {\n return this.view.editable;\n }\n\n /**\n * Checks if the editor content is empty\n */\n get isEmpty(): boolean {\n return isDocumentEmpty(this.state.doc);\n }\n\n /**\n * Checks if the editor has focus\n */\n get isFocused(): boolean {\n return this.view.hasFocus();\n }\n\n /**\n * Checks if the editor has been destroyed\n */\n get isDestroyed(): boolean {\n return this._isDestroyed;\n }\n\n /**\n * Gets single commands for immediate execution\n * @example editor.commands.focus('end')\n */\n get commands(): SingleCommands {\n return this.commandManager.commands;\n }\n\n /**\n * Creates a command chain for batched execution\n * @example editor.chain().focus().insertText('Hello').run()\n */\n chain(): ChainedCommands {\n return this.commandManager.chain();\n }\n\n /**\n * Checks if commands can be executed (dry-run)\n * @example if (editor.can().toggleBold()) { ... }\n */\n can(): CanCommands {\n return this.commandManager.can();\n }\n\n /**\n * Gets extension storage\n * Access via: editor.storage.extensionName.propertyName\n */\n get storage(): Record<string, unknown> {\n return this._extensionManager.storage;\n }\n\n /**\n * Toolbar items registered by all extensions.\n */\n get toolbarItems(): ToolbarItem[] {\n return this._extensionManager.toolbarItems;\n }\n\n /**\n * Floating-menu items registered by all extensions, rendered as the\n * block-insert menu shown on empty paragraphs.\n */\n get floatingMenuItems(): FloatingMenuItem[] {\n return this._extensionManager.floatingMenuItems;\n }\n\n // === Active State Methods ===\n\n /**\n * Checks if a node or mark is currently active\n *\n * For toolbar button states - returns true if:\n * - For marks: the current selection has the mark applied\n * - For nodes: the cursor is inside that node type\n *\n * @param nameOrAttributes - Extension name, or object with name and attributes\n * @param attributes - Optional attributes to match (for node/mark specific states)\n *\n * @example\n * editor.isActive('bold') // → true if bold mark is active\n * editor.isActive('heading', { level: 2 }) // → true if in h2\n * editor.isActive({ name: 'textAlign', attributes: { align: 'center' } })\n */\n isActive(\n nameOrAttributes: string | { name: string; attributes?: Record<string, unknown> },\n attributes?: Record<string, unknown>\n ): boolean {\n // Normalize arguments\n const name = typeof nameOrAttributes === 'string' ? nameOrAttributes : nameOrAttributes.name;\n const attrs = typeof nameOrAttributes === 'string' ? attributes : nameOrAttributes.attributes;\n\n const { state } = this;\n const { selection, schema } = state;\n const { from, to, $from } = selection;\n\n // Check if it's a mark\n const markType = schema.marks[name];\n if (markType) {\n // For empty selection, check marks at cursor or stored marks\n if (selection.empty) {\n const storedMarks = state.storedMarks ?? $from.marks();\n const hasMark = storedMarks.some(mark => mark.type === markType);\n if (!hasMark) return false;\n\n // Check attributes if specified\n if (attrs) {\n const mark = storedMarks.find(m => m.type === markType);\n return mark ? this.matchAttributes(mark.attrs, attrs) : false;\n }\n return true;\n }\n\n // For range selection, check if all applicable text has the mark.\n // Skip text that can't have this mark: inside blocks that don't allow it\n // (e.g. code blocks) or carrying a mark that excludes it (e.g. inline code).\n const check = { hasApplicableText: false, hasMark: true };\n state.doc.nodesBetween(from, to, (node, _pos, parent) => {\n if (node.isText) {\n if (parent && !parent.type.allowsMarkType(markType)) {\n return; // skip text in mark-incompatible blocks\n }\n if (node.marks.some(m => m.type.excludes(markType) && m.type !== markType)) {\n return; // skip text with marks that exclude this mark type\n }\n check.hasApplicableText = true;\n const nodeMark = node.marks.find(m => m.type === markType);\n if (!nodeMark) {\n check.hasMark = false;\n return false; // Stop iteration\n }\n if (attrs && !this.matchAttributes(nodeMark.attrs, attrs)) {\n check.hasMark = false;\n return false;\n }\n }\n return true;\n });\n return check.hasApplicableText && check.hasMark;\n }\n\n // Check if it's a node\n const nodeType = schema.nodes[name];\n if (nodeType) {\n // NodeSelection - check the selected node directly (atom/leaf nodes like image)\n const selNode = (selection as { node?: { type: typeof nodeType; attrs: Record<string, unknown> } }).node;\n if (selNode?.type === nodeType) {\n return attrs ? this.matchAttributes(selNode.attrs, attrs) : true;\n }\n\n // Check both $from and $to paths - the node must be an ancestor\n // of both ends of the selection for it to be considered active.\n const { $to } = selection;\n\n // For list-group nodes, only the innermost list ancestor should be\n // considered active. This prevents e.g. both bulletList and orderedList\n // showing as active when a bullet list is nested inside an ordered list.\n const isListNode = nodeType.spec.group?.split(' ').includes('list') ?? false;\n\n const findInPath = ($pos: typeof $from): boolean => {\n for (let depth = $pos.depth; depth >= 0; depth--) {\n const node = $pos.node(depth);\n\n if (isListNode) {\n const inListGroup = node.type.spec.group?.split(' ').includes('list') ?? false;\n if (inListGroup) {\n // First (innermost) list ancestor - only match if it's the target type\n if (node.type !== nodeType) return false;\n return attrs ? this.matchAttributes(node.attrs, attrs) : true;\n }\n } else {\n if (node.type === nodeType) {\n return attrs ? this.matchAttributes(node.attrs, attrs) : true;\n }\n }\n }\n return false;\n };\n\n return findInPath($from) && findInPath($to);\n }\n\n return false;\n }\n\n /**\n * Gets attributes of the currently active node or mark\n *\n * Returns empty object if the node/mark is not found or not active.\n *\n * @param name - Extension name (node or mark)\n *\n * @example\n * editor.getAttributes('heading') // → { level: 2 }\n * editor.getAttributes('link') // → { href: 'https://...', target: '_blank' }\n */\n getAttributes(name: string): Record<string, unknown> {\n const { state } = this;\n const { selection, schema } = state;\n const { $from } = selection;\n\n // Check if it's a mark\n const markType = schema.marks[name];\n if (markType) {\n // Get marks at cursor position or stored marks\n const marks = state.storedMarks ?? $from.marks();\n const mark = marks.find(m => m.type === markType);\n return mark ? { ...mark.attrs } : {};\n }\n\n // Check if it's a node\n const nodeType = schema.nodes[name];\n if (nodeType) {\n // Find node in selection path\n for (let depth = $from.depth; depth >= 0; depth--) {\n const node = $from.node(depth);\n if (node.type === nodeType) {\n return { ...node.attrs };\n }\n }\n return {};\n }\n\n return {};\n }\n\n /**\n * Helper to match attributes\n * Returns true if target contains all key/value pairs from source\n */\n private matchAttributes(\n target: Record<string, unknown>,\n source: Record<string, unknown>\n ): boolean {\n for (const [key, value] of Object.entries(source)) {\n if (target[key] !== value) {\n return false;\n }\n }\n return true;\n }\n\n // === Content Methods ===\n\n /**\n * Gets the document content as JSON\n */\n getJSON(): JSONContent {\n return this.state.doc.toJSON() as JSONContent;\n }\n\n /**\n * Gets the document content as HTML string\n *\n * @param options - Optional settings\n * @param options.styled - When true (or an override object), applies inline CSS\n * styles so the HTML renders correctly outside the editor (email, CMS, etc.)\n */\n getHTML(options?: { styled?: boolean | InlineStyleOverrides }): string {\n const fragment = DOMSerializer.fromSchema(this.schema).serializeFragment(\n this.state.doc.content\n );\n\n const div = document.createElement('div');\n div.appendChild(fragment);\n\n // Browser DOM normalizes hex colors to rgb() - convert back to hex within style attrs\n const html = div.innerHTML.replace(/style=\"([^\"]*)\"/g, (_match, style: string) =>\n 'style=\"' +\n style.replace(\n /rgba?\\(\\s*\\d+[\\s,]+\\d+[\\s,]+\\d+[^)]*\\)/g,\n (colorStr) => normalizeColor(colorStr),\n ) +\n '\"',\n );\n\n if (options?.styled) {\n const overrides = typeof options.styled === 'object' ? options.styled : undefined;\n return inlineStyles(html, overrides);\n }\n\n return html;\n }\n\n /**\n * Gets the document content as plain text\n *\n * @param options - Options for text extraction\n * @param options.blockSeparator - String to insert between blocks (default: '\\n\\n')\n */\n getText(options: { blockSeparator?: string } = {}): string {\n const { blockSeparator = '\\n\\n' } = options;\n return this.state.doc.textBetween(\n 0,\n this.state.doc.content.size,\n blockSeparator\n );\n }\n\n /**\n * Executes a command with proper CommandProps\n * @internal\n */\n private runCommand(command: Command): boolean {\n const tr = this.state.tr;\n return command({\n editor: this,\n state: this.state,\n tr,\n dispatch: (t) => { this.view.dispatch(t); },\n chain: () => this.chain(),\n can: () => this.can(),\n commands: this.commands,\n });\n }\n\n /**\n * Sets the editor content\n *\n * @param content - JSON or HTML content\n * @param emitUpdate - Whether to emit update event (default: true)\n * @returns true if content was set successfully, false if content was invalid\n */\n setContent(content: Content, emitUpdate = true): boolean {\n return this.runCommand(setContentCommand(content, { emitUpdate }));\n }\n\n /**\n * Clears the editor content\n *\n * @param emitUpdate - Whether to emit update event (default: true)\n * @returns true if content was cleared successfully\n */\n clearContent(emitUpdate = true): boolean {\n return this.runCommand(clearContentCommand({ emitUpdate }));\n }\n\n // === Lifecycle Methods ===\n\n /**\n * Sets whether the editor is editable\n *\n * @param editable - Whether the editor should be editable\n */\n setEditable(editable: boolean): this {\n this.options.editable = editable;\n\n // Sync aria-readonly with editable state\n if (editable) {\n this.view.dom.removeAttribute('aria-readonly');\n } else {\n this.view.dom.setAttribute('aria-readonly', 'true');\n }\n\n // ProseMirror rechecks editable on each transaction\n // Dispatch empty transaction to trigger re-evaluation\n this.view.dispatch(this.state.tr);\n\n return this;\n }\n\n /**\n * Focuses the editor\n *\n * @param position - Where to place cursor (default: null = just focus)\n */\n focus(position: FocusPosition = null): this {\n this.runCommand(focusCommand(position));\n return this;\n }\n\n /**\n * Removes focus from the editor\n */\n blur(): this {\n this.runCommand(blurCommand());\n return this;\n }\n\n // === Dynamic Plugin Management ===\n\n /**\n * Registers a ProseMirror plugin dynamically at runtime, after the editor\n * has been created. Safe to call repeatedly with the same plugin key.\n */\n registerPlugin(plugin: Plugin): void {\n // Prevent duplicate registration (same plugin key)\n if (plugin.spec.key?.get(this.view.state)) return;\n\n const newState = this.view.state.reconfigure({\n plugins: [...this.view.state.plugins, plugin],\n });\n this.view.updateState(newState);\n }\n\n /**\n * Unregisters a ProseMirror plugin by its PluginKey.\n * Uses PluginKey.get() to identify the plugin to remove.\n */\n unregisterPlugin(key: PluginKey): void {\n const pluginToRemove = key.get(this.view.state);\n if (!pluginToRemove) return;\n\n const newState = this.view.state.reconfigure({\n plugins: this.view.state.plugins.filter((p) => p !== pluginToRemove),\n });\n this.view.updateState(newState);\n }\n\n /**\n * Destroys the editor and cleans up resources\n *\n * After calling destroy(), the editor instance should not be used.\n */\n destroy(): void {\n if (this._isDestroyed) {\n return;\n }\n\n // Clear autofocus timer if pending\n if (this._autofocusTimer) {\n clearTimeout(this._autofocusTimer);\n this._autofocusTimer = null;\n }\n\n this.emit('destroy');\n this.options.onDestroy?.();\n\n // Destroy ProseMirror view\n this.view.destroy();\n\n // Destroy managers\n this._extensionManager.destroy();\n\n // Clear all event listeners\n this.removeAllListeners();\n\n this._isDestroyed = true;\n }\n\n // === Private Methods ===\n\n /**\n * Builds a clipboardSerializer that applies a transform function to HTML on copy/cut.\n */\n private buildClipboardSerializer(\n transform: (html: string) => string,\n schema: Schema,\n ): { clipboardSerializer: DOMSerializer } {\n return {\n clipboardSerializer: {\n serializeFragment: (fragment: unknown, options?: Record<string, unknown>) => {\n const base = DOMSerializer.fromSchema(schema);\n const dom = base.serializeFragment(fragment as Fragment, options);\n const wrapper = document.createElement('div');\n wrapper.appendChild(dom);\n wrapper.innerHTML = transform(wrapper.innerHTML);\n const frag = document.createDocumentFragment();\n while (wrapper.firstChild) frag.appendChild(wrapper.firstChild);\n return frag;\n },\n } as unknown as DOMSerializer,\n };\n }\n\n /**\n * Creates the editor instance\n */\n private createEditor(): void {\n // 1. Emit beforeCreate - extensions can modify options in Step 2\n this.emit('beforeCreate', { editor: this });\n this.options.onBeforeCreate?.({ editor: this });\n // Note: Extension onBeforeCreate is called after ExtensionManager is created (step 2)\n\n // 2. Initialize ExtensionManager with extensions or schema\n this._extensionManager = new ExtensionManager(\n {\n extensions: this.options.extensions,\n schema: this.options.schema,\n },\n this\n );\n\n // 2.1 Call onBeforeCreate on all extensions (now that they have editor reference)\n this._extensionManager.callOnBeforeCreate();\n\n this._extensionManager.validateSchema();\n\n // 3. Create initial document from content (with graceful error handling)\n let doc;\n try {\n doc = createDocument(\n this.options.content ?? null,\n this._extensionManager.schema\n );\n } catch (error) {\n // Emit content error event for invalid content\n const contentError = error instanceof Error ? error : new Error(String(error));\n this.emit('contentError', {\n editor: this,\n error: contentError,\n content: this.options.content,\n });\n this.options.onContentError?.({\n editor: this,\n error: contentError,\n content: this.options.content,\n });\n\n // Fall back to empty document\n doc = createDocument(null, this._extensionManager.schema);\n }\n\n const plugins = this._extensionManager.plugins;\n\n // 5. Create EditorState\n const state = EditorState.create({\n schema: this._extensionManager.schema,\n doc,\n plugins,\n });\n\n // 6. Resolve element - use provided or create detached div\n const element = this.options.element ?? document.createElement('div');\n\n // 7. Create EditorView\n const nodeViews = this._extensionManager.nodeViews;\n this.view = new EditorView(element, {\n state,\n dispatchTransaction: this.dispatchTransaction.bind(this),\n editable: () => this.options.editable ?? true,\n attributes: () => ({\n role: 'textbox',\n 'aria-multiline': 'true',\n 'aria-label': this.options.ariaLabel ?? 'Rich text editor',\n ...((this.options.editable ?? true) ? {} : { 'aria-readonly': 'true' }),\n }),\n ...(Object.keys(nodeViews).length > 0 ? { nodeViews } : {}),\n // Clipboard transform - apply user-provided transform (e.g. inlineStyles) on copy/cut\n ...(this.options.clipboardHTMLTransform\n ? this.buildClipboardSerializer(this.options.clipboardHTMLTransform, this._extensionManager.schema)\n : {}),\n // Handle focus/blur events\n handleDOMEvents: {\n focus: (_view, event) => {\n this.emit('focus', { editor: this, event: event });\n this.options.onFocus?.({ editor: this, event: event });\n this._extensionManager.callOnFocus({ event });\n return false;\n },\n blur: (_view, event) => {\n this.emit('blur', { editor: this, event: event });\n this.options.onBlur?.({ editor: this, event: event });\n this._extensionManager.callOnBlur({ event });\n return false;\n },\n },\n });\n\n // 8. Emit mount event - view is now attached to DOM element\n this.emit('mount', { editor: this, view: this.view });\n this.options.onMount?.({ editor: this, view: this.view });\n\n // 9. Initialize CommandManager\n this.commandManager = new CommandManager(this);\n\n // 10. Handle autofocus\n if (this.options.autofocus) {\n // Use setTimeout to ensure DOM is ready\n // Store reference for cleanup on destroy\n this._autofocusTimer = setTimeout(() => {\n this._autofocusTimer = null;\n if (!this._isDestroyed) {\n this.focus(this.options.autofocus);\n }\n }, 0);\n }\n\n // 11. Set up error event handler for onError callback\n this.on('error', (props) => {\n this.options.onError?.(props);\n });\n\n // 12. Emit create event and call extension onCreate hooks\n this.emit('create', { editor: this });\n this.options.onCreate?.({ editor: this });\n this._extensionManager.callOnCreate();\n }\n\n /**\n * Handles ProseMirror transactions\n */\n private dispatchTransaction(transaction: Transaction): void {\n if (this._isDestroyed) {\n return;\n }\n\n // 1. Apply transaction to state\n const newState = this.view.state.apply(transaction);\n\n // 2. Update view\n this.view.updateState(newState);\n\n // 3. Emit transaction event (fires for EVERY transaction)\n this.emit('transaction', { editor: this, transaction });\n this.options.onTransaction?.({ editor: this, transaction });\n this._extensionManager.callOnTransaction({ transaction });\n\n // 4. Check if we should skip update event\n const skipUpdate = transaction.getMeta('skipUpdate') as boolean | undefined;\n\n // 5. Emit selectionUpdate if selection changed (without doc change)\n if (!transaction.docChanged && transaction.selectionSet) {\n this.emit('selectionUpdate', { editor: this, transaction });\n this.options.onSelectionUpdate?.({ editor: this, transaction });\n this._extensionManager.callOnSelectionUpdate();\n }\n\n // 6. Emit update if document changed\n if (transaction.docChanged && !skipUpdate) {\n this.emit('update', { editor: this, transaction });\n this.options.onUpdate?.({ editor: this, transaction });\n this._extensionManager.callOnUpdate();\n }\n }\n\n /**\n * Emit method - needed for CommandManager interface\n */\n override emit<E extends keyof EditorEvents>(\n event: E,\n ...args: EditorEvents[E] extends undefined ? [] : [EditorEvents[E]]\n ): this {\n return super.emit(event, ...args);\n }\n}\n","/**\n * Thin wrapper around @floating-ui/dom for consistent floating element positioning.\n *\n * Used by BubbleMenu, FloatingMenu, Link Popover, and exposed for extension\n * authors building custom floating UI (emoji suggestion, slash command, etc.).\n */\nimport {\n computePosition,\n flip,\n shift,\n offset,\n hide,\n autoUpdate,\n type Placement,\n} from '@floating-ui/dom';\n\nexport interface PositionFloatingOptions {\n /** Placement relative to reference. @default 'bottom' */\n placement?: Placement;\n /** Distance from reference in px. @default 4 */\n offsetValue?: number;\n /** Viewport padding for flip/shift in px. @default 10 */\n padding?: number;\n /** Track ancestor scroll events. Disable for static anchors (e.g. toolbar buttons). @default true */\n trackScroll?: boolean;\n}\n\n/**\n * Positions a floating element relative to a reference element or virtual rect,\n * and keeps it positioned on scroll, resize, and layout shifts.\n *\n * Uses `autoUpdate` from floating-ui with `animationFrame` polling for\n * jitter-free scroll tracking (rAF syncs with browser paint).\n *\n * Includes `hide` middleware - when the reference element is scrolled out of\n * view, the floating element is hidden via `visibility: hidden`.\n *\n * The floating element must have `position: fixed`.\n *\n * Returns a cleanup function. **Always call it** when hiding or destroying\n * the floating element to stop listeners and prevent memory leaks.\n *\n * @example\n * ```ts\n * // Start auto-positioning (follows scroll/resize)\n * const cleanup = positionFloating(buttonEl, dropdownEl, {\n * placement: 'bottom-start',\n * });\n *\n * // Virtual reference (e.g. cursor position - must return fresh coords)\n * const virtualEl = {\n * getBoundingClientRect: () => {\n * const coords = view.coordsAtPos(pos);\n * return new DOMRect(coords.left, coords.top, 0, coords.bottom - coords.top);\n * },\n * };\n * const cleanup = positionFloating(virtualEl, tooltipEl, { placement: 'top' });\n *\n * // Stop when done\n * cleanup();\n * ```\n */\nexport function positionFloating(\n reference: Element | { getBoundingClientRect: () => DOMRect },\n floating: HTMLElement,\n options?: PositionFloatingOptions,\n): () => void {\n const placementOpt = options?.placement ?? 'bottom';\n const paddingOpt = options?.padding ?? 10;\n const middleware = [\n offset(options?.offsetValue ?? 4),\n flip({ padding: paddingOpt }),\n shift({ padding: paddingOpt }),\n hide(),\n ];\n\n const update = (): void => {\n void computePosition(\n reference as Element,\n floating,\n {\n strategy: 'fixed',\n placement: placementOpt,\n middleware,\n },\n ).then(({ x, y, middlewareData }) => {\n // Use transform instead of left/top - GPU-accelerated, no layout reflow,\n // eliminates visible jitter during scroll tracking.\n Object.assign(floating.style, {\n left: '0',\n top: '0',\n transform: `translate3d(${String(x)}px,${String(y)}px,0)`,\n });\n\n // Hide floating element when reference is scrolled out of view\n const hidden = middlewareData.hide?.referenceHidden;\n floating.style.visibility = hidden ? 'hidden' : '';\n });\n };\n\n // When scroll tracking is enabled, use requestAnimationFrame polling\n // instead of scroll event listeners. rAF runs in the same frame as the\n // browser paint, so the position update is synchronous with the scroll,\n // with no 1-frame lag or jitter. Slightly more CPU than event-based, but\n // imperceptible on modern devices and only active while the element is shown.\n //\n // ancestorScroll is always off: when rAF is enabled it's redundant,\n // when rAF is disabled (trackScroll:false) no scroll tracking is wanted.\n const trackScroll = options?.trackScroll ?? true;\n return autoUpdate(reference as Element, floating, update, {\n ancestorScroll: false,\n animationFrame: trackScroll,\n });\n}\n\n/**\n * Positions a floating element using `strategy: 'absolute'` so it scrolls\n * together with its offsetParent - zero jitter by design.\n *\n * Ideal for dropdowns inside scroll containers (e.g. emoji suggestion inside\n * `.dm-editor`) and toolbar dropdowns. The absolute coordinates are stable\n * across scrolls - only `flip`/`shift` decisions change on scroll, producing\n * a discrete jump rather than continuous jitter.\n *\n * The floating element must have `position: absolute` and its offsetParent\n * must have `position: relative`.\n *\n * Returns a cleanup function - call it when hiding or destroying the\n * floating element.\n */\nexport function positionFloatingOnce(\n reference: Element | { getBoundingClientRect: () => DOMRect },\n floating: HTMLElement,\n options?: PositionFloatingOptions,\n): () => void {\n const placementOpt = options?.placement ?? 'bottom';\n const paddingOpt = options?.padding ?? 10;\n const middleware = [\n offset(options?.offsetValue ?? 4),\n flip({ padding: paddingOpt }),\n shift({ padding: paddingOpt }),\n ];\n\n const update = (): void => {\n void computePosition(\n reference as Element,\n floating,\n {\n strategy: 'absolute',\n placement: placementOpt,\n middleware,\n },\n ).then(({ x, y }) => {\n Object.assign(floating.style, {\n left: '0',\n top: '0',\n transform: `translate3d(${String(Math.round(x))}px,${String(Math.round(y))}px,0)`,\n });\n });\n };\n\n // Track scroll + resize. With strategy:'absolute' the base coordinates\n // are stable across scrolls - only flip/shift decisions change (discrete\n // jump, not continuous jitter).\n const trackScroll = options?.trackScroll ?? true;\n return autoUpdate(reference as Element, floating, update, {\n ancestorScroll: trackScroll,\n layoutShift: false,\n });\n}\n","/**\n * Clipboard helper - writes plain text to the system clipboard.\n *\n * Tries the modern async Clipboard API first; if unavailable or denied\n * (Safari private mode, insecure context, missing user gesture), falls\n * back to a hidden textarea + `document.execCommand('copy')`.\n *\n * Returns `true` on success, `false` on failure. Never throws - callers\n * decide how to surface failure (toast, re-throw, silent).\n *\n * @example\n * ```ts\n * const ok = await writeToClipboard('https://example.com#block-abc123');\n * if (!ok) showError('Copy failed');\n * ```\n */\nexport async function writeToClipboard(text: string): Promise<boolean> {\n // TS DOM types model `navigator` and `navigator.clipboard` as always\n // defined, but in SSR environments `navigator` is undefined entirely,\n // and in insecure / older browsers `clipboard` itself is missing. The\n // runtime checks are genuinely necessary even though TS disagrees.\n /* eslint-disable @typescript-eslint/no-unnecessary-condition */\n if (typeof navigator !== 'undefined' && navigator.clipboard?.writeText) {\n try {\n await navigator.clipboard.writeText(text);\n return true;\n } catch {\n // Fall through to execCommand fallback.\n }\n }\n /* eslint-enable @typescript-eslint/no-unnecessary-condition */\n\n if (typeof document === 'undefined') return false;\n\n const textarea = document.createElement('textarea');\n textarea.value = text;\n // Hide the textarea off-screen but keep it focusable.\n textarea.style.position = 'fixed';\n textarea.style.top = '-1000px';\n textarea.style.left = '-1000px';\n textarea.style.opacity = '0';\n textarea.setAttribute('readonly', '');\n document.body.appendChild(textarea);\n\n try {\n textarea.select();\n textarea.setSelectionRange(0, text.length);\n // `execCommand` is deprecated but remains the only synchronous fallback\n // for clipboard writes when the async API is unavailable. Modern\n // browsers all ship `navigator.clipboard`, so this path is hit only in\n // edge cases (insecure context, permissions denied).\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n return document.execCommand('copy');\n } catch {\n return false;\n } finally {\n textarea.remove();\n }\n}\n","/**\n * Copies `dm-theme-*` classes from the editor's host element onto a\n * floating element that lives OUTSIDE `.dm-editor` (typically portaled\n * to `document.body` to escape `overflow: hidden`). Without the copy\n * the `.dm-theme-dark` cascade does not reach the floating element and\n * it renders with light-theme defaults on a dark page.\n *\n * Call this whenever the floating element is shown - cheap and\n * idempotent. Removes stale theme classes from the target first so\n * runtime theme toggles propagate on the next show.\n */\nexport function copyThemeClass(view: { dom: Element }, target: Element): void {\n const stale: string[] = [];\n target.classList.forEach((cls) => {\n if (cls.startsWith('dm-theme-')) stale.push(cls);\n });\n for (const cls of stale) target.classList.remove(cls);\n\n const source = view.dom.closest('[class*=\"dm-theme-\"]') ?? view.dom.closest('.dm-editor');\n if (!source) return;\n source.classList.forEach((cls) => {\n if (cls.startsWith('dm-theme-')) target.classList.add(cls);\n });\n}\n","import type { Editor } from '../Editor.js';\n\nconst NOTION_MODE_CLASS = 'dm-notion-mode';\n\nconst NOTION_TEXT_CONTEXT: readonly string[] = Object.freeze([\n 'bold', 'italic', 'underline', 'strike', 'code',\n '|', 'link',\n '|', 'textAlign',\n]);\n\nconst STANDARD_TEXT_CONTEXT: readonly string[] = Object.freeze([\n 'bold', 'italic', 'underline', 'strike', 'code',\n '|', 'link',\n]);\n\n/**\n * Default `contexts` map for a bubble menu when the consumer has not\n * supplied one. Returns a richer item set when the editor (or any\n * ancestor) carries the `.dm-notion-mode` class - that class is the\n * project-wide signal that the host is rendering Notion-style UX, so\n * the bubble menu mirrors it by including `link` and `textAlign`.\n *\n * Consumers can always override by passing their own `contexts` prop.\n */\nexport function defaultBubbleContexts(\n editor: Editor,\n): Record<string, string[]> {\n const inNotionMode = editor.view.dom.closest('.' + NOTION_MODE_CLASS) !== null;\n const text = inNotionMode ? NOTION_TEXT_CONTEXT : STANDARD_TEXT_CONTEXT;\n return { text: [...text] };\n}\n","import type { Node as PMNode } from '@domternal/pm/model';\nimport type { Transaction } from '@domternal/pm/state';\n\nconst LIST_ITEM_TYPES = new Set(['listItem', 'taskItem']);\nconst LIST_WRAPPER_TYPES = new Set(['bulletList', 'orderedList', 'taskList']);\n\nexport interface InsertAsListItemChildArgs {\n /** Existing transaction to mutate. Caller dispatches. */\n tr: Transaction;\n /** Position of the list wrapper node (bulletList / orderedList / taskList) in `tr.doc`. */\n wrapperPos: number;\n /**\n * Position of the target list item node (= position right BEFORE the\n * item) in `tr.doc`. When omitted, the wrapper's LAST child is used,\n * matching the Tab keyboard behaviour (\"indent into last item\").\n */\n targetItemPos?: number;\n /** Block node to append as the LAST child of the target item. */\n blockNode: PMNode;\n /**\n * Optional source range to delete in the SAME transaction (when\n * MOVING an existing block instead of creating a new one). Position\n * math handles source-before-vs-after-target ordering automatically.\n */\n sourceRange?: { from: number; to: number };\n}\n\nexport interface InsertAsListItemChildResult {\n /** True when schema accepted the insertion and `tr` was mutated. */\n ok: boolean;\n /**\n * Position right BEFORE the inserted block in the resulting doc.\n * Caller can resolve `insertedAt + 1` to place the caret inside the\n * inserted block. Only present when `ok === true`.\n */\n insertedAt?: number;\n}\n\n/**\n * Insert `blockNode` as the LAST child of a list item (target item or, when\n * omitted, the wrapper's last item). When `sourceRange` is set, the source\n * range is removed in the same transaction so the op is a clean MOVE.\n * Returns `{ ok: false }` WITHOUT mutating `tr` on schema reject so callers\n * can fall through to a sibling-mode fallback.\n */\nexport function insertAsListItemChild(\n args: InsertAsListItemChildArgs,\n): InsertAsListItemChildResult {\n const { tr, wrapperPos, targetItemPos, blockNode, sourceRange } = args;\n\n if (wrapperPos < 0 || wrapperPos >= tr.doc.content.size) return { ok: false };\n const wrapper = tr.doc.nodeAt(wrapperPos);\n if (!wrapper || !LIST_WRAPPER_TYPES.has(wrapper.type.name)) return { ok: false };\n if (wrapper.childCount === 0) return { ok: false };\n\n let targetItem: PMNode;\n let targetItemStart: number;\n if (targetItemPos !== undefined) {\n if (targetItemPos < 0 || targetItemPos >= tr.doc.content.size) return { ok: false };\n const candidate = tr.doc.nodeAt(targetItemPos);\n if (!candidate || !LIST_ITEM_TYPES.has(candidate.type.name)) return { ok: false };\n // Verify the candidate item really sits inside the given wrapper -\n // a mismatched (wrapperPos, targetItemPos) pair would otherwise\n // produce silently-wrong position math.\n if (targetItemPos < wrapperPos + 1 || targetItemPos >= wrapperPos + wrapper.nodeSize) {\n return { ok: false };\n }\n targetItem = candidate;\n targetItemStart = targetItemPos;\n } else {\n const last = wrapper.lastChild;\n if (!last || !LIST_ITEM_TYPES.has(last.type.name)) return { ok: false };\n let pos = wrapperPos + 1;\n for (let i = 0; i < wrapper.childCount - 1; i++) {\n pos += wrapper.child(i).nodeSize;\n }\n targetItem = last;\n targetItemStart = pos;\n }\n\n if (!targetItem.canReplaceWith(targetItem.childCount, targetItem.childCount, blockNode.type)) {\n return { ok: false };\n }\n\n // Position right BEFORE the item's close token = end of its content,\n // where a new last-child is appended. Computed from the PRE-mutation\n // doc so the offset reflects the layout the caller can reason about.\n const targetItemContentEnd = targetItemStart + targetItem.nodeSize - 1;\n\n if (sourceRange) {\n const { from, to } = sourceRange;\n // Self-drop guard: target sits inside the deletion range. Caller's\n // responsibility is primary, but defending here avoids a silent\n // \"insert into removed range\" that would corrupt the document.\n if (targetItemContentEnd >= from && targetItemContentEnd <= to) {\n return { ok: false };\n }\n tr.delete(from, to);\n const adjustedInsertPos =\n targetItemContentEnd > from ? targetItemContentEnd - (to - from) : targetItemContentEnd;\n tr.insert(adjustedInsertPos, blockNode);\n return { ok: true, insertedAt: adjustedInsertPos };\n }\n\n tr.insert(targetItemContentEnd, blockNode);\n return { ok: true, insertedAt: targetItemContentEnd };\n}\n","import type { EditorState, Transaction } from '@domternal/pm/state';\nimport { TextSelection } from '@domternal/pm/state';\nimport { liftTarget } from '@domternal/pm/transform';\nimport type { ListItemCursorContext } from './listItemCursorContext.js';\n\n/**\n * Lift an empty children-zone paragraph out of its list/task item as a\n * top-level sibling. PM's `liftTarget` covers the common case; we fall\n * back to manual delete-and-insert when it returns null (empty p sandwiched\n * before a non-paragraph would leave the after-cut half violating the\n * `paragraph block*` schema).\n */\nexport function liftEmptyChildrenZoneParagraph(\n state: EditorState,\n dispatch: ((tr: Transaction) => void) | undefined,\n ctx: ListItemCursorContext,\n): boolean {\n if (!ctx.isInChildrenZone || !ctx.paragraphIsEmpty) return false;\n\n const { $from } = state.selection;\n // Stale-ctx guard: caller may have computed `ctx` against an older selection.\n if ($from.parent.type.name !== 'paragraph') return false;\n if ($from.parent.content.size !== 0) return false;\n\n const paragraphType = state.schema.nodes['paragraph'];\n if (!paragraphType) return false;\n\n // Path 1: standard lift via PM's liftTarget.\n const range = $from.blockRange();\n if (range) {\n const target = liftTarget(range);\n if (target !== null) {\n if (!dispatch) return true;\n const tr = state.tr.lift(range, target);\n const oldParaStart = $from.before($from.depth);\n const newParaStart = tr.mapping.map(oldParaStart);\n tr.setSelection(TextSelection.create(tr.doc, newParaStart + 1));\n dispatch(tr.scrollIntoView());\n return true;\n }\n }\n\n // Path 2: liftTarget returned null. Delete the empty paragraph in place\n // (label + rest still satisfies `paragraph block*`), then insert a fresh\n // empty paragraph at the top-level slot next to the wrapper.\n const paraStart = $from.before($from.depth);\n const paraEnd = $from.after($from.depth);\n\n const itemNode = state.doc.nodeAt(ctx.itemPos);\n if (!itemNode) return false;\n const itemEnd = ctx.itemPos + itemNode.nodeSize;\n\n const wrapperNode = state.doc.nodeAt(ctx.wrapperPos);\n if (!wrapperNode) return false;\n const wrapperEnd = ctx.wrapperPos + wrapperNode.nodeSize;\n\n const isLastItem = ctx.itemIndexInWrapper === wrapperNode.childCount - 1;\n\n // Pre-flight: wrapper's parent must accept a paragraph at the lift slot,\n // otherwise the manual edits would leave an invalid doc.\n const wrapperParentDepth = ctx.itemDepth - 2;\n if (wrapperParentDepth < 0) return false;\n const wrapperParent = $from.node(wrapperParentDepth);\n const wrapperIndexInParent = $from.index(wrapperParentDepth);\n if (\n !wrapperParent.canReplaceWith(\n wrapperIndexInParent + 1,\n wrapperIndexInParent + 1,\n paragraphType,\n )\n ) {\n return false;\n }\n\n if (!dispatch) return true;\n\n const newPara = paragraphType.create();\n const tr = state.tr;\n\n if (isLastItem) {\n // Last-item case: insert after the wrapper.\n tr.delete(paraStart, paraEnd);\n const insertPos = tr.mapping.map(wrapperEnd);\n tr.insert(insertPos, newPara);\n tr.setSelection(TextSelection.create(tr.doc, insertPos + 1));\n } else {\n // Mid-wrapper: split after the current item; new paragraph lands in the gap.\n tr.delete(paraStart, paraEnd);\n const splitAt = tr.mapping.map(itemEnd);\n tr.split(splitAt, 1);\n const insertPos = splitAt + 1;\n tr.insert(insertPos, newPara);\n tr.setSelection(TextSelection.create(tr.doc, insertPos + 1));\n }\n\n dispatch(tr.scrollIntoView());\n return true;\n}\n","import type { EditorState, Transaction } from '@domternal/pm/state';\nimport { TextSelection } from '@domternal/pm/state';\nimport type { ListItemCursorContext } from './listItemCursorContext.js';\n\n/**\n * Insert an empty paragraph as next sibling inside the same list/task item,\n * keeping the cursor in the children-zone so Enter accumulates blocks at the\n * same nesting level (Notion semantics). Exit paths are Backspace on empty,\n * Shift+Tab, or Enter on the empty label paragraph.\n */\nexport function insertChildrenZoneSibling(\n state: EditorState,\n dispatch: ((tr: Transaction) => void) | undefined,\n ctx: ListItemCursorContext,\n): boolean {\n if (!ctx.isInChildrenZone || !ctx.paragraphIsEmpty) return false;\n\n const paragraphType = state.schema.nodes['paragraph'];\n if (!paragraphType) return false;\n\n const { $from } = state.selection;\n // Stale-ctx guard: caller may have computed `ctx` against an older selection.\n if ($from.parent.type.name !== 'paragraph') return false;\n if ($from.parent.content.size !== 0) return false;\n\n if (!dispatch) return true;\n\n const insertPos = $from.after($from.depth);\n const tr = state.tr.insert(insertPos, paragraphType.create());\n tr.setSelection(TextSelection.create(tr.doc, insertPos + 1));\n dispatch(tr.scrollIntoView());\n return true;\n}\n","/**\n * Positions an INSERT-style command at TOP LEVEL when the cursor sits in\n * the LABEL paragraph of a list/task item. Used by Divider, Table, Image,\n * Table-of-Contents (any command that inserts a NEW block of content\n * rather than transforming the cursor's existing line).\n *\n * Behavior mirrors Notion:\n * - the user's list item stays a list item (its content is preserved)\n * - the new block is inserted at the document level, AFTER the current\n * item, splitting the parent list around it when necessary\n * - if the label is empty, the empty item itself is consumed (so we\n * don't leave a dangling empty bullet above the inserted block)\n *\n * Returns a `{ from, to }` range that the caller should fill with\n * `tr.replaceWith(from, to, [block, optionalTrailingParagraph])`:\n * - `from === to` for the non-empty cases (pure insertion)\n * - `from < to` for the empty case (replacement of the empty paragraph\n * that PM's `liftListItem` produced - replacement avoids leaving a\n * stray empty paragraph above the inserted block when the doc would\n * otherwise become empty)\n */\nimport { liftListItem } from '@domternal/pm/schema-list';\nimport type { EditorState, Transaction } from '@domternal/pm/state';\nimport {\n findListItemAncestorDepth,\n isInsideListItem,\n} from './listItemAncestor.js';\n\nexport interface SplitListForInsertRange {\n from: number;\n to: number;\n}\n\n/**\n * Activation conditions (single-cursor only):\n * - selection is empty\n * - cursor's nearest list-item ancestor exists\n * - cursor's containing block is at index 0 (label slot) of that item\n * - `tr` has no prior steps\n *\n * @returns A range where the caller should call `tr.replaceWith(from, to,\n * [block, optionalTrailingParagraph])`, or `null` if the cursor isn't\n * in a list-item label.\n */\nexport function splitListForInsert(\n state: EditorState,\n tr: Transaction,\n): SplitListForInsertRange | null {\n if (!tr.selection.empty) return null;\n if (tr.steps.length !== 0) return null;\n\n const { $from } = tr.selection;\n const listItemDepth = findListItemAncestorDepth($from);\n if (listItemDepth === -1) return null;\n if ($from.index(listItemDepth) !== 0) return null;\n\n const listDepth = listItemDepth - 1;\n const listItemNode = $from.node(listItemDepth);\n const labelParagraph = listItemNode.firstChild;\n const labelIsEmpty =\n listItemNode.childCount === 1 && (labelParagraph?.content.size ?? 0) === 0;\n\n // ─── Empty-label case ────────────────────────────────────────────────\n // Use PM's `liftListItem` to split the parent list around the empty\n // item (becomes a top-level empty paragraph). The caller then replaces\n // that paragraph with its content. Replacement (not deletion + insert)\n // avoids PM's auto-fill behavior when the resulting doc would be empty.\n //\n // For nested empty items (e.g. ul > li > ul > li(empty) > p) PM's\n // `liftListItem` only lifts ONE wrapper level. Loop until the cursor\n // reaches doc top level, otherwise the caller's `tr.replaceWith` would\n // target a position inside a still-enclosing listItem where a top-level\n // node (hr, table, image) is schema-invalid.\n if (labelIsEmpty) {\n const listItemType = listItemNode.type;\n let safetyLimit = 10;\n while (safetyLimit-- > 0) {\n const stepState = state.apply(tr);\n const liftOk = liftListItem(listItemType)(stepState, (liftTr) => {\n for (const step of liftTr.steps) tr.step(step);\n if (liftTr.selectionSet) tr.setSelection(liftTr.selection);\n });\n if (!liftOk) break;\n if (!isInsideListItem(tr.selection.$from)) break;\n }\n\n const $afterLift = tr.selection.$from;\n if (isInsideListItem($afterLift)) return null;\n return { from: $afterLift.before(), to: $afterLift.after() };\n }\n\n // ─── Non-empty, LAST item in list: insert just after the list ────────\n const listNode = $from.node(listDepth);\n const indexInList = $from.index(listDepth);\n const isLast = indexInList === listNode.childCount - 1;\n if (isLast) {\n const pos = $from.after(listDepth);\n return { from: pos, to: pos };\n }\n\n // ─── Non-empty, MID/FIRST item: split the parent list ────────────────\n // Split point sits inside the parent list, between the current item\n // and the next sibling. depth=1 splits ONLY the list (not the item).\n // After split, the new top-level boundary at the parent level (doc)\n // is `splitPos + 1`.\n const splitPos = $from.after(listItemDepth);\n tr.split(splitPos, 1);\n const pos = splitPos + 1;\n return { from: pos, to: pos };\n}\n","/**\n * Node - Base class for node extensions\n *\n * Nodes define document structure elements that contribute to the schema.\n * Examples: Paragraph, Heading, List, Image, etc.\n *\n * Three-tier model:\n * - Extension (type: 'extension') → Pure functionality (History, Placeholder, etc.)\n * - Node (type: 'node') → Schema nodes (Paragraph, Heading, etc.)\n * - Mark (type: 'mark') → Schema marks (Bold, Italic, etc.)\n *\n * @example\n * const Paragraph = Node.create({\n * name: 'paragraph',\n * group: 'block',\n * content: 'inline*',\n * parseHTML() {\n * return [{ tag: 'p' }];\n * },\n * renderHTML({ HTMLAttributes }) {\n * return ['p', HTMLAttributes, 0];\n * },\n * });\n */\n\nimport type { NodeSpec, NodeType, TagParseRule } from '@domternal/pm/model';\nimport { Extension, type ExtensionEditorInterface, mergeConfigWithParentBinding } from './Extension.js';\nimport type { NodeConfig, NodeContext } from './types/NodeConfig.js';\nimport { callOrReturn } from './helpers/callOrReturn.js';\nimport { buildProseMirrorAttrs, buildHTMLAttributes } from './helpers/specBuilder.js';\n\n/**\n * Extended editor interface for Node\n * Includes schema access for NodeType getter\n */\nexport interface NodeEditorInterface extends ExtensionEditorInterface {\n readonly schema: {\n nodes: Record<string, NodeType>;\n };\n}\n\n/**\n * Base class for node extensions\n *\n * @typeParam Options - Node options type\n * @typeParam Storage - Node storage type\n */\nexport class Node<Options = unknown, Storage = unknown> extends Extension<\n Options,\n Storage\n> {\n /**\n * Node type identifier\n * Distinguishes nodes from extensions and marks\n */\n override readonly type = 'node' as const;\n\n /**\n * The original configuration object\n * Typed as NodeConfig for node-specific properties\n */\n declare readonly config: NodeConfig<Options, Storage>;\n\n /**\n * Editor instance with schema access\n * null until set by ExtensionManager\n */\n override editor: NodeEditorInterface | null = null;\n\n /**\n * Protected constructor - use Node.create() instead\n */\n protected constructor(config: NodeConfig<Options, Storage>) {\n super(config);\n }\n\n /**\n * Get the ProseMirror NodeType from schema\n *\n * This is a lazy getter because schema doesn't exist at node creation time.\n * Schema is built FROM nodes by ExtensionManager.\n *\n * Returns null if editor is not yet initialized.\n * Always check editor is set before using nodeType.\n */\n get nodeType(): NodeType | null {\n if (!this.editor) {\n return null;\n }\n return this.editor.schema.nodes[this.name] ?? null;\n }\n\n /**\n * Get NodeType or throw if not initialized.\n * Use in contexts where editor is guaranteed to be set (like addCommands).\n */\n get nodeTypeOrThrow(): NodeType {\n const type = this.nodeType;\n if (!type) {\n throw new Error(\n `Node \"${this.name}\" is not initialized. ` +\n `Make sure the editor is created before accessing nodeType.`\n );\n }\n return type;\n }\n\n /**\n * Creates a new node instance\n *\n * @param config - Node configuration\n * @returns New node instance\n *\n * @example\n * const Paragraph = Node.create({\n * name: 'paragraph',\n * group: 'block',\n * content: 'inline*',\n * });\n */\n static override create<O = unknown, S = unknown>(\n config: NodeConfig<O, S>\n ): Node<O, S> {\n return new Node(config);\n }\n\n /**\n * Creates a new node with merged options. Original node is not modified.\n * Options merge shallowly (object spread); see {@link Extension.configure}\n * for the nested-object gotcha and a workaround.\n *\n * @example\n * const CustomParagraph = Paragraph.configure({ HTMLAttributes: { class: 'custom' } });\n */\n override configure(options: Partial<Options>): Node<Options, Storage> {\n const newConfig: NodeConfig<Options, Storage> = {\n ...this.config,\n addOptions: () => ({\n ...this.options,\n ...options,\n }),\n };\n\n return new Node(newConfig);\n }\n\n /**\n * Creates a new node with extended configuration\n * Original node is not modified\n *\n * **Note:** Config is merged shallowly using object spread (`...`).\n * Config properties (like `addAttributes`, `parseHTML`) are\n * replaced entirely, not combined with the base node's config.\n *\n * @param extendedConfig - Configuration to extend/override\n * @returns New node instance with extended config\n *\n * @example\n * const CustomParagraph = Paragraph.extend({\n * name: 'customParagraph',\n * addAttributes() {\n * return { ...this.parent?.(), align: { default: 'left' } };\n * },\n * });\n *\n * @example\n * // To preserve base node's parse rules while adding new ones:\n * const Extended = BaseNode.extend({\n * parseHTML() {\n * const baseRules = BaseNode.config.parseHTML?.call(this) ?? [];\n * return [...baseRules, { tag: 'custom-tag' }];\n * },\n * });\n */\n override extend<ExtendedOptions = Options, ExtendedStorage = Storage>(\n extendedConfig: Partial<NodeConfig<ExtendedOptions, ExtendedStorage>> &\n ThisType<NodeContext<ExtendedOptions, ExtendedStorage>>\n ): Node<ExtendedOptions, ExtendedStorage> {\n const newConfig = mergeConfigWithParentBinding(this.config, extendedConfig);\n\n return new Node(newConfig as NodeConfig<ExtendedOptions, ExtendedStorage>);\n }\n\n /**\n * Creates a ProseMirror NodeSpec from this node's configuration\n *\n * Called by ExtensionManager when building the schema.\n * Converts our config format to ProseMirror's NodeSpec format.\n *\n * @returns ProseMirror NodeSpec\n */\n createNodeSpec(): NodeSpec {\n const spec: NodeSpec = {};\n\n // Schema properties - use callOrReturn for group/inline to support dynamic values\n if (this.config.group !== undefined) spec.group = callOrReturn(this.config.group, this);\n if (this.config.content !== undefined) spec.content = this.config.content;\n if (this.config.inline !== undefined) spec.inline = callOrReturn(this.config.inline, this);\n if (this.config.atom !== undefined) spec.atom = this.config.atom;\n if (this.config.selectable !== undefined)\n spec.selectable = this.config.selectable;\n if (this.config.draggable !== undefined)\n spec.draggable = this.config.draggable;\n if (this.config.code !== undefined) spec.code = this.config.code;\n if (this.config.whitespace !== undefined)\n spec.whitespace = this.config.whitespace;\n if (this.config.isolating !== undefined)\n spec.isolating = this.config.isolating;\n if (this.config.defining !== undefined)\n spec.defining = this.config.defining;\n if (this.config.marks !== undefined) spec.marks = this.config.marks;\n if (this.config.allowGapCursor !== undefined)\n (spec as Record<string, unknown>)['allowGapCursor'] =\n this.config.allowGapCursor;\n if (this.config.tableRole !== undefined)\n (spec as Record<string, unknown>)['tableRole'] =\n this.config.tableRole;\n\n // Leaf text - bind to extension instance so this.storage etc. are available\n if (this.config.leafText !== undefined) {\n if (typeof this.config.leafText === 'function') {\n const leafTextFn = this.config.leafText;\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const instance = this;\n spec.leafText = (node) => leafTextFn.call(instance, node);\n } else {\n spec.leafText = () => this.config.leafText as string;\n }\n }\n\n // Attributes - convert AttributeSpecs to ProseMirror attrs\n const attributeSpecs = callOrReturn(this.config.addAttributes, this);\n if (attributeSpecs) {\n spec.attrs = buildProseMirrorAttrs(attributeSpecs);\n }\n\n // Parse rules - convert to parseDOM\n const parseRules = callOrReturn(this.config.parseHTML, this);\n if (parseRules && parseRules.length > 0) {\n // Build parseDOM array with proper typing\n // ProseMirror's TagParseRule type is strict, so we cast through unknown\n const parseDOMRules = parseRules.map((rule) => {\n // Build parse rule object using object literal to avoid index signature issues\n const parseRule: {\n tag?: string;\n style?: string;\n priority?: number;\n consuming?: boolean;\n context?: string;\n preserveWhitespace?: boolean | 'full';\n getAttrs?: (\n node: HTMLElement | string\n ) => Record<string, unknown> | false | null;\n } = {};\n\n if (rule.tag) parseRule.tag = rule.tag;\n if (rule.style) parseRule.style = rule.style;\n if (rule.priority !== undefined) parseRule.priority = rule.priority;\n if (rule.consuming !== undefined) parseRule.consuming = rule.consuming;\n if (rule.context) parseRule.context = rule.context;\n if (rule.preserveWhitespace !== undefined)\n parseRule.preserveWhitespace = rule.preserveWhitespace;\n\n // Handle getAttrs - need to merge with attribute parseHTML\n if (rule.getAttrs || attributeSpecs) {\n parseRule.getAttrs = (node: HTMLElement | string) => {\n // If node is string (for style rules), skip attribute parsing\n if (typeof node === 'string') {\n return rule.getAttrs\n ? rule.getAttrs(node as unknown as HTMLElement) ?? {}\n : {};\n }\n\n // Get attrs from rule\n const ruleAttrs = rule.getAttrs ? rule.getAttrs(node) : {};\n\n // If rule returned null, skip this rule\n if (ruleAttrs === null || ruleAttrs === undefined) {\n return false;\n }\n\n // Get attrs from attribute parseHTML functions\n const parsedAttrs: Record<string, unknown> = { ...ruleAttrs };\n if (attributeSpecs) {\n for (const [name, attrSpec] of Object.entries(attributeSpecs)) {\n if (attrSpec.parseHTML) {\n parsedAttrs[name] = attrSpec.parseHTML(node);\n }\n }\n }\n\n return parsedAttrs;\n };\n }\n\n return parseRule;\n });\n\n // Cast required: Our NodeParseRule type is structurally compatible with\n // ProseMirror's TagParseRule but TypeScript can't infer this due to\n // our custom getAttrs return type. The cast is safe.\n spec.parseDOM = parseDOMRules as unknown as readonly TagParseRule[];\n }\n\n // Render - convert renderHTML to toDOM\n if (this.config.renderHTML) {\n const renderFn = this.config.renderHTML;\n const attrSpecs = attributeSpecs;\n // Capture 'this' (the Node instance) for use in toDOM\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const nodeInstance = this;\n\n spec.toDOM = (node) => {\n const htmlAttrs = attrSpecs\n ? buildHTMLAttributes(node.attrs, attrSpecs)\n : {};\n\n // Call renderFn with Node instance as 'this' context\n return renderFn.call(nodeInstance, { node, HTMLAttributes: htmlAttrs });\n };\n }\n\n return spec;\n }\n}\n","/**\n * ToolbarController - Headless, framework-agnostic toolbar state machine\n *\n * Manages toolbar item collection, grouping, active state tracking,\n * dropdown state, and keyboard navigation. Framework wrappers (Angular,\n * React, Vue) bind their templates to this controller.\n *\n * @example\n * const controller = new ToolbarController(editor, () => {\n * // Called on every state change - trigger framework re-render\n * });\n * controller.subscribe();\n * // ... use controller.groups, controller.activeMap, etc.\n * controller.destroy();\n */\n\nimport type { ToolbarItem, ToolbarButton, ToolbarDropdown, ToolbarLayoutEntry } from './types/Toolbar.js';\n\n/**\n * Editor interface for ToolbarController.\n * Minimal surface to avoid circular dependency on Editor class.\n */\nexport interface ToolbarControllerEditor {\n readonly toolbarItems: ToolbarItem[];\n readonly storage: Record<string, unknown>;\n isActive(\n nameOrAttributes: string | { name: string; attributes?: Record<string, unknown> },\n attributes?: Record<string, unknown>\n ): boolean;\n readonly commands: Record<string, (...args: unknown[]) => boolean>;\n can(): Record<string, (...args: unknown[]) => boolean>;\n on(event: string, handler: (...args: unknown[]) => void): void;\n off(event: string, handler: (...args: unknown[]) => void): void;\n}\n\n/**\n * A group of toolbar items with the same group name.\n */\nexport interface ToolbarGroup {\n name: string;\n items: ToolbarItem[];\n}\n\n/**\n * Flattened button reference for keyboard navigation.\n */\ninterface FlatButton {\n item: ToolbarButton | ToolbarDropdown;\n groupIndex: number;\n itemIndex: number;\n}\n\n/** Minimal editor shape for static helpers (avoids strict ToolbarControllerEditor compatibility issues) */\ninterface ToolbarItemEditor {\n readonly storage: Record<string, unknown>;\n readonly commands: Record<string, (...args: unknown[]) => boolean>;\n isActive(\n nameOrAttributes: string | { name: string; attributes?: Record<string, unknown> },\n attributes?: Record<string, unknown>\n ): boolean;\n}\n\nexport class ToolbarController {\n /**\n * Resolves the active state of a toolbar button against the editor.\n * Shared between ToolbarController and framework components (e.g. bubble-menu).\n */\n static resolveActive(editor: ToolbarItemEditor, item: ToolbarButton): boolean {\n if (item.isActiveFn) return item.isActiveFn(editor);\n if (!item.isActive) return false;\n if (typeof item.isActive === 'string') return editor.isActive(item.isActive);\n if (Array.isArray(item.isActive)) {\n return item.isActive.some(c =>\n typeof c === 'string' ? editor.isActive(c) : editor.isActive(c.name, c.attributes));\n }\n return editor.isActive(item.isActive.name, item.isActive.attributes);\n }\n\n /**\n * Executes a toolbar button's command on the editor.\n * Shared between ToolbarController and framework components (e.g. bubble-menu).\n */\n static executeItem(editor: ToolbarItemEditor, item: ToolbarButton): void {\n const cmd = editor.commands[item.command];\n if (cmd) {\n if (item.commandArgs?.length) {\n cmd(...item.commandArgs);\n } else {\n cmd();\n }\n }\n }\n\n private editor: ToolbarControllerEditor;\n private onChange: () => void;\n private _layout: ToolbarLayoutEntry[] | null;\n private transactionHandler: (() => void) | null = null;\n\n /** Grouped and sorted toolbar items */\n private _groups: ToolbarGroup[] = [];\n\n /** Active state for each button (keyed by item.name) */\n private _activeMap = new Map<string, boolean>();\n\n /** Disabled state for each button (keyed by item.name) */\n private _disabledMap = new Map<string, boolean>();\n\n /** Expanded state for emitEvent buttons - true when their panel is open */\n private _expandedMap = new Map<string, boolean>();\n\n /** Currently open dropdown name (null = none) */\n private _openDropdown: string | null = null;\n\n /** Focused button index for roving tabindex (-1 = none) */\n private _focusedIndex = 0;\n\n /** Flat list of top-level buttons/dropdowns for keyboard nav */\n private _flatButtons: FlatButton[] = [];\n\n constructor(editor: ToolbarControllerEditor, onChange: () => void, layout?: ToolbarLayoutEntry[]) {\n this.editor = editor;\n this.onChange = onChange;\n this._layout = layout ?? null;\n this.rebuild();\n }\n\n // === Getters ===\n\n get groups(): ToolbarGroup[] {\n return this._groups;\n }\n\n get activeMap(): ReadonlyMap<string, boolean> {\n return this._activeMap;\n }\n\n get disabledMap(): ReadonlyMap<string, boolean> {\n return this._disabledMap;\n }\n\n get expandedMap(): ReadonlyMap<string, boolean> {\n return this._expandedMap;\n }\n\n get openDropdown(): string | null {\n return this._openDropdown;\n }\n\n get focusedIndex(): number {\n return this._focusedIndex;\n }\n\n get flatButtonCount(): number {\n return this._flatButtons.length;\n }\n\n // === State Methods ===\n\n /**\n * Checks if a toolbar button is currently active.\n */\n isActive(item: ToolbarButton): boolean {\n return this._activeMap.get(item.name) ?? false;\n }\n\n /**\n * Checks if a toolbar button is currently disabled (command cannot execute).\n */\n isDisabled(item: ToolbarButton): boolean {\n return this._disabledMap.get(item.name) ?? false;\n }\n\n /**\n * Executes a toolbar button's command.\n */\n executeCommand(item: ToolbarButton): void {\n ToolbarController.executeItem(this.editor, item);\n this.updateActiveStates();\n }\n\n /**\n * Toggles a dropdown open/closed.\n */\n toggleDropdown(name: string): void {\n this._openDropdown = this._openDropdown === name ? null : name;\n this.onChange();\n }\n\n /**\n * Closes any open dropdown.\n */\n closeDropdown(): void {\n if (this._openDropdown !== null) {\n this._openDropdown = null;\n this.onChange();\n }\n }\n\n // === Keyboard Navigation ===\n\n /**\n * Move focus to the next button (ArrowRight).\n */\n navigateNext(): number {\n if (this._flatButtons.length === 0) return -1;\n this._focusedIndex = (this._focusedIndex + 1) % this._flatButtons.length;\n this.onChange();\n return this._focusedIndex;\n }\n\n /**\n * Move focus to the previous button (ArrowLeft).\n */\n navigatePrev(): number {\n if (this._flatButtons.length === 0) return -1;\n this._focusedIndex =\n (this._focusedIndex - 1 + this._flatButtons.length) % this._flatButtons.length;\n this.onChange();\n return this._focusedIndex;\n }\n\n /**\n * Move focus to the first button (Home).\n */\n navigateFirst(): number {\n this._focusedIndex = 0;\n this.onChange();\n return this._focusedIndex;\n }\n\n /**\n * Move focus to the last button (End).\n */\n navigateLast(): number {\n this._focusedIndex = Math.max(0, this._flatButtons.length - 1);\n this.onChange();\n return this._focusedIndex;\n }\n\n /**\n * Set focused index directly (e.g. on mouse enter).\n */\n setFocusedIndex(index: number): void {\n if (index >= 0 && index < this._flatButtons.length) {\n this._focusedIndex = index;\n }\n }\n\n /**\n * Get the flat index of a top-level item by name.\n */\n getFlatIndex(name: string): number {\n return this._flatButtons.findIndex((fb) => fb.item.name === name);\n }\n\n // === Lifecycle ===\n\n /**\n * Subscribes to editor transaction events for active state tracking.\n */\n subscribe(): void {\n this.transactionHandler = () => {\n this.updateActiveStates();\n };\n this.editor.on('transaction', this.transactionHandler);\n this.updateActiveStates();\n }\n\n /**\n * Unsubscribes from editor events and cleans up.\n */\n destroy(): void {\n if (this.transactionHandler) {\n this.editor.off('transaction', this.transactionHandler);\n this.transactionHandler = null;\n }\n this._groups = [];\n this._activeMap.clear();\n this._disabledMap.clear();\n this._expandedMap.clear();\n this._flatButtons = [];\n }\n\n // === Internal ===\n\n /**\n * Rebuilds groups and flat button list from editor.toolbarItems.\n * When a layout is provided, uses layout-based resolution instead of default grouping.\n */\n private rebuild(): void {\n const items = this.editor.toolbarItems;\n this._groups = this._layout\n ? this.resolveLayout(items, this._layout)\n : this.groupItems(items);\n this._flatButtons = this.buildFlatList();\n this._focusedIndex = 0;\n }\n\n /**\n * Groups items by their `group` property, preserving extension order within groups.\n * Items without a group go into a default '' group.\n * Within each group, items are sorted by priority (higher first).\n */\n private groupItems(items: ToolbarItem[]): ToolbarGroup[] {\n const groupMap = new Map<string, ToolbarItem[]>();\n const groupOrder: string[] = [];\n\n for (const item of items) {\n // Skip items marked as bubble-menu-only\n if (item.type === 'button' && item.toolbar === false) continue;\n const groupName = ('group' in item && item.group) ? item.group : '';\n let list = groupMap.get(groupName);\n if (!list) {\n list = [];\n groupMap.set(groupName, list);\n groupOrder.push(groupName);\n }\n list.push(item);\n }\n\n // Sort items within each group by priority (higher first)\n const groups: ToolbarGroup[] = [];\n for (const name of groupOrder) {\n const groupItems = groupMap.get(name) ?? [];\n groupItems.sort((a, b) => {\n const pa = a.priority ?? 100;\n const pb = b.priority ?? 100;\n return pb - pa;\n });\n groups.push({ name, items: groupItems });\n }\n\n return groups;\n }\n\n /**\n * Resolves a layout array into ToolbarGroups by looking up registered items by name.\n * Separators ('|') split items into visual groups.\n * String entries resolve to existing buttons or dropdowns.\n * ToolbarLayoutDropdown entries build custom dropdowns from named sub-items.\n */\n private resolveLayout(items: ToolbarItem[], layout: ToolbarLayoutEntry[]): ToolbarGroup[] {\n // Build lookup maps from registered toolbar items\n const buttonMap = new Map<string, ToolbarButton>();\n const dropdownMap = new Map<string, ToolbarDropdown>();\n\n for (const item of items) {\n if (item.type === 'button') {\n buttonMap.set(item.name, item);\n } else if (item.type === 'dropdown') {\n dropdownMap.set(item.name, item);\n for (const sub of item.items) {\n buttonMap.set(sub.name, sub);\n }\n }\n }\n\n // Walk layout entries, building groups split by '|'\n const groups: ToolbarGroup[] = [];\n let current: ToolbarItem[] = [];\n let groupIdx = 0;\n\n for (const entry of layout) {\n if (entry === '|') {\n if (current.length > 0) {\n groups.push({ name: `layout-${String(groupIdx++)}`, items: current });\n current = [];\n }\n continue;\n }\n\n if (typeof entry === 'string') {\n const dd = dropdownMap.get(entry);\n if (dd) {\n current.push(dd);\n } else {\n const btn = buttonMap.get(entry);\n if (btn) current.push(btn);\n }\n continue;\n }\n\n // ToolbarLayoutDropdown - build a custom dropdown from named sub-items\n const subItems: ToolbarButton[] = [];\n for (const subName of entry.items) {\n const btn = buttonMap.get(subName);\n if (btn) subItems.push(btn);\n }\n if (subItems.length > 0) {\n const dd: ToolbarDropdown = {\n type: 'dropdown',\n name: `layout-dd-${entry.dropdown}`,\n icon: entry.icon,\n label: entry.dropdown,\n items: subItems,\n };\n if (entry.displayMode) dd.displayMode = entry.displayMode;\n if (entry.dynamicIcon) dd.dynamicIcon = entry.dynamicIcon;\n current.push(dd);\n }\n }\n\n if (current.length > 0) {\n groups.push({ name: `layout-${String(groupIdx)}`, items: current });\n }\n\n return groups;\n }\n\n /**\n * Builds a flat list of top-level buttons/dropdowns for keyboard navigation.\n */\n private buildFlatList(): FlatButton[] {\n const flat: FlatButton[] = [];\n for (const [gi, group] of this._groups.entries()) {\n for (const [ii, item] of group.items.entries()) {\n if (item.type === 'button' || item.type === 'dropdown') {\n flat.push({ item, groupIndex: gi, itemIndex: ii });\n }\n }\n }\n return flat;\n }\n\n /**\n * Updates active state map by checking editor.isActive() for each button.\n */\n private updateActiveStates(): void {\n // Cache can() proxy once per cycle - avoids creating a new Proxy per button\n let canProxy: Record<string, (...args: unknown[]) => boolean> | null = null;\n try {\n canProxy = this.editor.can();\n } catch {\n // can() may throw if editor is in an invalid state\n }\n\n for (const group of this._groups) {\n for (const item of group.items) {\n if (item.type === 'button') {\n this.checkButtonActive(item);\n this.checkButtonDisabled(item, canProxy);\n this.checkButtonExpanded(item);\n } else if (item.type === 'dropdown') {\n for (const sub of item.items) {\n this.checkButtonActive(sub);\n this.checkButtonDisabled(sub, canProxy);\n }\n // Dropdown trigger is disabled when ALL sub-items are disabled\n const allDisabled = item.items.length > 0\n && item.items.every(sub => this._disabledMap.get(sub.name));\n this._disabledMap.set(item.name, allDisabled);\n }\n }\n }\n\n // Always notify - even when no active/disabled states changed, cursor\n // position may have moved, which affects dynamic trigger labels that\n // read computed styles at cursor (e.g. font-size, font-family dropdowns\n // showing values not in the configured list).\n this.onChange();\n }\n\n private checkButtonDisabled(\n item: ToolbarButton,\n canProxy: Record<string, (...args: unknown[]) => boolean> | null,\n ): boolean {\n const wasDisabled = this._disabledMap.get(item.name) ?? false;\n let nowDisabled = false;\n\n try {\n if (item.emitEvent) {\n // emitEvent buttons open a popover - can't do meaningful can() dry-run\n // because the command needs user-provided args (href, src, etc.).\n // Instead, check if cursor is in a code block where marks/inserts are blocked.\n nowDisabled = this.editor.isActive('codeBlock');\n } else if (canProxy) {\n const canCmd = canProxy[item.command];\n if (canCmd) {\n nowDisabled = item.commandArgs?.length\n ? !canCmd(...item.commandArgs)\n : !canCmd();\n }\n }\n } catch {\n // Command dry-run may throw (e.g. buggy extension) - treat as enabled\n }\n\n if (wasDisabled !== nowDisabled) {\n this._disabledMap.set(item.name, nowDisabled);\n return true;\n }\n\n return false;\n }\n\n private checkButtonActive(item: ToolbarButton): boolean {\n if (!item.isActive && !item.isActiveFn) return false;\n\n const wasActive = this._activeMap.get(item.name) ?? false;\n const nowActive = ToolbarController.resolveActive(this.editor, item);\n\n if (wasActive !== nowActive) {\n this._activeMap.set(item.name, nowActive);\n return true;\n }\n\n return false;\n }\n\n private checkButtonExpanded(item: ToolbarButton): boolean {\n if (!item.emitEvent) return false;\n\n const wasExpanded = this._expandedMap.get(item.name) ?? false;\n const ext = this.editor.storage[item.name] as Record<string, unknown> | undefined;\n const nowExpanded = ext?.['isOpen'] === true;\n\n if (wasExpanded !== nowExpanded) {\n this._expandedMap.set(item.name, nowExpanded);\n return true;\n }\n\n return false;\n }\n}\n","import type { FloatingMenuItem } from '../types/FloatingMenu.js';\n\n/**\n * A group of floating-menu items sharing the same `group` value.\n */\nexport interface FloatingMenuGroup {\n name: string;\n items: FloatingMenuItem[];\n}\n\n/**\n * Groups items by their `group` property, preserving extension insertion\n * order of groups. Within each group, items are sorted by `priority`\n * descending (higher first, default 100).\n *\n * Shared between `FloatingMenuController` (which renders grouped item lists\n * for FloatingMenu + framework wrappers) and `createSlashSuggestionRenderer`\n * (the popup shown by SlashCommand). Having one implementation keeps visual\n * grouping consistent across every trigger mechanism.\n */\nexport function groupFloatingMenuItems(items: FloatingMenuItem[]): FloatingMenuGroup[] {\n const map = new Map<string, FloatingMenuItem[]>();\n const order: string[] = [];\n\n for (const item of items) {\n const name = item.group ?? '';\n let list = map.get(name);\n if (!list) {\n list = [];\n map.set(name, list);\n order.push(name);\n }\n list.push(item);\n }\n\n const groups: FloatingMenuGroup[] = [];\n for (const name of order) {\n const list = (map.get(name) ?? []).slice();\n list.sort((a, b) => (b.priority ?? 100) - (a.priority ?? 100));\n groups.push({ name, items: list });\n }\n return groups;\n}\n","/**\n * FloatingMenuController - Headless, framework-agnostic state machine for the\n * block-insert floating menu.\n *\n * Mirrors the shape of ToolbarController: collects items from extensions,\n * groups them, tracks focused index for roving-tabindex keyboard navigation,\n * and executes commands. Framework wrappers (Angular, React, Vue) bind their\n * templates to this controller.\n *\n * @example\n * const controller = new FloatingMenuController(editor, () => {\n * // onChange - re-render\n * });\n * controller.subscribe();\n * // ... controller.groups, controller.focusedIndex, controller.execute(item)\n * controller.destroy();\n */\n\nimport type { Editor } from './Editor.js';\nimport type { FloatingMenuItem, FloatingMenuItemsOverride } from './types/FloatingMenu.js';\nimport { groupFloatingMenuItems, type FloatingMenuGroup } from './utils/groupFloatingMenuItems.js';\n\nexport type { FloatingMenuGroup };\n\n/** -1 means no item is focused (menu not entered via keyboard). */\nexport const FLOATING_MENU_NO_FOCUS = -1;\n\nexport class FloatingMenuController {\n /**\n * Resolves an `items` option (array | function) against the editor's\n * default floating-menu items. Exposed as static so the plugin can\n * resolve once at init without constructing a controller.\n */\n static resolveItems(\n editor: Editor,\n override?: FloatingMenuItemsOverride,\n ): FloatingMenuItem[] {\n const defaults = editor.floatingMenuItems;\n if (!override) return defaults;\n if (Array.isArray(override)) return override;\n try {\n return override(defaults, editor);\n } catch {\n return defaults;\n }\n }\n\n /**\n * Executes a floating-menu item's command on the editor.\n * String commands are dispatched via `editor.commands[name](...args)`;\n * function commands are called directly.\n */\n static executeItem(editor: Editor, item: FloatingMenuItem): void {\n if (typeof item.command === 'function') {\n item.command(editor);\n return;\n }\n const commands = editor.commands as unknown as Record<string, (...args: unknown[]) => boolean>;\n const cmd = commands[item.command];\n if (!cmd) return;\n if (item.commandArgs?.length) {\n cmd(...item.commandArgs);\n } else {\n cmd();\n }\n }\n\n private editor: Editor;\n private onChange: () => void;\n private override: FloatingMenuItemsOverride | undefined;\n private transactionHandler: (() => void) | null = null;\n\n private _groups: FloatingMenuGroup[] = [];\n private _flatItems: FloatingMenuItem[] = [];\n private _disabledMap = new Map<string, boolean>();\n private _focusedIndex = FLOATING_MENU_NO_FOCUS;\n\n constructor(editor: Editor, onChange: () => void, override?: FloatingMenuItemsOverride) {\n this.editor = editor;\n this.onChange = onChange;\n this.override = override;\n this.rebuild();\n }\n\n // === Getters ===\n\n get groups(): FloatingMenuGroup[] {\n return this._groups;\n }\n\n get flatItems(): FloatingMenuItem[] {\n return this._flatItems;\n }\n\n get disabledMap(): ReadonlyMap<string, boolean> {\n return this._disabledMap;\n }\n\n get focusedIndex(): number {\n return this._focusedIndex;\n }\n\n /** True when keyboard focus is inside the menu (at least one item focused). */\n get isEntered(): boolean {\n return this._focusedIndex >= 0;\n }\n\n get itemCount(): number {\n return this._flatItems.length;\n }\n\n // === State Methods ===\n\n isDisabled(item: FloatingMenuItem): boolean {\n return this._disabledMap.get(item.name) ?? false;\n }\n\n /**\n * Executes an item's command, then closes the menu keyboard focus.\n * Callers should refocus the editor after calling this.\n */\n execute(item: FloatingMenuItem): void {\n if (this.isDisabled(item)) return;\n FloatingMenuController.executeItem(this.editor, item);\n this._focusedIndex = FLOATING_MENU_NO_FOCUS;\n this.onChange();\n }\n\n /**\n * Rebuilds items from the editor. Call when the editor's extensions\n * change (rare) or on explicit refresh. Notification is delegated to\n * `updateDisabledStates` which fires `onChange` only when a disabled\n * state flipped - wrappers that need to react to pure group-structure\n * changes do so by bumping their own render signal after constructing\n * / re-using the controller (see framework wrapper usage).\n */\n rebuild(): void {\n const items = FloatingMenuController.resolveItems(this.editor, this.override);\n this._groups = this.groupItems(items);\n this._flatItems = this._groups.flatMap((g) => g.items);\n if (this._focusedIndex >= this._flatItems.length) {\n this._focusedIndex = FLOATING_MENU_NO_FOCUS;\n }\n this.updateDisabledStates();\n }\n\n // === Keyboard Navigation (roving tabindex) ===\n\n /** Enter keyboard focus on the menu (first item). Called by the plugin's keymap. */\n enterMenu(): number {\n if (this._flatItems.length === 0) {\n this._focusedIndex = FLOATING_MENU_NO_FOCUS;\n return this._focusedIndex;\n }\n this._focusedIndex = 0;\n this.onChange();\n return this._focusedIndex;\n }\n\n /** Leave keyboard focus (Escape). Refocus of the editor is the caller's job. */\n leaveMenu(): void {\n if (this._focusedIndex === FLOATING_MENU_NO_FOCUS) return;\n this._focusedIndex = FLOATING_MENU_NO_FOCUS;\n this.onChange();\n }\n\n /** ArrowDown - wrap to first at end. */\n next(): number {\n if (this._flatItems.length === 0) return FLOATING_MENU_NO_FOCUS;\n const cur = this._focusedIndex < 0 ? -1 : this._focusedIndex;\n this._focusedIndex = (cur + 1) % this._flatItems.length;\n this.onChange();\n return this._focusedIndex;\n }\n\n /** ArrowUp - wrap to last at start. */\n prev(): number {\n if (this._flatItems.length === 0) return FLOATING_MENU_NO_FOCUS;\n const len = this._flatItems.length;\n const cur = this._focusedIndex < 0 ? len : this._focusedIndex;\n this._focusedIndex = (cur - 1 + len) % len;\n this.onChange();\n return this._focusedIndex;\n }\n\n first(): number {\n if (this._flatItems.length === 0) return FLOATING_MENU_NO_FOCUS;\n this._focusedIndex = 0;\n this.onChange();\n return this._focusedIndex;\n }\n\n last(): number {\n if (this._flatItems.length === 0) return FLOATING_MENU_NO_FOCUS;\n this._focusedIndex = this._flatItems.length - 1;\n this.onChange();\n return this._focusedIndex;\n }\n\n /** Set focused index directly (e.g. on pointer hover). */\n setFocusedIndex(index: number): void {\n if (index < 0 || index >= this._flatItems.length) return;\n if (this._focusedIndex === index) return;\n this._focusedIndex = index;\n this.onChange();\n }\n\n /** Get focused item (or null). */\n focusedItem(): FloatingMenuItem | null {\n return this._flatItems[this._focusedIndex] ?? null;\n }\n\n /** Get flat index of item by name (for wrappers binding roving tabindex). */\n getFlatIndex(name: string): number {\n return this._flatItems.findIndex((i) => i.name === name);\n }\n\n // === Lifecycle ===\n\n /** Subscribes to editor transactions for disabled-state tracking. */\n subscribe(): void {\n this.transactionHandler = () => {\n this.updateDisabledStates();\n };\n this.editor.on('transaction', this.transactionHandler);\n }\n\n /** Unsubscribes and clears internal state. */\n destroy(): void {\n if (this.transactionHandler) {\n this.editor.off('transaction', this.transactionHandler);\n this.transactionHandler = null;\n }\n this._groups = [];\n this._flatItems = [];\n this._disabledMap.clear();\n this._focusedIndex = FLOATING_MENU_NO_FOCUS;\n }\n\n // === Internal ===\n\n /**\n * Groups items by `group` preserving insertion order, then sorts by\n * priority (higher first) within each group. Delegates to the shared\n * utility so `SlashCommand`'s renderer and this controller always\n * produce identical ordering.\n */\n private groupItems(items: FloatingMenuItem[]): FloatingMenuGroup[] {\n return groupFloatingMenuItems(items);\n }\n\n /**\n * Updates disabled state for each item. Uses custom predicate when\n * provided; otherwise tries a dry-run against `editor.can()[command]`.\n * Only notifies on change to avoid noisy re-renders.\n */\n private updateDisabledStates(): void {\n let changed = false;\n let canProxy: Record<string, (...args: unknown[]) => boolean> | null = null;\n try {\n canProxy = this.editor.can() as unknown as Record<string, (...args: unknown[]) => boolean>;\n } catch {\n canProxy = null;\n }\n\n for (const item of this._flatItems) {\n const was = this._disabledMap.get(item.name) ?? false;\n let now = false;\n\n if (item.isDisabled) {\n try {\n now = item.isDisabled(this.editor);\n } catch {\n now = false;\n }\n } else if (typeof item.command === 'string' && canProxy) {\n try {\n const canCmd = canProxy[item.command];\n if (canCmd) {\n now = item.commandArgs?.length\n ? !canCmd(...item.commandArgs)\n : !canCmd();\n }\n } catch {\n now = false;\n }\n }\n\n if (was !== now) {\n this._disabledMap.set(item.name, now);\n changed = true;\n }\n }\n\n if (changed) this.onChange();\n }\n}\n","// Phosphor Icons (MIT) - https://phosphoricons.com/\n\nimport type { IconSet } from '../types/Toolbar.js';\n\nexport const defaultIcons: IconSet = {\n // --- Format: Inline ---\n textB:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M178.48,115.7A44,44,0,0,0,148,40H80a8,8,0,0,0-8,8V200a8,8,0,0,0,8,8h80a48,48,0,0,0,18.48-92.3ZM88,56h60a28,28,0,0,1,0,56H88Zm72,136H88V128h72a32,32,0,0,1,0,64Z\"/></svg>',\n\n textItalic:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M200,56a8,8,0,0,1-8,8H157.77L115.1,192H144a8,8,0,0,1,0,16H64a8,8,0,0,1,0-16H98.23L140.9,64H112a8,8,0,0,1,0-16h80A8,8,0,0,1,200,56Z\"/></svg>',\n\n textUnderline:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M200,224a8,8,0,0,1-8,8H64a8,8,0,0,1,0-16H192A8,8,0,0,1,200,224Zm-72-24a64.07,64.07,0,0,0,64-64V56a8,8,0,0,0-16,0v80a48,48,0,0,1-96,0V56a8,8,0,0,0-16,0v80A64.07,64.07,0,0,0,128,200Z\"/></svg>',\n\n textStrikethrough:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M224,128a8,8,0,0,1-8,8H175.93c9.19,7.11,16.07,17.2,16.07,32,0,13.34-7,25.7-19.75,34.79C160.33,211.31,144.61,216,128,216s-32.33-4.69-44.25-13.21C71,193.7,64,181.34,64,168a8,8,0,0,1,16,0c0,17.35,22,32,48,32s48-14.65,48-32c0-14.85-10.54-23.58-38.77-32H40a8,8,0,0,1,0-16H216A8,8,0,0,1,224,128ZM76.33,104a8,8,0,0,0,7.61-10.49A17.3,17.3,0,0,1,83.11,88c0-18.24,19.3-32,44.89-32,18.84,0,34.16,7.42,41,19.85a8,8,0,0,0,14-7.7C173.33,50.52,152.77,40,128,40,93.29,40,67.11,60.63,67.11,88a33.73,33.73,0,0,0,1.62,10.49A8,8,0,0,0,76.33,104Z\"/></svg>',\n\n code:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M69.12,94.15,28.5,128l40.62,33.85a8,8,0,1,1-10.24,12.29l-48-40a8,8,0,0,1,0-12.29l48-40a8,8,0,0,1,10.24,12.3Zm176,27.7-48-40a8,8,0,1,0-10.24,12.3L227.5,128l-40.62,33.85a8,8,0,1,0,10.24,12.29l48-40a8,8,0,0,0,0-12.29ZM162.73,32.48a8,8,0,0,0-10.25,4.79l-64,176a8,8,0,0,0,4.79,10.26A8.14,8.14,0,0,0,96,224a8,8,0,0,0,7.52-5.27l64-176A8,8,0,0,0,162.73,32.48Z\"/></svg>',\n\n highlighterCircle:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M201.54,54.46A104,104,0,0,0,54.46,201.54,104,104,0,0,0,201.54,54.46ZM96,210V152h64v58a88.33,88.33,0,0,1-64,0Zm48-74H112V100.94l32-16Zm46.22,54.22A88.09,88.09,0,0,1,176,201.77V152a16,16,0,0,0-16-16V72a8,8,0,0,0-11.58-7.16l-48,24A8,8,0,0,0,96,96v40a16,16,0,0,0-16,16v49.77a88,88,0,1,1,110.22-11.55Z\"/></svg>',\n\n textSubscript:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M248,208a8,8,0,0,1-8,8H192a8,8,0,0,1-6.4-12.8l43.17-57.56a16,16,0,1,0-27.86-15,8,8,0,0,1-15.09-5.34,32.18,32.18,0,0,1,4.63-8.59,32,32,0,0,1,51.11,38.52L208,200h32A8,8,0,0,1,248,208ZM149.24,50a8,8,0,0,0-11.29.81L92,103.78l-45.95-53A8,8,0,0,0,34,61.24L81.41,116,34,170.76a8,8,0,0,0,12.1,10.48l46-53,45.95,53a8,8,0,1,0,12.1-10.48L102.59,116l47.46-54.76A8,8,0,0,0,149.24,50Z\"/></svg>',\n\n textSuperscript:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M248,144a8,8,0,0,1-8,8H192a8,8,0,0,1-6.4-12.8l43.17-57.55a16,16,0,1,0-27.86-15,8,8,0,0,1-15.09-5.33,32,32,0,1,1,55.74,29.92L208,136h32A8,8,0,0,1,248,144ZM149.24,74a8,8,0,0,0-11.29.8L92,127.79l-45.95-53A8,8,0,0,0,34,85.24L81.41,140,34,194.76a8,8,0,0,0,12.1,10.48l46-53,45.95,53a8,8,0,1,0,12.1-10.48L102.59,140l47.46-54.76A8,8,0,0,0,149.24,74Z\"/></svg>',\n\n link:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M240,88.23a54.43,54.43,0,0,1-16,37L189.25,160a54.27,54.27,0,0,1-38.63,16h-.05A54.63,54.63,0,0,1,96,119.84a8,8,0,0,1,16,.45A38.62,38.62,0,0,0,150.58,160h0a38.39,38.39,0,0,0,27.31-11.31l34.75-34.75a38.63,38.63,0,0,0-54.63-54.63l-11,11A8,8,0,0,1,135.7,59l11-11A54.65,54.65,0,0,1,224,48,54.86,54.86,0,0,1,240,88.23ZM109,185.66l-11,11A38.41,38.41,0,0,1,70.6,208h0a38.63,38.63,0,0,1-27.29-65.94L78,107.31A38.63,38.63,0,0,1,144,135.71a8,8,0,0,0,16,.45A54.86,54.86,0,0,0,144,96a54.65,54.65,0,0,0-77.27,0L32,130.75A54.62,54.62,0,0,0,70.56,224h0a54.28,54.28,0,0,0,38.64-16l11-11A8,8,0,0,0,109,185.66Z\"/></svg>',\n\n // --- Format: Block ---\n paragraph:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M208,40H96a64,64,0,0,0,0,128h40v40a8,8,0,0,0,16,0V56h24V208a8,8,0,0,0,16,0V56h16a8,8,0,0,0,0-16ZM136,152H96a48,48,0,0,1,0-96h40Z\"/></svg>',\n\n textH:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M208,56V200a8,8,0,0,1-16,0V136H64v64a8,8,0,0,1-16,0V56a8,8,0,0,1,16,0v64H192V56a8,8,0,0,1,16,0Z\"/></svg>',\n\n textHOne:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M152,56V176a8,8,0,0,1-16,0V124H48v52a8,8,0,0,1-16,0V56a8,8,0,0,1,16,0v52h88V56a8,8,0,0,1,16,0Zm75.77,49a8,8,0,0,0-8.21.39l-24,16a8,8,0,1,0,8.88,13.32L216,127V208a8,8,0,0,0,16,0V112A8,8,0,0,0,227.77,105Z\"/></svg>',\n\n textHTwo:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M152,56V176a8,8,0,0,1-16,0V124H48v52a8,8,0,0,1-16,0V56a8,8,0,0,1,16,0v52h88V56a8,8,0,0,1,16,0Zm88,144H208l33.55-44.74a32,32,0,1,0-55.73-29.93,8,8,0,1,0,15.08,5.34,16.28,16.28,0,0,1,2.32-4.3,16,16,0,1,1,25.54,19.27L185.6,203.2A8,8,0,0,0,192,216h48a8,8,0,0,0,0-16Z\"/></svg>',\n\n textHThree:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M152,56V176a8,8,0,0,1-16,0V124H48v52a8,8,0,0,1-16,0V56a8,8,0,0,1,16,0v52h88V56a8,8,0,0,1,16,0Zm73.52,90.63,21-30A8,8,0,0,0,240,104H192a8,8,0,0,0,0,16h32.63l-19.18,27.41A8,8,0,0,0,212,160a20,20,0,1,1-14.29,34,8,8,0,1,0-11.42,11.19A36,36,0,0,0,248,180,36.07,36.07,0,0,0,225.52,146.63Z\"/></svg>',\n\n textHFour:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M152,56V176a8,8,0,0,1-16,0V124H48v52a8,8,0,0,1-16,0V56a8,8,0,0,1,16,0v52h88V56a8,8,0,0,1,16,0ZM256,184a8,8,0,0,1-8,8h-8v16a8,8,0,0,1-16,0V192H176a8,8,0,0,1-6.31-12.91l56-72A8,8,0,0,1,240,112v64h8A8,8,0,0,1,256,184Zm-32-48.68L192.36,176H224Z\"/></svg>',\n\n quotes:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M100,56H40A16,16,0,0,0,24,72v64a16,16,0,0,0,16,16h60v8a32,32,0,0,1-32,32,8,8,0,0,0,0,16,48.05,48.05,0,0,0,48-48V72A16,16,0,0,0,100,56Zm0,80H40V72h60ZM216,56H156a16,16,0,0,0-16,16v64a16,16,0,0,0,16,16h60v8a32,32,0,0,1-32,32,8,8,0,0,0,0,16,48.05,48.05,0,0,0,48-48V72A16,16,0,0,0,216,56Zm0,80H156V72h60Z\"/></svg>',\n\n codeBlock:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M58.34,101.66l-32-32a8,8,0,0,1,0-11.32l32-32A8,8,0,0,1,69.66,37.66L43.31,64,69.66,90.34a8,8,0,0,1-11.32,11.32Zm40,0a8,8,0,0,0,11.32,0l32-32a8,8,0,0,0,0-11.32l-32-32A8,8,0,0,0,98.34,37.66L124.69,64,98.34,90.34A8,8,0,0,0,98.34,101.66ZM200,40H176a8,8,0,0,0,0,16h24V200H56V136a8,8,0,0,0-16,0v64a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V56A16,16,0,0,0,200,40Z\"/></svg>',\n\n minus:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M224,128a8,8,0,0,1-8,8H40a8,8,0,0,1,0-16H216A8,8,0,0,1,224,128Z\"/></svg>',\n\n // --- Lists ---\n list:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M224,128a8,8,0,0,1-8,8H40a8,8,0,0,1,0-16H216A8,8,0,0,1,224,128ZM40,72H216a8,8,0,0,0,0-16H40a8,8,0,0,0,0,16ZM216,184H40a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Z\"/></svg>',\n\n listBullets:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M80,64a8,8,0,0,1,8-8H216a8,8,0,0,1,0,16H88A8,8,0,0,1,80,64Zm136,56H88a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Zm0,64H88a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16ZM44,52A12,12,0,1,0,56,64,12,12,0,0,0,44,52Zm0,64a12,12,0,1,0,12,12A12,12,0,0,0,44,116Zm0,64a12,12,0,1,0,12,12A12,12,0,0,0,44,180Z\"/></svg>',\n\n listNumbers:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M224,128a8,8,0,0,1-8,8H104a8,8,0,0,1,0-16H216A8,8,0,0,1,224,128ZM104,72H216a8,8,0,0,0,0-16H104a8,8,0,0,0,0,16ZM216,184H104a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16ZM43.58,55.16,48,52.94V104a8,8,0,0,0,16,0V40a8,8,0,0,0-11.58-7.16l-16,8a8,8,0,0,0,7.16,14.32ZM79.77,156.72a23.73,23.73,0,0,0-9.6-15.95,24.86,24.86,0,0,0-34.11,4.7,23.63,23.63,0,0,0-3.57,6.46,8,8,0,1,0,15,5.47,7.84,7.84,0,0,1,1.18-2.13,8.76,8.76,0,0,1,12-1.59A7.91,7.91,0,0,1,63.93,159a7.64,7.64,0,0,1-1.57,5.78,1,1,0,0,0-.08.11L33.59,203.21A8,8,0,0,0,40,216H72a8,8,0,0,0,0-16H56l19.08-25.53A23.47,23.47,0,0,0,79.77,156.72Z\"/></svg>',\n\n listChecks:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M224,128a8,8,0,0,1-8,8H128a8,8,0,0,1,0-16h88A8,8,0,0,1,224,128ZM128,72h88a8,8,0,0,0,0-16H128a8,8,0,0,0,0,16Zm88,112H128a8,8,0,0,0,0,16h88a8,8,0,0,0,0-16ZM82.34,42.34,56,68.69,45.66,58.34A8,8,0,0,0,34.34,69.66l16,16a8,8,0,0,0,11.32,0l32-32A8,8,0,0,0,82.34,42.34Zm0,64L56,132.69,45.66,122.34a8,8,0,0,0-11.32,11.32l16,16a8,8,0,0,0,11.32,0l32-32a8,8,0,0,0-11.32-11.32Zm0,64L56,196.69,45.66,186.34a8,8,0,0,0-11.32,11.32l16,16a8,8,0,0,0,11.32,0l32-32a8,8,0,0,0-11.32-11.32Z\"/></svg>',\n\n // --- Alignment ---\n textAlignLeft:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M32,64a8,8,0,0,1,8-8H216a8,8,0,0,1,0,16H40A8,8,0,0,1,32,64Zm8,48H168a8,8,0,0,0,0-16H40a8,8,0,0,0,0,16Zm176,24H40a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Zm-48,40H40a8,8,0,0,0,0,16H168a8,8,0,0,0,0-16Z\"/></svg>',\n\n textAlignCenter:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M32,64a8,8,0,0,1,8-8H216a8,8,0,0,1,0,16H40A8,8,0,0,1,32,64ZM64,96a8,8,0,0,0,0,16H192a8,8,0,0,0,0-16Zm152,40H40a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Zm-24,40H64a8,8,0,0,0,0,16H192a8,8,0,0,0,0-16Z\"/></svg>',\n\n textAlignRight:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M32,64a8,8,0,0,1,8-8H216a8,8,0,0,1,0,16H40A8,8,0,0,1,32,64ZM216,96H88a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Zm0,40H40a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Zm0,40H88a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Z\"/></svg>',\n\n textAlignJustify:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M32,64a8,8,0,0,1,8-8H216a8,8,0,0,1,0,16H40A8,8,0,0,1,32,64ZM216,96H40a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Zm0,40H40a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Zm0,40H40a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Z\"/></svg>',\n\n // --- Text Style ---\n textAUnderline:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -23 256 256\" fill=\"currentColor\"><path d=\"M60.59,175.24a8,8,0,0,0,10.65-3.83L87.9,136h80.2l16.66,35.41a8,8,0,1,0,14.48-6.82l-64-136a8,8,0,0,0-14.48,0l-64,136A8,8,0,0,0,60.59,175.24ZM128,50.79,160.57,120H95.43Z\"/></svg>',\n\n palette:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M200.77,53.89A103.27,103.27,0,0,0,128,24h-1.07A104,104,0,0,0,24,128c0,43,26.58,79.06,69.36,94.17A32,32,0,0,0,136,192a16,16,0,0,1,16-16h46.21a31.81,31.81,0,0,0,31.2-24.88,104.43,104.43,0,0,0,2.59-24A103.28,103.28,0,0,0,200.77,53.89Zm13,93.71A15.89,15.89,0,0,1,198.21,160H152a32,32,0,0,0-32,32,16,16,0,0,1-21.31,15.07C62.49,194.3,40,164,40,128a88,88,0,0,1,87.09-88h.9a88.35,88.35,0,0,1,88,87.25A88.86,88.86,0,0,1,213.81,147.6ZM140,76a12,12,0,1,1-12-12A12,12,0,0,1,140,76ZM96,100A12,12,0,1,1,84,88,12,12,0,0,1,96,100Zm0,56a12,12,0,1,1-12-12A12,12,0,0,1,96,156Zm88-56a12,12,0,1,1-12-12A12,12,0,0,1,184,100Z\"/></svg>',\n\n textAa:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M87.24,52.59a8,8,0,0,0-14.48,0l-64,136a8,8,0,1,0,14.48,6.81L39.9,160h80.2l16.66,35.4a8,8,0,1,0,14.48-6.81ZM47.43,144,80,74.79,112.57,144ZM200,96c-12.76,0-22.73,3.47-29.63,10.32a8,8,0,0,0,11.26,11.36c3.8-3.77,10-5.68,18.37-5.68,13.23,0,24,9,24,20v3.22A42.76,42.76,0,0,0,200,128c-22.06,0-40,16.15-40,36s17.94,36,40,36a42.73,42.73,0,0,0,24-7.25,8,8,0,0,0,16-.75V132C240,112.15,222.06,96,200,96Zm0,88c-13.23,0-24-9-24-20s10.77-20,24-20,24,9,24,20S213.23,184,200,184Z\"/></svg>',\n\n textSize:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -23 256 256\" fill=\"currentColor\"><path d=\"M24.59,175.24a8,8,0,0,0,10.65-3.83L51.9,136h80.2l16.66,35.41a8,8,0,1,0,14.48-6.82l-64-136a8,8,0,0,0-14.48,0l-64,136A8,8,0,0,0,24.59,175.24ZM92,50.79,124.57,120H59.43Z\"/><g transform=\"translate(195,112.5) scale(0.68) translate(-105,-146)\"><path d=\"M165.66,194.34a8,8,0,0,1,0,11.32l-32,32a8,8,0,0,1-11.32,0l-32-32a8,8,0,0,1,11.32-11.32L120,212.69V43.31L101.66,61.66A8,8,0,0,1,90.34,50.34l32-32a8,8,0,0,1,11.32,0l32,32a8,8,0,0,1-11.32,11.32L136,43.31V212.69l18.34-18.35A8,8,0,0,1,165.66,194.34Z\"/></g></svg>',\n\n lineSpacing:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M224,128a8,8,0,0,1-8,8H40a8,8,0,0,1,0-16H216A8,8,0,0,1,224,128ZM101.66,53.66,120,35.31V96a8,8,0,0,0,16,0V35.31l18.34,18.35a8,8,0,0,0,11.32-11.32l-32-32a8,8,0,0,0-11.32,0l-32,32a8,8,0,0,0,11.32,11.32Zm52.68,148.68L136,220.69V160a8,8,0,0,0-16,0v60.69l-18.34-18.35a8,8,0,0,0-11.32,11.32l32,32a8,8,0,0,0,11.32,0l32-32a8,8,0,0,0-11.32-11.32Z\"/></svg>',\n\n // --- Link Popover ---\n linkBreak:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M198.63,57.37a32,32,0,0,0-45.19-.06L141.79,69.52a8,8,0,0,1-11.58-11l11.72-12.29a1.59,1.59,0,0,1,.13-.13,48,48,0,0,1,67.88,67.88,1.59,1.59,0,0,1-.13.13l-12.29,11.72a8,8,0,0,1-11-11.58l12.21-11.65A32,32,0,0,0,198.63,57.37ZM114.21,186.48l-11.65,12.21a32,32,0,0,1-45.25-45.25l12.21-11.65a8,8,0,0,0-11-11.58L46.19,141.93a1.59,1.59,0,0,0-.13.13,48,48,0,0,0,67.88,67.88,1.59,1.59,0,0,0,.13-.13l11.72-12.29a8,8,0,1,0-11.58-11ZM216,152H192a8,8,0,0,0,0,16h24a8,8,0,0,0,0-16ZM40,104H64a8,8,0,0,0,0-16H40a8,8,0,0,0,0,16Zm120,80a8,8,0,0,0-8,8v24a8,8,0,0,0,16,0V192A8,8,0,0,0,160,184ZM96,72a8,8,0,0,0,8-8V40a8,8,0,0,0-16,0V64A8,8,0,0,0,96,72Z\"/></svg>',\n\n check:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M229.66,77.66l-128,128a8,8,0,0,1-11.32,0l-56-56a8,8,0,0,1,11.32-11.32L96,188.69,218.34,66.34a8,8,0,0,1,11.32,11.32Z\"/></svg>',\n\n // --- Color Palette ---\n prohibit:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm88,104a87.56,87.56,0,0,1-20.41,56.28L71.72,60.41A88,88,0,0,1,216,128ZM40,128A87.56,87.56,0,0,1,60.41,71.72L184.28,195.59A88,88,0,0,1,40,128Z\"/></svg>',\n\n // --- Details / Accordion ---\n caretCircleRight:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm0,192a88,88,0,1,1,88-88A88.1,88.1,0,0,1,128,216Zm29.66-93.66a8,8,0,0,1,0,11.32l-40,40a8,8,0,0,1-11.32-11.32L140.69,128,106.34,93.66a8,8,0,0,1,11.32-11.32Z\"/></svg>',\n\n // --- Insert ---\n image:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M216,40H40A16,16,0,0,0,24,56V200a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40Zm0,16V158.75l-26.07-26.06a16,16,0,0,0-22.63,0l-20,20-44-44a16,16,0,0,0-22.62,0L40,149.37V56ZM40,172l52-52,80,80H40Zm176,28H194.63l-36-36,20-20L216,181.38V200ZM144,100a12,12,0,1,1,12,12A12,12,0,0,1,144,100Z\"/></svg>',\n\n smiley:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm0,192a88,88,0,1,1,88-88A88.1,88.1,0,0,1,128,216ZM80,108a12,12,0,1,1,12,12A12,12,0,0,1,80,108Zm96,0a12,12,0,1,1-12-12A12,12,0,0,1,176,108Zm-1.07,48c-10.29,17.79-27.4,28-46.93,28s-36.63-10.2-46.92-28a8,8,0,1,1,13.84-8c7.47,12.91,19.21,20,33.08,20s25.61-7.1,33.07-20a8,8,0,0,1,13.86,8Z\"/></svg>',\n\n textIndent:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M224,128a8,8,0,0,1-8,8H112a8,8,0,0,1,0-16H216A8,8,0,0,1,224,128ZM112,72H216a8,8,0,0,0,0-16H112a8,8,0,0,0,0,16ZM216,184H40a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16ZM34.34,141.66a8,8,0,0,0,11.32,0l40-40a8,8,0,0,0,0-11.32l-40-40A8,8,0,0,0,34.34,61.66L68.69,96,34.34,130.34A8,8,0,0,0,34.34,141.66Z\"/></svg>',\n\n // --- Image ---\n trash:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M216,48H176V40a24,24,0,0,0-24-24H104A24,24,0,0,0,80,40v8H40a8,8,0,0,0,0,16h8V208a16,16,0,0,0,16,16H192a16,16,0,0,0,16-16V64h8a8,8,0,0,0,0-16ZM96,40a8,8,0,0,1,8-8h48a8,8,0,0,1,8,8v8H96Zm96,168H64V64H192ZM112,104v64a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Zm48,0v64a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Z\"/></svg>',\n\n // --- Utilities ---\n textT:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M208,56V88a8,8,0,0,1-16,0V64H136V192h24a8,8,0,0,1,0,16H96a8,8,0,0,1,0-16h24V64H64V88a8,8,0,0,1-16,0V56a8,8,0,0,1,8-8H200A8,8,0,0,1,208,56Z\"/></svg>',\n\n textTSlash:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M213.38,221.92a8,8,0,0,1-11.3-.54L136,148.69V192h24a8,8,0,0,1,0,16H96a8,8,0,0,1,0-16h24V131.09L64,69.49V88a8,8,0,0,1-16,0V56a8,8,0,0,1,.72-3.31l-6.64-7.31A8,8,0,1,1,53.92,34.62l160,176A8,8,0,0,1,213.38,221.92ZM105.79,64H120V80.43a8,8,0,0,0,16,0V64h56V88a8,8,0,0,0,16,0V56a8,8,0,0,0-8-8H105.79a8,8,0,0,0,0,16Z\"/></svg>',\n\n // --- History ---\n arrowCounterClockwise:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M224,128a96,96,0,0,1-94.71,96H128A95.38,95.38,0,0,1,62.1,197.8a8,8,0,0,1,11-11.63A80,80,0,1,0,71.43,71.39a3.07,3.07,0,0,1-.26.25L44.59,96H72a8,8,0,0,1,0,16H24a8,8,0,0,1-8-8V56a8,8,0,0,1,16,0V85.8L60.25,60A96,96,0,0,1,224,128Z\"/></svg>',\n\n arrowClockwise:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M240,56v48a8,8,0,0,1-8,8H184a8,8,0,0,1,0-16H211.4L184.81,71.64l-.25-.24a80,80,0,1,0-1.67,114.78,8,8,0,0,1,11,11.63A95.44,95.44,0,0,1,128,224h-1.32A96,96,0,1,1,195.75,60L224,85.8V56a8,8,0,1,1,16,0Z\"/></svg>',\n\n // --- Table ---\n table:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M224,48H32a8,8,0,0,0-8,8V192a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A8,8,0,0,0,224,48ZM40,112H80v32H40Zm56,0H216v32H96ZM216,64V96H40V64ZM40,160H80v32H40Zm176,32H96V160H216v32Z\"/></svg>',\n\n gridNine:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M216,48H40A16,16,0,0,0,24,64V192a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V64A16,16,0,0,0,216,48ZM104,144V112h48v32Zm48,16v32H104V160ZM40,112H88v32H40Zm64-16V64h48V96Zm64,16h48v32H168Zm48-16H168V64h48ZM88,64V96H40V64ZM40,160H88v32H40Zm176,32H168V160h48v32Z\"/></svg>',\n\n // --- Block Handle / Context Menu ---\n plus:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M224,128a8,8,0,0,1-8,8H136v80a8,8,0,0,1-16,0V136H40a8,8,0,0,1,0-16h80V40a8,8,0,0,1,16,0v80h80A8,8,0,0,1,224,128Z\"/></svg>',\n\n dotsSixVertical:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M108,60A16,16,0,1,1,92,44,16,16,0,0,1,108,60Zm56,16A16,16,0,1,0,148,60,16,16,0,0,0,164,76ZM92,112a16,16,0,1,0,16,16A16,16,0,0,0,92,112Zm72,0a16,16,0,1,0,16,16A16,16,0,0,0,164,112ZM92,180a16,16,0,1,0,16,16A16,16,0,0,0,92,180Zm72,0a16,16,0,1,0,16,16A16,16,0,0,0,164,180Z\"/></svg>',\n\n dotsThree:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M140,128a12,12,0,1,1-12-12A12,12,0,0,1,140,128ZM64,116a12,12,0,1,0,12,12A12,12,0,0,0,64,116Zm128,0a12,12,0,1,0,12,12A12,12,0,0,0,192,116Z\"/></svg>',\n\n copy:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M216,32H88a8,8,0,0,0-8,8V80H40a8,8,0,0,0-8,8V216a8,8,0,0,0,8,8H168a8,8,0,0,0,8-8V176h40a8,8,0,0,0,8-8V40A8,8,0,0,0,216,32ZM160,208H48V96H160Zm48-48H176V88a8,8,0,0,0-8-8H96V48H208Z\"/></svg>',\n};\n","/**\n * Document Node\n *\n * The root node of every ProseMirror document.\n * Must have at least one block child.\n */\n\nimport { Node } from '../Node.js';\n\nexport const Document = Node.create({\n name: 'doc',\n topNode: true,\n content: 'block+',\n});\n","/**\n * Text Node\n *\n * Inline text content. Can hold marks (bold, italic, etc.).\n * This is the leaf node that contains actual text content.\n */\n\nimport { Node } from '../Node.js';\n\nexport const Text = Node.create({\n name: 'text',\n group: 'inline',\n});\n","/**\n * Paragraph Node\n *\n * The default block-level text container.\n * Contains inline content (text and inline nodes).\n */\n\nimport { Node } from '../Node.js';\nimport type { CommandSpec } from '../types/Commands.js';\n\ndeclare module '@domternal/core' {\n interface RawCommands {\n setParagraph: CommandSpec;\n }\n}\n\nexport interface ParagraphOptions {\n HTMLAttributes: Record<string, unknown>;\n}\n\nexport const Paragraph = Node.create<ParagraphOptions>({\n name: 'paragraph',\n group: 'block',\n content: 'inline*',\n priority: 1000,\n\n addOptions() {\n return {\n HTMLAttributes: {},\n };\n },\n\n parseHTML() {\n return [{ tag: 'p' }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['p', { ...this.options.HTMLAttributes, ...HTMLAttributes }, 0];\n },\n\n addCommands() {\n const { name } = this;\n return {\n setParagraph:\n () =>\n ({ commands }) => {\n return commands.setBlockType(name);\n },\n };\n },\n\n addKeyboardShortcuts() {\n const { editor } = this;\n return {\n 'Mod-Alt-0': () => {\n return editor?.commands['setParagraph']?.() ?? false;\n },\n };\n },\n});\n","/**\n * Heading Node\n *\n * Block-level heading elements (h1-h6).\n * Supports configurable levels and markdown-style input rules.\n */\n\nimport { Node } from '../Node.js';\nimport { textblockTypeInputRule } from '../helpers/textblockTypeInputRule.js';\nimport { keymap } from '@domternal/pm/keymap';\nimport { Plugin, PluginKey, TextSelection } from '@domternal/pm/state';\nimport type { Command as PMCommand } from '@domternal/pm/state';\nimport type { CommandSpec } from '../types/Commands.js';\nimport type { ToolbarItem, ToolbarButton } from '../types/Toolbar.js';\nimport type { FloatingMenuItem } from '../types/FloatingMenu.js';\n\ndeclare module '@domternal/core' {\n interface RawCommands {\n setHeading: CommandSpec<[attributes?: { level?: number }]>;\n toggleHeading: CommandSpec<[attributes?: { level?: number }]>;\n }\n}\n\nexport interface HeadingOptions {\n levels: number[];\n HTMLAttributes: Record<string, unknown>;\n}\n\nexport const Heading = Node.create<HeadingOptions>({\n name: 'heading',\n group: 'block',\n content: 'inline*',\n defining: true,\n\n addOptions() {\n return {\n levels: [1, 2, 3, 4],\n HTMLAttributes: {},\n };\n },\n\n addAttributes() {\n return {\n level: {\n default: 1,\n parseHTML: (element: HTMLElement) => {\n const match = /^H(\\d)$/i.exec(element.tagName);\n return match?.[1] ? parseInt(match[1], 10) : 1;\n },\n renderHTML: () => {\n // Level is used in the tag name, not as an attribute\n return {};\n },\n },\n };\n },\n\n parseHTML() {\n // `this` is properly typed via ThisType<NodeContext<HeadingOptions>>\n return this.options.levels.map((level) => ({\n tag: `h${String(level)}`,\n attrs: { level },\n }));\n },\n\n renderHTML({ node, HTMLAttributes }) {\n const level = node.attrs['level'] as number;\n // Ensure level is within allowed range\n const validLevel = this.options.levels.includes(level) ? level : this.options.levels[0];\n return [`h${String(validLevel)}`, { ...this.options.HTMLAttributes, ...HTMLAttributes }, 0];\n },\n\n addCommands() {\n const { name, options } = this;\n return {\n setHeading:\n (attributes?: { level?: number }) =>\n ({ commands }) => {\n const level = attributes?.level ?? options.levels[0] ?? 1;\n if (!options.levels.includes(level)) {\n return false;\n }\n return commands.setBlockType(name, { level });\n },\n toggleHeading:\n (attributes?: { level?: number }) =>\n ({ commands }) => {\n const level = attributes?.level ?? options.levels[0] ?? 1;\n if (!options.levels.includes(level)) {\n return false;\n }\n return commands.toggleBlockType(name, 'paragraph', { level });\n },\n };\n },\n\n addKeyboardShortcuts() {\n const shortcuts: Record<string, () => boolean> = {};\n const { options, editor } = this;\n\n options.levels.forEach((level) => {\n shortcuts[`Mod-Alt-${String(level)}`] = () => {\n return editor?.commands['toggleHeading']?.({ level }) ?? false;\n };\n });\n\n // Notion-style Enter on a heading. Lives in addKeyboardShortcuts\n // (the COLLECTED keymap, plugin index 1 in the editor) rather than\n // in addProseMirrorPlugins so it fires BEFORE the BaseKeymap plugin\n // (index 2+, the angular wrapper's `DEFAULT_EXTENSIONS` register\n // BaseKeymap before user extensions). Without that ordering,\n // BaseKeymap's `liftEmptyBlock` would claim Enter on an empty\n // heading first and lift it out of its parent.\n //\n // Behaviour:\n // - End of NON-EMPTY heading -> insert a paragraph as the next\n // sibling and move the caret into it.\n // - EMPTY heading -> convert IN PLACE to a paragraph (no extra\n // block; lets users back out of an accidental `# ` input rule).\n // - Mid / start-of-non-empty heading -> return false so the\n // default split runs (text splits in place; both halves stay\n // heading).\n //\n // ListItem.Enter / TaskItem.Enter both early-bail when the cursor\n // is in a non-paragraph textblock, so this handler also fires for\n // headings nested INSIDE a list item.\n shortcuts['Enter'] = (): boolean => {\n if (!editor) return false;\n const { state, view } = editor;\n const { selection } = state;\n if (!selection.empty) return false;\n const { $from } = selection;\n if ($from.parent.type.name !== 'heading') return false;\n\n const paragraphType = state.schema.nodes['paragraph'];\n if (!paragraphType) return false;\n\n // Empty heading: convert to paragraph in place.\n if ($from.parent.content.size === 0) {\n view.dispatch(\n state.tr.setNodeMarkup($from.before($from.depth), paragraphType).scrollIntoView(),\n );\n return true;\n }\n\n // Non-empty: only act at the END of the heading.\n if ($from.parentOffset !== $from.parent.content.size) return false;\n\n const after = $from.after($from.depth);\n const $after = state.doc.resolve(after);\n const indexAfter = $after.index();\n // Schema check: parent must accept paragraph at this position.\n // Critical for nested-in-li context where the listItem's content\n // rule (`paragraph block*`) restricts what can land where.\n if (!$after.parent.canReplaceWith(indexAfter, indexAfter, paragraphType)) {\n return false;\n }\n\n const tr = state.tr.insert(after, paragraphType.create());\n // Caret at offset 0 inside the new paragraph (`after + 1` skips\n // the paragraph's open token).\n tr.setSelection(TextSelection.create(tr.doc, after + 1));\n view.dispatch(tr.scrollIntoView());\n return true;\n };\n\n return shortcuts;\n },\n\n addToolbarItems(): ToolbarItem[] {\n const iconMap: Record<number, string> = {\n 1: 'textHOne',\n 2: 'textHTwo',\n 3: 'textHThree',\n 4: 'textHFour',\n };\n\n const headingItems: ToolbarButton[] = this.options.levels\n .filter((level) => level <= 4)\n .map((level) => ({\n type: 'button' as const,\n name: `heading${String(level)}`,\n command: 'toggleHeading',\n commandArgs: [{ level }],\n isActive: { name: 'heading', attributes: { level } },\n icon: iconMap[level] ?? 'textH',\n label: `Heading ${String(level)}`,\n shortcut: `Mod-Alt-${String(level)}`,\n }));\n\n const paragraphItem: ToolbarButton = {\n type: 'button',\n name: 'paragraph',\n command: 'setParagraph',\n isActive: 'paragraph',\n icon: 'textT',\n label: 'Normal text',\n shortcut: 'Mod-Alt-0',\n };\n\n return [\n {\n type: 'dropdown',\n name: 'heading',\n icon: 'textH',\n label: 'Heading',\n items: [paragraphItem, ...headingItems],\n group: 'blocks',\n priority: 200,\n dynamicIcon: true,\n },\n ];\n },\n\n addFloatingMenuItems(): FloatingMenuItem[] {\n const iconMap: Record<number, string> = {\n 1: 'textHOne',\n 2: 'textHTwo',\n 3: 'textHThree',\n };\n const descriptionMap: Record<number, string> = {\n 1: 'Big section heading',\n 2: 'Medium section heading',\n 3: 'Small section heading',\n };\n // Only levels 1-3 in the quick-insert menu; deeper levels stay toolbar-only.\n return this.options.levels\n .filter((level) => level <= 3)\n .map((level): FloatingMenuItem => ({\n name: `heading-${String(level)}`,\n label: `Heading ${String(level)}`,\n description: descriptionMap[level] ?? 'Section heading',\n icon: iconMap[level] ?? 'textH',\n group: 'Basic',\n priority: 210 - level * 10,\n keywords: ['heading', `h${String(level)}`, 'title'],\n shortcut: '#'.repeat(level) + ' ',\n command: 'toggleHeading',\n commandArgs: [{ level }],\n }));\n },\n\n addProseMirrorPlugins() {\n const { options, editor } = this;\n\n // Build a map from code (e.g. 'Digit2') to heading level for levels\n // where Alt produces special characters on macOS, preventing the\n // regular keymap from matching.\n const codeToLevel: Record<string, number> = {};\n for (const level of options.levels) {\n codeToLevel[`Digit${String(level)}`] = level;\n }\n // Also handle Mod-Alt-0 for setParagraph\n codeToLevel['Digit0'] = 0;\n\n return [\n new Plugin({\n key: new PluginKey('headingKeydownFix'),\n props: {\n handleDOMEvents: {\n keydown(_view, event) {\n if (!event.altKey || !(event.metaKey || event.ctrlKey)) return false;\n const level = codeToLevel[event.code];\n if (level === undefined) return false;\n\n event.preventDefault();\n if (level === 0) {\n editor?.commands['setParagraph']?.();\n } else {\n editor?.commands['toggleHeading']?.({ level });\n }\n return true;\n },\n },\n },\n }),\n keymap({\n Backspace: ((state, dispatch) => {\n const { selection } = state;\n if (!selection.empty) return false;\n\n const { $from } = selection;\n if ($from.parentOffset !== 0) return false;\n if ($from.parent.type.name !== 'heading') return false;\n\n const paragraphType = state.schema.nodes['paragraph'];\n if (!paragraphType) return false;\n\n if (dispatch) {\n dispatch(\n state.tr.setNodeMarkup($from.before($from.depth), paragraphType).scrollIntoView()\n );\n }\n return true;\n }) as PMCommand,\n }),\n ];\n },\n\n addInputRules() {\n const { nodeType, options } = this;\n\n if (!nodeType) {\n return [];\n }\n\n const maxLevel = Math.max(...options.levels);\n return [\n textblockTypeInputRule({\n find: new RegExp(`^(#{1,${String(maxLevel)}})\\\\s$`),\n type: nodeType,\n getAttributes: (match) => {\n const hashes = match[1];\n if (!hashes) {\n return null;\n }\n const level = hashes.length;\n // Only convert if this level is enabled\n if (!options.levels.includes(level)) {\n return null;\n }\n return { level };\n },\n }),\n ];\n },\n});\n","/**\n * Blockquote Node\n *\n * Block-level quote container that can hold other blocks.\n * Supports nested blockquotes and markdown-style input rule.\n */\n\nimport { Node } from '../Node.js';\nimport { wrappingInputRule } from '../helpers/wrappingInputRule.js';\nimport type { CommandSpec } from '../types/Commands.js';\nimport type { ToolbarItem } from '../types/Toolbar.js';\nimport type { FloatingMenuItem } from '../types/FloatingMenu.js';\n\ndeclare module '@domternal/core' {\n interface RawCommands {\n setBlockquote: CommandSpec;\n toggleBlockquote: CommandSpec;\n unsetBlockquote: CommandSpec;\n }\n}\n\nexport interface BlockquoteOptions {\n HTMLAttributes: Record<string, unknown>;\n}\n\nexport const Blockquote = Node.create<BlockquoteOptions>({\n name: 'blockquote',\n group: 'block',\n content: 'block+',\n defining: true,\n\n addOptions() {\n return {\n HTMLAttributes: {},\n };\n },\n\n parseHTML() {\n return [{ tag: 'blockquote' }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['blockquote', { ...this.options.HTMLAttributes, ...HTMLAttributes }, 0];\n },\n\n addCommands() {\n const { name } = this;\n return {\n setBlockquote:\n () =>\n ({ commands }) => {\n return commands.wrapIn(name);\n },\n toggleBlockquote:\n () =>\n ({ commands }) => {\n return commands.toggleWrap(name);\n },\n unsetBlockquote:\n () =>\n ({ commands }) => {\n return commands.lift();\n },\n };\n },\n\n addKeyboardShortcuts() {\n const { editor } = this;\n return {\n 'Mod-Shift-b': () => {\n return editor?.commands['toggleBlockquote']?.() ?? false;\n },\n };\n },\n\n addToolbarItems(): ToolbarItem[] {\n return [\n {\n type: 'button',\n name: 'blockquote',\n command: 'toggleBlockquote',\n isActive: 'blockquote',\n icon: 'quotes',\n label: 'Blockquote',\n shortcut: 'Mod-Shift-B',\n group: 'blocks',\n priority: 150,\n },\n ];\n },\n\n addFloatingMenuItems(): FloatingMenuItem[] {\n return [\n {\n name: 'blockquote',\n label: 'Quote',\n description: 'Capture a quote',\n icon: 'quotes',\n group: 'Basic',\n priority: 170,\n keywords: ['quote', 'blockquote', 'citation'],\n shortcut: '> ',\n command: 'toggleBlockquote',\n },\n ];\n },\n\n addInputRules() {\n const { nodeType } = this;\n\n if (!nodeType) {\n return [];\n }\n\n return [\n wrappingInputRule({ find: /^\\s*>\\s$/, type: nodeType }),\n ];\n },\n});\n","/**\n * CodeBlock Node\n *\n * Block-level code container with syntax highlighting support.\n * Preserves whitespace and disallows marks.\n *\n * Keyboard shortcuts:\n * - Mod-Alt-C: Toggle code block\n * - Enter (triple): Exit code block when last 2 lines are empty\n * - ArrowDown: Exit code block when cursor is at the end and it's the last block\n */\n\nimport { Node } from '../Node.js';\nimport { textblockTypeInputRule } from '../helpers/textblockTypeInputRule.js';\nimport { TextSelection } from '@domternal/pm/state';\nimport type { CommandSpec } from '../types/Commands.js';\nimport type { ToolbarItem } from '../types/Toolbar.js';\nimport type { FloatingMenuItem } from '../types/FloatingMenu.js';\n\ndeclare module '@domternal/core' {\n interface RawCommands {\n setCodeBlock: CommandSpec<[attributes?: { language?: string }]>;\n toggleCodeBlock: CommandSpec<[attributes?: { language?: string }]>;\n }\n}\n\nexport interface CodeBlockOptions {\n languageClassPrefix: string;\n HTMLAttributes: Record<string, unknown>;\n exitOnTripleEnter: boolean;\n}\n\nexport const CodeBlock = Node.create<CodeBlockOptions>({\n name: 'codeBlock',\n group: 'block',\n content: 'text*',\n marks: '',\n code: true,\n defining: true,\n\n addOptions() {\n return {\n languageClassPrefix: 'language-',\n HTMLAttributes: {},\n exitOnTripleEnter: true,\n };\n },\n\n addAttributes() {\n const { options } = this;\n return {\n language: {\n default: null,\n parseHTML: (element: HTMLElement) => {\n const codeEl = element.querySelector('code');\n if (!codeEl) return null;\n\n const prefix = options.languageClassPrefix;\n\n // Find class starting with language prefix\n const classes = codeEl.className.split(/\\s+/);\n for (const cls of classes) {\n if (cls.startsWith(prefix)) {\n return cls.slice(prefix.length) || null;\n }\n }\n return null;\n },\n renderHTML: () => {\n // Language is rendered on the code element, not pre\n return {};\n },\n },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: 'pre',\n preserveWhitespace: 'full' as const,\n },\n ];\n },\n\n renderHTML({ node, HTMLAttributes }) {\n const language = node.attrs['language'] as string | null;\n\n const codeAttrs: Record<string, unknown> = {};\n if (language) {\n codeAttrs['class'] = `${this.options.languageClassPrefix}${language}`;\n }\n\n return [\n 'pre',\n { ...this.options.HTMLAttributes, ...HTMLAttributes },\n ['code', codeAttrs, 0],\n ];\n },\n\n addCommands() {\n const { name } = this;\n return {\n setCodeBlock:\n (attributes?: { language?: string }) =>\n ({ commands }) => {\n return commands.setBlockType(name, attributes);\n },\n toggleCodeBlock:\n (attributes?: { language?: string }) =>\n ({ commands }) => {\n return commands.toggleBlockType(name, 'paragraph', attributes);\n },\n };\n },\n\n addKeyboardShortcuts() {\n const { editor } = this;\n\n const exitCodeBlock = (): boolean => {\n if (!editor) return false;\n const { state, view } = editor;\n const after = state.selection.$head.after();\n const paragraph = state.schema.nodes['paragraph']?.createAndFill();\n if (!paragraph) return false;\n const tr = state.tr.insert(after, paragraph);\n tr.setSelection(TextSelection.near(tr.doc.resolve(after + 1)));\n view.dispatch(tr.scrollIntoView());\n return true;\n };\n\n return {\n 'Mod-Alt-c': () => editor?.commands['toggleCodeBlock']?.() ?? false,\n\n Enter: () => {\n if (!this.options.exitOnTripleEnter || !editor) return false;\n const { $head } = editor.state.selection;\n if ($head.parent.type !== this.nodeType) return false;\n const pos = $head.parentOffset;\n if (pos < 2 || pos !== $head.parent.content.size) return false;\n const text = $head.parent.textContent;\n if (text[pos - 1] !== '\\n' || text[pos - 2] !== '\\n') return false;\n editor.view.dispatch(editor.state.tr.delete($head.pos - 2, $head.pos));\n return exitCodeBlock();\n },\n\n ArrowDown: () => {\n if (!editor) return false;\n const { $head } = editor.state.selection;\n if ($head.parent.type !== this.nodeType) return false;\n if ($head.parentOffset !== $head.parent.content.size) return false;\n const after = $head.after();\n if (after < editor.state.doc.content.size && editor.state.doc.resolve(after).nodeAfter) return false;\n return exitCodeBlock();\n },\n };\n },\n\n addToolbarItems(): ToolbarItem[] {\n return [\n {\n type: 'button',\n name: 'codeBlock',\n command: 'toggleCodeBlock',\n isActive: 'codeBlock',\n icon: 'codeBlock',\n label: 'Code Block',\n shortcut: 'Mod-Alt-C',\n group: 'blocks',\n priority: 140,\n },\n ];\n },\n\n addFloatingMenuItems(): FloatingMenuItem[] {\n return [\n {\n name: 'code-block',\n label: 'Code block',\n description: 'Capture a code snippet',\n icon: 'codeBlock',\n group: 'Basic',\n priority: 160,\n keywords: ['code', 'snippet', 'pre'],\n shortcut: '``` ',\n command: 'toggleCodeBlock',\n },\n ];\n },\n\n addInputRules() {\n const { nodeType } = this;\n\n if (!nodeType) {\n return [];\n }\n\n return [\n textblockTypeInputRule({\n find: /^```([a-z]*)?[\\s\\n]$/,\n type: nodeType,\n getAttributes: (match) => {\n const language = match[1] ?? null;\n return { language };\n },\n }),\n ];\n },\n});\n","/**\n * ListKeymap Extension\n *\n * Provides keyboard shortcuts for list manipulation:\n * - Tab: Sink (indent) list item\n * - Shift-Tab: Lift (outdent) list item\n * - Backspace: Lift list item when at start of empty item.\n * Also handles the \"exit-join\" case: when the cursor is at start of an\n * empty paragraph whose previous sibling is a list-group node\n * (bulletList / orderedList / taskList), delete the empty paragraph and\n * place the caret at the end of the last textblock of the previous list.\n * Without this, PM's `joinBackward` wraps the empty paragraph back into\n * the list as a fresh listItem/taskItem, producing the \"ping-pong\"\n * regression: Enter (creates empty item), BS (lift -> empty top-level p),\n * BS again (joinBackward wraps p back as new item).\n */\nimport { TextSelection } from '@domternal/pm/state';\nimport { liftListItem, sinkListItem } from '@domternal/pm/schema-list';\nimport { canJoin } from '@domternal/pm/transform';\nimport type { NodeType } from '@domternal/pm/model';\nimport type { EditorState } from '@domternal/pm/state';\nimport type { EditorView } from '@domternal/pm/view';\nimport { Extension } from '../Extension.js';\nimport type { ExtensionEditorInterface } from '../Extension.js';\n\nconst LIST_GROUP_TYPES = new Set(['bulletList', 'orderedList', 'taskList']);\n\nexport interface ListKeymapOptions {\n /**\n * Name of the list item node type.\n * @default 'listItem'\n */\n listItem: string;\n}\n\n/** Resolves the list item NodeType and checks if cursor is inside one.\n * Returns null when a different item type (e.g. taskItem) sits closer\n * to the cursor than the target listItem, preventing cross-type interference. */\nfunction getListItemContext(\n editor: ExtensionEditorInterface,\n listItemName: string,\n): { state: EditorState; view: EditorView; listItemType: NodeType } | null {\n const { state, view } = editor as { state: EditorState; view: EditorView };\n const listItemType = state.schema.nodes[listItemName];\n if (!listItemType) return null;\n\n const { $from } = state.selection;\n for (let d = $from.depth; d > 0; d--) {\n const node = $from.node(d);\n // If we hit a different item type first (e.g. taskItem), bail out\n if (node.type.spec.defining && node.type !== listItemType && node.type.isBlock) {\n const parent = d > 0 ? $from.node(d - 1) : null;\n if (parent?.type.spec.group?.includes('list')) {\n return null;\n }\n }\n if (node.type === listItemType) {\n return { state, view, listItemType };\n }\n }\n\n return null;\n}\n\nexport const ListKeymap = Extension.create<ListKeymapOptions>({\n name: 'listKeymap',\n\n addOptions() {\n return {\n listItem: 'listItem',\n };\n },\n\n addKeyboardShortcuts() {\n return {\n // Tab to sink (indent) list item\n Tab: () => {\n if (!this.editor) return false;\n const ctx = getListItemContext(this.editor, this.options.listItem);\n if (!ctx) return false;\n return sinkListItem(ctx.listItemType)(ctx.state, ctx.view.dispatch);\n },\n\n // Shift-Tab to lift (outdent) list item\n 'Shift-Tab': () => {\n if (!this.editor) return false;\n const ctx = getListItemContext(this.editor, this.options.listItem);\n if (!ctx) return false;\n return liftListItem(ctx.listItemType)(ctx.state, ctx.view.dispatch);\n },\n\n // Backspace at start of list item to lift\n Backspace: () => {\n const editor = this.editor;\n if (!editor) return false;\n\n const { state, view } = editor as { state: EditorState; view: EditorView };\n const { $from, empty } = state.selection;\n\n // Only at start of textblock with empty selection\n if (!empty || $from.parentOffset !== 0) return false;\n\n // \"Exit-join\" path: cursor at start of an EMPTY paragraph whose\n // previous sibling (in its container) is a list-group node. Without\n // this, PM's `joinBackward` would wrap the empty paragraph back\n // into the list as a new listItem/taskItem (the \"ping-pong\" bug).\n // We delete the empty paragraph and move the caret to the end of\n // the last textblock of the previous list - the natural intent\n // when the user backspaces from the line just below a list.\n //\n // Additionally, when the empty paragraph sits BETWEEN two\n // same-type list groups (the common shape after splitListItem +\n // liftListItem on a middle item), join them so the original list\n // is reunified rather than left as two adjacent siblings.\n if (\n $from.parent.type.name === 'paragraph' &&\n $from.parent.content.size === 0 &&\n $from.depth >= 1\n ) {\n const containerDepth = $from.depth - 1;\n const idx = $from.index(containerDepth);\n if (idx > 0) {\n const container = $from.node(containerDepth);\n const prev = container.child(idx - 1);\n if (LIST_GROUP_TYPES.has(prev.type.name)) {\n const paraStart = $from.before($from.depth);\n const paraEnd = $from.after($from.depth);\n const listEnd = paraStart;\n const listStart = listEnd - prev.nodeSize;\n let lastTextblockEnd = -1;\n state.doc.nodesBetween(listStart, listEnd, (n, p) => {\n if (n.isTextblock) lastTextblockEnd = p + 1 + n.content.size;\n return true;\n });\n if (lastTextblockEnd !== -1) {\n const tr = state.tr.delete(paraStart, paraEnd);\n\n // If the next sibling is a list group of the SAME type,\n // join it onto the previous list. After the delete, the\n // boundary between the two lists sits at `paraStart` in\n // the new doc, so `tr.join(paraStart)` merges them.\n // `canJoin` validates the schema accepts the merge before\n // we call `join` (avoids try-catch that would swallow\n // unrelated errors).\n const next = idx + 1 < container.childCount\n ? container.child(idx + 1)\n : null;\n if (next?.type === prev.type && canJoin(tr.doc, paraStart)) {\n tr.join(paraStart);\n }\n\n tr.setSelection(TextSelection.create(tr.doc, lastTextblockEnd));\n view.dispatch(tr.scrollIntoView());\n return true;\n }\n }\n }\n }\n\n const listItemType = state.schema.nodes[this.options.listItem];\n if (!listItemType) return false;\n\n // Check if we're at the start of a list item\n let listItemDepth = -1;\n for (let d = $from.depth; d > 0; d--) {\n if ($from.node(d).type === listItemType) {\n listItemDepth = d;\n break;\n }\n }\n\n if (listItemDepth === -1) return false;\n\n // Only lift if we're at the very start of the list item content\n // (i.e., cursor is at start of first child of list item)\n const listItemNode = $from.node(listItemDepth);\n const firstChild = listItemNode.firstChild;\n\n if (firstChild?.isTextblock) {\n // Check if the textblock is empty or cursor is at its start\n const posInListItem = $from.pos - $from.start(listItemDepth);\n if (posInListItem <= 1) {\n return liftListItem(listItemType)(state, view.dispatch);\n }\n }\n\n return false;\n },\n };\n },\n});\n","/**\n * Enter / Backspace state machine for listItem (cursor's parent must be a paragraph):\n *\n * LABEL paragraph (childIndex 0):\n * Enter, empty -> liftListItem (exit empty bullet)\n * Enter, non-empty -> splitListItem (new sibling listItem)\n * Backspace, empty -> falls through to ListKeymap (liftListItem)\n *\n * CHILDREN-ZONE paragraph (childIndex > 0):\n * Enter, empty -> insertChildrenZoneSibling (accumulate inside the item)\n * Enter, non-empty -> splitBlock (both halves stay inside the same item)\n * Backspace, empty -> liftEmptyChildrenZoneParagraph (exit as top-level)\n *\n * Tab / Shift-Tab handled by the ListKeymap extension.\n */\nimport { Node } from '../Node.js';\nimport { splitListItem, liftListItem } from '@domternal/pm/schema-list';\nimport { Selection } from '@domternal/pm/state';\nimport { splitBlock } from '@domternal/pm/commands';\nimport { ListKeymap } from '../extensions/ListKeymap.js';\nimport { getListItemCursorContext } from '../utils/listItemCursorContext.js';\nimport { insertChildrenZoneSibling } from '../utils/insertChildrenZoneSibling.js';\nimport { liftEmptyChildrenZoneParagraph } from '../utils/liftEmptyChildrenZoneParagraph.js';\n\nexport interface ListItemOptions {\n HTMLAttributes: Record<string, unknown>;\n}\n\nexport const ListItem = Node.create<ListItemOptions>({\n name: 'listItem',\n // Notion-strict: paragraph must be the first child (the \"label\" line aligned\n // with the bullet); additional blocks render below as nested children.\n content: 'paragraph block*',\n defining: true,\n\n addOptions() {\n return {\n HTMLAttributes: {},\n };\n },\n\n parseHTML() {\n return [{ tag: 'li' }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['li', { ...this.options.HTMLAttributes, ...HTMLAttributes }, 0];\n },\n\n addExtensions() {\n return [ListKeymap];\n },\n\n addKeyboardShortcuts() {\n return {\n Enter: () => {\n if (!this.editor || !this.nodeType) return false;\n const { state, view } = this.editor;\n const { $from } = state.selection;\n if ($from.depth < 1 || $from.node(-1).type !== this.nodeType) return false;\n // Defer if cursor is in a nested non-paragraph block (heading, codeBlock)\n // so that block's own Enter handler runs instead of splitListItem.\n if ($from.parent.type.name !== 'paragraph') return false;\n\n // Children-zone Enter accumulates inside the item (Notion semantics),\n // never splits the wrapper into a sibling listItem.\n const ctx = getListItemCursorContext($from);\n if (ctx?.isInChildrenZone) {\n if (ctx.paragraphIsEmpty) {\n if (insertChildrenZoneSibling(state, view.dispatch, ctx)) return true;\n } else {\n if (splitBlock(state, view.dispatch)) return true;\n }\n }\n\n if (splitListItem(this.nodeType)(state, view.dispatch)) return true;\n\n // Empty listItem inside a list that's inside a taskItem: liftListItem would\n // place a bare paragraph in the taskItem (loses bullet marker). Instead,\n // delete the empty item and create a new taskItem in the parent taskList\n // (one level up, not jumping to a distant ancestor).\n const listDepth = $from.depth - 2;\n const taskItemType = state.schema.nodes['taskItem'];\n if ($from.parent.content.size === 0 && listDepth > 0\n && taskItemType && $from.node(listDepth - 1).type === taskItemType) {\n const tr = state.tr;\n const delDepth = $from.node(listDepth).childCount <= 1 ? listDepth : $from.depth - 1;\n tr.delete($from.before(delDepth), $from.after(delDepth));\n const taskItemDepth = listDepth - 1;\n const end = tr.mapping.map($from.after(taskItemDepth));\n const item = taskItemType.createAndFill();\n if (item) {\n tr.insert(end, item);\n tr.setSelection(Selection.near(tr.doc.resolve(end + 2)));\n view.dispatch(tr.scrollIntoView());\n return true;\n }\n }\n\n return liftListItem(this.nodeType)(state, view.dispatch);\n },\n\n Backspace: () => {\n if (!this.editor || !this.nodeType) return false;\n const { state, view } = this.editor;\n const { $from, empty } = state.selection;\n if (!empty || $from.parentOffset !== 0) return false;\n if ($from.parent.content.size !== 0) return false;\n\n // Empty children-zone paragraph: lift it out as a top-level sibling.\n // Empty-label backspace falls through to ListKeymap (liftListItem).\n const ctx = getListItemCursorContext($from);\n if (ctx && ctx.isInChildrenZone && ctx.paragraphIsEmpty) {\n if (liftEmptyChildrenZoneParagraph(state, view.dispatch, ctx)) return true;\n }\n\n return false;\n },\n };\n },\n});\n","/**\n * BulletList Node\n *\n * Block-level unordered list container.\n * Supports markdown-style input rules and keyboard shortcuts.\n */\n\nimport { Node } from '../Node.js';\nimport { wrappingInputRule, notInsideList } from '../helpers/wrappingInputRule.js';\nimport type { CommandSpec } from '../types/Commands.js';\nimport type { ToolbarItem } from '../types/Toolbar.js';\nimport type { FloatingMenuItem } from '../types/FloatingMenu.js';\nimport { ListItem } from './ListItem.js';\n\ndeclare module '@domternal/core' {\n interface RawCommands {\n toggleBulletList: CommandSpec;\n }\n}\n\nexport interface BulletListOptions {\n HTMLAttributes: Record<string, unknown>;\n itemTypeName: string;\n}\n\nexport const BulletList = Node.create<BulletListOptions>({\n name: 'bulletList',\n group: 'block list',\n content: 'listItem+',\n\n addOptions() {\n return {\n HTMLAttributes: {},\n itemTypeName: 'listItem',\n };\n },\n\n parseHTML() {\n return [{ tag: 'ul' }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['ul', { ...this.options.HTMLAttributes, ...HTMLAttributes }, 0];\n },\n\n addCommands() {\n const { name, options } = this;\n return {\n toggleBulletList:\n () =>\n ({ commands }) => {\n return commands.toggleList(name, options.itemTypeName);\n },\n };\n },\n\n addToolbarItems(): ToolbarItem[] {\n return [\n {\n type: 'button',\n name: 'bulletList',\n command: 'toggleBulletList',\n isActive: 'bulletList',\n icon: 'listBullets',\n label: 'Bullet List',\n shortcut: 'Mod-Shift-8',\n group: 'lists',\n priority: 200,\n },\n ];\n },\n\n addFloatingMenuItems(): FloatingMenuItem[] {\n return [\n {\n name: 'bullet-list',\n label: 'Bulleted list',\n description: 'Create a simple bulleted list',\n icon: 'listBullets',\n group: 'Lists',\n priority: 200,\n keywords: ['bullet', 'list', 'unordered', 'ul'],\n shortcut: '- ',\n command: 'toggleBulletList',\n // Don't offer \"Bulleted list\" while cursor is already inside one,\n // otherwise picking it lifts the user out of the list.\n hideWhenInside: ['bulletList'],\n },\n ];\n },\n\n addKeyboardShortcuts() {\n const { editor } = this;\n return {\n 'Mod-Shift-8': () => {\n return editor?.commands['toggleBulletList']?.() ?? false;\n },\n };\n },\n\n addExtensions() {\n return [ListItem];\n },\n\n addInputRules() {\n const { nodeType } = this;\n\n if (!nodeType) {\n return [];\n }\n\n return [\n // - item\n wrappingInputRule({ find: /^\\s*[-]\\s$/, type: nodeType, guard: notInsideList }),\n // * item\n wrappingInputRule({ find: /^\\s*[*]\\s$/, type: nodeType, guard: notInsideList }),\n // + item\n wrappingInputRule({ find: /^\\s*[+]\\s$/, type: nodeType, guard: notInsideList }),\n ];\n },\n});\n","/**\n * OrderedList Node\n *\n * Block-level ordered (numbered) list container.\n * Supports start attribute and markdown-style input rules.\n */\n\nimport { Node } from '../Node.js';\nimport { wrappingInputRule, notInsideList } from '../helpers/wrappingInputRule.js';\nimport type { CommandSpec } from '../types/Commands.js';\nimport type { ToolbarItem } from '../types/Toolbar.js';\nimport type { FloatingMenuItem } from '../types/FloatingMenu.js';\nimport { ListItem } from './ListItem.js';\n\ndeclare module '@domternal/core' {\n interface RawCommands {\n toggleOrderedList: CommandSpec;\n }\n}\n\nexport interface OrderedListOptions {\n HTMLAttributes: Record<string, unknown>;\n itemTypeName: string;\n}\n\nexport const OrderedList = Node.create<OrderedListOptions>({\n name: 'orderedList',\n group: 'block list',\n content: 'listItem+',\n\n addOptions() {\n return {\n HTMLAttributes: {},\n itemTypeName: 'listItem',\n };\n },\n\n addAttributes() {\n return {\n start: {\n default: 1,\n parseHTML: (element: HTMLElement) => {\n const start = element.getAttribute('start');\n return start ? parseInt(start, 10) : 1;\n },\n renderHTML: (attributes: Record<string, unknown>) => {\n const start = attributes['start'] as number;\n if (start === 1) {\n return {};\n }\n return { start: String(start) };\n },\n },\n };\n },\n\n parseHTML() {\n return [{ tag: 'ol' }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['ol', { ...this.options.HTMLAttributes, ...HTMLAttributes }, 0];\n },\n\n addCommands() {\n const { name, options } = this;\n return {\n toggleOrderedList:\n () =>\n ({ commands }) => {\n return commands.toggleList(name, options.itemTypeName);\n },\n };\n },\n\n addToolbarItems(): ToolbarItem[] {\n return [\n {\n type: 'button',\n name: 'orderedList',\n command: 'toggleOrderedList',\n isActive: 'orderedList',\n icon: 'listNumbers',\n label: 'Ordered List',\n shortcut: 'Mod-Shift-7',\n group: 'lists',\n priority: 190,\n },\n ];\n },\n\n addFloatingMenuItems(): FloatingMenuItem[] {\n return [\n {\n name: 'ordered-list',\n label: 'Numbered list',\n description: 'Create a numbered list',\n icon: 'listNumbers',\n group: 'Lists',\n priority: 190,\n keywords: ['ordered', 'numbered', 'list', 'ol', '1.'],\n shortcut: '1. ',\n command: 'toggleOrderedList',\n hideWhenInside: ['orderedList'],\n },\n ];\n },\n\n addKeyboardShortcuts() {\n const { editor } = this;\n return {\n 'Mod-Shift-7': () => {\n return editor?.commands['toggleOrderedList']?.() ?? false;\n },\n };\n },\n\n addExtensions() {\n return [ListItem];\n },\n\n addInputRules() {\n const { nodeType } = this;\n\n if (!nodeType) {\n return [];\n }\n\n return [\n // 1. item (any number followed by . )\n wrappingInputRule({\n find: /^(\\d+)\\.\\s$/,\n type: nodeType,\n guard: notInsideList,\n getAttributes: (match) => {\n const num = match[1];\n return { start: num ? parseInt(num, 10) : 1 };\n },\n }),\n ];\n },\n});\n","/**\n * HorizontalRule Node\n *\n * Block-level thematic break element (hr).\n * Supports markdown-style input rules: ---, ***, ___\n */\n\nimport { Node } from '../Node.js';\nimport { InputRule } from '@domternal/pm/inputrules';\nimport type { EditorState } from '@domternal/pm/state';\nimport { TextSelection } from '@domternal/pm/state';\nimport type { CommandSpec } from '../types/Commands.js';\nimport type { ToolbarItem } from '../types/Toolbar.js';\nimport type { FloatingMenuItem } from '../types/FloatingMenu.js';\nimport { splitListForInsert } from '../utils/splitListForInsert.js';\n\ndeclare module '@domternal/core' {\n interface RawCommands {\n setHorizontalRule: CommandSpec;\n }\n}\n\nexport interface HorizontalRuleOptions {\n HTMLAttributes: Record<string, unknown>;\n}\n\nexport const HorizontalRule = Node.create<HorizontalRuleOptions>({\n name: 'horizontalRule',\n group: 'block',\n\n addOptions() {\n return {\n HTMLAttributes: {},\n };\n },\n\n parseHTML() {\n return [{ tag: 'hr' }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['hr', { ...this.options.HTMLAttributes, ...HTMLAttributes }];\n },\n\n addCommands() {\n return {\n setHorizontalRule:\n () =>\n ({ state, tr, dispatch }) => {\n if (!this.nodeType) return false;\n\n const { $from } = tr.selection;\n const parent = $from.parent;\n\n // Block insertion when selection is not in a textblock (e.g. CellSelection\n // resolves $from at the tableRow level - inserting HR there splits the table)\n if (!parent.isTextblock) return false;\n\n const paragraphType = state.schema.nodes['paragraph'];\n const hrNode = this.nodeType.create();\n const trailingParagraph = paragraphType?.create();\n const nodes = trailingParagraph ? [hrNode, trailingParagraph] : [hrNode];\n\n // List-item-aware path: cursor in the LABEL paragraph of a\n // list/task item. The divider belongs at TOP LEVEL, not nested\n // inside the list item. The util splits the parent list around\n // the current item (empty label is consumed) so the existing\n // bullet/number/check stays intact above the divider.\n const listRange = splitListForInsert(state, tr);\n if (listRange) {\n if (!dispatch) return true;\n tr.replaceWith(listRange.from, listRange.to, nodes);\n const sel = TextSelection.findFrom(\n tr.doc.resolve(listRange.from + 1),\n 1,\n );\n if (sel) tr.setSelection(sel);\n dispatch(tr.scrollIntoView());\n return true;\n }\n\n if (dispatch) {\n // If cursor is in an empty block, replace it with HR + new paragraph\n if (parent.content.size === 0 && parent.type.name === 'paragraph') {\n const from = $from.before();\n const to = $from.after();\n tr.replaceWith(from, to, nodes);\n const sel = TextSelection.findFrom(tr.doc.resolve(from + 1), 1);\n if (sel) tr.setSelection(sel);\n } else {\n // Insert HR after current position\n const end = $from.after();\n tr.insert(end, nodes);\n const sel = TextSelection.findFrom(tr.doc.resolve(end + 1), 1);\n if (sel) tr.setSelection(sel);\n }\n\n dispatch(tr);\n }\n\n return true;\n },\n };\n },\n\n addToolbarItems(): ToolbarItem[] {\n return [\n {\n type: 'button',\n name: 'horizontalRule',\n command: 'setHorizontalRule',\n icon: 'minus',\n label: 'Horizontal Rule',\n group: 'blocks',\n priority: 130,\n },\n ];\n },\n\n addFloatingMenuItems(): FloatingMenuItem[] {\n return [\n {\n name: 'horizontal-rule',\n label: 'Divider',\n description: 'Insert a horizontal rule',\n icon: 'minus',\n group: 'Basic',\n priority: 150,\n keywords: ['divider', 'hr', 'line', 'separator', 'horizontal rule'],\n shortcut: '--- ',\n command: 'setHorizontalRule',\n },\n ];\n },\n\n addInputRules() {\n const { nodeType } = this;\n\n if (!nodeType) {\n return [];\n }\n\n return [\n new InputRule(\n /^(?:---|—-|___|\\*\\*\\*)\\s$/,\n (state: EditorState, match: RegExpMatchArray, start: number) => {\n const { tr } = state;\n\n if (match[0]) {\n const $start = state.doc.resolve(start);\n // Replace the entire parent block (paragraph) with HR + new paragraph\n const from = $start.before();\n const to = $start.after();\n const paragraph = state.schema.nodes['paragraph']?.create();\n const nodes = paragraph\n ? [nodeType.create(), paragraph]\n : [nodeType.create()];\n tr.replaceWith(from, to, nodes);\n\n // Move selection into the new paragraph after the HR\n const sel = TextSelection.findFrom(tr.doc.resolve(from + 1), 1);\n if (sel) {\n tr.setSelection(sel);\n }\n }\n\n return tr;\n }\n ),\n ];\n },\n});\n","/**\n * HardBreak Node\n *\n * Inline line break element (br).\n * Keyboard shortcuts: Mod-Enter, Shift-Enter\n */\n\nimport { Node } from '../Node.js';\nimport type { CommandSpec } from '../types/Commands.js';\nimport type { ToolbarItem } from '../types/Toolbar.js';\n\ndeclare module '@domternal/core' {\n interface RawCommands {\n setHardBreak: CommandSpec;\n insertNbsp: CommandSpec;\n }\n}\n\nexport interface HardBreakOptions {\n HTMLAttributes: Record<string, unknown>;\n}\n\nexport const HardBreak = Node.create<HardBreakOptions>({\n name: 'hardBreak',\n group: 'inline',\n inline: true,\n selectable: false,\n\n addOptions() {\n return {\n HTMLAttributes: {},\n };\n },\n\n parseHTML() {\n return [{ tag: 'br' }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['br', { ...this.options.HTMLAttributes, ...HTMLAttributes }];\n },\n\n addCommands() {\n const { name } = this;\n return {\n setHardBreak:\n () =>\n ({ commands }) => {\n return commands.insertContent({ type: name });\n },\n insertNbsp:\n () =>\n ({ tr, dispatch }) => {\n if (dispatch) {\n tr.insertText('\\u00A0');\n dispatch(tr);\n }\n return true;\n },\n };\n },\n\n addToolbarItems(): ToolbarItem[] {\n return [\n {\n type: 'button',\n name: 'hardBreak',\n command: 'setHardBreak',\n icon: 'linkBreak',\n label: 'Hard Break',\n shortcut: 'Shift-Enter',\n group: 'insert',\n priority: 50,\n },\n ];\n },\n\n addKeyboardShortcuts() {\n const { editor } = this;\n return {\n 'Mod-Enter': () => {\n return editor?.commands['setHardBreak']?.() ?? false;\n },\n 'Shift-Enter': () => {\n return editor?.commands['setHardBreak']?.() ?? false;\n },\n 'Mod-Shift-Space': () => {\n return editor?.commands['insertNbsp']?.() ?? false;\n },\n };\n },\n});\n","/**\n * Translates checkbox mouse interaction into ProseMirror transactions.\n * Without a NodeView, clicking the checkbox flips it visually but PM never\n * learns about it - `node.attrs.checked` stays the same and the next render\n * restores the old state. Mod+Enter already worked via `toggleTask`; this\n * NodeView fixes the mouse path. DOM matches TaskItem.renderHTML so parseDOM\n * round-trips cleanly. `stopEvent` and `ignoreMutation` guard the label\n * subtree so PM does not turn checkbox clicks into node selections or roll\n * back our DOM edits.\n */\n\nimport type { Node as PMNode, NodeType } from '@domternal/pm/model';\nimport type { EditorView, NodeView, ViewMutationRecord } from '@domternal/pm/view';\nimport type { TaskItemOptions } from './TaskItem.js';\n\ninterface TaskItemNodeViewArgs {\n options: TaskItemOptions;\n node: PMNode;\n view: EditorView;\n getPos: () => number | undefined;\n}\n\nexport class TaskItemNodeView implements NodeView {\n readonly dom: HTMLLIElement;\n readonly contentDOM: HTMLDivElement;\n private readonly label: HTMLLabelElement;\n private readonly input: HTMLInputElement;\n private readonly view: EditorView;\n private readonly nodeType: NodeType;\n private readonly getPos: () => number | undefined;\n private node: PMNode;\n\n constructor({ options, node, view, getPos }: TaskItemNodeViewArgs) {\n this.view = view;\n this.nodeType = node.type;\n this.node = node;\n this.getPos = getPos;\n\n this.dom = document.createElement('li');\n // Apply consumer-supplied HTMLAttributes first so our identity\n // attributes (data-type, data-checked) take precedence on collision.\n for (const [key, value] of Object.entries(options.HTMLAttributes)) {\n if (value !== null && value !== undefined) {\n this.dom.setAttribute(key, typeof value === 'string' ? value : JSON.stringify(value));\n }\n }\n this.dom.setAttribute('data-type', 'taskItem');\n this.dom.setAttribute('data-checked', node.attrs['checked'] ? 'true' : 'false');\n\n this.label = document.createElement('label');\n this.label.setAttribute('contenteditable', 'false');\n\n this.input = document.createElement('input');\n this.input.type = 'checkbox';\n this.input.checked = !!node.attrs['checked'];\n this.input.disabled = !view.editable;\n this.input.setAttribute('aria-label', 'Task status');\n\n this.label.appendChild(this.input);\n this.dom.appendChild(this.label);\n\n this.contentDOM = document.createElement('div');\n this.dom.appendChild(this.contentDOM);\n\n this.input.addEventListener('change', this.handleChange);\n }\n\n private handleChange = (event: Event): void => {\n event.preventDefault();\n if (!this.view.editable) {\n // Revert the visual flip; PM never sees a transaction.\n this.input.checked = !!this.node.attrs['checked'];\n return;\n }\n const pos = this.getPos();\n if (pos === undefined) return;\n const { state, dispatch } = this.view;\n const tr = state.tr.setNodeMarkup(pos, undefined, {\n ...this.node.attrs,\n checked: this.input.checked,\n });\n dispatch(tr);\n };\n\n update(node: PMNode): boolean {\n // Type mismatch: tell PM to rebuild the view. Different node type\n // means different schema, so reusing this DOM tree is unsafe.\n if (node.type !== this.nodeType) return false;\n this.node = node;\n const checked = !!node.attrs['checked'];\n this.dom.setAttribute('data-checked', checked ? 'true' : 'false');\n this.input.checked = checked;\n this.input.disabled = !this.view.editable;\n return true;\n }\n\n stopEvent(event: Event): boolean {\n // Events on the label / input subtree are owned by the checkbox.\n // Returning true keeps PM from treating the click as a selection\n // or otherwise interfering with the native checkbox interaction.\n return event.target instanceof Node && this.label.contains(event.target);\n }\n\n ignoreMutation(mutation: ViewMutationRecord): boolean {\n // We manage the label / input DOM ourselves (toggling checked,\n // disabled). PM should not interpret those mutations as edits.\n return mutation.target instanceof Node && this.label.contains(mutation.target);\n }\n\n destroy(): void {\n this.input.removeEventListener('change', this.handleChange);\n }\n}\n","/**\n * Enter / Backspace state machine for taskItem (cursor's parent must be a paragraph):\n *\n * LABEL paragraph (childIndex 0):\n * Enter, empty -> splitListItem fall-through, then taskItem-in-listItem\n * promotion (nested orderedList > listItem > taskList > taskItem\n * context), else liftListItem.\n * Enter, non-empty -> splitListItem (new sibling taskItem)\n * Backspace, empty -> liftListItem (exit empty checkbox)\n *\n * CHILDREN-ZONE paragraph (childIndex > 0):\n * Enter, empty -> insertChildrenZoneSibling (accumulate inside the item)\n * Enter, non-empty -> splitBlock (both halves stay inside the same item)\n * Backspace, empty -> liftEmptyChildrenZoneParagraph (exit as top-level)\n *\n * Tab / Shift-Tab sink / lift the item; Mod-Enter toggles checked state.\n */\nimport { Node } from '../Node.js';\nimport { splitListItem, liftListItem, sinkListItem } from '@domternal/pm/schema-list';\nimport { Selection } from '@domternal/pm/state';\nimport { splitBlock } from '@domternal/pm/commands';\nimport type { CommandSpec } from '../types/Commands.js';\nimport { getListItemCursorContext } from '../utils/listItemCursorContext.js';\nimport { insertChildrenZoneSibling } from '../utils/insertChildrenZoneSibling.js';\nimport { liftEmptyChildrenZoneParagraph } from '../utils/liftEmptyChildrenZoneParagraph.js';\nimport { TaskItemNodeView } from './TaskItemNodeView.js';\n\ndeclare module '@domternal/core' {\n interface RawCommands {\n toggleTask: CommandSpec;\n }\n}\n\nexport interface TaskItemOptions {\n HTMLAttributes: Record<string, unknown>;\n nested: boolean;\n}\n\nexport const TaskItem = Node.create<TaskItemOptions>({\n name: 'taskItem',\n\n // Paragraph must be the first child so flex alignment binds to the label\n // baseline; a heading-first child would visually break the checkbox.\n content: 'paragraph block*',\n\n defining: true,\n\n addOptions() {\n return {\n HTMLAttributes: {},\n nested: true,\n };\n },\n\n addAttributes() {\n return {\n checked: {\n default: false,\n keepOnSplit: false,\n parseHTML: (element: HTMLElement) => {\n const dataChecked = element.getAttribute('data-checked');\n return dataChecked === 'true' || dataChecked === '';\n },\n renderHTML: (attributes: Record<string, unknown>) => ({\n 'data-checked': attributes['checked'] ? 'true' : 'false',\n }),\n },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: `li[data-type=\"${this.name}\"]`,\n priority: 51,\n },\n ];\n },\n\n renderHTML({ node, HTMLAttributes }) {\n return [\n 'li',\n {\n ...this.options.HTMLAttributes,\n ...HTMLAttributes,\n 'data-type': this.name,\n },\n [\n 'label',\n { contenteditable: 'false' },\n [\n 'input',\n {\n type: 'checkbox',\n checked: node.attrs['checked'] ? 'checked' : null,\n 'aria-label': 'Task status',\n },\n ],\n ],\n ['div', 0],\n ];\n },\n\n addNodeView() {\n const options = this.options;\n return (node, view, getPos) =>\n new TaskItemNodeView({ options, node, view, getPos });\n },\n\n addCommands() {\n const { name } = this;\n return {\n toggleTask:\n () =>\n ({ state, dispatch }) => {\n const { selection } = state;\n const { $from } = selection;\n\n // Find the task item node\n let taskItemPos: number | null = null;\n let taskItemNode = null;\n\n for (let depth = $from.depth; depth >= 0; depth--) {\n const node = $from.node(depth);\n if (node.type.name === name) {\n taskItemPos = $from.before(depth);\n taskItemNode = node;\n break;\n }\n }\n\n if (taskItemPos === null || !taskItemNode) return false;\n\n if (dispatch) {\n const tr = state.tr.setNodeMarkup(taskItemPos, undefined, {\n ...taskItemNode.attrs,\n checked: !taskItemNode.attrs['checked'],\n });\n dispatch(tr);\n }\n\n return true;\n },\n };\n },\n\n addKeyboardShortcuts() {\n return {\n Enter: () => {\n if (!this.editor || !this.nodeType) return false;\n const { state, view } = this.editor;\n const { $from } = state.selection;\n if ($from.depth < 1 || $from.node(-1).type !== this.nodeType) return false;\n // Defer if cursor is in a nested non-paragraph block (heading, codeBlock)\n // so that block's own Enter handler runs instead of splitListItem.\n if ($from.parent.type.name !== 'paragraph') return false;\n\n // Children-zone Enter accumulates inside the taskItem (Notion semantics).\n const ctx = getListItemCursorContext($from);\n if (ctx?.isInChildrenZone) {\n if (ctx.paragraphIsEmpty) {\n if (insertChildrenZoneSibling(state, view.dispatch, ctx)) return true;\n } else {\n if (splitBlock(state, view.dispatch)) return true;\n }\n }\n\n // Standard split for non-empty items. Pass `{ checked: false }` so\n // a freshly-spawned task item always starts unchecked - splitting\n // off a checked task otherwise inherits checked: true (Notion\n // semantics: each new task is fresh work). Other attrs assigned\n // by sibling extensions (UniqueID's `id`, etc.) are intentionally\n // NOT forwarded so those extensions can regenerate them.\n if (splitListItem(this.nodeType, { checked: false })(state, view.dispatch)) return true;\n\n // For empty taskItem nested inside a parent list item (e.g. orderedList > listItem > taskList > taskItem),\n // delete the taskItem, clean up the taskList if empty, and create a new parent listItem.\n // Without this, liftListItem alone leaves a bare empty paragraph inside the listItem.\n if ($from.parent.content.size === 0) {\n const listItemType = state.schema.nodes['listItem'];\n if (listItemType) {\n let parentListItemDepth = -1;\n for (let d = $from.depth - 2; d > 0; d--) {\n if ($from.node(d).type === listItemType) {\n parentListItemDepth = d;\n break;\n }\n }\n\n if (parentListItemDepth > 0) {\n const tr = state.tr;\n const taskItemDepth = $from.depth - 1;\n const taskItemNode = $from.node(taskItemDepth);\n\n if (taskItemNode.childCount > 1) {\n // TaskItem has content beyond the empty paragraph (e.g. paragraph + nested list + empty paragraph).\n // Only delete the trailing empty paragraph, not the whole taskItem.\n tr.delete($from.before($from.depth), $from.after($from.depth));\n } else {\n const taskListDepth = taskItemDepth - 1;\n const taskListNode = $from.node(taskListDepth);\n\n if (taskListNode.childCount <= 1) {\n // Only child - delete the entire taskList. Deleting just the taskItem\n // would leave an empty taskList, violating its content spec and causing\n // ProseMirror's replaceStep to silently skip the deletion.\n tr.delete($from.before(taskListDepth), $from.after(taskListDepth));\n } else {\n // Multiple children - delete just the empty taskItem\n tr.delete($from.before(taskItemDepth), $from.after(taskItemDepth));\n }\n }\n\n // 3. Insert a new listItem after the parent listItem\n const listItemEnd = tr.mapping.map($from.after(parentListItemDepth));\n const newItem = listItemType.createAndFill();\n if (newItem) {\n tr.insert(listItemEnd, newItem);\n tr.setSelection(Selection.near(tr.doc.resolve(listItemEnd + 2)));\n view.dispatch(tr.scrollIntoView());\n return true;\n }\n }\n }\n }\n\n // Standard lift for non-nested empty items\n return liftListItem(this.nodeType)(state, view.dispatch);\n },\n Tab: () => {\n if (!this.editor || !this.nodeType) return false;\n const { $from } = this.editor.state.selection;\n if ($from.depth < 1 || $from.node(-1).type !== this.nodeType) return false;\n return sinkListItem(this.nodeType)(this.editor.state, this.editor.view.dispatch);\n },\n 'Shift-Tab': () => {\n if (!this.editor || !this.nodeType) return false;\n const { $from } = this.editor.state.selection;\n if ($from.depth < 1 || $from.node(-1).type !== this.nodeType) return false;\n return liftListItem(this.nodeType)(this.editor.state, this.editor.view.dispatch);\n },\n Backspace: () => {\n if (!this.editor || !this.nodeType) return false;\n const { state, view } = this.editor;\n const { $from, empty } = state.selection;\n\n // Only at start of a textblock with empty selection\n if (!empty || $from.parentOffset !== 0) return false;\n\n // Empty children-zone paragraph: lift it out as a top-level sibling.\n if ($from.parent.content.size === 0) {\n const ctx = getListItemCursorContext($from);\n if (ctx && ctx.isInChildrenZone && ctx.paragraphIsEmpty) {\n if (liftEmptyChildrenZoneParagraph(state, view.dispatch, ctx)) return true;\n }\n }\n\n // Find enclosing taskItem\n let taskItemDepth = -1;\n for (let d = $from.depth; d > 0; d--) {\n if ($from.node(d).type === this.nodeType) {\n taskItemDepth = d;\n break;\n }\n }\n if (taskItemDepth === -1) return false;\n\n // Only lift when cursor is in the first child of the taskItem\n if ($from.index(taskItemDepth) !== 0) return false;\n\n return liftListItem(this.nodeType)(state, view.dispatch);\n },\n 'Mod-Enter': () => {\n return this.editor?.commands['toggleTask']?.() ?? false;\n },\n };\n },\n});\n","/**\n * TaskList Node\n *\n * Block-level task/checkbox list container.\n * Supports markdown-style input rules with `[ ]` and `[x]`.\n */\n\nimport { Node } from '../Node.js';\nimport { wrappingInputRule, notInsideList } from '../helpers/wrappingInputRule.js';\nimport type { CommandSpec } from '../types/Commands.js';\nimport type { ToolbarItem } from '../types/Toolbar.js';\nimport type { FloatingMenuItem } from '../types/FloatingMenu.js';\nimport { TaskItem } from './TaskItem.js';\n\ndeclare module '@domternal/core' {\n interface RawCommands {\n toggleTaskList: CommandSpec;\n }\n}\n\nexport interface TaskListOptions {\n HTMLAttributes: Record<string, unknown>;\n itemTypeName: string;\n}\n\nexport const TaskList = Node.create<TaskListOptions>({\n name: 'taskList',\n group: 'block list',\n content: 'taskItem+',\n\n addOptions() {\n return {\n HTMLAttributes: {},\n itemTypeName: 'taskItem',\n };\n },\n\n parseHTML() {\n return [\n {\n tag: `ul[data-type=\"${this.name}\"]`,\n priority: 51, // Higher priority than regular bulletList\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n 'ul',\n {\n ...this.options.HTMLAttributes,\n ...HTMLAttributes,\n 'data-type': this.name,\n },\n 0,\n ];\n },\n\n addCommands() {\n const { name, options } = this;\n return {\n toggleTaskList:\n () =>\n ({ commands }) => {\n return commands.toggleList(name, options.itemTypeName);\n },\n };\n },\n\n addKeyboardShortcuts() {\n const { editor } = this;\n return {\n 'Mod-Shift-9': () => {\n return editor?.commands['toggleTaskList']?.() ?? false;\n },\n };\n },\n\n addToolbarItems(): ToolbarItem[] {\n return [\n {\n type: 'button',\n name: 'taskList',\n command: 'toggleTaskList',\n isActive: 'taskList',\n icon: 'listChecks',\n label: 'Task List',\n shortcut: 'Mod-Shift-9',\n group: 'lists',\n priority: 170,\n },\n ];\n },\n\n addFloatingMenuItems(): FloatingMenuItem[] {\n return [\n {\n name: 'task-list',\n label: 'To-do list',\n description: 'Track tasks with a checkbox list',\n icon: 'listChecks',\n group: 'Lists',\n priority: 180,\n keywords: ['todo', 'task', 'checkbox', 'check'],\n shortcut: '[ ] ',\n command: 'toggleTaskList',\n hideWhenInside: ['taskList'],\n },\n ];\n },\n\n addExtensions() {\n return [TaskItem];\n },\n\n addInputRules() {\n const { nodeType } = this;\n\n if (!nodeType) {\n return [];\n }\n\n return [\n // [ ] at start of line creates unchecked task\n wrappingInputRule({ find: /^\\s*\\[\\s?\\]\\s$/, type: nodeType, guard: notInsideList }),\n // [x] or [X] at start of line creates checked task\n wrappingInputRule({ find: /^\\s*\\[[xX]\\]\\s$/, type: nodeType, guard: notInsideList }),\n ];\n },\n});\n","/**\n * Bold Mark\n *\n * Applies bold formatting to text. Supports multiple HTML tags\n * and CSS font-weight styles.\n *\n * @example\n * ```ts\n * import { Bold } from '@domternal/core';\n *\n * const editor = new Editor({\n * extensions: [Document, Paragraph, Text, Bold],\n * });\n *\n * // Toggle bold with keyboard shortcut: Mod-b\n * // Or use input rule: **text**\n * ```\n */\nimport { Mark } from '../Mark.js';\nimport { markInputRule, markInputRulePatterns } from '../helpers/markInputRule.js';\nimport type { ToolbarItem } from '../types/Toolbar.js';\nimport type { CommandSpec } from '../types/Commands.js';\n\n/**\n * Options for the Bold mark\n */\nexport interface BoldOptions {\n /**\n * HTML attributes to add to the rendered element\n */\n HTMLAttributes: Record<string, unknown>;\n}\n\n/**\n * Bold mark for text formatting\n */\nexport const Bold = Mark.create<BoldOptions>({\n name: 'bold',\n\n addOptions() {\n return {\n HTMLAttributes: {},\n };\n },\n\n parseHTML() {\n return [\n { tag: 'strong' },\n {\n tag: 'b',\n getAttrs: (node) => {\n if (typeof node === 'string') return {};\n const fontWeight = node.style.fontWeight;\n\n // Google Docs uses <b style=\"font-weight:normal\"> for non-bold text\n if (fontWeight === 'normal' || fontWeight === '400') {\n return false;\n }\n\n return {};\n },\n },\n {\n style: 'font-weight',\n getAttrs: (value) => {\n if (typeof value !== 'string') return false;\n\n // Match numeric weight >= 600 (semibold and above)\n const numWeight = parseInt(value, 10);\n if (!isNaN(numWeight) && numWeight >= 600) return {};\n\n // Match named weights\n if (/^(bold|bolder)$/i.test(value)) return {};\n\n return false;\n },\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['strong', { ...this.options.HTMLAttributes, ...HTMLAttributes }, 0];\n },\n\n addKeyboardShortcuts() {\n return {\n 'Mod-b': () => this.editor?.commands['toggleMark']?.('bold') ?? false,\n };\n },\n\n addCommands() {\n return {\n setBold:\n () =>\n ({ commands }) => commands.setMark('bold'),\n unsetBold:\n () =>\n ({ commands }) => commands.unsetMark('bold'),\n toggleBold:\n () =>\n ({ commands }) => commands.toggleMark('bold'),\n };\n },\n\n addToolbarItems(): ToolbarItem[] {\n return [\n {\n type: 'button',\n name: 'bold',\n command: 'toggleBold',\n isActive: 'bold',\n icon: 'textB',\n label: 'Bold',\n shortcut: 'Mod-B',\n group: 'format',\n priority: 200,\n },\n ];\n },\n\n addInputRules() {\n const markType = this.markType;\n if (!markType) return [];\n\n return [\n // **text** or __text__\n markInputRule({\n find: markInputRulePatterns.bold,\n type: markType,\n }),\n ];\n },\n});\n\ndeclare module '@domternal/core' {\n interface RawCommands {\n setBold: CommandSpec;\n unsetBold: CommandSpec;\n toggleBold: CommandSpec;\n }\n}\n","/**\n * Italic Mark\n *\n * Applies italic formatting to text. Supports multiple HTML tags\n * and CSS font-style styles.\n *\n * @example\n * ```ts\n * import { Italic } from '@domternal/core';\n *\n * const editor = new Editor({\n * extensions: [Document, Paragraph, Text, Italic],\n * });\n *\n * // Toggle italic with keyboard shortcut: Mod-i\n * // Or use input rule: *text* or _text_\n * ```\n */\nimport { Mark } from '../Mark.js';\nimport type { CommandSpec } from '../types/Commands.js';\nimport { markInputRule } from '../helpers/markInputRule.js';\nimport type { ToolbarItem } from '../types/Toolbar.js';\n\n/**\n * Options for the Italic mark\n */\nexport interface ItalicOptions {\n /**\n * HTML attributes to add to the rendered element\n */\n HTMLAttributes: Record<string, unknown>;\n}\n\n/**\n * Italic mark for text formatting\n */\nexport const Italic = Mark.create<ItalicOptions>({\n name: 'italic',\n\n addOptions() {\n return {\n HTMLAttributes: {},\n };\n },\n\n parseHTML() {\n return [\n { tag: 'em' },\n {\n tag: 'i',\n getAttrs: (node) => {\n if (typeof node === 'string') return {};\n const fontStyle = node.style.fontStyle;\n\n // Google Docs uses <i style=\"font-style:normal\"> for non-italic text\n if (fontStyle === 'normal') {\n return false;\n }\n\n return {};\n },\n },\n {\n style: 'font-style',\n getAttrs: (value) => {\n if (typeof value !== 'string') return false;\n return /^italic$/i.test(value) ? {} : false;\n },\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['em', { ...this.options.HTMLAttributes, ...HTMLAttributes }, 0];\n },\n\n addKeyboardShortcuts() {\n return {\n 'Mod-i': () => this.editor?.commands['toggleMark']?.('italic') ?? false,\n };\n },\n\n addCommands() {\n return {\n setItalic:\n () =>\n ({ commands }) => commands.setMark('italic'),\n unsetItalic:\n () =>\n ({ commands }) => commands.unsetMark('italic'),\n toggleItalic:\n () =>\n ({ commands }) => commands.toggleMark('italic'),\n };\n },\n\n addToolbarItems(): ToolbarItem[] {\n return [\n {\n type: 'button',\n name: 'italic',\n command: 'toggleItalic',\n isActive: 'italic',\n icon: 'textItalic',\n label: 'Italic',\n shortcut: 'Mod-I',\n group: 'format',\n priority: 190,\n },\n ];\n },\n\n addInputRules() {\n const markType = this.markType;\n if (!markType) return [];\n\n return [\n // *text* - using negative lookbehind to avoid matching **text**\n markInputRule({\n find: /(?<!\\*)\\*([^*]+)\\*$/,\n type: markType,\n }),\n // _text_ - using negative lookbehind to avoid matching __text__\n markInputRule({\n find: /(?<!_)_([^_]+)_$/,\n type: markType,\n }),\n ];\n },\n});\n\ndeclare module '@domternal/core' {\n interface RawCommands {\n setItalic: CommandSpec;\n unsetItalic: CommandSpec;\n toggleItalic: CommandSpec;\n }\n}\n","/**\n * Underline Mark\n *\n * Applies underline formatting to text.\n *\n * @example\n * ```ts\n * import { Underline } from '@domternal/core';\n *\n * const editor = new Editor({\n * extensions: [Document, Paragraph, Text, Underline],\n * });\n *\n * // Toggle underline with keyboard shortcut: Mod-u\n * ```\n */\nimport { Mark } from '../Mark.js';\nimport type { CommandSpec } from '../types/Commands.js';\nimport type { ToolbarItem } from '../types/Toolbar.js';\n\n/**\n * Options for the Underline mark\n */\nexport interface UnderlineOptions {\n /**\n * HTML attributes to add to the rendered element\n */\n HTMLAttributes: Record<string, unknown>;\n}\n\n/**\n * Underline mark for text formatting\n */\nexport const Underline = Mark.create<UnderlineOptions>({\n name: 'underline',\n\n addOptions() {\n return {\n HTMLAttributes: {},\n };\n },\n\n parseHTML() {\n return [\n { tag: 'u' },\n {\n style: 'text-decoration',\n getAttrs: (value) => {\n if (typeof value !== 'string') return false;\n // text-decoration can be \"underline\" or \"underline dotted\" etc.\n return value.includes('underline') ? {} : false;\n },\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['u', { ...this.options.HTMLAttributes, ...HTMLAttributes }, 0];\n },\n\n addKeyboardShortcuts() {\n return {\n 'Mod-u': () => this.editor?.commands['toggleMark']?.('underline') ?? false,\n };\n },\n\n addCommands() {\n return {\n setUnderline:\n () =>\n ({ commands }) => commands.setMark('underline'),\n unsetUnderline:\n () =>\n ({ commands }) => commands.unsetMark('underline'),\n toggleUnderline:\n () =>\n ({ commands }) => commands.toggleMark('underline'),\n };\n },\n\n addToolbarItems(): ToolbarItem[] {\n return [\n {\n type: 'button',\n name: 'underline',\n command: 'toggleUnderline',\n isActive: 'underline',\n icon: 'textUnderline',\n label: 'Underline',\n shortcut: 'Mod-U',\n group: 'format',\n priority: 180,\n },\n ];\n },\n});\n\ndeclare module '@domternal/core' {\n interface RawCommands {\n setUnderline: CommandSpec;\n unsetUnderline: CommandSpec;\n toggleUnderline: CommandSpec;\n }\n}\n","/**\n * Strike Mark\n *\n * Applies strikethrough formatting to text.\n *\n * @example\n * ```ts\n * import { Strike } from '@domternal/core';\n *\n * const editor = new Editor({\n * extensions: [Document, Paragraph, Text, Strike],\n * });\n *\n * // Toggle strike with keyboard shortcut: Mod-Shift-s\n * // Or use input rule: ~~text~~\n * ```\n */\nimport { Mark } from '../Mark.js';\nimport type { CommandSpec } from '../types/Commands.js';\nimport { markInputRule, markInputRulePatterns } from '../helpers/markInputRule.js';\nimport type { ToolbarItem } from '../types/Toolbar.js';\n\n/**\n * Options for the Strike mark\n */\nexport interface StrikeOptions {\n /**\n * HTML attributes to add to the rendered element\n */\n HTMLAttributes: Record<string, unknown>;\n}\n\n/**\n * Strike mark for text formatting\n */\nexport const Strike = Mark.create<StrikeOptions>({\n name: 'strike',\n\n addOptions() {\n return {\n HTMLAttributes: {},\n };\n },\n\n parseHTML() {\n return [\n { tag: 's' },\n { tag: 'del' },\n { tag: 'strike' }, // Deprecated but still common\n {\n style: 'text-decoration',\n getAttrs: (value) => {\n if (typeof value !== 'string') return false;\n return value.includes('line-through') ? {} : false;\n },\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['s', { ...this.options.HTMLAttributes, ...HTMLAttributes }, 0];\n },\n\n addKeyboardShortcuts() {\n return {\n 'Mod-Shift-s': () => this.editor?.commands['toggleMark']?.('strike') ?? false,\n };\n },\n\n addCommands() {\n return {\n setStrike:\n () =>\n ({ commands }) => commands.setMark('strike'),\n unsetStrike:\n () =>\n ({ commands }) => commands.unsetMark('strike'),\n toggleStrike:\n () =>\n ({ commands }) => commands.toggleMark('strike'),\n };\n },\n\n addToolbarItems(): ToolbarItem[] {\n return [\n {\n type: 'button',\n name: 'strike',\n command: 'toggleStrike',\n isActive: 'strike',\n icon: 'textStrikethrough',\n label: 'Strikethrough',\n shortcut: 'Mod-Shift-S',\n group: 'format',\n priority: 170,\n },\n ];\n },\n\n addInputRules() {\n const markType = this.markType;\n if (!markType) return [];\n\n return [\n // ~~text~~\n markInputRule({\n find: markInputRulePatterns.strike,\n type: markType,\n }),\n ];\n },\n});\n\ndeclare module '@domternal/core' {\n interface RawCommands {\n setStrike: CommandSpec;\n unsetStrike: CommandSpec;\n toggleStrike: CommandSpec;\n }\n}\n","/**\n * Code Mark\n *\n * Applies inline code formatting to text. This mark is exclusive,\n * meaning it cannot be combined with other marks like bold or italic.\n *\n * @example\n * ```ts\n * import { Code } from '@domternal/core';\n *\n * const editor = new Editor({\n * extensions: [Document, Paragraph, Text, Code],\n * });\n *\n * // Toggle code with keyboard shortcut: Mod-e\n * // Or use input rule: `text`\n * ```\n */\nimport { Mark } from '../Mark.js';\nimport type { CommandSpec } from '../types/Commands.js';\nimport { markInputRule, markInputRulePatterns } from '../helpers/markInputRule.js';\nimport type { ToolbarItem } from '../types/Toolbar.js';\n\n/**\n * Options for the Code mark\n */\nexport interface CodeOptions {\n /**\n * HTML attributes to add to the rendered element\n */\n HTMLAttributes: Record<string, unknown>;\n}\n\n/**\n * Code mark for inline code formatting\n */\nexport const Code = Mark.create<CodeOptions>({\n name: 'code',\n\n addOptions() {\n return {\n HTMLAttributes: {},\n };\n },\n\n // Code mark is exclusive - it cannot be combined with other marks\n // ProseMirror uses '_' to mean \"exclude all marks\"\n excludes: '_',\n\n // Code should not span across multiple nodes\n spanning: false,\n\n parseHTML() {\n return [{ tag: 'code' }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['code', { ...this.options.HTMLAttributes, ...HTMLAttributes }, 0];\n },\n\n addKeyboardShortcuts() {\n return {\n 'Mod-e': () => this.editor?.commands['toggleMark']?.('code') ?? false,\n };\n },\n\n addCommands() {\n return {\n setCode:\n () =>\n ({ commands }) => commands.setMark('code'),\n unsetCode:\n () =>\n ({ commands }) => commands.unsetMark('code'),\n toggleCode:\n () =>\n ({ commands }) => commands.toggleMark('code'),\n };\n },\n\n addToolbarItems(): ToolbarItem[] {\n return [\n {\n type: 'button',\n name: 'code',\n command: 'toggleCode',\n isActive: 'code',\n icon: 'code',\n label: 'Code',\n shortcut: 'Mod-E',\n group: 'format',\n priority: 160,\n },\n ];\n },\n\n addInputRules() {\n const markType = this.markType;\n if (!markType) return [];\n\n return [\n // `text`\n markInputRule({\n find: markInputRulePatterns.code,\n type: markType,\n }),\n ];\n },\n});\n\ndeclare module '@domternal/core' {\n interface RawCommands {\n setCode: CommandSpec;\n unsetCode: CommandSpec;\n toggleCode: CommandSpec;\n }\n}\n","/**\n * Link Click Plugin\n *\n * Handles click on links to open them.\n * When editable: opens on click.\n * When read-only: browser handles link clicks natively.\n */\nimport { Plugin, PluginKey, TextSelection } from '@domternal/pm/state';\nimport type { MarkType } from '@domternal/pm/model';\n\n/**\n * Options for the link click plugin\n */\nexport interface LinkClickPluginOptions {\n /**\n * The link mark type\n */\n type: MarkType;\n\n /**\n * When to open links on click\n * - true: Open on click\n * - false: Never open\n * - 'whenNotEditable': Only open when editor is read-only (browser handles natively)\n * @default true\n */\n openOnClick?: boolean | 'whenNotEditable';\n\n /**\n * Select the full link text range when clicking a link\n * @default false\n */\n enableClickSelection?: boolean;\n}\n\n/**\n * Plugin key for link click plugin\n */\nexport const linkClickPluginKey = new PluginKey('linkClick');\n\n/**\n * Creates a plugin that handles clicking on links to open them.\n *\n * @param options - Plugin options\n * @returns ProseMirror Plugin\n */\nexport function linkClickPlugin(options: LinkClickPluginOptions): Plugin {\n const { type, openOnClick = true, enableClickSelection = false } = options;\n\n return new Plugin({\n key: linkClickPluginKey,\n\n props: {\n handleClick(view, _pos, event) {\n // Only left clicks\n if (event.button !== 0) {\n return false;\n }\n\n // When not editable, let browser handle natively (links navigate normally)\n if (!view.editable) {\n return false;\n }\n\n // Find the <a> element from the click target\n let link: HTMLAnchorElement | null = null;\n\n if (event.target instanceof HTMLAnchorElement) {\n link = event.target;\n } else {\n const target = event.target as HTMLElement | null;\n if (!target) {\n return false;\n }\n link = target.closest<HTMLAnchorElement>('a');\n if (link && !view.dom.contains(link)) {\n link = null;\n }\n }\n\n if (!link) {\n return false;\n }\n\n // Select full link range on click\n if (enableClickSelection) {\n const pos = view.posAtDOM(link, 0);\n const $pos = view.state.doc.resolve(pos);\n\n if ($pos.marks().some((m) => m.type === type)) {\n // Find contiguous mark range within the parent text block\n const parent = $pos.parent;\n const blockStart = pos - $pos.parentOffset;\n let rangeStart = pos;\n let rangeEnd = pos;\n\n parent.forEach((child, childOffset) => {\n const childStart = blockStart + childOffset;\n const childEnd = childStart + child.nodeSize;\n if (type.isInSet(child.marks) && childStart <= rangeEnd && childEnd >= rangeStart) {\n rangeStart = Math.min(rangeStart, childStart);\n rangeEnd = Math.max(rangeEnd, childEnd);\n }\n });\n\n const tr = view.state.tr.setSelection(\n TextSelection.create(view.state.doc, rangeStart, rangeEnd)\n );\n view.dispatch(tr);\n return true;\n }\n }\n\n if (openOnClick) {\n // Get href/target from ProseMirror mark (validated by renderHTML), fallback to DOM\n const pos = view.posAtDOM(link, 0);\n const $pos = view.state.doc.resolve(pos);\n const linkMark = $pos.marks().find((m) => m.type === type);\n\n const href = (linkMark?.attrs['href'] as string | undefined) ?? link.href;\n const linkTarget = (linkMark?.attrs['target'] as string | undefined) ?? link.target;\n\n if (href) {\n window.open(href, linkTarget || '_blank');\n return true;\n }\n }\n\n return false;\n },\n },\n });\n}\n","/**\n * Link Paste Plugin\n *\n * Handles pasting URLs:\n * - If text is selected: wraps selection in a link\n * - If no selection: inserts URL as clickable link text\n */\nimport { Plugin, PluginKey } from '@domternal/pm/state';\nimport type { MarkType } from '@domternal/pm/model';\n\n/**\n * Options for the link paste plugin\n */\nexport interface LinkPastePluginOptions {\n /**\n * The link mark type\n */\n type: MarkType;\n\n /**\n * Allowed URL protocols\n * @default ['http:', 'https:']\n */\n protocols?: string[];\n\n /**\n * Custom URL validation function\n * Return false to prevent linking specific URLs\n */\n validate?: (url: string) => boolean;\n}\n\n/**\n * Plugin key for link paste plugin\n */\nexport const linkPastePluginKey = new PluginKey('linkPaste');\n\n/**\n * Creates a plugin that handles pasting URLs.\n *\n * Behavior:\n * - Text selected + paste URL = wrap selection in link\n * - No selection + paste URL = insert URL as link\n *\n * @param options - Plugin options\n * @returns ProseMirror Plugin\n */\nexport function linkPastePlugin(options: LinkPastePluginOptions): Plugin {\n const { type, protocols = ['http:', 'https:'], validate } = options;\n\n return new Plugin({\n key: linkPastePluginKey,\n\n props: {\n handlePaste(view, event) {\n // Get pasted text\n const text = event.clipboardData?.getData('text/plain').trim();\n if (!text) return false;\n\n // Check if pasted text is a URL\n let url: URL;\n try {\n url = new URL(text);\n } catch {\n return false; // Not a URL, let default paste handling continue\n }\n\n // Validate protocol\n if (!protocols.includes(url.protocol)) {\n return false;\n }\n\n // Custom validation\n if (validate && !validate(text)) {\n return false;\n }\n\n const { state, dispatch } = view;\n const { from, to, empty } = state.selection;\n const tr = state.tr;\n\n if (empty) {\n // No selection - insert URL as linked text\n tr.insertText(text, from, to);\n tr.addMark(from, from + text.length, type.create({ href: text }));\n } else {\n // Has selection - wrap selection in link\n tr.addMark(from, to, type.create({ href: text }));\n }\n\n dispatch(tr);\n return true;\n },\n },\n });\n}\n","/**\n * Autolink Plugin\n *\n * Automatically converts typed URLs into clickable links.\n * Triggers when user types a space, punctuation, or presses Enter after a URL.\n * Uses linkifyjs for robust URL detection.\n */\nimport { Plugin, PluginKey } from '@domternal/pm/state';\nimport type { MarkType } from '@domternal/pm/model';\nimport { find } from 'linkifyjs';\n\n/**\n * Options for the autolink plugin\n */\nexport interface AutolinkPluginOptions {\n /**\n * The link mark type\n */\n type: MarkType;\n\n /**\n * Allowed URL protocols\n * @default ['http:', 'https:']\n */\n protocols?: string[];\n\n /**\n * Default protocol to add to bare URLs (e.g., 'example.com' → 'https://example.com')\n * @default 'https'\n */\n defaultProtocol?: string;\n\n /**\n * Custom validation function\n * Return false to prevent auto-linking specific URLs\n */\n shouldAutoLink?: (url: string) => boolean;\n}\n\n/**\n * Plugin key for autolink plugin\n */\nexport const autolinkPluginKey = new PluginKey('autolink');\n\n/**\n * Characters that trigger autolink detection\n */\nconst TRIGGER_CHARS = /[\\s.,!?;:\\n]/;\n\n/**\n * Creates a plugin that auto-converts typed URLs to links.\n *\n * When user types a URL followed by space/punctuation, the URL\n * is automatically wrapped in a link mark.\n *\n * @param options - Plugin options\n * @returns ProseMirror Plugin\n */\nexport function autolinkPlugin(options: AutolinkPluginOptions): Plugin {\n const {\n type,\n protocols = ['http:', 'https:'],\n defaultProtocol = 'https',\n shouldAutoLink,\n } = options;\n\n return new Plugin({\n key: autolinkPluginKey,\n\n props: {\n handleTextInput(view, from, to, text) {\n // Only trigger on space, punctuation, or newline\n if (!TRIGGER_CHARS.test(text)) {\n return false;\n }\n\n const { state } = view;\n const $from = state.doc.resolve(from);\n\n // Get text before cursor in current text block\n const textBefore = $from.parent.textBetween(\n Math.max(0, $from.parentOffset - 500), // Look back max 500 chars\n $from.parentOffset,\n undefined,\n '\\ufffc'\n );\n\n // Use linkifyjs to find URLs in the text\n const matches = find(textBefore, {\n defaultProtocol: defaultProtocol as 'http' | 'https',\n });\n\n // Get the last match (most recent URL)\n const lastMatch = matches[matches.length - 1];\n if (!lastMatch) {\n return false;\n }\n\n // Only process URL types (not email, etc.)\n if (lastMatch.type !== 'url') {\n return false;\n }\n\n // Check if URL ends right before the trigger character\n if (lastMatch.end !== textBefore.length) {\n return false;\n }\n\n const href = lastMatch.href;\n\n // Validate protocol\n try {\n const url = new URL(href);\n if (!protocols.includes(url.protocol)) {\n return false;\n }\n } catch {\n return false;\n }\n\n // Custom validation\n if (shouldAutoLink && !shouldAutoLink(href)) {\n return false;\n }\n\n // Calculate positions in document\n const blockStart = from - $from.parentOffset;\n const linkStart = blockStart + lastMatch.start;\n const linkEnd = blockStart + lastMatch.end;\n\n // Check if already has link mark\n const $linkStart = state.doc.resolve(linkStart);\n if ($linkStart.marks().some((m) => m.type === type)) {\n return false;\n }\n\n // Apply link mark and insert trigger character\n const tr = state.tr;\n tr.addMark(linkStart, linkEnd, type.create({ href }));\n tr.insertText(text, from, to);\n\n view.dispatch(tr);\n return true;\n },\n },\n });\n}\n","/**\n * Link Exit Plugin\n *\n * Allows users to \"exit\" a link mark by pressing ArrowRight at the\n * end of the link. After exiting, newly typed text will not have\n * the link mark applied.\n *\n * Enabled when the Link mark has `exitable: true` configured.\n */\nimport { Plugin, PluginKey, TextSelection } from '@domternal/pm/state';\nimport type { MarkType } from '@domternal/pm/model';\n\n/**\n * Options for the link exit plugin\n */\nexport interface LinkExitPluginOptions {\n /**\n * The link mark type\n */\n type: MarkType;\n}\n\n/**\n * Plugin key for link exit plugin\n */\nexport const linkExitPluginKey = new PluginKey('linkExit');\n\n/**\n * Creates a plugin that allows exiting a link mark with ArrowRight.\n *\n * When the cursor is at the end boundary of a link mark (the next\n * character has no link mark, or there is no next character), pressing\n * ArrowRight will set storedMarks to exclude the link mark. This means\n * any text typed after will not be linked.\n *\n * @param options - Plugin options\n * @returns ProseMirror Plugin\n */\nexport function linkExitPlugin(options: LinkExitPluginOptions): Plugin {\n const { type } = options;\n\n return new Plugin({\n key: linkExitPluginKey,\n\n props: {\n handleKeyDown(view, event) {\n if (event.key !== 'ArrowRight') return false;\n\n const { state } = view;\n const { selection } = state;\n\n // Only handle cursor (collapsed) selections\n if (!(selection instanceof TextSelection) || !selection.empty) {\n return false;\n }\n\n const $cursor = selection.$cursor;\n if (!$cursor) return false;\n\n // Check the node before cursor for the link mark.\n // We use nodeBefore.marks instead of $cursor.marks() because\n // nodeBefore always reflects the actual marks on the text node,\n // regardless of the mark's inclusive setting.\n const nodeBefore = $cursor.nodeBefore;\n if (!nodeBefore) return false;\n\n const marksOnNode = nodeBefore.marks;\n const hasLink = marksOnNode.some((m) => m.type === type);\n if (!hasLink) return false;\n\n // Check if we're at the end of the mark range:\n // The next character either doesn't exist or doesn't have the link mark\n const after = $cursor.nodeAfter;\n const afterHasLink = after?.marks.some((m) => m.type === type) ?? false;\n\n if (!afterHasLink) {\n // We're at the boundary - strip link from storedMarks\n const marksWithoutLink = marksOnNode.filter((m) => m.type !== type);\n const tr = state.tr.setStoredMarks(marksWithoutLink);\n view.dispatch(tr);\n // Don't prevent default - let ArrowRight move cursor normally\n return false;\n }\n\n return false;\n },\n },\n });\n}\n","/**\n * Hyperlink mark with `href` and `target` attributes.\n */\nimport { Plugin, PluginKey, TextSelection } from '@domternal/pm/state';\nimport { Mark } from '../Mark.js';\nimport type { CommandSpec } from '../types/Commands.js';\nimport { isValidUrl } from '../helpers/isValidUrl.js';\nimport { getMarkRange } from '../helpers/getMarkRange.js';\nimport { linkClickPlugin } from './helpers/linkClickPlugin.js';\nimport { linkPastePlugin } from './helpers/linkPastePlugin.js';\nimport { autolinkPlugin } from './helpers/autolinkPlugin.js';\nimport { linkExitPlugin } from './helpers/linkExitPlugin.js';\nimport type { Editor } from '../Editor.js';\nimport type { ToolbarItem } from '../types/Toolbar.js';\n\nexport interface LinkOptions {\n /**\n * HTML attributes to add to the rendered element\n */\n HTMLAttributes: Record<string, unknown>;\n /**\n * List of allowed URL protocols\n * @default ['http:', 'https:', 'mailto:', 'tel:']\n */\n protocols: string[];\n /**\n * When to open links on click\n * - true: Open on click (when editable)\n * - false: Never open\n * - 'whenNotEditable': Only open when editor is read-only\n * @default true\n */\n openOnClick: boolean | 'whenNotEditable';\n /**\n * Whether to add rel=\"noopener noreferrer\" to links\n * @default true\n */\n addRelNoopener: boolean;\n /**\n * Auto-convert typed URLs to links\n * @default true\n */\n autolink: boolean;\n /**\n * Convert pasted URLs to links (wraps selection or inserts as link)\n * @default true\n */\n linkOnPaste: boolean;\n /**\n * Default protocol for bare URLs (e.g., 'example.com' → 'https://example.com')\n * @default 'https'\n */\n defaultProtocol: string;\n /**\n * Custom validation for autolink\n * Return false to prevent auto-linking specific URLs\n */\n shouldAutoLink?: (url: string) => boolean;\n /**\n * Select the full link text range when clicking a link\n * @default false\n */\n enableClickSelection: boolean;\n}\n\n/**\n * Attributes for the Link mark\n */\nexport interface LinkAttributes {\n href: string;\n target?: string | null;\n rel?: string | null;\n title?: string | null;\n class?: string | null;\n}\n\n/**\n * Link mark for hyperlinks\n */\nexport const Link = Mark.create<LinkOptions>({\n name: 'link',\n\n // Links are semantic data, not visual formatting.\n // They survive `unsetAllMarks` (clear formatting).\n // Override with: Link.configure({ isFormatting: true })\n isFormatting: false,\n\n // Links have lower priority than other marks\n priority: 1000,\n\n // When autolink is enabled, the mark is inclusive so that typing at\n // the end of a link naturally extends it (e.g. adding path segments\n // to an autolinked URL). When autolink is off, links are set manually\n // and should not extend on typing.\n inclusive() {\n return this.options.autolink;\n },\n\n addOptions(): LinkOptions {\n return {\n HTMLAttributes: {},\n protocols: ['http:', 'https:', 'mailto:', 'tel:'],\n openOnClick: true,\n addRelNoopener: true,\n autolink: true,\n linkOnPaste: true,\n defaultProtocol: 'https',\n enableClickSelection: false,\n };\n },\n\n addAttributes() {\n return {\n href: {\n default: null,\n },\n target: {\n default: null,\n },\n rel: {\n default: null,\n },\n title: {\n default: null,\n },\n class: {\n default: null,\n },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: 'a[href]',\n getAttrs: (node) => {\n if (typeof node === 'string') return false;\n const href = node.getAttribute('href');\n\n // Validate URL\n if (!href || !isValidUrl(href, { protocols: this.options.protocols })) {\n return false;\n }\n\n return {\n href,\n target: node.getAttribute('target'),\n rel: node.getAttribute('rel'),\n title: node.getAttribute('title'),\n class: node.getAttribute('class'),\n };\n },\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n const attrs = { ...this.options.HTMLAttributes, ...HTMLAttributes };\n\n // Validate href before rendering\n if (\n typeof attrs['href'] === 'string' &&\n !isValidUrl(attrs['href'], { protocols: this.options.protocols })\n ) {\n // Remove the href if invalid, keeping other attributes\n const { href: _, ...rest } = attrs;\n return ['a', rest, 0];\n }\n\n // Add rel=\"noopener noreferrer\" for external links\n if (\n this.options.addRelNoopener &&\n attrs['target'] === '_blank' &&\n !attrs['rel']\n ) {\n attrs['rel'] = 'noopener noreferrer';\n }\n\n return ['a', attrs, 0];\n },\n\n addCommands() {\n return {\n setLink:\n (attributes: LinkAttributes) =>\n ({ commands }) => {\n if (!isValidUrl(attributes.href, { protocols: this.options.protocols })) {\n return false;\n }\n return commands.setMark('link', attributes);\n },\n unsetLink:\n () =>\n ({ tr, state, dispatch }) => {\n const markType = state.schema.marks['link'];\n if (!markType) return false;\n\n const { empty, ranges } = tr.selection;\n\n if (empty) {\n // Extend to full link range around cursor\n const $pos = tr.doc.resolve(tr.selection.from);\n const range = getMarkRange($pos, markType);\n if (!range) return false;\n if (!dispatch) return true;\n tr.removeMark(range.from, range.to, markType);\n } else {\n // Check that at least one text node in the selection is in a context that allows links.\n // This correctly handles CellSelection (multiple ranges) and code blocks (marks: '').\n const ctx = { hasApplicableText: false };\n for (const range of ranges) {\n tr.doc.nodesBetween(range.$from.pos, range.$to.pos, (node, _pos, parent) => {\n if (node.isText && parent?.type.allowsMarkType(markType)\n && !node.marks.some((m) => m.type.excludes(markType) && m.type !== markType)) {\n ctx.hasApplicableText = true;\n }\n });\n }\n if (!ctx.hasApplicableText) return false;\n if (!dispatch) return true;\n // Iterate over selection ranges (handles CellSelection with multiple ranges)\n for (const range of ranges) {\n tr.removeMark(range.$from.pos, range.$to.pos, markType);\n }\n }\n\n dispatch(tr);\n return true;\n },\n toggleLink:\n (attributes: LinkAttributes) =>\n ({ tr, state, dispatch }) => {\n if (!isValidUrl(attributes.href, { protocols: this.options.protocols })) {\n return false;\n }\n\n const markType = state.schema.marks['link'];\n if (!markType) return false;\n\n const { empty, ranges } = tr.selection;\n\n if (empty) {\n // Extend to full link range around cursor\n const $pos = tr.doc.resolve(tr.selection.from);\n const range = getMarkRange($pos, markType);\n\n if (range && tr.doc.rangeHasMark(range.from, range.to, markType)) {\n // Has link - remove it from the full range\n if (!dispatch) return true;\n tr.removeMark(range.from, range.to, markType);\n } else {\n // No link - toggle stored mark for cursor\n if (!dispatch) return true;\n const cursorMarks = tr.storedMarks ?? state.storedMarks ?? $pos.marks();\n if (markType.isInSet(cursorMarks)) {\n tr.removeStoredMark(markType);\n } else {\n tr.addStoredMark(markType.create(attributes));\n }\n }\n } else {\n if (!dispatch) return true;\n // Iterate over selection ranges (handles CellSelection with multiple ranges)\n const hasMark = ranges.every(range =>\n tr.doc.rangeHasMark(range.$from.pos, range.$to.pos, markType),\n );\n for (const range of ranges) {\n if (hasMark) {\n tr.removeMark(range.$from.pos, range.$to.pos, markType);\n } else {\n tr.addMark(range.$from.pos, range.$to.pos, markType.create(attributes));\n }\n }\n }\n\n dispatch(tr);\n return true;\n },\n };\n },\n\n addKeyboardShortcuts() {\n return {\n 'Mod-k': () => {\n (this.editor as unknown as Editor).emit('linkEdit', {});\n return true;\n },\n };\n },\n\n addToolbarItems(): ToolbarItem[] {\n return [\n {\n type: 'button',\n name: 'link',\n command: 'unsetLink',\n emitEvent: 'linkEdit',\n isActive: 'link',\n icon: 'link',\n label: 'Link',\n shortcut: 'Mod-K',\n group: 'format',\n priority: 120,\n },\n ];\n },\n\n addProseMirrorPlugins() {\n const markType = this.markType;\n if (!markType) return [];\n\n const plugins = [];\n\n // Click plugin - always added (handles link opening on click)\n // 'whenNotEditable' → true: browser handles read-only links natively\n plugins.push(\n linkClickPlugin({\n type: markType,\n openOnClick: this.options.openOnClick === 'whenNotEditable'\n ? true\n : this.options.openOnClick,\n enableClickSelection: this.options.enableClickSelection,\n })\n );\n\n // Paste plugin - wraps selection or inserts URL as link\n if (this.options.linkOnPaste) {\n plugins.push(\n linkPastePlugin({\n type: markType,\n protocols: this.options.protocols,\n })\n );\n }\n\n // Exit plugin - ArrowRight at end of link exits the mark\n plugins.push(linkExitPlugin({ type: markType }));\n\n // keepOnSplit: strip link from storedMarks after a block split so that\n // pressing Enter at the end of a link does not carry it to the new line.\n plugins.push(\n new Plugin({\n key: new PluginKey('linkKeepOnSplit'),\n appendTransaction(transactions, _oldState, newState) {\n const docChanged = transactions.some((tr) => tr.docChanged);\n if (!docChanged) return null;\n\n const { selection } = newState;\n if (!(selection instanceof TextSelection) || !selection.empty) return null;\n\n const $cursor = selection.$cursor;\n if ($cursor?.parentOffset !== 0) return null;\n\n const stored = newState.storedMarks;\n if (!stored) return null;\n\n const hasLink = stored.some((m) => m.type === markType);\n if (!hasLink) return null;\n\n return newState.tr.setStoredMarks(stored.filter((m) => m.type !== markType));\n },\n })\n );\n\n // Autolink plugin - converts typed URLs to links\n if (this.options.autolink) {\n plugins.push(\n autolinkPlugin({\n type: markType,\n protocols: this.options.protocols,\n defaultProtocol: this.options.defaultProtocol,\n ...(this.options.shouldAutoLink && {\n shouldAutoLink: this.options.shouldAutoLink,\n }),\n })\n );\n }\n\n return plugins;\n },\n});\n\ndeclare module '@domternal/core' {\n interface RawCommands {\n setLink: CommandSpec<[attributes: LinkAttributes]>;\n unsetLink: CommandSpec;\n toggleLink: CommandSpec<[attributes: LinkAttributes]>;\n }\n}\n","/**\n * Subscript Mark\n *\n * Applies subscript formatting to text (e.g., H₂O).\n *\n * @example\n * ```ts\n * import { Subscript } from '@domternal/core';\n *\n * const editor = new Editor({\n * extensions: [Document, Paragraph, Text, Subscript],\n * });\n *\n * // Toggle subscript with keyboard shortcut: Mod-,\n * ```\n */\nimport { Mark } from '../Mark.js';\nimport type { CommandSpec } from '../types/Commands.js';\nimport type { ToolbarItem } from '../types/Toolbar.js';\n\n/**\n * Options for the Subscript mark\n */\nexport interface SubscriptOptions {\n /**\n * HTML attributes to add to the rendered element\n */\n HTMLAttributes: Record<string, unknown>;\n}\n\n/**\n * Subscript mark for text formatting\n */\nexport const Subscript = Mark.create<SubscriptOptions>({\n name: 'subscript',\n\n // Mutual exclusion handled in toggle commands (not schema)\n // so can() dry-run works correctly for toolbar disabled state\n excludes: '',\n\n addOptions() {\n return {\n HTMLAttributes: {},\n };\n },\n\n parseHTML() {\n return [\n { tag: 'sub' },\n {\n style: 'vertical-align',\n getAttrs: (value) => {\n if (typeof value !== 'string') return false;\n return value === 'sub' ? {} : false;\n },\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['sub', { ...this.options.HTMLAttributes, ...HTMLAttributes }, 0];\n },\n\n addKeyboardShortcuts() {\n return {\n 'Mod-,': () => this.editor?.commands['toggleSubscript']?.() ?? false,\n };\n },\n\n addCommands() {\n return {\n setSubscript:\n () =>\n ({ commands }) => {\n commands.unsetMark('superscript');\n return commands.setMark('subscript');\n },\n unsetSubscript:\n () =>\n ({ commands }) => commands.unsetMark('subscript'),\n toggleSubscript:\n () =>\n ({ commands }) => {\n commands.unsetMark('superscript');\n return commands.toggleMark('subscript');\n },\n };\n },\n addToolbarItems(): ToolbarItem[] {\n return [\n {\n type: 'button',\n name: 'subscript',\n command: 'toggleSubscript',\n isActive: 'subscript',\n icon: 'textSubscript',\n label: 'Subscript',\n shortcut: 'Mod-,',\n group: 'format',\n priority: 140,\n },\n ];\n },\n});\n\ndeclare module '@domternal/core' {\n interface RawCommands {\n setSubscript: CommandSpec;\n unsetSubscript: CommandSpec;\n toggleSubscript: CommandSpec;\n }\n}\n","/**\n * Superscript Mark\n *\n * Applies superscript formatting to text (e.g., x²).\n *\n * @example\n * ```ts\n * import { Superscript } from '@domternal/core';\n *\n * const editor = new Editor({\n * extensions: [Document, Paragraph, Text, Superscript],\n * });\n *\n * // Toggle superscript with keyboard shortcut: Mod-.\n * ```\n */\nimport { Mark } from '../Mark.js';\nimport type { CommandSpec } from '../types/Commands.js';\nimport type { ToolbarItem } from '../types/Toolbar.js';\n\n/**\n * Options for the Superscript mark\n */\nexport interface SuperscriptOptions {\n /**\n * HTML attributes to add to the rendered element\n */\n HTMLAttributes: Record<string, unknown>;\n}\n\n/**\n * Superscript mark for text formatting\n */\nexport const Superscript = Mark.create<SuperscriptOptions>({\n name: 'superscript',\n\n // Mutual exclusion handled in toggle commands (not schema)\n // so can() dry-run works correctly for toolbar disabled state\n excludes: '',\n\n addOptions() {\n return {\n HTMLAttributes: {},\n };\n },\n\n parseHTML() {\n return [\n { tag: 'sup' },\n {\n style: 'vertical-align',\n getAttrs: (value) => {\n if (typeof value !== 'string') return false;\n return value === 'super' ? {} : false;\n },\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['sup', { ...this.options.HTMLAttributes, ...HTMLAttributes }, 0];\n },\n\n addKeyboardShortcuts() {\n return {\n 'Mod-.': () => this.editor?.commands['toggleSuperscript']?.() ?? false,\n };\n },\n\n addCommands() {\n return {\n setSuperscript:\n () =>\n ({ commands }) => {\n commands.unsetMark('subscript');\n return commands.setMark('superscript');\n },\n unsetSuperscript:\n () =>\n ({ commands }) => commands.unsetMark('superscript'),\n toggleSuperscript:\n () =>\n ({ commands }) => {\n commands.unsetMark('subscript');\n return commands.toggleMark('superscript');\n },\n };\n },\n addToolbarItems(): ToolbarItem[] {\n return [\n {\n type: 'button',\n name: 'superscript',\n command: 'toggleSuperscript',\n isActive: 'superscript',\n icon: 'textSuperscript',\n label: 'Superscript',\n shortcut: 'Mod-.',\n group: 'format',\n priority: 130,\n },\n ];\n },\n});\n\ndeclare module '@domternal/core' {\n interface RawCommands {\n setSuperscript: CommandSpec;\n unsetSuperscript: CommandSpec;\n toggleSuperscript: CommandSpec;\n }\n}\n","/**\n * TextStyle Mark\n *\n * A \"carrier mark\" for inline text styling. This mark itself has no attributes,\n * but other extensions (TextColor, FontFamily, FontSize) can inject attributes\n * into it via addGlobalAttributes.\n *\n * @example\n * ```ts\n * import { TextStyle, TextColor, FontFamily } from '@domternal/core';\n *\n * const editor = new Editor({\n * extensions: [\n * // ... other extensions\n * TextStyle,\n * TextColor,\n * FontFamily.configure({ fontFamilies: ['Arial', 'Times New Roman'] }),\n * ],\n * });\n *\n * editor.commands.setTextColor('#ff0000');\n * editor.commands.setFontFamily('Arial');\n * ```\n */\nimport { Mark } from '../Mark.js';\nimport type { CommandSpec } from '../types/Commands.js';\n\nexport interface TextStyleOptions {\n /**\n * HTML attributes to add to the rendered element.\n * @default {}\n */\n HTMLAttributes: Record<string, unknown>;\n}\n\nexport const TextStyle = Mark.create<TextStyleOptions>({\n name: 'textStyle',\n\n // Lower priority so it renders after other marks\n priority: 101,\n\n addOptions() {\n return {\n HTMLAttributes: {},\n };\n },\n\n parseHTML() {\n return [\n {\n tag: 'span',\n getAttrs: (element) => {\n if (typeof element === 'string') return false;\n // Accept spans carrying styling: either inline CSS, or named color\n // tokens (data-text-color / data-bg-color) written by token-based\n // pickers such as NotionColorPicker.\n const hasStyles = element.hasAttribute('style');\n const hasColorTokens =\n element.hasAttribute('data-text-color') ||\n element.hasAttribute('data-bg-color');\n if (!hasStyles && !hasColorTokens) return false;\n return {};\n },\n },\n // Parse <mark> elements as textStyle (Highlight extension adds backgroundColor attribute)\n { tag: 'mark' },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['span', { ...this.options.HTMLAttributes, ...HTMLAttributes }, 0];\n },\n\n addCommands() {\n return {\n setTextStyle:\n (attributes: Record<string, unknown>) =>\n ({ commands }) => commands.setMark('textStyle', attributes),\n\n removeTextStyle:\n () =>\n ({ commands }) => commands.unsetMark('textStyle'),\n\n removeEmptyTextStyle:\n () =>\n ({ state, tr, dispatch }) => {\n const { from, to, empty } = tr.selection;\n const markType = this.markType;\n\n if (!markType) return false;\n\n // For empty selection, check stored marks - setMark on empty selection\n // only modifies stored marks, so the document still has the old mark.\n // An empty textStyle stored mark (all attrs null) would cause future\n // typed text to get a meaningless <span> wrapper.\n if (empty) {\n const storedMarks = tr.storedMarks ?? state.storedMarks;\n if (storedMarks) {\n const storedTextStyle = storedMarks.find(m => m.type === markType);\n if (storedTextStyle) {\n const hasNonNullAttr = Object.values(storedTextStyle.attrs).some(\n (val) => val !== null && val !== undefined\n );\n if (!hasNonNullAttr) {\n if (dispatch) {\n tr.removeStoredMark(markType);\n dispatch(tr);\n }\n return true;\n }\n }\n }\n return false;\n }\n\n // Non-empty selection: check document marks\n let hasEmptyTextStyle = false;\n\n tr.doc.nodesBetween(from, to, (node) => {\n const textStyleMark = node.marks.find(\n (mark) => mark.type.name === this.name\n );\n if (textStyleMark) {\n const hasNonNullAttr = Object.values(textStyleMark.attrs).some(\n (val) => val !== null && val !== undefined\n );\n if (!hasNonNullAttr) {\n hasEmptyTextStyle = true;\n }\n }\n });\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (!hasEmptyTextStyle) return false;\n\n if (dispatch) {\n // Only remove textStyle from nodes where ALL attributes are null.\n // A blanket tr.removeMark(from, to) would also strip marks that\n // have active attributes (e.g. color) on adjacent nodes.\n tr.doc.nodesBetween(from, to, (node, pos) => {\n const mark = node.marks.find(m => m.type === markType);\n if (mark) {\n const hasActiveAttr = Object.values(mark.attrs).some(\n v => v !== null && v !== undefined,\n );\n if (!hasActiveAttr) {\n const nodeFrom = Math.max(pos, from);\n const nodeTo = Math.min(pos + node.nodeSize, to);\n tr.removeMark(nodeFrom, nodeTo, markType);\n }\n }\n });\n dispatch(tr);\n }\n\n return true;\n },\n };\n },\n});\n\ndeclare module '@domternal/core' {\n interface RawCommands {\n setTextStyle: CommandSpec<[attributes: Record<string, unknown>]>;\n removeTextStyle: CommandSpec;\n removeEmptyTextStyle: CommandSpec;\n }\n}\n","/**\n * BaseKeymap Extension\n *\n * Adds essential keyboard shortcuts for basic editing operations.\n * This includes Enter (new paragraph), Backspace, Delete, and other\n * fundamental editing commands from ProseMirror's baseKeymap.\n *\n * @example\n * ```ts\n * import { BaseKeymap } from '@domternal/core';\n *\n * const editor = new Editor({\n * extensions: [Document, Paragraph, Text, BaseKeymap],\n * });\n * ```\n *\n * ## Included Shortcuts\n * - Enter: Create new paragraph / split block\n * - Backspace: Delete backward\n * - Delete: Delete forward\n * - Mod-Backspace: Delete to start of line\n * - Mod-Delete: Delete to end of line\n * - Alt-ArrowUp/Down: Join with block above/below\n * - Mod-a: Select all\n * - And more standard editing commands\n */\nimport { Extension } from '../Extension.js';\nimport { keymap } from '@domternal/pm/keymap';\nimport {\n baseKeymap,\n chainCommands,\n createParagraphNear,\n liftEmptyBlock,\n newlineInCode,\n splitBlock,\n} from '@domternal/pm/commands';\nimport type { Command } from '@domternal/pm/state';\n\nexport interface BaseKeymapOptions {\n /**\n * Whether to include the default Enter behavior.\n * @default true\n */\n enter: boolean;\n}\n\n// Enhanced Enter command that handles more cases\nconst enterCommand: Command = chainCommands(\n newlineInCode,\n createParagraphNear,\n liftEmptyBlock,\n splitBlock\n);\n\nexport const BaseKeymap = Extension.create<BaseKeymapOptions>({\n name: 'baseKeymap',\n\n addOptions() {\n return {\n enter: true,\n };\n },\n\n addProseMirrorPlugins() {\n const bindings = { ...baseKeymap };\n\n // Override Enter with our enhanced version if enabled\n if (this.options.enter) {\n bindings['Enter'] = enterCommand;\n }\n\n return [keymap(bindings)];\n },\n});\n","/**\n * History Extension\n *\n * Provides undo/redo functionality using prosemirror-history.\n */\nimport { history, undo, redo } from '@domternal/pm/history';\nimport { Extension } from '../Extension.js';\nimport type { CommandSpec } from '../types/Commands.js';\nimport type { ToolbarItem } from '../types/Toolbar.js';\n\ndeclare module '@domternal/core' {\n interface RawCommands {\n undo: CommandSpec;\n redo: CommandSpec;\n }\n}\n\nexport interface HistoryOptions {\n /**\n * Maximum number of undo steps to keep in history.\n * @default 100\n */\n depth: number;\n\n /**\n * Time in milliseconds to group changes into a single undo step.\n * Changes within this delay will be combined.\n * @default 500\n */\n newGroupDelay: number;\n}\n\nexport const History = Extension.create<HistoryOptions>({\n name: 'history',\n\n addOptions() {\n return {\n depth: 100,\n newGroupDelay: 500,\n };\n },\n\n addCommands() {\n return {\n undo:\n () =>\n ({ state, dispatch }) =>\n undo(state, dispatch),\n\n redo:\n () =>\n ({ state, dispatch }) =>\n redo(state, dispatch),\n };\n },\n\n addToolbarItems(): ToolbarItem[] {\n return [\n {\n type: 'button',\n name: 'undo',\n command: 'undo',\n icon: 'arrowCounterClockwise',\n label: 'Undo',\n shortcut: 'Mod-Z',\n group: 'history',\n priority: 200,\n },\n {\n type: 'button',\n name: 'redo',\n command: 'redo',\n icon: 'arrowClockwise',\n label: 'Redo',\n shortcut: 'Mod-Shift-Z',\n group: 'history',\n priority: 190,\n },\n ];\n },\n\n addKeyboardShortcuts() {\n return {\n 'Mod-z': () => this.editor?.commands.undo() ?? false,\n 'Mod-Shift-z': () => this.editor?.commands.redo() ?? false,\n 'Mod-y': () => this.editor?.commands.redo() ?? false,\n };\n },\n\n addProseMirrorPlugins() {\n return [\n history({\n depth: this.options.depth,\n newGroupDelay: this.options.newGroupDelay,\n }),\n ];\n },\n});\n","/**\n * Dropcursor Extension\n *\n * Shows a visual indicator when dragging content to help users\n * see where the content will be dropped.\n */\nimport { dropCursor } from '@domternal/pm/dropcursor';\nimport { Extension } from '../Extension.js';\n\nexport interface DropcursorOptions {\n /**\n * Color of the drop cursor line.\n * @default 'currentColor'\n */\n color: string;\n\n /**\n * Width of the drop cursor line in pixels.\n * @default 1\n */\n width: number;\n\n /**\n * CSS class to add to the drop cursor element.\n * @default undefined\n */\n class?: string;\n}\n\nexport const Dropcursor = Extension.create<DropcursorOptions>({\n name: 'dropcursor',\n\n addOptions() {\n return {\n color: 'currentColor',\n width: 1,\n };\n },\n\n addProseMirrorPlugins() {\n return [\n dropCursor({\n color: this.options.color,\n width: this.options.width,\n ...(this.options.class ? { class: this.options.class } : {}),\n }),\n ];\n },\n});\n","/**\n * Gapcursor Extension\n *\n * Allows cursor to be placed in positions that normally wouldn't accept text,\n * like before/after tables or other block nodes.\n */\nimport { gapCursor } from '@domternal/pm/gapcursor';\nimport { Extension } from '../Extension.js';\n\nexport const Gapcursor = Extension.create({\n name: 'gapcursor',\n\n addProseMirrorPlugins() {\n return [gapCursor()];\n },\n});\n","/**\n * TrailingNode Extension\n *\n * Ensures there's always a trailing node (usually paragraph) at the end\n * of the document, making it easier to type after block elements like\n * code blocks, images, or tables.\n */\nimport { Plugin, PluginKey } from '@domternal/pm/state';\nimport type { NodeType } from '@domternal/pm/model';\nimport { Extension } from '../Extension.js';\n\nexport interface TrailingNodeOptions {\n /**\n * The node type name to insert as trailing node.\n * @default 'paragraph'\n */\n node: string;\n\n /**\n * Node types after which a trailing node should NOT be added.\n * Typically includes the trailing node type itself.\n * @default ['paragraph']\n */\n notAfter: string[];\n}\n\nconst trailingNodeKey = new PluginKey('trailingNode');\n\nexport const TrailingNode = Extension.create<TrailingNodeOptions>({\n name: 'trailingNode',\n\n addOptions() {\n return {\n node: 'paragraph',\n notAfter: ['paragraph'],\n };\n },\n\n addProseMirrorPlugins(): Plugin[] {\n const { node: nodeName, notAfter } = this.options;\n const ignoredNames = new Set([...notAfter, nodeName]);\n let type: NodeType;\n let triggerTypes: NodeType[];\n\n return [\n new Plugin({\n key: trailingNodeKey,\n appendTransaction(_, __, state) {\n if (!trailingNodeKey.getState(state)) return;\n return state.tr.insert(state.doc.content.size, type.create());\n },\n state: {\n init(_, { doc, schema }) {\n const nodeType = schema.nodes[nodeName];\n if (!nodeType) {\n throw new Error(`TrailingNode: invalid node type '${nodeName}'`);\n }\n type = nodeType;\n triggerTypes = Object.values(schema.nodes)\n .filter((n) => !ignoredNames.has(n.name));\n const lastType = doc.lastChild?.type;\n return !!lastType && triggerTypes.includes(lastType);\n },\n apply(tr, value) {\n if (!tr.docChanged) return value;\n const lastType = tr.doc.lastChild?.type;\n return !!lastType && triggerTypes.includes(lastType);\n },\n },\n }),\n ];\n },\n});\n","/**\n * Placeholder Extension\n *\n * Shows placeholder text when the editor is empty.\n * Supports both static and dynamic (function-based) placeholders.\n */\nimport { Plugin, PluginKey } from '@domternal/pm/state';\nimport { Decoration, DecorationSet } from '@domternal/pm/view';\nimport type { Node as PMNode } from '@domternal/pm/model';\nimport { Extension } from '../Extension.js';\n\nexport interface PlaceholderOptions {\n /**\n * Placeholder text to show. Can be a string or function for per-node placeholders.\n * @default 'Write something …'\n */\n placeholder: string | ((props: { node: PMNode; pos: number }) => string);\n\n /**\n * Only show placeholder when editor is editable.\n * @default true\n */\n showOnlyWhenEditable: boolean;\n\n /**\n * CSS class applied to empty nodes.\n * @default 'is-empty'\n */\n emptyNodeClass: string;\n\n /**\n * CSS class applied when entire editor is empty.\n * @default 'is-editor-empty'\n */\n emptyEditorClass: string;\n\n /**\n * Show placeholder only in the currently focused/selected node.\n * @default true\n */\n showOnlyCurrent: boolean;\n\n /**\n * Include children when checking if a node is empty.\n * @default false\n */\n includeChildren: boolean;\n}\n\nexport const placeholderPluginKey = new PluginKey('placeholder');\n\nexport const Placeholder = Extension.create<PlaceholderOptions>({\n name: 'placeholder',\n\n addOptions() {\n return {\n placeholder: 'Write something …',\n showOnlyWhenEditable: true,\n emptyNodeClass: 'is-empty',\n emptyEditorClass: 'is-editor-empty',\n showOnlyCurrent: true,\n includeChildren: false,\n };\n },\n\n addProseMirrorPlugins() {\n return [\n new Plugin({\n key: placeholderPluginKey,\n props: {\n decorations: ({ doc, selection }) => {\n const editor = this.editor;\n if (!editor?.view) return DecorationSet.empty;\n const isEditable = editor.view.editable;\n\n if (!isEditable && this.options.showOnlyWhenEditable) {\n return DecorationSet.empty;\n }\n\n // Check if document is empty (for editor-level class)\n const isDocEmpty =\n doc.childCount === 1 &&\n doc.firstChild?.isTextblock &&\n doc.firstChild.content.size === 0;\n\n const { includeChildren, showOnlyCurrent, emptyNodeClass, emptyEditorClass } = this.options;\n\n const isNodeEmpty = (node: PMNode): boolean =>\n includeChildren\n ? node.content.size === 0\n : node.childCount === 0 ||\n (node.childCount === 1 &&\n !!node.firstChild?.isText &&\n !node.firstChild.text);\n\n const getPlaceholderText = (node: PMNode, pos: number): string =>\n typeof this.options.placeholder === 'function'\n ? this.options.placeholder({ node, pos })\n : this.options.placeholder;\n\n const makeDecoration = (node: PMNode, pos: number): Decoration =>\n Decoration.node(pos, pos + node.nodeSize, {\n class: `${emptyNodeClass}${isDocEmpty ? ` ${emptyEditorClass}` : ''}`,\n 'data-placeholder': getPlaceholderText(node, pos),\n });\n\n // Fast path: showOnlyCurrent (default) - O(1), check only the anchor node\n if (showOnlyCurrent) {\n const { $anchor } = selection;\n if ($anchor.depth === 0) return DecorationSet.empty;\n const node = $anchor.parent;\n if (!node.isTextblock || !isNodeEmpty(node)) return DecorationSet.empty;\n const pos = $anchor.before($anchor.depth);\n return DecorationSet.create(doc, [makeDecoration(node, pos)]);\n }\n\n // Slow path: show placeholder in all empty textblocks\n const decorations: Decoration[] = [];\n doc.descendants((node, pos) => {\n if (!node.isTextblock) return;\n if (!isNodeEmpty(node)) return;\n decorations.push(makeDecoration(node, pos));\n });\n\n return DecorationSet.create(doc, decorations);\n },\n },\n }),\n ];\n },\n});\n","/**\n * Keyboard indent across list boundaries. `Tab` on a top-level block whose\n * previous sibling is a list moves the block INTO the last item as a nested\n * child; `Shift-Tab` reverses for a block sitting as the last child of the\n * last item.\n *\n * Trigger is intentionally narrow so ListKeymap retains in-list Tab/Shift-Tab\n * (`sinkListItem` / `liftListItem`). Schema is validated via `canReplaceWith`;\n * invalid placements are a clean no-op so the keymap chain falls through.\n *\n * Intentional design restrictions (NOT bugs to \"fix\"):\n * - Tab indents into the IMMEDIATE last item only, not recursively into a\n * deeper \"deepest last item\". Users get deeper nesting via repeated Tab\n * inside the now-nested context (then ListKeymap takes over).\n * - Tab only fires for cursors in TOP-LEVEL blocks (depth === 1). Cursors\n * inside other containers (blockquote, table cell) fall through.\n * - Shift-Tab only fires when the block is BOTH the last child of its\n * item AND the item is the last in its wrapper. Mid-position outdent\n * would require splitting the list item, which is deferred.\n *\n * Registration order: must come AFTER ListKeymap so this extension's keymap\n * runs FIRST and can defer to ListKeymap for in-list flows.\n */\nimport { Extension } from '../Extension.js';\nimport { NodeSelection, Selection } from '@domternal/pm/state';\nimport type { EditorState, Transaction } from '@domternal/pm/state';\nimport type { Node as PMNode } from '@domternal/pm/model';\nimport { insertAsListItemChild } from '../utils/insertAsListItemChild.js';\n\nconst LIST_ITEM_TYPES = new Set(['listItem', 'taskItem']);\nconst LIST_WRAPPER_TYPES = new Set(['bulletList', 'orderedList', 'taskList']);\n\n/**\n * Returns true when ANY ancestor of the cursor's resolved position is\n * a list item. Used to defer Tab/Shift-Tab to ListKeymap whenever the\n * cursor is somewhere inside a list (nested heading, label paragraph,\n * deeply nested block, etc.).\n */\nfunction isCursorInsideListItem(state: EditorState): boolean {\n const { $from } = state.selection;\n for (let d = $from.depth; d > 0; d--) {\n if (LIST_ITEM_TYPES.has($from.node(d).type.name)) return true;\n }\n return false;\n}\n\n/**\n * `Tab` handler: indent a top-level block as the last child of the\n * last item of the immediately-preceding list wrapper. Returns true\n * when the operation succeeded (and dispatched, if `dispatch` is\n * provided), false when any precondition fails so the keymap chain\n * can fall through to the next handler.\n */\nexport function indentBlockAsListChild(\n state: EditorState,\n dispatch?: (tr: Transaction) => void,\n): boolean {\n const { selection } = state;\n\n // Identify the top-level \"subject\" block to indent. Two paths:\n // - TextSelection with empty caret in a top-level textblock: the\n // block is the cursor's depth-1 ancestor.\n // - NodeSelection on a top-level atom block (hr, image, etc.):\n // user explicitly selected the block; treat it as the subject.\n // Anything else (range selection, deeper nesting, in-list-item)\n // bails so the keymap chain falls through.\n let blockIndex: number;\n let blockNode: PMNode;\n let blockStart: number;\n let blockEnd: number;\n\n if (selection instanceof NodeSelection) {\n const node = selection.node;\n const $pos = selection.$from;\n // Atom block selected at top-level: the selected node is a direct\n // child of the doc; the parent depth is 0.\n if ($pos.depth !== 0) return false;\n if (isCursorInsideListItem(state)) return false;\n blockIndex = $pos.index(0);\n blockNode = node;\n blockStart = selection.from;\n blockEnd = selection.to;\n } else {\n if (!selection.empty) return false;\n if (isCursorInsideListItem(state)) return false;\n const { $from } = selection;\n if ($from.depth !== 1) return false;\n blockIndex = $from.index(0);\n blockNode = $from.node(1);\n blockStart = $from.before(1);\n blockEnd = $from.after(1);\n }\n\n if (blockIndex === 0) return false;\n\n const prevSibling = state.doc.child(blockIndex - 1);\n if (!LIST_WRAPPER_TYPES.has(prevSibling.type.name)) return false;\n\n // Position of the previous sibling (= the list wrapper) at the doc\n // level. Pre-computed here so a dry-run (no dispatch) and the\n // dispatch path share the same value.\n let wrapperPos = 0;\n for (let i = 0; i < blockIndex - 1; i++) {\n wrapperPos += state.doc.child(i).nodeSize;\n }\n\n const tr = state.tr;\n const result = insertAsListItemChild({\n tr,\n wrapperPos,\n blockNode,\n sourceRange: { from: blockStart, to: blockEnd },\n });\n if (!result.ok || result.insertedAt === undefined) return false;\n if (!dispatch) return true;\n\n // Caret in the (now nested) block at offset 0 of its content.\n tr.setSelection(Selection.near(tr.doc.resolve(result.insertedAt + 1)));\n dispatch(tr.scrollIntoView());\n return true;\n}\n\n/**\n * `Shift-Tab` handler: lift a non-label nested block out of its list\n * item to become a top-level sibling AFTER the list wrapper. Only\n * fires for the strict end-of-end case (last child of last item) so\n * the lift is deterministic and never needs to split a list item.\n *\n * Precondition table:\n * - cursor empty\n * - cursor textblock parent is NOT a paragraph (so we never\n * accidentally outdent the label; ListKeymap.Shift-Tab handles\n * in-label cases via liftListItem)\n * - the cursor's enclosing list item exists in the ancestry\n * - the cursor's containing block is a DIRECT child of the list\n * item (depth = listItemDepth + 1) - keeps the math local to\n * immediate li children rather than reaching deeper into nested\n * containers\n * - the block is the LAST child of the list item\n * - the list item is the LAST child of its wrapper\n * - the wrapper's parent accepts the block as a sibling (schema)\n */\nexport function outdentBlockFromListItem(\n state: EditorState,\n dispatch?: (tr: Transaction) => void,\n): boolean {\n const { selection } = state;\n if (!selection.empty) return false;\n\n const { $from } = selection;\n\n // Find the immediate list item ancestor.\n let listItemDepth = -1;\n for (let d = $from.depth; d > 0; d--) {\n if (LIST_ITEM_TYPES.has($from.node(d).type.name)) {\n listItemDepth = d;\n break;\n }\n }\n if (listItemDepth === -1) return false;\n\n // The block to outdent is the DIRECT child of the list item that\n // contains the cursor - identified by walking from the cursor's\n // depth down to listItemDepth + 1. The cursor itself can be deeper\n // (e.g. cursor in a paragraph INSIDE a blockquote that sits as a\n // direct li child); we still treat the blockquote as the subject.\n const blockDepth = listItemDepth + 1;\n if ($from.depth < blockDepth) return false;\n\n const listItem = $from.node(listItemDepth);\n const blockIndexInItem = $from.index(listItemDepth);\n // Skip first-child (the label paragraph slot). Defers the in-label\n // case to ListKeymap.Shift-Tab (`liftListItem`).\n if (blockIndexInItem === 0) return false;\n // MVP: only outdent when the block is the LAST child of the item.\n if (blockIndexInItem !== listItem.childCount - 1) return false;\n\n // List item must be the LAST in its wrapper. (Wrapper is the parent\n // of the list item, which sits at depth = listItemDepth - 1.)\n const wrapperDepth = listItemDepth - 1;\n if (wrapperDepth < 0) return false;\n // Use $from.index(wrapperDepth) - the list item's index inside the\n // wrapper. (A previous attempt used `wrapperDepth - 1` here, which\n // returns the wrapper's index in ITS parent - the wrong number.)\n const liIndexInWrapper = $from.index(wrapperDepth);\n const wrapper = $from.node(wrapperDepth);\n if (liIndexInWrapper !== wrapper.childCount - 1) return false;\n\n // Schema check: can the wrapper's parent accept the block as a\n // sibling right AFTER the wrapper?\n // `wrapperDepth - 1` may equal -1 only when the wrapper sits at\n // depth 0 - i.e. the wrapper IS the doc itself. The schema disallows\n // this, but we guard defensively below.\n if (wrapperDepth - 1 < 0) return false;\n const wrapperParent = $from.node(wrapperDepth - 1);\n const wrapperIndexInParent = $from.index(wrapperDepth - 1);\n const blockNode = $from.node(blockDepth);\n if (\n !wrapperParent.canReplaceWith(\n wrapperIndexInParent + 1,\n wrapperIndexInParent + 1,\n blockNode.type,\n )\n ) {\n return false;\n }\n\n if (!dispatch) return true;\n\n const blockStart = $from.before(blockDepth);\n const blockEnd = $from.after(blockDepth);\n const wrapperEnd = $from.after(wrapperDepth);\n\n const tr = state.tr;\n // Delete the block from inside the list item; positions AFTER the\n // delete shift left by `blockEnd - blockStart`. The wrapper end\n // sits AFTER the deleted range so we adjust it.\n const blockSize = blockEnd - blockStart;\n tr.delete(blockStart, blockEnd);\n const insertAt = wrapperEnd - blockSize;\n tr.insert(insertAt, blockNode);\n // Caret at offset 0 of the lifted block's content.\n tr.setSelection(Selection.near(tr.doc.resolve(insertAt + 1)));\n dispatch(tr.scrollIntoView());\n return true;\n}\n\nexport const ListIndent = Extension.create({\n name: 'listIndent',\n\n addKeyboardShortcuts() {\n const { editor } = this;\n return {\n Tab: () => {\n if (!editor) return false;\n return indentBlockAsListChild(editor.state, editor.view.dispatch);\n },\n 'Shift-Tab': () => {\n if (!editor) return false;\n return outdentBlockFromListItem(editor.state, editor.view.dispatch);\n },\n };\n },\n});\n","/**\n * CharacterCount Extension\n *\n * Provides character and word counting with optional limits.\n * Access counts via editor.storage.characterCount.characters() and .words()\n */\nimport { Plugin, PluginKey } from '@domternal/pm/state';\nimport { Extension } from '../Extension.js';\n\nexport interface CharacterCountOptions {\n /**\n * Maximum number of characters allowed. Set to null for no limit.\n * @default null\n */\n limit: number | null;\n\n /**\n * Maximum number of words allowed. Set to null for no limit.\n * @default null\n */\n wordLimit: number | null;\n\n /**\n * How to count characters:\n * - 'textSize': Count text characters only\n * - 'nodeSize': Count ProseMirror node size (includes structural characters)\n * @default 'textSize'\n */\n mode: 'textSize' | 'nodeSize';\n}\n\nexport interface CharacterCountStorage {\n /**\n * Get current character count.\n */\n characters: () => number;\n\n /**\n * Get current word count.\n */\n words: () => number;\n\n /**\n * Get percentage of limit used (0-100). Returns 0 if no limit.\n */\n percentage: () => number;\n\n /**\n * Get remaining characters before limit. Returns Infinity if no limit.\n */\n remaining: () => number;\n\n /**\n * Get percentage of word limit used (0-100). Returns 0 if no word limit.\n */\n wordPercentage: () => number;\n\n /**\n * Get remaining words before limit. Returns Infinity if no word limit.\n */\n wordRemaining: () => number;\n\n /**\n * Check if limit is exceeded.\n */\n isLimitExceeded: () => boolean;\n}\n\nexport const characterCountPluginKey = new PluginKey('characterCount');\n\nexport const CharacterCount = Extension.create<\n CharacterCountOptions,\n CharacterCountStorage\n>({\n name: 'characterCount',\n\n addOptions() {\n return {\n limit: null,\n wordLimit: null,\n mode: 'textSize',\n };\n },\n\n addStorage() {\n return {\n characters: () => 0,\n words: () => 0,\n percentage: () => 0,\n remaining: () => Infinity,\n wordPercentage: () => 0,\n wordRemaining: () => Infinity,\n isLimitExceeded: () => false,\n };\n },\n\n onCreate() {\n const getCharacters = (): number => {\n const doc = this.editor?.view.state.doc;\n if (!doc) return 0;\n\n if (this.options.mode === 'nodeSize') {\n return doc.nodeSize;\n }\n\n return doc.textContent.length;\n };\n\n const getWords = (): number => {\n const doc = this.editor?.view.state.doc;\n if (!doc) return 0;\n\n const text = doc.textContent;\n const words = text.split(/\\s+/).filter((word) => word.length > 0);\n return words.length;\n };\n\n this.storage.characters = getCharacters;\n this.storage.words = getWords;\n\n this.storage.percentage = () => {\n if (this.options.limit === null) return 0;\n const chars = getCharacters();\n return Math.min(100, Math.round((chars / this.options.limit) * 100));\n };\n\n this.storage.remaining = () => {\n if (this.options.limit === null) return Infinity;\n return Math.max(0, this.options.limit - getCharacters());\n };\n\n this.storage.wordPercentage = () => {\n if (this.options.wordLimit === null) return 0;\n const words = getWords();\n return Math.min(100, Math.round((words / this.options.wordLimit) * 100));\n };\n\n this.storage.wordRemaining = () => {\n if (this.options.wordLimit === null) return Infinity;\n return Math.max(0, this.options.wordLimit - getWords());\n };\n\n this.storage.isLimitExceeded = () => {\n if (this.options.limit !== null) {\n if (getCharacters() > this.options.limit) return true;\n }\n if (this.options.wordLimit !== null) {\n if (getWords() > this.options.wordLimit) return true;\n }\n return false;\n };\n },\n\n addProseMirrorPlugins() {\n const { limit, wordLimit, mode } = this.options;\n\n // If no limits, no need for filtering plugin\n if (limit === null && wordLimit === null) return [];\n\n return [\n new Plugin({\n key: characterCountPluginKey,\n filterTransaction: (transaction) => {\n // Allow non-document changes (selection, etc.)\n if (!transaction.docChanged) return true;\n\n const newDoc = transaction.doc;\n\n // Character limit check - use same counting mode as characters()\n if (limit !== null) {\n const count = mode === 'nodeSize'\n ? newDoc.nodeSize\n : newDoc.textContent.length;\n if (count > limit) return false;\n }\n\n // Word limit check\n if (wordLimit !== null) {\n const words = newDoc.textContent.split(/\\s+/).filter((w) => w.length > 0);\n if (words.length > wordLimit) {\n return false;\n }\n }\n\n return true;\n },\n }),\n ];\n },\n});\n","/**\n * Typography Extension\n *\n * Provides automatic typographic replacements via input rules:\n * - -- → — (em-dash)\n * - ... → … (ellipsis)\n * - Smart quotes\n * - Arrows, fractions, symbols\n */\nimport { InputRule } from '@domternal/pm/inputrules';\nimport { textInputRule } from '../helpers/textInputRule.js';\nimport { Extension } from '../Extension.js';\n\nexport interface TypographyOptions {\n /**\n * Enable em-dash replacement (-- → —)\n * @default true\n */\n emDash: boolean;\n\n /**\n * Enable ellipsis replacement (... → …)\n * @default true\n */\n ellipsis: boolean;\n\n /**\n * Enable arrow replacements (<- → ←, -> → →)\n * @default true\n */\n arrows: boolean;\n\n /**\n * Enable fraction replacements (1/2 → ½, 1/4 → ¼, 3/4 → ¾)\n * @default true\n */\n fractions: boolean;\n\n /**\n * Enable symbol replacements ((c) → ©, (r) → ®, (tm) → ™)\n * @default true\n */\n symbols: boolean;\n\n /**\n * Enable math replacements (+/- → ±, != → ≠)\n * @default true\n */\n math: boolean;\n\n /**\n * Enable guillemet replacements (<< → «, >> → »)\n * @default true\n */\n guillemets: boolean;\n\n /**\n * Enable smart quote replacements (\"text\" → \"text\", 'text' → 'text')\n * @default true\n */\n smartQuotes: boolean;\n\n /**\n * Opening double quote character.\n * @default '\"'\n */\n openDoubleQuote: string;\n\n /**\n * Closing double quote character.\n * @default '\"'\n */\n closeDoubleQuote: string;\n\n /**\n * Opening single quote character.\n * @default '''\n */\n openSingleQuote: string;\n\n /**\n * Closing single quote character.\n * @default '''\n */\n closeSingleQuote: string;\n}\n\nexport const Typography = Extension.create<TypographyOptions>({\n name: 'typography',\n\n addOptions() {\n return {\n emDash: true,\n ellipsis: true,\n arrows: true,\n fractions: true,\n symbols: true,\n math: true,\n guillemets: true,\n smartQuotes: true,\n openDoubleQuote: '\\u201C', // \"\n closeDoubleQuote: '\\u201D', // \"\n openSingleQuote: '\\u2018', // '\n closeSingleQuote: '\\u2019', // '\n };\n },\n\n addInputRules() {\n const rules: InputRule[] = [];\n\n if (this.options.emDash) {\n rules.push(textInputRule({ find: /--$/, replace: '\\u2014' })); // -- → —\n }\n\n if (this.options.ellipsis) {\n rules.push(textInputRule({ find: /\\.\\.\\.$/, replace: '\\u2026' })); // ... → …\n }\n\n if (this.options.arrows) {\n rules.push(textInputRule({ find: /<-$/, replace: '\\u2190' })); // <- → ←\n rules.push(textInputRule({ find: /->$/, replace: '\\u2192' })); // -> → →\n rules.push(textInputRule({ find: /=>$/, replace: '\\u21D2' })); // => → ⇒\n }\n\n if (this.options.fractions) {\n rules.push(textInputRule({ find: /1\\/2$/, replace: '\\u00BD' })); // 1/2 → ½\n rules.push(textInputRule({ find: /1\\/4$/, replace: '\\u00BC' })); // 1/4 → ¼\n rules.push(textInputRule({ find: /3\\/4$/, replace: '\\u00BE' })); // 3/4 → ¾\n rules.push(textInputRule({ find: /1\\/3$/, replace: '\\u2153' })); // 1/3 → ⅓\n rules.push(textInputRule({ find: /2\\/3$/, replace: '\\u2154' })); // 2/3 → ⅔\n }\n\n if (this.options.symbols) {\n rules.push(textInputRule({ find: /\\(c\\)$/i, replace: '\\u00A9' })); // (c) → ©\n rules.push(textInputRule({ find: /\\(r\\)$/i, replace: '\\u00AE' })); // (r) → ®\n rules.push(textInputRule({ find: /\\(tm\\)$/i, replace: '\\u2122' })); // (tm) → ™\n rules.push(textInputRule({ find: /\\(sm\\)$/i, replace: '\\u2120' })); // (sm) → ℠\n }\n\n if (this.options.math) {\n rules.push(textInputRule({ find: /\\+\\/-$/, replace: '\\u00B1' })); // +/- → ±\n rules.push(textInputRule({ find: /!=$/, replace: '\\u2260' })); // != → ≠\n rules.push(textInputRule({ find: /<=$/, replace: '\\u2264' })); // <= → ≤\n rules.push(textInputRule({ find: />=$/, replace: '\\u2265' })); // >= → ≥\n }\n\n if (this.options.guillemets) {\n rules.push(textInputRule({ find: /<<$/, replace: '\\u00AB' })); // << → «\n rules.push(textInputRule({ find: />>$/, replace: '\\u00BB' })); // >> → »\n }\n\n // Smart quotes (need match groups, can't use textReplace)\n if (this.options.smartQuotes) {\n const { openDoubleQuote, closeDoubleQuote, openSingleQuote, closeSingleQuote } = this.options;\n\n // \"text\" → \"text\" (double quotes)\n rules.push(\n new InputRule(/\"([^\"]+)\"$/, (state, match, start, end) => {\n const text = match[1] ?? '';\n return state.tr.replaceWith(\n start,\n end,\n state.schema.text(openDoubleQuote + text + closeDoubleQuote)\n );\n })\n );\n\n // 'text' → 'text' (single quotes - only when clearly a quote pair)\n // Use pattern to avoid matching apostrophes in contractions\n rules.push(\n new InputRule(/(?:^|[\\s([{])'([^']+)'$/, (state, match, start, end) => {\n const text = match[1] ?? '';\n const prefix = match[0].charAt(0);\n // If there's a prefix character (space, bracket, etc.), keep it\n const hasPrefix = prefix !== \"'\";\n return state.tr.replaceWith(\n start,\n end,\n state.schema.text(\n hasPrefix\n ? prefix + openSingleQuote + text + closeSingleQuote\n : openSingleQuote + text + closeSingleQuote\n )\n );\n })\n );\n }\n\n return rules;\n },\n});\n","/**\n * TextAlign Extension\n *\n * Adds text alignment capabilities to specified node types.\n * Uses addGlobalAttributes to inject textAlign attribute into nodes.\n */\nimport { Extension } from '../Extension.js';\nimport type { CommandSpec } from '../types/Commands.js';\nimport type { ToolbarItem } from '../types/Toolbar.js';\n\ndeclare module '@domternal/core' {\n interface RawCommands {\n setTextAlign: CommandSpec<[alignment: string]>;\n unsetTextAlign: CommandSpec;\n }\n}\n\nexport interface TextAlignOptions {\n /**\n * Node types that can have text alignment.\n * @default ['heading', 'paragraph']\n */\n types: string[];\n\n /**\n * Allowed alignment values.\n * @default ['left', 'center', 'right', 'justify']\n */\n alignments: string[];\n\n /**\n * Default alignment value.\n * @default 'left'\n */\n defaultAlignment: string;\n}\n\nexport const TextAlign = Extension.create<TextAlignOptions>({\n name: 'textAlign',\n\n addOptions() {\n return {\n types: ['heading', 'paragraph'],\n alignments: ['left', 'center', 'right', 'justify'],\n defaultAlignment: 'left',\n };\n },\n\n addGlobalAttributes() {\n return [\n {\n types: this.options.types,\n attributes: {\n textAlign: {\n default: this.options.defaultAlignment,\n parseHTML: (element: HTMLElement) =>\n element.style.textAlign || this.options.defaultAlignment,\n renderHTML: (attributes: Record<string, unknown>) => {\n const textAlign = attributes['textAlign'] as string;\n if (textAlign === this.options.defaultAlignment) {\n return null;\n }\n return { style: `text-align: ${textAlign}` };\n },\n },\n },\n },\n ];\n },\n\n addCommands() {\n return {\n setTextAlign:\n (alignment: string) =>\n ({ commands }) => {\n if (!this.options.alignments.includes(alignment)) {\n return false;\n }\n\n return this.options.types\n .map((type) => commands.updateAttributes(type, { textAlign: alignment }))\n .some(Boolean);\n },\n\n unsetTextAlign:\n () =>\n ({ commands }) => {\n return this.options.types\n .map((type) => commands.resetAttributes(type, 'textAlign'))\n .some(Boolean);\n },\n };\n },\n\n addKeyboardShortcuts() {\n return {\n 'Mod-Shift-l': () =>\n this.editor?.commands.setTextAlign('left') ?? false,\n 'Mod-Shift-e': () =>\n this.editor?.commands.setTextAlign('center') ?? false,\n 'Mod-Shift-r': () =>\n this.editor?.commands.setTextAlign('right') ?? false,\n 'Mod-Shift-j': () =>\n this.editor?.commands.setTextAlign('justify') ?? false,\n };\n },\n\n addToolbarItems(): ToolbarItem[] {\n const types = this.options.types;\n const makeActive = (alignment: string): { name: string; attributes: Record<string, unknown> }[] =>\n types.map((t) => ({ name: t, attributes: { textAlign: alignment } }));\n\n return [\n {\n type: 'dropdown',\n name: 'textAlign',\n icon: 'textAlignLeft',\n label: 'Text Alignment',\n group: 'alignment',\n priority: 200,\n dynamicIcon: true,\n items: [\n {\n type: 'button',\n name: 'alignLeft',\n command: 'setTextAlign',\n commandArgs: ['left'],\n isActive: makeActive('left'),\n icon: 'textAlignLeft',\n label: 'Align Left',\n shortcut: 'Mod-Shift-L',\n },\n {\n type: 'button',\n name: 'alignCenter',\n command: 'setTextAlign',\n commandArgs: ['center'],\n isActive: makeActive('center'),\n icon: 'textAlignCenter',\n label: 'Align Center',\n shortcut: 'Mod-Shift-E',\n },\n {\n type: 'button',\n name: 'alignRight',\n command: 'setTextAlign',\n commandArgs: ['right'],\n isActive: makeActive('right'),\n icon: 'textAlignRight',\n label: 'Align Right',\n shortcut: 'Mod-Shift-R',\n },\n {\n type: 'button',\n name: 'alignJustify',\n command: 'setTextAlign',\n commandArgs: ['justify'],\n isActive: makeActive('justify'),\n icon: 'textAlignJustify',\n label: 'Justify',\n shortcut: 'Mod-Shift-J',\n },\n ],\n },\n ];\n },\n});\n","/**\n * Focus Extension\n *\n * Adds CSS classes to nodes that contain the current selection.\n * Useful for highlighting the focused paragraph or block.\n */\nimport { Plugin, PluginKey } from '@domternal/pm/state';\nimport { Decoration, DecorationSet } from '@domternal/pm/view';\nimport { Extension } from '../Extension.js';\n\nexport interface FocusOptions {\n /**\n * CSS class to add to focused nodes.\n * @default 'has-focus'\n */\n className: string;\n\n /**\n * Which nodes to mark as focused:\n * - 'all': All nodes containing the selection\n * - 'deepest': Only the innermost focused node\n * - 'shallowest': Only the outermost focused node\n * @default 'all'\n */\n mode: 'all' | 'deepest' | 'shallowest';\n}\n\nexport const focusPluginKey = new PluginKey('focus');\n\nexport const Focus = Extension.create<FocusOptions>({\n name: 'focus',\n\n addOptions() {\n return {\n className: 'has-focus',\n mode: 'all',\n };\n },\n\n addProseMirrorPlugins() {\n return [\n new Plugin({\n key: focusPluginKey,\n props: {\n decorations: ({ doc, selection }) => {\n const { from, to } = selection;\n const decorations: Decoration[] = [];\n const focusedNodes: { pos: number; nodeSize: number }[] = [];\n\n // Collect all nodes containing the selection\n doc.nodesBetween(from, to, (node, pos) => {\n if (node.isText) return;\n\n // Check if this node actually contains part of the selection\n const nodeEnd = pos + node.nodeSize;\n if (pos <= to && nodeEnd >= from) {\n focusedNodes.push({ pos, nodeSize: node.nodeSize });\n }\n });\n\n if (focusedNodes.length === 0) {\n return DecorationSet.empty;\n }\n\n // Apply mode filtering\n let nodesToDecorate = focusedNodes;\n\n if (this.options.mode === 'deepest') {\n // Only the innermost (last) node\n const last = focusedNodes[focusedNodes.length - 1];\n nodesToDecorate = last ? [last] : [];\n } else if (this.options.mode === 'shallowest') {\n // Only the outermost (first) node\n const first = focusedNodes[0];\n nodesToDecorate = first ? [first] : [];\n }\n\n // Create decorations\n for (const { pos, nodeSize } of nodesToDecorate) {\n decorations.push(\n Decoration.node(pos, pos + nodeSize, {\n class: this.options.className,\n })\n );\n }\n\n return DecorationSet.create(doc, decorations);\n },\n },\n }),\n ];\n },\n});\n","/**\n * LineHeight Extension\n *\n * Adds line height styling to block nodes.\n *\n * @example\n * ```ts\n * import { LineHeight } from '@domternal/core';\n *\n * const editor = new Editor({\n * extensions: [\n * // ... other extensions\n * LineHeight.configure({\n * types: ['paragraph', 'heading'],\n * lineHeights: ['1', '1.5', '2'],\n * }),\n * ],\n * });\n *\n * editor.commands.setLineHeight('1.5');\n * editor.commands.unsetLineHeight();\n * ```\n */\nimport { Extension } from '../Extension.js';\nimport type { CommandSpec } from '../types/Commands.js';\nimport type { ToolbarItem } from '../types/Toolbar.js';\n\ndeclare module '@domternal/core' {\n interface RawCommands {\n setLineHeight: CommandSpec<[lineHeight: string]>;\n unsetLineHeight: CommandSpec;\n }\n}\n\nexport interface LineHeightOptions {\n /**\n * Node types that should support line height.\n * @default ['paragraph', 'heading']\n */\n types: string[];\n\n /**\n * List of allowed line heights (e.g., ['1', '1.5', '2']).\n * If empty, all values are allowed.\n * @default ['1', '1.15', '1.25', '1.5', '2']\n */\n lineHeights: string[];\n\n /**\n * Default line height value.\n * @default null\n */\n defaultLineHeight: string | null;\n}\n\nexport const LineHeight = Extension.create<LineHeightOptions>({\n name: 'lineHeight',\n\n addOptions() {\n return {\n types: ['paragraph', 'heading'],\n lineHeights: ['1', '1.15', '1.25', '1.5', '2'],\n defaultLineHeight: null,\n };\n },\n\n addGlobalAttributes() {\n return [\n {\n types: this.options.types,\n attributes: {\n lineHeight: {\n default: this.options.defaultLineHeight,\n parseHTML: (element: HTMLElement) => {\n return element.style.lineHeight || this.options.defaultLineHeight;\n },\n renderHTML: (attributes: Record<string, unknown>) => {\n const lineHeight = attributes['lineHeight'] as string | null;\n\n // Don't render if it's the default\n if (!lineHeight || lineHeight === this.options.defaultLineHeight) {\n return null;\n }\n\n // Validate if lineHeights list is provided\n if (\n this.options.lineHeights.length > 0 &&\n !this.options.lineHeights.includes(lineHeight)\n ) {\n return null;\n }\n\n return { style: `line-height: ${lineHeight}` };\n },\n },\n },\n },\n ];\n },\n\n addCommands() {\n return {\n setLineHeight:\n (lineHeight: string) =>\n ({ commands }) => {\n // Validate if lineHeights list is provided\n if (\n this.options.lineHeights.length > 0 &&\n !this.options.lineHeights.includes(lineHeight)\n ) {\n return false;\n }\n\n return this.options.types\n .map((type) => commands.updateAttributes(type, { lineHeight }))\n .some(Boolean);\n },\n\n unsetLineHeight:\n () =>\n ({ commands }) => {\n return this.options.types\n .map((type) => commands.resetAttributes(type, 'lineHeight'))\n .some(Boolean);\n },\n };\n },\n\n addToolbarItems(): ToolbarItem[] {\n if (this.options.lineHeights.length === 0) return [];\n\n const types = this.options.types;\n return [\n {\n type: 'dropdown',\n name: 'lineHeight',\n icon: 'lineSpacing',\n label: 'Line Height',\n group: 'textStyle',\n priority: 50,\n displayMode: 'text',\n dynamicLabel: true,\n items: [\n ...this.options.lineHeights.map((lh, i) => ({\n type: 'button' as const,\n name: `lineHeight-${lh}`,\n command: 'setLineHeight',\n commandArgs: [lh],\n isActive: types.map((t) => ({ name: t, attributes: { lineHeight: lh } })),\n icon: 'lineSpacing',\n label: lh,\n priority: 200 - i,\n })),\n {\n type: 'button' as const,\n name: 'unsetLineHeight',\n command: 'unsetLineHeight',\n icon: 'lineSpacing',\n label: 'Default',\n },\n ],\n },\n ];\n },\n});\n","/**\n * Canonical block-id system. Assigns ids to configured node types and is\n * read by TableOfContents and BlockContextMenu.\n */\nimport { Extension } from '../Extension.js';\nimport { Plugin, PluginKey, type Transaction } from '@domternal/pm/state';\nimport { Fragment, Slice } from '@domternal/pm/model';\nimport type { Node as PMNode } from '@domternal/pm/model';\nimport type { Editor } from '../Editor.js';\n\nfunction generateUUID(): string {\n // Prefer the browser/Node crypto API: cryptographically random and\n // standardised. Fall back to Math.random() for hostile or test\n // environments (jsdom prior to v22, very old shims) where\n // `crypto.randomUUID` is missing.\n if (typeof globalThis !== 'undefined') {\n const c = (globalThis as { crypto?: { randomUUID?: () => string } }).crypto;\n if (c && typeof c.randomUUID === 'function') return c.randomUUID();\n }\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\nexport const uniqueIDPluginKey = new PluginKey('uniqueID');\n\nexport interface UniqueIDOptions {\n /**\n * Node types that should receive unique IDs.\n * @default ['paragraph', 'heading', 'blockquote', 'codeBlock', 'bulletList', 'orderedList', 'taskList', 'listItem', 'taskItem', 'image', 'horizontalRule']\n */\n types: string[];\n\n /**\n * Attribute name to store the unique ID.\n * @default 'id'\n */\n attributeName: string;\n\n /**\n * Function to generate unique IDs.\n * @default generateUUID\n */\n generateID: () => string;\n\n /**\n * Whether to filter duplicates when pasting content.\n * @default true\n */\n filterDuplicates: boolean;\n}\n\nexport const UniqueID = Extension.create<UniqueIDOptions>({\n name: 'uniqueID',\n\n addOptions() {\n return {\n types: [\n 'paragraph',\n 'heading',\n 'blockquote',\n 'codeBlock',\n 'bulletList',\n 'orderedList',\n 'taskList',\n 'listItem',\n 'taskItem',\n 'image',\n 'horizontalRule',\n ],\n attributeName: 'id',\n generateID: generateUUID,\n filterDuplicates: true,\n };\n },\n\n addGlobalAttributes() {\n return [\n {\n types: this.options.types,\n attributes: {\n [this.options.attributeName]: {\n default: null,\n parseHTML: (element: HTMLElement) =>\n element.getAttribute(this.options.attributeName),\n renderHTML: (attributes: Record<string, unknown>) => {\n const id = attributes[this.options.attributeName] as string | null;\n if (!id) return null;\n return { [this.options.attributeName]: id };\n },\n },\n },\n },\n ];\n },\n\n addProseMirrorPlugins() {\n const { types, attributeName, generateID, filterDuplicates } = this.options;\n const editor = this.editor as Editor | null;\n\n const transformPastedSlice = (slice: Slice): Slice => {\n const existingIDs = new Set<string>();\n\n // Collect existing IDs in document\n editor?.state.doc.descendants((node: PMNode) => {\n const id = node.attrs[attributeName] as string | undefined;\n if (id) existingIDs.add(id);\n });\n\n // Transform pasted content\n const transformNode = (node: PMNode): PMNode => {\n if (!types.includes(node.type.name)) {\n return node.copy(transformFragment(node.content));\n }\n\n const existingID = node.attrs[attributeName] as string | undefined;\n if (existingID && existingIDs.has(existingID)) {\n // Regenerate ID for duplicate\n return node.type.create(\n { ...node.attrs, [attributeName]: generateID() },\n transformFragment(node.content),\n node.marks\n );\n }\n\n // Track new ID\n if (existingID) existingIDs.add(existingID);\n return node.copy(transformFragment(node.content));\n };\n\n const transformFragment = (fragment: Fragment): Fragment => {\n const nodes: PMNode[] = [];\n fragment.forEach((node) => {\n nodes.push(transformNode(node));\n });\n return Fragment.from(nodes);\n };\n\n return new Slice(\n transformFragment(slice.content),\n slice.openStart,\n slice.openEnd\n );\n };\n\n // Helper to assign IDs to nodes that lack them, AND rename\n // duplicates so the doc stays a unique-id space (which is required\n // for native browser `#hash` anchors and `getElementById`).\n //\n // The duplicate-rename guarantee covers two real scenarios:\n // 1. setContent with markup that already has colliding ids (e.g.\n // a saved snapshot with corrupted ids, or hand-written HTML).\n // 2. PM transactions that copy a node with its id (some commands\n // like duplicateBlock spread attrs and would propagate the id;\n // callers can override via transformAttrs, but if they don't,\n // this catch-all keeps the doc consistent).\n //\n // Paste from outside the editor goes through `transformPasted`\n // (further down) and is handled there before this runs. This pass\n // is the safety net.\n const assignMissingIDs = (doc: PMNode, tr: Transaction): void => {\n const seen = new Set<string>();\n doc.descendants((node, pos) => {\n if (!types.includes(node.type.name)) return;\n\n const existingID = node.attrs[attributeName] as string | undefined;\n if (!existingID) {\n // Missing: assign a fresh one. Track it so subsequent nodes\n // with the same generated id (astronomically unlikely with\n // UUIDs) don't pass through.\n let id = generateID();\n while (seen.has(id)) id = generateID();\n seen.add(id);\n // Map the position through steps already applied to `tr` so\n // each setNodeMarkup lands at the right place even when the\n // earlier iteration changed offsets. (`setNodeMarkup` is not\n // length-changing, but the discipline matches the safer\n // pattern that other plugins use.)\n tr.setNodeMarkup(tr.mapping.map(pos), undefined, {\n ...node.attrs,\n [attributeName]: id,\n });\n return;\n }\n if (seen.has(existingID)) {\n // Collision: rename the second occurrence. The first\n // occurrence keeps its id - \"first wins\" is the same rule\n // most editors use when reconciling duplicate anchors.\n let id = generateID();\n while (seen.has(id)) id = generateID();\n seen.add(id);\n tr.setNodeMarkup(tr.mapping.map(pos), undefined, {\n ...node.attrs,\n [attributeName]: id,\n });\n return;\n }\n seen.add(existingID);\n });\n };\n\n return [\n new Plugin({\n key: uniqueIDPluginKey,\n\n // Apply initial IDs after the view is ready\n view(editorView) {\n // Use setTimeout to avoid dispatching during plugin init, but\n // re-create the transaction from the *current* state inside the\n // callback to avoid stale-transaction bugs.\n const timeoutId = setTimeout(() => {\n const tr = editorView.state.tr;\n assignMissingIDs(editorView.state.doc, tr);\n if (tr.docChanged) {\n editorView.dispatch(tr);\n }\n }, 0);\n return {\n destroy() {\n clearTimeout(timeoutId);\n },\n };\n },\n\n // Ensure new nodes get IDs\n appendTransaction(transactions, _oldState, newState) {\n const docChanged = transactions.some((tr) => tr.docChanged);\n if (!docChanged) return null;\n\n const tr = newState.tr;\n assignMissingIDs(newState.doc, tr);\n\n return tr.docChanged ? tr : null;\n },\n\n // Handle paste - filter duplicates\n props: filterDuplicates\n ? {\n transformPasted: transformPastedSlice,\n }\n : {},\n }),\n ];\n },\n});\n","/**\n * Tints whole blocks via `bgColor` / `textColor` attributes rendered as\n * `data-bg-color` / `data-text-color`. Theme's `_block-colors.scss` maps\n * names to CSS custom properties with light/dark variants. `null` clears\n * the attribute; unknown palette names are rejected by commands.\n */\nimport { Extension } from '../Extension.js';\nimport type { Command, CommandSpec } from '../types/Commands.js';\nimport type { EditorState, Transaction } from '@domternal/pm/state';\n\ndeclare module '@domternal/core' {\n interface RawCommands {\n setBlockBgColor: CommandSpec<[color: string | null]>;\n setBlockTextColor: CommandSpec<[color: string | null]>;\n unsetBlockColors: CommandSpec;\n }\n}\n\n/**\n * Notion's public palette. Names are semantic (not tied to specific hex);\n * the stylesheet owns the actual colors so themes can customize them.\n * `'default'` is implicit - represented by `null` (no data attribute).\n */\nexport const DEFAULT_BLOCK_COLORS: string[] = [\n 'gray',\n 'brown',\n 'orange',\n 'yellow',\n 'green',\n 'blue',\n 'purple',\n 'pink',\n 'red',\n];\n\n/**\n * Default set of block types that receive the color attributes. `codeBlock`\n * is intentionally excluded - `<pre><code>` already has its own background\n * that would conflict visually. Similarly, details-content blocks have\n * their own affordance. Callers can extend via `types` option.\n */\nexport const DEFAULT_BLOCK_COLOR_TYPES: string[] = [\n 'paragraph',\n 'heading',\n 'blockquote',\n 'bulletList',\n 'orderedList',\n 'taskList',\n 'listItem',\n 'taskItem',\n];\n\nexport interface BlockColorOptions {\n /**\n * Node types that receive `bgColor` / `textColor` attributes.\n * @default DEFAULT_BLOCK_COLOR_TYPES\n */\n types: string[];\n /**\n * Palette used by the `setBlockBgColor` command. Commands reject values\n * outside this list (no-op + false return) so host apps can curate\n * what's selectable.\n * @default DEFAULT_BLOCK_COLORS\n */\n bgColors: string[];\n /**\n * Palette used by the `setBlockTextColor` command.\n * @default DEFAULT_BLOCK_COLORS\n */\n textColors: string[];\n}\n\n/**\n * Strip any inline `textStyle` marks inside [from, to] that carry the inline\n * counterpart of a block-level color attribute. Mutates the transaction in\n * place. This makes \"last action wins\": applying a block color erases\n * conflicting inline colors so the new block tint isn't visually hidden by\n * old span overrides.\n *\n * `which` may be 'text', 'bg', or 'both' - 'both' handles the unset case\n * in a single pass so the two strip operations don't step on each other's\n * replaced mark instances.\n *\n * Exported so `BlockContextMenu` (which writes node attrs directly via\n * `setNodeMarkup` instead of going through `setBlockBgColor` /\n * `setBlockTextColor`) shares the same conflict-stripping behavior.\n */\nexport function stripInlineColorConflicts(\n tr: Transaction,\n state: EditorState,\n from: number,\n to: number,\n which: 'text' | 'bg' | 'both',\n): void {\n const textStyleType = state.schema.marks['textStyle'];\n if (!textStyleType) return;\n const inlineKeys: string[] = [];\n if (which === 'text' || which === 'both') inlineKeys.push('color', 'colorToken');\n if (which === 'bg' || which === 'both') inlineKeys.push('backgroundColor', 'backgroundColorToken');\n state.doc.nodesBetween(from, to, (node, pos) => {\n if (!node.isText) return true;\n const existing = node.marks.find((m) => m.type === textStyleType);\n if (!existing) return false;\n const hasConflict = inlineKeys.some((k) => existing.attrs[k] !== null && existing.attrs[k] !== undefined);\n if (!hasConflict) return false;\n const start = Math.max(pos, from);\n const end = Math.min(pos + node.nodeSize, to);\n const newAttrs: Record<string, unknown> = { ...existing.attrs };\n for (const k of inlineKeys) newAttrs[k] = null;\n const stillUsed = Object.values(newAttrs).some((v) => v !== null && v !== undefined);\n tr.removeMark(start, end, existing);\n if (stillUsed) tr.addMark(start, end, textStyleType.create(newAttrs));\n return false;\n });\n}\n\nexport const BlockColor = Extension.create<BlockColorOptions>({\n name: 'blockColor',\n\n addOptions() {\n return {\n types: DEFAULT_BLOCK_COLOR_TYPES,\n bgColors: DEFAULT_BLOCK_COLORS,\n textColors: DEFAULT_BLOCK_COLORS,\n };\n },\n\n // Defensive fallback: an empty `bgColors`/`textColors` array would render\n // a broken Colors UI (section title with only the null-reset swatch).\n // Replace empties with the default palette so users who pass `{}` as an\n // override still get a working picker. Runs AFTER `addOptions()` merges\n // user config with defaults, so this only fires for explicit empty arrays.\n onBeforeCreate() {\n if (this.options.bgColors.length === 0) this.options.bgColors = DEFAULT_BLOCK_COLORS;\n if (this.options.textColors.length === 0) this.options.textColors = DEFAULT_BLOCK_COLORS;\n },\n\n addGlobalAttributes() {\n return [\n {\n types: this.options.types,\n attributes: {\n bgColor: {\n default: null,\n parseHTML: (element: HTMLElement) => element.getAttribute('data-bg-color'),\n renderHTML: (attributes: Record<string, unknown>) => {\n const v = attributes['bgColor'] as string | null;\n if (!v) return null;\n return { 'data-bg-color': v };\n },\n },\n textColor: {\n default: null,\n parseHTML: (element: HTMLElement) => element.getAttribute('data-text-color'),\n renderHTML: (attributes: Record<string, unknown>) => {\n const v = attributes['textColor'] as string | null;\n if (!v) return null;\n return { 'data-text-color': v };\n },\n },\n },\n },\n ];\n },\n\n addCommands() {\n const types = this.options.types;\n const bgColors = this.options.bgColors;\n const textColors = this.options.textColors;\n\n /**\n * Walks up from the selection to the first ancestor whose node type is\n * in the configured `types` list. Returns the position of that\n * ancestor, or null if the selection isn't inside one.\n */\n function findTargetPos(state: EditorState): number | null {\n const { $from } = state.selection;\n for (let depth = $from.depth; depth >= 0; depth--) {\n const node = $from.node(depth);\n if (types.includes(node.type.name)) {\n // depth 0 is the document itself; `before(0)` isn't defined.\n return depth === 0 ? 0 : $from.before(depth);\n }\n }\n return null;\n }\n\n function setAttr(attr: 'bgColor' | 'textColor', palette: string[]) {\n return (color: string | null): Command =>\n ({ state, dispatch }) => {\n // Palette guard - `null` always allowed (clears the attr).\n if (color !== null && !palette.includes(color)) return false;\n const pos = findTargetPos(state);\n if (pos === null) return false;\n const node = state.doc.nodeAt(pos);\n if (!node) return false;\n if (dispatch) {\n const tr = state.tr.setNodeMarkup(pos, undefined, { ...node.attrs, [attr]: color });\n stripInlineColorConflicts(tr, state, pos, pos + node.nodeSize, attr === 'textColor' ? 'text' : 'bg');\n dispatch(tr);\n }\n return true;\n };\n }\n\n return {\n setBlockBgColor: setAttr('bgColor', bgColors),\n setBlockTextColor: setAttr('textColor', textColors),\n unsetBlockColors:\n (): Command =>\n ({ state, dispatch }) => {\n const pos = findTargetPos(state);\n if (pos === null) return false;\n const node = state.doc.nodeAt(pos);\n if (!node) return false;\n if (dispatch) {\n const tr = state.tr.setNodeMarkup(pos, undefined, {\n ...node.attrs,\n bgColor: null,\n textColor: null,\n });\n stripInlineColorConflicts(tr, state, pos, pos + node.nodeSize, 'both');\n dispatch(tr);\n }\n return true;\n },\n };\n },\n});\n","/**\n * Selection Extension\n *\n * Provides selection utilities and helpers for working with\n * the editor's current selection state.\n *\n * @example\n * ```ts\n * import { Selection } from '@domternal/core';\n *\n * const editor = new Editor({\n * extensions: [\n * // ... other extensions\n * Selection,\n * ],\n * });\n *\n * // Get selected text\n * const text = editor.storage.selection.getText();\n *\n * // Check if selection is empty\n * if (editor.storage.selection.isEmpty()) {\n * console.log('Cursor is collapsed');\n * }\n *\n * // Get selection range\n * const { from, to } = editor.storage.selection.getRange();\n *\n * // Set selection programmatically\n * editor.commands.setSelection(5, 10);\n * ```\n */\nimport { Extension } from '../Extension.js';\nimport { NodeSelection, TextSelection, Selection as PMSelection } from '@domternal/pm/state';\nimport type { Node as PMNode } from '@domternal/pm/model';\nimport type { Editor } from '../Editor.js';\nimport type { CommandSpec } from '../types/Commands.js';\n\ndeclare module '@domternal/core' {\n interface RawCommands {\n setSelection: CommandSpec<[from: number, to?: number]>;\n selectNode: CommandSpec<[pos: number]>;\n selectParentNode: CommandSpec;\n extendSelection: CommandSpec<[direction: 'left' | 'right' | 'start' | 'end']>;\n }\n}\n\nexport interface SelectionOptions {}\n\nexport interface SelectionStorage {\n /**\n * Returns the currently selected text content.\n */\n getText: () => string;\n\n /**\n * Returns the selected node (if a node selection).\n */\n getNode: () => PMNode | null;\n\n /**\n * Returns true if the selection is empty.\n */\n isEmpty: () => boolean;\n\n /**\n * Returns the selection range { from, to }.\n */\n getRange: () => { from: number; to: number };\n\n /**\n * Returns the current cursor position (null if range selection).\n */\n getCursor: () => number | null;\n}\n\nexport const Selection = Extension.create<SelectionOptions, SelectionStorage>({\n name: 'selection',\n\n addStorage() {\n return {\n getText: () => '',\n getNode: () => null,\n isEmpty: () => true,\n getRange: () => ({ from: 0, to: 0 }),\n getCursor: () => null,\n };\n },\n\n onCreate() {\n const editor = this.editor as Editor | null;\n\n // Initialize storage methods\n this.storage.getText = () => {\n const state = editor?.state;\n if (!state) return '';\n\n const { selection, doc } = state;\n const { from, to } = selection;\n return doc.textBetween(from, to, ' ');\n };\n\n this.storage.getNode = () => {\n const state = editor?.state;\n if (!state) return null;\n\n const { selection } = state;\n if (selection instanceof NodeSelection) {\n return selection.node;\n }\n\n return null;\n };\n\n this.storage.isEmpty = () => {\n const state = editor?.state;\n if (!state) return true;\n return state.selection.empty;\n };\n\n this.storage.getRange = () => {\n const state = editor?.state;\n if (!state) return { from: 0, to: 0 };\n return { from: state.selection.from, to: state.selection.to };\n };\n\n this.storage.getCursor = () => {\n const state = editor?.state;\n if (!state) return null;\n const { selection } = state;\n if (!selection.empty) return null;\n return selection.from;\n };\n },\n\n addCommands() {\n return {\n setSelection:\n (from: number, to?: number) =>\n ({ tr, dispatch }) => {\n const resolvedTo = to ?? from;\n\n // Use tr.doc for chain compatibility - prior commands may have modified the document\n if (from < 0 || resolvedTo > tr.doc.content.size) {\n return false;\n }\n\n if (dispatch) {\n const selection = TextSelection.create(tr.doc, from, resolvedTo);\n tr.setSelection(selection);\n dispatch(tr);\n }\n\n return true;\n },\n\n selectNode:\n (pos: number) =>\n ({ tr, dispatch }) => {\n // Use tr.doc for chain compatibility - prior commands may have modified the document\n if (pos < 0 || pos >= tr.doc.content.size) {\n return false;\n }\n\n const node = tr.doc.nodeAt(pos);\n\n if (!node) return false;\n\n if (dispatch) {\n const selection = NodeSelection.create(tr.doc, pos);\n tr.setSelection(selection);\n dispatch(tr);\n }\n\n return true;\n },\n\n selectParentNode:\n () =>\n ({ tr, dispatch }) => {\n // Use tr.selection/tr.doc for chain compatibility\n const { $from } = tr.selection;\n\n // Find the nearest parent node that can be selected\n for (let depth = $from.depth; depth > 0; depth--) {\n const node = $from.node(depth);\n const pos = $from.before(depth);\n\n if (node.type.spec.selectable !== false) {\n if (dispatch) {\n const sel = NodeSelection.create(tr.doc, pos);\n tr.setSelection(sel);\n dispatch(tr);\n }\n return true;\n }\n }\n\n return false;\n },\n\n extendSelection:\n (direction: 'left' | 'right' | 'start' | 'end') =>\n ({ tr, dispatch }) => {\n // Use tr.selection/tr.doc for chain compatibility\n let { from, to } = tr.selection;\n\n // Use Selection.atStart/atEnd to find the first/last valid\n // text position, which handles nested structures correctly\n // (e.g. doc > blockquote > paragraph where position 1 is not\n // inside a textblock).\n switch (direction) {\n case 'left':\n from = Math.max(PMSelection.atStart(tr.doc).from, from - 1);\n break;\n case 'right':\n to = Math.min(PMSelection.atEnd(tr.doc).to, to + 1);\n break;\n case 'start':\n from = PMSelection.atStart(tr.doc).from;\n break;\n case 'end':\n to = PMSelection.atEnd(tr.doc).to;\n break;\n }\n\n if (dispatch) {\n const newSelection = TextSelection.create(tr.doc, from, to);\n tr.setSelection(newSelection);\n dispatch(tr);\n }\n\n return true;\n },\n };\n },\n});\n","/**\n * SelectionDecoration Extension\n *\n * Collapses the editor's range selection to a cursor when the editor loses\n * focus. This prevents a \"ghost selection\" from lingering after the user\n * clicks outside the editor (approach A - same as Google Docs / Notion).\n *\n * Toolbar and bubble-menu buttons call `event.preventDefault()` on\n * `mousedown`, so they never trigger blur - the selection stays intact\n * while the user interacts with editor UI.\n */\nimport { Plugin, PluginKey, TextSelection } from '@domternal/pm/state';\nimport { Extension } from '../Extension.js';\n\nexport interface SelectionDecorationOptions {}\n\nexport const selectionDecorationPluginKey = new PluginKey(\n 'selectionDecoration'\n);\n\nexport const SelectionDecoration = Extension.create<SelectionDecorationOptions>(\n {\n name: 'selectionDecoration',\n\n addProseMirrorPlugins() {\n return [\n new Plugin({\n key: selectionDecorationPluginKey,\n props: {\n handleDOMEvents: {\n blur(view, event) {\n // Don't collapse selection when focus moves to editor-related\n // UI (e.g. toolbar, bubble menu, link popover input).\n // Elements marked with [data-dm-editor-ui] or inside\n // .dm-toolbar / .dm-bubble-menu are treated as part of the editor.\n const related = event.relatedTarget;\n if (\n related instanceof HTMLElement &&\n (related.closest('[data-dm-editor-ui]') ||\n related.closest('.dm-toolbar') ||\n related.closest('.dm-bubble-menu'))\n ) {\n return false;\n }\n\n const { from, to } = view.state.selection;\n if (from !== to) {\n view.dispatch(\n view.state.tr.setSelection(\n TextSelection.create(view.state.doc, from)\n )\n );\n }\n return false;\n },\n },\n },\n }),\n ];\n },\n }\n);\n","/**\n * InvisibleChars Extension\n *\n * Shows invisible characters like spaces, paragraph marks, and hard breaks.\n * Useful for document editing where whitespace matters.\n *\n * Styles are included automatically via `@domternal/theme` (`_invisible-chars.scss`).\n *\n * @example\n * ```ts\n * import { InvisibleChars } from '@domternal/core';\n *\n * const editor = new Editor({\n * extensions: [\n * // ... other extensions\n * InvisibleChars.configure({\n * visible: false, // Start hidden\n * paragraph: true,\n * hardBreak: true,\n * space: true,\n * nbsp: true,\n * }),\n * ],\n * });\n *\n * // Toggle visibility\n * editor.commands.toggleInvisibleChars();\n *\n * // Check current state\n * const isVisible = editor.storage.invisibleChars.isVisible();\n * ```\n */\nimport { Extension } from '../Extension.js';\nimport { Plugin, PluginKey } from '@domternal/pm/state';\nimport { Decoration, DecorationSet } from '@domternal/pm/view';\nimport type { Node as ProseMirrorNode } from '@domternal/pm/model';\nimport type { Editor } from '../Editor.js';\nimport type { CommandSpec } from '../types/Commands.js';\nimport type { ToolbarItem } from '../types/Toolbar.js';\n\ndeclare module '@domternal/core' {\n interface RawCommands {\n toggleInvisibleChars: CommandSpec;\n showInvisibleChars: CommandSpec;\n hideInvisibleChars: CommandSpec;\n }\n}\n\nexport const invisibleCharsPluginKey = new PluginKey('invisibleChars');\n\n// Unicode characters for display\nconst CHARS = {\n paragraph: '¶',\n hardBreak: '↵',\n space: '·',\n nbsp: '°',\n};\n\ninterface InvisibleCharsPluginState {\n visible: boolean;\n decorations: DecorationSet;\n}\n\nfunction buildDecorations(\n doc: ProseMirrorNode,\n options: InvisibleCharsOptions,\n): DecorationSet {\n const decorations: Decoration[] = [];\n\n doc.descendants((node, pos) => {\n if (options.paragraph && node.type.name === 'paragraph') {\n const endPos = pos + node.nodeSize - 1;\n decorations.push(\n Decoration.widget(\n endPos,\n () => {\n const span = document.createElement('span');\n span.className = `${options.className} ${options.className}--paragraph`;\n span.textContent = CHARS.paragraph;\n return span;\n },\n { side: -1 }\n )\n );\n }\n\n if (options.hardBreak && node.type.name === 'hardBreak') {\n decorations.push(\n Decoration.widget(\n pos,\n () => {\n const span = document.createElement('span');\n span.className = `${options.className} ${options.className}--hardBreak`;\n span.textContent = CHARS.hardBreak;\n return span;\n },\n { side: -1 }\n )\n );\n }\n\n if (node.isText && node.text) {\n const text = node.text;\n for (let i = 0; i < text.length; i++) {\n const char = text[i];\n const charPos = pos + i;\n\n if (options.space && char === ' ') {\n decorations.push(\n Decoration.inline(charPos, charPos + 1, {\n class: `${options.className} ${options.className}--space`,\n 'data-char': 'space',\n })\n );\n }\n\n if (options.nbsp && char === '\\u00A0') {\n decorations.push(\n Decoration.inline(charPos, charPos + 1, {\n class: `${options.className} ${options.className}--nbsp`,\n 'data-char': 'nbsp',\n })\n );\n }\n }\n }\n });\n\n return DecorationSet.create(doc, decorations);\n}\n\nexport interface InvisibleCharsOptions {\n /**\n * Whether invisible characters are shown.\n * @default false\n */\n visible: boolean;\n\n /**\n * Show paragraph markers (¶).\n * @default true\n */\n paragraph: boolean;\n\n /**\n * Show hard break markers (↵).\n * @default true\n */\n hardBreak: boolean;\n\n /**\n * Show space markers (·).\n * @default true\n */\n space: boolean;\n\n /**\n * Show non-breaking space markers (°).\n * @default true\n */\n nbsp: boolean;\n\n /**\n * Custom CSS class for invisible char decorations.\n * @default 'invisible-char'\n */\n className: string;\n}\n\nexport interface InvisibleCharsStorage {\n /**\n * Toggle visibility of invisible characters.\n */\n toggle: () => void;\n\n /**\n * Current visibility state.\n */\n isVisible: () => boolean;\n}\n\nexport const InvisibleChars = Extension.create<\n InvisibleCharsOptions,\n InvisibleCharsStorage\n>({\n name: 'invisibleChars',\n\n addOptions() {\n return {\n visible: false,\n paragraph: true,\n hardBreak: true,\n space: true,\n nbsp: true,\n className: 'invisible-char',\n };\n },\n\n addStorage() {\n return {\n toggle: (): void => {\n // Initialized in onCreate\n },\n isVisible: () => false,\n };\n },\n\n onCreate() {\n const editor = this.editor as Editor | null;\n const options = this.options;\n\n this.storage.toggle = (): void => {\n const state = editor?.state;\n if (!state) return;\n\n const pluginState = invisibleCharsPluginKey.getState(state) as\n | InvisibleCharsPluginState\n | undefined;\n const currentVisible = pluginState?.visible ?? options.visible;\n\n const tr = state.tr.setMeta(invisibleCharsPluginKey, {\n visible: !currentVisible,\n });\n editor.view.dispatch(tr);\n };\n\n this.storage.isVisible = (): boolean => {\n const state = editor?.state;\n if (!state) return options.visible;\n const pluginState = invisibleCharsPluginKey.getState(state) as\n | InvisibleCharsPluginState\n | undefined;\n return pluginState?.visible ?? options.visible;\n };\n },\n\n addCommands() {\n return {\n toggleInvisibleChars:\n () =>\n ({ dispatch }) => {\n if (dispatch) {\n this.storage.toggle();\n }\n return true;\n },\n\n showInvisibleChars:\n () =>\n ({ dispatch }) => {\n if (dispatch && !this.storage.isVisible()) {\n this.storage.toggle();\n }\n return true;\n },\n\n hideInvisibleChars:\n () =>\n ({ dispatch }) => {\n if (dispatch && this.storage.isVisible()) {\n this.storage.toggle();\n }\n return true;\n },\n };\n },\n\n addKeyboardShortcuts() {\n return {\n 'Mod-Shift-i': () => {\n return this.editor?.commands.toggleInvisibleChars() ?? false;\n },\n };\n },\n\n addToolbarItems(): ToolbarItem[] {\n return [\n {\n type: 'button',\n name: 'invisibleChars',\n command: 'toggleInvisibleChars',\n icon: 'paragraph',\n label: 'Invisible Characters',\n shortcut: 'Mod-Shift-I',\n group: 'utility',\n priority: 100,\n isActiveFn: (editor) => {\n const storage = editor.storage['invisibleChars'] as\n | { isVisible?: () => boolean }\n | undefined;\n return storage?.isVisible?.() ?? false;\n },\n },\n ];\n },\n\n addProseMirrorPlugins() {\n const options = this.options;\n\n return [\n new Plugin({\n key: invisibleCharsPluginKey,\n\n state: {\n init: (_, state): InvisibleCharsPluginState => ({\n visible: options.visible,\n decorations: options.visible\n ? buildDecorations(state.doc, options)\n : DecorationSet.empty,\n }),\n apply: (tr, prev: InvisibleCharsPluginState, _oldState, newState): InvisibleCharsPluginState => {\n const meta = tr.getMeta(invisibleCharsPluginKey) as\n | { visible: boolean }\n | undefined;\n const visible = meta?.visible ?? prev.visible;\n\n if (!visible) {\n if (!prev.visible) return prev;\n return { visible, decorations: DecorationSet.empty };\n }\n\n // Visibility just toggled on - full rebuild\n if (!prev.visible) {\n return { visible, decorations: buildDecorations(newState.doc, options) };\n }\n\n // Doc changed - rebuild\n if (tr.docChanged) {\n return { visible, decorations: buildDecorations(newState.doc, options) };\n }\n\n // No change - reuse cached\n return prev;\n },\n },\n\n props: {\n decorations: (state) => {\n const pluginState = invisibleCharsPluginKey.getState(state) as\n | InvisibleCharsPluginState\n | undefined;\n return pluginState?.decorations ?? DecorationSet.empty;\n },\n },\n }),\n ];\n },\n});\n","/**\n * TextColor Extension\n *\n * Adds text color styling via the TextStyle mark.\n * Requires TextStyle mark to be enabled.\n *\n * @example\n * ```ts\n * import { TextStyle, TextColor } from '@domternal/core';\n *\n * const editor = new Editor({\n * extensions: [\n * // ... other extensions\n * TextStyle,\n * TextColor, // uses the default 25-color palette\n * ],\n * });\n *\n * editor.commands.setTextColor('#ff0000');\n * editor.commands.unsetTextColor();\n * ```\n */\nimport { Extension } from '../Extension.js';\nimport { normalizeColor } from '../helpers/normalizeColor.js';\nimport type { CommandSpec } from '../types/Commands.js';\nimport type { ToolbarItem } from '../types/Toolbar.js';\nimport { TextStyle } from '../marks/TextStyle.js';\n\ndeclare module '@domternal/core' {\n interface RawCommands {\n setTextColor: CommandSpec<[color: string]>;\n unsetTextColor: CommandSpec;\n setTextColorToken: CommandSpec<[token: string | null]>;\n unsetTextColorToken: CommandSpec;\n }\n}\n\n/**\n * Default 25-color palette (5 columns x 5 rows).\n * Row 1: neutrals (black → white)\n * Row 2: pastel tints\n * Row 3: vivid / saturated\n * Row 4: medium shades\n * Row 5: dark shades\n *\n * Columns: Red, Orange/Yellow, Green, Blue, Purple\n */\nexport const DEFAULT_TEXT_COLORS: string[] = [\n // Row 1 - Neutrals\n '#000000', '#595959', '#a6a6a6', '#d9d9d9', '#ffffff',\n // Row 2 - Pastel\n '#ffc9c9', '#fff3bf', '#b2f2bb', '#a5d8ff', '#d0bfff',\n // Row 3 - Vivid\n '#e03131', '#f08c00', '#2f9e44', '#1971c2', '#7048e8',\n // Row 4 - Medium\n '#ff6b6b', '#ffd43b', '#69db7c', '#4dabf7', '#9775fa',\n // Row 5 - Dark\n '#c92a2a', '#e67700', '#2b8a3e', '#1864ab', '#6741d9',\n];\n\nexport interface TextColorOptions {\n /**\n * List of color values for the palette.\n * Defaults to a 25-color grid (5 cols x 5 rows).\n * Pass a custom array to restrict to specific colors.\n */\n colors: string[];\n\n /**\n * Number of columns in the palette grid.\n * @default 5\n */\n columns: number;\n}\n\nexport const TextColor = Extension.create<TextColorOptions>({\n name: 'textColor',\n\n dependencies: ['textStyle'],\n\n addOptions() {\n return {\n colors: DEFAULT_TEXT_COLORS,\n columns: 5,\n };\n },\n\n addGlobalAttributes() {\n return [\n {\n types: ['textStyle'],\n attributes: {\n color: {\n default: null,\n parseHTML: (element: HTMLElement) => {\n const raw = element.style.color.replace(/['\"]+/g, '');\n return raw ? normalizeColor(raw) : null;\n },\n renderHTML: (attributes: Record<string, unknown>) => {\n const color = attributes['color'] as string | null;\n // Token wins: when a named token is set we render the data\n // attribute (below) and skip the inline style to avoid mixed\n // sources of truth for the same visual color.\n const token = attributes['colorToken'] as string | null;\n if (!color || token) return null;\n return { style: `color: ${color}` };\n },\n },\n colorToken: {\n default: null,\n parseHTML: (element: HTMLElement) => element.getAttribute('data-text-color'),\n renderHTML: (attributes: Record<string, unknown>) => {\n const token = attributes['colorToken'] as string | null;\n if (!token) return null;\n return { 'data-text-color': token };\n },\n },\n },\n },\n ];\n },\n\n addCommands() {\n return {\n // Hex-based color. Mutual exclusion: clears the named token so the\n // legacy hex picker and Notion-style picker can't write conflicting\n // values to the same mark.\n setTextColor:\n (color: string) =>\n ({ commands }) => {\n return commands.setMark('textStyle', { color, colorToken: null });\n },\n\n unsetTextColor:\n () =>\n ({ commands }) => {\n if (!commands.setMark('textStyle', { color: null })) return false;\n commands.removeEmptyTextStyle();\n return true;\n },\n\n // Named-token color. Mutual exclusion: clears the hex `color` so the\n // theme-aware data attribute is the only source of truth.\n setTextColorToken:\n (token: string | null) =>\n ({ commands }) => {\n if (!commands.setMark('textStyle', { colorToken: token, color: null })) return false;\n if (token === null) commands.removeEmptyTextStyle();\n return true;\n },\n\n unsetTextColorToken:\n () =>\n ({ commands }) => {\n if (!commands.setMark('textStyle', { colorToken: null })) return false;\n commands.removeEmptyTextStyle();\n return true;\n },\n };\n },\n\n addExtensions() {\n return [TextStyle];\n },\n\n addToolbarItems(): ToolbarItem[] {\n if (this.options.colors.length === 0) return [];\n\n return [\n {\n type: 'dropdown',\n name: 'textColor',\n icon: 'textAUnderline',\n label: 'Text Color',\n group: 'textStyle',\n priority: 200,\n layout: 'grid',\n gridColumns: this.options.columns,\n defaultIndicatorColor: '#000000',\n items: [\n {\n type: 'button' as const,\n name: 'unsetTextColor',\n command: 'unsetTextColor',\n icon: 'prohibit',\n label: 'Default',\n },\n ...this.options.colors.map((color, i) => ({\n type: 'button' as const,\n name: `textColor-${color}`,\n command: 'setTextColor',\n commandArgs: [color],\n isActive: { name: 'textStyle', attributes: { color } },\n icon: '',\n label: color,\n color,\n priority: 200 - i,\n })),\n ],\n },\n ];\n },\n});\n","/**\n * Highlight Extension\n *\n * Adds background-color highlighting via the TextStyle mark.\n * Requires TextStyle mark to be enabled.\n *\n * @example\n * ```ts\n * import { TextStyle, Highlight } from '@domternal/core';\n *\n * const editor = new Editor({\n * extensions: [\n * // ... other extensions\n * TextStyle,\n * Highlight, // uses the default 25-color palette\n * ],\n * });\n *\n * editor.commands.setHighlight({ color: '#fef08a' });\n * editor.commands.unsetHighlight();\n * editor.commands.toggleHighlight();\n * ```\n */\nimport { Extension } from '../Extension.js';\nimport { normalizeColor } from '../helpers/normalizeColor.js';\nimport { InputRule } from '@domternal/pm/inputrules';\nimport type { CommandSpec } from '../types/Commands.js';\nimport type { ToolbarItem } from '../types/Toolbar.js';\n\ndeclare module '@domternal/core' {\n interface RawCommands {\n setHighlight: CommandSpec<[attributes?: { color?: string }]>;\n unsetHighlight: CommandSpec;\n toggleHighlight: CommandSpec<[attributes?: { color?: string }]>;\n setBackgroundColorToken: CommandSpec<[token: string | null]>;\n unsetBackgroundColorToken: CommandSpec;\n }\n}\n\n/**\n * Default 25-color highlight palette (5 columns x 5 rows).\n * Row 1–2: warm pastels (yellow → pink)\n * Row 3–4: cool pastels (green → purple)\n * Row 5: neutrals\n */\nexport const DEFAULT_HIGHLIGHT_COLORS: string[] = [\n // Row 1 - Classic warm highlights\n '#fef08a', '#fde68a', '#fed7aa', '#fecaca', '#fbcfe8',\n // Row 2 - Lighter warm pastels\n '#fef9c3', '#fef3c7', '#ffedd5', '#fee2e2', '#fce7f3',\n // Row 3 - Cool highlights\n '#a7f3d0', '#99f6e4', '#a5f3fc', '#bfdbfe', '#c4b5fd',\n // Row 4 - Lighter cool pastels\n '#d1fae5', '#ccfbf1', '#cffafe', '#dbeafe', '#ede9fe',\n // Row 5 - Neutrals\n '#e5e7eb', '#d1d5db', '#f3f4f6', '#fafafa', '#ffffff',\n];\n\nexport interface HighlightOptions {\n /**\n * List of color values for the highlight palette.\n * Pass an empty array to get a simple toggle button instead of a dropdown.\n */\n colors: string[];\n\n /**\n * Number of columns in the palette grid.\n * @default 5\n */\n columns: number;\n\n /**\n * Default highlight color used by keyboard shortcut and ==text== input rule.\n * @default '#fef08a'\n */\n defaultColor: string;\n}\n\nexport const Highlight = Extension.create<HighlightOptions>({\n name: 'highlight',\n\n dependencies: ['textStyle'],\n\n addOptions() {\n return {\n colors: DEFAULT_HIGHLIGHT_COLORS,\n columns: 5,\n defaultColor: '#fef08a',\n };\n },\n\n addGlobalAttributes() {\n const { options } = this;\n return [\n {\n types: ['textStyle'],\n attributes: {\n backgroundColor: {\n default: null,\n parseHTML: (element: HTMLElement) => {\n const raw = element.style.backgroundColor.replace(/['\"]+/g, '');\n if (raw) return normalizeColor(raw);\n // Plain <mark> without inline background-color → use default\n if (element.tagName === 'MARK') return options.defaultColor;\n return null;\n },\n renderHTML: (attributes: Record<string, unknown>) => {\n const bg = attributes['backgroundColor'] as string | null;\n // Token wins: when a named token is set, render data attribute\n // only (below) so theme variables control the actual color.\n const token = attributes['backgroundColorToken'] as string | null;\n if (!bg || token) return null;\n return { style: `background-color: ${bg}` };\n },\n },\n backgroundColorToken: {\n default: null,\n parseHTML: (element: HTMLElement) => element.getAttribute('data-bg-color'),\n renderHTML: (attributes: Record<string, unknown>) => {\n const token = attributes['backgroundColorToken'] as string | null;\n if (!token) return null;\n return { 'data-bg-color': token };\n },\n },\n },\n },\n ];\n },\n\n addCommands() {\n const defaultColor = this.options.defaultColor;\n return {\n // Hex-based highlight. Mutual exclusion: clears any named bg token so\n // the legacy hex picker and the Notion-style picker can't write\n // conflicting values to the same mark.\n setHighlight:\n (attributes?: { color?: string }) =>\n ({ commands }) => {\n const color = attributes?.color ?? defaultColor;\n return commands.setMark('textStyle', { backgroundColor: color, backgroundColorToken: null });\n },\n\n unsetHighlight:\n () =>\n ({ commands }) => {\n if (!commands.setMark('textStyle', { backgroundColor: null })) return false;\n commands.removeEmptyTextStyle();\n return true;\n },\n\n toggleHighlight:\n (attributes?: { color?: string }) =>\n ({ commands, state }) => {\n const color = attributes?.color ?? defaultColor;\n const markType = state.schema.marks['textStyle'];\n if (!markType) return false;\n\n const { from, to, empty } = state.selection;\n let hasHighlight = false;\n\n if (empty) {\n const marks = state.storedMarks ?? state.doc.resolve(from).marks();\n const mark = markType.isInSet(marks);\n hasHighlight =\n !!mark?.attrs['backgroundColor'] || !!mark?.attrs['backgroundColorToken'];\n } else {\n state.doc.nodesBetween(from, to, (node) => {\n if (hasHighlight) return false;\n const mark = markType.isInSet(node.marks);\n if (mark?.attrs['backgroundColor'] || mark?.attrs['backgroundColorToken']) {\n hasHighlight = true;\n return false;\n }\n return true;\n });\n }\n\n if (hasHighlight) {\n commands.setMark('textStyle', { backgroundColor: null, backgroundColorToken: null });\n commands.removeEmptyTextStyle();\n return true;\n }\n\n return commands.setMark('textStyle', { backgroundColor: color, backgroundColorToken: null });\n },\n\n // Named-token highlight. Mutual exclusion: clears the hex\n // backgroundColor so the theme-aware data attribute is the sole source\n // of truth.\n setBackgroundColorToken:\n (token: string | null) =>\n ({ commands }) => {\n if (!commands.setMark('textStyle', { backgroundColorToken: token, backgroundColor: null })) {\n return false;\n }\n if (token === null) commands.removeEmptyTextStyle();\n return true;\n },\n\n unsetBackgroundColorToken:\n () =>\n ({ commands }) => {\n if (!commands.setMark('textStyle', { backgroundColorToken: null })) return false;\n commands.removeEmptyTextStyle();\n return true;\n },\n };\n },\n\n addKeyboardShortcuts() {\n return {\n 'Mod-Shift-h': () =>\n this.editor?.commands.toggleHighlight() ?? false,\n };\n },\n\n addInputRules() {\n const defaultColor = this.options.defaultColor;\n return [\n new InputRule(\n /(?:==)([^=]+)(?:==)$/,\n (state, match, start, end) => {\n const textStyleType = state.schema.marks['textStyle'];\n if (!textStyleType) return null;\n\n const content = match[1];\n if (!content) return null;\n\n const { tr } = state;\n tr.replaceWith(start, end, state.schema.text(content));\n tr.addMark(\n start,\n start + content.length,\n textStyleType.create({ backgroundColor: defaultColor }),\n );\n tr.removeStoredMark(textStyleType);\n return tr;\n },\n ),\n ];\n },\n\n addToolbarItems(): ToolbarItem[] {\n const defaultColor = this.options.defaultColor;\n\n if (this.options.colors.length === 0) {\n return [\n {\n type: 'button',\n name: 'highlight',\n command: 'toggleHighlight',\n isActive: { name: 'textStyle', attributes: { backgroundColor: defaultColor } },\n icon: 'highlighterCircle',\n label: 'Highlight',\n shortcut: 'Mod-Shift-H',\n group: 'format',\n priority: 150,\n },\n ];\n }\n\n return [\n {\n type: 'dropdown',\n name: 'highlight',\n icon: 'highlighterCircle',\n label: 'Highlight',\n group: 'format',\n priority: 150,\n layout: 'grid',\n gridColumns: this.options.columns,\n items: [\n {\n type: 'button' as const,\n name: 'unsetHighlight',\n command: 'unsetHighlight',\n icon: 'prohibit',\n label: 'No highlight',\n },\n ...this.options.colors.map((color, i) => ({\n type: 'button' as const,\n name: `highlight-${color}`,\n command: 'setHighlight',\n commandArgs: [{ color }],\n isActive: { name: 'textStyle', attributes: { backgroundColor: color } },\n icon: '',\n label: color,\n color,\n priority: 200 - i,\n })),\n ],\n },\n ];\n },\n});\n","/**\n * FontFamily Extension\n *\n * Adds font family styling via the TextStyle mark.\n * Requires TextStyle mark to be enabled.\n *\n * @example\n * ```ts\n * import { TextStyle, FontFamily } from '@domternal/core';\n *\n * const editor = new Editor({\n * extensions: [\n * // ... other extensions\n * TextStyle,\n * FontFamily.configure({\n * fontFamilies: ['Arial', 'Times New Roman', 'Courier New'],\n * }),\n * ],\n * });\n *\n * editor.commands.setFontFamily('Arial');\n * editor.commands.unsetFontFamily();\n * ```\n */\nimport { Extension } from '../Extension.js';\nimport type { CommandSpec } from '../types/Commands.js';\nimport type { ToolbarItem } from '../types/Toolbar.js';\nimport { TextStyle } from '../marks/TextStyle.js';\n\ndeclare module '@domternal/core' {\n interface RawCommands {\n setFontFamily: CommandSpec<[fontFamily: string]>;\n unsetFontFamily: CommandSpec;\n }\n}\n\nexport interface FontFamilyOptions {\n /**\n * List of font families shown in the toolbar dropdown.\n * Any font family is accepted from pasted HTML regardless of this list.\n * @default ['Arial', 'Verdana', 'Tahoma', 'Trebuchet MS', 'Times New Roman', 'Georgia', 'Palatino Linotype', 'Courier New']\n */\n fontFamilies: string[];\n}\n\nexport const FontFamily = Extension.create<FontFamilyOptions>({\n name: 'fontFamily',\n\n dependencies: ['textStyle'],\n\n addOptions() {\n return {\n fontFamilies: ['Arial', 'Verdana', 'Tahoma', 'Trebuchet MS', 'Times New Roman', 'Georgia', 'Palatino Linotype', 'Courier New'],\n };\n },\n\n addGlobalAttributes() {\n return [\n {\n types: ['textStyle'],\n attributes: {\n fontFamily: {\n default: null,\n parseHTML: (element: HTMLElement) => {\n return element.style.fontFamily.replace(/['\"]+/g, '') || null;\n },\n renderHTML: (attributes: Record<string, unknown>) => {\n const fontFamily = attributes['fontFamily'] as string | null;\n if (!fontFamily) return null;\n\n const value = fontFamily.includes(' ') ? `'${fontFamily}'` : fontFamily;\n return { style: `font-family: ${value}` };\n },\n },\n },\n },\n ];\n },\n\n addCommands() {\n return {\n setFontFamily:\n (fontFamily: string) =>\n ({ commands }) => {\n return commands.setMark('textStyle', { fontFamily });\n },\n\n unsetFontFamily:\n () =>\n ({ commands }) => {\n if (!commands.setMark('textStyle', { fontFamily: null })) return false;\n commands.removeEmptyTextStyle();\n return true;\n },\n };\n },\n\n addExtensions() {\n return [TextStyle];\n },\n\n addToolbarItems(): ToolbarItem[] {\n if (this.options.fontFamilies.length === 0) return [];\n\n return [\n {\n type: 'dropdown',\n name: 'fontFamily',\n icon: 'textAa',\n label: 'Font Family',\n group: 'textStyle',\n priority: 150,\n displayMode: 'text',\n dynamicLabel: true,\n computedStyleProperty: 'font-family',\n items: this.options.fontFamilies.map((font, i) => ({\n type: 'button' as const,\n name: `fontFamily-${font}`,\n command: 'setFontFamily',\n commandArgs: [font],\n isActive: { name: 'textStyle', attributes: { fontFamily: font } },\n icon: 'textAa',\n label: font,\n style: `font-family: ${font.includes(' ') ? `'${font}'` : font}`,\n priority: 200 - i,\n })),\n },\n ];\n },\n});\n","/**\n * FontSize Extension\n *\n * Adds font size styling via the TextStyle mark.\n * Requires TextStyle mark to be enabled.\n *\n * @example\n * ```ts\n * import { TextStyle, FontSize } from '@domternal/core';\n *\n * const editor = new Editor({\n * extensions: [\n * // ... other extensions\n * TextStyle,\n * FontSize.configure({\n * fontSizes: ['12px', '14px', '16px', '18px', '24px', '32px'],\n * }),\n * ],\n * });\n *\n * editor.commands.setFontSize('16px');\n * editor.commands.unsetFontSize();\n * ```\n */\nimport { Extension } from '../Extension.js';\nimport type { CommandSpec } from '../types/Commands.js';\nimport type { ToolbarButton, ToolbarItem } from '../types/Toolbar.js';\nimport { TextStyle } from '../marks/TextStyle.js';\n\ndeclare module '@domternal/core' {\n interface RawCommands {\n setFontSize: CommandSpec<[fontSize: string]>;\n unsetFontSize: CommandSpec;\n }\n}\n\nexport interface FontSizeOptions {\n /**\n * List of font sizes shown in the toolbar dropdown.\n * Any font size is accepted from pasted HTML regardless of this list.\n * @default ['12px', '14px', '16px', '18px', '24px', '32px']\n */\n fontSizes: string[];\n\n /**\n * Show an unset/reset button at the end of the dropdown.\n * @default false\n */\n showReset: boolean;\n}\n\nexport const FontSize = Extension.create<FontSizeOptions>({\n name: 'fontSize',\n\n dependencies: ['textStyle'],\n\n addOptions() {\n return {\n fontSizes: ['12px', '14px', '16px', '18px', '24px', '32px'],\n showReset: false,\n };\n },\n\n addGlobalAttributes() {\n return [\n {\n types: ['textStyle'],\n attributes: {\n fontSize: {\n default: null,\n parseHTML: (element: HTMLElement) => {\n return element.style.fontSize || null;\n },\n renderHTML: (attributes: Record<string, unknown>) => {\n const fontSize = attributes['fontSize'] as string | null;\n if (!fontSize) return null;\n\n return { style: `font-size: ${fontSize}` };\n },\n },\n },\n },\n ];\n },\n\n addCommands() {\n return {\n setFontSize:\n (fontSize: string) =>\n ({ commands }) => {\n return commands.setMark('textStyle', { fontSize });\n },\n\n unsetFontSize:\n () =>\n ({ commands }) => {\n if (!commands.setMark('textStyle', { fontSize: null })) return false;\n commands.removeEmptyTextStyle();\n return true;\n },\n };\n },\n\n addExtensions() {\n return [TextStyle];\n },\n\n addToolbarItems(): ToolbarItem[] {\n if (this.options.fontSizes.length === 0) return [];\n\n const sizes = this.options.fontSizes;\n\n const items: ToolbarButton[] = sizes.map((size, i) => ({\n type: 'button' as const,\n name: `fontSize-${size}`,\n command: 'setFontSize',\n commandArgs: [size],\n isActive: { name: 'textStyle', attributes: { fontSize: size } },\n icon: 'textSize',\n label: size,\n priority: 200 - i,\n }));\n\n if (this.options.showReset) {\n items.push({\n type: 'button' as const,\n name: 'unsetFontSize',\n command: 'unsetFontSize',\n icon: 'textSize',\n label: '–',\n priority: 0,\n });\n }\n\n return [\n {\n type: 'dropdown',\n name: 'fontSize',\n icon: 'textSize',\n label: 'Font Size',\n group: 'textStyle',\n priority: 100,\n displayMode: 'text',\n dynamicLabel: true,\n dynamicLabelFallback: '16px',\n computedStyleProperty: 'font-size',\n items,\n },\n ];\n },\n});\n","/**\n * NotionColorPicker Extension\n *\n * Provides toolbar registration for a Notion-style inline color picker that\n * drives the `colorToken` / `backgroundColorToken` attributes on the textStyle\n * mark (added by TextColor and Highlight).\n *\n * Owns:\n * - The shared named-token palette (default: 9 Notion-style colors).\n * - A bubble-menu-only toolbar item (`notionColor`) that emits a custom\n * `notionColorOpen` event when clicked. Framework wrappers listen for the\n * event and render the actual picker panel.\n *\n * The panel renders the full palette every time it opens; no MRU/recent\n * tracking is kept because all 18 swatches (9 text + 9 bg) fit in one view.\n *\n * @example\n * ```ts\n * import { TextStyle, TextColor, Highlight, NotionColorPicker } from '@domternal/core';\n *\n * const editor = new Editor({\n * extensions: [\n * TextStyle,\n * TextColor,\n * Highlight,\n * NotionColorPicker,\n * ],\n * });\n * ```\n */\nimport { Extension } from '../Extension.js';\nimport type { ToolbarItem } from '../types/Toolbar.js';\n\n/**\n * Default named tokens. Match the BlockColor palette + theme tokens\n * (`--dm-block-text-<token>`, `--dm-block-bg-<token>`) so light and dark\n * themes render the right hex without any extra CSS work.\n */\nexport const DEFAULT_NOTION_COLOR_PALETTE: readonly string[] = Object.freeze([\n 'gray',\n 'brown',\n 'orange',\n 'yellow',\n 'green',\n 'blue',\n 'purple',\n 'pink',\n 'red',\n]);\n\nexport interface NotionColorPickerOptions {\n /**\n * Named tokens shown in the picker. Each token must have matching\n * `--dm-block-text-<token>` and `--dm-block-bg-<token>` CSS variables in\n * the active theme; tokens with no theme support render as transparent\n * swatches.\n * @default DEFAULT_NOTION_COLOR_PALETTE\n */\n palette: readonly string[];\n}\n\nexport interface NotionColorPickerStorage {\n /** Whether the picker panel is currently open. UI sets this. */\n isOpen: boolean;\n}\n\nexport const NotionColorPicker = Extension.create<\n NotionColorPickerOptions,\n NotionColorPickerStorage\n>({\n name: 'notionColorPicker',\n\n // The picker writes textStyle.colorToken / textStyle.backgroundColorToken,\n // so TextStyle must be present. TextColor and Highlight are recommended\n // (they own those attribute schemas) but not strictly required: a host app\n // could supply its own attribute providers if it really wants to.\n dependencies: ['textStyle'],\n\n addOptions() {\n return {\n palette: DEFAULT_NOTION_COLOR_PALETTE,\n };\n },\n\n addStorage() {\n return {\n isOpen: false,\n };\n },\n\n addToolbarItems(): ToolbarItem[] {\n return [\n {\n type: 'button',\n name: 'notionColor',\n // emitEvent takes priority over `command` at click time. The `command`\n // field is required by the ToolbarButton schema, so we point it at a\n // harmless built-in that fires only if a host disables the popover UI.\n command: 'focus',\n // The \"A with an underline\" glyph is the closest match in our icon\n // set; the framework wrapper can repaint the underline to reflect\n // the current selection's color.\n icon: 'textAUnderline',\n label: 'Text and background color',\n emitEvent: 'notionColorOpen',\n group: 'textStyle',\n priority: 250,\n // Bubble-menu-only: the legacy hex pickers (TextColor / Highlight)\n // stay in the main toolbar; this token-based picker is a Notion-mode\n // affordance surfaced beside the text-format buttons in the bubble.\n toolbar: false,\n },\n ];\n },\n});\n","/**\n * ClearFormatting Extension\n *\n * Adds a toolbar button that removes all formatting marks from the current\n * selection. Marks with `isFormatting: false` (like Link) are preserved.\n *\n * Uses the built-in `unsetAllMarks` command.\n *\n * @example\n * ```ts\n * import { ClearFormatting } from '@domternal/core';\n *\n * const editor = new Editor({\n * extensions: [\n * // ... other extensions\n * ClearFormatting,\n * ],\n * });\n *\n * editor.commands.unsetAllMarks(); // removes formatting marks from selection\n * ```\n */\nimport { Extension } from '../Extension.js';\nimport type { ToolbarItem } from '../types/Toolbar.js';\n\nexport const ClearFormatting = Extension.create({\n name: 'clearFormatting',\n\n addToolbarItems(): ToolbarItem[] {\n return [\n {\n type: 'button',\n name: 'clearFormatting',\n command: 'unsetAllMarks',\n icon: 'textTSlash',\n label: 'Clear Formatting',\n group: 'utilities',\n priority: 200,\n },\n ];\n },\n});\n","/**\n * LinkPopover Extension\n *\n * Provides a floating URL input popover for editing links.\n * This is a UI extension - it creates DOM elements and should only be used\n * when a visual link-editing UI is desired. In headless (core-only) setups\n * this extension can be omitted; users build their own link UI instead.\n *\n * Listens for the `linkEdit` editor event (emitted by Link's Mod-K shortcut\n * and the toolbar link button) to toggle the popover.\n *\n * Included in StarterKit by default. Disable with:\n * ```ts\n * StarterKit.configure({ linkPopover: false })\n * ```\n */\nimport { Plugin, PluginKey, TextSelection } from '@domternal/pm/state';\nimport type { MarkType } from '@domternal/pm/model';\nimport { Decoration, DecorationSet } from '@domternal/pm/view';\nimport { Extension } from '../Extension.js';\nimport { isValidUrl } from '../helpers/isValidUrl.js';\nimport { getMarkRange } from '../helpers/getMarkRange.js';\nimport { defaultIcons } from '../icons/index.js';\nimport { positionFloating } from '../utils/positionFloating.js';\nimport { copyThemeClass } from '../utils/copyThemeClass.js';\nimport type { Editor } from '../Editor.js';\n\nexport interface LinkPopoverOptions {\n /**\n * List of allowed URL protocols (should match Link mark's protocols)\n * @default ['http:', 'https:', 'mailto:', 'tel:']\n */\n protocols: string[];\n}\n\ninterface LinkPopoverPluginOptions {\n editor: Editor;\n markType: MarkType;\n protocols: string[];\n}\n\nconst linkPopoverPluginKey = new PluginKey('linkPopover');\n\nfunction linkPopoverPlugin({ editor, markType, protocols }: LinkPopoverPluginOptions): Plugin {\n // Build DOM elements\n const el = document.createElement('div');\n el.className = 'dm-link-popover';\n el.setAttribute('data-dm-editor-ui', '');\n el.style.display = 'none';\n\n const input = document.createElement('input');\n input.type = 'url';\n input.placeholder = 'Enter URL...';\n input.className = 'dm-link-popover-input';\n input.setAttribute('aria-label', 'URL');\n\n const applyBtn = document.createElement('button');\n applyBtn.type = 'button';\n applyBtn.className = 'dm-link-popover-btn dm-link-popover-apply';\n applyBtn.title = 'Apply link';\n applyBtn.setAttribute('aria-label', 'Apply link');\n applyBtn.innerHTML = defaultIcons['check'] ?? '';\n\n const removeBtn = document.createElement('button');\n removeBtn.type = 'button';\n removeBtn.className = 'dm-link-popover-btn dm-link-popover-remove';\n removeBtn.title = 'Remove link';\n removeBtn.setAttribute('aria-label', 'Remove link');\n removeBtn.innerHTML = defaultIcons['linkBreak'] ?? '';\n\n el.appendChild(input);\n el.appendChild(applyBtn);\n el.appendChild(removeBtn);\n\n let isOpen = false;\n let hasExistingLink = false;\n let cleanupFloating: (() => void) | null = null;\n let toggleAnchor: HTMLElement | null = null;\n\n /** Write isOpen state to the Link mark's storage for toolbar expanded state */\n const setLinkStorageOpen = (value: boolean): void => {\n const linkStorage = editor.storage['link'] as Record<string, unknown> | undefined;\n if (linkStorage) linkStorage['isOpen'] = value;\n };\n\n const show = (anchorElement?: HTMLElement): void => {\n toggleAnchor = anchorElement ?? null;\n // Detect existing link at cursor\n const { state } = editor.view;\n const { from, empty } = state.selection;\n let existingHref: string | null = null;\n\n if (empty) {\n const $pos = state.doc.resolve(from);\n const linkMark = $pos.marks().find((m: { type: { name: string } }) => m.type === markType);\n existingHref = linkMark ? (linkMark.attrs as Record<string, unknown>)['href'] as string : null;\n } else {\n // Check marks in selection\n const { to } = state.selection;\n state.doc.nodesBetween(from, to, (node) => {\n if (existingHref) return false;\n const linkMark = node.marks.find((m: { type: { name: string } }) => m.type === markType);\n if (linkMark) existingHref = (linkMark.attrs as Record<string, unknown>)['href'] as string;\n return true;\n });\n }\n\n hasExistingLink = existingHref !== null;\n input.value = existingHref ?? '';\n removeBtn.style.display = hasExistingLink ? '' : 'none';\n\n el.style.display = '';\n el.setAttribute('data-show', '');\n isOpen = true;\n setLinkStorageOpen(true);\n\n // Show a visual decoration on the selected range while the popover is\n // open. The browser removes native selection highlight when the input\n // takes focus, so we render our own via ProseMirror DecorationSet.\n // Dispatch AFTER setting storage['isOpen'] so the toolbar transaction\n // handler sees the updated value.\n if (!empty) {\n const { to } = state.selection;\n editor.view.dispatch(state.tr.setMeta(linkPopoverPluginKey, { from, to }));\n } else {\n // No decoration needed but still trigger toolbar active-state refresh\n editor.view.dispatch(editor.view.state.tr);\n }\n\n // Position below the anchor element (toolbar/bubble-menu button) or cursor\n const reference: Element | { getBoundingClientRect: () => DOMRect } = anchorElement ?? {\n getBoundingClientRect: () => {\n const coords = editor.view.coordsAtPos(from);\n return new DOMRect(coords.left, coords.top, 0, coords.bottom - coords.top);\n },\n };\n\n // When the popover was triggered from a bubble-menu / toolbar button\n // (anchor present), reparent into the editor wrapper so it inherits\n // `.dm-editor` CSS custom properties and aligns visually with the\n // anchor button - mirrors NotionColorPicker. Without an anchor (Mod-K\n // shortcut path) keep the popover in document.body to avoid\n // overflow-clip from the editor wrapper.\n if (anchorElement) {\n const editorEl = anchorElement.closest<HTMLElement>('.dm-editor');\n if (editorEl && el.parentElement !== editorEl) {\n editorEl.appendChild(el);\n }\n } else if (el.parentElement !== document.body) {\n document.body.appendChild(el);\n }\n // Refresh on every show so runtime theme toggles propagate. Reparenting\n // back into .dm-editor (anchor path) does not need this since the editor's\n // own classes cascade, but the body-portaled path otherwise misses\n // the `dm-theme-dark` token cascade.\n copyThemeClass(editor.view, el);\n\n cleanupFloating?.();\n cleanupFloating = positionFloating(reference, el, {\n placement: anchorElement ? 'bottom-start' : 'bottom',\n offsetValue: 4,\n });\n\n input.focus();\n input.select();\n };\n\n const hide = (): void => {\n if (!isOpen) return;\n toggleAnchor = null;\n cleanupFloating?.();\n cleanupFloating = null;\n el.removeAttribute('data-show');\n el.style.display = 'none';\n isOpen = false;\n setLinkStorageOpen(false);\n // Clear pending-link decoration - dispatch AFTER setting storage['isOpen']\n // so the toolbar transaction handler sees the updated value.\n editor.view.dispatch(editor.view.state.tr.setMeta(linkPopoverPluginKey, null));\n input.value = '';\n };\n\n const applyLink = (): void => {\n let href = input.value.trim();\n if (!href) {\n hide();\n editor.view.focus();\n return;\n }\n\n // Auto-prepend https:// if no protocol\n if (!/^[a-z][a-z0-9+.-]*:/i.test(href)) {\n href = 'https://' + href;\n }\n\n if (!isValidUrl(href, { protocols })) {\n hide();\n editor.view.focus();\n return;\n }\n\n // If cursor is on existing link with no selection, select the full link range\n // and apply the mark in a single transaction to avoid visual flash\n const { state } = editor.view;\n const { from, empty } = state.selection;\n\n if (empty && hasExistingLink) {\n const $pos = state.doc.resolve(from);\n const range = getMarkRange($pos, markType);\n if (range) {\n const tr = state.tr\n .setSelection(TextSelection.create(state.doc, range.from, range.to))\n .addMark(range.from, range.to, markType.create({ href }));\n editor.view.dispatch(tr);\n hide();\n editor.view.focus();\n return;\n }\n }\n\n editor.commands.setLink({ href });\n hide();\n editor.view.focus();\n };\n\n const removeLink = (): void => {\n editor.commands.unsetLink();\n hide();\n editor.view.focus();\n };\n\n // Event handlers\n const onLinkEdit = (data: { anchorElement?: HTMLElement }): void => {\n if (isOpen) {\n hide();\n editor.view.focus();\n } else {\n show(data.anchorElement);\n }\n };\n\n const onInputKeydown = (e: KeyboardEvent): void => {\n if (e.key === 'Enter') {\n e.preventDefault();\n applyLink();\n } else if (e.key === 'Escape') {\n e.preventDefault();\n hide();\n editor.view.focus();\n } else if (e.key === 'Tab') {\n e.preventDefault();\n if (e.shiftKey) {\n (hasExistingLink ? removeBtn : applyBtn).focus();\n } else {\n applyBtn.focus();\n }\n }\n };\n\n const onButtonKeydown = (e: KeyboardEvent): void => {\n if (e.key === 'Escape') {\n e.preventDefault();\n hide();\n editor.view.focus();\n } else if (e.key === 'Tab') {\n e.preventDefault();\n const target = e.target as HTMLElement;\n if (e.shiftKey) {\n if (target === applyBtn) {\n input.focus();\n } else {\n applyBtn.focus();\n }\n } else {\n if (target === applyBtn && hasExistingLink) {\n removeBtn.focus();\n } else {\n input.focus();\n }\n }\n } else if (e.key === 'Enter') {\n e.preventDefault();\n (e.target as HTMLElement).click();\n }\n };\n\n const onClickOutside = (e: MouseEvent): void => {\n if (!isOpen || el.contains(e.target as Node)) return;\n // Skip if clicking the toolbar button that toggles this popover -\n // the button's click handler will fire onLinkEdit to toggle.\n if (toggleAnchor && (toggleAnchor === e.target || toggleAnchor.contains(e.target as Node))) return;\n hide();\n };\n\n const onPreventBlur = (e: MouseEvent): void => {\n e.preventDefault();\n };\n\n return new Plugin({\n key: linkPopoverPluginKey,\n\n state: {\n init() {\n return DecorationSet.empty;\n },\n apply(tr, decorations) {\n const meta = tr.getMeta(linkPopoverPluginKey) as { from: number; to: number } | null | undefined;\n if (meta === null) return DecorationSet.empty;\n if (meta) {\n return DecorationSet.create(tr.doc, [\n Decoration.inline(meta.from, meta.to, { class: 'dm-link-pending' }),\n ]);\n }\n return decorations.map(tr.mapping, tr.doc);\n },\n },\n\n props: {\n decorations(state) {\n return linkPopoverPluginKey.getState(state) as DecorationSet;\n },\n },\n\n view: () => {\n // Append to document.body so it's not clipped by .dm-editor overflow:hidden\n document.body.appendChild(el);\n\n // Register all event listeners here - ProseMirror calls destroy()/view()\n // on plugin view rebuilds, so listeners must be re-attached each time.\n input.addEventListener('keydown', onInputKeydown);\n applyBtn.addEventListener('mousedown', onPreventBlur);\n applyBtn.addEventListener('click', applyLink);\n applyBtn.addEventListener('keydown', onButtonKeydown);\n removeBtn.addEventListener('mousedown', onPreventBlur);\n removeBtn.addEventListener('click', removeLink);\n removeBtn.addEventListener('keydown', onButtonKeydown);\n document.addEventListener('mousedown', onClickOutside);\n editor.on('linkEdit', onLinkEdit);\n\n return {\n destroy: () => {\n hide();\n input.removeEventListener('keydown', onInputKeydown);\n applyBtn.removeEventListener('mousedown', onPreventBlur);\n applyBtn.removeEventListener('click', applyLink);\n applyBtn.removeEventListener('keydown', onButtonKeydown);\n removeBtn.removeEventListener('mousedown', onPreventBlur);\n removeBtn.removeEventListener('click', removeLink);\n removeBtn.removeEventListener('keydown', onButtonKeydown);\n document.removeEventListener('mousedown', onClickOutside);\n editor.off('linkEdit', onLinkEdit);\n el.remove();\n },\n };\n },\n });\n}\n\nexport const LinkPopover = Extension.create<LinkPopoverOptions>({\n name: 'linkPopover',\n\n dependencies: ['link'],\n\n addOptions() {\n return {\n protocols: ['http:', 'https:', 'mailto:', 'tel:'],\n };\n },\n\n addProseMirrorPlugins() {\n const editor = this.editor as unknown as Editor;\n const markType = editor.schema.marks['link'];\n if (!markType) return [];\n\n return [\n linkPopoverPlugin({\n editor,\n markType,\n protocols: this.options.protocols,\n }),\n ];\n },\n});\n","/**\n * Floating menu shown when text is selected. Contextual formatting toolbar.\n */\nimport { Extension } from '../Extension.js';\nimport { Plugin, PluginKey, TextSelection } from '@domternal/pm/state';\nimport type { EditorView } from '@domternal/pm/view';\nimport type { EditorState } from '@domternal/pm/state';\nimport type { Editor } from '../Editor.js';\nimport { positionFloatingOnce } from '../utils/positionFloating.js';\n\nexport const bubbleMenuPluginKey = new PluginKey('bubbleMenu');\n\n// Default shouldShow: text selection with actual content in an editable editor\nfunction defaultShouldShow({\n editor,\n state,\n from,\n to,\n}: {\n editor: Editor;\n view: EditorView;\n state: EditorState;\n from: number;\n to: number;\n}): boolean {\n const { selection } = state;\n\n // Must have a non-empty selection\n if (selection.empty) return false;\n\n // Must be a text selection (not NodeSelection for images/HR)\n if (!(selection instanceof TextSelection)) return false;\n\n // Must have actual text content (double-click empty paragraph produces from!=to but no text)\n if (!state.doc.textBetween(from, to).length) return false;\n\n // Don't show if editor is not editable\n if (!editor.isEditable) return false;\n\n // Don't show inside table cells - the cell toolbar handles table formatting.\n // Extensions can opt-in via a custom shouldShow if needed.\n const $from = state.doc.resolve(from);\n for (let d = $from.depth; d > 0; d--) {\n const name = $from.node(d).type.name;\n if (name === 'tableCell' || name === 'tableHeader') return false;\n }\n\n return true;\n}\n\nexport interface BubbleMenuOptions {\n /**\n * The HTML element that contains the menu.\n * Must be provided by the user.\n */\n element: HTMLElement | null;\n\n /**\n * Duration in ms to wait before showing the menu.\n * @default 0\n */\n updateDelay: number;\n\n /**\n * Function to determine if the menu should be shown.\n * By default, shows for text selections with actual content in an editable editor.\n */\n shouldShow: (props: {\n editor: Editor;\n view: EditorView;\n state: EditorState;\n from: number;\n to: number;\n }) => boolean;\n\n /**\n * Placement of the menu relative to the selection.\n * @default 'top'\n */\n placement: 'top' | 'bottom';\n\n /**\n * Offset in pixels from the selection.\n * @default 8\n */\n offset: number;\n}\n\ninterface BubbleMenuPluginState {\n visible: boolean;\n from: number;\n to: number;\n}\n\nexport interface CreateBubbleMenuPluginOptions {\n pluginKey: PluginKey;\n editor: Editor;\n element: HTMLElement;\n shouldShow?: BubbleMenuOptions['shouldShow'];\n placement?: 'top' | 'bottom';\n offset?: number;\n updateDelay?: number;\n}\n\n/**\n * Creates a standalone BubbleMenu ProseMirror plugin.\n * Can be used by framework wrappers (Angular, React, Vue) to create the plugin\n * independently of the extension system.\n */\nexport function createBubbleMenuPlugin(options: CreateBubbleMenuPluginOptions): Plugin {\n const {\n pluginKey,\n editor,\n element,\n shouldShow = defaultShouldShow,\n placement = 'top',\n offset = 8,\n updateDelay = 0,\n } = options;\n\n let updateTimeout: ReturnType<typeof setTimeout> | null = null;\n let focusTimeout: ReturnType<typeof setTimeout> | null = null;\n let mouseupTimeout: ReturnType<typeof setTimeout> | null = null;\n let cleanupFloating: (() => void) | null = null;\n\n const updatePosition = (view: EditorView, from: number, to: number): void => {\n cleanupFloating?.();\n\n // For NodeSelection (images, HRs, etc.), use the actual DOM element\n // for precise alignment. coordsAtPos gives paragraph-wide coords\n // which misaligns the menu for small centered nodes.\n const sel = view.state.selection;\n let reference: Element | { getBoundingClientRect: () => DOMRect } | null = null;\n if ('node' in sel) {\n const dom = view.nodeDOM(from);\n if (dom instanceof HTMLElement) reference = dom;\n }\n reference ??= {\n getBoundingClientRect: () => {\n const start = view.coordsAtPos(from);\n const end = view.coordsAtPos(to);\n return new DOMRect(\n start.left,\n start.top,\n end.right - start.left,\n end.bottom - start.top,\n );\n },\n };\n\n cleanupFloating = positionFloatingOnce(reference, element, {\n placement,\n offsetValue: offset,\n });\n\n element.setAttribute('data-show', '');\n };\n\n const hideMenu = (): void => {\n cleanupFloating?.();\n cleanupFloating = null;\n element.removeAttribute('data-show');\n };\n\n // When the user clicks outside the bubble menu and outside the editor\n // (e.g. on the toolbar), suppress the menu until the selection changes.\n let suppressed = false;\n\n // Suppress bubble menu during active mouse drag inside the editor.\n // Without this, the bubble menu appears mid-drag, and its DOM element\n // blocks prosemirror-tables' posAtCoords() from resolving the cell\n // under the cursor - preventing TextSelection → CellSelection conversion.\n let mouseDown = false;\n\n const onDocumentMousedown = (e: MouseEvent): void => {\n const target = e.target as Node | null;\n if (!target) return;\n // Click inside bubble menu - ignore (handled by onMenuMousedown)\n if (element.contains(target)) return;\n // Click inside editor - let ProseMirror handle selection change\n if (editor.view.dom.contains(target)) return;\n // Click inside an editor-UI overlay (NotionColorPicker, popovers carrying\n // [data-dm-editor-ui]) - treat as part of the bubble menu's interaction\n // surface so the menu doesn't dismiss while the user is operating its\n // own dropdown. Matches the whitelist `onBlur` already uses below.\n if (target instanceof HTMLElement && target.closest('[data-dm-editor-ui]')) return;\n // Outside everything - hide and suppress until selection changes\n hideMenu();\n suppressed = true;\n };\n\n // Prevent blur when clicking inside the bubble menu\n const onMenuMousedown = (e: Event): void => {\n e.preventDefault();\n };\n\n // Initially hide\n hideMenu();\n\n return new Plugin({\n key: pluginKey,\n\n state: {\n init: (): BubbleMenuPluginState => ({\n visible: false,\n from: 0,\n to: 0,\n }),\n apply: (_tr, prevValue, _oldState, newState): BubbleMenuPluginState => {\n const { selection } = newState;\n const { from, to } = selection;\n\n // Reset suppression when the selection range changes\n if (from !== prevValue.from || to !== prevValue.to) {\n suppressed = false;\n }\n\n // Determine visibility\n const visible =\n !suppressed &&\n !selection.empty &&\n shouldShow({\n editor,\n view: editor.view,\n state: newState,\n from,\n to,\n });\n\n return { visible, from, to };\n },\n },\n\n view: (editorView) => {\n // Move element inside .dm-editor (position:relative) so it uses\n // position:absolute - CSS compositor handles scroll, zero jitter.\n const editorEl = editorView.dom.closest('.dm-editor');\n if (editorEl && element.parentElement !== editorEl) {\n editorEl.appendChild(element);\n }\n\n // Track mouse drag to suppress bubble menu during active drag.\n const onEditorMousedown = (e: MouseEvent): void => {\n if (e.button !== 0) return; // only primary button\n mouseDown = true;\n hideMenu();\n };\n const onDocumentMouseup = (): void => {\n if (!mouseDown) return;\n mouseDown = false;\n // Defer to let ProseMirror finalize selection changes from the mouseup\n mouseupTimeout = setTimeout(() => {\n if (mouseDown) return; // new drag started\n const currentState = pluginKey.getState(editor.view.state) as\n | BubbleMenuPluginState\n | undefined;\n if (currentState?.visible) {\n updatePosition(editor.view, currentState.from, currentState.to);\n }\n });\n };\n\n const onFocus = (): void => {\n // Re-evaluate after focus (selection may have settled).\n // Must re-check shouldShow with current state - plugin state may be stale\n // if blur/focus happened without a transaction (e.g. cell handle click,\n // browser extension, or external focus change).\n focusTimeout = setTimeout(() => {\n if (suppressed) {\n hideMenu();\n return;\n }\n if (mouseDown) return; // don't show during drag\n const { selection } = editor.view.state;\n const { from, to } = selection;\n const show =\n !selection.empty &&\n shouldShow({\n editor,\n view: editor.view,\n state: editor.view.state,\n from,\n to,\n });\n if (show) {\n updatePosition(editor.view, from, to);\n } else {\n hideMenu();\n }\n });\n };\n\n const onBlur = ({ event }: { event: FocusEvent }): void => {\n // Don't hide if focus moved to the bubble menu itself or to any\n // overlay that opts into editor-UI semantics by carrying the\n // [data-dm-editor-ui] marker (e.g. NotionColorPicker, popovers).\n // Matches the same whitelist `SelectionDecoration` uses to avoid\n // collapsing the range selection.\n const related = event.relatedTarget;\n if (related instanceof HTMLElement) {\n if (element.contains(related)) return;\n if (related.closest('[data-dm-editor-ui]')) return;\n }\n hideMenu();\n };\n\n // Dismiss when another overlay opens (e.g. table dropdown)\n const onDismissOverlays = (): void => {\n hideMenu();\n suppressed = true;\n };\n\n element.addEventListener('mousedown', onMenuMousedown, { capture: true });\n document.addEventListener('mousedown', onDocumentMousedown);\n editorView.dom.addEventListener('mousedown', onEditorMousedown);\n document.addEventListener('mouseup', onDocumentMouseup);\n editorEl?.addEventListener('dm:dismiss-overlays', onDismissOverlays);\n editor.on('focus', onFocus);\n editor.on('blur', onBlur);\n\n return {\n update: (view, prevState) => {\n // Skip during IME composition\n if (view.composing) return;\n\n const state = pluginKey.getState(view.state) as\n | BubbleMenuPluginState\n | undefined;\n const prevPluginState = pluginKey.getState(prevState) as\n | BubbleMenuPluginState\n | undefined;\n\n // Skip if nothing changed - but reposition when the doc changed\n // while the menu is visible (e.g. image float attribute changed,\n // the DOM element moved but the selection stayed at the same pos)\n if (\n state?.visible === prevPluginState?.visible &&\n state?.from === prevPluginState?.from &&\n state?.to === prevPluginState?.to &&\n !(state?.visible && view.state.doc !== prevState.doc)\n ) {\n // Safety: ensure DOM matches state (onFocus setTimeout can race)\n if (!state?.visible && element.hasAttribute('data-show')) {\n hideMenu();\n }\n return;\n }\n\n // Clear pending update\n if (updateTimeout) {\n clearTimeout(updateTimeout);\n updateTimeout = null;\n }\n\n if (state?.visible && !mouseDown) {\n // Show menu with delay\n if (updateDelay > 0) {\n updateTimeout = setTimeout(() => {\n updatePosition(view, state.from, state.to);\n }, updateDelay);\n } else {\n updatePosition(view, state.from, state.to);\n }\n } else {\n hideMenu();\n }\n },\n\n destroy: () => {\n editor.off('focus', onFocus);\n editor.off('blur', onBlur);\n element.removeEventListener('mousedown', onMenuMousedown, {\n capture: true,\n });\n document.removeEventListener('mousedown', onDocumentMousedown);\n editorView.dom.removeEventListener('mousedown', onEditorMousedown);\n document.removeEventListener('mouseup', onDocumentMouseup);\n editorEl?.removeEventListener('dm:dismiss-overlays', onDismissOverlays);\n if (updateTimeout) {\n clearTimeout(updateTimeout);\n }\n if (focusTimeout) {\n clearTimeout(focusTimeout);\n }\n if (mouseupTimeout) {\n clearTimeout(mouseupTimeout);\n }\n hideMenu();\n },\n };\n },\n });\n}\n\nexport const BubbleMenu = Extension.create<BubbleMenuOptions>({\n name: 'bubbleMenu',\n\n addOptions() {\n return {\n element: null,\n updateDelay: 0,\n shouldShow: defaultShouldShow,\n placement: 'top' as const,\n offset: 8,\n };\n },\n\n addProseMirrorPlugins() {\n const { element, updateDelay, shouldShow, placement, offset } =\n this.options;\n\n if (!element) {\n return [];\n }\n\n const editor = this.editor as Editor | null;\n if (!editor) {\n return [];\n }\n\n return [\n createBubbleMenuPlugin({\n pluginKey: bubbleMenuPluginKey,\n editor,\n element,\n shouldShow,\n placement,\n offset,\n updateDelay,\n }),\n ];\n },\n});\n","/**\n * StarterKit Extension\n *\n * A convenient bundle of commonly-used extensions for quick setup.\n * All included extensions can be configured or disabled individually.\n */\nimport { Extension } from '../Extension.js';\nimport type { AnyExtensionConfig } from '../types/index.js';\n\n// Nodes\nimport { Document } from '../nodes/Document.js';\nimport { Text } from '../nodes/Text.js';\nimport { Paragraph, type ParagraphOptions } from '../nodes/Paragraph.js';\nimport { Heading, type HeadingOptions } from '../nodes/Heading.js';\nimport { Blockquote, type BlockquoteOptions } from '../nodes/Blockquote.js';\nimport { CodeBlock, type CodeBlockOptions } from '../nodes/CodeBlock.js';\nimport { BulletList, type BulletListOptions } from '../nodes/BulletList.js';\nimport { OrderedList, type OrderedListOptions } from '../nodes/OrderedList.js';\nimport { ListItem, type ListItemOptions } from '../nodes/ListItem.js';\nimport {\n HorizontalRule,\n type HorizontalRuleOptions,\n} from '../nodes/HorizontalRule.js';\nimport { HardBreak, type HardBreakOptions } from '../nodes/HardBreak.js';\nimport { TaskList, type TaskListOptions } from '../nodes/TaskList.js';\nimport { TaskItem, type TaskItemOptions } from '../nodes/TaskItem.js';\n\n// Marks\nimport { Bold, type BoldOptions } from '../marks/Bold.js';\nimport { Italic, type ItalicOptions } from '../marks/Italic.js';\nimport { Underline, type UnderlineOptions } from '../marks/Underline.js';\nimport { Strike, type StrikeOptions } from '../marks/Strike.js';\nimport { Code, type CodeOptions } from '../marks/Code.js';\nimport { Link, type LinkOptions } from '../marks/Link.js';\n\n// Functionality\nimport { BaseKeymap, type BaseKeymapOptions } from './BaseKeymap.js';\nimport { History, type HistoryOptions } from './History.js';\nimport { Dropcursor, type DropcursorOptions } from './Dropcursor.js';\nimport { Gapcursor } from './Gapcursor.js';\nimport { TrailingNode, type TrailingNodeOptions } from './TrailingNode.js';\nimport { ListKeymap, type ListKeymapOptions } from './ListKeymap.js';\nimport { ListIndent } from './ListIndent.js';\nimport { LinkPopover, type LinkPopoverOptions } from './LinkPopover.js';\nimport { SelectionDecoration } from './SelectionDecoration.js';\n\nexport interface StarterKitOptions {\n // Nodes\n /**\n * Set to false to disable the Document node.\n */\n document?: false;\n /**\n * Set to false to disable the Text node.\n */\n text?: false;\n /**\n * Set to false to disable the Paragraph node, or pass options to configure it.\n */\n paragraph?: false | Partial<ParagraphOptions>;\n /**\n * Set to false to disable the Heading node, or pass options to configure it.\n */\n heading?: false | Partial<HeadingOptions>;\n /**\n * Set to false to disable the Blockquote node, or pass options to configure it.\n */\n blockquote?: false | Partial<BlockquoteOptions>;\n /**\n * Set to false to disable the CodeBlock node, or pass options to configure it.\n */\n codeBlock?: false | Partial<CodeBlockOptions>;\n /**\n * Set to false to disable the BulletList node, or pass options to configure it.\n */\n bulletList?: false | Partial<BulletListOptions>;\n /**\n * Set to false to disable the OrderedList node, or pass options to configure it.\n */\n orderedList?: false | Partial<OrderedListOptions>;\n /**\n * Set to false to disable the ListItem node, or pass options to configure it.\n */\n listItem?: false | Partial<ListItemOptions>;\n /**\n * Set to false to disable the HorizontalRule node, or pass options to configure it.\n */\n horizontalRule?: false | Partial<HorizontalRuleOptions>;\n /**\n * Set to false to disable the HardBreak node, or pass options to configure it.\n */\n hardBreak?: false | Partial<HardBreakOptions>;\n /**\n * Set to false to disable the TaskList node, or pass options to configure it.\n */\n taskList?: false | Partial<TaskListOptions>;\n /**\n * Set to false to disable the TaskItem node, or pass options to configure it.\n */\n taskItem?: false | Partial<TaskItemOptions>;\n\n // Marks\n /**\n * Set to false to disable the Bold mark, or pass options to configure it.\n */\n bold?: false | Partial<BoldOptions>;\n /**\n * Set to false to disable the Italic mark, or pass options to configure it.\n */\n italic?: false | Partial<ItalicOptions>;\n /**\n * Set to false to disable the Underline mark, or pass options to configure it.\n */\n underline?: false | Partial<UnderlineOptions>;\n /**\n * Set to false to disable the Strike mark, or pass options to configure it.\n */\n strike?: false | Partial<StrikeOptions>;\n /**\n * Set to false to disable the Code mark, or pass options to configure it.\n */\n code?: false | Partial<CodeOptions>;\n /**\n * Set to false to disable the Link mark, or pass options to configure it.\n */\n link?: false | Partial<LinkOptions>;\n\n // Functionality\n /**\n * Set to false to disable the BaseKeymap extension, or pass options to configure it.\n */\n baseKeymap?: false | Partial<BaseKeymapOptions>;\n /**\n * Set to false to disable the History extension, or pass options to configure it.\n */\n history?: false | Partial<HistoryOptions>;\n /**\n * Set to false to disable the Dropcursor extension, or pass options to configure it.\n */\n dropcursor?: false | Partial<DropcursorOptions>;\n /**\n * Set to false to disable the Gapcursor extension.\n */\n gapcursor?: false;\n /**\n * Set to false to disable the TrailingNode extension, or pass options to configure it.\n */\n trailingNode?: false | Partial<TrailingNodeOptions>;\n /**\n * Set to false to disable the ListKeymap extension, or pass options to configure it.\n */\n listKeymap?: false | Partial<ListKeymapOptions>;\n /**\n * Set to false to disable the ListIndent extension. ListIndent adds\n * Tab / Shift-Tab keymap that indents a top-level block under the\n * previous list (and outdents back). Registered AFTER ListKeymap so\n * the in-list-item Tab/Shift-Tab keep priority.\n */\n listIndent?: false;\n /**\n * Set to false to disable the LinkPopover extension, or pass options to configure it.\n */\n linkPopover?: false | Partial<LinkPopoverOptions>;\n /**\n * Set to false to disable the SelectionDecoration extension.\n * When enabled, the editor collapses range selections on blur to prevent\n * ghost selections from lingering after clicking outside the editor.\n */\n selectionDecoration?: false;\n}\n\nexport const StarterKit = Extension.create<StarterKitOptions>({\n name: 'starterKit',\n\n addOptions() {\n return {};\n },\n\n addExtensions() {\n const extensions: AnyExtensionConfig[] = [];\n\n // Helper to conditionally add extension\n const maybeAdd = <T extends object>(\n ext: { configure: (opts: Partial<T>) => AnyExtensionConfig } & AnyExtensionConfig,\n opts: false | Partial<T> | undefined\n ): void => {\n if (opts === false) return;\n if (opts && Object.keys(opts).length > 0) {\n extensions.push(ext.configure(opts));\n } else {\n extensions.push(ext);\n }\n };\n\n // Nodes\n maybeAdd(Document as never, this.options.document as never);\n maybeAdd(Text as never, this.options.text as never);\n maybeAdd(Paragraph, this.options.paragraph);\n maybeAdd(Heading, this.options.heading);\n maybeAdd(Blockquote, this.options.blockquote);\n maybeAdd(CodeBlock, this.options.codeBlock);\n maybeAdd(BulletList, this.options.bulletList);\n maybeAdd(OrderedList, this.options.orderedList);\n maybeAdd(ListItem, this.options.listItem);\n maybeAdd(HorizontalRule, this.options.horizontalRule);\n maybeAdd(HardBreak, this.options.hardBreak);\n maybeAdd(TaskList, this.options.taskList);\n maybeAdd(TaskItem, this.options.taskItem);\n\n // Marks\n maybeAdd(Bold, this.options.bold);\n maybeAdd(Italic, this.options.italic);\n maybeAdd(Underline, this.options.underline);\n maybeAdd(Strike, this.options.strike);\n maybeAdd(Code, this.options.code);\n maybeAdd(Link, this.options.link);\n\n // Functionality\n maybeAdd(BaseKeymap, this.options.baseKeymap);\n maybeAdd(History, this.options.history);\n maybeAdd(Dropcursor, this.options.dropcursor);\n maybeAdd(Gapcursor as never, this.options.gapcursor as never);\n maybeAdd(TrailingNode, this.options.trailingNode);\n maybeAdd(ListKeymap, this.options.listKeymap);\n // ListIndent MUST be registered AFTER ListKeymap. Collected keymaps run\n // in `LATER || EARLIER` order, so a later `addKeyboardShortcuts` runs\n // FIRST. ListIndent fires first, bails when the cursor is inside a\n // list item, and ListKeymap then handles the in-list Tab/Shift-Tab\n // (sinkListItem / liftListItem). Reordering breaks that delegation.\n maybeAdd(ListIndent as never, this.options.listIndent as never);\n maybeAdd(LinkPopover, this.options.linkPopover);\n maybeAdd(SelectionDecoration as never, this.options.selectionDecoration as never);\n\n return extensions;\n },\n});\n","/**\n * @domternal/core\n * Framework-agnostic ProseMirror editor engine\n */\n\nexport const VERSION = '0.1.0';\n\n// === Type exports ===\nexport type {\n // Content types\n JSONAttribute,\n JSONMark,\n JSONContent,\n Content,\n Range,\n // Editor options\n AnyExtension,\n FocusPosition,\n EditorOptions,\n // Editor events\n EditorInstance,\n TransactionEventProps,\n FocusEventProps,\n CreateEventProps,\n ContentErrorProps,\n PasteEventProps,\n DropEventProps,\n MountEventProps,\n DeleteEventProps,\n EditorEvents,\n EditorEventName,\n // Command types\n CommandEditor,\n CommandProps,\n Command,\n CommandSpec,\n CommandMap,\n RawCommands,\n SingleCommands,\n ChainedCommands,\n ChainFailure,\n CanCommands,\n CanChainedCommands,\n KeyboardShortcutCommand,\n // Extension config types\n ExtensionEditor,\n AnyExtensionConfig,\n GlobalAttributeSpec,\n GlobalAttributes,\n ExtensionConfig,\n // Attribute types\n AttributeSpec,\n AttributeSpecs,\n // Node config types\n NodeParseRule,\n NodeRenderHTMLProps,\n NodeConfig,\n // Mark config types\n MarkParseRule,\n MarkRenderHTMLProps,\n MarkConfig,\n // Toolbar types\n IconSet,\n ToolbarButton,\n ToolbarDropdown,\n ToolbarSeparator,\n ToolbarItem,\n ToolbarLayoutDropdown,\n ToolbarLayoutEntry,\n // Floating menu types\n FloatingMenuItem,\n FloatingMenuItemsOverride,\n} from './types/index.js';\n\n// === ProseMirror re-exports (for framework wrappers) ===\nexport { PluginKey } from '@domternal/pm/state';\n\n// === Core classes ===\nexport { EventEmitter } from './EventEmitter.js';\nexport { Editor } from './Editor.js';\nexport {\n ExtensionManager,\n type ExtensionManagerOptions,\n type ExtensionManagerEditor,\n type NodeViewContext,\n} from './ExtensionManager.js';\nexport {\n CommandManager,\n type SetContentOptions,\n type ClearContentOptions,\n type CommandManagerEditor,\n} from './CommandManager.js';\n\n// === Floating UI ===\nexport {\n positionFloating,\n positionFloatingOnce,\n type PositionFloatingOptions,\n} from './utils/positionFloating.js';\n\n// === Inline Styles ===\nexport {\n inlineStyles,\n applyInlineStyles,\n type InlineStyleOverrides,\n} from './utils/inlineStyles.js';\n\n// === Clipboard ===\nexport { writeToClipboard } from './utils/clipboard.js';\n\n// === Theme cascade for portaled elements ===\nexport { copyThemeClass } from './utils/copyThemeClass.js';\n\n// === Bubble menu defaults ===\nexport { defaultBubbleContexts } from './utils/defaultBubbleContexts.js';\n\n// === List utilities ===\nexport {\n insertAsListItemChild,\n type InsertAsListItemChildArgs,\n type InsertAsListItemChildResult,\n} from './utils/insertAsListItemChild.js';\nexport {\n getListItemCursorContext,\n type ListItemCursorContext,\n} from './utils/listItemCursorContext.js';\nexport {\n liftEmptyChildrenZoneParagraph,\n} from './utils/liftEmptyChildrenZoneParagraph.js';\nexport {\n insertChildrenZoneSibling,\n} from './utils/insertChildrenZoneSibling.js';\nexport {\n liftCurrentListItem,\n} from './utils/liftCurrentListItem.js';\nexport {\n splitListForInsert,\n type SplitListForInsertRange,\n} from './utils/splitListForInsert.js';\nexport {\n findListItemAncestorDepth,\n isInsideListItem,\n isInListItemLabel,\n LIST_ITEM_TYPE_NAMES,\n} from './utils/listItemAncestor.js';\n\n// === Helpers ===\nexport {\n createDocument,\n isNodeEmpty,\n isDocumentEmpty,\n callOrReturn,\n markInputRule,\n markInputRulePatterns,\n wrappingInputRule,\n textblockTypeInputRule,\n textInputRule,\n nodeInputRule,\n isValidUrl,\n generateHTML,\n generateJSON,\n generateText,\n type CreateDocumentOptions,\n type IsNodeEmptyOptions,\n type MarkInputRuleOptions,\n type WrappingInputRuleOptions,\n type TextblockTypeInputRuleOptions,\n type TextInputRuleOptions,\n type NodeInputRuleOptions,\n type IsValidUrlOptions,\n type GenerateHTMLOptions,\n type GenerateJSONOptions,\n type GenerateTextOptions,\n getMarkRange,\n type MarkRange,\n findParentNode,\n type FindParentNodeResult,\n findChildren,\n type FindChildResult,\n defaultBlockAt,\n} from './helpers/index.js';\n\n// === Extension System ===\nexport { Extension } from './Extension.js';\nexport { Node } from './Node.js';\n\n// === Toolbar ===\nexport {\n ToolbarController,\n type ToolbarControllerEditor,\n type ToolbarGroup,\n} from './ToolbarController.js';\n\n// === Floating Menu Controller ===\nexport {\n FloatingMenuController,\n FLOATING_MENU_NO_FOCUS,\n type FloatingMenuGroup,\n} from './FloatingMenuController.js';\n\n// === Shared helpers ===\nexport { groupFloatingMenuItems } from './utils/groupFloatingMenuItems.js';\n\n// === Icons ===\nexport { defaultIcons } from './icons/index.js';\n\nexport { Mark } from './Mark.js';\n\n// === Command System ===\nexport {\n ChainBuilder,\n createChainBuilder,\n type ChainBuilderEditor,\n type ChainBuilderOptions,\n} from './ChainBuilder.js';\nexport {\n CanChecker,\n createCanChecker,\n type CanCheckerEditor,\n type CanCheckerOptions,\n} from './CanChecker.js';\nexport {\n buildCommandProps,\n createAccumulatingDispatch,\n type CommandPropsEditor,\n type BuildCommandPropsOptions,\n} from './commandPropsBuilder.js';\nexport {\n builtInCommands,\n // Basic commands\n focus,\n blur,\n setContent,\n clearContent,\n insertText,\n deleteSelection,\n selectAll,\n // Mark commands\n toggleMark,\n setMark,\n unsetMark,\n unsetAllMarks,\n // Block commands\n setBlockType,\n toggleBlockType,\n // Wrap commands\n wrapIn,\n toggleWrap,\n lift,\n // List commands\n toggleList,\n // Insert commands\n insertContent,\n // Selection commands\n selectNodeBackward,\n // Attribute commands\n updateAttributes,\n resetAttributes,\n} from './commands/index.js';\n\n// === Nodes ===\nexport {\n Document,\n Text,\n Paragraph,\n type ParagraphOptions,\n Heading,\n type HeadingOptions,\n Blockquote,\n type BlockquoteOptions,\n CodeBlock,\n type CodeBlockOptions,\n BulletList,\n type BulletListOptions,\n OrderedList,\n type OrderedListOptions,\n ListItem,\n type ListItemOptions,\n HorizontalRule,\n type HorizontalRuleOptions,\n HardBreak,\n type HardBreakOptions,\n TaskList,\n type TaskListOptions,\n TaskItem,\n type TaskItemOptions,\n} from './nodes/index.js';\n\n// === Marks ===\nexport {\n Bold,\n type BoldOptions,\n Italic,\n type ItalicOptions,\n Underline,\n type UnderlineOptions,\n Strike,\n type StrikeOptions,\n Code,\n type CodeOptions,\n Link,\n type LinkOptions,\n type LinkAttributes,\n Subscript,\n type SubscriptOptions,\n Superscript,\n type SuperscriptOptions,\n TextStyle,\n type TextStyleOptions,\n // Link helpers\n linkClickPlugin,\n linkClickPluginKey,\n type LinkClickPluginOptions,\n linkPastePlugin,\n linkPastePluginKey,\n type LinkPastePluginOptions,\n autolinkPlugin,\n autolinkPluginKey,\n type AutolinkPluginOptions,\n linkExitPlugin,\n linkExitPluginKey,\n type LinkExitPluginOptions,\n} from './marks/index.js';\n\n// === Extensions ===\nexport {\n // Core functionality\n BaseKeymap,\n type BaseKeymapOptions,\n History,\n type HistoryOptions,\n Dropcursor,\n type DropcursorOptions,\n Gapcursor,\n TrailingNode,\n type TrailingNodeOptions,\n Placeholder,\n placeholderPluginKey,\n type PlaceholderOptions,\n // List & Count\n ListKeymap,\n type ListKeymapOptions,\n ListIndent,\n indentBlockAsListChild,\n outdentBlockFromListItem,\n CharacterCount,\n characterCountPluginKey,\n type CharacterCountOptions,\n type CharacterCountStorage,\n // Styling\n Typography,\n type TypographyOptions,\n TextAlign,\n type TextAlignOptions,\n Focus,\n focusPluginKey,\n type FocusOptions,\n LineHeight,\n type LineHeightOptions,\n // Block Attributes\n UniqueID,\n uniqueIDPluginKey,\n type UniqueIDOptions,\n BlockColor,\n DEFAULT_BLOCK_COLORS,\n DEFAULT_BLOCK_COLOR_TYPES,\n stripInlineColorConflicts,\n type BlockColorOptions,\n // Selection & Editor Utilities\n Selection,\n type SelectionOptions,\n type SelectionStorage,\n SelectionDecoration,\n selectionDecorationPluginKey,\n type SelectionDecorationOptions,\n InvisibleChars,\n invisibleCharsPluginKey,\n type InvisibleCharsOptions,\n type InvisibleCharsStorage,\n // Text Style Extensions\n TextColor,\n DEFAULT_TEXT_COLORS,\n type TextColorOptions,\n Highlight,\n DEFAULT_HIGHLIGHT_COLORS,\n type HighlightOptions,\n FontFamily,\n type FontFamilyOptions,\n FontSize,\n type FontSizeOptions,\n NotionColorPicker,\n DEFAULT_NOTION_COLOR_PALETTE,\n type NotionColorPickerOptions,\n type NotionColorPickerStorage,\n // Formatting Utilities\n ClearFormatting,\n // Link UI\n LinkPopover,\n type LinkPopoverOptions,\n // Menu Extensions\n BubbleMenu,\n createBubbleMenuPlugin,\n bubbleMenuPluginKey,\n type BubbleMenuOptions,\n type CreateBubbleMenuPluginOptions,\n // Bundle\n StarterKit,\n type StarterKitOptions,\n} from './extensions/index.js';\n"]}
1
+ {"version":3,"sources":["../src/EventEmitter.ts","../src/helpers/inputRulesPlugin.ts","../src/helpers/callOrReturn.ts","../src/ExtensionManager.ts","../src/commands/selectionCommands.ts","../src/helpers/createDocument.ts","../src/helpers/isNodeEmpty.ts","../src/helpers/markInputRule.ts","../src/helpers/wrappingInputRule.ts","../src/helpers/textblockTypeInputRule.ts","../src/helpers/textInputRule.ts","../src/helpers/nodeInputRule.ts","../src/helpers/isValidUrl.ts","../src/helpers/ssr.ts","../src/helpers/getMarkRange.ts","../src/helpers/findParentNode.ts","../src/helpers/findChildren.ts","../src/helpers/defaultBlockAt.ts","../src/commands/contentCommands.ts","../src/Extension.ts","../src/helpers/specBuilder.ts","../src/Mark.ts","../src/commands/markCommands.ts","../src/utils/listItemAncestor.ts","../src/utils/liftCurrentListItem.ts","../src/commands/nodeCommands.ts","../src/utils/listItemCursorContext.ts","../src/commands/listCommands.ts","../src/commands/attributeCommands.ts","../src/commands/index.ts","../src/commandPropsBuilder.ts","../src/ChainBuilder.ts","../src/CanChecker.ts","../src/CommandManager.ts","../src/utils/inlineStyles.ts","../src/helpers/normalizeColor.ts","../src/Editor.ts","../src/utils/positionFloating.ts","../src/utils/clipboard.ts","../src/utils/copyThemeClass.ts","../src/utils/defaultBubbleContexts.ts","../src/utils/insertAsListItemChild.ts","../src/utils/liftEmptyChildrenZoneParagraph.ts","../src/utils/insertChildrenZoneSibling.ts","../src/utils/splitListForInsert.ts","../src/Node.ts","../src/ToolbarController.ts","../src/utils/groupFloatingMenuItems.ts","../src/FloatingMenuController.ts","../src/icons/phosphor.ts","../src/nodes/Document.ts","../src/nodes/Text.ts","../src/nodes/Paragraph.ts","../src/nodes/Heading.ts","../src/nodes/Blockquote.ts","../src/nodes/CodeBlock.ts","../src/extensions/ListKeymap.ts","../src/nodes/ListItem.ts","../src/nodes/BulletList.ts","../src/nodes/OrderedList.ts","../src/nodes/HorizontalRule.ts","../src/nodes/HardBreak.ts","../src/nodes/TaskItemNodeView.ts","../src/nodes/TaskItem.ts","../src/nodes/TaskList.ts","../src/marks/Bold.ts","../src/marks/Italic.ts","../src/marks/Underline.ts","../src/marks/Strike.ts","../src/marks/Code.ts","../src/marks/helpers/linkClickPlugin.ts","../src/marks/helpers/linkPastePlugin.ts","../src/marks/helpers/autolinkPlugin.ts","../src/marks/helpers/linkExitPlugin.ts","../src/marks/Link.ts","../src/marks/Subscript.ts","../src/marks/Superscript.ts","../src/marks/TextStyle.ts","../src/extensions/BaseKeymap.ts","../src/extensions/History.ts","../src/extensions/Dropcursor.ts","../src/extensions/Gapcursor.ts","../src/extensions/TrailingNode.ts","../src/extensions/Placeholder.ts","../src/extensions/ListIndent.ts","../src/extensions/CharacterCount.ts","../src/extensions/Typography.ts","../src/extensions/TextAlign.ts","../src/extensions/Focus.ts","../src/extensions/LineHeight.ts","../src/extensions/UniqueID.ts","../src/extensions/BlockColor.ts","../src/extensions/Selection.ts","../src/extensions/SelectionDecoration.ts","../src/extensions/InvisibleChars.ts","../src/extensions/TextColor.ts","../src/extensions/Highlight.ts","../src/extensions/FontFamily.ts","../src/extensions/FontSize.ts","../src/extensions/NotionColorPicker.ts","../src/extensions/ClearFormatting.ts","../src/extensions/LinkPopover.ts","../src/extensions/BubbleMenu.ts","../src/extensions/StarterKit.ts","../src/index.ts"],"names":["state","TextSelection","Plugin","Schema","keymap","AllSelection","pmSelectNodeBackward","DOMParser","PMNode","find","InputRule","findWrapping","canJoin","document","DOMSerializer","PMDOMParser","offset","ProseMirrorDOMParser","Fragment","Slice","liftTarget","liftListItem","allWrapped","from","to","$from","$to","range","target","LIST_ITEM_TYPES","allInTargetList","EditorState","wrapRangeInList","EditorView","flip","shift","hide","computePosition","autoUpdate","tr","pos","Node","PluginKey","sinkListItem","splitBlock","splitListItem","Selection","chainCommands","newlineInCode","createParagraphNear","liftEmptyBlock","baseKeymap","undo","redo","history","dropCursor","gapCursor","DecorationSet","isNodeEmpty","Decoration","LIST_WRAPPER_TYPES","NodeSelection","PMSelection"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAsBO,IAAM,eAAN,MAA4F;AAAA;AAAA,EAEvF,SAAA,uBAAgB,GAAA,EAA+C;AAAA;AAAA;AAAA;AAAA,EAKzE,EAAA,CAA2B,OAAU,QAAA,EAA0C;AAC7E,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA;AAE1C,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,SAAA,CAAU,IAAI,QAAkC,CAAA;AAAA,IAClD,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,SAAA,CAAU,IAAI,KAAA,kBAAO,IAAI,IAAI,CAAC,QAAkC,CAAC,CAAC,CAAA;AAAA,IACzE;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,GAAA,CAA4B,OAAU,QAAA,EAA2C;AAC/E,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA;AAE1C,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,IAAI,QAAA,EAAU;AAEZ,QAAA,SAAA,CAAU,OAAO,QAAkC,CAAA;AAGnD,QAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,UAAA,IAAA,CAAK,SAAA,CAAU,OAAO,KAAK,CAAA;AAAA,QAC7B;AAAA,MACF,CAAA,MAAO;AAEL,QAAA,IAAA,CAAK,SAAA,CAAU,OAAO,KAAK,CAAA;AAAA,MAC7B;AAAA,IACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAA,CACE,UACG,IAAA,EACG;AACN,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA;AAE1C,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,SAAA,CAAU,OAAA,CAAQ,CAAC,QAAA,KAAa;AAC9B,QAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AACnB,UAAC,QAAA,CAAqC,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,CAAC,CAAC,CAAA;AAAA,QAC1D,CAAA,MAAO;AACL,UAAC,QAAA,CAAwB,KAAK,IAAI,CAAA;AAAA,QACpC;AAAA,MACF,CAAC,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,IAAA,CAA6B,OAAU,QAAA,EAA0C;AAC/E,IAAA,MAAM,WAAA,IAAe,IAAI,IAAA,KAAoB;AAC3C,MAAA,IAAA,CAAK,GAAA,CAAI,OAAO,WAAW,CAAA;AAE3B,MAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AACnB,QAAC,QAAA,CAAqC,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,CAAC,CAAC,CAAA;AAAA,MAC1D,CAAA,MAAO;AACL,QAAC,QAAA,CAAwB,KAAK,IAAI,CAAA;AAAA,MACpC;AAAA,IACF,CAAA,CAAA;AAEA,IAAA,OAAO,IAAA,CAAK,EAAA,CAAG,KAAA,EAAO,WAAW,CAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAmB,KAAA,EAA4B;AAC7C,IAAA,IAAI,UAAU,MAAA,EAAW;AACvB,MAAA,IAAA,CAAK,SAAA,CAAU,OAAO,KAAK,CAAA;AAAA,IAC7B,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AAAA,IACvB;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,KAAA,EAA6B;AACzC,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAK,GAAG,IAAA,IAAQ,CAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,GAA+B;AAC7B,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA;AAAA,EACzC;AACF;ACtGA,IAAM,SAAA,GAAY,GAAA;AAElB,SAAS,IACP,IAAA,EACA,IAAA,EACA,EAAA,EACA,IAAA,EACA,OACA,MAAA,EACS;AACT,EAAA,IAAI,IAAA,CAAK,WAAW,OAAO,KAAA;AAE3B,EAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,GAAA,CAAI,OAAA,CAAQ,IAAI,CAAA;AACpC,EAAA,MAAM,UAAA,GACJ,MAAM,MAAA,CAAO,WAAA;AAAA,IACX,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAA,CAAM,eAAe,SAAS,CAAA;AAAA,IAC1C,KAAA,CAAM,YAAA;AAAA,IACN,IAAA;AAAA,IACA;AAAA,GACF,GAAI,IAAA;AAEN,EAAA,KAAA,MAAW,WAAW,KAAA,EAAO;AAC3B,IAAA,MAAM,IAAA,GAAO,OAAA;AAEb,IAAA,IAAI,CAAC,IAAA,CAAK,UAAA,IAAc,KAAA,CAAM,KAAA,EAAM,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,EAAG;AACrE,IAAA,IAAI,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM;AAC/B,MAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAAA,IACpB,CAAA,MAAA,IAAW,IAAA,CAAK,MAAA,KAAW,MAAA,EAAQ;AACjC,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,UAAU,CAAA;AACxC,IAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,CAAC,CAAA,CAAE,MAAA,GAAS,KAAK,MAAA,EAAQ;AAE7C,IAAA,MAAM,WAAW,IAAA,IAAQ,KAAA,CAAM,CAAC,CAAA,CAAE,SAAS,IAAA,CAAK,MAAA,CAAA;AAEhD,IAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AACpB,MAAA,MAAM,YAAuB,EAAC;AAC9B,MAAA,KAAA,CAAM,IAAI,YAAA,CAAa,QAAA,EAAU,KAAA,CAAM,GAAA,EAAK,CAAC,IAAA,KAAS;AACpD,QAAA,IAAI,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,KAAA,CAAM,KAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,EAAG,SAAA,CAAU,KAAK,IAAI,CAAA;AAAA,MACpF,CAAC,CAAA;AACD,MAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AAAA,IAC5B;AAEA,IAAA,MAAM,KAAK,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,KAAA,EAAO,UAAU,EAAE,CAAA;AAClD,IAAA,IAAI,CAAC,EAAA,EAAI;AAET,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA,EAAA,CAAG,OAAA,CAAQ,QAAQ,EAAE,SAAA,EAAW,IAAI,IAAA,EAAM,EAAA,EAAI,MAAM,CAAA;AAAA,IACtD;AACA,IAAA,IAAA,CAAK,SAAS,EAAE,CAAA;AAChB,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,KAAA;AACT;AAaA,SAAS,aAAA,CAAc,MAAA,EAAgBA,OAAA,EAAoB,QAAA,EAA+C;AACxG,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,QAAA,CAASA,OAAK,CAAA;AACtC,EAAA,IAAI,CAAC,UAAU,OAAO,KAAA;AAEtB,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,MAAM,KAAKA,OAAA,CAAM,EAAA;AACjB,IAAA,MAAM,SAAS,QAAA,CAAS,SAAA;AACxB,IAAA,KAAA,IAAS,IAAI,MAAA,CAAO,KAAA,CAAM,SAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AACjD,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA;AAC3B,MAAA,MAAM,GAAA,GAAM,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA;AACzB,MAAA,IAAI,QAAQ,GAAA,EAAK,EAAA,CAAG,KAAK,IAAA,CAAK,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,IAC3C;AACA,IAAA,IAAI,SAAS,IAAA,EAAM;AACjB,MAAA,MAAM,QAAQ,EAAA,CAAG,GAAA,CAAI,QAAQ,QAAA,CAAS,IAAI,EAAE,KAAA,EAAM;AAClD,MAAA,EAAA,CAAG,WAAA,CAAY,QAAA,CAAS,IAAA,EAAM,QAAA,CAAS,EAAA,EAAIA,OAAA,CAAM,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,IAAA,EAAM,KAAK,CAAC,CAAA;AAElF,MAAA,MAAM,MAAA,GAAS,QAAA,CAAS,IAAA,GAAO,QAAA,CAAS,IAAA,CAAK,MAAA;AAC7C,MAAA,IAAI,MAAA,IAAU,EAAA,CAAG,GAAA,CAAI,OAAA,CAAQ,IAAA,EAAM;AACjC,QAAA,EAAA,CAAG,aAAaC,mBAAA,CAAc,MAAA,CAAO,EAAA,CAAG,GAAA,EAAK,MAAM,CAAC,CAAA;AAAA,MACtD;AAAA,IACF,CAAA,MAAO;AACL,MAAA,EAAA,CAAG,MAAA,CAAO,QAAA,CAAS,IAAA,EAAM,QAAA,CAAS,EAAE,CAAA;AAAA,IACtC;AACA,IAAA,QAAA,CAAS,EAAE,CAAA;AAAA,EACb;AACA,EAAA,OAAO,IAAA;AACT;AAOO,SAAS,gBAAA,CAAiB,EAAE,KAAA,EAAM,EAAmC;AAC1E,EAAA,MAAM,MAAA,GAAiB,IAAIC,YAAA,CAAO;AAAA,IAChC,KAAA,EAAO;AAAA,MACL,IAAA,GAA+B;AAC7B,QAAA,OAAO,IAAA;AAAA,MACT,CAAA;AAAA,MACA,KAAA,CAAM,IAAiB,IAAA,EAAsD;AAC3E,QAAA,MAAM,MAAA,GAAS,EAAA,CAAG,OAAA,CAAQ,MAAM,CAAA;AAChC,QAAA,IAAI,QAAQ,OAAO,MAAA;AAGnB,QAAA,IAAI,EAAA,CAAG,OAAA,CAAQ,qBAAqB,CAAA,EAAG,OAAO,IAAA;AAE9C,QAAA,OAAO,EAAA,CAAG,YAAA,IAAgB,EAAA,CAAG,UAAA,GAAa,IAAA,GAAO,IAAA;AAAA,MACnD;AAAA,KACF;AAAA,IACA,KAAA,EAAO;AAAA,MACL,eAAA,CAAgB,IAAA,EAAkB,IAAA,EAAc,EAAA,EAAY,IAAA,EAAc;AACxE,QAAA,OAAO,IAAI,IAAA,EAAM,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,OAAO,MAAM,CAAA;AAAA,MAChD,CAAA;AAAA,MACA,aAAA,CAAc,MAAkB,KAAA,EAAsB;AAIpD,QAAA,IAAI,KAAA,CAAM,GAAA,KAAQ,WAAA,IAAe,CAAC,KAAA,CAAM,OAAA,IAAW,CAAC,KAAA,CAAM,OAAA,IAAW,CAAC,KAAA,CAAM,MAAA,EAAQ;AAClF,UAAA,OAAO,aAAA,CAAc,MAAA,EAAQ,IAAA,CAAK,KAAA,EAAO,CAAC,EAAA,KAAO;AAAE,YAAA,IAAA,CAAK,SAAS,EAAE,CAAA;AAAA,UAAG,CAAC,CAAA;AAAA,QACzE;AACA,QAAA,OAAO,KAAA;AAAA,MACT,CAAA;AAAA,MACA,eAAA,EAAiB;AAAA,QACf,cAAA,EAAgB,CAAC,IAAA,KAAqB;AACpC,UAAA,UAAA,CAAW,MAAM;AACf,YAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,IAAA,CAAK,KAAA,CAAM,SAAA;AAC/B,YAAA,IAAI,OAAA,EAAS;AAAE,cAAA,GAAA,CAAI,MAAM,OAAA,CAAQ,GAAA,EAAK,QAAQ,GAAA,EAAK,EAAA,EAAI,OAAO,MAAM,CAAA;AAAA,YAAG;AAAA,UACzE,CAAC,CAAA;AAAA,QACH;AAAA;AACF,KACF;AAAA;AAAA,IAEA,YAAA,EAAc;AAAA;AAAA,GAE6D,CAAA;AAE7E,EAAA,OAAO,MAAA;AACT;;;ACjJO,SAAS,YAAA,CACd,KAAA,EACA,OAAA,EAAA,GACG,IAAA,EACA;AACH,EAAA,IAAI,OAAO,UAAU,UAAA,EAAY;AAC/B,IAAA,OAAQ,KAAA,CAAoC,IAAA,CAAK,OAAA,EAAS,GAAG,IAAI,CAAA;AAAA,EACnE;AACA,EAAA,OAAO,KAAA;AACT;;;AC6CA,SAAS,cAAA,CACP,QACA,MAAA,EACyB;AACzB,EAAA,MAAM,MAAA,GAAS,EAAE,GAAG,MAAA,EAAO;AAE3B,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AACjD,IAAA,IAAI,GAAA,KAAQ,WAAW,OAAO,MAAA,CAAO,GAAG,CAAA,KAAM,QAAA,IAAY,OAAO,KAAA,KAAU,QAAA,EAAU;AACnF,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,CAAA,EAAG,OAAO,GAAG,CAAC,KAAK,KAAK,CAAA,CAAA;AAAA,IACxC,CAAA,MAAA,IAAW,GAAA,KAAQ,OAAA,IAAW,OAAO,MAAA,CAAO,GAAG,CAAA,KAAM,QAAA,IAAY,OAAO,KAAA,KAAU,QAAA,EAAU;AAC1F,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,CAAA,EAAG,OAAO,GAAG,CAAC,IAAI,KAAK,CAAA,CAAA;AAAA,IACvC,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,KAAA;AAAA,IAChB;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAEO,IAAM,mBAAN,MAAuB;AAAA;AAAA;AAAA;AAAA,EAIX,WAAA;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA;AAAA;AAAA;AAAA;AAAA,EAKR,MAAA;AAAA;AAAA;AAAA;AAAA,EAKQ,WAAoC,EAAC;AAAA;AAAA;AAAA;AAAA,EAK9C,WAAA,GAAc,KAAA;AAAA;AAAA;AAAA;AAAA,EAKd,QAAA,GAA4B,IAAA;AAAA;AAAA;AAAA;AAAA,EAK5B,SAAA,GAA+B,IAAA;AAAA;AAAA;AAAA;AAAA,EAK/B,aAAA,GAAsC,IAAA;AAAA;AAAA;AAAA;AAAA,EAKtC,kBAAA,GAAgD,IAAA;AAAA;AAAA;AAAA;AAAA,EAKhD,UAAA,GAAyD,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQjE,WAAA,CAAY,SAAkC,MAAA,EAAgC;AAC5E,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAGd,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,IAAA,CAAK,cAAc,EAAC;AACpB,MAAA,IAAA,CAAK,UAAU,OAAA,CAAQ,MAAA;AACvB,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,CAAC,OAAA,CAAQ,UAAA,IAAc,OAAA,CAAQ,UAAA,CAAW,WAAW,CAAA,EAAG;AAC1D,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OAEF;AAAA,IACF;AAaA,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,iBAAA,CAAkB,OAAA,CAAQ,UAAU,CAAA;AAC3D,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,qBAAA,CAAsB,SAAS,CAAA;AACpD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,eAAA,CAAgB,OAAO,CAAA;AAC3C,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA,CAAK,iBAAA,CAAkB,MAAM,CAAA;AAChD,IAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,IAAA,IAAA,CAAK,iBAAA,EAAkB;AACvB,IAAA,IAAA,CAAK,sBAAA,EAAuB;AAC5B,IAAA,IAAA,CAAK,OAAA,GAAU,KAAK,WAAA,EAAY;AAChC,IAAA,IAAA,CAAK,iBAAA,EAAkB;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,UAAA,GAAsC;AACxC,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,MAAA,GAAiB;AACnB,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,OAAA,GAAmC;AACrC,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,OAAA,GAAoB;AACtB,IAAA,IAAA,CAAK,QAAA,KAAa,KAAK,YAAA,EAAa;AACpC,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,QAAA,GAAuB;AACzB,IAAA,IAAA,CAAK,SAAA,KAAc,KAAK,eAAA,EAAgB;AACxC,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,YAAA,GAA8B;AAChC,IAAA,IAAA,CAAK,aAAA,KAAkB,KAAK,mBAAA,EAAoB;AAChD,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,iBAAA,GAAwC;AAC1C,IAAA,IAAA,CAAK,kBAAA,KAAuB,KAAK,wBAAA,EAAyB;AAC1D,IAAA,OAAO,IAAA,CAAK,kBAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,SAAA,GAAiD;AACnD,IAAA,IAAA,CAAK,UAAA,KAAe,KAAK,gBAAA,EAAiB;AAC1C,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,cAAA,GAAuB;AACrB,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AACrB,IAAA,IAAA,CAAK,kBAAA,GAAqB,IAAA;AAC1B,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,kBAAkB,UAAA,EAA4C;AACpE,IAAA,MAAM,SAAyB,EAAC;AAEhC,IAAA,KAAA,MAAW,OAAO,UAAA,EAAY;AAC5B,MAAA,MAAA,CAAO,KAAK,GAAG,CAAA;AAGf,MAAA,MAAM,MAAA,GAAS,YAAA;AAAA,QACZ,IAAkB,MAAA,CAAO,aAAA;AAAA,QAC1B;AAAA,OACF;AAEA,MAAA,IAAI,MAAA,IAAU,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAC/B,QAAA,MAAA,CAAO,IAAA,CAAK,GAAG,IAAA,CAAK,iBAAA,CAAkB,MAAM,CAAC,CAAA;AAAA,MAC/C;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,sBAAsB,UAAA,EAA4C;AACxE,IAAA,MAAM,IAAA,uBAAW,GAAA,EAAoB;AACrC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,UAAA,CAAW,QAAQ,CAAA,EAAA,EAAK;AAC1C,MAAA,MAAM,GAAA,GAAM,WAAW,CAAC,CAAA;AACxB,MAAA,IAAI,GAAA,EAAK,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,MAAM,CAAC,CAAA;AAAA,IAC/B;AACA,IAAA,OAAO,UAAA,CAAW,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,KAAK,GAAA,CAAI,GAAA,CAAI,IAAI,CAAA,KAAM,CAAC,CAAA;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUQ,gBAAgB,UAAA,EAA4C;AAClE,IAAA,OAAO,WAAW,GAAA,CAAI,CAAC,GAAA,KAAS,GAAA,CAAkB,OAAuB,CAAA;AAAA,EAC3E;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,kBAAkB,UAAA,EAA4C;AACpE,IAAA,OAAO,CAAC,GAAG,UAAU,EAAE,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM;AACpC,MAAA,MAAM,SAAA,GAAa,CAAA,CAAgB,MAAA,CAAO,QAAA,IAAY,GAAA;AACtD,MAAA,MAAM,SAAA,GAAa,CAAA,CAAgB,MAAA,CAAO,QAAA,IAAY,GAAA;AACtD,MAAA,OAAO,SAAA,GAAY,SAAA;AAAA,IACrB,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,eAAA,GAAwB;AAC9B,IAAA,MAAM,KAAA,uBAAY,GAAA,EAAY;AAE9B,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,WAAA,EAAa;AAClC,MAAA,IAAI,KAAA,CAAM,GAAA,CAAI,GAAA,CAAI,IAAI,CAAA,EAAG;AACvB,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,0BAAA,EAA6B,IAAI,IAAI,CAAA,oEAAA;AAAA,SAEvC;AAAA,MACF;AACA,MAAA,KAAA,CAAM,GAAA,CAAI,IAAI,IAAI,CAAA;AAAA,IACpB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,iBAAA,GAA0B;AAChC,IAAA,MAAM,cAAA,GAAiB,IAAI,GAAA,CAAI,IAAA,CAAK,WAAA,CAAY,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAC,CAAA;AAElE,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,WAAA,EAAa;AAClC,MAAA,MAAM,IAAA,GAAQ,IAAkB,MAAA,CAAO,YAAA;AACvC,MAAA,IAAI,CAAC,IAAA,EAAM;AAEX,MAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,QAAA,IAAI,CAAC,cAAA,CAAe,GAAA,CAAI,GAAG,CAAA,EAAG;AAC5B,UAAA,MAAM,IAAI,KAAA;AAAA,YACR,CAAA,WAAA,EAAc,GAAA,CAAI,IAAI,CAAA,YAAA,EAAe,GAAG,CAAA,oDAAA;AAAA,WAE1C;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,sBAAA,GAA+B;AACrC,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,WAAA,EAAa;AAClC,MAAC,GAAA,CAAkB,SAAS,IAAA,CAAK,MAAA;AAAA,IAEnC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,uBAAA,GAA4E;AAClF,IAAA,MAAM,WAAA,uBAAkB,GAAA,EAAiD;AAEzE,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,WAAA,EAAa;AAClC,MAAA,MAAM,mBAAA,GAAuB,IAAkB,MAAA,CAAO,mBAAA;AACtD,MAAA,IAAI,CAAC,mBAAA,EAAqB;AAE1B,MAAA,MAAM,QAAQ,IAAA,CAAK,QAAA;AAAA,QACjB,MAAM,YAAA,CAAa,mBAAA,EAAqB,GAAG,CAAA;AAAA,QAC3C,CAAA,EAAG,IAAI,IAAI,CAAA,oBAAA;AAAA,OACb;AAEA,MAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,MAAA,KAAA,MAAW,EAAE,KAAA,EAAO,UAAA,EAAW,IAAK,KAAA,EAAO;AACzC,QAAA,KAAA,MAAW,YAAY,KAAA,EAAO;AAC5B,UAAA,MAAM,QAAA,GAAW,WAAA,CAAY,GAAA,CAAI,QAAQ,KAAK,EAAC;AAC/C,UAAA,WAAA,CAAY,IAAI,QAAA,EAAU,EAAE,GAAG,QAAA,EAAU,GAAG,YAAY,CAAA;AAAA,QAC1D;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,qBAAA,CACN,MACA,UAAA,EACM;AAEN,IAAA,MAAM,iBAAwD,EAAC;AAC/D,IAAA,KAAA,MAAW,CAAC,QAAA,EAAU,QAAQ,KAAK,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,EAAG;AAC7D,MAAA,cAAA,CAAe,QAAQ,CAAA,GAAI,EAAE,OAAA,EAAS,SAAS,OAAA,EAAQ;AAAA,IACzD;AACA,IAAA,IAAA,CAAK,QAAQ,EAAE,GAAG,IAAA,CAAK,KAAA,EAAO,GAAG,cAAA,EAAe;AAGhD,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,CAAC,IAAA,KAAS;AAC1C,QAAA,MAAM,mBAAmB,IAAA,CAAK,QAAA;AAG9B,QAAA,OAAO;AAAA,UACL,GAAG,IAAA;AAAA,UACH,QAAA,EAAU,CAAC,GAAA,KAA8B;AACvC,YAAA,MAAM,YAAY,gBAAA,GACd,gBAAA,CAAiB,GAAG,CAAA,GACpB,IAAA,CAAK,SAAS,EAAC;AAEnB,YAAA,IAAI,SAAA,KAAc,OAAO,OAAO,KAAA;AAGhC,YAAA,MAAM,eAAwC,EAAC;AAC/C,YAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAC3B,cAAA,KAAA,MAAW,CAAC,IAAA,EAAM,QAAQ,KAAK,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,EAAG;AACzD,gBAAA,IAAI,SAAS,SAAA,EAAW;AACtB,kBAAA,YAAA,CAAa,IAAI,CAAA,GAAI,QAAA,CAAS,SAAA,CAAU,GAAG,CAAA;AAAA,gBAC7C;AAAA,cACF;AAAA,YACF;AAEA,YAAA,OAAO,EAAE,GAAG,SAAA,EAAW,GAAG,YAAA,EAAa;AAAA,UACzC;AAAA,SACF;AAAA,MACF,CAAC,CAAA;AAAA,IACH;AAGA,IAAA,MAAM,gBAAgB,IAAA,CAAK,KAAA;AAC3B,IAAA,IAAI,aAAA,EAAe;AAEjB,MAAA,MAAM,YAAA,GAAe,IAAI,IAAA,KAA6B;AACpD,QAAA,MAAM,MAAA,GAAU,aAAA,CAA+C,GAAG,IAAI,CAAA;AACtE,QAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,MAAM,GAAG,OAAO,MAAA;AAGnC,QAAA,MAAM,UAAA,GAAa,KAAK,CAAC,CAAA;AAEzB,QAAA,IAAI,iBAAyC,EAAC;AAC9C,QAAA,KAAA,MAAW,GAAG,QAAQ,KAAK,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,EAAG;AACrD,UAAA,IAAI,SAAS,UAAA,EAAY;AACvB,YAAA,MAAM,QAAA,GAAW,QAAA,CAAS,UAAA,CAAW,UAAA,CAAW,KAAK,CAAA;AACrD,YAAA,IAAI,QAAA,EAAU;AACZ,cAAA,cAAA,GAAiB,cAAA,CAAe,gBAAgB,QAAQ,CAAA;AAAA,YAC1D;AAAA,UACF;AAAA,QACF;AAGA,QAAA,IACE,OAAO,MAAA,IAAU,CAAA,IACjB,OAAO,MAAA,CAAO,CAAC,MAAM,QAAA,IACrB,MAAA,CAAO,CAAC,CAAA,KAAM,QACd,CAAC,KAAA,CAAM,QAAQ,MAAA,CAAO,CAAC,CAAC,CAAA,EACxB;AACA,UAAA,MAAM,aAAA,GAAgB,OAAO,CAAC,CAAA;AAC9B,UAAA,MAAA,CAAO,CAAC,CAAA,GAAI,EAAE,GAAG,aAAA,EAAe,GAAG,cAAA,EAAe;AAAA,QACpD,WAAW,MAAA,CAAO,IAAA,CAAK,cAAc,CAAA,CAAE,SAAS,CAAA,EAAG;AAEjD,UAAA,MAAM,IAAA,GAAO,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA;AAC3B,UAAA,OAAO,CAAC,MAAA,CAAO,CAAC,CAAA,EAAG,cAAA,EAAgB,GAAG,IAAI,CAAA;AAAA,QAC5C;AAEA,QAAA,OAAO,MAAA;AAAA,MACT,CAAA;AAIA,MAAC,KAAa,KAAA,GAAQ,YAAA;AAAA,IACxB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,WAAA,GAAsB;AAE5B,IAAA,MAAM,WAAA,GAAc,KAAK,uBAAA,EAAwB;AAEjD,IAAA,MAAM,QAAkC,EAAC;AACzC,IAAA,MAAM,QAAkC,EAAC;AACzC,IAAA,IAAI,OAAA;AAEJ,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,WAAA,EAAa;AAClC,MAAA,IAAI,GAAA,CAAI,SAAS,MAAA,EAAQ;AACvB,QAAA,MAAM,OAAA,GAAU,GAAA;AAChB,QAAA,MAAM,IAAA,GAAO,QAAQ,cAAA,EAAe;AAEpC,QAAA,MAAM,UAAA,GAAa,WAAA,CAAY,GAAA,CAAI,GAAA,CAAI,IAAI,CAAA;AAC3C,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,IAAA,CAAK,qBAAA,CAAsB,MAAM,UAAU,CAAA;AAAA,QAC7C;AAEA,QAAA,KAAA,CAAM,GAAA,CAAI,IAAI,CAAA,GAAI,IAAA;AAGlB,QAAA,IAAI,OAAA,CAAQ,OAAO,OAAA,EAAS;AAC1B,UAAA,OAAA,GAAU,GAAA,CAAI,IAAA;AAAA,QAChB;AAAA,MACF,CAAA,MAAA,IAAW,GAAA,CAAI,IAAA,KAAS,MAAA,EAAQ;AAC9B,QAAA,MAAM,OAAA,GAAU,GAAA;AAChB,QAAA,MAAM,IAAA,GAAO,QAAQ,cAAA,EAAe;AAEpC,QAAA,MAAM,UAAA,GAAa,WAAA,CAAY,GAAA,CAAI,GAAA,CAAI,IAAI,CAAA;AAC3C,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,IAAA,CAAK,qBAAA,CAAsB,MAAM,UAAU,CAAA;AAAA,QAC7C;AAEA,QAAA,KAAA,CAAM,GAAA,CAAI,IAAI,CAAA,GAAI,IAAA;AAAA,MACpB;AAAA,IACF;AAEA,IAAA,OAAO,IAAIC,YAAA,CAAO;AAAA,MAChB,KAAA;AAAA,MACA,KAAA;AAAA,MACA,GAAI,OAAA,IAAW,EAAE,OAAA;AAAQ,KAC1B,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAA,GAA0B;AAChC,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,WAAA,EAAa;AAClC,MAAA,MAAM,cAAA,GAAkB,IAAkB,MAAA,CAAO,UAAA;AACjD,MAAA,IAAI,cAAA,EAAgB;AAClB,QAAA,MAAM,UAAU,IAAA,CAAK,QAAA;AAAA,UACnB,MAAM,YAAA,CAAa,cAAA,EAAgB,GAAG,CAAA;AAAA,UACtC,CAAA,EAAG,IAAI,IAAI,CAAA,WAAA;AAAA,SACb;AACA,QAAA,IAAI,YAAY,MAAA,EAAW;AACzB,UAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,IAAI,CAAA,GAAI,OAAA;AAC1B,UAAC,IAAkB,OAAA,GAAU,OAAA;AAAA,QAC/B;AAAA,MACF;AAIA,MAAA,IAAI,EAAE,GAAA,CAAI,IAAA,IAAQ,IAAA,CAAK,QAAA,CAAA,EAAW;AAChC,QAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,IAAI,CAAA,GAAK,GAAA,CAAkB,OAAA;AAAA,MAC/C;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,YAAA,GAAyB;AAC/B,IAAA,MAAM,UAAoB,EAAC;AAK3B,IAAA,MAAM,KAAA,GAAQ,KAAK,iBAAA,EAAkB;AACrC,IAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,MAAA,OAAA,CAAQ,IAAA,CAAK,gBAAA,CAAuB,EAAE,KAAA,EAAO,CAAC,CAAA;AAAA,IAChD;AAGA,IAAA,MAAM,SAAA,GAAY,KAAK,wBAAA,EAAyB;AAChD,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA,CAAE,SAAS,CAAA,EAAG;AACrC,MAAA,OAAA,CAAQ,IAAA,CAAKC,aAAA,CAAO,SAAS,CAAC,CAAA;AAAA,IAChC;AAGA,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,WAAA,EAAa;AAClC,MAAA,MAAM,UAAA,GAAc,IAAkB,MAAA,CAAO,qBAAA;AAC7C,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,MAAM,aAAa,IAAA,CAAK,QAAA;AAAA,UACtB,MAAM,YAAA,CAAa,UAAA,EAAY,GAAG,CAAA;AAAA,UAClC,CAAA,EAAG,IAAI,IAAI,CAAA,sBAAA;AAAA,SACb;AACA,QAAA,IAAI,UAAA,IAAc,UAAA,CAAW,MAAA,GAAS,CAAA,EAAG;AACvC,UAAA,OAAA,CAAQ,IAAA,CAAK,GAAG,UAAU,CAAA;AAAA,QAC5B;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,wBAAA,GAAsD;AAC5D,IAAA,MAAM,YAAuC,EAAC;AAE9C,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,WAAA,EAAa;AAClC,MAAA,MAAM,YAAA,GAAgB,IAAkB,MAAA,CAAO,oBAAA;AAC/C,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,MAAM,eAAe,IAAA,CAAK,QAAA;AAAA,UACxB,MAAM,YAAA,CAAa,YAAA,EAAc,GAAG,CAAA;AAAA,UACpC,CAAA,EAAG,IAAI,IAAI,CAAA,qBAAA;AAAA,SACb;AACA,QAAA,IAAI,YAAA,EAAc;AAChB,UAAA,MAAM,IAAA,GAAO,YAAA;AACb,UAAA,KAAA,MAAW,CAAC,GAAA,EAAK,OAAO,KAAK,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,EAAG;AACjD,YAAA,IAAI,SAAA,CAAU,GAAG,CAAA,EAAG;AAElB,cAAA,MAAM,IAAA,GAAO,UAAU,GAAG,CAAA;AAC1B,cAAA,SAAA,CAAU,GAAG,CAAA,GAAI,CAAC,KAAA,EAAO,UAAU,IAAA,KAAS;AAC1C,gBAAA,OAAO,OAAA,CAAQ,OAAO,QAAA,EAAU,IAAI,KAAK,IAAA,CAAK,KAAA,EAAO,UAAU,IAAI,CAAA;AAAA,cACrE,CAAA;AAAA,YACF,CAAA,MAAO;AACL,cAAA,SAAA,CAAU,GAAG,CAAA,GAAI,OAAA;AAAA,YACnB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,SAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAA,GAAiC;AACvC,IAAA,MAAM,QAAqB,EAAC;AAE5B,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,WAAA,EAAa;AAClC,MAAA,MAAM,QAAA,GAAY,IAAkB,MAAA,CAAO,aAAA;AAC3C,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,MAAM,WAAW,IAAA,CAAK,QAAA;AAAA,UACpB,MAAM,YAAA,CAAa,QAAA,EAAU,GAAG,CAAA;AAAA,UAChC,CAAA,EAAG,IAAI,IAAI,CAAA,cAAA;AAAA,SACb;AACA,QAAA,IAAI,QAAA,IAAY,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG;AACnC,UAAA,KAAA,CAAM,IAAA,CAAK,GAAG,QAAQ,CAAA;AAAA,QACxB;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,eAAA,GAA8B;AACpC,IAAA,MAAM,WAAuB,EAAC;AAE9B,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,WAAA,EAAa;AAClC,MAAA,MAAM,WAAA,GAAe,IAAkB,MAAA,CAAO,WAAA;AAC9C,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,MAAM,cAAc,IAAA,CAAK,QAAA;AAAA,UACvB,MAAM,YAAA,CAAa,WAAA,EAAa,GAAG,CAAA;AAAA,UACnC,CAAA,EAAG,IAAI,IAAI,CAAA,YAAA;AAAA,SACb;AACA,QAAA,IAAI,WAAA,EAAa;AAEf,UAAA,MAAA,CAAO,MAAA,CAAO,UAAU,WAAW,CAAA;AAAA,QACrC;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAA,GAAqC;AAC3C,IAAA,MAAM,QAAuB,EAAC;AAE9B,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,WAAA,EAAa;AAClC,MAAA,MAAM,QAAA,GAAY,IAAkB,MAAA,CAAO,eAAA;AAC3C,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,MAAM,WAAW,IAAA,CAAK,QAAA;AAAA,UACpB,MAAM,YAAA,CAAa,QAAA,EAAU,GAAG,CAAA;AAAA,UAChC,CAAA,EAAG,IAAI,IAAI,CAAA,gBAAA;AAAA,SACb;AACA,QAAA,IAAI,QAAA,IAAY,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG;AACnC,UAAA,KAAA,CAAM,IAAA,CAAK,GAAG,QAAQ,CAAA;AAAA,QACxB;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,wBAAA,GAA+C;AACrD,IAAA,MAAM,QAA4B,EAAC;AAEnC,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,WAAA,EAAa;AAClC,MAAA,MAAM,QAAA,GAAY,IAAkB,MAAA,CAAO,oBAAA;AAC3C,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,MAAM,WAAW,IAAA,CAAK,QAAA;AAAA,UACpB,MAAM,YAAA,CAAa,QAAA,EAAU,GAAG,CAAA;AAAA,UAChC,CAAA,EAAG,IAAI,IAAI,CAAA,qBAAA;AAAA,SACb;AACA,QAAA,IAAI,QAAA,IAAY,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG;AACnC,UAAA,KAAA,CAAM,IAAA,CAAK,GAAG,QAAQ,CAAA;AAAA,QACxB;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUQ,gBAAA,GAAwD;AAC9D,IAAA,MAAM,YAAiD,EAAC;AAExD,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,WAAA,EAAa;AAClC,MAAA,IAAI,GAAA,CAAI,SAAS,MAAA,EAAQ;AACzB,MAAA,MAAM,OAAA,GAAU,GAAA;AAChB,MAAA,MAAM,WAAA,GAAc,QAAQ,MAAA,CAAO,WAAA;AACnC,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,MAAM,WAAW,IAAA,CAAK,QAAA;AAAA,UACpB,MAAM,YAAA,CAAa,WAAA,EAAa,OAAO,CAAA;AAAA,UACvC,CAAA,EAAG,IAAI,IAAI,CAAA,YAAA;AAAA,SACb;AACA,QAAA,IAAI,QAAA,EAAU;AAEZ,UAAC,SAA4E,kBAAA,GAAqB;AAAA,YAChG,QAAQ,IAAA,CAAK,MAAA;AAAA,YACb,WAAW,EAAE,IAAA,EAAM,QAAQ,IAAA,EAAM,OAAA,EAAS,QAAQ,OAAA;AAAmC,WACvF;AACA,UAAA,SAAA,CAAU,GAAA,CAAI,IAAI,CAAA,GAAI,QAAA;AAAA,QACxB;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,SAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,cAAA,GAAuB;AACrB,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,MAAM,IAAI,MAAM,qCAAqC,CAAA;AAAA,IACvD;AAEA,IAAA,MAAM,EAAE,KAAA,EAAM,GAAI,IAAA,CAAK,OAAA,CAAQ,IAAA;AAE/B,IAAA,IAAI,CAAC,KAAA,CAAM,GAAA,CAAI,KAAK,CAAA,EAAG;AACrB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OAEF;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,KAAA,CAAM,GAAA,CAAI,MAAM,CAAA,EAAG;AACtB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OAEF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAA,GAAgB;AACd,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA;AAAA,IACF;AAGA,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,WAAA,EAAa;AAClC,MAAA,MAAM,SAAA,GAAa,IAAkB,MAAA,CAAO,SAAA;AAC5C,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,IAAA,CAAK,SAAS,MAAM;AAClB,UAAA,YAAA,CAAa,WAAW,GAAG,CAAA;AAAA,QAC7B,CAAA,EAAG,CAAA,EAAG,GAAA,CAAI,IAAI,CAAA,UAAA,CAAY,CAAA;AAAA,MAC5B;AAAA,IACF;AAMA,IAAA,IAAA,CAAK,cAAA,EAAe;AAEpB,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,QAAA,CAAY,IAAa,OAAA,EAAgC;AACvD,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,EAAA,EAAG;AAGlB,MAAA,IAAI,kBAAkB,OAAA,EAAS;AAC7B,QAAA,MAAA,CAAO,KAAA,CAAM,CAAC,KAAA,KAAmB;AAC/B,UAAA,MAAM,QAAA,GAAW,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AACzE,UAAA,IAAA,CAAK,OAAO,IAAA,GAAO,OAAA,EAAS,EAAE,KAAA,EAAO,QAAA,EAAU,SAAS,CAAA;AAAA,QAC1D,CAAC,CAAA;AAAA,MACH;AAEA,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,QAAA,GAAW,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AAGzE,MAAA,IAAA,CAAK,OAAO,IAAA,GAAO,OAAA,EAAS,EAAE,KAAA,EAAO,QAAA,EAAU,SAAS,CAAA;AAExD,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,kBAAA,GAA2B;AACzB,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,WAAA,EAAa;AAClC,MAAA,MAAM,IAAA,GAAQ,IAAkB,MAAA,CAAO,cAAA;AACvC,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,IAAA,CAAK,SAAS,MAAM;AAClB,UAAA,YAAA,CAAa,MAAM,GAAG,CAAA;AAAA,QACxB,CAAA,EAAG,CAAA,EAAG,GAAA,CAAI,IAAI,CAAA,eAAA,CAAiB,CAAA;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,GAAqB;AACnB,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,WAAA,EAAa;AAClC,MAAA,MAAM,IAAA,GAAQ,IAAkB,MAAA,CAAO,QAAA;AACvC,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,IAAA,CAAK,SAAS,MAAM;AAClB,UAAA,YAAA,CAAa,MAAM,GAAG,CAAA;AAAA,QACxB,CAAA,EAAG,CAAA,EAAG,GAAA,CAAI,IAAI,CAAA,SAAA,CAAW,CAAA;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,GAAqB;AACnB,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,WAAA,EAAa;AAClC,MAAA,MAAM,IAAA,GAAQ,IAAkB,MAAA,CAAO,QAAA;AACvC,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,IAAA,CAAK,SAAS,MAAM;AAClB,UAAA,YAAA,CAAa,MAAM,GAAG,CAAA;AAAA,QACxB,CAAA,EAAG,CAAA,EAAG,GAAA,CAAI,IAAI,CAAA,SAAA,CAAW,CAAA;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,qBAAA,GAA8B;AAC5B,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,WAAA,EAAa;AAClC,MAAA,MAAM,IAAA,GAAQ,IAAkB,MAAA,CAAO,iBAAA;AACvC,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,IAAA,CAAK,SAAS,MAAM;AAClB,UAAA,YAAA,CAAa,MAAM,GAAG,CAAA;AAAA,QACxB,CAAA,EAAG,CAAA,EAAG,GAAA,CAAI,IAAI,CAAA,kBAAA,CAAoB,CAAA;AAAA,MACpC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,kBAAkB,KAAA,EAA2C;AAC3D,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,WAAA,EAAa;AAClC,MAAA,MAAM,IAAA,GAAQ,IAAkB,MAAA,CAAO,aAAA;AACvC,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,IAAA,CAAK,SAAS,MAAM;AAClB,UAAA,IAAA,CAAK,IAAA,CAAK,KAAK,KAAK,CAAA;AAAA,QACtB,CAAA,EAAG,CAAA,EAAG,GAAA,CAAI,IAAI,CAAA,cAAA,CAAgB,CAAA;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY,KAAA,EAAoC;AAC9C,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,WAAA,EAAa;AAClC,MAAA,MAAM,IAAA,GAAQ,IAAkB,MAAA,CAAO,OAAA;AACvC,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,IAAA,CAAK,SAAS,MAAM;AAClB,UAAA,IAAA,CAAK,IAAA,CAAK,KAAK,KAAK,CAAA;AAAA,QACtB,CAAA,EAAG,CAAA,EAAG,GAAA,CAAI,IAAI,CAAA,QAAA,CAAU,CAAA;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW,KAAA,EAAoC;AAC7C,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,WAAA,EAAa;AAClC,MAAA,MAAM,IAAA,GAAQ,IAAkB,MAAA,CAAO,MAAA;AACvC,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,IAAA,CAAK,SAAS,MAAM;AAClB,UAAA,IAAA,CAAK,IAAA,CAAK,KAAK,KAAK,CAAA;AAAA,QACtB,CAAA,EAAG,CAAA,EAAG,GAAA,CAAI,IAAI,CAAA,OAAA,CAAS,CAAA;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AACF;ACz8BA,SAAS,oBAAA,CACP,KACA,QAAA,EACe;AACf,EAAA,IAAI,QAAA,KAAa,IAAA,IAAQ,QAAA,KAAa,KAAA,EAAO;AAC3C,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,QAAA,KAAa,IAAA,IAAQ,QAAA,KAAa,KAAA,EAAO;AAC3C,IAAA,OAAO,GAAA,CAAI,QAAQ,IAAA,GAAO,CAAA;AAAA,EAC5B;AAEA,EAAA,IAAI,aAAa,OAAA,EAAS;AACxB,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,IAAI,aAAa,KAAA,EAAO;AACtB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,aAAa,QAAA,EAAU;AAChC,IAAA,OAAO,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,IAAI,QAAA,EAAU,GAAA,CAAI,OAAA,CAAQ,IAAI,CAAC,CAAA;AAAA,EACzD;AAEA,EAAA,OAAO,IAAA;AACT;AAYO,IAAM,KAAA,GACX,CAAC,QAAA,GAA0B,IAAA,KAC3B,CAAC,EAAE,MAAA,EAAQ,EAAA,EAAI,QAAA,EAAS,KAAM;AAC5B,EAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AAGpB,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAAC,IAAA,CAAK,GAAA,CAAI,WAAA,EAAa;AACzB,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,IAAA,CAAK,KAAA,EAAM;AAEX,EAAA,IAAI,aAAa,KAAA,EAAO;AACtB,IAAA,MAAM,SAAA,GAAY,IAAIC,kBAAA,CAAa,EAAA,CAAG,GAAG,CAAA;AACzC,IAAA,QAAA,CAAS,EAAA,CAAG,YAAA,CAAa,SAAS,CAAC,CAAA;AACnC,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,MAAM,WAAA,GAAc,oBAAA,CAAqB,EAAA,CAAG,GAAA,EAAK,QAAQ,CAAA;AAEzD,EAAA,IAAI,gBAAgB,IAAA,EAAM;AAGxB,IAAA,MAAM,IAAA,GAAO,EAAA,CAAG,GAAA,CAAI,OAAA,CAAQ,WAAW,CAAA;AACvC,IAAA,MAAM,SAAA,GAAYJ,mBAAAA,CAAc,IAAA,CAAK,IAAI,CAAA;AACzC,IAAA,QAAA,CAAS,EAAA,CAAG,YAAA,CAAa,SAAS,CAAC,CAAA;AAAA,EACrC,CAAA,MAAO;AACL,IAAA,QAAA,CAAS,EAAE,CAAA;AAAA,EACb;AAEA,EAAA,OAAO,IAAA;AACT;AAKK,IAAM,OACX,MACA,CAAC,EAAE,MAAA,EAAQ,UAAS,KAAM;AACxB,EAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AAEpB,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAA,CAAK,IAAI,IAAA,EAAK;AACd,EAAA,OAAO,IAAA;AACT;AAQK,IAAM,YACX,MACA,CAAC,EAAE,EAAA,EAAI,UAAS,KAAM;AACpB,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,EAAA,CAAG,YAAA,CAAa,IAAII,kBAAA,CAAa,EAAA,CAAG,GAAG,CAAC,CAAA;AACxC,EAAA,QAAA,CAAS,EAAE,CAAA;AACX,EAAA,OAAO,IAAA;AACT;AAOK,IAAM,qBACX,MACA,CAAC,EAAE,KAAA,EAAO,UAAS,KAAM;AACvB,EAAA,OAAOC,2BAAA,CAAqB,OAAO,QAAQ,CAAA;AAC7C;AAOK,IAAM,kBACX,MACA,CAAC,EAAE,EAAA,EAAI,UAAS,KAAM;AACpB,EAAA,MAAM,EAAE,KAAA,EAAO,IAAA,EAAM,EAAA,KAAO,EAAA,CAAG,SAAA;AAE/B,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,EAAA,CAAG,WAAA,CAAY,MAAM,EAAE,CAAA;AACvB,EAAA,QAAA,CAAS,EAAE,CAAA;AACX,EAAA,OAAO,IAAA;AACT;ACvIF,SAAS,cAAc,OAAA,EAA0C;AAC/D,EAAA,OACE,OAAO,YAAY,QAAA,IACnB,OAAA,KAAY,QACZ,MAAA,IAAU,OAAA,IACV,OAAQ,OAAA,CAAwB,IAAA,KAAS,QAAA;AAE7C;AASA,SAAS,cAAc,OAAA,EAAqC;AAC1D,EAAA,OAAO,OAAO,OAAA,KAAY,QAAA,IAAY,QAAQ,IAAA,EAAK,CAAE,WAAW,GAAG,CAAA;AACrE;AAKA,SAAS,oBAAoB,MAAA,EAAwB;AACnD,EAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,KAAA,CAAM,WAAW,CAAA;AAE9C,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,OAAO,MAAA,CAAO,KAAK,KAAA,EAAO,IAAA,EAAM,CAAC,aAAA,CAAc,MAAA,EAAQ,CAAC,CAAA;AAAA,EAC1D;AAIA,EAAA,KAAA,MAAW,CAAC,MAAM,QAAQ,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,CAAO,KAAK,CAAA,EAAG;AAC3D,IAAA,IAAI,IAAA,KAAS,KAAA,IAAS,IAAA,KAAS,MAAA,IAAU,SAAS,OAAA,EAAS;AACzD,MAAA,OAAO,MAAA,CAAO,KAAK,KAAA,EAAO,IAAA,EAAM,CAAC,QAAA,CAAS,MAAA,EAAQ,CAAC,CAAA;AAAA,IACrD;AAAA,EACF;AAGA,EAAA,OAAO,MAAA,CAAO,IAAA,CAAK,KAAA,EAAO,IAAA,EAAM,EAAE,CAAA;AACpC;AAKA,SAAS,gBAAA,CACP,IAAA,EACA,MAAA,EACA,OAAA,EACQ;AAER,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC5C,EAAA,OAAA,CAAQ,SAAA,GAAY,IAAA;AAEpB,EAAA,MAAM,MAAA,GAASC,eAAA,CAAU,UAAA,CAAW,MAAM,CAAA;AAC1C,EAAA,OAAO,MAAA,CAAO,KAAA,CAAM,OAAA,EAAS,OAAA,EAAS,YAAY,CAAA;AACpD;AA8BO,SAAS,cAAA,CACd,OAAA,EACA,MAAA,EACA,OAAA,EACQ;AAER,EAAA,IAAI,OAAA,KAAY,IAAA,IAAQ,OAAA,KAAY,MAAA,IAAa,YAAY,EAAA,EAAI;AAC/D,IAAA,OAAO,oBAAoB,MAAM,CAAA;AAAA,EACnC;AAGA,EAAA,IAAI,aAAA,CAAc,OAAO,CAAA,EAAG;AAC1B,IAAA,OAAOC,UAAA,CAAO,QAAA,CAAS,MAAA,EAAQ,OAAO,CAAA;AAAA,EACxC;AAGA,EAAA,IAAI,aAAA,CAAc,OAAO,CAAA,EAAG;AAC1B,IAAA,OAAO,gBAAA,CAAiB,OAAA,EAAS,MAAA,EAAQ,OAAO,CAAA;AAAA,EAClD;AAGA,EAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KAEF;AAAA,EACF;AAGA,EAAA,MAAM,IAAI,KAAA;AAAA,IACR,CAAA,sFAAA,EACS,OAAO,OAAO,CAAA;AAAA,GACzB;AACF;;;ACnGO,SAAS,WAAA,CACd,IAAA,EACA,OAAA,GAA8B,EAAC,EACtB;AACT,EAAA,MAAM,EAAE,aAAA,GAAgB,IAAA,EAAM,gBAAA,GAAmB,MAAK,GAAI,OAAA;AAG1D,EAAA,IAAI,KAAK,MAAA,EAAQ;AAEf,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,OAAO,CAAC,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,KAAK,MAAA,KAAW,CAAA;AAAA,IAC5C;AAGA,IAAA,IAAI,gBAAA,IAAoB,IAAA,CAAK,IAAA,CAAK,IAAA,KAAS,WAAA,EAAa;AACtD,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,IAAI,IAAA,CAAK,eAAe,CAAA,EAAG;AACzB,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,CAAC,aAAA,EAAe;AAClB,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,YAAY,CAAA,EAAA,EAAK;AACxC,IAAA,IAAI,CAAC,WAAA,CAAY,IAAA,CAAK,MAAM,CAAC,CAAA,EAAG,OAAO,CAAA,EAAG;AACxC,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAWO,SAAS,gBAAgB,GAAA,EAAsB;AACpD,EAAA,OAAO,YAAY,GAAA,EAAK;AAAA,IACtB,aAAA,EAAe,IAAA;AAAA,IACf,gBAAA,EAAkB;AAAA,GACnB,CAAA;AACH;AChCO,SAAS,cAAc,OAAA,EAA0C;AACtE,EAAA,MAAM,EAAE,IAAA,EAAAC,KAAAA,EAAM,IAAA,EAAM,aAAA,EAAe,UAAS,GAAI,OAAA;AAEhD,EAAA,OAAO,IAAIC,oBAAA;AAAA,IACTD,KAAAA;AAAA,IACA,CAAC,KAAA,EAAoB,KAAA,EAAyB,KAAA,EAAe,GAAA,KAAgB;AAC3E,MAAA,MAAM,UAAA,GAAa,aAAA,GAAgB,aAAA,CAAc,KAAK,CAAA,GAAI,IAAA;AAG1D,MAAA,IAAI,aAAA,IAAiB,eAAe,IAAA,EAAM;AACxC,QAAA,OAAO,IAAA;AAAA,MACT;AAIA,MAAA,MAAM,WAAA,GAAc,MAAM,CAAC,CAAA;AAC3B,MAAA,IAAI,CAAC,WAAA,EAAa;AAChB,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,MAAM,EAAE,IAAG,GAAI,KAAA;AAGf,MAAA,EAAA,CAAG,YAAY,KAAA,EAAO,GAAA,EAAK,MAAM,MAAA,CAAO,IAAA,CAAK,WAAW,CAAC,CAAA;AAGzD,MAAA,EAAA,CAAG,OAAA,CAAQ,OAAO,KAAA,GAAQ,WAAA,CAAY,QAAQ,IAAA,CAAK,MAAA,CAAO,UAAA,IAAc,MAAS,CAAC,CAAA;AAGlF,MAAA,EAAA,CAAG,iBAAiB,IAAI,CAAA;AAExB,MAAA,OAAO,EAAA;AAAA,IACT,CAAA;AAAA,IACA,QAAA,KAAa,MAAA,GAAY,EAAE,QAAA,KAAa;AAAC,GAC3C;AACF;AAKO,IAAM,qBAAA,GAAwB;AAAA;AAAA;AAAA;AAAA;AAAA,EAKnC,IAAA,EAAM,iCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMN,MAAA,EAAQ,sBAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMR,IAAA,EAAM,oBAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMN,SAAA,EAAW;AACb;ACvDO,SAAS,kBAAkB,OAAA,EAA8C;AAC9E,EAAA,MAAM,EAAE,IAAA,EAAAA,KAAAA,EAAM,IAAA,EAAM,aAAA,GAAgB,MAAM,aAAA,EAAe,QAAA,EAAU,KAAA,EAAO,WAAA,EAAY,GAAI,OAAA;AAE1F,EAAA,OAAO,IAAIC,oBAAAA;AAAA,IACTD,KAAAA;AAAA,IACA,CAAC,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,GAAA,KAAQ;AAC5B,MAAA,IAAI,KAAA,IAAS,CAAC,KAAA,CAAM,KAAK,GAAG,OAAO,IAAA;AACnC,MAAA,MAAM,KAAA,GAAQ,aAAA,YAAyB,QAAA,GAAW,aAAA,CAAc,KAAK,CAAA,GAAI,aAAA;AACzE,MAAA,MAAM,EAAA,GAAK,KAAA,CAAM,EAAA,CAAG,MAAA,CAAO,OAAO,GAAG,CAAA;AACrC,MAAA,MAAM,MAAA,GAAS,EAAA,CAAG,GAAA,CAAI,OAAA,CAAQ,KAAK,CAAA;AACnC,MAAA,MAAM,KAAA,GAAQ,OAAO,UAAA,EAAW;AAChC,MAAA,MAAM,QAAA,GAAW,KAAA,IAASE,sBAAA,CAAa,KAAA,EAAO,MAAM,KAAK,CAAA;AACzD,MAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AACtB,MAAA,EAAA,CAAG,IAAA,CAAK,OAAO,QAAQ,CAAA;AACvB,MAAA,MAAM,SAAS,EAAA,CAAG,GAAA,CAAI,OAAA,CAAQ,KAAA,GAAQ,CAAC,CAAA,CAAE,UAAA;AACzC,MAAA,IAAI,MAAA,EAAQ,IAAA,KAAS,IAAA,IAAQC,iBAAA,CAAQ,GAAG,GAAA,EAAK,KAAA,GAAQ,CAAC,CAAA,KACjD,CAAC,aAAA,IAAiB,aAAA,CAAc,KAAA,EAAO,MAAM,CAAA,CAAA,EAAI;AACpD,QAAA,EAAA,CAAG,IAAA,CAAK,QAAQ,CAAC,CAAA;AAAA,MACnB;AAOA,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,MAAM,OAAA,GAAU,GAAG,SAAA,CAAU,KAAA;AAC7B,QAAA,KAAA,IAAS,CAAA,GAAI,OAAA,CAAQ,KAAA,EAAO,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AACvC,UAAA,IAAI,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,CAAE,SAAS,IAAA,EAAM;AACjC,YAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAA;AAC7B,YAAA,IAAI,KAAA,GAAQ,GAAG,GAAA,CAAI,OAAA,CAAQ,QAAQA,iBAAA,CAAQ,EAAA,CAAG,GAAA,EAAK,KAAK,CAAA,EAAG;AACzD,cAAA,MAAM,SAAA,GAAY,EAAA,CAAG,GAAA,CAAI,MAAA,CAAO,KAAK,CAAA;AACrC,cAAA,IAAI,SAAA,EAAW,SAAS,IAAA,KACnB,CAAC,iBAAiB,aAAA,CAAc,KAAA,EAAO,SAAS,CAAA,CAAA,EAAI;AACvD,gBAAA,EAAA,CAAG,KAAK,KAAK,CAAA;AAAA,cACf;AAAA,YACF;AACA,YAAA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA,MAAA,OAAO,EAAA;AAAA,IACT,CAAA;AAAA,IACA,QAAA,KAAa,MAAA,GAAY,EAAE,QAAA,KAAa;AAAC,GAC3C;AACF;AAOO,SAAS,cAAc,KAAA,EAA6B;AACzD,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,KAAA,CAAM,SAAA;AACxB,EAAA,KAAA,IAAS,CAAA,GAAI,KAAA,CAAM,KAAA,EAAO,CAAA,GAAI,GAAG,CAAA,EAAA,EAAK;AACpC,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,CAAC,EAAE,IAAA,CAAK,IAAA;AAChC,IAAA,IAAI,IAAA,KAAS,UAAA,IAAc,IAAA,KAAS,UAAA,EAAY,OAAO,KAAA;AAAA,EACzD;AACA,EAAA,OAAO,IAAA;AACT;AC3FO,SAAS,uBAAuB,OAAA,EAAmD;AACxF,EAAA,MAAM,EAAE,IAAA,EAAAH,KAAAA,EAAM,MAAM,aAAA,GAAgB,IAAA,EAAM,UAAS,GAAI,OAAA;AAEvD,EAAA,OAAO,IAAIC,oBAAAA;AAAA,IACTD,KAAAA;AAAA,IACA,CAAC,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,GAAA,KAAQ;AAC5B,MAAA,MAAM,MAAA,GAAS,KAAA,CAAM,GAAA,CAAI,OAAA,CAAQ,KAAK,CAAA;AACtC,MAAA,MAAM,KAAA,GAAQ,aAAA,YAAyB,QAAA,GAAW,aAAA,CAAc,KAAK,CAAA,GAAI,aAAA;AACzE,MAAA,IAAI,CAAC,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA,CAAE,eAAe,MAAA,CAAO,KAAA,CAAM,EAAE,CAAA,EAAG,OAAO,UAAA,CAAW,EAAE,CAAA,EAAG,IAAI,GAAG,OAAO,IAAA;AAC3F,MAAA,OAAO,KAAA,CAAM,EAAA,CACV,MAAA,CAAO,KAAA,EAAO,GAAG,EACjB,YAAA,CAAa,KAAA,EAAO,KAAA,EAAO,IAAA,EAAM,KAAK,CAAA;AAAA,IAC3C,CAAA;AAAA,IACA,QAAA,KAAa,MAAA,GAAY,EAAE,QAAA,KAAa;AAAC,GAC3C;AACF;ACvBO,SAAS,cAAc,OAAA,EAA0C;AACtE,EAAA,MAAM,EAAE,IAAA,EAAAA,KAAAA,EAAM,OAAA,EAAS,UAAS,GAAI,OAAA;AAEpC,EAAA,OAAO,IAAIC,oBAAAA;AAAA,IACTD,KAAAA;AAAA,IACA,CAAC,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,QAAQ,KAAA,CAAM,EAAA,CAAG,WAAA,CAAY,KAAA,EAAO,GAAA,EAAK,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,OAAO,CAAC,CAAA;AAAA,IAC1F,QAAA,KAAa,MAAA,GAAY,EAAE,QAAA,KAAa;AAAC,GAC3C;AACF;ACAO,SAAS,cAAc,OAAA,EAA0C;AACtE,EAAA,MAAM,EAAE,IAAA,EAAAA,KAAAA,EAAM,MAAM,aAAA,GAAgB,IAAA,EAAM,UAAS,GAAI,OAAA;AAEvD,EAAA,OAAO,IAAIC,oBAAAA;AAAA,IACTD,KAAAA;AAAA,IACA,CAAC,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,GAAA,KAAQ;AAC5B,MAAA,MAAM,QAAQ,aAAA,YAAyB,QAAA,GAAW,aAAA,CAAc,KAAA,EAAO,KAAK,CAAA,GAAI,aAAA;AAChF,MAAA,IAAI,aAAA,YAAyB,QAAA,IAAY,KAAA,KAAU,IAAA,EAAM,OAAO,IAAA;AAChE,MAAA,OAAO,KAAA,CAAM,GAAG,WAAA,CAAY,KAAA,EAAO,KAAK,IAAA,CAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,IAC5D,CAAA;AAAA,IACA,QAAA,KAAa,MAAA,GAAY,EAAE,QAAA,KAAa;AAAC,GAC3C;AACF;;;ACzBO,SAAS,UAAA,CACd,GAAA,EACA,OAAA,GAA6B,EAAC,EACrB;AACT,EAAA,MAAM,EAAE,SAAA,GAAY,CAAC,OAAA,EAAS,QAAQ,GAAE,GAAI,OAAA;AAE5C,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,GAAG,CAAA;AAC1B,IAAA,OAAO,SAAA,CAAU,QAAA,CAAS,MAAA,CAAO,QAAQ,CAAA;AAAA,EAC3C,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;ACjBA,SAAS,0BAA0B,UAAA,EAAoC;AAErE,EAAA,MAAM,UAAA,GAAa;AAAA,IACjB,KAAA,EAAO,IAAA;AAAA,IACP,IAAA,EAAM,IAAA;AAAA,IACN,MAAA,EAAQ,IAAA;AAAA,IACR,UAAU;AAAC,GACb;AAEA,EAAA,MAAM,UAAU,IAAI,gBAAA;AAAA,IAClB,EAAE,UAAA,EAAW;AAAA,IACb;AAAA,GACF;AACA,EAAA,OAAO,OAAA,CAAQ,MAAA;AACjB;AAMA,SAAS,WAAA,GAAwB;AAE/B,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,IAAA,OAAO,MAAA,CAAO,QAAA;AAAA,EAChB;AAGA,EAAA,IAAI;AAEF,IAAA,MAAM,QAAA,GAAW,UAAQ,UAAU,CAAA;AACnC,IAAA,MAAM,EAAE,QAAA,EAAAI,SAAAA,EAAS,GAAI,QAAA,CAAS,UAAU,2CAA2C,CAAA;AACnF,IAAA,OAAOA,SAAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AACF;AA2BO,SAAS,YAAA,CACd,OAAA,EACA,UAAA,EACA,OAAA,GAA+B,EAAC,EACxB;AACR,EAAA,MAAM,MAAA,GAAS,0BAA0B,UAAU,CAAA;AACnD,EAAA,MAAM,GAAA,GAAML,UAAAA,CAAO,QAAA,CAAS,MAAA,EAAQ,OAAO,CAAA;AAC3C,EAAA,MAAM,cAAA,GAAiB,OAAA,CAAQ,QAAA,IAAY,WAAA,EAAY;AAEvD,EAAA,MAAM,UAAA,GAAaM,mBAAA,CAAc,UAAA,CAAW,MAAM,CAAA;AAClD,EAAA,MAAM,QAAA,GAAW,UAAA,CAAW,iBAAA,CAAkB,GAAA,CAAI,OAAA,EAAS;AAAA,IACzD,QAAA,EAAU;AAAA,GACX,CAAA;AAED,EAAA,MAAM,SAAA,GAAY,cAAA,CAAe,aAAA,CAAc,KAAK,CAAA;AACpD,EAAA,SAAA,CAAU,YAAY,QAAQ,CAAA;AAE9B,EAAA,OAAO,SAAA,CAAU,SAAA;AACnB;AA2BO,SAAS,YAAA,CACd,IAAA,EACA,UAAA,EACA,OAAA,GAA+B,EAAC,EACnB;AACb,EAAA,MAAM,MAAA,GAAS,0BAA0B,UAAU,CAAA;AACnD,EAAA,MAAM,cAAA,GAAiB,OAAA,CAAQ,QAAA,IAAY,WAAA,EAAY;AAGvD,EAAA,MAAM,SAAA,GAAY,cAAA,CAAe,aAAA,CAAc,KAAK,CAAA;AACpD,EAAA,SAAA,CAAU,SAAA,GAAY,IAAA;AAGtB,EAAA,MAAM,MAAA,GAASC,eAAA,CAAY,UAAA,CAAW,MAAM,CAAA;AAC5C,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,KAAA,CAAM,SAAS,CAAA;AAElC,EAAA,OAAO,IAAI,MAAA,EAAO;AACpB;AA8BO,SAAS,YAAA,CACd,OAAA,EACA,UAAA,EACA,OAAA,GAA+B,EAAC,EACxB;AACR,EAAA,MAAM,EAAE,cAAA,GAAiB,MAAA,EAAO,GAAI,OAAA;AACpC,EAAA,MAAM,MAAA,GAAS,0BAA0B,UAAU,CAAA;AACnD,EAAA,MAAM,GAAA,GAAMP,UAAAA,CAAO,QAAA,CAAS,MAAA,EAAQ,OAAO,CAAA;AAE3C,EAAA,OAAO,IAAI,WAAA,CAAY,CAAA,EAAG,GAAA,CAAI,OAAA,CAAQ,MAAM,cAAc,CAAA;AAC5D;;;AC/KO,SAAS,YAAA,CACd,MACA,IAAA,EACuB;AACvB,EAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AAGpB,EAAA,IAAI,KAAA,GAAQ,MAAA,CAAO,UAAA,CAAW,IAAA,CAAK,YAAY,CAAA;AAE/C,EAAA,IAAI,CAAC,MAAM,IAAA,IAAQ,CAAC,KAAK,OAAA,CAAQ,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA,EAAG;AAClD,IAAA,KAAA,GAAQ,MAAA,CAAO,WAAA,CAAY,IAAA,CAAK,YAAY,CAAA;AAAA,EAC9C;AAEA,EAAA,IAAI,CAAC,MAAM,IAAA,IAAQ,CAAC,KAAK,OAAA,CAAQ,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA,EAAG;AAClD,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,IAAI,aAAa,KAAA,CAAM,KAAA;AACvB,EAAA,IAAI,QAAA,GAAW,IAAA,CAAK,KAAA,EAAM,GAAI,KAAA,CAAM,MAAA;AACpC,EAAA,IAAI,WAAW,UAAA,GAAa,CAAA;AAC5B,EAAA,IAAI,MAAA,GAAS,QAAA,GAAW,KAAA,CAAM,IAAA,CAAK,QAAA;AAGnC,EAAA,OAAO,UAAA,GAAa,CAAA,IAAK,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,MAAM,UAAA,GAAa,CAAC,CAAA,CAAE,KAAK,CAAA,EAAG;AACzE,IAAA,UAAA,IAAc,CAAA;AACd,IAAA,QAAA,IAAY,MAAA,CAAO,KAAA,CAAM,UAAU,CAAA,CAAE,QAAA;AAAA,EACvC;AAGA,EAAA,OAAO,QAAA,GAAW,MAAA,CAAO,UAAA,IAAc,IAAA,CAAK,OAAA,CAAQ,OAAO,KAAA,CAAM,QAAQ,CAAA,CAAE,KAAK,CAAA,EAAG;AACjF,IAAA,MAAA,IAAU,MAAA,CAAO,KAAA,CAAM,QAAQ,CAAA,CAAE,QAAA;AACjC,IAAA,QAAA,IAAY,CAAA;AAAA,EACd;AAEA,EAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,EAAA,EAAI,MAAA,EAAO;AACtC;;;AC/BO,IAAM,cAAA,GACX,CAAC,SAAA,KACD,CAAC,SAAA,KAA2D;AAC1D,EAAA,MAAM,EAAE,OAAM,GAAI,SAAA;AAElB,EAAA,KAAA,IAAS,KAAA,GAAQ,KAAA,CAAM,KAAA,EAAO,KAAA,GAAQ,GAAG,KAAA,EAAA,EAAS;AAChD,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA;AAE7B,IAAA,IAAI,SAAA,CAAU,IAAI,CAAA,EAAG;AACnB,MAAA,OAAO;AAAA,QACL,GAAA,EAAK,KAAA,CAAM,MAAA,CAAO,KAAK,CAAA;AAAA,QACvB,KAAA,EAAO,KAAA,CAAM,KAAA,CAAM,KAAK,CAAA;AAAA,QACxB,KAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;;;AC3BK,IAAM,YAAA,GAAe,CAC1B,IAAA,EACA,SAAA,KACsB;AACtB,EAAA,MAAM,SAA4B,EAAC;AAEnC,EAAA,IAAA,CAAK,OAAA,CAAQ,CAAC,KAAA,EAAOQ,OAAAA,KAAW;AAC9B,IAAA,IAAI,SAAA,CAAU,KAAK,CAAA,EAAG;AACpB,MAAA,MAAA,CAAO,KAAK,EAAE,IAAA,EAAM,KAAA,EAAO,GAAA,EAAKA,SAAQ,CAAA;AAAA,IAC1C;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO,MAAA;AACT;;;ACZO,IAAM,cAAA,GAAiB,CAAC,KAAA,KAAyC;AACtE,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,WAAW,CAAA,EAAA,EAAK;AACxC,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,KAAA,CAAM,KAAK,CAAC,CAAA;AAE7B,IAAA,IAAI,IAAA,CAAK,WAAA,IAAe,CAAC,IAAA,CAAK,kBAAiB,EAAG;AAChD,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;;;ACkBO,IAAM,UAAA,GACX,CAAC,OAAA,EAAkB,OAAA,GAA6B,EAAC,KACjD,CAAC,EAAE,KAAA,EAAO,EAAA,EAAI,QAAA,EAAS,KAAM;AAC3B,EAAA,MAAM,EAAE,UAAA,GAAa,IAAA,EAAM,YAAA,EAAa,GAAI,OAAA;AAC5C,EAAA,MAAM,EAAE,QAAO,GAAI,KAAA;AAGnB,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI;AACF,IAAA,GAAA,GAAM,cAAA,CAAe,OAAA,EAAS,MAAA,EAAQ,EAAE,cAAc,CAAA;AAAA,EACxD,CAAA,CAAA,MAAQ;AAEN,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,IAAA;AAAA,EACT;AAIA,EAAA,EAAA,CAAG,YAAY,CAAA,EAAG,EAAA,CAAG,IAAI,OAAA,CAAQ,IAAA,EAAM,IAAI,OAAO,CAAA;AAGlD,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,EAAA,CAAG,OAAA,CAAQ,gBAAgB,KAAK,CAAA;AAChC,IAAA,EAAA,CAAG,OAAA,CAAQ,cAAc,IAAI,CAAA;AAAA,EAC/B;AAEA,EAAA,QAAA,CAAS,EAAE,CAAA;AACX,EAAA,OAAO,IAAA;AACT;AAOK,IAAM,YAAA,GACX,CAAC,OAAA,GAA+B,EAAC,KACjC,CAAC,EAAE,KAAA,EAAO,EAAA,EAAI,QAAA,EAAS,KAAM;AAC3B,EAAA,MAAM,EAAE,UAAA,GAAa,IAAA,EAAK,GAAI,OAAA;AAC9B,EAAA,MAAM,EAAE,QAAO,GAAI,KAAA;AAGnB,EAAA,MAAM,GAAA,GAAM,cAAA,CAAe,IAAA,EAAM,MAAM,CAAA;AAGvC,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,IAAA;AAAA,EACT;AAIA,EAAA,EAAA,CAAG,YAAY,CAAA,EAAG,EAAA,CAAG,IAAI,OAAA,CAAQ,IAAA,EAAM,IAAI,OAAO,CAAA;AAElD,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,EAAA,CAAG,OAAA,CAAQ,gBAAgB,KAAK,CAAA;AAChC,IAAA,EAAA,CAAG,OAAA,CAAQ,cAAc,IAAI,CAAA;AAAA,EAC/B;AAEA,EAAA,QAAA,CAAS,EAAE,CAAA;AACX,EAAA,OAAO,IAAA;AACT;AAOK,IAAM,aACX,CAAC,IAAA,KACD,CAAC,EAAE,EAAA,EAAI,UAAS,KAAM;AAEpB,EAAA,MAAM,EAAE,IAAA,EAAM,EAAA,EAAG,GAAI,EAAA,CAAG,SAAA;AAIxB,EAAA,IAAI,EAAA,CAAG,qBAAqBf,mBAAAA,EAAe;AACzC,IAAA,MAAM,EAAE,KAAA,EAAM,GAAI,EAAA,CAAG,SAAA;AACrB,IAAA,IAAI,CAAC,KAAA,CAAM,MAAA,CAAO,aAAA,EAAe;AAC/B,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,EAAA,CAAG,UAAA,CAAW,IAAA,EAAM,IAAA,EAAM,EAAE,CAAA;AAC5B,EAAA,QAAA,CAAS,EAAE,CAAA;AACX,EAAA,OAAO,IAAA;AACT;AAOK,IAAM,aAAA,GACX,CAAC,OAAA,KACD,CAAC,EAAE,KAAA,EAAO,EAAA,EAAI,UAAS,KAAM;AAC3B,EAAA,MAAM,EAAE,QAAO,GAAI,KAAA;AACnB,EAAA,MAAM,EAAE,IAAA,EAAM,EAAA,EAAG,GAAI,EAAA,CAAG,SAAA;AAGxB,EAAA,IAAI,QAAA;AAEJ,EAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAE/B,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,MAAM,MAAA,GAASgB,eAAA,CAAqB,UAAA,CAAW,MAAM,CAAA;AACrD,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC5C,IAAA,OAAA,CAAQ,SAAA,GAAY,OAAA;AACpB,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA;AACnC,IAAA,QAAA,GAAW,MAAA,CAAO,OAAA;AAAA,EACpB,CAAA,MAAA,IAAW,OAAA,IAAW,OAAO,OAAA,KAAY,QAAA,EAAU;AAEjD,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AAE1B,MAAA,MAAM,QAAQ,OAAA,CAAQ,GAAA,CAAI,UAAQ,MAAA,CAAO,YAAA,CAAa,IAAI,CAAC,CAAA;AAC3D,MAAA,QAAA,GAAWC,cAAA,CAAS,KAAK,KAAK,CAAA;AAAA,IAChC,CAAA,MAAA,IAAW,UAAU,OAAA,EAAS;AAE5B,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,YAAA,CAAa,OAAO,CAAA;AAExC,MAAA,QAAA,GAAW,IAAA,CAAK,KAAK,IAAA,KAAS,KAAA,GAAQ,KAAK,OAAA,GAAUA,cAAA,CAAS,KAAK,IAAI,CAAA;AAAA,IACzE,CAAA,MAAO;AACL,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF,CAAA,MAAO;AACL,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,EAAA,CAAG,YAAA,CAAa,MAAM,EAAA,EAAI,IAAIC,YAAM,QAAA,EAAU,CAAA,EAAG,CAAC,CAAC,CAAA;AACnD,EAAA,QAAA,CAAS,EAAE,CAAA;AACX,EAAA,OAAO,IAAA;AACT;;;AC7IK,SAAS,4BAAA,CACd,cACA,cAAA,EACQ;AACR,EAAA,MAAM,MAAA,GAAS,YAAA;AACf,EAAA,MAAM,MAAA,GAAkC,EAAE,GAAG,MAAA,EAAO;AAEpD,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,cAAc,CAAA,EAAG;AACzD,IAAA,IAAI,OAAO,KAAA,KAAU,UAAA,IAAc,OAAO,MAAA,CAAO,GAAG,MAAM,UAAA,EAAY;AACpE,MAAA,MAAM,QAAA,GAAW,OAAO,GAAG,CAAA;AAC3B,MAAA,MAAM,OAAA,GAAU,KAAA;AAEhB,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,SAAA,GAA8B,IAAA,EAAiB;AAC3D,QAAA,MAAM,iBAAiB,IAAA,CAAK,MAAA;AAC5B,QAAA,IAAA,CAAK,SAAS,CAAA,GAAI,KAAA,KAAqB,SAAS,IAAA,CAAK,IAAA,EAAM,GAAG,KAAK,CAAA;AACnE,QAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,IAAA,CAAK,IAAA,EAAM,GAAG,IAAI,CAAA;AACzC,QAAA,IAAA,CAAK,MAAA,GAAS,cAAA;AACd,QAAA,OAAO,MAAA;AAAA,MACT,CAAA;AAAA,IACF,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,KAAA;AAAA,IAChB;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAmBO,IAAM,SAAA,GAAN,MAAM,UAAA,CAAgD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMlD,IAAA,GAAsC,WAAA;AAAA;AAAA;AAAA;AAAA,EAKtC,IAAA;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMT,OAAA;AAAA;AAAA;AAAA;AAAA,EAKS,MAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMT,MAAA,GAA0C,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO1C,MAAA;AAAA;AAAA;AAAA;AAAA,EAKU,YAAY,MAAA,EAA2C;AAE/D,IAAA,IAAI,CAAC,qBAAA,CAAsB,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA,EAAG;AAC5C,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,gBAAA,EAAmB,OAAO,IAAI,CAAA,6FAAA;AAAA,OAEhC;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,OAAO,MAAA,CAAO,IAAA;AAInB,IAAA,MAAM,cAAA,GAAiB,YAAA,CAAa,MAAA,CAAO,UAAA,EAAY,IAAI,CAAA;AAC3D,IAAA,IAAA,CAAK,OAAA,GAAW,kBAAkB,EAAC;AAInC,IAAA,MAAM,cAAA,GAAiB,YAAA,CAAa,MAAA,CAAO,UAAA,EAAY,IAAI,CAAA;AAC3D,IAAA,IAAA,CAAK,OAAA,GAAW,kBAAkB,EAAC;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,OAAO,OACL,MAAA,EACiB;AACjB,IAAA,OAAO,IAAI,WAAU,MAAM,CAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuBA,UAAU,OAAA,EAAwD;AAEhE,IAAA,MAAM,SAAA,GAA+C;AAAA,MACnD,GAAG,IAAA,CAAK,MAAA;AAAA;AAAA,MAER,YAAY,OAAO;AAAA,QACjB,GAAG,IAAA,CAAK,OAAA;AAAA,QACR,GAAG;AAAA,OACL;AAAA,KACF;AAEA,IAAA,OAAO,IAAI,WAAU,SAAS,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,KAAA,GAAqC;AACnC,IAAA,MAAM,OAAO,IAAA,CAAK,WAAA;AAGlB,IAAA,OAAO,IAAI,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiCA,OACE,cAAA,EAE6C;AAC7C,IAAA,MAAM,SAAA,GAAY,4BAAA,CAA6B,IAAA,CAAK,MAAA,EAAQ,cAAc,CAAA;AAE1E,IAAA,OAAO,IAAI,WAAU,SAA8D,CAAA;AAAA,EACrF;AACF;;;AC/PO,SAAS,sBACd,cAAA,EACuC;AACvC,EAAA,MAAM,QAA+C,EAAC;AAEtD,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,QAAQ,KAAK,MAAA,CAAO,OAAA,CAAQ,cAAc,CAAA,EAAG;AAC7D,IAAA,MAAM,IAAA,GAAgC;AAAA,MACpC,SAAS,QAAA,CAAS;AAAA,KACpB;AAEA,IAAA,IAAI,SAAS,QAAA,EAAU;AACrB,MAAA,IAAA,CAAK,UAAU,IAAI,QAAA,CAAS,QAAA;AAAA,IAC9B;AACA,IAAA,KAAA,CAAM,IAAI,CAAA,GAAI,IAAA;AAAA,EAChB;AAEA,EAAA,OAAO,KAAA;AACT;AAYO,SAAS,mBAAA,CACd,OACA,SAAA,EACyB;AACzB,EAAA,MAAM,YAAqC,EAAC;AAE5C,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,QAAQ,KAAK,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA,EAAG;AAExD,IAAA,IAAI,QAAA,CAAS,aAAa,KAAA,EAAO;AAGjC,IAAA,IAAI,SAAS,UAAA,EAAY;AACvB,MAAA,MAAM,QAAA,GAAW,QAAA,CAAS,UAAA,CAAW,KAAK,CAAA;AAC1C,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,MAAA,CAAO,MAAA,CAAO,WAAW,QAAQ,CAAA;AAAA,MACnC;AAAA,IACF,CAAA,MAAA,IAAW,MAAM,IAAI,CAAA,KAAM,UAAa,KAAA,CAAM,IAAI,MAAM,IAAA,EAAM;AAE5D,MAAA,SAAA,CAAU,IAAI,CAAA,GAAI,KAAA,CAAM,IAAI,CAAA;AAAA,IAC9B;AAAA,EACF;AAEA,EAAA,OAAO,SAAA;AACT;;;ACjBO,IAAM,IAAA,GAAN,MAAM,KAAA,SAAmD,SAAA,CAG9D;AAAA;AAAA;AAAA;AAAA;AAAA,EAKkB,IAAA,GAAO,MAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYhB,MAAA,GAAqC,IAAA;AAAA;AAAA;AAAA;AAAA,EAKpC,YAAY,MAAA,EAAsC;AAC1D,IAAA,KAAA,CAAM,MAAM,CAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,YAAA,GAAwB;AAC1B,IAAA,OAAO,IAAA,CAAK,OAAO,YAAA,KAAiB,KAAA;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,IAAI,QAAA,GAA4B;AAC9B,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAO,KAAK,MAAA,CAAO,MAAA,CAAO,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,IAAK,IAAA;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,eAAA,GAA4B;AAC9B,IAAA,MAAM,OAAO,IAAA,CAAK,QAAA;AAClB,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,MAAA,EAAS,KAAK,IAAI,CAAA,gFAAA;AAAA,OAEpB;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,OAAgB,OACd,MAAA,EACY;AACZ,IAAA,OAAO,IAAI,MAAK,MAAM,CAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUS,UAAU,OAAA,EAAgF;AACjG,IAAA,MAAM,EAAE,YAAA,EAAc,GAAG,WAAA,EAAY,GAAI,OAAA;AACzC,IAAA,MAAM,SAAA,GAA0C;AAAA,MAC9C,GAAG,IAAA,CAAK,MAAA;AAAA,MACR,GAAI,YAAA,KAAiB,MAAA,GAAY,EAAE,YAAA,KAAiB,EAAC;AAAA,MACrD,YAAY,OAAO;AAAA,QACjB,GAAG,IAAA,CAAK,OAAA;AAAA,QACR,GAAG;AAAA,OACL;AAAA,KACF;AAEA,IAAA,OAAO,IAAI,MAAK,SAAS,CAAA;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA8BS,OACP,cAAA,EAEwC;AACxC,IAAA,MAAM,SAAA,GAAY,4BAAA,CAA6B,IAAA,CAAK,MAAA,EAAQ,cAAc,CAAA;AAE1E,IAAA,OAAO,IAAI,MAAK,SAAyD,CAAA;AAAA,EAC3E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,cAAA,GAA2B;AACzB,IAAA,MAAM,OAAiB,EAAC;AAGxB,IAAA,IAAI,IAAA,CAAK,OAAO,SAAA,KAAc,MAAA;AAC5B,MAAA,IAAA,CAAK,SAAA,GAAY,YAAA,CAAa,IAAA,CAAK,MAAA,CAAO,WAAW,IAAI,CAAA;AAC3D,IAAA,IAAI,IAAA,CAAK,OAAO,QAAA,KAAa,MAAA;AAC3B,MAAA,IAAA,CAAK,QAAA,GAAW,KAAK,MAAA,CAAO,QAAA;AAC9B,IAAA,IAAI,KAAK,MAAA,CAAO,KAAA,KAAU,QAAW,IAAA,CAAK,KAAA,GAAQ,KAAK,MAAA,CAAO,KAAA;AAC9D,IAAA,IAAI,IAAA,CAAK,OAAO,QAAA,KAAa,MAAA;AAC3B,MAAA,IAAA,CAAK,QAAA,GAAW,KAAK,MAAA,CAAO,QAAA;AAG9B,IAAA,MAAM,cAAA,GAAiB,YAAA,CAAa,IAAA,CAAK,MAAA,CAAO,eAAe,IAAI,CAAA;AACnE,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,IAAA,CAAK,KAAA,GAAQ,sBAAsB,cAAc,CAAA;AAAA,IACnD;AAGA,IAAA,MAAM,UAAA,GAAa,YAAA,CAAa,IAAA,CAAK,MAAA,CAAO,WAAW,IAAI,CAAA;AAC3D,IAAA,IAAI,UAAA,IAAc,UAAA,CAAW,MAAA,GAAS,CAAA,EAAG;AAEvC,MAAA,MAAM,aAAA,GAAgB,UAAA,CAAW,GAAA,CAAI,CAAC,IAAA,KAAS;AAE7C,QAAA,MAAM,YAQF,EAAC;AAEL,QAAA,IAAI,IAAA,CAAK,GAAA,EAAK,SAAA,CAAU,GAAA,GAAM,IAAA,CAAK,GAAA;AACnC,QAAA,IAAI,IAAA,CAAK,KAAA,EAAO,SAAA,CAAU,KAAA,GAAQ,IAAA,CAAK,KAAA;AACvC,QAAA,IAAI,IAAA,CAAK,QAAA,KAAa,MAAA,EAAW,SAAA,CAAU,WAAW,IAAA,CAAK,QAAA;AAC3D,QAAA,IAAI,IAAA,CAAK,SAAA,KAAc,MAAA,EAAW,SAAA,CAAU,YAAY,IAAA,CAAK,SAAA;AAG7D,QAAA,IAAI,IAAA,CAAK,YAAY,cAAA,EAAgB;AACnC,UAAA,SAAA,CAAU,QAAA,GAAW,CAAC,IAAA,KAA+B;AAEnD,YAAA,MAAM,YAAY,IAAA,CAAK,QAAA,GAAW,KAAK,QAAA,CAAS,IAAI,IAAI,EAAC;AAGzD,YAAA,IAAI,SAAA,KAAc,IAAA,IAAQ,SAAA,KAAc,KAAA,EAAO;AAC7C,cAAA,OAAO,SAAA;AAAA,YACT;AAGA,YAAA,MAAM,WAAA,GAAuC,EAAE,GAAG,SAAA,EAAU;AAK5D,YAAA,IAAI,cAAA,IAAkB,OAAO,IAAA,KAAS,QAAA,EAAU;AAC9C,cAAA,KAAA,MAAW,CAAC,IAAA,EAAM,QAAQ,KAAK,MAAA,CAAO,OAAA,CAAQ,cAAc,CAAA,EAAG;AAC7D,gBAAA,IAAI,SAAS,SAAA,EAAW;AACtB,kBAAA,WAAA,CAAY,IAAI,CAAA,GAAI,QAAA,CAAS,SAAA,CAAU,IAAI,CAAA;AAAA,gBAC7C;AAAA,cACF;AAAA,YACF;AAEA,YAAA,OAAO,WAAA;AAAA,UACT,CAAA;AAAA,QACF;AAEA,QAAA,OAAO,SAAA;AAAA,MACT,CAAC,CAAA;AAKD,MAAA,IAAA,CAAK,QAAA,GAAW,aAAA;AAAA,IAClB;AAGA,IAAA,IAAI,IAAA,CAAK,OAAO,UAAA,EAAY;AAC1B,MAAA,MAAM,QAAA,GAAW,KAAK,MAAA,CAAO,UAAA;AAC7B,MAAA,MAAM,SAAA,GAAY,cAAA;AAElB,MAAA,MAAM,YAAA,GAAe,IAAA;AAErB,MAAA,IAAA,CAAK,KAAA,GAAQ,CAAC,IAAA,EAAM,OAAA,KAAY;AAC9B,QAAA,MAAM,YAAY,SAAA,GACd,mBAAA,CAAoB,KAAK,KAAA,EAAO,SAAS,IACzC,EAAC;AAEL,QAAA,OAAO,SAAS,IAAA,CAAK,YAAA,EAAc,EAAE,IAAA,EAAM,cAAA,EAAgB,WAAW,CAAA;AAAA,MACxE,CAAA;AAAA,IACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AACF;;;AC1RA,SAAS,YAAA,CACP,KAAA,EACA,EAAA,EACA,QAAA,EACS;AACT,EAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAO,GAAI,EAAA,CAAG,SAAA;AAC7B,EAAA,MAAM,UAAA,GAAa,OAAO,CAAC,CAAA;AAC3B,EAAA,IAAI,CAAC,YAAY,OAAO,KAAA;AAExB,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,MAAM,OAAO,EAAA,CAAG,GAAA,CAAI,OAAA,CAAQ,UAAA,CAAW,MAAM,GAAG,CAAA;AAChD,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,aAAA,IAAiB,CAAC,KAAK,MAAA,CAAO,IAAA,CAAK,cAAA,CAAe,QAAQ,CAAA,EAAG;AAC5E,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,MAAM,cAAc,EAAA,CAAG,WAAA,IAAe,KAAA,CAAM,WAAA,IAAe,KAAK,KAAA,EAAM;AACtE,IAAA,IAAI,WAAA,CAAY,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,IAAK,CAAA,CAAE,IAAA,KAAS,QAAQ,CAAA,EAAG;AAC7E,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF,CAAA,MAAO;AACL,IAAA,MAAM,MAAM,EAAE,YAAA,EAAc,OAAO,OAAA,EAAS,KAAA,EAAO,mBAAmB,KAAA,EAAM;AAC5E,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,EAAA,CAAG,GAAA,CAAI,aAAa,KAAA,CAAM,KAAA,CAAM,KAAK,KAAA,CAAM,GAAA,CAAI,GAAA,EAAK,CAAC,IAAA,KAAS;AAC5D,QAAA,IAAI,KAAK,aAAA,IAAiB,IAAA,CAAK,IAAA,CAAK,cAAA,CAAe,QAAQ,CAAA,EAAG;AAC5D,UAAA,GAAA,CAAI,YAAA,GAAe,IAAA;AAAA,QACrB;AACA,QAAA,IAAI,KAAK,MAAA,EAAQ;AACf,UAAA,GAAA,CAAI,OAAA,GAAU,IAAA;AACd,UAAA,IAAI,CAAC,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,IAAK,CAAA,CAAE,IAAA,KAAS,QAAQ,CAAA,EAAG;AAC7E,YAAA,GAAA,CAAI,iBAAA,GAAoB,IAAA;AAAA,UAC1B;AAAA,QACF;AAAA,MACF,CAAC,CAAA;AAAA,IACH;AACA,IAAA,IAAI,CAAC,GAAA,CAAI,YAAA,IAAiB,IAAI,OAAA,IAAW,CAAC,IAAI,iBAAA,EAAoB;AAChE,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAYO,IAAM,UAAA,GACX,CAAC,QAAA,EAAkB,UAAA,KACnB,CAAC,EAAE,KAAA,EAAO,EAAA,EAAI,QAAA,EAAS,KAAM;AAC3B,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,QAAQ,CAAA;AAE5C,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAAC,YAAA,CAAa,KAAA,EAAO,EAAA,EAAI,QAAQ,CAAA,EAAG;AACtC,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAO,GAAI,EAAA,CAAG,SAAA;AAC7B,EAAA,MAAM,UAAA,GAAa,OAAO,CAAC,CAAA;AAC3B,EAAA,IAAI,CAAC,YAAY,OAAO,KAAA;AAExB,EAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAEtB,EAAA,IAAI,KAAA,EAAO;AAET,IAAA,MAAM,IAAA,GAAO,WAAW,KAAA,CAAM,GAAA;AAC9B,IAAA,MAAM,WAAA,GAAc,EAAA,CAAG,WAAA,IAClB,KAAA,CAAM,WAAA,IACN,GAAG,GAAA,CAAI,OAAA,CAAQ,IAAI,CAAA,CAAE,KAAA,EAAM;AAEhC,IAAA,IAAI,QAAA,CAAS,OAAA,CAAQ,WAAW,CAAA,EAAG;AACjC,MAAA,EAAA,CAAG,iBAAiB,QAAQ,CAAA;AAAA,IAC9B,CAAA,MAAO;AACL,MAAA,EAAA,CAAG,aAAA,CAAc,QAAA,CAAS,MAAA,CAAO,UAAA,IAAc,IAAI,CAAC,CAAA;AAAA,IACtD;AAAA,EACF,CAAA,MAAO;AAEL,IAAA,MAAM,UAAU,MAAA,CAAO,KAAA;AAAA,MAAM,CAAA,KAAA,KAC3B,EAAA,CAAG,GAAA,CAAI,YAAA,CAAa,KAAA,CAAM,MAAM,GAAA,EAAK,KAAA,CAAM,GAAA,CAAI,GAAA,EAAK,QAAQ;AAAA,KAC9D;AACA,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,EAAA,CAAG,WAAW,KAAA,CAAM,KAAA,CAAM,KAAK,KAAA,CAAM,GAAA,CAAI,KAAK,QAAQ,CAAA;AAAA,MACxD,CAAA,MAAO;AACL,QAAA,EAAA,CAAG,OAAA,CAAQ,KAAA,CAAM,KAAA,CAAM,GAAA,EAAK,KAAA,CAAM,GAAA,CAAI,GAAA,EAAK,QAAA,CAAS,MAAA,CAAO,UAAA,IAAc,IAAI,CAAC,CAAA;AAAA,MAChF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,QAAA,CAAS,EAAE,CAAA;AACX,EAAA,OAAO,IAAA;AACT;AAQK,IAAM,OAAA,GACX,CAAC,QAAA,EAAkB,UAAA,KACnB,CAAC,EAAE,KAAA,EAAO,EAAA,EAAI,QAAA,EAAS,KAAM;AAC3B,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,QAAQ,CAAA;AAE5C,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAAC,YAAA,CAAa,KAAA,EAAO,EAAA,EAAI,QAAQ,CAAA,EAAG;AACtC,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAO,GAAI,EAAA,CAAG,SAAA;AAC7B,EAAA,MAAM,UAAA,GAAa,OAAO,CAAC,CAAA;AAC3B,EAAA,IAAI,CAAC,YAAY,OAAO,KAAA;AAGxB,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAEtB,IAAA,MAAM,IAAA,GAAO,WAAW,KAAA,CAAM,GAAA;AAI9B,IAAA,MAAM,YAAA,GAAe,EAAA,CAAG,WAAA,EAAa,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,KAAS,QAAQ,CAAA,IAC7D,KAAA,CAAM,WAAA,EAAa,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,KAAS,QAAQ,CAAA,IAChD,EAAA,CAAG,GAAA,CAAI,OAAA,CAAQ,IAAI,CAAA,CAAE,KAAA,EAAM,CAAE,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,KAAS,QAAQ,CAAA,IAC1D,IAAA;AACL,IAAA,MAAM,WAAA,GAAc,eAChB,EAAE,GAAG,aAAa,KAAA,EAAO,GAAG,YAAW,GACvC,UAAA;AAEJ,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,MAAA,CAAO,WAAW,CAAA;AACxC,IAAA,EAAA,CAAG,cAAc,IAAI,CAAA;AACrB,IAAA,QAAA,CAAS,EAAE,CAAA;AACX,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,IAAA;AAAA,EACT;AAMA,EAAA,MAAM,YAA0D,EAAC;AACjE,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,CAAM,GAAA;AAC1B,IAAA,MAAM,GAAA,GAAM,MAAM,GAAA,CAAI,GAAA;AACtB,IAAA,EAAA,CAAG,IAAI,YAAA,CAAa,KAAA,EAAO,GAAA,EAAK,CAAC,MAAM,GAAA,KAAQ;AAC7C,MAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAClB,MAAA,MAAM,QAAA,GAAW,QAAA,CAAS,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA;AAC5C,MAAA,MAAM,SAAA,GAAY,QAAA,GACd,EAAE,GAAG,QAAA,CAAS,OAAO,GAAG,UAAA,EAAW,GAClC,UAAA,IAAc,EAAC;AACpB,MAAA,SAAA,CAAU,IAAA,CAAK;AAAA,QACb,IAAA,EAAM,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AAAA,QACzB,IAAI,IAAA,CAAK,GAAA,CAAI,GAAA,GAAM,IAAA,CAAK,UAAU,GAAG,CAAA;AAAA,QACrC,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,IAAA,KAAA,MAAW,MAAM,SAAA,EAAW;AAC1B,MAAA,EAAA,CAAG,OAAA,CAAQ,GAAG,IAAA,EAAM,EAAA,CAAG,IAAI,QAAA,CAAS,MAAA,CAAO,EAAA,CAAG,KAAK,CAAC,CAAA;AAAA,IACtD;AAAA,EACF,CAAA,MAAO;AAEL,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,EAAA,CAAG,OAAA,CAAQ,KAAA,CAAM,KAAA,CAAM,GAAA,EAAK,KAAA,CAAM,IAAI,GAAA,EAAK,QAAA,CAAS,MAAA,CAAO,UAAU,CAAC,CAAA;AAAA,IACxE;AAAA,EACF;AAEA,EAAA,QAAA,CAAS,EAAE,CAAA;AACX,EAAA,OAAO,IAAA;AACT;AAOK,IAAM,SAAA,GACX,CAAC,QAAA,KACD,CAAC,EAAE,KAAA,EAAO,EAAA,EAAI,UAAS,KAAM;AAC3B,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,QAAQ,CAAA;AAE5C,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAO,GAAI,EAAA,CAAG,SAAA;AAG7B,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,EAAA,CAAG,iBAAiB,QAAQ,CAAA;AAC5B,IAAA,QAAA,CAAS,EAAE,CAAA;AACX,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,EAAA,CAAG,WAAW,KAAA,CAAM,KAAA,CAAM,KAAK,KAAA,CAAM,GAAA,CAAI,KAAK,QAAQ,CAAA;AAAA,EACxD;AACA,EAAA,QAAA,CAAS,EAAE,CAAA;AACX,EAAA,OAAO,IAAA;AACT;AAWK,IAAM,aAAA,GACX,MACA,CAAC,EAAE,OAAO,EAAA,EAAI,QAAA,EAAU,QAAO,KAAM;AACnC,EAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAO,GAAI,EAAA,CAAG,SAAA;AAE7B,EAAA,IAAI,OAAO,OAAO,KAAA;AAClB,EAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAItB,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAY;AAClC,EAAA,MAAM,MAAO,MAAA,CAA+E,gBAAA;AAC5F,EAAA,KAAA,MAAW,GAAA,IAAO,IAAI,UAAA,EAAY;AAChC,IAAA,IAAI,GAAA,YAAe,IAAA,IAAQ,CAAC,GAAA,CAAI,YAAA,EAAc;AAC5C,MAAA,SAAA,CAAU,GAAA,CAAI,IAAI,IAAI,CAAA;AAAA,IACxB;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,YAAY,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,KAAK,CAAA,EAAG;AACtD,IAAA,IAAI,CAAC,SAAA,CAAU,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC5B,MAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,QAAA,EAAA,CAAG,UAAA,CAAW,KAAA,CAAM,KAAA,CAAM,GAAA,EAAK,KAAA,CAAM,GAAA,CAAI,GAAA,EAAK,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,QAAQ,CAAC,CAAA;AAAA,MAC5E;AAAA,IACF;AAAA,EACF;AACA,EAAA,EAAA,CAAG,cAAA,CAAe,EAAE,CAAA;AACpB,EAAA,QAAA,CAAS,EAAE,CAAA;AACX,EAAA,OAAO,IAAA;AACT;;;AC9QK,IAAM,uCAAuB,IAAI,GAAA,CAAI,CAAC,UAAA,EAAY,UAAU,CAAC;AAQ7D,SAAS,0BAA0B,IAAA,EAA2B;AACnE,EAAA,KAAA,IAAS,CAAA,GAAI,IAAA,CAAK,KAAA,EAAO,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AACpC,IAAA,IAAI,oBAAA,CAAqB,IAAI,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,EAAG,OAAO,CAAA;AAAA,EAC/D;AACA,EAAA,OAAO,EAAA;AACT;AAGO,SAAS,iBAAiB,IAAA,EAA4B;AAC3D,EAAA,OAAO,yBAAA,CAA0B,IAAI,CAAA,KAAM,EAAA;AAC7C;AAOO,SAAS,kBAAkB,IAAA,EAA4B;AAC5D,EAAA,MAAM,CAAA,GAAI,0BAA0B,IAAI,CAAA;AACxC,EAAA,IAAI,CAAA,KAAM,IAAI,OAAO,KAAA;AACrB,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,KAAM,CAAA;AAC3B;;;ACbA,IAAM,kCAAkB,IAAI,GAAA,CAAI,CAAC,UAAA,EAAY,UAAU,CAAC,CAAA;AAajD,SAAS,mBAAA,CACd,OACA,EAAA,EACS;AACT,EAAA,IAAI,CAAC,EAAA,CAAG,SAAA,CAAU,KAAA,EAAO,OAAO,KAAA;AAChC,EAAA,IAAI,EAAA,CAAG,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,KAAA;AAElC,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,EAAA,CAAG,SAAA;AACrB,EAAA,MAAM,aAAA,GAAgB,0BAA0B,KAAK,CAAA;AACrD,EAAA,IAAI,aAAA,KAAkB,IAAI,OAAO,KAAA;AACjC,EAAA,IAAI,KAAA,CAAM,KAAA,CAAM,aAAa,CAAA,KAAM,GAAG,OAAO,KAAA;AAK7C,EAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,IAAA,CAAK,aAAA,GAAgB,CAAC,CAAA;AAClD,EAAA,MAAM,QAAA,GAAW,eAAA,CAAgB,GAAA,CAAI,aAAA,CAAc,KAAK,IAAI,CAAA;AAE5D,EAAA,IAAI,QAAA,EAAU;AAGZ,IAAA,MAAM,KAAA,GAAQ,MAAM,UAAA,EAAW;AAC/B,IAAA,IAAI,CAAC,OAAO,OAAO,KAAA;AACnB,IAAA,MAAM,MAAA,GAASC,qBAAW,KAAK,CAAA;AAC/B,IAAA,IAAI,MAAA,KAAW,MAAM,OAAO,KAAA;AAC5B,IAAA,EAAA,CAAG,IAAA,CAAK,OAAO,MAAM,CAAA;AACrB,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,MAAM,YAAA,GAAe,KAAA,CAAM,IAAA,CAAK,aAAa,CAAA,CAAE,IAAA;AAC/C,EAAA,OAAOC,uBAAA,CAAa,YAAY,CAAA,CAAE,KAAA,EAAO,CAAC,MAAA,KAAW;AACnD,IAAA,KAAA,MAAW,IAAA,IAAQ,MAAA,CAAO,KAAA,EAAO,EAAA,CAAG,KAAK,IAAI,CAAA;AAC7C,IAAA,IAAI,MAAA,CAAO,YAAA,EAAc,EAAA,CAAG,YAAA,CAAa,OAAO,SAAS,CAAA;AAAA,EAC3D,CAAC,CAAA;AACH;;;ACvDO,IAAM,YAAA,GACX,CAAC,QAAA,EAAkB,UAAA,KACnB,CAAC,EAAE,KAAA,EAAO,EAAA,EAAI,QAAA,EAAS,KAAM;AAC3B,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,QAAQ,CAAA;AAE5C,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,MAAM,WAAW,EAAA,CAAG,SAAA,CAAU,MAAA,CAAO,IAAA,CAAK,CAAC,KAAA,KAAU;AACnD,IAAA,IAAI,KAAA,GAAQ,KAAA;AACZ,IAAA,EAAA,CAAG,GAAA,CAAI,YAAA,CAAa,KAAA,CAAM,KAAA,CAAM,GAAA,EAAK,MAAM,GAAA,CAAI,GAAA,EAAK,CAAC,IAAA,EAAM,GAAA,KAAQ;AACjE,MAAA,IAAI,OAAO,OAAO,KAAA;AAClB,MAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACvB,MAAA,MAAM,WAAA,GAAc,EAAE,GAAG,IAAA,CAAK,OAAO,GAAI,UAAA,IAAc,EAAC,EAAG;AAC3D,MAAA,IAAI,IAAA,CAAK,SAAA,CAAU,QAAA,EAAU,WAAW,CAAA,EAAG;AAC3C,MAAA,IAAI,IAAA,CAAK,SAAS,QAAA,EAAU;AAC1B,QAAA,KAAA,GAAQ,IAAA;AAAA,MACV,CAAA,MAAO;AACL,QAAA,MAAM,IAAA,GAAO,EAAA,CAAG,GAAA,CAAI,OAAA,CAAQ,GAAG,CAAA;AAC/B,QAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,EAAM;AACzB,QAAA,KAAA,GAAQ,KAAK,MAAA,CAAO,cAAA,CAAe,KAAA,EAAO,KAAA,GAAQ,GAAG,QAAQ,CAAA;AAAA,MAC/D;AACA,MAAA;AAAA,IACF,CAAC,CAAA;AACD,IAAA,OAAO,KAAA;AAAA,EACT,CAAC,CAAA;AAED,EAAA,IAAI,CAAC,QAAA,EAAU;AAOb,IAAA,MAAM,MAAA,GAAS,mBAAA,CAAoB,KAAA,EAAO,EAAE,CAAA;AAC5C,IAAA,IAAI,CAAC,QAAQ,OAAO,KAAA;AAQpB,IAAA,MAAM,UAAU,EAAA,CAAG,GAAA,CAAI,OAAA,CAAQ,EAAA,CAAG,UAAU,IAAI,CAAA;AAChD,IAAA,IAAI,OAAA,CAAQ,KAAA,GAAQ,CAAA,EAAG,OAAO,KAAA;AAC9B,IAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAClD,IAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAClD,IAAA,IAAI,CAAC,WAAA,CAAY,cAAA,CAAe,YAAY,UAAA,GAAa,CAAA,EAAG,QAAQ,CAAA,EAAG;AACrE,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAEtB,IAAA,EAAA,CAAG,YAAA;AAAA,MACD,GAAG,SAAA,CAAU,IAAA;AAAA,MACb,GAAG,SAAA,CAAU,EAAA;AAAA,MACb,QAAA;AAAA,MACA,CAAC,UAAU,EAAE,GAAG,KAAK,KAAA,EAAO,GAAI,UAAA,IAAc,EAAC,EAAG;AAAA,KACpD;AACA,IAAA,QAAA,CAAS,EAAA,CAAG,gBAAgB,CAAA;AAC5B,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAGtB,EAAA,KAAA,MAAW,KAAA,IAAS,EAAA,CAAG,SAAA,CAAU,MAAA,EAAQ;AACvC,IAAA,MAAM,IAAA,GAAO,MAAM,KAAA,CAAM,GAAA;AACzB,IAAA,MAAM,EAAA,GAAK,MAAM,GAAA,CAAI,GAAA;AACrB,IAAA,EAAA,CAAG,YAAA,CAAa,IAAA,EAAM,EAAA,EAAI,QAAA,EAAU,CAAC,IAAA,MAAU,EAAE,GAAG,IAAA,CAAK,KAAA,EAAO,GAAI,UAAA,IAAc,IAAI,CAAE,CAAA;AAAA,EAC1F;AAEA,EAAA,QAAA,CAAS,EAAA,CAAG,gBAAgB,CAAA;AAC5B,EAAA,OAAO,IAAA;AACT;AAaK,IAAM,kBACX,CAAC,QAAA,EAAkB,eAAA,EAAyB,UAAA,KAC5C,CAAC,KAAA,KAAU;AACT,EAAA,MAAM,EAAE,KAAA,EAAO,EAAA,EAAG,GAAI,KAAA;AACtB,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,QAAQ,CAAA;AAC5C,EAAA,MAAM,eAAA,GAAkB,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,eAAe,CAAA;AAE1D,EAAA,IAAI,CAAC,QAAA,IAAY,CAAC,eAAA,EAAiB;AACjC,IAAA,OAAO,KAAA;AAAA,EACT;AAKA,EAAA,MAAM,EAAE,IAAA,EAAM,EAAA,EAAG,GAAI,EAAA,CAAG,SAAA;AACxB,EAAA,MAAM,gBAAoC,EAAC;AAC3C,EAAA,EAAA,CAAG,GAAA,CAAI,YAAA,CAAa,IAAA,EAAM,EAAA,EAAI,CAAC,IAAA,KAAS;AACtC,IAAA,IAAI,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC7C,MAAA,aAAA,CAAc,IAAA,CAAK,EAAE,IAAA,EAAM,CAAA;AAAA,IAC7B;AAAA,EACF,CAAC,CAAA;AAED,EAAA,MAAM,QAAA,GAAW,cAAc,MAAA,GAAS,CAAA,IAAK,cAAc,KAAA,CAAM,CAAC,EAAE,IAAA,EAAK,KAAM;AAC7E,IAAA,MAAM,WAAA,GAAc,KAAK,IAAA,KAAS,QAAA;AAClC,IAAA,MAAM,aAAa,CAAC,UAAA,IAAc,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA,CAAE,KAAA;AAAA,MACxD,CAAC,GAAA,KAAQ,IAAA,CAAK,MAAM,GAAG,CAAA,KAAM,WAAW,GAAG;AAAA,KAC7C;AACA,IAAA,OAAO,WAAA,IAAe,UAAA;AAAA,EACxB,CAAC,CAAA;AAED,EAAA,IAAI,QAAA,EAAU;AAEZ,IAAA,OAAO,YAAA,CAAa,eAAe,CAAA,CAAE,KAAK,CAAA;AAAA,EAC5C;AAGA,EAAA,OAAO,YAAA,CAAa,QAAA,EAAU,UAAU,CAAA,CAAE,KAAK,CAAA;AACjD;AAUK,IAAM,MAAA,GACX,CAAC,QAAA,EAAkB,UAAA,KACnB,CAAC,EAAE,KAAA,EAAO,EAAA,EAAI,QAAA,EAAS,KAAM;AAC3B,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,QAAQ,CAAA;AAE5C,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,EAAE,KAAA,EAAO,GAAA,EAAI,GAAI,EAAA,CAAG,SAAA;AAC1B,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,UAAA,CAAW,GAAG,CAAA;AAClC,EAAA,IAAI,CAAC,OAAO,OAAO,KAAA;AAEnB,EAAA,MAAM,QAAA,GAAWV,sBAAAA,CAAa,KAAA,EAAO,QAAA,EAAU,UAAU,CAAA;AACzD,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AACtB,IAAA,EAAA,CAAG,IAAA,CAAK,KAAA,EAAO,QAAQ,CAAA,CAAE,cAAA,EAAe;AACxC,IAAA,QAAA,CAAS,EAAE,CAAA;AACX,IAAA,OAAO,IAAA;AAAA,EACT;AASA,EAAA,MAAM,MAAA,GAAS,mBAAA,CAAoB,KAAA,EAAO,EAAE,CAAA;AAC5C,EAAA,IAAI,CAAC,QAAQ,OAAO,KAAA;AAEpB,EAAA,MAAM,UAAU,EAAA,CAAG,GAAA,CAAI,OAAA,CAAQ,EAAA,CAAG,UAAU,IAAI,CAAA;AAChD,EAAA,MAAM,QAAQ,EAAA,CAAG,GAAA,CAAI,OAAA,CAAQ,EAAA,CAAG,UAAU,EAAE,CAAA;AAC5C,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,UAAA,CAAW,KAAK,CAAA;AACxC,EAAA,IAAI,CAAC,SAAS,OAAO,KAAA;AACrB,EAAA,MAAM,UAAA,GAAaA,sBAAAA,CAAa,OAAA,EAAS,QAAA,EAAU,UAAU,CAAA;AAC7D,EAAA,IAAI,CAAC,YAAY,OAAO,KAAA;AACxB,EAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAEtB,EAAA,EAAA,CAAG,IAAA,CAAK,OAAA,EAAS,UAAU,CAAA,CAAE,cAAA,EAAe;AAC5C,EAAA,QAAA,CAAS,EAAE,CAAA;AACX,EAAA,OAAO,IAAA;AACT;AAYK,IAAM,UAAA,GACX,CAAC,QAAA,EAAkB,UAAA,KACnB,CAAC,KAAA,KAAU;AACT,EAAA,MAAM,EAAE,KAAA,EAAO,EAAA,EAAI,QAAA,EAAS,GAAI,KAAA;AAChC,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,QAAQ,CAAA;AAE5C,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,EAAA,CAAG,SAAA;AAEtB,EAAA,MAAM,YAAA,GAAe,CAAC,GAAA,KAAyB;AAC7C,IAAA,MAAM,IAAA,GAAO,EAAA,CAAG,GAAA,CAAI,OAAA,CAAQ,GAAG,CAAA;AAC/B,IAAA,KAAA,IAAS,CAAA,GAAI,IAAA,CAAK,KAAA,EAAO,CAAA,GAAI,GAAG,CAAA,EAAA,EAAK;AACnC,MAAA,IAAI,KAAK,IAAA,CAAK,CAAC,CAAA,CAAE,IAAA,KAAS,UAAU,OAAO,IAAA;AAAA,IAC7C;AACA,IAAA,OAAO,KAAA;AAAA,EACT,CAAA;AAGA,EAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,IAAA,MAAMW,WAAAA,GAAa,OAAO,KAAA,CAAM,CAAA,KAAA,KAAS,aAAa,KAAA,CAAM,KAAA,CAAM,GAAG,CAAC,CAAA;AACtE,IAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAItB,IAAA,MAAM,aAAA,GAAgB,OACnB,GAAA,CAAI,CAAC,OAAO,EAAE,IAAA,EAAM,CAAA,CAAE,KAAA,CAAM,GAAA,EAAK,EAAA,EAAI,EAAE,GAAA,CAAI,GAAA,EAAI,CAAE,CAAA,CACjD,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,CAAA,CAAE,IAAA,GAAO,CAAA,CAAE,IAAI,CAAA;AAEjC,IAAA,KAAA,MAAW,QAAQ,aAAA,EAAe;AAChC,MAAA,MAAMC,KAAAA,GAAO,EAAA,CAAG,OAAA,CAAQ,GAAA,CAAI,KAAK,IAAI,CAAA;AACrC,MAAA,MAAMC,GAAAA,GAAK,EAAA,CAAG,OAAA,CAAQ,GAAA,CAAI,KAAK,EAAE,CAAA;AACjC,MAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,GAAA,CAAI,OAAA,CAAQD,KAAI,CAAA;AACjC,MAAA,MAAM,GAAA,GAAM,EAAA,CAAG,GAAA,CAAI,OAAA,CAAQC,GAAE,CAAA;AAC7B,MAAA,MAAM,UAAA,GAAa,KAAA,CAAM,UAAA,CAAW,GAAG,CAAA;AACvC,MAAA,IAAI,CAAC,UAAA,EAAY;AAEjB,MAAA,IAAIF,WAAAA,EAAY;AACd,QAAA,MAAM,MAAA,GAASF,qBAAW,UAAU,CAAA;AACpC,QAAA,IAAI,MAAA,KAAW,IAAA,EAAM,EAAA,CAAG,IAAA,CAAK,YAAY,MAAM,CAAA;AAAA,MACjD,CAAA,MAAO;AACL,QAAA,MAAM,QAAA,GAAWT,sBAAAA,CAAa,UAAA,EAAY,QAAA,EAAU,UAAU,CAAA;AAC9D,QAAA,IAAI,QAAA,EAAU,EAAA,CAAG,IAAA,CAAK,UAAA,EAAY,QAAQ,CAAA;AAAA,MAC5C;AAAA,IACF;AAEA,IAAA,QAAA,CAAS,EAAA,CAAG,gBAAgB,CAAA;AAC5B,IAAA,OAAO,IAAA;AAAA,EACT;AAMA,EAAA,MAAM,EAAE,IAAA,EAAM,EAAA,EAAG,GAAI,EAAA,CAAG,SAAA;AACxB,EAAA,MAAM,gBAAmC,EAAC;AAC1C,EAAA,EAAA,CAAG,IAAI,YAAA,CAAa,IAAA,EAAM,EAAA,EAAI,CAAC,MAAM,GAAA,KAAQ;AAC3C,IAAA,IAAI,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC7C,MAAA,aAAA,CAAc,IAAA,CAAK,EAAE,GAAA,EAAK,CAAA;AAAA,IAC5B;AAAA,EACF,CAAC,CAAA;AAED,EAAA,MAAM,UAAA,GAAa,aAAA,CAAc,MAAA,GAAS,CAAA,GACtC,cAAc,KAAA,CAAM,CAAC,EAAE,GAAA,OAAU,YAAA,CAAa,GAAG,CAAC,CAAA,GAClD,aAAa,IAAI,CAAA;AAErB,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,MAAM,KAAA,GAAQ,cAAc,CAAC,CAAA;AAC7B,IAAA,MAAM,IAAA,GAAO,aAAA,CAAc,aAAA,CAAc,MAAA,GAAS,CAAC,CAAA;AACnD,IAAA,IAAI,SAAS,IAAA,EAAM;AACjB,MAAA,MAAM,YAAY,EAAA,CAAG,GAAA,CAAI,OAAA,CAAQ,KAAA,CAAM,MAAM,CAAC,CAAA;AAC9C,MAAA,MAAM,UAAU,EAAA,CAAG,GAAA,CAAI,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAC,CAAA;AAC3C,MAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,UAAA,CAAW,OAAO,CAAA;AAC1C,MAAA,IAAI,CAAC,OAAO,OAAO,KAAA;AACnB,MAAA,MAAM,MAAA,GAASS,qBAAW,KAAK,CAAA;AAC/B,MAAA,IAAI,MAAA,KAAW,MAAM,OAAO,KAAA;AAC5B,MAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AACtB,MAAA,EAAA,CAAG,IAAA,CAAK,KAAA,EAAO,MAAM,CAAA,CAAE,cAAA,EAAe;AACtC,MAAA,QAAA,CAAS,EAAE,CAAA;AACX,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAO,IAAA,GAAO,KAAK,CAAA;AAAA,EACrB;AAEA,EAAA,OAAO,MAAA,CAAO,QAAA,EAAU,UAAU,CAAA,CAAE,KAAK,CAAA;AAC3C;AAQK,IAAM,OACX,MACA,CAAC,EAAE,EAAA,EAAI,UAAS,KAAM;AACpB,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,EAAA,CAAG,SAAA;AAGtB,EAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,IAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAEtB,IAAA,MAAM,aAAA,GAAgB,OACnB,GAAA,CAAI,CAAC,OAAO,EAAE,IAAA,EAAM,CAAA,CAAE,KAAA,CAAM,GAAA,EAAK,EAAA,EAAI,EAAE,GAAA,CAAI,GAAA,EAAI,CAAE,CAAA,CACjD,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,CAAA,CAAE,IAAA,GAAO,CAAA,CAAE,IAAI,CAAA;AAEjC,IAAA,KAAA,MAAW,QAAQ,aAAA,EAAe;AAChC,MAAA,MAAM,IAAA,GAAO,EAAA,CAAG,OAAA,CAAQ,GAAA,CAAI,KAAK,IAAI,CAAA;AACrC,MAAA,MAAM,EAAA,GAAK,EAAA,CAAG,OAAA,CAAQ,GAAA,CAAI,KAAK,EAAE,CAAA;AACjC,MAAA,MAAMK,MAAAA,GAAQ,EAAA,CAAG,GAAA,CAAI,OAAA,CAAQ,IAAI,CAAA;AACjC,MAAA,MAAMC,IAAAA,GAAM,EAAA,CAAG,GAAA,CAAI,OAAA,CAAQ,EAAE,CAAA;AAC7B,MAAA,MAAMC,MAAAA,GAAQF,MAAAA,CAAM,UAAA,CAAWC,IAAG,CAAA;AAClC,MAAA,IAAI,CAACC,MAAAA,EAAO;AACZ,MAAA,MAAMC,OAAAA,GAASR,qBAAWO,MAAK,CAAA;AAC/B,MAAA,IAAIC,OAAAA,KAAW,IAAA,EAAM,EAAA,CAAG,IAAA,CAAKD,QAAOC,OAAM,CAAA;AAAA,IAC5C;AACA,IAAA,QAAA,CAAS,EAAA,CAAG,gBAAgB,CAAA;AAC5B,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,EAAE,KAAA,EAAO,GAAA,EAAI,GAAI,EAAA,CAAG,SAAA;AAC1B,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,UAAA,CAAW,GAAG,CAAA;AAClC,EAAA,IAAI,CAAC,OAAO,OAAO,KAAA;AAEnB,EAAA,MAAM,MAAA,GAASR,qBAAW,KAAK,CAAA;AAC/B,EAAA,IAAI,MAAA,KAAW,MAAM,OAAO,KAAA;AAC5B,EAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAEtB,EAAA,EAAA,CAAG,IAAA,CAAK,KAAA,EAAO,MAAM,CAAA,CAAE,cAAA,EAAe;AACtC,EAAA,QAAA,CAAS,EAAE,CAAA;AACX,EAAA,OAAO,IAAA;AACT;;;ACjVF,IAAMS,mCAAkB,IAAI,GAAA,CAAI,CAAC,UAAA,EAAY,UAAU,CAAC,CAAA;AAiCjD,SAAS,yBACd,KAAA,EAC8B;AAC9B,EAAA,IAAI,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,IAAA,KAAS,aAAa,OAAO,IAAA;AAEnD,EAAA,MAAM,SAAA,GAAY,MAAM,KAAA,GAAQ,CAAA;AAChC,EAAA,IAAI,SAAA,GAAY,GAAG,OAAO,IAAA;AAC1B,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,IAAA,CAAK,SAAS,CAAA;AACrC,EAAA,IAAI,CAACA,gBAAAA,CAAgB,GAAA,CAAI,SAAS,IAAA,CAAK,IAAI,GAAG,OAAO,IAAA;AAErD,EAAA,MAAM,eAAe,SAAA,GAAY,CAAA;AACjC,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,KAAA,CAAM,SAAS,CAAA;AAExC,EAAA,OAAO;AAAA,IACL,SAAA;AAAA,IACA,OAAA,EAAS,KAAA,CAAM,MAAA,CAAO,SAAS,CAAA;AAAA,IAC/B,UAAA,EAAY,KAAA,CAAM,MAAA,CAAO,YAAY,CAAA;AAAA,IACrC,kBAAkB,UAAA,GAAa,CAAA;AAAA,IAC/B,gBAAA,EAAkB,KAAA,CAAM,MAAA,CAAO,OAAA,CAAQ,IAAA,KAAS,CAAA;AAAA,IAChD,WAAA,EAAa,UAAA,KAAe,QAAA,CAAS,UAAA,GAAa,CAAA;AAAA,IAClD,UAAA;AAAA,IACA,kBAAA,EAAoB,KAAA,CAAM,KAAA,CAAM,YAAY;AAAA,GAC9C;AACF;;;AC3CA,SAAS,iBAAA,CAAkB,IAAiB,QAAA,EAA0B;AACpE,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,EAAA,CAAG,SAAA;AACrB,EAAA,KAAA,IAAS,CAAA,GAAI,KAAA,CAAM,KAAA,EAAO,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AACrC,IAAA,IAAI,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,CAAE,SAAS,QAAA,EAAU;AACnC,MAAA,MAAM,OAAA,GAAU,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA;AAC9B,MAAA,IAAI,UAAU,CAAA,IAAKjB,iBAAAA,CAAQ,EAAA,CAAG,GAAA,EAAK,OAAO,CAAA,EAAG;AAC3C,QAAA,MAAM,aAAa,EAAA,CAAG,GAAA,CAAI,OAAA,CAAQ,OAAA,GAAU,CAAC,CAAA,CAAE,MAAA;AAC/C,QAAA,IAAI,UAAA,CAAW,SAAS,QAAA,EAAU;AAChC,UAAA,EAAA,CAAG,KAAK,OAAO,CAAA;AAAA,QACjB;AAAA,MACF;AACA,MAAA;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,gBAAA,CAAiB,IAAiB,QAAA,EAA0B;AACnE,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,EAAA,CAAG,SAAA;AACrB,EAAA,KAAA,IAAS,CAAA,GAAI,KAAA,CAAM,KAAA,EAAO,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AACrC,IAAA,IAAI,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,CAAE,SAAS,QAAA,EAAU;AACnC,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA;AAC3B,MAAA,IAAI,KAAA,GAAQ,GAAG,GAAA,CAAI,OAAA,CAAQ,QAAQA,iBAAAA,CAAQ,EAAA,CAAG,GAAA,EAAK,KAAK,CAAA,EAAG;AACzD,QAAA,MAAM,SAAA,GAAY,EAAA,CAAG,GAAA,CAAI,MAAA,CAAO,KAAK,CAAA;AACrC,QAAA,IAAI,SAAA,EAAW,SAAS,QAAA,EAAU;AAChC,UAAA,EAAA,CAAG,KAAK,KAAK,CAAA;AAAA,QACf;AAAA,MACF;AACA,MAAA;AAAA,IACF;AAAA,EACF;AACF;AAaO,IAAM,UAAA,GACX,CAAC,YAAA,EAAsB,gBAAA,EAA0B,UAAA,KACjD,CAAC,SAAEZ,OAAA,EAAO,EAAA,EAAI,QAAA,EAAS,KAAM;AAC3B,EAAA,MAAM,QAAA,GAAWA,OAAA,CAAM,MAAA,CAAO,KAAA,CAAM,YAAY,CAAA;AAChD,EAAA,MAAM,YAAA,GAAeA,OAAA,CAAM,MAAA,CAAO,KAAA,CAAM,gBAAgB,CAAA;AAExD,EAAA,IAAI,CAAC,QAAA,IAAY,CAAC,YAAA,EAAc;AAC9B,IAAA,OAAO,KAAA;AAAA,EACT;AAOA,EAAA,MAAM,kBAAA,GAAqB,CAAC,GAAA,EAAa,KAAA,EAAe,GAAA,KAAgC;AACtF,IAAA,MAAM,SAAyB,EAAC;AAChC,IAAA,GAAA,CAAI,YAAA,CAAa,KAAA,EAAO,GAAA,EAAK,CAAC,MAAM,GAAA,KAAQ;AAC1C,MAAA,IAAI,CAAC,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAA,EAAG;AAClD,MAAA,IAAI,YAAA,GAAe,KAAA;AACnB,MAAA,IAAI,UAAA,GAAa,KAAA;AACjB,MAAA,IAAI,YAAA,GAA8B,IAAA;AAClC,MAAA,MAAM,IAAA,GAAO,GAAA,CAAI,OAAA,CAAQ,GAAG,CAAA;AAC5B,MAAA,KAAA,IAAS,CAAA,GAAI,IAAA,CAAK,KAAA,EAAO,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AACpC,QAAA,MAAM,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA;AACrB,QAAA,IAAI,CAAA,CAAE,SAAS,QAAA,EAAU;AACvB,UAAA,YAAA,GAAe,IAAA;AACf,UAAA,UAAA,GAAa,IAAA;AACb,UAAA;AAAA,QACF;AACA,QAAA,MAAM,UAAU,CAAA,CAAE,IAAA,CAAK,KAAK,KAAA,IAAS,EAAA,EAAI,MAAM,KAAK,CAAA;AACpD,QAAA,IAAI,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,EAAG;AAC3B,UAAA,UAAA,GAAa,IAAA;AACb,UAAA,YAAA,GAAe,IAAA,CAAK,OAAO,CAAC,CAAA;AAC5B,UAAA;AAAA,QACF;AAAA,MACF;AACA,MAAA,MAAA,CAAO,KAAK,EAAE,GAAA,EAAK,YAAA,EAAc,UAAA,EAAY,cAAc,CAAA;AAAA,IAC7D,CAAC,CAAA;AAKD,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,MAAA,MAAM,IAAA,GAAO,GAAA,CAAI,OAAA,CAAQ,KAAK,CAAA;AAC9B,MAAA,MAAM,OAAA,GAAU,KAAK,MAAA,CAAO,aAAA,GAAgB,KAAK,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,GAAI,KAAA;AACtE,MAAA,IAAI,YAAA,GAAe,KAAA;AACnB,MAAA,IAAI,UAAA,GAAa,KAAA;AACjB,MAAA,IAAI,YAAA,GAA8B,IAAA;AAClC,MAAA,KAAA,IAAS,CAAA,GAAI,IAAA,CAAK,KAAA,EAAO,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AACpC,QAAA,MAAM,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA;AACrB,QAAA,IAAI,CAAA,CAAE,SAAS,QAAA,EAAU;AAAE,UAAA,YAAA,GAAe,IAAA;AAAM,UAAA,UAAA,GAAa,IAAA;AAAM,UAAA;AAAA,QAAO;AAC1E,QAAA,MAAM,UAAU,CAAA,CAAE,IAAA,CAAK,KAAK,KAAA,IAAS,EAAA,EAAI,MAAM,KAAK,CAAA;AACpD,QAAA,IAAI,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,EAAG;AAAE,UAAA,UAAA,GAAa,IAAA;AAAM,UAAA,YAAA,GAAe,IAAA,CAAK,OAAO,CAAC,CAAA;AAAG,UAAA;AAAA,QAAO;AAAA,MAC1F;AACA,MAAA,MAAA,CAAO,KAAK,EAAE,GAAA,EAAK,SAAS,YAAA,EAAc,UAAA,EAAY,cAAc,CAAA;AAAA,IACtE;AAEA,IAAA,OAAO,MAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,EAAA,CAAG,SAAA;AAGtB,EAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AAGrB,IAAA,MAAM,aAAA,GAAgB,OACnB,GAAA,CAAI,CAAC,OAAO,EAAE,IAAA,EAAM,CAAA,CAAE,KAAA,CAAM,GAAA,EAAK,EAAA,EAAI,EAAE,GAAA,CAAI,GAAA,EAAI,CAAE,CAAA,CACjD,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,CAAA,CAAE,IAAA,GAAO,CAAA,CAAE,IAAI,CAAA;AAGjC,IAAA,MAAM,YAA4B,EAAC;AACnC,IAAA,KAAA,MAAW,QAAQ,aAAA,EAAe;AAChC,MAAA,SAAA,CAAU,IAAA,CAAK,GAAG,kBAAA,CAAmB,EAAA,CAAG,KAAK,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,IAClE;AACA,IAAA,MAAM8B,gBAAAA,GAAkB,UAAU,MAAA,GAAS,CAAA,IAAK,UAAU,KAAA,CAAM,CAAC,CAAA,KAAM,CAAA,CAAE,YAAY,CAAA;AACrF,IAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAEtB,IAAA,IAAIA,gBAAAA,EAAiB;AAEnB,MAAA,KAAA,MAAW,QAAQ,aAAA,EAAe;AAChC,QAAA,MAAMP,KAAAA,GAAO,EAAA,CAAG,OAAA,CAAQ,GAAA,CAAI,KAAK,IAAI,CAAA;AACrC,QAAA,MAAMC,GAAAA,GAAK,EAAA,CAAG,OAAA,CAAQ,GAAA,CAAI,KAAK,EAAE,CAAA;AACjC,QAAA,MAAM,UAAA,GAAa,kBAAA,CAAmB,EAAA,CAAG,GAAA,EAAKD,OAAMC,GAAE,CAAA;AACtD,QAAA,MAAM,KAAA,GAAQ,WAAW,CAAC,CAAA;AAC1B,QAAA,MAAM,IAAA,GAAO,UAAA,CAAW,UAAA,CAAW,MAAA,GAAS,CAAC,CAAA;AAC7C,QAAA,IAAI,CAAC,KAAA,IAAS,CAAC,IAAA,EAAM;AACrB,QAAA,MAAM,SAAA,GAAYvB,mBAAAA,CAAc,MAAA,CAAO,EAAA,CAAG,GAAA,EAAK,MAAM,GAAA,GAAM,CAAA,EAAG,IAAA,CAAK,GAAA,GAAM,CAAC,CAAA;AAC1E,QAAA,MAAM,WAAA,GAAc8B,kBAAY,MAAA,CAAO,EAAE,KAAK,EAAA,CAAG,GAAA,EAAK,SAAA,EAAW,SAAA,EAAW,CAAA;AAC5E,QAAAV,uBAAAA,CAAa,YAAY,CAAA,CAAE,WAAA,EAAa,CAAC,MAAA,KAAW;AAClD,UAAA,KAAA,MAAW,IAAA,IAAQ,OAAO,KAAA,EAAO;AAC/B,YAAA,EAAA,CAAG,KAAK,IAAI,CAAA;AAAA,UACd;AAAA,QACF,CAAC,CAAA;AAAA,MACH;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,KAAA,MAAW,QAAQ,aAAA,EAAe;AAChC,QAAA,MAAME,KAAAA,GAAO,EAAA,CAAG,OAAA,CAAQ,GAAA,CAAI,KAAK,IAAI,CAAA;AACrC,QAAA,MAAMC,GAAAA,GAAK,EAAA,CAAG,OAAA,CAAQ,GAAA,CAAI,KAAK,EAAE,CAAA;AACjC,QAAA,MAAM,UAAA,GAAa,kBAAA,CAAmB,EAAA,CAAG,GAAA,EAAKD,OAAMC,GAAE,CAAA;AACtD,QAAA,MAAM,YAAA,GAAe,WAAW,MAAA,GAAS,CAAA,IAAK,WAAW,KAAA,CAAM,CAAC,CAAA,KAAM,CAAA,CAAE,YAAY,CAAA;AACpF,QAAA,MAAM,cAAA,GAAiB,WAAW,MAAA,GAAS,CAAA,IAAK,WAAW,KAAA,CAAM,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,CAAA;AAEpF,QAAA,IAAI,YAAA,EAAc;AAChB,UAAA;AAAA,QACF,WAAW,cAAA,EAAgB;AAEzB,UAAA,MAAM,QAAA,GAAW,WAAW,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,YAAA,KAAiB,IAAI,CAAA,EAAG,YAAA;AAClE,UAAA,IAAI,QAAA,KAAa,IAAA,IAAQ,QAAA,KAAa,MAAA,EAAW;AACjD,UAAA,MAAM,QAAA,GAAW,EAAA,CAAG,GAAA,CAAI,MAAA,CAAO,QAAQ,CAAA;AACvC,UAAA,IAAI,CAAC,QAAA,EAAU;AACf,UAAA,MAAM,aAAa,QAAA,CAAS,UAAA;AAC5B,UAAA,IAAI,UAAA,IAAc,UAAA,CAAW,IAAA,KAAS,YAAA,EAAc;AAElD,YAAA,MAAM,WAAqB,EAAC;AAC5B,YAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,KAAA,KAAU;AAC1B,cAAA,QAAA,CAAS,IAAA,CAAK,aAAa,MAAA,CAAO,KAAA,CAAM,OAAO,KAAA,CAAM,OAAA,EAAS,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,YAC5E,CAAC,CAAA;AACD,YAAA,EAAA,CAAG,WAAA,CAAY,UAAU,QAAA,GAAW,QAAA,CAAS,UAAU,QAAA,CAAS,MAAA,CAAO,UAAA,EAAY,QAAQ,CAAC,CAAA;AAAA,UAC9F,CAAA,MAAO;AACL,YAAA,EAAA,CAAG,aAAA,CAAc,QAAA,EAAU,QAAA,EAAU,UAAU,CAAA;AAAA,UACjD;AAAA,QACF,CAAA,MAAO;AAEL,UAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,GAAA,CAAI,OAAA,CAAQD,KAAI,CAAA;AACjC,UAAA,MAAM,GAAA,GAAM,EAAA,CAAG,GAAA,CAAI,OAAA,CAAQC,GAAE,CAAA;AAC7B,UAAA,MAAM,UAAA,GAAa,KAAA,CAAM,UAAA,CAAW,GAAG,CAAA;AACvC,UAAA,IAAI,CAAC,UAAA,EAAY;AACjB,UAAAQ,0BAAA,CAAgB,EAAA,EAAI,UAAA,EAAY,QAAA,EAAU,UAAU,CAAA;AAAA,QACtD;AAAA,MACF;AAAA,IACF;AAEA,IAAA,QAAA,CAAS,EAAA,CAAG,gBAAgB,CAAA;AAC5B,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,MAAM,EAAE,IAAA,EAAM,EAAA,EAAG,GAAI,EAAA,CAAG,SAAA;AAmBxB,EAAA,IAAI,SAAS,EAAA,EAAI;AACf,IAAA,MAAM,GAAA,GAAM,wBAAA,CAAyB,EAAA,CAAG,SAAA,CAAU,KAAK,CAAA;AACvD,IAAA,IAAI,KAAK,gBAAA,EAAkB;AACzB,MAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AACtB,MAAA,MAAM,UAAA,GAAa,EAAA,CAAG,SAAA,CAAU,KAAA,CAAM,UAAA,EAAW;AACjD,MAAA,IAAI,cAAcA,0BAAA,CAAgB,EAAA,EAAI,UAAA,EAAY,QAAA,EAAU,UAAU,CAAA,EAAG;AACvE,QAAA,iBAAA,CAAkB,IAAI,QAAQ,CAAA;AAC9B,QAAA,gBAAA,CAAiB,IAAI,QAAQ,CAAA;AAC7B,QAAA,QAAA,CAAS,EAAA,CAAG,gBAAgB,CAAA;AAC5B,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IAIF;AAAA,EACF;AAEA,EAAA,MAAM,aAAA,GAAgB,kBAAA,CAAmB,EAAA,CAAG,GAAA,EAAK,MAAM,EAAE,CAAA;AAEzD,EAAA,MAAM,eAAA,GAAkB,cAAc,MAAA,GAAS,CAAA,IAAK,cAAc,KAAA,CAAM,CAAC,CAAA,KAAM,CAAA,CAAE,YAAY,CAAA;AAC7F,EAAA,MAAM,aAAA,GAAgB,cAAc,MAAA,GAAS,CAAA,IAAK,cAAc,KAAA,CAAM,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,CAAA;AAGzF,EAAA,IAAI,eAAA,EAAiB;AACnB,IAAA,MAAM,KAAA,GAAQ,cAAc,CAAC,CAAA;AAC7B,IAAA,MAAM,IAAA,GAAO,aAAA,CAAc,aAAA,CAAc,MAAA,GAAS,CAAC,CAAA;AACnD,IAAA,IAAI,CAAC,KAAA,IAAS,CAAC,IAAA,EAAM,OAAO,KAAA;AAC5B,IAAA,MAAM,SAAA,GAAY/B,mBAAAA,CAAc,MAAA,CAAO,EAAA,CAAG,GAAA,EAAK,MAAM,GAAA,GAAM,CAAA,EAAG,IAAA,CAAK,GAAA,GAAM,CAAC,CAAA;AAC1E,IAAA,MAAM,WAAA,GAAc8B,kBAAY,MAAA,CAAO;AAAA,MACrC,KAAK,EAAA,CAAG,GAAA;AAAA,MACR,SAAA,EAAW;AAAA,KACZ,CAAA;AACD,IAAA,OAAOV,uBAAAA,CAAa,YAAY,CAAA,CAAE,WAAA,EAAa,QAAQ,CAAA;AAAA,EACzD;AAGA,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,MAAM,QAAA,GAAW,cAAc,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,YAAA,KAAiB,IAAI,CAAA,EAAG,YAAA;AACrE,IAAA,IAAI,QAAA,KAAa,MAAA,IAAa,QAAA,KAAa,IAAA,EAAM,OAAO,KAAA;AAExD,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,QAAA,GAAW,EAAA,CAAG,GAAA,CAAI,MAAA,CAAO,QAAQ,CAAA;AACvC,IAAA,IAAI,CAAC,UAAU,OAAO,KAAA;AAEtB,IAAA,MAAM,aAAa,QAAA,CAAS,UAAA;AAC5B,IAAA,IAAI,UAAA,IAAc,UAAA,CAAW,IAAA,KAAS,YAAA,EAAc;AAClD,MAAA,MAAM,YAAA,GAAe,EAAA,CAAG,SAAA,CAAU,IAAA,GAAO,QAAA;AACzC,MAAA,MAAM,WAAqB,EAAC;AAC5B,MAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,KAAA,KAAU;AAC1B,QAAA,QAAA,CAAS,IAAA,CAAK,aAAa,MAAA,CAAO,KAAA,CAAM,OAAO,KAAA,CAAM,OAAA,EAAS,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,MAC5E,CAAC,CAAA;AACD,MAAA,MAAM,OAAA,GAAU,QAAA,CAAS,MAAA,CAAO,UAAA,EAAY,QAAQ,CAAA;AACpD,MAAA,EAAA,CAAG,WAAA,CAAY,QAAA,EAAU,QAAA,GAAW,QAAA,CAAS,UAAU,OAAO,CAAA;AAC9D,MAAA,MAAM,WAAW,QAAA,GAAW,IAAA,CAAK,IAAI,YAAA,EAAc,OAAA,CAAQ,WAAW,CAAC,CAAA;AACvE,MAAA,EAAA,CAAG,YAAA,CAAapB,oBAAc,IAAA,CAAK,EAAA,CAAG,IAAI,OAAA,CAAQ,QAAQ,CAAC,CAAC,CAAA;AAAA,IAC9D,CAAA,MAAO;AACL,MAAA,EAAA,CAAG,aAAA,CAAc,QAAA,EAAU,QAAA,EAAU,UAAU,CAAA;AAAA,IACjD;AAEA,IAAA,QAAA,CAAS,EAAE,CAAA;AACX,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,MAAM,eAAe,aAAA,CAAc,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,UAAU,CAAA;AAE7D,EAAA,IAAI,YAAA,CAAa,WAAW,CAAA,EAAG;AAE7B,IAAA,MAAM,EAAE,KAAA,EAAO,GAAA,EAAK,GAAA,EAAK,GAAA,KAAQ,EAAA,CAAG,SAAA;AACpC,IAAA,MAAM,EAAA,GAAK,GAAA,CAAI,UAAA,CAAW,GAAG,CAAA;AAC7B,IAAA,IAAI,CAAC,IAAI,OAAO,KAAA;AAChB,IAAA,IAAI,CAAC+B,2BAAgB,QAAA,GAAW,EAAA,GAAK,MAAM,EAAA,EAAI,QAAA,EAAU,UAAU,CAAA,EAAG,OAAO,KAAA;AAC7E,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,iBAAA,CAAkB,IAAI,QAAQ,CAAA;AAC9B,MAAA,gBAAA,CAAiB,IAAI,QAAQ,CAAA;AAC7B,MAAA,QAAA,CAAS,EAAA,CAAG,gBAAgB,CAAA;AAAA,IAC9B;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAKA,EAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAGtB,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,MAAM,gBAA0B,EAAC;AACjC,EAAA,KAAA,MAAW,SAAS,YAAA,EAAc;AAChC,IAAA,MAAM,IAAA,GAAO,EAAA,CAAG,GAAA,CAAI,OAAA,CAAQ,MAAM,GAAG,CAAA;AACrC,IAAA,KAAA,IAAS,CAAA,GAAI,IAAA,CAAK,KAAA,EAAO,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AACpC,MAAA,MAAM,MAAA,GAAA,CAAU,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,CAAE,KAAK,IAAA,CAAK,KAAA,IAAS,EAAA,EAAI,KAAA,CAAM,KAAK,CAAA;AAC/D,MAAA,IAAI,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,EAAG;AAC3B,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA;AAC1B,QAAA,IAAI,CAAC,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,EAAG;AACnB,UAAA,IAAA,CAAK,IAAI,IAAI,CAAA;AACb,UAAA,aAAA,CAAc,KAAK,IAAI,CAAA;AAAA,QACzB;AACA,QAAA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,aAAA,CAAc,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,CAAC,CAAA;AAClC,EAAA,KAAA,MAAW,OAAO,aAAA,EAAe;AAC/B,IAAA,MAAM,QAAA,GAAW,EAAA,CAAG,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA;AAClC,IAAA,IAAI,CAAC,QAAA,EAAU;AACf,IAAA,MAAM,WAAqB,EAAC;AAC5B,IAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,IAAA,KAAS;AACzB,MAAA,IAAA,CAAK,QAAQ,CAAC,KAAA,KAAU,QAAA,CAAS,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,IAC9C,CAAC,CAAA;AACD,IAAA,EAAA,CAAG,WAAA,CAAY,GAAA,EAAK,GAAA,GAAM,QAAA,CAAS,UAAU,QAAQ,CAAA;AAAA,EACvD;AAKA,EAAA,MAAM,UAAA,GAAa,EAAA,CAAG,OAAA,CAAQ,GAAA,CAAI,MAAM,EAAE,CAAA;AAC1C,EAAA,MAAM,QAAA,GAAW,EAAA,CAAG,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAC,CAAA;AACrC,EAAA,MAAM,SAAA,GAAY,EAAA,CAAG,GAAA,CAAI,OAAA,CAAQ,UAAU,CAAA;AAC3C,EAAA,MAAM,OAAA,GAAU,EAAA,CAAG,GAAA,CAAI,OAAA,CAAQ,QAAQ,CAAA;AACvC,EAAA,MAAM,SAAA,GAAY,SAAA,CAAU,UAAA,CAAW,OAAO,CAAA;AAC9C,EAAA,IAAI,CAAC,WAAW,OAAO,KAAA;AACvB,EAAAA,0BAAA,CAAgB,EAAA,EAAI,SAAA,EAAW,QAAA,EAAU,UAAU,CAAA;AAGnD,EAAA,iBAAA,CAAkB,IAAI,QAAQ,CAAA;AAC9B,EAAA,gBAAA,CAAiB,IAAI,QAAQ,CAAA;AAE7B,EAAA,QAAA,CAAS,EAAA,CAAG,gBAAgB,CAAA;AAC5B,EAAA,OAAO,IAAA;AACT;;;ACnVK,IAAM,gBAAA,GACX,CAAC,UAAA,EAAoB,UAAA,KACrB,CAAC,EAAE,KAAA,EAAO,EAAA,EAAI,QAAA,EAAS,KAAM;AAC3B,EAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,KAAA,CAAM,UAAU,CAAA,IAAK,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,UAAU,CAAA;AAE5E,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,EAAE,IAAA,EAAM,EAAA,EAAG,GAAI,EAAA,CAAG,SAAA;AACxB,EAAA,MAAM,cAAiE,EAAC;AACxE,EAAA,MAAM,cAAmF,EAAC;AAI1F,EAAA,IAAI,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,UAAU,CAAA,EAAG;AAClC,IAAA,EAAA,CAAG,IAAI,YAAA,CAAa,IAAA,EAAM,EAAA,EAAI,CAAC,MAAM,GAAA,KAAQ;AAC3C,MAAA,IAAI,IAAA,CAAK,IAAA,CAAK,IAAA,KAAS,UAAA,EAAY;AACjC,QAAA,WAAA,CAAY,IAAA,CAAK,EAAE,GAAA,EAAK,KAAA,EAAO,EAAE,GAAG,IAAA,CAAK,KAAA,EAAO,GAAG,UAAA,EAAW,EAAG,CAAA;AAAA,MACnE;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAGA,EAAA,IAAI,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,UAAU,CAAA,EAAG;AAClC,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,UAAU,CAAA;AAC9C,IAAA,EAAA,CAAG,IAAI,YAAA,CAAa,IAAA,EAAM,EAAA,EAAI,CAAC,MAAM,GAAA,KAAQ;AAC3C,MAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAEpB,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA;AACxC,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,WAAA,CAAY,IAAA,CAAK;AAAA,UACf,GAAA;AAAA,UACA,UAAU,IAAA,CAAK,QAAA;AAAA,UACf,OAAO,EAAE,GAAG,IAAA,CAAK,KAAA,EAAO,GAAG,UAAA;AAAW,SACvC,CAAA;AAAA,MACH;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,UAAA,GAAa,WAAA,CAAY,MAAA,GAAS,CAAA,IAAK,YAAY,MAAA,GAAS,CAAA;AAElE,EAAA,IAAI,cAAc,QAAA,EAAU;AAE1B,IAAA,KAAA,MAAW,UAAU,WAAA,EAAa;AAChC,MAAA,EAAA,CAAG,aAAA,CAAc,MAAA,CAAO,GAAA,EAAK,MAAA,EAAW,OAAO,KAAK,CAAA;AAAA,IACtD;AAGA,IAAA,IAAI,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,UAAU,CAAA,EAAG;AAClC,MAAA,MAAM,QAAA,GAAW,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,UAAU,CAAA;AAC9C,MAAA,KAAA,MAAW,UAAU,WAAA,EAAa;AAChC,QAAA,MAAM,OAAA,GAAU,QAAA,CAAS,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA;AAC5C,QAAA,EAAA,CAAG,WAAW,MAAA,CAAO,GAAA,EAAK,OAAO,GAAA,GAAM,MAAA,CAAO,UAAU,QAAQ,CAAA;AAChE,QAAA,EAAA,CAAG,QAAQ,MAAA,CAAO,GAAA,EAAK,OAAO,GAAA,GAAM,MAAA,CAAO,UAAU,OAAO,CAAA;AAAA,MAC9D;AAAA,IACF;AAEA,IAAA,QAAA,CAAS,EAAE,CAAA;AAAA,EACb;AAEA,EAAA,OAAO,UAAA;AACT;AAWK,IAAM,eAAA,GACX,CAAC,UAAA,EAAoB,aAAA,KACrB,CAAC,EAAE,KAAA,EAAO,EAAA,EAAI,QAAA,EAAS,KAAM;AAC3B,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,UAAU,CAAA;AAC9C,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,UAAU,CAAA;AAE9C,EAAA,IAAI,CAAC,QAAA,IAAY,CAAC,QAAA,EAAU;AAC1B,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,EAAE,IAAA,EAAM,EAAA,EAAG,GAAI,EAAA,CAAG,SAAA;AACxB,EAAA,MAAM,cAAiE,EAAC;AACxE,EAAA,MAAM,cAAmF,EAAC;AAI1F,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,MAAM,YAAA,GAAwB,QAAA,CAAS,IAAA,CAAK,KAAA,GAAQ,aAAa,CAAA,EAAG,OAAA;AAEpE,IAAA,EAAA,CAAG,IAAI,YAAA,CAAa,IAAA,EAAM,EAAA,EAAI,CAAC,MAAM,GAAA,KAAQ;AAC3C,MAAA,IAAI,IAAA,CAAK,SAAS,QAAA,EAAU;AAC1B,QAAA,WAAA,CAAY,IAAA,CAAK;AAAA,UACf,GAAA;AAAA,UACA,KAAA,EAAO,EAAE,GAAG,IAAA,CAAK,OAAO,CAAC,aAAa,GAAG,YAAA;AAAa,SACvD,CAAA;AAAA,MACH;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAGA,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,MAAM,YAAA,GAAwB,QAAA,CAAS,IAAA,CAAK,KAAA,GAAQ,aAAa,CAAA,EAAG,OAAA;AAEpE,IAAA,EAAA,CAAG,IAAI,YAAA,CAAa,IAAA,EAAM,EAAA,EAAI,CAAC,MAAM,GAAA,KAAQ;AAC3C,MAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAEpB,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA;AACxC,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,WAAA,CAAY,IAAA,CAAK;AAAA,UACf,GAAA;AAAA,UACA,UAAU,IAAA,CAAK,QAAA;AAAA,UACf,KAAA,EAAO,EAAE,GAAG,IAAA,CAAK,OAAO,CAAC,aAAa,GAAG,YAAA;AAAa,SACvD,CAAA;AAAA,MACH;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,UAAA,GAAa,WAAA,CAAY,MAAA,GAAS,CAAA,IAAK,YAAY,MAAA,GAAS,CAAA;AAElE,EAAA,IAAI,cAAc,QAAA,EAAU;AAE1B,IAAA,KAAA,MAAW,UAAU,WAAA,EAAa;AAChC,MAAA,EAAA,CAAG,aAAA,CAAc,MAAA,CAAO,GAAA,EAAK,MAAA,EAAW,OAAO,KAAK,CAAA;AAAA,IACtD;AAGA,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,KAAA,MAAW,UAAU,WAAA,EAAa;AAChC,QAAA,MAAM,OAAA,GAAU,QAAA,CAAS,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA;AAC5C,QAAA,EAAA,CAAG,WAAW,MAAA,CAAO,GAAA,EAAK,OAAO,GAAA,GAAM,MAAA,CAAO,UAAU,QAAQ,CAAA;AAChE,QAAA,EAAA,CAAG,QAAQ,MAAA,CAAO,GAAA,EAAK,OAAO,GAAA,GAAM,MAAA,CAAO,UAAU,OAAO,CAAA;AAAA,MAC9D;AAAA,IACF;AAEA,IAAA,QAAA,CAAS,EAAE,CAAA;AAAA,EACb;AAEA,EAAA,OAAO,UAAA;AACT;;;AC7FK,IAAM,eAAA,GAA8B;AAAA,EACzC,KAAA;AAAA,EACA,IAAA;AAAA,EACA,UAAA;AAAA,EACA,YAAA;AAAA,EACA,UAAA;AAAA,EACA,eAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA;AAAA,EACA,eAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA,IAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAA;AAAA,EACA,kBAAA;AAAA,EACA,gBAAA;AAAA,EACA;AACF;ACRO,SAAS,kBAAkB,OAAA,EAAiD;AACjF,EAAA,MAAM,EAAE,MAAA,EAAQ,EAAA,EAAI,UAAU,KAAA,EAAO,GAAA,EAAK,UAAS,GAAI,OAAA;AAEvD,EAAA,OAAO;AAAA;AAAA;AAAA,IAGL,MAAA;AAAA,IACA,KAAA,EAAO,OAAO,IAAA,CAAK,KAAA;AAAA,IACnB,EAAA;AAAA,IACA,QAAA;AAAA,IACA,KAAA;AAAA,IACA,GAAA;AAAA,IACA,UAAU,QAAA;AAAS,GACrB;AACF;AAcO,SAAS,2BAA2B,QAAA,EAAkD;AAC3F,EAAA,OAAO,CAAC,WAAA,KAAmC;AACzC,IAAA,IAAI,gBAAgB,QAAA,EAAU;AAC5B,MAAA,KAAA,MAAW,IAAA,IAAQ,YAAY,KAAA,EAAO;AACpC,QAAA,QAAA,CAAS,KAAK,IAAI,CAAA;AAAA,MACpB;AAOA,MAAA,MAAM,OAAQ,WAAA,CAA6D,IAAA;AAC3E,MAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,EAAG;AACnC,QAAA,QAAA,CAAS,OAAA,CAAQ,GAAA,EAAK,IAAA,CAAK,GAAG,CAAC,CAAA;AAAA,MACjC;AAOA,MAAA,IAAI,YAAY,YAAA,EAAc;AAC5B,QAAA,MAAM,EAAE,IAAA,EAAM,EAAA,EAAG,GAAI,WAAA,CAAY,SAAA;AACjC,QAAA,IAAI;AACF,UAAA,QAAA,CAAS,aAAa/B,mBAAAA,CAAc,MAAA,CAAO,SAAS,GAAA,EAAK,IAAA,EAAM,EAAE,CAAC,CAAA;AAAA,QACpE,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAA;AACF;;;AClFO,IAAM,eAAN,MAAmB;AAAA,EACP,MAAA;AAAA,EACA,WAAA;AAAA,EACA,EAAA;AAAA,EACT,cAAA,GAAiB,IAAA;AAAA;AAAA,EAEjB,YAAA,GAAuC,IAAA;AAAA;AAAA,EAEvC,QAAA,GAAgC,IAAA;AAAA;AAAA,EAEhC,aAAA,GAAgB,CAAA;AAAA;AAAA,EAEhB,YAAA,GAAoC,IAAA;AAAA;AAAA,EAEpC,qBAAA,GAA+C,IAAA;AAAA;AAAA,EAE/C,kBAAA,GAAyC,IAAA;AAAA,EAEjD,YAAY,OAAA,EAA8B;AACxC,IAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA;AACtB,IAAA,IAAA,CAAK,cAAc,OAAA,CAAQ,WAAA;AAE3B,IAAA,IAAA,CAAK,KAAK,OAAA,CAAQ,EAAA,IAAM,OAAA,CAAQ,MAAA,CAAO,KAAK,KAAA,CAAM,EAAA;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,iBAAA,GAAkC;AACxC,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,OAAO,IAAA,CAAK,YAAA;AAAA,IACd;AAEA,IAAA,MAAM,EAAE,MAAA,EAAQ,EAAA,EAAG,GAAI,IAAA;AAEvB,IAAA,IAAA,CAAK,eAAe,iBAAA,CAAkB;AAAA,MACpC,MAAA;AAAA,MACA,EAAA;AAAA,MACA,QAAA,EAAU,2BAA2B,EAAE,CAAA;AAAA,MACvC,KAAA,EAAO,MAAM,IAAA,CAAK,KAAA,EAAM;AAAA,MACxB,GAAA,EAAK,MAAM,IAAA,CAAK,gBAAA,EAAiB;AAAA,MACjC,QAAA,EAAU,MAAM,IAAA,CAAK,mBAAA;AAAoB,KAC1C,CAAA;AAED,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAA,GAAsC;AAC5C,IAAA,IAAI,KAAK,qBAAA,EAAuB;AAC9B,MAAA,OAAO,IAAA,CAAK,qBAAA;AAAA,IACd;AAEA,IAAA,MAAM,EAAE,aAAY,GAAI,IAAA;AAExB,IAAA,IAAA,CAAK,qBAAA,GAAwB,IAAI,KAAA,CAAM,EAAC,EAAqB;AAAA,MAC3D,GAAA,EAAK,CAAC,CAAA,EAAG,IAAA,KAAiB;AACxB,QAAA,MAAM,UAAA,GAAa,YAAY,IAAI,CAAA;AACnC,QAAA,IAAI,CAAC,UAAA,EAAY;AACf,UAAA,OAAO,MAAM,KAAA;AAAA,QACf;AACA,QAAA,OAAO,IAAI,IAAA,KAAoB;AAC7B,UAAA,MAAM,KAAA,GAAQ,KAAK,iBAAA,EAAkB;AACrC,UAAA,OAAQ,UAAA,CAA4C,GAAG,IAAI,CAAA,CAAE,KAAK,CAAA;AAAA,QACpE,CAAA;AAAA,MACF;AAAA,KACD,CAAA;AAED,IAAA,OAAO,IAAA,CAAK,qBAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAA,GAAgC;AACtC,IAAA,IAAI,KAAK,kBAAA,EAAoB;AAC3B,MAAA,OAAO,IAAA,CAAK,kBAAA;AAAA,IACd;AAEA,IAAA,MAAM,EAAE,MAAA,EAAQ,WAAA,EAAa,EAAA,EAAG,GAAI,IAAA;AAEpC,IAAA,IAAA,CAAK,kBAAA,GAAqB,IAAI,KAAA,CAAM,EAAC,EAAkB;AAAA,MACrD,GAAA,EAAK,CAAC,CAAA,EAAG,IAAA,KAAiB;AACxB,QAAA,IAAI,SAAS,OAAA,EAAS;AAEpB,UAAA,OAAO,MAAM,KAAK,qBAAA,EAAsB;AAAA,QAC1C;AAEA,QAAA,MAAM,UAAA,GAAa,YAAY,IAAI,CAAA;AACnC,QAAA,IAAI,CAAC,UAAA,EAAY;AACf,UAAA,OAAO,MAAM,KAAA;AAAA,QACf;AACA,QAAA,OAAO,IAAI,IAAA,KAAoB;AAE7B,UAAA,MAAM,KAAA,GAAsB;AAAA,YAC1B,MAAA;AAAA,YACA,KAAA,EAAO,OAAO,IAAA,CAAK,KAAA;AAAA,YACnB,EAAA;AAAA,YACA,QAAA,EAAU,MAAA;AAAA,YACV,KAAA,EAAO,MAAM,IAAA,CAAK,KAAA,EAAM;AAAA,YACxB,GAAA,EAAK,MAAM,IAAA,CAAK,gBAAA,EAAiB;AAAA,YACjC,QAAA,EAAU,KAAK,mBAAA;AAAoB,WACrC;AACA,UAAA,OAAQ,UAAA,CAA4C,GAAG,IAAI,CAAA,CAAE,KAAK,CAAA;AAAA,QACpE,CAAA;AAAA,MACF;AAAA,KACD,CAAA;AAED,IAAA,OAAO,IAAA,CAAK,kBAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKQ,qBAAA,GAAyC;AAC/C,IAAA,MAAM,EAAE,MAAA,EAAQ,WAAA,EAAa,EAAA,EAAG,GAAI,IAAA;AACpC,IAAA,IAAI,YAAA,GAAe,IAAA;AAEnB,IAAA,MAAM,aAAA,GAAgB,IAAI,KAAA,CAAM,EAAC,EAAsB;AAAA,MACrD,GAAA,EAAK,CAAC,CAAA,EAAG,IAAA,KAAiB;AACxB,QAAA,IAAI,SAAS,KAAA,EAAO;AAClB,UAAA,OAAO,MAAM,YAAA;AAAA,QACf;AAEA,QAAA,MAAM,UAAA,GAAa,YAAY,IAAI,CAAA;AACnC,QAAA,IAAI,CAAC,UAAA,EAAY;AACf,UAAA,OAAO,MAAM;AACX,YAAA,YAAA,GAAe,KAAA;AACf,YAAA,OAAO,aAAA;AAAA,UACT,CAAA;AAAA,QACF;AAEA,QAAA,OAAO,IAAI,IAAA,KAAoB;AAE7B,UAAA,MAAM,KAAA,GAAsB;AAAA,YAC1B,MAAA;AAAA,YACA,KAAA,EAAO,OAAO,IAAA,CAAK,KAAA;AAAA,YACnB,EAAA;AAAA,YACA,QAAA,EAAU,MAAA;AAAA,YACV,KAAA,EAAO,MAAM,IAAA,CAAK,KAAA,EAAM;AAAA,YACxB,GAAA,EAAK,MAAM,IAAA,CAAK,gBAAA,EAAiB;AAAA,YACjC,QAAA,EAAU,KAAK,mBAAA;AAAoB,WACrC;AACA,UAAA,MAAM,MAAA,GAAU,UAAA,CAA4C,GAAG,IAAI,EAAE,KAAK,CAAA;AAC1E,UAAA,IAAI,CAAC,MAAA,EAAQ;AACX,YAAA,YAAA,GAAe,KAAA;AAAA,UACjB;AACA,UAAA,OAAO,aAAA;AAAA,QACT,CAAA;AAAA,MACF;AAAA,KACD,CAAA;AAED,IAAA,OAAO,aAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,QAAQ,EAAA,EAA4C;AAClD,IAAA,MAAM,eAAe,IAAA,CAAK,aAAA,EAAA;AAC1B,IAAA,MAAM,KAAA,GAAQ,KAAK,iBAAA,EAAkB;AACrC,IAAA,MAAM,MAAA,GAAS,GAAG,KAAK,CAAA;AACvB,IAAA,IAAI,CAAC,MAAA,IAAU,CAAC,IAAA,CAAK,QAAA,EAAU;AAC7B,MAAA,IAAA,CAAK,cAAA,GAAiB,KAAA;AACtB,MAAA,IAAA,CAAK,QAAA,GAAW,EAAE,OAAA,EAAS,SAAA,EAAW,MAAM,CAAC,EAAE,CAAA,EAAG,KAAA,EAAO,YAAA,EAAa;AAAA,IACxE;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,UAAA,GAAkC;AAChC,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,GAAA,GAAe;AACb,IAAA,MAAM,EAAE,MAAA,EAAQ,EAAA,EAAI,cAAA,EAAe,GAAI,IAAA;AAEvC,IAAA,IAAI,OAAO,WAAA,EAAa;AACtB,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,MAAA,OAAO,KAAA;AAAA,IACT;AAGA,IAAA,IAAI,EAAA,CAAG,MAAM,MAAA,KAAW,CAAA,IAAK,CAAC,EAAA,CAAG,YAAA,IAAgB,CAAC,EAAA,CAAG,cAAA,EAAgB;AACnE,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAA,CAAO,IAAA,CAAK,SAAS,EAAE,CAAA;AACvB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,KAAA,GAAyB;AACvB,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,OAAO,IAAA,CAAK,YAAA;AAAA,IACd;AAEA,IAAA,MAAM,EAAE,aAAY,GAAI,IAAA;AAGxB,IAAA,MAAM,KAAA,GAAyB,IAAI,KAAA,CAAM,EAAC,EAAsB;AAAA,MAC9D,GAAA,EAAK,CAAC,CAAA,EAAG,IAAA,KAAiB;AAExB,QAAA,IAAI,SAAS,KAAA,EAAO;AAClB,UAAA,OAAO,MAAM,KAAK,GAAA,EAAI;AAAA,QACxB;AAEA,QAAA,IAAI,SAAS,YAAA,EAAc;AACzB,UAAA,OAAO,MAAM,KAAK,UAAA,EAAW;AAAA,QAC/B;AAEA,QAAA,IAAI,SAAS,SAAA,EAAW;AACtB,UAAA,OAAO,CAAC,EAAA,KAAyC;AAC/C,YAAA,IAAA,CAAK,QAAQ,EAAE,CAAA;AACf,YAAA,OAAO,KAAA;AAAA,UACT,CAAA;AAAA,QACF;AAGA,QAAA,MAAM,UAAA,GAAa,YAAY,IAAI,CAAA;AACnC,QAAA,IAAI,CAAC,UAAA,EAAY;AACf,UAAA,OAAO,IAAI,IAAA,KAAoB;AAC7B,YAAA,MAAM,eAAe,IAAA,CAAK,aAAA,EAAA;AAC1B,YAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAClB,cAAA,IAAA,CAAK,cAAA,GAAiB,KAAA;AACtB,cAAA,IAAA,CAAK,WAAW,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,OAAO,YAAA,EAAa;AAAA,YAC7D;AACA,YAAA,OAAO,KAAA;AAAA,UACT,CAAA;AAAA,QACF;AAEA,QAAA,OAAO,IAAI,IAAA,KAAoB;AAC7B,UAAA,MAAM,eAAe,IAAA,CAAK,aAAA,EAAA;AAC1B,UAAA,MAAM,KAAA,GAAQ,KAAK,iBAAA,EAAkB;AACrC,UAAA,MAAM,MAAA,GAAU,UAAA,CAA4C,GAAG,IAAI,EAAE,KAAK,CAAA;AAC1E,UAAA,IAAI,CAAC,MAAA,IAAU,CAAC,IAAA,CAAK,QAAA,EAAU;AAC7B,YAAA,IAAA,CAAK,cAAA,GAAiB,KAAA;AACtB,YAAA,IAAA,CAAK,WAAW,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,OAAO,YAAA,EAAa;AAAA,UAC7D;AACA,UAAA,OAAO,KAAA;AAAA,QACT,CAAA;AAAA,MACF;AAAA,KACD,CAAA;AAGD,IAAA,IAAA,CAAK,YAAA,GAAe,KAAA;AACpB,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAKO,SAAS,mBAAmB,OAAA,EAA+C;AAChF,EAAA,MAAM,OAAA,GAAU,IAAI,YAAA,CAAa,OAAO,CAAA;AACxC,EAAA,OAAO,QAAQ,KAAA,EAAM;AACvB;;;AC9RO,IAAM,aAAN,MAAiB;AAAA,EACL,MAAA;AAAA,EACA,WAAA;AAAA,EACA,kBAAA;AAAA,EACA,gBAAA;AAAA,EAEjB,YAAY,OAAA,EAA4B;AACtC,IAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA;AACtB,IAAA,IAAA,CAAK,cAAc,OAAA,CAAQ,WAAA;AAC3B,IAAA,IAAA,CAAK,qBAAqB,OAAA,CAAQ,kBAAA;AAClC,IAAA,IAAA,CAAK,mBAAmB,OAAA,CAAQ,gBAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,iBAAiB,EAAA,EAA+B;AACtD,IAAA,MAAM,EAAE,QAAO,GAAI,IAAA;AAEnB,IAAA,OAAO,iBAAA,CAAkB;AAAA,MACvB,MAAA;AAAA,MACA,EAAA;AAAA,MACA,QAAA,EAAU,MAAA;AAAA;AAAA,MACV,OAAO,IAAA,CAAK,kBAAA;AAAA,MACZ,GAAA,EAAK,MAAM,IAAA,CAAK,KAAA,EAAM;AAAA,MACtB,QAAA,EAAU,MAAM,IAAA,CAAK,mBAAA,CAAoB,EAAE;AAAA,KAC5C,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAAoB,EAAA,EAAiC;AAC3D,IAAA,MAAM,EAAE,aAAY,GAAI,IAAA;AAExB,IAAA,OAAO,IAAI,KAAA,CAAM,EAAC,EAAqB;AAAA,MACrC,GAAA,EAAK,CAAC,CAAA,EAAG,IAAA,KAAiB;AACxB,QAAA,MAAM,UAAA,GAAa,YAAY,IAAI,CAAA;AACnC,QAAA,IAAI,CAAC,UAAA,EAAY;AACf,UAAA,OAAO,MAAM,KAAA;AAAA,QACf;AACA,QAAA,OAAO,IAAI,IAAA,KAAoB;AAC7B,UAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,gBAAA,CAAiB,EAAE,CAAA;AACtC,UAAA,OAAQ,UAAA,CAA4C,GAAG,IAAI,CAAA,CAAE,KAAK,CAAA;AAAA,QACpE,CAAA;AAAA,MACF;AAAA,KACD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,KAAA,GAAqB;AACnB,IAAA,MAAM,EAAE,MAAA,EAAQ,WAAA,EAAY,GAAI,IAAA;AAEhC,IAAA,OAAO,IAAI,KAAA,CAAM,EAAC,EAAkB;AAAA,MAClC,GAAA,EAAK,CAAC,CAAA,EAAG,IAAA,KAAiB;AAExB,QAAA,IAAI,SAAS,OAAA,EAAS;AACpB,UAAA,OAAO,MAAM,KAAK,UAAA,EAAW;AAAA,QAC/B;AAGA,QAAA,MAAM,UAAA,GAAa,YAAY,IAAI,CAAA;AACnC,QAAA,IAAI,CAAC,UAAA,EAAY;AACf,UAAA,IAAA,CAAK,gBAAA,GAAmB,MAAM,QAAQ,CAAA;AACtC,UAAA,OAAO,MAAM,KAAA;AAAA,QACf;AAEA,QAAA,OAAO,IAAI,IAAA,KAAoB;AAC7B,UAAA,IAAI,OAAO,WAAA,EAAa;AACtB,YAAA,OAAO,KAAA;AAAA,UACT;AAEA,UAAA,MAAM,EAAA,GAAK,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,EAAA;AAC7B,UAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,gBAAA,CAAiB,EAAE,CAAA;AACtC,UAAA,OAAQ,UAAA,CAA4C,GAAG,IAAI,CAAA,CAAE,KAAK,CAAA;AAAA,QACpE,CAAA;AAAA,MACF;AAAA,KACD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAA,GAAiC;AAC/B,IAAA,MAAM,EAAE,MAAA,EAAQ,WAAA,EAAY,GAAI,IAAA;AAChC,IAAA,IAAI,YAAA,GAAe,IAAA;AACnB,IAAA,MAAM,EAAA,GAAK,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,EAAA;AAE7B,IAAA,MAAM,UAAA,GAAiC,IAAI,KAAA,CAAM,EAAC,EAAyB;AAAA,MACzE,GAAA,EAAK,CAAC,CAAA,EAAG,IAAA,KAAiB;AAExB,QAAA,IAAI,SAAS,KAAA,EAAO;AAClB,UAAA,OAAO,MAAM,YAAA;AAAA,QACf;AAGA,QAAA,MAAM,UAAA,GAAa,YAAY,IAAI,CAAA;AACnC,QAAA,IAAI,CAAC,UAAA,EAAY;AACf,UAAA,IAAA,CAAK,gBAAA,GAAmB,MAAM,OAAO,CAAA;AACrC,UAAA,OAAO,MAAM;AACX,YAAA,YAAA,GAAe,KAAA;AACf,YAAA,OAAO,UAAA;AAAA,UACT,CAAA;AAAA,QACF;AAEA,QAAA,OAAO,IAAI,IAAA,KAAoB;AAC7B,UAAA,IAAI,OAAO,WAAA,EAAa;AACtB,YAAA,YAAA,GAAe,KAAA;AACf,YAAA,OAAO,UAAA;AAAA,UACT;AAEA,UAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,gBAAA,CAAiB,EAAE,CAAA;AACtC,UAAA,MAAM,MAAA,GAAU,UAAA,CAA4C,GAAG,IAAI,EAAE,KAAK,CAAA;AAC1E,UAAA,IAAI,CAAC,MAAA,EAAQ;AACX,YAAA,YAAA,GAAe,KAAA;AAAA,UACjB;AACA,UAAA,OAAO,UAAA;AAAA,QACT,CAAA;AAAA,MACF;AAAA,KACD,CAAA;AAED,IAAA,OAAO,UAAA;AAAA,EACT;AACF;AAKO,SAAS,iBAAiB,OAAA,EAAyC;AACxE,EAAA,MAAM,OAAA,GAAU,IAAI,UAAA,CAAW,OAAO,CAAA;AACtC,EAAA,OAAO,QAAQ,KAAA,EAAM;AACvB;;;ACnJO,IAAM,iBAAN,MAAqB;AAAA,EACT,MAAA;AAAA;AAAA,EAGT,YAAA,GAAkC,IAAA;AAAA;AAAA,EAGlC,eAAA,GAAyC,IAAA;AAAA;AAAA,EAGhC,SAAA;AAAA,EAEjB,YAAY,MAAA,EAA8B;AACxC,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,SAAA,GAAY,CAAC,EAAA,KAA0B;AAC1C,MAAA,MAAA,CAAO,IAAA,CAAK,SAAS,EAAE,CAAA;AAAA,IACzB,CAAA;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,WAAA,GAA0B;AAC5B,IAAA,IAAA,CAAK,YAAA,KAAiB;AAAA,MACpB,GAAG,eAAA;AAAA,MACH,GAAG,IAAA,CAAK,MAAA,CAAO,gBAAA,CAAiB;AAAA,KAClC;AACA,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAA,CAAkB,IAAiB,QAAA,EAAoD;AAC7F,IAAA,MAAM,EAAE,QAAO,GAAI,IAAA;AAEnB,IAAA,OAAO;AAAA;AAAA;AAAA,MAGL,MAAA;AAAA,MACA,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,EAAA;AAAA,MACA,QAAA;AAAA,MACA,KAAA,EAAO,MAAM,IAAA,CAAK,KAAA,EAAM;AAAA,MACxB,GAAA,EAAK,MAAM,IAAA,CAAK,GAAA,EAAI;AAAA,MACpB,UAAU,IAAA,CAAK;AAAA,KACjB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,IAAI,QAAA,GAA2B;AAC7B,IAAA,IAAI,IAAA,CAAK,eAAA,EAAiB,OAAO,IAAA,CAAK,eAAA;AAEtC,IAAA,MAAM,EAAE,MAAA,EAAQ,WAAA,EAAY,GAAI,IAAA;AAEhC,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAI,KAAA,CAAM,EAAC,EAAqB;AAAA,MACrD,GAAA,EAAK,CAAC,CAAA,EAAG,IAAA,KAAiB;AACxB,QAAA,MAAM,UAAA,GAAa,YAAY,IAAI,CAAA;AACnC,QAAA,IAAI,CAAC,UAAA,EAAY;AACf,UAAA,OAAO,MAAM,KAAA;AAAA,QACf;AAEA,QAAA,OAAO,IAAI,IAAA,KAAoB;AAC7B,UAAA,IAAI,OAAO,WAAA,EAAa;AACtB,YAAA,OAAO,KAAA;AAAA,UACT;AAGA,UAAA,MAAM,EAAA,GAAK,OAAO,KAAA,CAAM,EAAA;AAExB,UAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,iBAAA,CAAkB,EAAA,EAAI,KAAK,SAAS,CAAA;AACvD,UAAA,OAAQ,UAAA,CAA4C,GAAG,IAAI,CAAA,CAAE,KAAK,CAAA;AAAA,QACpE,CAAA;AAAA,MACF;AAAA,KACD,CAAA;AAED,IAAA,OAAO,IAAA,CAAK,eAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,KAAA,GAAyB;AACvB,IAAA,MAAM,EAAE,MAAA,EAAQ,WAAA,EAAY,GAAI,IAAA;AAEhC,IAAA,OAAO,kBAAA,CAAmB;AAAA,MACxB,MAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,GAAA,GAAmB;AACjB,IAAA,MAAM,EAAE,MAAA,EAAQ,WAAA,EAAY,GAAI,IAAA;AAEhC,IAAA,OAAO,gBAAA,CAAiB;AAAA,MACtB,MAAA;AAAA,MACA,WAAA;AAAA,MACA,kBAAA,EAAoB,MAAM,IAAA,CAAK,KAAA;AAAM,KACtC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAA,GAAmB;AACjB,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AAAA,EACzB;AACF;;;ACxHA,IAAM,aAAA,GAAwC;AAAA;AAAA,EAE5C,aAAA,EAAe,SAAA;AAAA,EACf,cAAA,EAAgB,SAAA;AAAA,EAChB,mBAAA,EAAqB,SAAA;AAAA,EACrB,wBAAA,EAA0B,SAAA;AAAA,EAC1B,WAAA,EAAa,SAAA;AAAA;AAAA,EAGb,YAAA,EAAc,SAAA;AAAA;AAAA,EAGd,WAAA,EAAa,SAAA;AAAA,EACb,gBAAA,EAAkB,SAAA;AAAA,EAClB,cAAA,EAAgB,SAAA;AAAA,EAChB,WAAA,EAAa,SAAA;AAAA,EACb,aAAA,EAAe,SAAA;AAAA,EACf,eAAA,EAAiB,SAAA;AAAA,EACjB,eAAA,EAAiB,SAAA;AAAA,EACjB,oBAAA,EAAsB,SAAA;AAAA,EACtB,qBAAA,EAAuB,SAAA;AAAA,EACvB,kBAAA,EAAoB,SAAA;AAAA;AAAA,EAGpB,aAAA,EAAe,SAAA;AAAA,EACf,aAAA,EAAe,SAAA;AAAA;AAAA,EAGf,eAAA,EAAiB,SAAA;AAAA,EACjB,aAAA,EAAe,SAAA;AAAA;AAAA,EAGf,cAAA,EAAgB,SAAA;AAAA,EAChB,WAAA,EAAa,SAAA;AAAA,EACb,cAAA,EAAgB,SAAA;AAAA;AAAA,EAGhB,WAAA,EAAa,SAAA;AAAA,EACb,YAAA,EAAc,SAAA;AAAA,EACd,mBAAA,EAAqB,SAAA;AAAA,EACrB,sBAAA,EAAwB,SAAA;AAAA;AAAA,EAGxB,cAAA,EAAgB,SAAA;AAAA,EAChB,aAAA,EAAe,SAAA;AAAA;AAAA,EAGf,eAAA,EAAiB,SAAA;AAAA,EACjB,eAAA,EAAiB;AACnB,CAAA;AAQA,IAAM,QAAA,GAA0B;AAAA,EAC9B,gBAAA,EAAkB,mBAAA;AAAA,EAClB,eAAA,EAAiB,SAAA;AAAA,EACjB,WAAA,EAAa,mBAAA;AAAA,EACb,aAAA,EAAe,SAAA;AAAA,EACf,MAAA,EAAQ,SAAA;AAAA,EACR,QAAA,EAAU,uEAAA;AAAA,EACV,UAAA,EAAY,mBAAA;AAAA,EACZ,WAAA,EAAa,SAAA;AAAA,EACb,aAAA,EAAe,uEAAA;AAAA,EACf,QAAA,EAAU,mBAAA;AAAA,EACV,SAAA,EAAW,SAAA;AAAA,EACX,aAAA,EAAe,mBAAA;AAAA,EACf,SAAA,EAAW,SAAA;AAAA,EACX,iBAAA,EAAmB;AACrB,CAAA;AAMA,SAAS,iBAAiB,SAAA,EAAiD;AACzE,EAAA,IAAI,CAAC,WAAW,OAAO,QAAA;AACvB,EAAA,OAAO,EAAE,GAAG,QAAA,EAAU,GAAG,SAAA,EAAU;AACrC;AAMO,SAAS,iBAAA,CAAkB,WAAwB,SAAA,EAAwC;AAChG,EAAA,MAAM,CAAA,GAAI,iBAAiB,SAAS,CAAA;AAGpC,EAAA,IAAI,WAAW,eAAA,EAAiB;AAC9B,IAAA,MAAM,aAAa,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,gBAAA,CAAiB,YAAY,CAAC,CAAA;AACtE,IAAA,KAAA,MAAW,QAAQ,UAAA,EAAY;AAC7B,MAAA,MAAM,GAAA,GAAM,KAAK,WAAA,IAAe,EAAA;AAChC,MAAA,MAAM,SAAA,GAAY,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,SAAS,CAAA,CAAE,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,UAAA,CAAW,WAAW,CAAC,CAAA;AAChF,MAAA,MAAM,WAAW,SAAA,GAAY,SAAA,CAAU,KAAA,CAAM,WAAA,CAAY,MAAM,CAAA,GAAI,IAAA;AACnE,MAAA,MAAM,WAAA,GAAc,SAAA,CAAU,eAAA,CAAgB,GAAA,EAAK,QAAQ,CAAA;AAC3D,MAAA,IAAI,gBAAgB,IAAA,EAAM;AACxB,QAAA,IAAA,CAAK,SAAA,GAAY,WAAA;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,WAAW,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,gBAAA,CAAiB,mHAAmH,CAAC,CAAA;AAE3K,EAAA,KAAA,MAAW,MAAM,QAAA,EAAU;AACzB,IAAA,MAAM,MAAM,EAAA,CAAG,OAAA;AACf,IAAA,MAAM,QAAA,GAAW,EAAA,CAAG,YAAA,CAAa,OAAO,CAAA,IAAK,EAAA;AAC7C,IAAA,IAAI,MAAA,GAAS,EAAA;AAEb,IAAA,QAAQ,GAAA;AAAK,MACX,KAAK,YAAA;AACH,QAAA,MAAA,GAAS,CAAA,aAAA,EAAgB,CAAA,CAAE,gBAAgB,CAAA,SAAA,EAAY,EAAE,eAAe,CAAA,iDAAA,CAAA;AACxE,QAAA;AAAA,MAEF,KAAK,OAAA;AACH,QAAA,MAAA,GAAS,CAAA,yDAAA,CAAA;AACT,QAAA;AAAA,MAEF,KAAK,IAAA,EAAM;AACT,QAAA,MAAA,GAAS,CAAA,QAAA,EAAW,EAAE,WAAW,CAAA,kGAAA,CAAA;AACjC,QAAA,MAAM,WAAA,GAAc,EAAA,CAAG,YAAA,CAAa,iBAAiB,CAAA;AACrD,QAAA,IAAI,WAAA,EAAa,MAAA,IAAU,CAAA,aAAA,EAAgB,WAAW,CAAA,CAAA,CAAA;AACtD,QAAA,MAAM,eAAA,GAAkB,EAAA,CAAG,YAAA,CAAa,qBAAqB,CAAA;AAC7D,QAAA,IAAI,eAAA,EAAiB,MAAA,IAAU,CAAA,iBAAA,EAAoB,eAAe,CAAA,CAAA,CAAA;AAClE,QAAA;AAAA,MACF;AAAA,MAEA,KAAK,IAAA,EAAM;AACT,QAAA,MAAA,GAAS,CAAA,QAAA,EAAW,CAAA,CAAE,WAAW,CAAA,iIAAA,EAAoI,EAAE,aAAa,CAAA,mBAAA,CAAA;AACpL,QAAA,MAAM,WAAA,GAAc,EAAA,CAAG,YAAA,CAAa,iBAAiB,CAAA;AACrD,QAAA,IAAI,WAAA,EAAa,MAAA,IAAU,CAAA,aAAA,EAAgB,WAAW,CAAA,CAAA,CAAA;AACtD,QAAA,MAAM,eAAA,GAAkB,EAAA,CAAG,YAAA,CAAa,qBAAqB,CAAA;AAC7D,QAAA,IAAI,eAAA,EAAiB,MAAA,IAAU,CAAA,iBAAA,EAAoB,eAAe,CAAA,CAAA,CAAA;AAClE,QAAA;AAAA,MACF;AAAA,MAEA,KAAK,KAAA;AACH,QAAA,MAAA,GAAS,CAAA,YAAA,EAAe,CAAA,CAAE,WAAW,CAAA,eAAA,EAAkB,EAAE,aAAa,CAAA,gGAAA,CAAA;AACtE,QAAA;AAAA,MAEF,KAAK,MAAA,EAAQ;AACX,QAAA,MAAM,SAAS,EAAA,CAAG,aAAA;AAClB,QAAA,IAAI,MAAA,EAAQ,YAAY,KAAA,EAAO;AAE7B,UAAA,MAAA,GAAS,mFAAA;AAAA,QACX,CAAA,MAAO;AAEL,UAAA,MAAA,GAAS,CAAA,YAAA,EAAe,EAAE,MAAM,CAAA,eAAA,EAAkB,EAAE,QAAQ,CAAA,sDAAA,EAAyD,EAAE,UAAU,CAAA,yBAAA,CAAA;AAAA,QACnI;AACA,QAAA;AAAA,MACF;AAAA,MAEA,KAAK,IAAA;AACH,QAAA,MAAA,GAAS,CAAA,0BAAA,EAA6B,EAAE,QAAQ,CAAA,kBAAA,CAAA;AAChD,QAAA;AAAA,MAEF,KAAK,GAAA;AACH,QAAA,MAAA,GAAS,CAAA,OAAA,EAAU,EAAE,SAAS,CAAA,6BAAA,CAAA;AAC9B,QAAA;AAAA,MAEF,KAAK,KAAA;AACH,QAAA,MAAA,GAAS,kEAAA;AACT,QAAA;AAAA,MAEF,KAAK,IAAA;AACH,QAAA,MAAA,GAAS,6EAAA;AACT,QAAA;AAAA,MACF,KAAK,IAAA;AACH,QAAA,MAAA,GAAS,+EAAA;AACT,QAAA;AAAA,MACF,KAAK,IAAA;AACH,QAAA,MAAA,GAAS,gFAAA;AACT,QAAA;AAAA,MACF,KAAK,IAAA;AACH,QAAA,MAAA,GAAS,+EAAA;AACT,QAAA;AAAA,MACF,KAAK,IAAA;AACH,QAAA,MAAA,GAAS,6EAAA;AACT,QAAA;AAAA,MACF,KAAK,IAAA;AACH,QAAA,MAAA,GAAS,+EAAA;AACT,QAAA;AAAA,MAEF,KAAK,IAAA;AACH,QAAA,IAAI,EAAA,CAAG,YAAA,CAAa,WAAW,CAAA,KAAM,UAAA,EAAY;AAC/C,UAAA,MAAA,GAAS,sDAAA;AAAA,QACX,CAAA,MAAO;AACL,UAAA,MAAA,GAAS,wCAAA;AAAA,QACX;AACA,QAAA;AAAA,MAEF,KAAK,IAAA;AACH,QAAA,MAAA,GAAS,wCAAA;AACT,QAAA;AAAA,MAEF,KAAK,IAAA;AACH,QAAA,IAAI,EAAA,CAAG,YAAA,CAAa,WAAW,CAAA,KAAM,UAAA,EAAY;AAC/C,UAAA,MAAA,GAAS,uEAAA;AAET,UAAA,IAAI,EAAA,CAAG,YAAA,CAAa,cAAc,CAAA,KAAM,MAAA,EAAQ;AAC9C,YAAA,MAAM,UAAA,GAAa,EAAA,CAAG,aAAA,CAAc,cAAc,CAAA;AAClD,YAAA,IAAI,UAAA,EAAY;AACd,cAAA,MAAM,eAAA,GAAkB,UAAA,CAAW,YAAA,CAAa,OAAO,CAAA,IAAK,EAAA;AAC5D,cAAA,UAAA,CAAW,YAAA;AAAA,gBACT,OAAA;AAAA,gBACA,8CAAA,GAAiD;AAAA,eACnD;AAAA,YACF;AAAA,UACF;AAAA,QACF,CAAA,MAAO;AACL,UAAA,MAAA,GAAS,mBAAA;AAAA,QACX;AACA,QAAA;AAAA,MAEF,KAAK,SAAA;AACH,QAAA,MAAA,GAAS,CAAA,QAAA,EAAW,EAAE,aAAa,CAAA,4CAAA,CAAA;AACnC,QAAA;AAAA,MAEF,KAAK,SAAA;AACH,QAAA,MAAA,GAAS,CAAA,qDAAA,EAAwD,EAAE,SAAS,CAAA,0EAAA,CAAA;AAC5E,QAAA;AAAA,MAEF,KAAK,KAAA;AACH,QAAA,IAAI,EAAA,CAAG,YAAA,CAAa,sBAAsB,CAAA,EAAG;AAC3C,UAAA,MAAA,GAAS,CAAA,mCAAA,EAAsC,EAAE,aAAa,CAAA,CAAA,CAAA;AAAA,QAChE;AACA,QAAA;AAAA,MAEF,KAAK,MAAA,EAAQ;AACX,QAAA,IAAI,CAAC,GAAG,SAAA,EAAW;AAEnB,QAAA,MAAM,SAAA,GAAY,EAAA,CAAG,SAAA,CAAU,KAAA,CAAM,GAAG,CAAA;AACxC,QAAA,KAAA,MAAW,OAAO,SAAA,EAAW;AAC3B,UAAA,MAAM,KAAA,GAAQ,cAAc,GAAG,CAAA;AAC/B,UAAA,IAAI,KAAA,EAAO;AACT,YAAA,MAAA,GAAS,UAAU,KAAK,CAAA,CAAA,CAAA;AACxB,YAAA;AAAA,UACF;AAAA,QACF;AAEA,QAAA,IAAI,EAAA,CAAG,UAAU,QAAA,CAAS,cAAc,KAAK,EAAA,CAAG,SAAA,CAAU,QAAA,CAAS,aAAa,CAAA,EAAG;AACjF,UAAA,MAAA,IAAU,qBAAA;AAAA,QACZ;AACA,QAAA,IAAI,EAAA,CAAG,SAAA,CAAU,QAAA,CAAS,eAAe,CAAA,EAAG;AAC1C,UAAA,MAAA,IAAU,sBAAA;AAAA,QACZ;AAEA,QAAA,IAAI,EAAA,CAAG,SAAA,CAAU,QAAA,CAAS,eAAe,CAAA,EAAG;AAC1C,UAAA,MAAA,IAAU,6BAAA;AAAA,QACZ;AACA,QAAA,IAAI,EAAA,CAAG,SAAA,CAAU,QAAA,CAAS,eAAe,CAAA,EAAG;AAC1C,UAAA,MAAA,IAAU,6BAAA;AAAA,QACZ;AACA,QAAA;AAAA,MACF;AAAA;AAIF,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,EAAA,CAAG,YAAA,CAAa,OAAA,EAAS,MAAA,GAAS,GAAA,GAAM,QAAQ,CAAA;AAAA,IAClD;AAAA,EACF;AAGA,EAAA,IAAI,CAAA,CAAE,sBAAsB,MAAA,EAAQ;AAClC,IAAA,MAAM,SAAS,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,gBAAA,CAAiB,OAAO,CAAC,CAAA;AAC7D,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,MAAM,QAAA,GAAW,KAAA,CAAM,aAAA,CAAc,IAAI,CAAA;AACzC,MAAA,IAAI,CAAC,QAAA,EAAU;AAEf,MAAA,MAAM,gBAAgB,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,gBAAA,CAA8B,QAAQ,CAAC,CAAA;AAEjF,MAAA,MAAM,SAAmB,EAAC;AAC1B,MAAA,IAAI,aAAA,GAAgB,IAAA;AACpB,MAAA,KAAA,MAAW,QAAQ,aAAA,EAAe;AAChC,QAAA,MAAM,GAAA,GAAM,IAAA,CAAK,YAAA,CAAa,eAAe,CAAA;AAC7C,QAAA,IAAI,CAAC,GAAA,EAAK;AAAE,UAAA,aAAA,GAAgB,KAAA;AAAO,UAAA;AAAA,QAAO;AAC1C,QAAA,MAAM,SAAS,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA,CAAE,IAAI,MAAM,CAAA;AACxC,QAAA,IAAI,MAAA,CAAO,KAAK,CAAA,CAAA,KAAK,CAAC,KAAK,KAAA,CAAM,CAAC,CAAC,CAAA,EAAG;AAAE,UAAA,aAAA,GAAgB,KAAA;AAAO,UAAA;AAAA,QAAO;AACtE,QAAA,MAAA,CAAO,IAAA,CAAK,GAAG,MAAM,CAAA;AAAA,MACvB;AACA,MAAA,IAAI,CAAC,aAAA,IAAiB,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG;AAE3C,MAAA,MAAM,GAAA,GAAM,OAAO,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,GAAG,CAAC,CAAA;AAG5C,MAAA,MAAM,UAAA,GAAa,KAAA,CAAM,YAAA,CAAa,OAAO,CAAA,IAAK,EAAA;AAClD,MAAA,IAAI,CAAA,CAAE,sBAAsB,SAAA,EAAW;AACrC,QAAA,KAAA,CAAM,YAAA,CAAa,OAAA,EAAS,UAAA,GAAa,uBAAuB,CAAA;AAChE,QAAA,KAAA,MAAW,QAAQ,aAAA,EAAe;AAChC,UAAA,MAAM,GAAA,GAAM,IAAA,CAAK,YAAA,CAAa,eAAe,CAAA,IAAK,EAAA;AAClD,UAAA,MAAM,SAAS,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA,CAAE,IAAI,MAAM,CAAA;AACxC,UAAA,MAAM,WAAA,GAAc,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,EAAG,MAAM,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA,GAAI,GAAA,GAAM,GAAA;AAC9D,UAAA,MAAM,QAAA,GAAW,IAAA,CAAK,YAAA,CAAa,OAAO,CAAA,IAAK,EAAA;AAC/C,UAAA,IAAA,CAAK,YAAA,CAAa,SAAS,QAAA,GAAW,CAAA,QAAA,EAAW,YAAY,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAA,CAAI,CAAA;AAAA,QAC7E;AAAA,MACF,CAAA,MAAO;AAEL,QAAA,KAAA,CAAM,YAAA,CAAa,OAAA,EAAS,UAAA,CAAW,OAAA,CAAQ,eAAA,EAAiB,CAAA,OAAA,EAAU,MAAA,CAAO,GAAG,CAAC,CAAA,EAAA,CAAI,CAAA,GAAI,uBAAuB,CAAA;AACpH,QAAA,KAAA,MAAW,QAAQ,aAAA,EAAe;AAChC,UAAA,MAAM,GAAA,GAAM,IAAA,CAAK,YAAA,CAAa,eAAe,CAAA,IAAK,EAAA;AAClD,UAAA,MAAM,SAAS,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA,CAAE,IAAI,MAAM,CAAA;AACxC,UAAA,MAAM,SAAA,GAAY,OAAO,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,GAAG,CAAC,CAAA;AAClD,UAAA,MAAM,QAAA,GAAW,IAAA,CAAK,YAAA,CAAa,OAAO,CAAA,IAAK,EAAA;AAC/C,UAAA,IAAA,CAAK,aAAa,OAAA,EAAS,QAAA,GAAW,WAAW,MAAA,CAAO,SAAS,CAAC,CAAA,GAAA,CAAK,CAAA;AAAA,QACzE;AAAA,MACF;AAAA,IAGF;AAAA,EACF;AACF;AAqBO,SAAS,YAAA,CAAa,MAAc,SAAA,EAA0C;AACnF,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAElB,EAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACxC,EAAA,GAAA,CAAI,SAAA,GAAY,IAAA;AAChB,EAAA,iBAAA,CAAkB,KAAK,SAAS,CAAA;AAChC,EAAA,OAAO,GAAA,CAAI,SAAA;AACb;;;ACpZO,SAAS,eAAe,KAAA,EAAuB;AACpD,EAAA,MAAM,QAAA,GAAW,wCAAA,CAAyC,IAAA,CAAK,KAAK,CAAA;AACpE,EAAA,IAAI,QAAA,GAAW,CAAC,CAAA,IAAK,QAAA,CAAS,CAAC,CAAA,IAAK,QAAA,CAAS,CAAC,CAAA,EAAG;AAC/C,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,QAAA,CAAS,CAAC,GAAG,EAAE,CAAA;AAClC,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,QAAA,CAAS,CAAC,GAAG,EAAE,CAAA;AAClC,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,QAAA,CAAS,CAAC,GAAG,EAAE,CAAA;AAClC,IAAA,OAAO,CAAA,CAAA,EAAI,CAAA,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,EAAG,CAAA,CAAE,QAAA,CAAS,EAAE,EAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,EAAG,CAAA,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA;AAAA,EAChH;AACA,EAAA,OAAO,KAAA;AACT;;;ACsDO,IAAM,MAAA,GAAN,cAAqB,YAAA,CAA2B;AAAA;AAAA;AAAA;AAAA,EAI7C,OAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,iBAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMR,IAAI,gBAAA,GAAqC;AACvC,IAAA,OAAO,IAAA,CAAK,iBAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAA;AAAA;AAAA;AAAA;AAAA,EAKD,IAAA;AAAA;AAAA;AAAA;AAAA,EAKC,YAAA,GAAe,KAAA;AAAA;AAAA;AAAA;AAAA,EAKf,eAAA,GAAwD,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAShE,YAAY,OAAA,EAAwB;AAClC,IAAA,KAAA,EAAM;AAGN,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OAEF;AAAA,IACF;AAGA,IAAA,IAAI,CAAC,QAAQ,MAAA,KAAW,CAAC,QAAQ,UAAA,IAAc,OAAA,CAAQ,UAAA,CAAW,MAAA,KAAW,CAAA,CAAA,EAAI;AAC/E,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OAEF;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,OAAA,GAAU;AAAA,MACb,QAAA,EAAU,IAAA;AAAA,MACV,GAAG;AAAA,KACL;AAEA,IAAA,IAAA,CAAK,YAAA,EAAa;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,KAAA,GAAqB;AACvB,IAAA,OAAO,KAAK,IAAA,CAAK,KAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,MAAA,GAAiB;AACnB,IAAA,OAAO,KAAK,iBAAA,CAAkB,MAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,UAAA,GAAsB;AACxB,IAAA,OAAO,KAAK,IAAA,CAAK,QAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,OAAA,GAAmB;AACrB,IAAA,OAAO,eAAA,CAAgB,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,SAAA,GAAqB;AACvB,IAAA,OAAO,IAAA,CAAK,KAAK,QAAA,EAAS;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,WAAA,GAAuB;AACzB,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,QAAA,GAA2B;AAC7B,IAAA,OAAO,KAAK,cAAA,CAAe,QAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,KAAA,GAAyB;AACvB,IAAA,OAAO,IAAA,CAAK,eAAe,KAAA,EAAM;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,GAAA,GAAmB;AACjB,IAAA,OAAO,IAAA,CAAK,eAAe,GAAA,EAAI;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,OAAA,GAAmC;AACrC,IAAA,OAAO,KAAK,iBAAA,CAAkB,OAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,YAAA,GAA8B;AAChC,IAAA,OAAO,KAAK,iBAAA,CAAkB,YAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,iBAAA,GAAwC;AAC1C,IAAA,OAAO,KAAK,iBAAA,CAAkB,iBAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,QAAA,CACE,kBACA,UAAA,EACS;AAET,IAAA,MAAM,IAAA,GAAO,OAAO,gBAAA,KAAqB,QAAA,GAAW,mBAAmB,gBAAA,CAAiB,IAAA;AACxF,IAAA,MAAM,KAAA,GAAQ,OAAO,gBAAA,KAAqB,QAAA,GAAW,aAAa,gBAAA,CAAiB,UAAA;AAEnF,IAAA,MAAM,EAAE,OAAM,GAAI,IAAA;AAClB,IAAA,MAAM,EAAE,SAAA,EAAW,MAAA,EAAO,GAAI,KAAA;AAC9B,IAAA,MAAM,EAAE,IAAA,EAAM,EAAA,EAAI,KAAA,EAAM,GAAI,SAAA;AAG5B,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AAClC,IAAA,IAAI,QAAA,EAAU;AAEZ,MAAA,IAAI,UAAU,KAAA,EAAO;AACnB,QAAA,MAAM,WAAA,GAAc,KAAA,CAAM,WAAA,IAAe,KAAA,CAAM,KAAA,EAAM;AACrD,QAAA,MAAM,UAAU,WAAA,CAAY,IAAA,CAAK,CAAA,IAAA,KAAQ,IAAA,CAAK,SAAS,QAAQ,CAAA;AAC/D,QAAA,IAAI,CAAC,SAAS,OAAO,KAAA;AAGrB,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,MAAM,OAAO,WAAA,CAAY,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,QAAQ,CAAA;AACtD,UAAA,OAAO,OAAO,IAAA,CAAK,eAAA,CAAgB,IAAA,CAAK,KAAA,EAAO,KAAK,CAAA,GAAI,KAAA;AAAA,QAC1D;AACA,QAAA,OAAO,IAAA;AAAA,MACT;AAKA,MAAA,MAAM,KAAA,GAAQ,EAAE,iBAAA,EAAmB,KAAA,EAAO,SAAS,IAAA,EAAK;AACxD,MAAA,KAAA,CAAM,IAAI,YAAA,CAAa,IAAA,EAAM,IAAI,CAAC,IAAA,EAAM,MAAM,MAAA,KAAW;AACvD,QAAA,IAAI,KAAK,MAAA,EAAQ;AACf,UAAA,IAAI,UAAU,CAAC,MAAA,CAAO,IAAA,CAAK,cAAA,CAAe,QAAQ,CAAA,EAAG;AACnD,YAAA;AAAA,UACF;AACA,UAAA,IAAI,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,IAAK,CAAA,CAAE,IAAA,KAAS,QAAQ,CAAA,EAAG;AAC1E,YAAA;AAAA,UACF;AACA,UAAA,KAAA,CAAM,iBAAA,GAAoB,IAAA;AAC1B,UAAA,MAAM,WAAW,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,QAAQ,CAAA;AACzD,UAAA,IAAI,CAAC,QAAA,EAAU;AACb,YAAA,KAAA,CAAM,OAAA,GAAU,KAAA;AAChB,YAAA,OAAO,KAAA;AAAA,UACT;AACA,UAAA,IAAI,SAAS,CAAC,IAAA,CAAK,gBAAgB,QAAA,CAAS,KAAA,EAAO,KAAK,CAAA,EAAG;AACzD,YAAA,KAAA,CAAM,OAAA,GAAU,KAAA;AAChB,YAAA,OAAO,KAAA;AAAA,UACT;AAAA,QACF;AACA,QAAA,OAAO,IAAA;AAAA,MACT,CAAC,CAAA;AACD,MAAA,OAAO,KAAA,CAAM,qBAAqB,KAAA,CAAM,OAAA;AAAA,IAC1C;AAGA,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AAClC,IAAA,IAAI,QAAA,EAAU;AAEZ,MAAA,MAAM,UAAW,SAAA,CAAmF,IAAA;AACpG,MAAA,IAAI,OAAA,EAAS,SAAS,QAAA,EAAU;AAC9B,QAAA,OAAO,QAAQ,IAAA,CAAK,eAAA,CAAgB,OAAA,CAAQ,KAAA,EAAO,KAAK,CAAA,GAAI,IAAA;AAAA,MAC9D;AAIA,MAAA,MAAM,EAAE,KAAI,GAAI,SAAA;AAKhB,MAAA,MAAM,UAAA,GAAa,SAAS,IAAA,CAAK,KAAA,EAAO,MAAM,GAAG,CAAA,CAAE,QAAA,CAAS,MAAM,CAAA,IAAK,KAAA;AAEvE,MAAA,MAAM,UAAA,GAAa,CAAC,IAAA,KAAgC;AAClD,QAAA,KAAA,IAAS,KAAA,GAAQ,IAAA,CAAK,KAAA,EAAO,KAAA,IAAS,GAAG,KAAA,EAAA,EAAS;AAChD,UAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA;AAE5B,UAAA,IAAI,UAAA,EAAY;AACd,YAAA,MAAM,WAAA,GAAc,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,KAAA,EAAO,MAAM,GAAG,CAAA,CAAE,QAAA,CAAS,MAAM,CAAA,IAAK,KAAA;AACzE,YAAA,IAAI,WAAA,EAAa;AAEf,cAAA,IAAI,IAAA,CAAK,IAAA,KAAS,QAAA,EAAU,OAAO,KAAA;AACnC,cAAA,OAAO,QAAQ,IAAA,CAAK,eAAA,CAAgB,IAAA,CAAK,KAAA,EAAO,KAAK,CAAA,GAAI,IAAA;AAAA,YAC3D;AAAA,UACF,CAAA,MAAO;AACL,YAAA,IAAI,IAAA,CAAK,SAAS,QAAA,EAAU;AAC1B,cAAA,OAAO,QAAQ,IAAA,CAAK,eAAA,CAAgB,IAAA,CAAK,KAAA,EAAO,KAAK,CAAA,GAAI,IAAA;AAAA,YAC3D;AAAA,UACF;AAAA,QACF;AACA,QAAA,OAAO,KAAA;AAAA,MACT,CAAA;AAEA,MAAA,OAAO,UAAA,CAAW,KAAK,CAAA,IAAK,UAAA,CAAW,GAAG,CAAA;AAAA,IAC5C;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,cAAc,IAAA,EAAuC;AACnD,IAAA,MAAM,EAAE,OAAM,GAAI,IAAA;AAClB,IAAA,MAAM,EAAE,SAAA,EAAW,MAAA,EAAO,GAAI,KAAA;AAC9B,IAAA,MAAM,EAAE,OAAM,GAAI,SAAA;AAGlB,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AAClC,IAAA,IAAI,QAAA,EAAU;AAEZ,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,WAAA,IAAe,KAAA,CAAM,KAAA,EAAM;AAC/C,MAAA,MAAM,OAAO,KAAA,CAAM,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,QAAQ,CAAA;AAChD,MAAA,OAAO,OAAO,EAAE,GAAG,IAAA,CAAK,KAAA,KAAU,EAAC;AAAA,IACrC;AAGA,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AAClC,IAAA,IAAI,QAAA,EAAU;AAEZ,MAAA,KAAA,IAAS,KAAA,GAAQ,KAAA,CAAM,KAAA,EAAO,KAAA,IAAS,GAAG,KAAA,EAAA,EAAS;AACjD,QAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA;AAC7B,QAAA,IAAI,IAAA,CAAK,SAAS,QAAA,EAAU;AAC1B,UAAA,OAAO,EAAE,GAAG,IAAA,CAAK,KAAA,EAAM;AAAA,QACzB;AAAA,MACF;AACA,MAAA,OAAO,EAAC;AAAA,IACV;AAEA,IAAA,OAAO,EAAC;AAAA,EACV;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,eAAA,CACN,QACA,MAAA,EACS;AACT,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AACjD,MAAA,IAAI,MAAA,CAAO,GAAG,CAAA,KAAM,KAAA,EAAO;AACzB,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAA,GAAuB;AACrB,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,MAAA,EAAO;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,QAAQ,OAAA,EAA+D;AACrE,IAAA,MAAM,QAAA,GAAWa,mBAAAA,CAAc,UAAA,CAAW,IAAA,CAAK,MAAM,CAAA,CAAE,iBAAA;AAAA,MACrD,IAAA,CAAK,MAAM,GAAA,CAAI;AAAA,KACjB;AAEA,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACxC,IAAA,GAAA,CAAI,YAAY,QAAQ,CAAA;AAGxB,IAAA,MAAM,IAAA,GAAO,IAAI,SAAA,CAAU,OAAA;AAAA,MAAQ,kBAAA;AAAA,MAAoB,CAAC,MAAA,EAAQ,KAAA,KAC9D,SAAA,GACE,KAAA,CAAM,OAAA;AAAA,QACJ,yCAAA;AAAA,QACA,CAAC,QAAA,KAAa,cAAA,CAAe,QAAQ;AAAA,OACvC,GACA;AAAA,KACJ;AAEA,IAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,MAAA,MAAM,YAAY,OAAO,OAAA,CAAQ,MAAA,KAAW,QAAA,GAAW,QAAQ,MAAA,GAAS,MAAA;AACxE,MAAA,OAAO,YAAA,CAAa,MAAM,SAAS,CAAA;AAAA,IACrC;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAA,CAAQ,OAAA,GAAuC,EAAC,EAAW;AACzD,IAAA,MAAM,EAAE,cAAA,GAAiB,MAAA,EAAO,GAAI,OAAA;AACpC,IAAA,OAAO,IAAA,CAAK,MAAM,GAAA,CAAI,WAAA;AAAA,MACpB,CAAA;AAAA,MACA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,OAAA,CAAQ,IAAA;AAAA,MACvB;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,WAAW,OAAA,EAA2B;AAC5C,IAAA,MAAM,EAAA,GAAK,KAAK,KAAA,CAAM,EAAA;AACtB,IAAA,OAAO,OAAA,CAAQ;AAAA,MACb,MAAA,EAAQ,IAAA;AAAA,MACR,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,EAAA;AAAA,MACA,QAAA,EAAU,CAAC,CAAA,KAAM;AAAE,QAAA,IAAA,CAAK,IAAA,CAAK,SAAS,CAAC,CAAA;AAAA,MAAG,CAAA;AAAA,MAC1C,KAAA,EAAO,MAAM,IAAA,CAAK,KAAA,EAAM;AAAA,MACxB,GAAA,EAAK,MAAM,IAAA,CAAK,GAAA,EAAI;AAAA,MACpB,UAAU,IAAA,CAAK;AAAA,KAChB,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,UAAA,CAAW,OAAA,EAAkB,UAAA,GAAa,IAAA,EAAe;AACvD,IAAA,OAAO,KAAK,UAAA,CAAW,UAAA,CAAkB,SAAS,EAAE,UAAA,EAAY,CAAC,CAAA;AAAA,EACnE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,YAAA,CAAa,aAAa,IAAA,EAAe;AACvC,IAAA,OAAO,KAAK,UAAA,CAAW,YAAA,CAAoB,EAAE,UAAA,EAAY,CAAC,CAAA;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,YAAY,QAAA,EAAyB;AACnC,IAAA,IAAA,CAAK,QAAQ,QAAA,GAAW,QAAA;AAGxB,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,eAAA,CAAgB,eAAe,CAAA;AAAA,IAC/C,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,YAAA,CAAa,eAAA,EAAiB,MAAM,CAAA;AAAA,IACpD;AAIA,IAAA,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,EAAE,CAAA;AAEhC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KAAA,CAAM,WAA0B,IAAA,EAAY;AAC1C,IAAA,IAAA,CAAK,UAAA,CAAW,KAAA,CAAa,QAAQ,CAAC,CAAA;AACtC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,IAAA,GAAa;AACX,IAAA,IAAA,CAAK,UAAA,CAAW,MAAa,CAAA;AAC7B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,eAAe,MAAA,EAAsB;AAEnC,IAAA,IAAI,OAAO,IAAA,CAAK,GAAA,EAAK,IAAI,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA,EAAG;AAE3C,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY;AAAA,MAC3C,SAAS,CAAC,GAAG,KAAK,IAAA,CAAK,KAAA,CAAM,SAAS,MAAM;AAAA,KAC7C,CAAA;AACD,IAAA,IAAA,CAAK,IAAA,CAAK,YAAY,QAAQ,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,iBAAiB,GAAA,EAAsB;AACrC,IAAA,MAAM,cAAA,GAAiB,GAAA,CAAI,GAAA,CAAI,IAAA,CAAK,KAAK,KAAK,CAAA;AAC9C,IAAA,IAAI,CAAC,cAAA,EAAgB;AAErB,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY;AAAA,MAC3C,OAAA,EAAS,KAAK,IAAA,CAAK,KAAA,CAAM,QAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,KAAM,cAAc;AAAA,KACpE,CAAA;AACD,IAAA,IAAA,CAAK,IAAA,CAAK,YAAY,QAAQ,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAA,GAAgB;AACd,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,KAAK,eAAA,EAAiB;AACxB,MAAA,YAAA,CAAa,KAAK,eAAe,CAAA;AACjC,MAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AAAA,IACzB;AAEA,IAAA,IAAA,CAAK,KAAK,SAAS,CAAA;AACnB,IAAA,IAAA,CAAK,QAAQ,SAAA,IAAY;AAGzB,IAAA,IAAA,CAAK,KAAK,OAAA,EAAQ;AAGlB,IAAA,IAAA,CAAK,kBAAkB,OAAA,EAAQ;AAG/B,IAAA,IAAA,CAAK,kBAAA,EAAmB;AAExB,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,wBAAA,CACN,WACA,MAAA,EACwC;AACxC,IAAA,OAAO;AAAA,MACL,mBAAA,EAAqB;AAAA,QACnB,iBAAA,EAAmB,CAAC,QAAA,EAAmB,OAAA,KAAsC;AAC3E,UAAA,MAAM,IAAA,GAAOA,mBAAAA,CAAc,UAAA,CAAW,MAAM,CAAA;AAC5C,UAAA,MAAM,GAAA,GAAM,IAAA,CAAK,iBAAA,CAAkB,QAAA,EAAsB,OAAO,CAAA;AAChE,UAAA,MAAM,OAAA,GAAU,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC5C,UAAA,OAAA,CAAQ,YAAY,GAAG,CAAA;AACvB,UAAA,OAAA,CAAQ,SAAA,GAAY,SAAA,CAAU,OAAA,CAAQ,SAAS,CAAA;AAC/C,UAAA,MAAM,IAAA,GAAO,SAAS,sBAAA,EAAuB;AAC7C,UAAA,OAAO,OAAA,CAAQ,UAAA,EAAY,IAAA,CAAK,WAAA,CAAY,QAAQ,UAAU,CAAA;AAC9D,UAAA,OAAO,IAAA;AAAA,QACT;AAAA;AACF,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAA,GAAqB;AAE3B,IAAA,IAAA,CAAK,IAAA,CAAK,cAAA,EAAgB,EAAE,MAAA,EAAQ,MAAM,CAAA;AAC1C,IAAA,IAAA,CAAK,OAAA,CAAQ,cAAA,GAAiB,EAAE,MAAA,EAAQ,MAAM,CAAA;AAI9C,IAAA,IAAA,CAAK,oBAAoB,IAAI,gBAAA;AAAA,MAC3B;AAAA,QACE,UAAA,EAAY,KAAK,OAAA,CAAQ,UAAA;AAAA,QACzB,MAAA,EAAQ,KAAK,OAAA,CAAQ;AAAA,OACvB;AAAA,MACA;AAAA,KACF;AAGA,IAAA,IAAA,CAAK,kBAAkB,kBAAA,EAAmB;AAE1C,IAAA,IAAA,CAAK,kBAAkB,cAAA,EAAe;AAGtC,IAAA,IAAI,GAAA;AACJ,IAAA,IAAI;AACF,MAAA,GAAA,GAAM,cAAA;AAAA,QACJ,IAAA,CAAK,QAAQ,OAAA,IAAW,IAAA;AAAA,QACxB,KAAK,iBAAA,CAAkB;AAAA,OACzB;AAAA,IACF,SAAS,KAAA,EAAO;AAEd,MAAA,MAAM,YAAA,GAAe,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AAC7E,MAAA,IAAA,CAAK,KAAK,cAAA,EAAgB;AAAA,QACxB,MAAA,EAAQ,IAAA;AAAA,QACR,KAAA,EAAO,YAAA;AAAA,QACP,OAAA,EAAS,KAAK,OAAA,CAAQ;AAAA,OACvB,CAAA;AACD,MAAA,IAAA,CAAK,QAAQ,cAAA,GAAiB;AAAA,QAC5B,MAAA,EAAQ,IAAA;AAAA,QACR,KAAA,EAAO,YAAA;AAAA,QACP,OAAA,EAAS,KAAK,OAAA,CAAQ;AAAA,OACvB,CAAA;AAGD,MAAA,GAAA,GAAM,cAAA,CAAe,IAAA,EAAM,IAAA,CAAK,iBAAA,CAAkB,MAAM,CAAA;AAAA,IAC1D;AAEA,IAAA,MAAM,OAAA,GAAU,KAAK,iBAAA,CAAkB,OAAA;AAGvC,IAAA,MAAMd,OAAA,GAAQ+B,kBAAY,MAAA,CAAO;AAAA,MAC/B,MAAA,EAAQ,KAAK,iBAAA,CAAkB,MAAA;AAAA,MAC/B,GAAA;AAAA,MACA;AAAA,KACD,CAAA;AAGD,IAAA,MAAM,UAAU,IAAA,CAAK,OAAA,CAAQ,OAAA,IAAW,QAAA,CAAS,cAAc,KAAK,CAAA;AAGpE,IAAA,MAAM,SAAA,GAAY,KAAK,iBAAA,CAAkB,SAAA;AACzC,IAAA,IAAA,CAAK,IAAA,GAAO,IAAIE,eAAA,CAAW,OAAA,EAAS;AAAA,aAClCjC,OAAA;AAAA,MACA,mBAAA,EAAqB,IAAA,CAAK,mBAAA,CAAoB,IAAA,CAAK,IAAI,CAAA;AAAA,MACvD,QAAA,EAAU,MAAM,IAAA,CAAK,OAAA,CAAQ,QAAA,IAAY,IAAA;AAAA,MACzC,YAAY,OAAO;AAAA,QACjB,IAAA,EAAM,SAAA;AAAA,QACN,gBAAA,EAAkB,MAAA;AAAA,QAClB,YAAA,EAAc,IAAA,CAAK,OAAA,CAAQ,SAAA,IAAa,kBAAA;AAAA,QACxC,GAAK,KAAK,OAAA,CAAQ,QAAA,IAAY,OAAQ,EAAC,GAAI,EAAE,eAAA,EAAiB,MAAA;AAAO,OACvE,CAAA;AAAA,MACA,GAAI,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA,CAAE,SAAS,CAAA,GAAI,EAAE,SAAA,EAAU,GAAI,EAAC;AAAA;AAAA,MAEzD,GAAI,IAAA,CAAK,OAAA,CAAQ,sBAAA,GACb,IAAA,CAAK,wBAAA,CAAyB,IAAA,CAAK,OAAA,CAAQ,sBAAA,EAAwB,IAAA,CAAK,iBAAA,CAAkB,MAAM,IAChG,EAAC;AAAA;AAAA,MAEL,eAAA,EAAiB;AAAA,QACf,KAAA,EAAO,CAAC,KAAA,EAAO,KAAA,KAAU;AACvB,UAAA,IAAA,CAAK,KAAK,OAAA,EAAS,EAAE,MAAA,EAAQ,IAAA,EAAM,OAAc,CAAA;AACjD,UAAA,IAAA,CAAK,QAAQ,OAAA,GAAU,EAAE,MAAA,EAAQ,IAAA,EAAM,OAAc,CAAA;AACrD,UAAA,IAAA,CAAK,iBAAA,CAAkB,WAAA,CAAY,EAAE,KAAA,EAAO,CAAA;AAC5C,UAAA,OAAO,KAAA;AAAA,QACT,CAAA;AAAA,QACA,IAAA,EAAM,CAAC,KAAA,EAAO,KAAA,KAAU;AACtB,UAAA,IAAA,CAAK,KAAK,MAAA,EAAQ,EAAE,MAAA,EAAQ,IAAA,EAAM,OAAc,CAAA;AAChD,UAAA,IAAA,CAAK,QAAQ,MAAA,GAAS,EAAE,MAAA,EAAQ,IAAA,EAAM,OAAc,CAAA;AACpD,UAAA,IAAA,CAAK,iBAAA,CAAkB,UAAA,CAAW,EAAE,KAAA,EAAO,CAAA;AAC3C,UAAA,OAAO,KAAA;AAAA,QACT;AAAA;AACF,KACD,CAAA;AAGD,IAAA,IAAA,CAAK,IAAA,CAAK,SAAS,EAAE,MAAA,EAAQ,MAAM,IAAA,EAAM,IAAA,CAAK,MAAM,CAAA;AACpD,IAAA,IAAA,CAAK,OAAA,CAAQ,UAAU,EAAE,MAAA,EAAQ,MAAM,IAAA,EAAM,IAAA,CAAK,MAAM,CAAA;AAGxD,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAI,cAAA,CAAe,IAAI,CAAA;AAG7C,IAAA,IAAI,IAAA,CAAK,QAAQ,SAAA,EAAW;AAG1B,MAAA,IAAA,CAAK,eAAA,GAAkB,WAAW,MAAM;AACtC,QAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AACvB,QAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACtB,UAAA,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAA;AAAA,QACnC;AAAA,MACF,GAAG,CAAC,CAAA;AAAA,IACN;AAGA,IAAA,IAAA,CAAK,EAAA,CAAG,OAAA,EAAS,CAAC,KAAA,KAAU;AAC1B,MAAA,IAAA,CAAK,OAAA,CAAQ,UAAU,KAAK,CAAA;AAAA,IAC9B,CAAC,CAAA;AAGD,IAAA,IAAA,CAAK,IAAA,CAAK,QAAA,EAAU,EAAE,MAAA,EAAQ,MAAM,CAAA;AACpC,IAAA,IAAA,CAAK,OAAA,CAAQ,QAAA,GAAW,EAAE,MAAA,EAAQ,MAAM,CAAA;AACxC,IAAA,IAAA,CAAK,kBAAkB,YAAA,EAAa;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAAoB,WAAA,EAAgC;AAC1D,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,MAAM,WAAW,CAAA;AAGlD,IAAA,IAAA,CAAK,IAAA,CAAK,YAAY,QAAQ,CAAA;AAG9B,IAAA,IAAA,CAAK,KAAK,aAAA,EAAe,EAAE,MAAA,EAAQ,IAAA,EAAM,aAAa,CAAA;AACtD,IAAA,IAAA,CAAK,QAAQ,aAAA,GAAgB,EAAE,MAAA,EAAQ,IAAA,EAAM,aAAa,CAAA;AAC1D,IAAA,IAAA,CAAK,iBAAA,CAAkB,iBAAA,CAAkB,EAAE,WAAA,EAAa,CAAA;AAGxD,IAAA,MAAM,UAAA,GAAa,WAAA,CAAY,OAAA,CAAQ,YAAY,CAAA;AAGnD,IAAA,IAAI,CAAC,WAAA,CAAY,UAAA,IAAc,WAAA,CAAY,YAAA,EAAc;AACvD,MAAA,IAAA,CAAK,KAAK,iBAAA,EAAmB,EAAE,MAAA,EAAQ,IAAA,EAAM,aAAa,CAAA;AAC1D,MAAA,IAAA,CAAK,QAAQ,iBAAA,GAAoB,EAAE,MAAA,EAAQ,IAAA,EAAM,aAAa,CAAA;AAC9D,MAAA,IAAA,CAAK,kBAAkB,qBAAA,EAAsB;AAAA,IAC/C;AAGA,IAAA,IAAI,WAAA,CAAY,UAAA,IAAc,CAAC,UAAA,EAAY;AACzC,MAAA,IAAA,CAAK,KAAK,QAAA,EAAU,EAAE,MAAA,EAAQ,IAAA,EAAM,aAAa,CAAA;AACjD,MAAA,IAAA,CAAK,QAAQ,QAAA,GAAW,EAAE,MAAA,EAAQ,IAAA,EAAM,aAAa,CAAA;AACrD,MAAA,IAAA,CAAK,kBAAkB,YAAA,EAAa;AAAA,IACtC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKS,IAAA,CACP,UACG,IAAA,EACG;AACN,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,KAAA,EAAO,GAAG,IAAI,CAAA;AAAA,EAClC;AACF;ACnuBO,SAAS,gBAAA,CACd,SAAA,EACA,QAAA,EACA,OAAA,EACY;AACZ,EAAA,MAAM,YAAA,GAAe,SAAS,SAAA,IAAa,QAAA;AAC3C,EAAA,MAAM,UAAA,GAAa,SAAS,OAAA,IAAW,EAAA;AACvC,EAAA,MAAM,UAAA,GAAa;AAAA,IACjBgB,UAAA,CAAO,OAAA,EAAS,WAAA,IAAe,CAAC,CAAA;AAAA,IAChCkB,QAAA,CAAK,EAAE,OAAA,EAAS,UAAA,EAAY,CAAA;AAAA,IAC5BC,SAAA,CAAM,EAAE,OAAA,EAAS,UAAA,EAAY,CAAA;AAAA,IAC7BC,QAAA;AAAK,GACP;AAEA,EAAA,MAAM,SAAS,MAAY;AACzB,IAAA,KAAKC,mBAAA;AAAA,MACH,SAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,QACE,QAAA,EAAU,OAAA;AAAA,QACV,SAAA,EAAW,YAAA;AAAA,QACX;AAAA;AACF,MACA,IAAA,CAAK,CAAC,EAAE,CAAA,EAAG,CAAA,EAAG,gBAAe,KAAM;AAGnC,MAAA,MAAA,CAAO,MAAA,CAAO,SAAS,KAAA,EAAO;AAAA,QAC5B,IAAA,EAAM,GAAA;AAAA,QACN,GAAA,EAAK,GAAA;AAAA,QACL,SAAA,EAAW,eAAe,MAAA,CAAO,CAAC,CAAC,CAAA,GAAA,EAAM,MAAA,CAAO,CAAC,CAAC,CAAA,KAAA;AAAA,OACnD,CAAA;AAGD,MAAA,MAAM,MAAA,GAAS,eAAe,IAAA,EAAM,eAAA;AACpC,MAAA,QAAA,CAAS,KAAA,CAAM,UAAA,GAAa,MAAA,GAAS,QAAA,GAAW,EAAA;AAAA,IAClD,CAAC,CAAA;AAAA,EACH,CAAA;AAUA,EAAA,MAAM,WAAA,GAAc,SAAS,WAAA,IAAe,IAAA;AAC5C,EAAA,OAAOC,cAAA,CAAW,SAAA,EAAsB,QAAA,EAAU,MAAA,EAAQ;AAAA,IACxD,cAAA,EAAgB,KAAA;AAAA,IAChB,cAAA,EAAgB;AAAA,GACjB,CAAA;AACH;AAiBO,SAAS,oBAAA,CACd,SAAA,EACA,QAAA,EACA,OAAA,EACY;AACZ,EAAA,MAAM,YAAA,GAAe,SAAS,SAAA,IAAa,QAAA;AAC3C,EAAA,MAAM,UAAA,GAAa,SAAS,OAAA,IAAW,EAAA;AACvC,EAAA,MAAM,UAAA,GAAa;AAAA,IACjBtB,UAAA,CAAO,OAAA,EAAS,WAAA,IAAe,CAAC,CAAA;AAAA,IAChCkB,QAAA,CAAK,EAAE,OAAA,EAAS,UAAA,EAAY,CAAA;AAAA,IAC5BC,SAAA,CAAM,EAAE,OAAA,EAAS,UAAA,EAAY;AAAA,GAC/B;AAEA,EAAA,MAAM,SAAS,MAAY;AACzB,IAAA,KAAKE,mBAAA;AAAA,MACH,SAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,QACE,QAAA,EAAU,UAAA;AAAA,QACV,SAAA,EAAW,YAAA;AAAA,QACX;AAAA;AACF,MACA,IAAA,CAAK,CAAC,EAAE,CAAA,EAAG,GAAE,KAAM;AACnB,MAAA,MAAA,CAAO,MAAA,CAAO,SAAS,KAAA,EAAO;AAAA,QAC5B,IAAA,EAAM,GAAA;AAAA,QACN,GAAA,EAAK,GAAA;AAAA,QACL,SAAA,EAAW,CAAA,YAAA,EAAe,MAAA,CAAO,IAAA,CAAK,MAAM,CAAC,CAAC,CAAC,CAAA,GAAA,EAAM,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAC,CAAA,KAAA;AAAA,OAC3E,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH,CAAA;AAKA,EAAA,MAAM,WAAA,GAAc,SAAS,WAAA,IAAe,IAAA;AAC5C,EAAA,OAAOC,cAAA,CAAW,SAAA,EAAsB,QAAA,EAAU,MAAA,EAAQ;AAAA,IACxD,cAAA,EAAgB,WAAA;AAAA,IAChB,WAAA,EAAa;AAAA,GACd,CAAA;AACH;;;ACzJA,eAAsB,iBAAiB,IAAA,EAAgC;AAMrE,EAAA,IAAI,OAAO,SAAA,KAAc,WAAA,IAAe,SAAA,CAAU,WAAW,SAAA,EAAW;AACtE,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,CAAU,SAAA,CAAU,SAAA,CAAU,IAAI,CAAA;AACxC,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAGA,EAAA,IAAI,OAAO,QAAA,KAAa,WAAA,EAAa,OAAO,KAAA;AAE5C,EAAA,MAAM,QAAA,GAAW,QAAA,CAAS,aAAA,CAAc,UAAU,CAAA;AAClD,EAAA,QAAA,CAAS,KAAA,GAAQ,IAAA;AAEjB,EAAA,QAAA,CAAS,MAAM,QAAA,GAAW,OAAA;AAC1B,EAAA,QAAA,CAAS,MAAM,GAAA,GAAM,SAAA;AACrB,EAAA,QAAA,CAAS,MAAM,IAAA,GAAO,SAAA;AACtB,EAAA,QAAA,CAAS,MAAM,OAAA,GAAU,GAAA;AACzB,EAAA,QAAA,CAAS,YAAA,CAAa,YAAY,EAAE,CAAA;AACpC,EAAA,QAAA,CAAS,IAAA,CAAK,YAAY,QAAQ,CAAA;AAElC,EAAA,IAAI;AACF,IAAA,QAAA,CAAS,MAAA,EAAO;AAChB,IAAA,QAAA,CAAS,iBAAA,CAAkB,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA;AAMzC,IAAA,OAAO,QAAA,CAAS,YAAY,MAAM,CAAA;AAAA,EACpC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT,CAAA,SAAE;AACA,IAAA,QAAA,CAAS,MAAA,EAAO;AAAA,EAClB;AACF;;;AC/CO,SAAS,cAAA,CAAe,MAAwB,MAAA,EAAuB;AAC5E,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,MAAA,CAAO,SAAA,CAAU,OAAA,CAAQ,CAAC,GAAA,KAAQ;AAChC,IAAA,IAAI,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG,KAAA,CAAM,KAAK,GAAG,CAAA;AAAA,EACjD,CAAC,CAAA;AACD,EAAA,KAAA,MAAW,GAAA,IAAO,KAAA,EAAO,MAAA,CAAO,SAAA,CAAU,OAAO,GAAG,CAAA;AAEpD,EAAA,MAAM,MAAA,GAAS,KAAK,GAAA,CAAI,OAAA,CAAQ,sBAAsB,CAAA,IAAK,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,YAAY,CAAA;AACxF,EAAA,IAAI,CAAC,MAAA,EAAQ;AACb,EAAA,MAAA,CAAO,SAAA,CAAU,OAAA,CAAQ,CAAC,GAAA,KAAQ;AAChC,IAAA,IAAI,IAAI,UAAA,CAAW,WAAW,GAAG,MAAA,CAAO,SAAA,CAAU,IAAI,GAAG,CAAA;AAAA,EAC3D,CAAC,CAAA;AACH;;;ACrBA,IAAM,iBAAA,GAAoB,gBAAA;AAE1B,IAAM,mBAAA,GAAyC,OAAO,MAAA,CAAO;AAAA,EAC3D,MAAA;AAAA,EAAQ,QAAA;AAAA,EAAU,WAAA;AAAA,EAAa,QAAA;AAAA,EAAU,MAAA;AAAA,EACzC,GAAA;AAAA,EAAK,MAAA;AAAA,EACL,GAAA;AAAA,EAAK;AACP,CAAC,CAAA;AAED,IAAM,qBAAA,GAA2C,OAAO,MAAA,CAAO;AAAA,EAC7D,MAAA;AAAA,EAAQ,QAAA;AAAA,EAAU,WAAA;AAAA,EAAa,QAAA;AAAA,EAAU,MAAA;AAAA,EACzC,GAAA;AAAA,EAAK;AACP,CAAC,CAAA;AAWM,SAAS,sBACd,MAAA,EAC0B;AAC1B,EAAA,MAAM,eAAe,MAAA,CAAO,IAAA,CAAK,IAAI,OAAA,CAAQ,GAAA,GAAM,iBAAiB,CAAA,KAAM,IAAA;AAC1E,EAAA,MAAM,IAAA,GAAO,eAAe,mBAAA,GAAsB,qBAAA;AAClD,EAAA,OAAO,EAAE,IAAA,EAAM,CAAC,GAAG,IAAI,CAAA,EAAE;AAC3B;;;AC3BA,IAAMT,mCAAkB,IAAI,GAAA,CAAI,CAAC,UAAA,EAAY,UAAU,CAAC,CAAA;AACxD,IAAM,qCAAqB,IAAI,GAAA,CAAI,CAAC,YAAA,EAAc,aAAA,EAAe,UAAU,CAAC,CAAA;AAyCrE,SAAS,sBACd,IAAA,EAC6B;AAC7B,EAAA,MAAM,EAAE,EAAA,EAAI,UAAA,EAAY,aAAA,EAAe,SAAA,EAAW,aAAY,GAAI,IAAA;AAElE,EAAA,IAAI,UAAA,GAAa,CAAA,IAAK,UAAA,IAAc,EAAA,CAAG,GAAA,CAAI,QAAQ,IAAA,EAAM,OAAO,EAAE,EAAA,EAAI,KAAA,EAAM;AAC5E,EAAA,MAAM,OAAA,GAAU,EAAA,CAAG,GAAA,CAAI,MAAA,CAAO,UAAU,CAAA;AACxC,EAAA,IAAI,CAAC,OAAA,IAAW,CAAC,kBAAA,CAAmB,GAAA,CAAI,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,EAAG,OAAO,EAAE,EAAA,EAAI,KAAA,EAAM;AAC/E,EAAA,IAAI,QAAQ,UAAA,KAAe,CAAA,EAAG,OAAO,EAAE,IAAI,KAAA,EAAM;AAEjD,EAAA,IAAI,UAAA;AACJ,EAAA,IAAI,eAAA;AACJ,EAAA,IAAI,kBAAkB,MAAA,EAAW;AAC/B,IAAA,IAAI,aAAA,GAAgB,CAAA,IAAK,aAAA,IAAiB,EAAA,CAAG,GAAA,CAAI,QAAQ,IAAA,EAAM,OAAO,EAAE,EAAA,EAAI,KAAA,EAAM;AAClF,IAAA,MAAM,SAAA,GAAY,EAAA,CAAG,GAAA,CAAI,MAAA,CAAO,aAAa,CAAA;AAC7C,IAAA,IAAI,CAAC,SAAA,IAAa,CAACA,gBAAAA,CAAgB,GAAA,CAAI,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA,EAAG,OAAO,EAAE,EAAA,EAAI,KAAA,EAAM;AAIhF,IAAA,IAAI,gBAAgB,UAAA,GAAa,CAAA,IAAK,aAAA,IAAiB,UAAA,GAAa,QAAQ,QAAA,EAAU;AACpF,MAAA,OAAO,EAAE,IAAI,KAAA,EAAM;AAAA,IACrB;AACA,IAAA,UAAA,GAAa,SAAA;AACb,IAAA,eAAA,GAAkB,aAAA;AAAA,EACpB,CAAA,MAAO;AACL,IAAA,MAAM,OAAO,OAAA,CAAQ,SAAA;AACrB,IAAA,IAAI,CAAC,IAAA,IAAQ,CAACA,gBAAAA,CAAgB,GAAA,CAAI,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,EAAG,OAAO,EAAE,EAAA,EAAI,KAAA,EAAM;AACtE,IAAA,IAAI,MAAM,UAAA,GAAa,CAAA;AACvB,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,UAAA,GAAa,GAAG,CAAA,EAAA,EAAK;AAC/C,MAAA,GAAA,IAAO,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAA,CAAE,QAAA;AAAA,IAC1B;AACA,IAAA,UAAA,GAAa,IAAA;AACb,IAAA,eAAA,GAAkB,GAAA;AAAA,EACpB;AAEA,EAAA,IAAI,CAAC,WAAW,cAAA,CAAe,UAAA,CAAW,YAAY,UAAA,CAAW,UAAA,EAAY,SAAA,CAAU,IAAI,CAAA,EAAG;AAC5F,IAAA,OAAO,EAAE,IAAI,KAAA,EAAM;AAAA,EACrB;AAKA,EAAA,MAAM,oBAAA,GAAuB,eAAA,GAAkB,UAAA,CAAW,QAAA,GAAW,CAAA;AAErE,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,MAAM,EAAE,IAAA,EAAM,EAAA,EAAG,GAAI,WAAA;AAIrB,IAAA,IAAI,oBAAA,IAAwB,IAAA,IAAQ,oBAAA,IAAwB,EAAA,EAAI;AAC9D,MAAA,OAAO,EAAE,IAAI,KAAA,EAAM;AAAA,IACrB;AACA,IAAA,EAAA,CAAG,MAAA,CAAO,MAAM,EAAE,CAAA;AAClB,IAAA,MAAM,iBAAA,GACJ,oBAAA,GAAuB,IAAA,GAAO,oBAAA,IAAwB,KAAK,IAAA,CAAA,GAAQ,oBAAA;AACrE,IAAA,EAAA,CAAG,MAAA,CAAO,mBAAmB,SAAS,CAAA;AACtC,IAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,UAAA,EAAY,iBAAA,EAAkB;AAAA,EACnD;AAEA,EAAA,EAAA,CAAG,MAAA,CAAO,sBAAsB,SAAS,CAAA;AACzC,EAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,UAAA,EAAY,oBAAA,EAAqB;AACtD;AC9FO,SAAS,8BAAA,CACd7B,OAAA,EACA,QAAA,EACA,GAAA,EACS;AACT,EAAA,IAAI,CAAC,GAAA,CAAI,gBAAA,IAAoB,CAAC,GAAA,CAAI,kBAAkB,OAAO,KAAA;AAE3D,EAAA,MAAM,EAAE,KAAA,EAAM,GAAIA,OAAA,CAAM,SAAA;AAExB,EAAA,IAAI,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,IAAA,KAAS,aAAa,OAAO,KAAA;AACnD,EAAA,IAAI,KAAA,CAAM,MAAA,CAAO,OAAA,CAAQ,IAAA,KAAS,GAAG,OAAO,KAAA;AAE5C,EAAA,MAAM,aAAA,GAAgBA,OAAA,CAAM,MAAA,CAAO,KAAA,CAAM,WAAW,CAAA;AACpD,EAAA,IAAI,CAAC,eAAe,OAAO,KAAA;AAG3B,EAAA,MAAM,KAAA,GAAQ,MAAM,UAAA,EAAW;AAC/B,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,MAAM,MAAA,GAASoB,qBAAW,KAAK,CAAA;AAC/B,IAAA,IAAI,WAAW,IAAA,EAAM;AACnB,MAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AACtB,MAAA,MAAMmB,GAAAA,GAAKvC,OAAA,CAAM,EAAA,CAAG,IAAA,CAAK,OAAO,MAAM,CAAA;AACtC,MAAA,MAAM,YAAA,GAAe,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,KAAK,CAAA;AAC7C,MAAA,MAAM,YAAA,GAAeuC,GAAAA,CAAG,OAAA,CAAQ,GAAA,CAAI,YAAY,CAAA;AAChD,MAAAA,GAAAA,CAAG,aAAatC,mBAAAA,CAAc,MAAA,CAAOsC,IAAG,GAAA,EAAK,YAAA,GAAe,CAAC,CAAC,CAAA;AAC9D,MAAA,QAAA,CAASA,GAAAA,CAAG,gBAAgB,CAAA;AAC5B,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAKA,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,KAAK,CAAA;AAC1C,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,KAAA,CAAM,KAAA,CAAM,KAAK,CAAA;AAEvC,EAAA,MAAM,QAAA,GAAWvC,OAAA,CAAM,GAAA,CAAI,MAAA,CAAO,IAAI,OAAO,CAAA;AAC7C,EAAA,IAAI,CAAC,UAAU,OAAO,KAAA;AACtB,EAAA,MAAM,OAAA,GAAU,GAAA,CAAI,OAAA,GAAU,QAAA,CAAS,QAAA;AAEvC,EAAA,MAAM,WAAA,GAAcA,OAAA,CAAM,GAAA,CAAI,MAAA,CAAO,IAAI,UAAU,CAAA;AACnD,EAAA,IAAI,CAAC,aAAa,OAAO,KAAA;AACzB,EAAA,MAAM,UAAA,GAAa,GAAA,CAAI,UAAA,GAAa,WAAA,CAAY,QAAA;AAEhD,EAAA,MAAM,UAAA,GAAa,GAAA,CAAI,kBAAA,KAAuB,WAAA,CAAY,UAAA,GAAa,CAAA;AAIvE,EAAA,MAAM,kBAAA,GAAqB,IAAI,SAAA,GAAY,CAAA;AAC3C,EAAA,IAAI,kBAAA,GAAqB,GAAG,OAAO,KAAA;AACnC,EAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,IAAA,CAAK,kBAAkB,CAAA;AACnD,EAAA,MAAM,oBAAA,GAAuB,KAAA,CAAM,KAAA,CAAM,kBAAkB,CAAA;AAC3D,EAAA,IACE,CAAC,aAAA,CAAc,cAAA;AAAA,IACb,oBAAA,GAAuB,CAAA;AAAA,IACvB,oBAAA,GAAuB,CAAA;AAAA,IACvB;AAAA,GACF,EACA;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAEtB,EAAA,MAAM,OAAA,GAAU,cAAc,MAAA,EAAO;AACrC,EAAA,MAAM,KAAKA,OAAA,CAAM,EAAA;AAEjB,EAAA,IAAI,UAAA,EAAY;AAEd,IAAA,EAAA,CAAG,MAAA,CAAO,WAAW,OAAO,CAAA;AAC5B,IAAA,MAAM,SAAA,GAAY,EAAA,CAAG,OAAA,CAAQ,GAAA,CAAI,UAAU,CAAA;AAC3C,IAAA,EAAA,CAAG,MAAA,CAAO,WAAW,OAAO,CAAA;AAC5B,IAAA,EAAA,CAAG,aAAaC,mBAAAA,CAAc,MAAA,CAAO,GAAG,GAAA,EAAK,SAAA,GAAY,CAAC,CAAC,CAAA;AAAA,EAC7D,CAAA,MAAO;AAEL,IAAA,EAAA,CAAG,MAAA,CAAO,WAAW,OAAO,CAAA;AAC5B,IAAA,MAAM,OAAA,GAAU,EAAA,CAAG,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA;AACtC,IAAA,EAAA,CAAG,KAAA,CAAM,SAAS,CAAC,CAAA;AACnB,IAAA,MAAM,YAAY,OAAA,GAAU,CAAA;AAC5B,IAAA,EAAA,CAAG,MAAA,CAAO,WAAW,OAAO,CAAA;AAC5B,IAAA,EAAA,CAAG,aAAaA,mBAAAA,CAAc,MAAA,CAAO,GAAG,GAAA,EAAK,SAAA,GAAY,CAAC,CAAC,CAAA;AAAA,EAC7D;AAEA,EAAA,QAAA,CAAS,EAAA,CAAG,gBAAgB,CAAA;AAC5B,EAAA,OAAO,IAAA;AACT;ACvFO,SAAS,yBAAA,CACdD,OAAA,EACA,QAAA,EACA,GAAA,EACS;AACT,EAAA,IAAI,CAAC,GAAA,CAAI,gBAAA,IAAoB,CAAC,GAAA,CAAI,kBAAkB,OAAO,KAAA;AAE3D,EAAA,MAAM,aAAA,GAAgBA,OAAA,CAAM,MAAA,CAAO,KAAA,CAAM,WAAW,CAAA;AACpD,EAAA,IAAI,CAAC,eAAe,OAAO,KAAA;AAE3B,EAAA,MAAM,EAAE,KAAA,EAAM,GAAIA,OAAA,CAAM,SAAA;AAExB,EAAA,IAAI,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,IAAA,KAAS,aAAa,OAAO,KAAA;AACnD,EAAA,IAAI,KAAA,CAAM,MAAA,CAAO,OAAA,CAAQ,IAAA,KAAS,GAAG,OAAO,KAAA;AAE5C,EAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAEtB,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,KAAA,CAAM,KAAA,CAAM,KAAK,CAAA;AACzC,EAAA,MAAM,KAAKA,OAAA,CAAM,EAAA,CAAG,OAAO,SAAA,EAAW,aAAA,CAAc,QAAQ,CAAA;AAC5D,EAAA,EAAA,CAAG,aAAaC,mBAAAA,CAAc,MAAA,CAAO,GAAG,GAAA,EAAK,SAAA,GAAY,CAAC,CAAC,CAAA;AAC3D,EAAA,QAAA,CAAS,EAAA,CAAG,gBAAgB,CAAA;AAC5B,EAAA,OAAO,IAAA;AACT;ACYO,SAAS,kBAAA,CACd,OACA,EAAA,EACgC;AAChC,EAAA,IAAI,CAAC,EAAA,CAAG,SAAA,CAAU,KAAA,EAAO,OAAO,IAAA;AAChC,EAAA,IAAI,EAAA,CAAG,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAElC,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,EAAA,CAAG,SAAA;AACrB,EAAA,MAAM,aAAA,GAAgB,0BAA0B,KAAK,CAAA;AACrD,EAAA,IAAI,aAAA,KAAkB,IAAI,OAAO,IAAA;AACjC,EAAA,IAAI,KAAA,CAAM,KAAA,CAAM,aAAa,CAAA,KAAM,GAAG,OAAO,IAAA;AAE7C,EAAA,MAAM,YAAY,aAAA,GAAgB,CAAA;AAClC,EAAA,MAAM,YAAA,GAAe,KAAA,CAAM,IAAA,CAAK,aAAa,CAAA;AAC7C,EAAA,MAAM,iBAAiB,YAAA,CAAa,UAAA;AACpC,EAAA,MAAM,eACJ,YAAA,CAAa,UAAA,KAAe,MAAM,cAAA,EAAgB,OAAA,CAAQ,QAAQ,CAAA,MAAO,CAAA;AAa3E,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,MAAM,eAAe,YAAA,CAAa,IAAA;AAClC,IAAA,IAAI,WAAA,GAAc,EAAA;AAClB,IAAA,OAAO,gBAAgB,CAAA,EAAG;AACxB,MAAA,MAAM,SAAA,GAAY,KAAA,CAAM,KAAA,CAAM,EAAE,CAAA;AAChC,MAAA,MAAM,SAASoB,uBAAAA,CAAa,YAAY,CAAA,CAAE,SAAA,EAAW,CAAC,MAAA,KAAW;AAC/D,QAAA,KAAA,MAAW,IAAA,IAAQ,MAAA,CAAO,KAAA,EAAO,EAAA,CAAG,KAAK,IAAI,CAAA;AAC7C,QAAA,IAAI,MAAA,CAAO,YAAA,EAAc,EAAA,CAAG,YAAA,CAAa,OAAO,SAAS,CAAA;AAAA,MAC3D,CAAC,CAAA;AACD,MAAA,IAAI,CAAC,MAAA,EAAQ;AACb,MAAA,IAAI,CAAC,gBAAA,CAAiB,EAAA,CAAG,SAAA,CAAU,KAAK,CAAA,EAAG;AAAA,IAC7C;AAEA,IAAA,MAAM,UAAA,GAAa,GAAG,SAAA,CAAU,KAAA;AAChC,IAAA,IAAI,gBAAA,CAAiB,UAAU,CAAA,EAAG,OAAO,IAAA;AACzC,IAAA,OAAO,EAAE,MAAM,UAAA,CAAW,MAAA,IAAU,EAAA,EAAI,UAAA,CAAW,OAAM,EAAE;AAAA,EAC7D;AAGA,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,IAAA,CAAK,SAAS,CAAA;AACrC,EAAA,MAAM,WAAA,GAAc,KAAA,CAAM,KAAA,CAAM,SAAS,CAAA;AACzC,EAAA,MAAM,MAAA,GAAS,WAAA,KAAgB,QAAA,CAAS,UAAA,GAAa,CAAA;AACrD,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,MAAMmB,IAAAA,GAAM,KAAA,CAAM,KAAA,CAAM,SAAS,CAAA;AACjC,IAAA,OAAO,EAAE,IAAA,EAAMA,IAAAA,EAAK,EAAA,EAAIA,IAAAA,EAAI;AAAA,EAC9B;AAOA,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,KAAA,CAAM,aAAa,CAAA;AAC1C,EAAA,EAAA,CAAG,KAAA,CAAM,UAAU,CAAC,CAAA;AACpB,EAAA,MAAM,MAAM,QAAA,GAAW,CAAA;AACvB,EAAA,OAAO,EAAE,IAAA,EAAM,GAAA,EAAK,EAAA,EAAI,GAAA,EAAI;AAC9B;;;AC9DO,IAAMC,KAAAA,GAAN,MAAM,KAAA,SAAmD,SAAA,CAG9D;AAAA;AAAA;AAAA;AAAA;AAAA,EAKkB,IAAA,GAAO,MAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYhB,MAAA,GAAqC,IAAA;AAAA;AAAA;AAAA;AAAA,EAKpC,YAAY,MAAA,EAAsC;AAC1D,IAAA,KAAA,CAAM,MAAM,CAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,IAAI,QAAA,GAA4B;AAC9B,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAO,KAAK,MAAA,CAAO,MAAA,CAAO,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,IAAK,IAAA;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,eAAA,GAA4B;AAC9B,IAAA,MAAM,OAAO,IAAA,CAAK,QAAA;AAClB,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,MAAA,EAAS,KAAK,IAAI,CAAA,gFAAA;AAAA,OAEpB;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,OAAgB,OACd,MAAA,EACY;AACZ,IAAA,OAAO,IAAI,MAAK,MAAM,CAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUS,UAAU,OAAA,EAAmD;AACpE,IAAA,MAAM,SAAA,GAA0C;AAAA,MAC9C,GAAG,IAAA,CAAK,MAAA;AAAA,MACR,YAAY,OAAO;AAAA,QACjB,GAAG,IAAA,CAAK,OAAA;AAAA,QACR,GAAG;AAAA,OACL;AAAA,KACF;AAEA,IAAA,OAAO,IAAI,MAAK,SAAS,CAAA;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA8BS,OACP,cAAA,EAEwC;AACxC,IAAA,MAAM,SAAA,GAAY,4BAAA,CAA6B,IAAA,CAAK,MAAA,EAAQ,cAAc,CAAA;AAE1E,IAAA,OAAO,IAAI,MAAK,SAAyD,CAAA;AAAA,EAC3E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,cAAA,GAA2B;AACzB,IAAA,MAAM,OAAiB,EAAC;AAGxB,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,KAAA,KAAU,MAAA,EAAW,IAAA,CAAK,QAAQ,YAAA,CAAa,IAAA,CAAK,MAAA,CAAO,KAAA,EAAO,IAAI,CAAA;AACtF,IAAA,IAAI,KAAK,MAAA,CAAO,OAAA,KAAY,QAAW,IAAA,CAAK,OAAA,GAAU,KAAK,MAAA,CAAO,OAAA;AAClE,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,KAAW,MAAA,EAAW,IAAA,CAAK,SAAS,YAAA,CAAa,IAAA,CAAK,MAAA,CAAO,MAAA,EAAQ,IAAI,CAAA;AACzF,IAAA,IAAI,KAAK,MAAA,CAAO,IAAA,KAAS,QAAW,IAAA,CAAK,IAAA,GAAO,KAAK,MAAA,CAAO,IAAA;AAC5D,IAAA,IAAI,IAAA,CAAK,OAAO,UAAA,KAAe,MAAA;AAC7B,MAAA,IAAA,CAAK,UAAA,GAAa,KAAK,MAAA,CAAO,UAAA;AAChC,IAAA,IAAI,IAAA,CAAK,OAAO,SAAA,KAAc,MAAA;AAC5B,MAAA,IAAA,CAAK,SAAA,GAAY,KAAK,MAAA,CAAO,SAAA;AAC/B,IAAA,IAAI,KAAK,MAAA,CAAO,IAAA,KAAS,QAAW,IAAA,CAAK,IAAA,GAAO,KAAK,MAAA,CAAO,IAAA;AAC5D,IAAA,IAAI,IAAA,CAAK,OAAO,UAAA,KAAe,MAAA;AAC7B,MAAA,IAAA,CAAK,UAAA,GAAa,KAAK,MAAA,CAAO,UAAA;AAChC,IAAA,IAAI,IAAA,CAAK,OAAO,SAAA,KAAc,MAAA;AAC5B,MAAA,IAAA,CAAK,SAAA,GAAY,KAAK,MAAA,CAAO,SAAA;AAC/B,IAAA,IAAI,IAAA,CAAK,OAAO,QAAA,KAAa,MAAA;AAC3B,MAAA,IAAA,CAAK,QAAA,GAAW,KAAK,MAAA,CAAO,QAAA;AAC9B,IAAA,IAAI,KAAK,MAAA,CAAO,KAAA,KAAU,QAAW,IAAA,CAAK,KAAA,GAAQ,KAAK,MAAA,CAAO,KAAA;AAC9D,IAAA,IAAI,IAAA,CAAK,OAAO,cAAA,KAAmB,MAAA;AACjC,MAAC,IAAA,CAAiC,gBAAgB,CAAA,GAChD,IAAA,CAAK,MAAA,CAAO,cAAA;AAChB,IAAA,IAAI,IAAA,CAAK,OAAO,SAAA,KAAc,MAAA;AAC5B,MAAC,IAAA,CAAiC,WAAW,CAAA,GAC3C,IAAA,CAAK,MAAA,CAAO,SAAA;AAGhB,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,QAAA,KAAa,MAAA,EAAW;AACtC,MAAA,IAAI,OAAO,IAAA,CAAK,MAAA,CAAO,QAAA,KAAa,UAAA,EAAY;AAC9C,QAAA,MAAM,UAAA,GAAa,KAAK,MAAA,CAAO,QAAA;AAE/B,QAAA,MAAM,QAAA,GAAW,IAAA;AACjB,QAAA,IAAA,CAAK,WAAW,CAAC,IAAA,KAAS,UAAA,CAAW,IAAA,CAAK,UAAU,IAAI,CAAA;AAAA,MAC1D,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,QAAA;AAAA,MACpC;AAAA,IACF;AAGA,IAAA,MAAM,cAAA,GAAiB,YAAA,CAAa,IAAA,CAAK,MAAA,CAAO,eAAe,IAAI,CAAA;AACnE,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,IAAA,CAAK,KAAA,GAAQ,sBAAsB,cAAc,CAAA;AAAA,IACnD;AAGA,IAAA,MAAM,UAAA,GAAa,YAAA,CAAa,IAAA,CAAK,MAAA,CAAO,WAAW,IAAI,CAAA;AAC3D,IAAA,IAAI,UAAA,IAAc,UAAA,CAAW,MAAA,GAAS,CAAA,EAAG;AAGvC,MAAA,MAAM,aAAA,GAAgB,UAAA,CAAW,GAAA,CAAI,CAAC,IAAA,KAAS;AAE7C,QAAA,MAAM,YAUF,EAAC;AAEL,QAAA,IAAI,IAAA,CAAK,GAAA,EAAK,SAAA,CAAU,GAAA,GAAM,IAAA,CAAK,GAAA;AACnC,QAAA,IAAI,IAAA,CAAK,KAAA,EAAO,SAAA,CAAU,KAAA,GAAQ,IAAA,CAAK,KAAA;AACvC,QAAA,IAAI,IAAA,CAAK,QAAA,KAAa,MAAA,EAAW,SAAA,CAAU,WAAW,IAAA,CAAK,QAAA;AAC3D,QAAA,IAAI,IAAA,CAAK,SAAA,KAAc,MAAA,EAAW,SAAA,CAAU,YAAY,IAAA,CAAK,SAAA;AAC7D,QAAA,IAAI,IAAA,CAAK,OAAA,EAAS,SAAA,CAAU,OAAA,GAAU,IAAA,CAAK,OAAA;AAC3C,QAAA,IAAI,KAAK,kBAAA,KAAuB,MAAA;AAC9B,UAAA,SAAA,CAAU,qBAAqB,IAAA,CAAK,kBAAA;AAGtC,QAAA,IAAI,IAAA,CAAK,YAAY,cAAA,EAAgB;AACnC,UAAA,SAAA,CAAU,QAAA,GAAW,CAAC,IAAA,KAA+B;AAEnD,YAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,cAAA,OAAO,IAAA,CAAK,WACR,IAAA,CAAK,QAAA,CAAS,IAA8B,CAAA,IAAK,KACjD,EAAC;AAAA,YACP;AAGA,YAAA,MAAM,YAAY,IAAA,CAAK,QAAA,GAAW,KAAK,QAAA,CAAS,IAAI,IAAI,EAAC;AAGzD,YAAA,IAAI,SAAA,KAAc,IAAA,IAAQ,SAAA,KAAc,MAAA,EAAW;AACjD,cAAA,OAAO,KAAA;AAAA,YACT;AAGA,YAAA,MAAM,WAAA,GAAuC,EAAE,GAAG,SAAA,EAAU;AAC5D,YAAA,IAAI,cAAA,EAAgB;AAClB,cAAA,KAAA,MAAW,CAAC,IAAA,EAAM,QAAQ,KAAK,MAAA,CAAO,OAAA,CAAQ,cAAc,CAAA,EAAG;AAC7D,gBAAA,IAAI,SAAS,SAAA,EAAW;AACtB,kBAAA,WAAA,CAAY,IAAI,CAAA,GAAI,QAAA,CAAS,SAAA,CAAU,IAAI,CAAA;AAAA,gBAC7C;AAAA,cACF;AAAA,YACF;AAEA,YAAA,OAAO,WAAA;AAAA,UACT,CAAA;AAAA,QACF;AAEA,QAAA,OAAO,SAAA;AAAA,MACT,CAAC,CAAA;AAKD,MAAA,IAAA,CAAK,QAAA,GAAW,aAAA;AAAA,IAClB;AAGA,IAAA,IAAI,IAAA,CAAK,OAAO,UAAA,EAAY;AAC1B,MAAA,MAAM,QAAA,GAAW,KAAK,MAAA,CAAO,UAAA;AAC7B,MAAA,MAAM,SAAA,GAAY,cAAA;AAGlB,MAAA,MAAM,YAAA,GAAe,IAAA;AAErB,MAAA,IAAA,CAAK,KAAA,GAAQ,CAAC,IAAA,KAAS;AACrB,QAAA,MAAM,YAAY,SAAA,GACd,mBAAA,CAAoB,KAAK,KAAA,EAAO,SAAS,IACzC,EAAC;AAGL,QAAA,OAAO,SAAS,IAAA,CAAK,YAAA,EAAc,EAAE,IAAA,EAAM,cAAA,EAAgB,WAAW,CAAA;AAAA,MACxE,CAAA;AAAA,IACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AACF;;;ACtQO,IAAM,iBAAA,GAAN,MAAM,kBAAA,CAAkB;AAAA;AAAA;AAAA;AAAA;AAAA,EAK7B,OAAO,aAAA,CAAc,MAAA,EAA2B,IAAA,EAA8B;AAC5E,IAAA,IAAI,IAAA,CAAK,UAAA,EAAY,OAAO,IAAA,CAAK,WAAW,MAAM,CAAA;AAClD,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,EAAU,OAAO,KAAA;AAC3B,IAAA,IAAI,OAAO,KAAK,QAAA,KAAa,QAAA,SAAiB,MAAA,CAAO,QAAA,CAAS,KAAK,QAAQ,CAAA;AAC3E,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,QAAQ,CAAA,EAAG;AAChC,MAAA,OAAO,KAAK,QAAA,CAAS,IAAA,CAAK,CAAA,CAAA,KACxB,OAAO,MAAM,QAAA,GAAW,MAAA,CAAO,QAAA,CAAS,CAAC,IAAI,MAAA,CAAO,QAAA,CAAS,EAAE,IAAA,EAAM,CAAA,CAAE,UAAU,CAAC,CAAA;AAAA,IACtF;AACA,IAAA,OAAO,OAAO,QAAA,CAAS,IAAA,CAAK,SAAS,IAAA,EAAM,IAAA,CAAK,SAAS,UAAU,CAAA;AAAA,EACrE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,WAAA,CAAY,MAAA,EAA2B,IAAA,EAA2B;AACvE,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,OAAO,CAAA;AACxC,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,IAAI,IAAA,CAAK,aAAa,MAAA,EAAQ;AAC5B,QAAA,GAAA,CAAI,GAAG,KAAK,WAAW,CAAA;AAAA,MACzB,CAAA,MAAO;AACL,QAAA,GAAA,EAAI;AAAA,MACN;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,MAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,kBAAA,GAA0C,IAAA;AAAA;AAAA,EAG1C,UAA0B,EAAC;AAAA;AAAA,EAG3B,UAAA,uBAAiB,GAAA,EAAqB;AAAA;AAAA,EAGtC,YAAA,uBAAmB,GAAA,EAAqB;AAAA;AAAA,EAGxC,YAAA,uBAAmB,GAAA,EAAqB;AAAA;AAAA,EAGxC,aAAA,GAA+B,IAAA;AAAA;AAAA,EAG/B,aAAA,GAAgB,CAAA;AAAA;AAAA,EAGhB,eAA6B,EAAC;AAAA,EAEtC,WAAA,CAAY,MAAA,EAAiC,QAAA,EAAsB,MAAA,EAA+B;AAChG,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,IAAA,IAAA,CAAK,UAAU,MAAA,IAAU,IAAA;AACzB,IAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,EACf;AAAA;AAAA,EAIA,IAAI,MAAA,GAAyB;AAC3B,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA,EAEA,IAAI,SAAA,GAA0C;AAC5C,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EACd;AAAA,EAEA,IAAI,WAAA,GAA4C;AAC9C,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACd;AAAA,EAEA,IAAI,WAAA,GAA4C;AAC9C,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACd;AAAA,EAEA,IAAI,YAAA,GAA8B;AAChC,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,EACd;AAAA,EAEA,IAAI,YAAA,GAAuB;AACzB,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,EACd;AAAA,EAEA,IAAI,eAAA,GAA0B;AAC5B,IAAA,OAAO,KAAK,YAAA,CAAa,MAAA;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAS,IAAA,EAA8B;AACrC,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,IAAK,KAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,IAAA,EAA8B;AACvC,IAAA,OAAO,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,IAAK,KAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,IAAA,EAA2B;AACxC,IAAA,kBAAA,CAAkB,WAAA,CAAY,IAAA,CAAK,MAAA,EAAQ,IAAI,CAAA;AAC/C,IAAA,IAAA,CAAK,kBAAA,EAAmB;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,IAAA,EAAoB;AACjC,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAA,CAAK,aAAA,KAAkB,IAAA,GAAO,IAAA,GAAO,IAAA;AAC1D,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAAsB;AACpB,IAAA,IAAI,IAAA,CAAK,kBAAkB,IAAA,EAAM;AAC/B,MAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AACrB,MAAA,IAAA,CAAK,QAAA,EAAS;AAAA,IAChB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAAA,GAAuB;AACrB,IAAA,IAAI,IAAA,CAAK,YAAA,CAAa,MAAA,KAAW,CAAA,EAAG,OAAO,EAAA;AAC3C,IAAA,IAAA,CAAK,aAAA,GAAA,CAAiB,IAAA,CAAK,aAAA,GAAgB,CAAA,IAAK,KAAK,YAAA,CAAa,MAAA;AAClE,IAAA,IAAA,CAAK,QAAA,EAAS;AACd,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,GAAuB;AACrB,IAAA,IAAI,IAAA,CAAK,YAAA,CAAa,MAAA,KAAW,CAAA,EAAG,OAAO,EAAA;AAC3C,IAAA,IAAA,CAAK,aAAA,GAAA,CACF,KAAK,aAAA,GAAgB,CAAA,GAAI,KAAK,YAAA,CAAa,MAAA,IAAU,KAAK,YAAA,CAAa,MAAA;AAC1E,IAAA,IAAA,CAAK,QAAA,EAAS;AACd,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAAwB;AACtB,IAAA,IAAA,CAAK,aAAA,GAAgB,CAAA;AACrB,IAAA,IAAA,CAAK,QAAA,EAAS;AACd,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,GAAuB;AACrB,IAAA,IAAA,CAAK,gBAAgB,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,YAAA,CAAa,SAAS,CAAC,CAAA;AAC7D,IAAA,IAAA,CAAK,QAAA,EAAS;AACd,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,KAAA,EAAqB;AACnC,IAAA,IAAI,KAAA,IAAS,CAAA,IAAK,KAAA,GAAQ,IAAA,CAAK,aAAa,MAAA,EAAQ;AAClD,MAAA,IAAA,CAAK,aAAA,GAAgB,KAAA;AAAA,IACvB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,IAAA,EAAsB;AACjC,IAAA,OAAO,IAAA,CAAK,aAAa,SAAA,CAAU,CAAC,OAAO,EAAA,CAAG,IAAA,CAAK,SAAS,IAAI,CAAA;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAA,GAAkB;AAChB,IAAA,IAAA,CAAK,qBAAqB,MAAM;AAC9B,MAAA,IAAA,CAAK,kBAAA,EAAmB;AAAA,IAC1B,CAAA;AACA,IAAA,IAAA,CAAK,MAAA,CAAO,EAAA,CAAG,aAAA,EAAe,IAAA,CAAK,kBAAkB,CAAA;AACrD,IAAA,IAAA,CAAK,kBAAA,EAAmB;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,GAAgB;AACd,IAAA,IAAI,KAAK,kBAAA,EAAoB;AAC3B,MAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,aAAA,EAAe,IAAA,CAAK,kBAAkB,CAAA;AACtD,MAAA,IAAA,CAAK,kBAAA,GAAqB,IAAA;AAAA,IAC5B;AACA,IAAA,IAAA,CAAK,UAAU,EAAC;AAChB,IAAA,IAAA,CAAK,WAAW,KAAA,EAAM;AACtB,IAAA,IAAA,CAAK,aAAa,KAAA,EAAM;AACxB,IAAA,IAAA,CAAK,aAAa,KAAA,EAAM;AACxB,IAAA,IAAA,CAAK,eAAe,EAAC;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,OAAA,GAAgB;AACtB,IAAA,MAAM,KAAA,GAAQ,KAAK,MAAA,CAAO,YAAA;AAC1B,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA,CAAK,OAAA,GAChB,IAAA,CAAK,aAAA,CAAc,KAAA,EAAO,IAAA,CAAK,OAAO,CAAA,GACtC,IAAA,CAAK,UAAA,CAAW,KAAK,CAAA;AACzB,IAAA,IAAA,CAAK,YAAA,GAAe,KAAK,aAAA,EAAc;AACvC,IAAA,IAAA,CAAK,aAAA,GAAgB,CAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,WAAW,KAAA,EAAsC;AACvD,IAAA,MAAM,QAAA,uBAAe,GAAA,EAA2B;AAChD,IAAA,MAAM,aAAuB,EAAC;AAE9B,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AAExB,MAAA,IAAI,IAAA,CAAK,IAAA,KAAS,QAAA,IAAY,IAAA,CAAK,YAAY,KAAA,EAAO;AACtD,MAAA,MAAM,YAAa,OAAA,IAAW,IAAA,IAAQ,IAAA,CAAK,KAAA,GAAS,KAAK,KAAA,GAAQ,EAAA;AACjE,MAAA,IAAI,IAAA,GAAO,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA;AACjC,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,IAAA,GAAO,EAAC;AACR,QAAA,QAAA,CAAS,GAAA,CAAI,WAAW,IAAI,CAAA;AAC5B,QAAA,UAAA,CAAW,KAAK,SAAS,CAAA;AAAA,MAC3B;AACA,MAAA,IAAA,CAAK,KAAK,IAAI,CAAA;AAAA,IAChB;AAGA,IAAA,MAAM,SAAyB,EAAC;AAChC,IAAA,KAAA,MAAW,QAAQ,UAAA,EAAY;AAC7B,MAAA,MAAM,UAAA,GAAa,QAAA,CAAS,GAAA,CAAI,IAAI,KAAK,EAAC;AAC1C,MAAA,UAAA,CAAW,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AACxB,QAAA,MAAM,EAAA,GAAK,EAAE,QAAA,IAAY,GAAA;AACzB,QAAA,MAAM,EAAA,GAAK,EAAE,QAAA,IAAY,GAAA;AACzB,QAAA,OAAO,EAAA,GAAK,EAAA;AAAA,MACd,CAAC,CAAA;AACD,MAAA,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,KAAA,EAAO,YAAY,CAAA;AAAA,IACzC;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,aAAA,CAAc,OAAsB,MAAA,EAA8C;AAExF,IAAA,MAAM,SAAA,uBAAgB,GAAA,EAA2B;AACjD,IAAA,MAAM,WAAA,uBAAkB,GAAA,EAA6B;AAErD,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,IAAI,IAAA,CAAK,SAAS,QAAA,EAAU;AAC1B,QAAA,SAAA,CAAU,GAAA,CAAI,IAAA,CAAK,IAAA,EAAM,IAAI,CAAA;AAAA,MAC/B,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,UAAA,EAAY;AACnC,QAAA,WAAA,CAAY,GAAA,CAAI,IAAA,CAAK,IAAA,EAAM,IAAI,CAAA;AAC/B,QAAA,KAAA,MAAW,GAAA,IAAO,KAAK,KAAA,EAAO;AAC5B,UAAA,SAAA,CAAU,GAAA,CAAI,GAAA,CAAI,IAAA,EAAM,GAAG,CAAA;AAAA,QAC7B;AAAA,MACF;AAAA,IACF;AAGA,IAAA,MAAM,SAAyB,EAAC;AAChC,IAAA,IAAI,UAAyB,EAAC;AAC9B,IAAA,IAAI,QAAA,GAAW,CAAA;AAEf,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,IAAI,UAAU,GAAA,EAAK;AACjB,QAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,UAAA,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,CAAA,OAAA,EAAU,MAAA,CAAO,UAAU,CAAC,CAAA,CAAA,EAAI,KAAA,EAAO,OAAA,EAAS,CAAA;AACpE,UAAA,OAAA,GAAU,EAAC;AAAA,QACb;AACA,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,QAAA,MAAM,EAAA,GAAK,WAAA,CAAY,GAAA,CAAI,KAAK,CAAA;AAChC,QAAA,IAAI,EAAA,EAAI;AACN,UAAA,OAAA,CAAQ,KAAK,EAAE,CAAA;AAAA,QACjB,CAAA,MAAO;AACL,UAAA,MAAM,GAAA,GAAM,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA;AAC/B,UAAA,IAAI,GAAA,EAAK,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAA;AAAA,QAC3B;AACA,QAAA;AAAA,MACF;AAGA,MAAA,MAAM,WAA4B,EAAC;AACnC,MAAA,KAAA,MAAW,OAAA,IAAW,MAAM,KAAA,EAAO;AACjC,QAAA,MAAM,GAAA,GAAM,SAAA,CAAU,GAAA,CAAI,OAAO,CAAA;AACjC,QAAA,IAAI,GAAA,EAAK,QAAA,CAAS,IAAA,CAAK,GAAG,CAAA;AAAA,MAC5B;AACA,MAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,QAAA,MAAM,EAAA,GAAsB;AAAA,UAC1B,IAAA,EAAM,UAAA;AAAA,UACN,IAAA,EAAM,CAAA,UAAA,EAAa,KAAA,CAAM,QAAQ,CAAA,CAAA;AAAA,UACjC,MAAM,KAAA,CAAM,IAAA;AAAA,UACZ,OAAO,KAAA,CAAM,QAAA;AAAA,UACb,KAAA,EAAO;AAAA,SACT;AACA,QAAA,IAAI,KAAA,CAAM,WAAA,EAAa,EAAA,CAAG,WAAA,GAAc,KAAA,CAAM,WAAA;AAC9C,QAAA,IAAI,KAAA,CAAM,WAAA,EAAa,EAAA,CAAG,WAAA,GAAc,KAAA,CAAM,WAAA;AAC9C,QAAA,OAAA,CAAQ,KAAK,EAAE,CAAA;AAAA,MACjB;AAAA,IACF;AAEA,IAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,MAAA,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,CAAA,OAAA,EAAU,MAAA,CAAO,QAAQ,CAAC,CAAA,CAAA,EAAI,KAAA,EAAO,OAAA,EAAS,CAAA;AAAA,IACpE;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAA,GAA8B;AACpC,IAAA,MAAM,OAAqB,EAAC;AAC5B,IAAA,KAAA,MAAW,CAAC,EAAA,EAAI,KAAK,KAAK,IAAA,CAAK,OAAA,CAAQ,SAAQ,EAAG;AAChD,MAAA,KAAA,MAAW,CAAC,EAAA,EAAI,IAAI,KAAK,KAAA,CAAM,KAAA,CAAM,SAAQ,EAAG;AAC9C,QAAA,IAAI,IAAA,CAAK,IAAA,KAAS,QAAA,IAAY,IAAA,CAAK,SAAS,UAAA,EAAY;AACtD,UAAA,IAAA,CAAK,KAAK,EAAE,IAAA,EAAM,YAAY,EAAA,EAAI,SAAA,EAAW,IAAI,CAAA;AAAA,QACnD;AAAA,MACF;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAA,GAA2B;AAEjC,IAAA,IAAI,QAAA,GAAmE,IAAA;AACvE,IAAA,IAAI;AACF,MAAA,QAAA,GAAW,IAAA,CAAK,OAAO,GAAA,EAAI;AAAA,IAC7B,CAAA,CAAA,MAAQ;AAAA,IAER;AAEA,IAAA,KAAA,MAAW,KAAA,IAAS,KAAK,OAAA,EAAS;AAChC,MAAA,KAAA,MAAW,IAAA,IAAQ,MAAM,KAAA,EAAO;AAC9B,QAAA,IAAI,IAAA,CAAK,SAAS,QAAA,EAAU;AAC1B,UAAA,IAAA,CAAK,kBAAkB,IAAI,CAAA;AAC3B,UAAA,IAAA,CAAK,mBAAA,CAAoB,MAAM,QAAQ,CAAA;AACvC,UAAA,IAAA,CAAK,oBAAoB,IAAI,CAAA;AAAA,QAC/B,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,UAAA,EAAY;AACnC,UAAA,KAAA,MAAW,GAAA,IAAO,KAAK,KAAA,EAAO;AAC5B,YAAA,IAAA,CAAK,kBAAkB,GAAG,CAAA;AAC1B,YAAA,IAAA,CAAK,mBAAA,CAAoB,KAAK,QAAQ,CAAA;AAAA,UACxC;AAEA,UAAA,MAAM,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,KACnC,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,CAAA,GAAA,KAAO,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,GAAA,CAAI,IAAI,CAAC,CAAA;AAC5D,UAAA,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,IAAA,CAAK,IAAA,EAAM,WAAW,CAAA;AAAA,QAC9C;AAAA,MACF;AAAA,IACF;AAMA,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EAChB;AAAA,EAEQ,mBAAA,CACN,MACA,QAAA,EACS;AACT,IAAA,MAAM,cAAc,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,IAAK,KAAA;AACxD,IAAA,IAAI,WAAA,GAAc,KAAA;AAElB,IAAA,IAAI;AACF,MAAA,IAAI,KAAK,SAAA,EAAW;AAIlB,QAAA,WAAA,GAAc,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,WAAW,CAAA;AAAA,MAChD,WAAW,QAAA,EAAU;AACnB,QAAA,MAAM,MAAA,GAAS,QAAA,CAAS,IAAA,CAAK,OAAO,CAAA;AACpC,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,WAAA,GAAc,IAAA,CAAK,WAAA,EAAa,MAAA,GAC5B,CAAC,MAAA,CAAO,GAAG,IAAA,CAAK,WAAW,CAAA,GAC3B,CAAC,MAAA,EAAO;AAAA,QACd;AAAA,MACF;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAEA,IAAA,IAAI,gBAAgB,WAAA,EAAa;AAC/B,MAAA,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,IAAA,CAAK,IAAA,EAAM,WAAW,CAAA;AAC5C,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEQ,kBAAkB,IAAA,EAA8B;AACtD,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,IAAY,CAAC,IAAA,CAAK,YAAY,OAAO,KAAA;AAE/C,IAAA,MAAM,YAAY,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,IAAK,KAAA;AACpD,IAAA,MAAM,SAAA,GAAY,kBAAA,CAAkB,aAAA,CAAc,IAAA,CAAK,QAAQ,IAAI,CAAA;AAEnE,IAAA,IAAI,cAAc,SAAA,EAAW;AAC3B,MAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,IAAA,CAAK,IAAA,EAAM,SAAS,CAAA;AACxC,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEQ,oBAAoB,IAAA,EAA8B;AACxD,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,EAAW,OAAO,KAAA;AAE5B,IAAA,MAAM,cAAc,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,IAAK,KAAA;AACxD,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,IAAI,CAAA;AACzC,IAAA,MAAM,WAAA,GAAc,GAAA,GAAM,QAAQ,CAAA,KAAM,IAAA;AAExC,IAAA,IAAI,gBAAgB,WAAA,EAAa;AAC/B,MAAA,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,IAAA,CAAK,IAAA,EAAM,WAAW,CAAA;AAC5C,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AACF;;;ACvfO,SAAS,uBAAuB,KAAA,EAAgD;AACrF,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAgC;AAChD,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,IAAA,GAAO,KAAK,KAAA,IAAS,EAAA;AAC3B,IAAA,IAAI,IAAA,GAAO,GAAA,CAAI,GAAA,CAAI,IAAI,CAAA;AACvB,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,IAAA,GAAO,EAAC;AACR,MAAA,GAAA,CAAI,GAAA,CAAI,MAAM,IAAI,CAAA;AAClB,MAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,IACjB;AACA,IAAA,IAAA,CAAK,KAAK,IAAI,CAAA;AAAA,EAChB;AAEA,EAAA,MAAM,SAA8B,EAAC;AACrC,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,QAAQ,GAAA,CAAI,GAAA,CAAI,IAAI,CAAA,IAAK,IAAI,KAAA,EAAM;AACzC,IAAA,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAA,CAAO,EAAE,QAAA,IAAY,GAAA,KAAQ,CAAA,CAAE,QAAA,IAAY,GAAA,CAAI,CAAA;AAC7D,IAAA,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AAAA,EACnC;AACA,EAAA,OAAO,MAAA;AACT;;;ACjBO,IAAM,sBAAA,GAAyB;AAE/B,IAAM,sBAAA,GAAN,MAAM,uBAAA,CAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMlC,OAAO,YAAA,CACL,MAAA,EACA,QAAA,EACoB;AACpB,IAAA,MAAM,WAAW,MAAA,CAAO,iBAAA;AACxB,IAAA,IAAI,CAAC,UAAU,OAAO,QAAA;AACtB,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,EAAG,OAAO,QAAA;AACpC,IAAA,IAAI;AACF,MAAA,OAAO,QAAA,CAAS,UAAU,MAAM,CAAA;AAAA,IAClC,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,QAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,WAAA,CAAY,MAAA,EAAgB,IAAA,EAA8B;AAC/D,IAAA,IAAI,OAAO,IAAA,CAAK,OAAA,KAAY,UAAA,EAAY;AACtC,MAAA,IAAA,CAAK,QAAQ,MAAM,CAAA;AACnB,MAAA;AAAA,IACF;AACA,IAAA,MAAM,WAAW,MAAA,CAAO,QAAA;AACxB,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAA;AACjC,IAAA,IAAI,CAAC,GAAA,EAAK;AACV,IAAA,IAAI,IAAA,CAAK,aAAa,MAAA,EAAQ;AAC5B,MAAA,GAAA,CAAI,GAAG,KAAK,WAAW,CAAA;AAAA,IACzB,CAAA,MAAO;AACL,MAAA,GAAA,EAAI;AAAA,IACN;AAAA,EACF;AAAA,EAEQ,MAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,kBAAA,GAA0C,IAAA;AAAA,EAE1C,UAA+B,EAAC;AAAA,EAChC,aAAiC,EAAC;AAAA,EAClC,YAAA,uBAAmB,GAAA,EAAqB;AAAA,EACxC,aAAA,GAAgB,sBAAA;AAAA,EAExB,WAAA,CAAY,MAAA,EAAgB,QAAA,EAAsB,QAAA,EAAsC;AACtF,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,IAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,EACf;AAAA;AAAA,EAIA,IAAI,MAAA,GAA8B;AAChC,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA,EAEA,IAAI,SAAA,GAAgC;AAClC,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EACd;AAAA,EAEA,IAAI,WAAA,GAA4C;AAC9C,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACd;AAAA,EAEA,IAAI,YAAA,GAAuB;AACzB,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,EACd;AAAA;AAAA,EAGA,IAAI,SAAA,GAAqB;AACvB,IAAA,OAAO,KAAK,aAAA,IAAiB,CAAA;AAAA,EAC/B;AAAA,EAEA,IAAI,SAAA,GAAoB;AACtB,IAAA,OAAO,KAAK,UAAA,CAAW,MAAA;AAAA,EACzB;AAAA;AAAA,EAIA,WAAW,IAAA,EAAiC;AAC1C,IAAA,OAAO,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,IAAK,KAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ,IAAA,EAA8B;AACpC,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA,EAAG;AAC3B,IAAA,uBAAA,CAAuB,WAAA,CAAY,IAAA,CAAK,MAAA,EAAQ,IAAI,CAAA;AACpD,IAAA,IAAA,CAAK,aAAA,GAAgB,sBAAA;AACrB,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,OAAA,GAAgB;AACd,IAAA,MAAM,QAAQ,uBAAA,CAAuB,YAAA,CAAa,IAAA,CAAK,MAAA,EAAQ,KAAK,QAAQ,CAAA;AAC5E,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA,CAAK,UAAA,CAAW,KAAK,CAAA;AACpC,IAAA,IAAA,CAAK,aAAa,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAC,CAAA,KAAM,EAAE,KAAK,CAAA;AACrD,IAAA,IAAI,IAAA,CAAK,aAAA,IAAiB,IAAA,CAAK,UAAA,CAAW,MAAA,EAAQ;AAChD,MAAA,IAAA,CAAK,aAAA,GAAgB,sBAAA;AAAA,IACvB;AACA,IAAA,IAAA,CAAK,oBAAA,EAAqB;AAAA,EAC5B;AAAA;AAAA;AAAA,EAKA,SAAA,GAAoB;AAClB,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG;AAChC,MAAA,IAAA,CAAK,aAAA,GAAgB,sBAAA;AACrB,MAAA,OAAO,IAAA,CAAK,aAAA;AAAA,IACd;AACA,IAAA,IAAA,CAAK,aAAA,GAAgB,CAAA;AACrB,IAAA,IAAA,CAAK,QAAA,EAAS;AACd,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,EACd;AAAA;AAAA,EAGA,SAAA,GAAkB;AAChB,IAAA,IAAI,IAAA,CAAK,kBAAkB,sBAAA,EAAwB;AACnD,IAAA,IAAA,CAAK,aAAA,GAAgB,sBAAA;AACrB,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EAChB;AAAA;AAAA,EAGA,IAAA,GAAe;AACb,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG,OAAO,sBAAA;AACzC,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,aAAA,GAAgB,CAAA,GAAI,KAAK,IAAA,CAAK,aAAA;AAC/C,IAAA,IAAA,CAAK,aAAA,GAAA,CAAiB,GAAA,GAAM,CAAA,IAAK,IAAA,CAAK,UAAA,CAAW,MAAA;AACjD,IAAA,IAAA,CAAK,QAAA,EAAS;AACd,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,EACd;AAAA;AAAA,EAGA,IAAA,GAAe;AACb,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG,OAAO,sBAAA;AACzC,IAAA,MAAM,GAAA,GAAM,KAAK,UAAA,CAAW,MAAA;AAC5B,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,aAAA,GAAgB,CAAA,GAAI,MAAM,IAAA,CAAK,aAAA;AAChD,IAAA,IAAA,CAAK,aAAA,GAAA,CAAiB,GAAA,GAAM,CAAA,GAAI,GAAA,IAAO,GAAA;AACvC,IAAA,IAAA,CAAK,QAAA,EAAS;AACd,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,EACd;AAAA,EAEA,KAAA,GAAgB;AACd,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG,OAAO,sBAAA;AACzC,IAAA,IAAA,CAAK,aAAA,GAAgB,CAAA;AACrB,IAAA,IAAA,CAAK,QAAA,EAAS;AACd,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,EACd;AAAA,EAEA,IAAA,GAAe;AACb,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG,OAAO,sBAAA;AACzC,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAA,CAAK,UAAA,CAAW,MAAA,GAAS,CAAA;AAC9C,IAAA,IAAA,CAAK,QAAA,EAAS;AACd,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,EACd;AAAA;AAAA,EAGA,gBAAgB,KAAA,EAAqB;AACnC,IAAA,IAAI,KAAA,GAAQ,CAAA,IAAK,KAAA,IAAS,IAAA,CAAK,WAAW,MAAA,EAAQ;AAClD,IAAA,IAAI,IAAA,CAAK,kBAAkB,KAAA,EAAO;AAClC,IAAA,IAAA,CAAK,aAAA,GAAgB,KAAA;AACrB,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EAChB;AAAA;AAAA,EAGA,WAAA,GAAuC;AACrC,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,aAAa,CAAA,IAAK,IAAA;AAAA,EAChD;AAAA;AAAA,EAGA,aAAa,IAAA,EAAsB;AACjC,IAAA,OAAO,KAAK,UAAA,CAAW,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,IAAI,CAAA;AAAA,EACzD;AAAA;AAAA;AAAA,EAKA,SAAA,GAAkB;AAChB,IAAA,IAAA,CAAK,qBAAqB,MAAM;AAC9B,MAAA,IAAA,CAAK,oBAAA,EAAqB;AAAA,IAC5B,CAAA;AACA,IAAA,IAAA,CAAK,MAAA,CAAO,EAAA,CAAG,aAAA,EAAe,IAAA,CAAK,kBAAkB,CAAA;AAAA,EACvD;AAAA;AAAA,EAGA,OAAA,GAAgB;AACd,IAAA,IAAI,KAAK,kBAAA,EAAoB;AAC3B,MAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,aAAA,EAAe,IAAA,CAAK,kBAAkB,CAAA;AACtD,MAAA,IAAA,CAAK,kBAAA,GAAqB,IAAA;AAAA,IAC5B;AACA,IAAA,IAAA,CAAK,UAAU,EAAC;AAChB,IAAA,IAAA,CAAK,aAAa,EAAC;AACnB,IAAA,IAAA,CAAK,aAAa,KAAA,EAAM;AACxB,IAAA,IAAA,CAAK,aAAA,GAAgB,sBAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUQ,WAAW,KAAA,EAAgD;AACjE,IAAA,OAAO,uBAAuB,KAAK,CAAA;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,oBAAA,GAA6B;AACnC,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,IAAI,QAAA,GAAmE,IAAA;AACvE,IAAA,IAAI;AACF,MAAA,QAAA,GAAW,IAAA,CAAK,OAAO,GAAA,EAAI;AAAA,IAC7B,CAAA,CAAA,MAAQ;AACN,MAAA,QAAA,GAAW,IAAA;AAAA,IACb;AAEA,IAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,UAAA,EAAY;AAClC,MAAA,MAAM,MAAM,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,IAAK,KAAA;AAChD,MAAA,IAAI,GAAA,GAAM,KAAA;AAEV,MAAA,IAAI,KAAK,UAAA,EAAY;AACnB,QAAA,IAAI;AACF,UAAA,GAAA,GAAM,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,MAAM,CAAA;AAAA,QACnC,CAAA,CAAA,MAAQ;AACN,UAAA,GAAA,GAAM,KAAA;AAAA,QACR;AAAA,MACF,CAAA,MAAA,IAAW,OAAO,IAAA,CAAK,OAAA,KAAY,YAAY,QAAA,EAAU;AACvD,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,GAAS,QAAA,CAAS,IAAA,CAAK,OAAO,CAAA;AACpC,UAAA,IAAI,MAAA,EAAQ;AACV,YAAA,GAAA,GAAM,IAAA,CAAK,WAAA,EAAa,MAAA,GACpB,CAAC,MAAA,CAAO,GAAG,IAAA,CAAK,WAAW,CAAA,GAC3B,CAAC,MAAA,EAAO;AAAA,UACd;AAAA,QACF,CAAA,CAAA,MAAQ;AACN,UAAA,GAAA,GAAM,KAAA;AAAA,QACR;AAAA,MACF;AAEA,MAAA,IAAI,QAAQ,GAAA,EAAK;AACf,QAAA,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,IAAA,CAAK,IAAA,EAAM,GAAG,CAAA;AACpC,QAAA,OAAA,GAAU,IAAA;AAAA,MACZ;AAAA,IACF;AAEA,IAAA,IAAI,OAAA,OAAc,QAAA,EAAS;AAAA,EAC7B;AACF;;;ACpSO,IAAM,YAAA,GAAwB;AAAA;AAAA,EAEnC,KAAA,EACE,qQAAA;AAAA,EAEF,UAAA,EACE,wOAAA;AAAA,EAEF,aAAA,EACE,0RAAA;AAAA,EAEF,iBAAA,EACE,mnBAAA;AAAA,EAEF,IAAA,EACE,qcAAA;AAAA,EAEF,iBAAA,EACE,8YAAA;AAAA,EAEF,aAAA,EACE,wdAAA;AAAA,EAEF,eAAA,EACE,2bAAA;AAAA,EAEF,IAAA,EACE,orBAAA;AAAA;AAAA,EAGF,SAAA,EACE,sOAAA;AAAA,EAEF,KAAA,EACE,qMAAA;AAAA,EAEF,QAAA,EACE,gTAAA;AAAA,EAEF,QAAA,EACE,4WAAA;AAAA,EAEF,UAAA,EACE,gYAAA;AAAA,EAEF,SAAA,EACE,sVAAA;AAAA,EAEF,MAAA,EACE,kZAAA;AAAA,EAEF,SAAA,EACE,ucAAA;AAAA,EAEF,KAAA,EACE,qKAAA;AAAA;AAAA,EAGF,IAAA,EACE,+PAAA;AAAA,EAEF,WAAA,EACE,0XAAA;AAAA,EAEF,WAAA,EACE,wqBAAA;AAAA,EAEF,UAAA,EACE,yjBAAA;AAAA;AAAA,EAGF,aAAA,EACE,sSAAA;AAAA,EAEF,eAAA,EACE,oSAAA;AAAA,EAEF,cAAA,EACE,oSAAA;AAAA,EAEF,gBAAA,EACE,oSAAA;AAAA;AAAA,EAGF,cAAA,EACE,+QAAA;AAAA,EAEF,OAAA,EACE,gsBAAA;AAAA,EAEF,MAAA,EACE,ojBAAA;AAAA,EAEF,QAAA,EACE,ulBAAA;AAAA,EAEF,WAAA,EACE,sbAAA;AAAA;AAAA,EAGF,SAAA,EACE,0tBAAA;AAAA,EAEF,KAAA,EACE,yNAAA;AAAA;AAAA,EAGF,QAAA,EACE,4SAAA;AAAA;AAAA,EAGF,gBAAA,EACE,0TAAA;AAAA;AAAA,EAGF,KAAA,EACE,kZAAA;AAAA,EAEF,MAAA,EACE,0bAAA;AAAA,EAEF,UAAA,EACE,oYAAA;AAAA;AAAA,EAGF,KAAA,EACE,yYAAA;AAAA;AAAA,EAGF,KAAA,EACE,gPAAA;AAAA,EAEF,UAAA,EACE,0ZAAA;AAAA;AAAA,EAGF,qBAAA,EACE,uUAAA;AAAA,EAEF,cAAA,EACE,0SAAA;AAAA;AAAA,EAGF,KAAA,EACE,wRAAA;AAAA,EAEF,QAAA,EACE,oWAAA;AAAA;AAAA,EAGF,IAAA,EACE,sNAAA;AAAA,EAEF,eAAA,EACE,kXAAA;AAAA,EAEF,SAAA,EACE,+OAAA;AAAA,EAEF,IAAA,EACE;AACJ;;;AC5JO,IAAM,QAAA,GAAWA,MAAK,MAAA,CAAO;AAAA,EAClC,IAAA,EAAM,KAAA;AAAA,EACN,OAAA,EAAS,IAAA;AAAA,EACT,OAAA,EAAS;AACX,CAAC;;;ACJM,IAAM,IAAA,GAAOA,MAAK,MAAA,CAAO;AAAA,EAC9B,IAAA,EAAM,MAAA;AAAA,EACN,KAAA,EAAO;AACT,CAAC;;;ACQM,IAAM,SAAA,GAAYA,MAAK,MAAA,CAAyB;AAAA,EACrD,IAAA,EAAM,WAAA;AAAA,EACN,KAAA,EAAO,OAAA;AAAA,EACP,OAAA,EAAS,SAAA;AAAA,EACT,QAAA,EAAU,GAAA;AAAA,EAEV,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,gBAAgB;AAAC,KACnB;AAAA,EACF,CAAA;AAAA,EAEA,SAAA,GAAY;AACV,IAAA,OAAO,CAAC,EAAE,GAAA,EAAK,GAAA,EAAK,CAAA;AAAA,EACtB,CAAA;AAAA,EAEA,UAAA,CAAW,EAAE,cAAA,EAAe,EAAG;AAC7B,IAAA,OAAO,CAAC,GAAA,EAAK,EAAE,GAAG,IAAA,CAAK,QAAQ,cAAA,EAAgB,GAAG,cAAA,EAAe,EAAG,CAAC,CAAA;AAAA,EACvE,CAAA;AAAA,EAEA,WAAA,GAAc;AACZ,IAAA,MAAM,EAAE,MAAK,GAAI,IAAA;AACjB,IAAA,OAAO;AAAA,MACL,YAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM;AAChB,QAAA,OAAO,QAAA,CAAS,aAAa,IAAI,CAAA;AAAA,MACnC;AAAA,KACJ;AAAA,EACF,CAAA;AAAA,EAEA,oBAAA,GAAuB;AACrB,IAAA,MAAM,EAAE,QAAO,GAAI,IAAA;AACnB,IAAA,OAAO;AAAA,MACL,aAAa,MAAM;AACjB,QAAA,OAAO,MAAA,EAAQ,QAAA,CAAS,cAAc,CAAA,IAAI,IAAK,KAAA;AAAA,MACjD;AAAA,KACF;AAAA,EACF;AACF,CAAC;AC/BM,IAAM,OAAA,GAAUA,MAAK,MAAA,CAAuB;AAAA,EACjD,IAAA,EAAM,SAAA;AAAA,EACN,KAAA,EAAO,OAAA;AAAA,EACP,OAAA,EAAS,SAAA;AAAA,EACT,QAAA,EAAU,IAAA;AAAA,EAEV,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,CAAC,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAAA,MACnB,gBAAgB;AAAC,KACnB;AAAA,EACF,CAAA;AAAA,EAEA,aAAA,GAAgB;AACd,IAAA,OAAO;AAAA,MACL,KAAA,EAAO;AAAA,QACL,OAAA,EAAS,CAAA;AAAA,QACT,SAAA,EAAW,CAAC,OAAA,KAAyB;AACnC,UAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAA;AAC7C,UAAA,OAAO,KAAA,GAAQ,CAAC,CAAA,GAAI,QAAA,CAAS,MAAM,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI,CAAA;AAAA,QAC/C,CAAA;AAAA,QACA,YAAY,MAAM;AAEhB,UAAA,OAAO,EAAC;AAAA,QACV;AAAA;AACF,KACF;AAAA,EACF,CAAA;AAAA,EAEA,SAAA,GAAY;AAEV,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,MACzC,GAAA,EAAK,CAAA,CAAA,EAAI,MAAA,CAAO,KAAK,CAAC,CAAA,CAAA;AAAA,MACtB,KAAA,EAAO,EAAE,KAAA;AAAM,KACjB,CAAE,CAAA;AAAA,EACJ,CAAA;AAAA,EAEA,UAAA,CAAW,EAAE,IAAA,EAAM,cAAA,EAAe,EAAG;AACnC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAEhC,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,GAAI,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA;AACtF,IAAA,OAAO,CAAC,CAAA,CAAA,EAAI,MAAA,CAAO,UAAU,CAAC,CAAA,CAAA,EAAI,EAAE,GAAG,IAAA,CAAK,OAAA,CAAQ,cAAA,EAAgB,GAAG,cAAA,IAAkB,CAAC,CAAA;AAAA,EAC5F,CAAA;AAAA,EAEA,WAAA,GAAc;AACZ,IAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAI,IAAA;AAC1B,IAAA,OAAO;AAAA,MACL,YACE,CAAC,UAAA,KACD,CAAC,EAAE,UAAS,KAAM;AAChB,QAAA,MAAM,QAAQ,UAAA,EAAY,KAAA,IAAS,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,IAAK,CAAA;AACxD,QAAA,IAAI,CAAC,OAAA,CAAQ,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG;AACnC,UAAA,OAAO,KAAA;AAAA,QACT;AACA,QAAA,OAAO,QAAA,CAAS,YAAA,CAAa,IAAA,EAAM,EAAE,OAAO,CAAA;AAAA,MAC9C,CAAA;AAAA,MACF,eACE,CAAC,UAAA,KACD,CAAC,EAAE,UAAS,KAAM;AAChB,QAAA,MAAM,QAAQ,UAAA,EAAY,KAAA,IAAS,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,IAAK,CAAA;AACxD,QAAA,IAAI,CAAC,OAAA,CAAQ,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG;AACnC,UAAA,OAAO,KAAA;AAAA,QACT;AACA,QAAA,OAAO,SAAS,eAAA,CAAgB,IAAA,EAAM,WAAA,EAAa,EAAE,OAAO,CAAA;AAAA,MAC9D;AAAA,KACJ;AAAA,EACF,CAAA;AAAA,EAEA,oBAAA,GAAuB;AACrB,IAAA,MAAM,YAA2C,EAAC;AAClD,IAAA,MAAM,EAAE,OAAA,EAAS,MAAA,EAAO,GAAI,IAAA;AAE5B,IAAA,OAAA,CAAQ,MAAA,CAAO,OAAA,CAAQ,CAAC,KAAA,KAAU;AAChC,MAAA,SAAA,CAAU,WAAW,MAAA,CAAO,KAAK,CAAC,CAAA,CAAE,IAAI,MAAM;AAC5C,QAAA,OAAO,QAAQ,QAAA,CAAS,eAAe,IAAI,EAAE,KAAA,EAAO,CAAA,IAAK,KAAA;AAAA,MAC3D,CAAA;AAAA,IACF,CAAC,CAAA;AAsBD,IAAA,SAAA,CAAU,OAAO,IAAI,MAAe;AAClC,MAAA,IAAI,CAAC,QAAQ,OAAO,KAAA;AACpB,MAAA,MAAM,SAAEzC,OAAA,EAAO,IAAA,EAAK,GAAI,MAAA;AACxB,MAAA,MAAM,EAAE,WAAU,GAAIA,OAAA;AACtB,MAAA,IAAI,CAAC,SAAA,CAAU,KAAA,EAAO,OAAO,KAAA;AAC7B,MAAA,MAAM,EAAE,OAAM,GAAI,SAAA;AAClB,MAAA,IAAI,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,IAAA,KAAS,WAAW,OAAO,KAAA;AAEjD,MAAA,MAAM,aAAA,GAAgBA,OAAA,CAAM,MAAA,CAAO,KAAA,CAAM,WAAW,CAAA;AACpD,MAAA,IAAI,CAAC,eAAe,OAAO,KAAA;AAG3B,MAAA,IAAI,KAAA,CAAM,MAAA,CAAO,OAAA,CAAQ,IAAA,KAAS,CAAA,EAAG;AACnC,QAAA,IAAA,CAAK,QAAA;AAAA,UACHA,OAAA,CAAM,EAAA,CAAG,aAAA,CAAc,KAAA,CAAM,MAAA,CAAO,MAAM,KAAK,CAAA,EAAG,aAAa,CAAA,CAAE,cAAA;AAAe,SAClF;AACA,QAAA,OAAO,IAAA;AAAA,MACT;AAGA,MAAA,IAAI,MAAM,YAAA,KAAiB,KAAA,CAAM,MAAA,CAAO,OAAA,CAAQ,MAAM,OAAO,KAAA;AAE7D,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,KAAA,CAAM,KAAK,CAAA;AACrC,MAAA,MAAM,MAAA,GAASA,OAAA,CAAM,GAAA,CAAI,OAAA,CAAQ,KAAK,CAAA;AACtC,MAAA,MAAM,UAAA,GAAa,OAAO,KAAA,EAAM;AAIhC,MAAA,IAAI,CAAC,MAAA,CAAO,MAAA,CAAO,eAAe,UAAA,EAAY,UAAA,EAAY,aAAa,CAAA,EAAG;AACxE,QAAA,OAAO,KAAA;AAAA,MACT;AAEA,MAAA,MAAM,KAAKA,OAAA,CAAM,EAAA,CAAG,OAAO,KAAA,EAAO,aAAA,CAAc,QAAQ,CAAA;AAGxD,MAAA,EAAA,CAAG,aAAaC,mBAAAA,CAAc,MAAA,CAAO,GAAG,GAAA,EAAK,KAAA,GAAQ,CAAC,CAAC,CAAA;AACvD,MAAA,IAAA,CAAK,QAAA,CAAS,EAAA,CAAG,cAAA,EAAgB,CAAA;AACjC,MAAA,OAAO,IAAA;AAAA,IACT,CAAA;AAEA,IAAA,OAAO,SAAA;AAAA,EACT,CAAA;AAAA,EAEA,eAAA,GAAiC;AAC/B,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,CAAA,EAAG,UAAA;AAAA,MACH,CAAA,EAAG,UAAA;AAAA,MACH,CAAA,EAAG,YAAA;AAAA,MACH,CAAA,EAAG;AAAA,KACL;AAEA,IAAA,MAAM,YAAA,GAAgC,IAAA,CAAK,OAAA,CAAQ,MAAA,CAChD,MAAA,CAAO,CAAC,KAAA,KAAU,KAAA,IAAS,CAAC,CAAA,CAC5B,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,MACf,IAAA,EAAM,QAAA;AAAA,MACN,IAAA,EAAM,CAAA,OAAA,EAAU,MAAA,CAAO,KAAK,CAAC,CAAA,CAAA;AAAA,MAC7B,OAAA,EAAS,eAAA;AAAA,MACT,WAAA,EAAa,CAAC,EAAE,KAAA,EAAO,CAAA;AAAA,MACvB,UAAU,EAAE,IAAA,EAAM,WAAW,UAAA,EAAY,EAAE,OAAM,EAAE;AAAA,MACnD,IAAA,EAAM,OAAA,CAAQ,KAAK,CAAA,IAAK,OAAA;AAAA,MACxB,KAAA,EAAO,CAAA,QAAA,EAAW,MAAA,CAAO,KAAK,CAAC,CAAA,CAAA;AAAA,MAC/B,QAAA,EAAU,CAAA,QAAA,EAAW,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,KACpC,CAAE,CAAA;AAEJ,IAAA,MAAM,aAAA,GAA+B;AAAA,MACnC,IAAA,EAAM,QAAA;AAAA,MACN,IAAA,EAAM,WAAA;AAAA,MACN,OAAA,EAAS,cAAA;AAAA,MACT,QAAA,EAAU,WAAA;AAAA,MACV,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO,aAAA;AAAA,MACP,QAAA,EAAU;AAAA,KACZ;AAEA,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,UAAA;AAAA,QACN,IAAA,EAAM,SAAA;AAAA,QACN,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,SAAA;AAAA,QACP,KAAA,EAAO,CAAC,aAAA,EAAe,GAAG,YAAY,CAAA;AAAA,QACtC,KAAA,EAAO,QAAA;AAAA,QACP,QAAA,EAAU,GAAA;AAAA,QACV,WAAA,EAAa;AAAA;AACf,KACF;AAAA,EACF,CAAA;AAAA,EAEA,oBAAA,GAA2C;AACzC,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,CAAA,EAAG,UAAA;AAAA,MACH,CAAA,EAAG,UAAA;AAAA,MACH,CAAA,EAAG;AAAA,KACL;AACA,IAAA,MAAM,cAAA,GAAyC;AAAA,MAC7C,CAAA,EAAG,qBAAA;AAAA,MACH,CAAA,EAAG,wBAAA;AAAA,MACH,CAAA,EAAG;AAAA,KACL;AAEA,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,MAAA,CACjB,MAAA,CAAO,CAAC,KAAA,KAAU,KAAA,IAAS,CAAC,CAAA,CAC5B,GAAA,CAAI,CAAC,KAAA,MAA6B;AAAA,MACjC,IAAA,EAAM,CAAA,QAAA,EAAW,MAAA,CAAO,KAAK,CAAC,CAAA,CAAA;AAAA,MAC9B,KAAA,EAAO,CAAA,QAAA,EAAW,MAAA,CAAO,KAAK,CAAC,CAAA,CAAA;AAAA,MAC/B,WAAA,EAAa,cAAA,CAAe,KAAK,CAAA,IAAK,iBAAA;AAAA,MACtC,IAAA,EAAM,OAAA,CAAQ,KAAK,CAAA,IAAK,OAAA;AAAA,MACxB,KAAA,EAAO,OAAA;AAAA,MACP,QAAA,EAAU,MAAM,KAAA,GAAQ,EAAA;AAAA,MACxB,QAAA,EAAU,CAAC,SAAA,EAAW,CAAA,CAAA,EAAI,OAAO,KAAK,CAAC,IAAI,OAAO,CAAA;AAAA,MAClD,QAAA,EAAU,GAAA,CAAI,MAAA,CAAO,KAAK,CAAA,GAAI,GAAA;AAAA,MAC9B,OAAA,EAAS,eAAA;AAAA,MACT,WAAA,EAAa,CAAC,EAAE,KAAA,EAAO;AAAA,KACzB,CAAE,CAAA;AAAA,EACN,CAAA;AAAA,EAEA,qBAAA,GAAwB;AACtB,IAAA,MAAM,EAAE,OAAA,EAAS,MAAA,EAAO,GAAI,IAAA;AAK5B,IAAA,MAAM,cAAsC,EAAC;AAC7C,IAAA,KAAA,MAAW,KAAA,IAAS,QAAQ,MAAA,EAAQ;AAClC,MAAA,WAAA,CAAY,CAAA,KAAA,EAAQ,MAAA,CAAO,KAAK,CAAC,EAAE,CAAA,GAAI,KAAA;AAAA,IACzC;AAEA,IAAA,WAAA,CAAY,QAAQ,CAAA,GAAI,CAAA;AAExB,IAAA,OAAO;AAAA,MACL,IAAIC,YAAAA,CAAO;AAAA,QACT,GAAA,EAAK,IAAIwC,eAAA,CAAU,mBAAmB,CAAA;AAAA,QACtC,KAAA,EAAO;AAAA,UACL,eAAA,EAAiB;AAAA,YACf,OAAA,CAAQ,OAAO,KAAA,EAAO;AACpB,cAAA,IAAI,CAAC,MAAM,MAAA,IAAU,EAAE,MAAM,OAAA,IAAW,KAAA,CAAM,UAAU,OAAO,KAAA;AAC/D,cAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,KAAA,CAAM,IAAI,CAAA;AACpC,cAAA,IAAI,KAAA,KAAU,QAAW,OAAO,KAAA;AAEhC,cAAA,KAAA,CAAM,cAAA,EAAe;AACrB,cAAA,IAAI,UAAU,CAAA,EAAG;AACf,gBAAA,MAAA,EAAQ,QAAA,CAAS,cAAc,CAAA,IAAI;AAAA,cACrC,CAAA,MAAO;AACL,gBAAA,MAAA,EAAQ,QAAA,CAAS,eAAe,CAAA,GAAI,EAAE,OAAO,CAAA;AAAA,cAC/C;AACA,cAAA,OAAO,IAAA;AAAA,YACT;AAAA;AACF;AACF,OACD,CAAA;AAAA,MACDtC,aAAAA,CAAO;AAAA,QACL,SAAA,GAAY,CAAC,KAAA,EAAO,QAAA,KAAa;AAC/B,UAAA,MAAM,EAAE,WAAU,GAAI,KAAA;AACtB,UAAA,IAAI,CAAC,SAAA,CAAU,KAAA,EAAO,OAAO,KAAA;AAE7B,UAAA,MAAM,EAAE,OAAM,GAAI,SAAA;AAClB,UAAA,IAAI,KAAA,CAAM,YAAA,KAAiB,CAAA,EAAG,OAAO,KAAA;AACrC,UAAA,IAAI,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,IAAA,KAAS,WAAW,OAAO,KAAA;AAEjD,UAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,WAAW,CAAA;AACpD,UAAA,IAAI,CAAC,eAAe,OAAO,KAAA;AAE3B,UAAA,IAAI,QAAA,EAAU;AACZ,YAAA,QAAA;AAAA,cACE,KAAA,CAAM,EAAA,CAAG,aAAA,CAAc,KAAA,CAAM,MAAA,CAAO,MAAM,KAAK,CAAA,EAAG,aAAa,CAAA,CAAE,cAAA;AAAe,aAClF;AAAA,UACF;AACA,UAAA,OAAO,IAAA;AAAA,QACT,CAAA;AAAA,OACD;AAAA,KACH;AAAA,EACF,CAAA;AAAA,EAEA,aAAA,GAAgB;AACd,IAAA,MAAM,EAAE,QAAA,EAAU,OAAA,EAAQ,GAAI,IAAA;AAE9B,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,OAAO,EAAC;AAAA,IACV;AAEA,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,GAAG,QAAQ,MAAM,CAAA;AAC3C,IAAA,OAAO;AAAA,MACL,sBAAA,CAAuB;AAAA,QACrB,MAAM,IAAI,MAAA,CAAO,SAAS,MAAA,CAAO,QAAQ,CAAC,CAAA,MAAA,CAAQ,CAAA;AAAA,QAClD,IAAA,EAAM,QAAA;AAAA,QACN,aAAA,EAAe,CAAC,KAAA,KAAU;AACxB,UAAA,MAAM,MAAA,GAAS,MAAM,CAAC,CAAA;AACtB,UAAA,IAAI,CAAC,MAAA,EAAQ;AACX,YAAA,OAAO,IAAA;AAAA,UACT;AACA,UAAA,MAAM,QAAQ,MAAA,CAAO,MAAA;AAErB,UAAA,IAAI,CAAC,OAAA,CAAQ,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG;AACnC,YAAA,OAAO,IAAA;AAAA,UACT;AACA,UAAA,OAAO,EAAE,KAAA,EAAM;AAAA,QACjB;AAAA,OACD;AAAA,KACH;AAAA,EACF;AACF,CAAC;;;AC7SM,IAAM,UAAA,GAAaqC,MAAK,MAAA,CAA0B;AAAA,EACvD,IAAA,EAAM,YAAA;AAAA,EACN,KAAA,EAAO,OAAA;AAAA,EACP,OAAA,EAAS,QAAA;AAAA,EACT,QAAA,EAAU,IAAA;AAAA,EAEV,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,gBAAgB;AAAC,KACnB;AAAA,EACF,CAAA;AAAA,EAEA,SAAA,GAAY;AACV,IAAA,OAAO,CAAC,EAAE,GAAA,EAAK,YAAA,EAAc,CAAA;AAAA,EAC/B,CAAA;AAAA,EAEA,UAAA,CAAW,EAAE,cAAA,EAAe,EAAG;AAC7B,IAAA,OAAO,CAAC,YAAA,EAAc,EAAE,GAAG,IAAA,CAAK,QAAQ,cAAA,EAAgB,GAAG,cAAA,EAAe,EAAG,CAAC,CAAA;AAAA,EAChF,CAAA;AAAA,EAEA,WAAA,GAAc;AACZ,IAAA,MAAM,EAAE,MAAK,GAAI,IAAA;AACjB,IAAA,OAAO;AAAA,MACL,aAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM;AAChB,QAAA,OAAO,QAAA,CAAS,OAAO,IAAI,CAAA;AAAA,MAC7B,CAAA;AAAA,MACF,gBAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM;AAChB,QAAA,OAAO,QAAA,CAAS,WAAW,IAAI,CAAA;AAAA,MACjC,CAAA;AAAA,MACF,eAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM;AAChB,QAAA,OAAO,SAAS,IAAA,EAAK;AAAA,MACvB;AAAA,KACJ;AAAA,EACF,CAAA;AAAA,EAEA,oBAAA,GAAuB;AACrB,IAAA,MAAM,EAAE,QAAO,GAAI,IAAA;AACnB,IAAA,OAAO;AAAA,MACL,eAAe,MAAM;AACnB,QAAA,OAAO,MAAA,EAAQ,QAAA,CAAS,kBAAkB,CAAA,IAAI,IAAK,KAAA;AAAA,MACrD;AAAA,KACF;AAAA,EACF,CAAA;AAAA,EAEA,eAAA,GAAiC;AAC/B,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,YAAA;AAAA,QACN,OAAA,EAAS,kBAAA;AAAA,QACT,QAAA,EAAU,YAAA;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,KAAA,EAAO,YAAA;AAAA,QACP,QAAA,EAAU,aAAA;AAAA,QACV,KAAA,EAAO,QAAA;AAAA,QACP,QAAA,EAAU;AAAA;AACZ,KACF;AAAA,EACF,CAAA;AAAA,EAEA,oBAAA,GAA2C;AACzC,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,YAAA;AAAA,QACN,KAAA,EAAO,OAAA;AAAA,QACP,WAAA,EAAa,iBAAA;AAAA,QACb,IAAA,EAAM,QAAA;AAAA,QACN,KAAA,EAAO,OAAA;AAAA,QACP,QAAA,EAAU,GAAA;AAAA,QACV,QAAA,EAAU,CAAC,OAAA,EAAS,YAAA,EAAc,UAAU,CAAA;AAAA,QAC5C,QAAA,EAAU,IAAA;AAAA,QACV,OAAA,EAAS;AAAA;AACX,KACF;AAAA,EACF,CAAA;AAAA,EAEA,aAAA,GAAgB;AACd,IAAA,MAAM,EAAE,UAAS,GAAI,IAAA;AAErB,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,OAAO,EAAC;AAAA,IACV;AAEA,IAAA,OAAO;AAAA,MACL,kBAAkB,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,UAAU;AAAA,KACxD;AAAA,EACF;AACF,CAAC;ACtFM,IAAM,SAAA,GAAYA,MAAK,MAAA,CAAyB;AAAA,EACrD,IAAA,EAAM,WAAA;AAAA,EACN,KAAA,EAAO,OAAA;AAAA,EACP,OAAA,EAAS,OAAA;AAAA,EACT,KAAA,EAAO,EAAA;AAAA,EACP,IAAA,EAAM,IAAA;AAAA,EACN,QAAA,EAAU,IAAA;AAAA,EAEV,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,mBAAA,EAAqB,WAAA;AAAA,MACrB,gBAAgB,EAAC;AAAA,MACjB,iBAAA,EAAmB;AAAA,KACrB;AAAA,EACF,CAAA;AAAA,EAEA,aAAA,GAAgB;AACd,IAAA,MAAM,EAAE,SAAQ,GAAI,IAAA;AACpB,IAAA,OAAO;AAAA,MACL,QAAA,EAAU;AAAA,QACR,OAAA,EAAS,IAAA;AAAA,QACT,SAAA,EAAW,CAAC,OAAA,KAAyB;AACnC,UAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,aAAA,CAAc,MAAM,CAAA;AAC3C,UAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAEpB,UAAA,MAAM,SAAS,OAAA,CAAQ,mBAAA;AAGvB,UAAA,MAAM,OAAA,GAAU,MAAA,CAAO,SAAA,CAAU,KAAA,CAAM,KAAK,CAAA;AAC5C,UAAA,KAAA,MAAW,OAAO,OAAA,EAAS;AACzB,YAAA,IAAI,GAAA,CAAI,UAAA,CAAW,MAAM,CAAA,EAAG;AAC1B,cAAA,OAAO,GAAA,CAAI,KAAA,CAAM,MAAA,CAAO,MAAM,CAAA,IAAK,IAAA;AAAA,YACrC;AAAA,UACF;AACA,UAAA,OAAO,IAAA;AAAA,QACT,CAAA;AAAA,QACA,YAAY,MAAM;AAEhB,UAAA,OAAO,EAAC;AAAA,QACV;AAAA;AACF,KACF;AAAA,EACF,CAAA;AAAA,EAEA,SAAA,GAAY;AACV,IAAA,OAAO;AAAA,MACL;AAAA,QACE,GAAA,EAAK,KAAA;AAAA,QACL,kBAAA,EAAoB;AAAA;AACtB,KACF;AAAA,EACF,CAAA;AAAA,EAEA,UAAA,CAAW,EAAE,IAAA,EAAM,cAAA,EAAe,EAAG;AACnC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA;AAEtC,IAAA,MAAM,YAAqC,EAAC;AAC5C,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,SAAA,CAAU,OAAO,CAAA,GAAI,CAAA,EAAG,KAAK,OAAA,CAAQ,mBAAmB,GAAG,QAAQ,CAAA,CAAA;AAAA,IACrE;AAEA,IAAA,OAAO;AAAA,MACL,KAAA;AAAA,MACA,EAAE,GAAG,IAAA,CAAK,OAAA,CAAQ,cAAA,EAAgB,GAAG,cAAA,EAAe;AAAA,MACpD,CAAC,MAAA,EAAQ,SAAA,EAAW,CAAC;AAAA,KACvB;AAAA,EACF,CAAA;AAAA,EAEA,WAAA,GAAc;AACZ,IAAA,MAAM,EAAE,MAAK,GAAI,IAAA;AACjB,IAAA,OAAO;AAAA,MACL,cACE,CAAC,UAAA,KACD,CAAC,EAAE,UAAS,KAAM;AAChB,QAAA,OAAO,QAAA,CAAS,YAAA,CAAa,IAAA,EAAM,UAAU,CAAA;AAAA,MAC/C,CAAA;AAAA,MACF,iBACE,CAAC,UAAA,KACD,CAAC,EAAE,UAAS,KAAM;AAChB,QAAA,OAAO,QAAA,CAAS,eAAA,CAAgB,IAAA,EAAM,WAAA,EAAa,UAAU,CAAA;AAAA,MAC/D;AAAA,KACJ;AAAA,EACF,CAAA;AAAA,EAEA,oBAAA,GAAuB;AACrB,IAAA,MAAM,EAAE,QAAO,GAAI,IAAA;AAEnB,IAAA,MAAM,gBAAgB,MAAe;AACnC,MAAA,IAAI,CAAC,QAAQ,OAAO,KAAA;AACpB,MAAA,MAAM,SAAEzC,OAAA,EAAO,IAAA,EAAK,GAAI,MAAA;AACxB,MAAA,MAAM,KAAA,GAAQA,OAAA,CAAM,SAAA,CAAU,KAAA,CAAM,KAAA,EAAM;AAC1C,MAAA,MAAM,YAAYA,OAAA,CAAM,MAAA,CAAO,KAAA,CAAM,WAAW,GAAG,aAAA,EAAc;AACjE,MAAA,IAAI,CAAC,WAAW,OAAO,KAAA;AACvB,MAAA,MAAM,EAAA,GAAKA,OAAA,CAAM,EAAA,CAAG,MAAA,CAAO,OAAO,SAAS,CAAA;AAC3C,MAAA,EAAA,CAAG,YAAA,CAAaC,oBAAc,IAAA,CAAK,EAAA,CAAG,IAAI,OAAA,CAAQ,KAAA,GAAQ,CAAC,CAAC,CAAC,CAAA;AAC7D,MAAA,IAAA,CAAK,QAAA,CAAS,EAAA,CAAG,cAAA,EAAgB,CAAA;AACjC,MAAA,OAAO,IAAA;AAAA,IACT,CAAA;AAEA,IAAA,OAAO;AAAA,MACL,aAAa,MAAM,MAAA,EAAQ,QAAA,CAAS,iBAAiB,KAAI,IAAK,KAAA;AAAA,MAE9D,OAAO,MAAM;AACX,QAAA,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,iBAAA,IAAqB,CAAC,QAAQ,OAAO,KAAA;AACvD,QAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAA,CAAO,KAAA,CAAM,SAAA;AAC/B,QAAA,IAAI,KAAA,CAAM,MAAA,CAAO,IAAA,KAAS,IAAA,CAAK,UAAU,OAAO,KAAA;AAChD,QAAA,MAAM,MAAM,KAAA,CAAM,YAAA;AAClB,QAAA,IAAI,MAAM,CAAA,IAAK,GAAA,KAAQ,MAAM,MAAA,CAAO,OAAA,CAAQ,MAAM,OAAO,KAAA;AACzD,QAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,WAAA;AAC1B,QAAA,IAAI,IAAA,CAAK,GAAA,GAAM,CAAC,CAAA,KAAM,IAAA,IAAQ,KAAK,GAAA,GAAM,CAAC,CAAA,KAAM,IAAA,EAAM,OAAO,KAAA;AAC7D,QAAA,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,KAAA,CAAM,EAAA,CAAG,MAAA,CAAO,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,KAAA,CAAM,GAAG,CAAC,CAAA;AACrE,QAAA,OAAO,aAAA,EAAc;AAAA,MACvB,CAAA;AAAA,MAEA,WAAW,MAAM;AACf,QAAA,IAAI,CAAC,QAAQ,OAAO,KAAA;AACpB,QAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAA,CAAO,KAAA,CAAM,SAAA;AAC/B,QAAA,IAAI,KAAA,CAAM,MAAA,CAAO,IAAA,KAAS,IAAA,CAAK,UAAU,OAAO,KAAA;AAChD,QAAA,IAAI,MAAM,YAAA,KAAiB,KAAA,CAAM,MAAA,CAAO,OAAA,CAAQ,MAAM,OAAO,KAAA;AAC7D,QAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,EAAM;AAC1B,QAAA,IAAI,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,GAAA,CAAI,OAAA,CAAQ,IAAA,IAAQ,MAAA,CAAO,KAAA,CAAM,GAAA,CAAI,OAAA,CAAQ,KAAK,CAAA,CAAE,WAAW,OAAO,KAAA;AAC/F,QAAA,OAAO,aAAA,EAAc;AAAA,MACvB;AAAA,KACF;AAAA,EACF,CAAA;AAAA,EAEA,eAAA,GAAiC;AAC/B,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,WAAA;AAAA,QACN,OAAA,EAAS,iBAAA;AAAA,QACT,QAAA,EAAU,WAAA;AAAA,QACV,IAAA,EAAM,WAAA;AAAA,QACN,KAAA,EAAO,YAAA;AAAA,QACP,QAAA,EAAU,WAAA;AAAA,QACV,KAAA,EAAO,QAAA;AAAA,QACP,QAAA,EAAU;AAAA;AACZ,KACF;AAAA,EACF,CAAA;AAAA,EAEA,oBAAA,GAA2C;AACzC,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,YAAA;AAAA,QACN,KAAA,EAAO,YAAA;AAAA,QACP,WAAA,EAAa,wBAAA;AAAA,QACb,IAAA,EAAM,WAAA;AAAA,QACN,KAAA,EAAO,OAAA;AAAA,QACP,QAAA,EAAU,GAAA;AAAA,QACV,QAAA,EAAU,CAAC,MAAA,EAAQ,SAAA,EAAW,KAAK,CAAA;AAAA,QACnC,QAAA,EAAU,MAAA;AAAA,QACV,OAAA,EAAS;AAAA;AACX,KACF;AAAA,EACF,CAAA;AAAA,EAEA,aAAA,GAAgB;AACd,IAAA,MAAM,EAAE,UAAS,GAAI,IAAA;AAErB,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,OAAO,EAAC;AAAA,IACV;AAEA,IAAA,OAAO;AAAA,MACL,sBAAA,CAAuB;AAAA,QACrB,IAAA,EAAM,sBAAA;AAAA,QACN,IAAA,EAAM,QAAA;AAAA,QACN,aAAA,EAAe,CAAC,KAAA,KAAU;AACxB,UAAA,MAAM,QAAA,GAAW,KAAA,CAAM,CAAC,CAAA,IAAK,IAAA;AAC7B,UAAA,OAAO,EAAE,QAAA,EAAS;AAAA,QACpB;AAAA,OACD;AAAA,KACH;AAAA,EACF;AACF,CAAC;ACvLD,IAAM,mCAAmB,IAAI,GAAA,CAAI,CAAC,YAAA,EAAc,aAAA,EAAe,UAAU,CAAC,CAAA;AAa1E,SAAS,kBAAA,CACP,QACA,YAAA,EACyE;AACzE,EAAA,MAAM,EAAE,KAAA,EAAO,IAAA,EAAK,GAAI,MAAA;AACxB,EAAA,MAAM,YAAA,GAAe,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,YAAY,CAAA;AACpD,EAAA,IAAI,CAAC,cAAc,OAAO,IAAA;AAE1B,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,KAAA,CAAM,SAAA;AACxB,EAAA,KAAA,IAAS,CAAA,GAAI,KAAA,CAAM,KAAA,EAAO,CAAA,GAAI,GAAG,CAAA,EAAA,EAAK;AACpC,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA;AAEzB,IAAA,IAAI,IAAA,CAAK,KAAK,IAAA,CAAK,QAAA,IAAY,KAAK,IAAA,KAAS,YAAA,IAAgB,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS;AAC9E,MAAA,MAAM,SAAS,CAAA,GAAI,CAAA,GAAI,MAAM,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA,GAAI,IAAA;AAC3C,MAAA,IAAI,QAAQ,IAAA,CAAK,IAAA,CAAK,KAAA,EAAO,QAAA,CAAS,MAAM,CAAA,EAAG;AAC7C,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF;AACA,IAAA,IAAI,IAAA,CAAK,SAAS,YAAA,EAAc;AAC9B,MAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,YAAA,EAAa;AAAA,IACrC;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAEO,IAAM,UAAA,GAAa,UAAU,MAAA,CAA0B;AAAA,EAC5D,IAAA,EAAM,YAAA;AAAA,EAEN,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,QAAA,EAAU;AAAA,KACZ;AAAA,EACF,CAAA;AAAA,EAEA,oBAAA,GAAuB;AACrB,IAAA,OAAO;AAAA;AAAA,MAEL,KAAK,MAAM;AACT,QAAA,IAAI,CAAC,IAAA,CAAK,MAAA,EAAQ,OAAO,KAAA;AACzB,QAAA,MAAM,MAAM,kBAAA,CAAmB,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,QAAQ,QAAQ,CAAA;AACjE,QAAA,IAAI,CAAC,KAAK,OAAO,KAAA;AACjB,QAAA,OAAO0C,uBAAA,CAAa,IAAI,YAAY,CAAA,CAAE,IAAI,KAAA,EAAO,GAAA,CAAI,KAAK,QAAQ,CAAA;AAAA,MACpE,CAAA;AAAA;AAAA,MAGA,aAAa,MAAM;AACjB,QAAA,IAAI,CAAC,IAAA,CAAK,MAAA,EAAQ,OAAO,KAAA;AACzB,QAAA,MAAM,MAAM,kBAAA,CAAmB,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,QAAQ,QAAQ,CAAA;AACjE,QAAA,IAAI,CAAC,KAAK,OAAO,KAAA;AACjB,QAAA,OAAOtB,uBAAAA,CAAa,IAAI,YAAY,CAAA,CAAE,IAAI,KAAA,EAAO,GAAA,CAAI,KAAK,QAAQ,CAAA;AAAA,MACpE,CAAA;AAAA;AAAA,MAGA,WAAW,MAAM;AACf,QAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,QAAA,IAAI,CAAC,QAAQ,OAAO,KAAA;AAEpB,QAAA,MAAM,SAAErB,OAAA,EAAO,IAAA,EAAK,GAAI,MAAA;AACxB,QAAA,MAAM,EAAE,KAAA,EAAO,KAAA,EAAM,GAAIA,OAAA,CAAM,SAAA;AAG/B,QAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,YAAA,KAAiB,GAAG,OAAO,KAAA;AAc/C,QAAA,IACE,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,IAAA,KAAS,WAAA,IAC3B,KAAA,CAAM,MAAA,CAAO,OAAA,CAAQ,IAAA,KAAS,CAAA,IAC9B,KAAA,CAAM,KAAA,IAAS,CAAA,EACf;AACA,UAAA,MAAM,cAAA,GAAiB,MAAM,KAAA,GAAQ,CAAA;AACrC,UAAA,MAAM,GAAA,GAAM,KAAA,CAAM,KAAA,CAAM,cAAc,CAAA;AACtC,UAAA,IAAI,MAAM,CAAA,EAAG;AACX,YAAA,MAAM,SAAA,GAAY,KAAA,CAAM,IAAA,CAAK,cAAc,CAAA;AAC3C,YAAA,MAAM,IAAA,GAAO,SAAA,CAAU,KAAA,CAAM,GAAA,GAAM,CAAC,CAAA;AACpC,YAAA,IAAI,gBAAA,CAAiB,GAAA,CAAI,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,EAAG;AACxC,cAAA,MAAM,SAAA,GAAY,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,KAAK,CAAA;AAC1C,cAAA,MAAM,OAAA,GAAU,KAAA,CAAM,KAAA,CAAM,KAAA,CAAM,KAAK,CAAA;AACvC,cAAA,MAAM,OAAA,GAAU,SAAA;AAChB,cAAA,MAAM,SAAA,GAAY,UAAU,IAAA,CAAK,QAAA;AACjC,cAAA,IAAI,gBAAA,GAAmB,EAAA;AACvB,cAAAA,OAAA,CAAM,IAAI,YAAA,CAAa,SAAA,EAAW,OAAA,EAAS,CAAC,GAAG,CAAA,KAAM;AACnD,gBAAA,IAAI,EAAE,WAAA,EAAa,gBAAA,GAAmB,CAAA,GAAI,CAAA,GAAI,EAAE,OAAA,CAAQ,IAAA;AACxD,gBAAA,OAAO,IAAA;AAAA,cACT,CAAC,CAAA;AACD,cAAA,IAAI,qBAAqB,EAAA,EAAI;AAC3B,gBAAA,MAAM,EAAA,GAAKA,OAAA,CAAM,EAAA,CAAG,MAAA,CAAO,WAAW,OAAO,CAAA;AAS7C,gBAAA,MAAM,IAAA,GAAO,MAAM,CAAA,GAAI,SAAA,CAAU,aAC7B,SAAA,CAAU,KAAA,CAAM,GAAA,GAAM,CAAC,CAAA,GACvB,IAAA;AACJ,gBAAA,IAAI,IAAA,EAAM,SAAS,IAAA,CAAK,IAAA,IAAQY,kBAAQ,EAAA,CAAG,GAAA,EAAK,SAAS,CAAA,EAAG;AAC1D,kBAAA,EAAA,CAAG,KAAK,SAAS,CAAA;AAAA,gBACnB;AAEA,gBAAA,EAAA,CAAG,aAAaX,mBAAAA,CAAc,MAAA,CAAO,EAAA,CAAG,GAAA,EAAK,gBAAgB,CAAC,CAAA;AAC9D,gBAAA,IAAA,CAAK,QAAA,CAAS,EAAA,CAAG,cAAA,EAAgB,CAAA;AACjC,gBAAA,OAAO,IAAA;AAAA,cACT;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAEA,QAAA,MAAM,eAAeD,OAAA,CAAM,MAAA,CAAO,KAAA,CAAM,IAAA,CAAK,QAAQ,QAAQ,CAAA;AAC7D,QAAA,IAAI,CAAC,cAAc,OAAO,KAAA;AAG1B,QAAA,IAAI,aAAA,GAAgB,EAAA;AACpB,QAAA,KAAA,IAAS,CAAA,GAAI,KAAA,CAAM,KAAA,EAAO,CAAA,GAAI,GAAG,CAAA,EAAA,EAAK;AACpC,UAAA,IAAI,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,CAAE,SAAS,YAAA,EAAc;AACvC,YAAA,aAAA,GAAgB,CAAA;AAChB,YAAA;AAAA,UACF;AAAA,QACF;AAEA,QAAA,IAAI,aAAA,KAAkB,IAAI,OAAO,KAAA;AAIjC,QAAA,MAAM,YAAA,GAAe,KAAA,CAAM,IAAA,CAAK,aAAa,CAAA;AAC7C,QAAA,MAAM,aAAa,YAAA,CAAa,UAAA;AAEhC,QAAA,IAAI,YAAY,WAAA,EAAa;AAE3B,UAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,GAAA,GAAM,KAAA,CAAM,MAAM,aAAa,CAAA;AAC3D,UAAA,IAAI,iBAAiB,CAAA,EAAG;AACtB,YAAA,OAAOqB,uBAAAA,CAAa,YAAY,CAAA,CAAErB,OAAA,EAAO,KAAK,QAAQ,CAAA;AAAA,UACxD;AAAA,QACF;AAEA,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,KACF;AAAA,EACF;AACF,CAAC;;;AClKM,IAAM,QAAA,GAAWyC,MAAK,MAAA,CAAwB;AAAA,EACnD,IAAA,EAAM,UAAA;AAAA;AAAA;AAAA,EAGN,OAAA,EAAS,kBAAA;AAAA,EACT,QAAA,EAAU,IAAA;AAAA,EAEV,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,gBAAgB;AAAC,KACnB;AAAA,EACF,CAAA;AAAA,EAEA,SAAA,GAAY;AACV,IAAA,OAAO,CAAC,EAAE,GAAA,EAAK,IAAA,EAAM,CAAA;AAAA,EACvB,CAAA;AAAA,EAEA,UAAA,CAAW,EAAE,cAAA,EAAe,EAAG;AAC7B,IAAA,OAAO,CAAC,IAAA,EAAM,EAAE,GAAG,IAAA,CAAK,QAAQ,cAAA,EAAgB,GAAG,cAAA,EAAe,EAAG,CAAC,CAAA;AAAA,EACxE,CAAA;AAAA,EAEA,aAAA,GAAgB;AACd,IAAA,OAAO,CAAC,UAAU,CAAA;AAAA,EACpB,CAAA;AAAA,EAEA,oBAAA,GAAuB;AACrB,IAAA,OAAO;AAAA,MACL,OAAO,MAAM;AACX,QAAA,IAAI,CAAC,IAAA,CAAK,MAAA,IAAU,CAAC,IAAA,CAAK,UAAU,OAAO,KAAA;AAC3C,QAAA,MAAM,SAAEzC,OAAA,EAAO,IAAA,EAAK,GAAI,IAAA,CAAK,MAAA;AAC7B,QAAA,MAAM,EAAE,KAAA,EAAM,GAAIA,OAAA,CAAM,SAAA;AACxB,QAAA,IAAI,KAAA,CAAM,KAAA,GAAQ,CAAA,IAAK,KAAA,CAAM,IAAA,CAAK,EAAE,CAAA,CAAE,IAAA,KAAS,IAAA,CAAK,QAAA,EAAU,OAAO,KAAA;AAGrE,QAAA,IAAI,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,IAAA,KAAS,aAAa,OAAO,KAAA;AAInD,QAAA,MAAM,GAAA,GAAM,yBAAyB,KAAK,CAAA;AAC1C,QAAA,IAAI,KAAK,gBAAA,EAAkB;AACzB,UAAA,IAAI,IAAI,gBAAA,EAAkB;AACxB,YAAA,IAAI,0BAA0BA,OAAA,EAAO,IAAA,CAAK,QAAA,EAAU,GAAG,GAAG,OAAO,IAAA;AAAA,UACnE,CAAA,MAAO;AACL,YAAA,IAAI4C,mBAAA,CAAW5C,OAAA,EAAO,IAAA,CAAK,QAAQ,GAAG,OAAO,IAAA;AAAA,UAC/C;AAAA,QACF;AAEA,QAAA,IAAI6C,wBAAA,CAAc,KAAK,QAAQ,CAAA,CAAE7C,SAAO,IAAA,CAAK,QAAQ,GAAG,OAAO,IAAA;AAM/D,QAAA,MAAM,SAAA,GAAY,MAAM,KAAA,GAAQ,CAAA;AAChC,QAAA,MAAM,YAAA,GAAeA,OAAA,CAAM,MAAA,CAAO,KAAA,CAAM,UAAU,CAAA;AAClD,QAAA,IAAI,KAAA,CAAM,MAAA,CAAO,OAAA,CAAQ,IAAA,KAAS,KAAK,SAAA,GAAY,CAAA,IAC9C,YAAA,IAAgB,KAAA,CAAM,IAAA,CAAK,SAAA,GAAY,CAAC,CAAA,CAAE,SAAS,YAAA,EAAc;AACpE,UAAA,MAAM,KAAKA,OAAA,CAAM,EAAA;AACjB,UAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,SAAS,EAAE,UAAA,IAAc,CAAA,GAAI,SAAA,GAAY,KAAA,CAAM,KAAA,GAAQ,CAAA;AACnF,UAAA,EAAA,CAAG,MAAA,CAAO,MAAM,MAAA,CAAO,QAAQ,GAAG,KAAA,CAAM,KAAA,CAAM,QAAQ,CAAC,CAAA;AACvD,UAAA,MAAM,gBAAgB,SAAA,GAAY,CAAA;AAClC,UAAA,MAAM,MAAM,EAAA,CAAG,OAAA,CAAQ,IAAI,KAAA,CAAM,KAAA,CAAM,aAAa,CAAC,CAAA;AACrD,UAAA,MAAM,IAAA,GAAO,aAAa,aAAA,EAAc;AACxC,UAAA,IAAI,IAAA,EAAM;AACR,YAAA,EAAA,CAAG,MAAA,CAAO,KAAK,IAAI,CAAA;AACnB,YAAA,EAAA,CAAG,YAAA,CAAa8C,gBAAU,IAAA,CAAK,EAAA,CAAG,IAAI,OAAA,CAAQ,GAAA,GAAM,CAAC,CAAC,CAAC,CAAA;AACvD,YAAA,IAAA,CAAK,QAAA,CAAS,EAAA,CAAG,cAAA,EAAgB,CAAA;AACjC,YAAA,OAAO,IAAA;AAAA,UACT;AAAA,QACF;AAEA,QAAA,OAAOzB,wBAAa,IAAA,CAAK,QAAQ,CAAA,CAAErB,OAAA,EAAO,KAAK,QAAQ,CAAA;AAAA,MACzD,CAAA;AAAA,MAEA,WAAW,MAAM;AACf,QAAA,IAAI,CAAC,IAAA,CAAK,MAAA,IAAU,CAAC,IAAA,CAAK,UAAU,OAAO,KAAA;AAC3C,QAAA,MAAM,EAAE,KAAA,EAAO,IAAA,EAAK,GAAI,IAAA,CAAK,MAAA;AAC7B,QAAA,MAAM,EAAE,KAAA,EAAO,KAAA,EAAM,GAAI,KAAA,CAAM,SAAA;AAC/B,QAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,YAAA,KAAiB,GAAG,OAAO,KAAA;AAC/C,QAAA,IAAI,KAAA,CAAM,MAAA,CAAO,OAAA,CAAQ,IAAA,KAAS,GAAG,OAAO,KAAA;AAI5C,QAAA,MAAM,GAAA,GAAM,yBAAyB,KAAK,CAAA;AAC1C,QAAA,IAAI,GAAA,IAAO,GAAA,CAAI,gBAAA,IAAoB,GAAA,CAAI,gBAAA,EAAkB;AACvD,UAAA,IAAI,+BAA+B,KAAA,EAAO,IAAA,CAAK,QAAA,EAAU,GAAG,GAAG,OAAO,IAAA;AAAA,QACxE;AAEA,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,KACF;AAAA,EACF;AACF,CAAC;;;AC/FM,IAAM,UAAA,GAAayC,MAAK,MAAA,CAA0B;AAAA,EACvD,IAAA,EAAM,YAAA;AAAA,EACN,KAAA,EAAO,YAAA;AAAA,EACP,OAAA,EAAS,WAAA;AAAA,EAET,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,gBAAgB,EAAC;AAAA,MACjB,YAAA,EAAc;AAAA,KAChB;AAAA,EACF,CAAA;AAAA,EAEA,SAAA,GAAY;AACV,IAAA,OAAO,CAAC,EAAE,GAAA,EAAK,IAAA,EAAM,CAAA;AAAA,EACvB,CAAA;AAAA,EAEA,UAAA,CAAW,EAAE,cAAA,EAAe,EAAG;AAC7B,IAAA,OAAO,CAAC,IAAA,EAAM,EAAE,GAAG,IAAA,CAAK,QAAQ,cAAA,EAAgB,GAAG,cAAA,EAAe,EAAG,CAAC,CAAA;AAAA,EACxE,CAAA;AAAA,EAEA,WAAA,GAAc;AACZ,IAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAI,IAAA;AAC1B,IAAA,OAAO;AAAA,MACL,gBAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM;AAChB,QAAA,OAAO,QAAA,CAAS,UAAA,CAAW,IAAA,EAAM,OAAA,CAAQ,YAAY,CAAA;AAAA,MACvD;AAAA,KACJ;AAAA,EACF,CAAA;AAAA,EAEA,eAAA,GAAiC;AAC/B,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,YAAA;AAAA,QACN,OAAA,EAAS,kBAAA;AAAA,QACT,QAAA,EAAU,YAAA;AAAA,QACV,IAAA,EAAM,aAAA;AAAA,QACN,KAAA,EAAO,aAAA;AAAA,QACP,QAAA,EAAU,aAAA;AAAA,QACV,KAAA,EAAO,OAAA;AAAA,QACP,QAAA,EAAU;AAAA;AACZ,KACF;AAAA,EACF,CAAA;AAAA,EAEA,oBAAA,GAA2C;AACzC,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,aAAA;AAAA,QACN,KAAA,EAAO,eAAA;AAAA,QACP,WAAA,EAAa,+BAAA;AAAA,QACb,IAAA,EAAM,aAAA;AAAA,QACN,KAAA,EAAO,OAAA;AAAA,QACP,QAAA,EAAU,GAAA;AAAA,QACV,QAAA,EAAU,CAAC,QAAA,EAAU,MAAA,EAAQ,aAAa,IAAI,CAAA;AAAA,QAC9C,QAAA,EAAU,IAAA;AAAA,QACV,OAAA,EAAS,kBAAA;AAAA;AAAA;AAAA,QAGT,cAAA,EAAgB,CAAC,YAAY;AAAA;AAC/B,KACF;AAAA,EACF,CAAA;AAAA,EAEA,oBAAA,GAAuB;AACrB,IAAA,MAAM,EAAE,QAAO,GAAI,IAAA;AACnB,IAAA,OAAO;AAAA,MACL,eAAe,MAAM;AACnB,QAAA,OAAO,MAAA,EAAQ,QAAA,CAAS,kBAAkB,CAAA,IAAI,IAAK,KAAA;AAAA,MACrD;AAAA,KACF;AAAA,EACF,CAAA;AAAA,EAEA,aAAA,GAAgB;AACd,IAAA,OAAO,CAAC,QAAQ,CAAA;AAAA,EAClB,CAAA;AAAA,EAEA,aAAA,GAAgB;AACd,IAAA,MAAM,EAAE,UAAS,GAAI,IAAA;AAErB,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,OAAO,EAAC;AAAA,IACV;AAEA,IAAA,OAAO;AAAA;AAAA,MAEL,iBAAA,CAAkB,EAAE,IAAA,EAAM,YAAA,EAAc,IAAA,EAAM,UAAU,KAAA,EAAO,aAAA,EAAe,WAAA,EAAa,IAAA,EAAM,CAAA;AAAA;AAAA,MAEjG,iBAAA,CAAkB,EAAE,IAAA,EAAM,YAAA,EAAc,IAAA,EAAM,UAAU,KAAA,EAAO,aAAA,EAAe,WAAA,EAAa,IAAA,EAAM,CAAA;AAAA;AAAA,MAEjG,iBAAA,CAAkB,EAAE,IAAA,EAAM,YAAA,EAAc,IAAA,EAAM,UAAU,KAAA,EAAO,aAAA,EAAe,WAAA,EAAa,IAAA,EAAM;AAAA,KACnG;AAAA,EACF;AACF,CAAC;;;AC/FM,IAAM,WAAA,GAAcA,MAAK,MAAA,CAA2B;AAAA,EACzD,IAAA,EAAM,aAAA;AAAA,EACN,KAAA,EAAO,YAAA;AAAA,EACP,OAAA,EAAS,WAAA;AAAA,EAET,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,gBAAgB,EAAC;AAAA,MACjB,YAAA,EAAc;AAAA,KAChB;AAAA,EACF,CAAA;AAAA,EAEA,aAAA,GAAgB;AACd,IAAA,OAAO;AAAA,MACL,KAAA,EAAO;AAAA,QACL,OAAA,EAAS,CAAA;AAAA,QACT,SAAA,EAAW,CAAC,OAAA,KAAyB;AACnC,UAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,YAAA,CAAa,OAAO,CAAA;AAC1C,UAAA,OAAO,KAAA,GAAQ,QAAA,CAAS,KAAA,EAAO,EAAE,CAAA,GAAI,CAAA;AAAA,QACvC,CAAA;AAAA,QACA,UAAA,EAAY,CAAC,UAAA,KAAwC;AACnD,UAAA,MAAM,KAAA,GAAQ,WAAW,OAAO,CAAA;AAChC,UAAA,IAAI,UAAU,CAAA,EAAG;AACf,YAAA,OAAO,EAAC;AAAA,UACV;AACA,UAAA,OAAO,EAAE,KAAA,EAAO,MAAA,CAAO,KAAK,CAAA,EAAE;AAAA,QAChC;AAAA;AACF,KACF;AAAA,EACF,CAAA;AAAA,EAEA,SAAA,GAAY;AACV,IAAA,OAAO,CAAC,EAAE,GAAA,EAAK,IAAA,EAAM,CAAA;AAAA,EACvB,CAAA;AAAA,EAEA,UAAA,CAAW,EAAE,cAAA,EAAe,EAAG;AAC7B,IAAA,OAAO,CAAC,IAAA,EAAM,EAAE,GAAG,IAAA,CAAK,QAAQ,cAAA,EAAgB,GAAG,cAAA,EAAe,EAAG,CAAC,CAAA;AAAA,EACxE,CAAA;AAAA,EAEA,WAAA,GAAc;AACZ,IAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAI,IAAA;AAC1B,IAAA,OAAO;AAAA,MACL,iBAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM;AAChB,QAAA,OAAO,QAAA,CAAS,UAAA,CAAW,IAAA,EAAM,OAAA,CAAQ,YAAY,CAAA;AAAA,MACvD;AAAA,KACJ;AAAA,EACF,CAAA;AAAA,EAEA,eAAA,GAAiC;AAC/B,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,aAAA;AAAA,QACN,OAAA,EAAS,mBAAA;AAAA,QACT,QAAA,EAAU,aAAA;AAAA,QACV,IAAA,EAAM,aAAA;AAAA,QACN,KAAA,EAAO,cAAA;AAAA,QACP,QAAA,EAAU,aAAA;AAAA,QACV,KAAA,EAAO,OAAA;AAAA,QACP,QAAA,EAAU;AAAA;AACZ,KACF;AAAA,EACF,CAAA;AAAA,EAEA,oBAAA,GAA2C;AACzC,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,cAAA;AAAA,QACN,KAAA,EAAO,eAAA;AAAA,QACP,WAAA,EAAa,wBAAA;AAAA,QACb,IAAA,EAAM,aAAA;AAAA,QACN,KAAA,EAAO,OAAA;AAAA,QACP,QAAA,EAAU,GAAA;AAAA,QACV,UAAU,CAAC,SAAA,EAAW,UAAA,EAAY,MAAA,EAAQ,MAAM,IAAI,CAAA;AAAA,QACpD,QAAA,EAAU,KAAA;AAAA,QACV,OAAA,EAAS,mBAAA;AAAA,QACT,cAAA,EAAgB,CAAC,aAAa;AAAA;AAChC,KACF;AAAA,EACF,CAAA;AAAA,EAEA,oBAAA,GAAuB;AACrB,IAAA,MAAM,EAAE,QAAO,GAAI,IAAA;AACnB,IAAA,OAAO;AAAA,MACL,eAAe,MAAM;AACnB,QAAA,OAAO,MAAA,EAAQ,QAAA,CAAS,mBAAmB,CAAA,IAAI,IAAK,KAAA;AAAA,MACtD;AAAA,KACF;AAAA,EACF,CAAA;AAAA,EAEA,aAAA,GAAgB;AACd,IAAA,OAAO,CAAC,QAAQ,CAAA;AAAA,EAClB,CAAA;AAAA,EAEA,aAAA,GAAgB;AACd,IAAA,MAAM,EAAE,UAAS,GAAI,IAAA;AAErB,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,OAAO,EAAC;AAAA,IACV;AAEA,IAAA,OAAO;AAAA;AAAA,MAEL,iBAAA,CAAkB;AAAA,QAChB,IAAA,EAAM,aAAA;AAAA,QACN,IAAA,EAAM,QAAA;AAAA,QACN,KAAA,EAAO,aAAA;AAAA,QACP,WAAA,EAAa,IAAA;AAAA,QACb,aAAA,EAAe,CAAC,KAAA,KAAU;AACxB,UAAA,MAAM,GAAA,GAAM,MAAM,CAAC,CAAA;AACnB,UAAA,OAAO,EAAE,KAAA,EAAO,GAAA,GAAM,SAAS,GAAA,EAAK,EAAE,IAAI,CAAA,EAAE;AAAA,QAC9C;AAAA,OACD;AAAA,KACH;AAAA,EACF;AACF,CAAC;ACpHM,IAAM,cAAA,GAAiBA,MAAK,MAAA,CAA8B;AAAA,EAC/D,IAAA,EAAM,gBAAA;AAAA,EACN,KAAA,EAAO,OAAA;AAAA,EAEP,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,gBAAgB;AAAC,KACnB;AAAA,EACF,CAAA;AAAA,EAEA,SAAA,GAAY;AACV,IAAA,OAAO,CAAC,EAAE,GAAA,EAAK,IAAA,EAAM,CAAA;AAAA,EACvB,CAAA;AAAA,EAEA,UAAA,CAAW,EAAE,cAAA,EAAe,EAAG;AAC7B,IAAA,OAAO,CAAC,MAAM,EAAE,GAAG,KAAK,OAAA,CAAQ,cAAA,EAAgB,GAAG,cAAA,EAAgB,CAAA;AAAA,EACrE,CAAA;AAAA,EAEA,WAAA,GAAc;AACZ,IAAA,OAAO;AAAA,MACL,mBACE,MACA,CAAC,SAAEzC,OAAA,EAAO,EAAA,EAAI,UAAS,KAAM;AAC3B,QAAA,IAAI,CAAC,IAAA,CAAK,QAAA,EAAU,OAAO,KAAA;AAE3B,QAAA,MAAM,EAAE,KAAA,EAAM,GAAI,EAAA,CAAG,SAAA;AACrB,QAAA,MAAM,SAAS,KAAA,CAAM,MAAA;AAIrB,QAAA,IAAI,CAAC,MAAA,CAAO,WAAA,EAAa,OAAO,KAAA;AAEhC,QAAA,MAAM,aAAA,GAAgBA,OAAA,CAAM,MAAA,CAAO,KAAA,CAAM,WAAW,CAAA;AACpD,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,MAAA,EAAO;AACpC,QAAA,MAAM,iBAAA,GAAoB,eAAe,MAAA,EAAO;AAChD,QAAA,MAAM,QAAQ,iBAAA,GAAoB,CAAC,QAAQ,iBAAiB,CAAA,GAAI,CAAC,MAAM,CAAA;AAOvE,QAAA,MAAM,SAAA,GAAY,kBAAA,CAAmBA,OAAA,EAAO,EAAE,CAAA;AAC9C,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AACtB,UAAA,EAAA,CAAG,WAAA,CAAY,SAAA,CAAU,IAAA,EAAM,SAAA,CAAU,IAAI,KAAK,CAAA;AAClD,UAAA,MAAM,MAAMC,mBAAAA,CAAc,QAAA;AAAA,YACxB,EAAA,CAAG,GAAA,CAAI,OAAA,CAAQ,SAAA,CAAU,OAAO,CAAC,CAAA;AAAA,YACjC;AAAA,WACF;AACA,UAAA,IAAI,GAAA,EAAK,EAAA,CAAG,YAAA,CAAa,GAAG,CAAA;AAC5B,UAAA,QAAA,CAAS,EAAA,CAAG,gBAAgB,CAAA;AAC5B,UAAA,OAAO,IAAA;AAAA,QACT;AAEA,QAAA,IAAI,QAAA,EAAU;AAEZ,UAAA,IAAI,OAAO,OAAA,CAAQ,IAAA,KAAS,KAAK,MAAA,CAAO,IAAA,CAAK,SAAS,WAAA,EAAa;AACjE,YAAA,MAAM,IAAA,GAAO,MAAM,MAAA,EAAO;AAC1B,YAAA,MAAM,EAAA,GAAK,MAAM,KAAA,EAAM;AACvB,YAAA,EAAA,CAAG,WAAA,CAAY,IAAA,EAAM,EAAA,EAAI,KAAK,CAAA;AAC9B,YAAA,MAAM,GAAA,GAAMA,oBAAc,QAAA,CAAS,EAAA,CAAG,IAAI,OAAA,CAAQ,IAAA,GAAO,CAAC,CAAA,EAAG,CAAC,CAAA;AAC9D,YAAA,IAAI,GAAA,EAAK,EAAA,CAAG,YAAA,CAAa,GAAG,CAAA;AAAA,UAC9B,CAAA,MAAO;AAEL,YAAA,MAAM,GAAA,GAAM,MAAM,KAAA,EAAM;AACxB,YAAA,EAAA,CAAG,MAAA,CAAO,KAAK,KAAK,CAAA;AACpB,YAAA,MAAM,GAAA,GAAMA,oBAAc,QAAA,CAAS,EAAA,CAAG,IAAI,OAAA,CAAQ,GAAA,GAAM,CAAC,CAAA,EAAG,CAAC,CAAA;AAC7D,YAAA,IAAI,GAAA,EAAK,EAAA,CAAG,YAAA,CAAa,GAAG,CAAA;AAAA,UAC9B;AAEA,UAAA,QAAA,CAAS,EAAE,CAAA;AAAA,QACb;AAEA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,KACJ;AAAA,EACF,CAAA;AAAA,EAEA,eAAA,GAAiC;AAC/B,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,gBAAA;AAAA,QACN,OAAA,EAAS,mBAAA;AAAA,QACT,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,iBAAA;AAAA,QACP,KAAA,EAAO,QAAA;AAAA,QACP,QAAA,EAAU;AAAA;AACZ,KACF;AAAA,EACF,CAAA;AAAA,EAEA,oBAAA,GAA2C;AACzC,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,iBAAA;AAAA,QACN,KAAA,EAAO,SAAA;AAAA,QACP,WAAA,EAAa,0BAAA;AAAA,QACb,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,OAAA;AAAA,QACP,QAAA,EAAU,GAAA;AAAA,QACV,UAAU,CAAC,SAAA,EAAW,IAAA,EAAM,MAAA,EAAQ,aAAa,iBAAiB,CAAA;AAAA,QAClE,QAAA,EAAU,MAAA;AAAA,QACV,OAAA,EAAS;AAAA;AACX,KACF;AAAA,EACF,CAAA;AAAA,EAEA,aAAA,GAAgB;AACd,IAAA,MAAM,EAAE,UAAS,GAAI,IAAA;AAErB,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,OAAO,EAAC;AAAA,IACV;AAEA,IAAA,OAAO;AAAA,MACL,IAAIS,oBAAAA;AAAA,QACF,2BAAA;AAAA,QACA,CAACV,OAAA,EAAoB,KAAA,EAAyB,KAAA,KAAkB;AAC9D,UAAA,MAAM,EAAE,IAAG,GAAIA,OAAA;AAEf,UAAA,IAAI,KAAA,CAAM,CAAC,CAAA,EAAG;AACZ,YAAA,MAAM,MAAA,GAASA,OAAA,CAAM,GAAA,CAAI,OAAA,CAAQ,KAAK,CAAA;AAEtC,YAAA,MAAM,IAAA,GAAO,OAAO,MAAA,EAAO;AAC3B,YAAA,MAAM,EAAA,GAAK,OAAO,KAAA,EAAM;AACxB,YAAA,MAAM,YAAYA,OAAA,CAAM,MAAA,CAAO,KAAA,CAAM,WAAW,GAAG,MAAA,EAAO;AAC1D,YAAA,MAAM,KAAA,GAAQ,SAAA,GACV,CAAC,QAAA,CAAS,MAAA,EAAO,EAAG,SAAS,CAAA,GAC7B,CAAC,QAAA,CAAS,MAAA,EAAQ,CAAA;AACtB,YAAA,EAAA,CAAG,WAAA,CAAY,IAAA,EAAM,EAAA,EAAI,KAAK,CAAA;AAG9B,YAAA,MAAM,GAAA,GAAMC,oBAAc,QAAA,CAAS,EAAA,CAAG,IAAI,OAAA,CAAQ,IAAA,GAAO,CAAC,CAAA,EAAG,CAAC,CAAA;AAC9D,YAAA,IAAI,GAAA,EAAK;AACP,cAAA,EAAA,CAAG,aAAa,GAAG,CAAA;AAAA,YACrB;AAAA,UACF;AAEA,UAAA,OAAO,EAAA;AAAA,QACT;AAAA;AACF,KACF;AAAA,EACF;AACF,CAAC;;;ACrJM,IAAM,SAAA,GAAYwC,MAAK,MAAA,CAAyB;AAAA,EACrD,IAAA,EAAM,WAAA;AAAA,EACN,KAAA,EAAO,QAAA;AAAA,EACP,MAAA,EAAQ,IAAA;AAAA,EACR,UAAA,EAAY,KAAA;AAAA,EAEZ,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,gBAAgB;AAAC,KACnB;AAAA,EACF,CAAA;AAAA,EAEA,SAAA,GAAY;AACV,IAAA,OAAO,CAAC,EAAE,GAAA,EAAK,IAAA,EAAM,CAAA;AAAA,EACvB,CAAA;AAAA,EAEA,UAAA,CAAW,EAAE,cAAA,EAAe,EAAG;AAC7B,IAAA,OAAO,CAAC,MAAM,EAAE,GAAG,KAAK,OAAA,CAAQ,cAAA,EAAgB,GAAG,cAAA,EAAgB,CAAA;AAAA,EACrE,CAAA;AAAA,EAEA,WAAA,GAAc;AACZ,IAAA,MAAM,EAAE,MAAK,GAAI,IAAA;AACjB,IAAA,OAAO;AAAA,MACL,YAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM;AAChB,QAAA,OAAO,QAAA,CAAS,aAAA,CAAc,EAAE,IAAA,EAAM,MAAM,CAAA;AAAA,MAC9C,CAAA;AAAA,MACF,YACE,MACA,CAAC,EAAE,EAAA,EAAI,UAAS,KAAM;AACpB,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,EAAA,CAAG,WAAW,MAAQ,CAAA;AACtB,UAAA,QAAA,CAAS,EAAE,CAAA;AAAA,QACb;AACA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,KACJ;AAAA,EACF,CAAA;AAAA,EAEA,eAAA,GAAiC;AAC/B,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,WAAA;AAAA,QACN,OAAA,EAAS,cAAA;AAAA,QACT,IAAA,EAAM,WAAA;AAAA,QACN,KAAA,EAAO,YAAA;AAAA,QACP,QAAA,EAAU,aAAA;AAAA,QACV,KAAA,EAAO,QAAA;AAAA,QACP,QAAA,EAAU;AAAA;AACZ,KACF;AAAA,EACF,CAAA;AAAA,EAEA,oBAAA,GAAuB;AACrB,IAAA,MAAM,EAAE,QAAO,GAAI,IAAA;AACnB,IAAA,OAAO;AAAA,MACL,aAAa,MAAM;AACjB,QAAA,OAAO,MAAA,EAAQ,QAAA,CAAS,cAAc,CAAA,IAAI,IAAK,KAAA;AAAA,MACjD,CAAA;AAAA,MACA,eAAe,MAAM;AACnB,QAAA,OAAO,MAAA,EAAQ,QAAA,CAAS,cAAc,CAAA,IAAI,IAAK,KAAA;AAAA,MACjD,CAAA;AAAA,MACA,mBAAmB,MAAM;AACvB,QAAA,OAAO,MAAA,EAAQ,QAAA,CAAS,YAAY,CAAA,IAAI,IAAK,KAAA;AAAA,MAC/C;AAAA,KACF;AAAA,EACF;AACF,CAAC;;;ACrEM,IAAM,mBAAN,MAA2C;AAAA,EACvC,GAAA;AAAA,EACA,UAAA;AAAA,EACQ,KAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACT,IAAA;AAAA,EAER,YAAY,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,QAAO,EAAyB;AACjE,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK,IAAA;AACrB,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAEd,IAAA,IAAA,CAAK,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,IAAI,CAAA;AAGtC,IAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,OAAA,CAAQ,cAAc,CAAA,EAAG;AACjE,MAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW;AACzC,QAAA,IAAA,CAAK,GAAA,CAAI,YAAA,CAAa,GAAA,EAAK,OAAO,KAAA,KAAU,WAAW,KAAA,GAAQ,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,MACtF;AAAA,IACF;AACA,IAAA,IAAA,CAAK,GAAA,CAAI,YAAA,CAAa,WAAA,EAAa,UAAU,CAAA;AAC7C,IAAA,IAAA,CAAK,GAAA,CAAI,aAAa,cAAA,EAAgB,IAAA,CAAK,MAAM,SAAS,CAAA,GAAI,SAAS,OAAO,CAAA;AAE9E,IAAA,IAAA,CAAK,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAC3C,IAAA,IAAA,CAAK,KAAA,CAAM,YAAA,CAAa,iBAAA,EAAmB,OAAO,CAAA;AAElD,IAAA,IAAA,CAAK,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAC3C,IAAA,IAAA,CAAK,MAAM,IAAA,GAAO,UAAA;AAClB,IAAA,IAAA,CAAK,MAAM,OAAA,GAAU,CAAC,CAAC,IAAA,CAAK,MAAM,SAAS,CAAA;AAC3C,IAAA,IAAA,CAAK,KAAA,CAAM,QAAA,GAAW,CAAC,IAAA,CAAK,QAAA;AAC5B,IAAA,IAAA,CAAK,KAAA,CAAM,YAAA,CAAa,YAAA,EAAc,aAAa,CAAA;AAEnD,IAAA,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,IAAA,CAAK,KAAK,CAAA;AACjC,IAAA,IAAA,CAAK,GAAA,CAAI,WAAA,CAAY,IAAA,CAAK,KAAK,CAAA;AAE/B,IAAA,IAAA,CAAK,UAAA,GAAa,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC9C,IAAA,IAAA,CAAK,GAAA,CAAI,WAAA,CAAY,IAAA,CAAK,UAAU,CAAA;AAEpC,IAAA,IAAA,CAAK,KAAA,CAAM,gBAAA,CAAiB,QAAA,EAAU,IAAA,CAAK,YAAY,CAAA;AAAA,EACzD;AAAA,EAEQ,YAAA,GAAe,CAAC,KAAA,KAAuB;AAC7C,IAAA,KAAA,CAAM,cAAA,EAAe;AACrB,IAAA,IAAI,CAAC,IAAA,CAAK,IAAA,CAAK,QAAA,EAAU;AAEvB,MAAA,IAAA,CAAK,MAAM,OAAA,GAAU,CAAC,CAAC,IAAA,CAAK,IAAA,CAAK,MAAM,SAAS,CAAA;AAChD,MAAA;AAAA,IACF;AACA,IAAA,MAAM,GAAA,GAAM,KAAK,MAAA,EAAO;AACxB,IAAA,IAAI,QAAQ,MAAA,EAAW;AACvB,IAAA,MAAM,EAAE,KAAA,EAAO,QAAA,EAAS,GAAI,IAAA,CAAK,IAAA;AACjC,IAAA,MAAM,EAAA,GAAK,KAAA,CAAM,EAAA,CAAG,aAAA,CAAc,KAAK,MAAA,EAAW;AAAA,MAChD,GAAG,KAAK,IAAA,CAAK,KAAA;AAAA,MACb,OAAA,EAAS,KAAK,KAAA,CAAM;AAAA,KACrB,CAAA;AACD,IAAA,QAAA,CAAS,EAAE,CAAA;AAAA,EACb,CAAA;AAAA,EAEA,OAAO,IAAA,EAAuB;AAG5B,IAAA,IAAI,IAAA,CAAK,IAAA,KAAS,IAAA,CAAK,QAAA,EAAU,OAAO,KAAA;AACxC,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,MAAM,OAAA,GAAU,CAAC,CAAC,IAAA,CAAK,MAAM,SAAS,CAAA;AACtC,IAAA,IAAA,CAAK,GAAA,CAAI,YAAA,CAAa,cAAA,EAAgB,OAAA,GAAU,SAAS,OAAO,CAAA;AAChE,IAAA,IAAA,CAAK,MAAM,OAAA,GAAU,OAAA;AACrB,IAAA,IAAA,CAAK,KAAA,CAAM,QAAA,GAAW,CAAC,IAAA,CAAK,IAAA,CAAK,QAAA;AACjC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,UAAU,KAAA,EAAuB;AAI/B,IAAA,OAAO,MAAM,MAAA,YAAkB,IAAA,IAAQ,KAAK,KAAA,CAAM,QAAA,CAAS,MAAM,MAAM,CAAA;AAAA,EACzE;AAAA,EAEA,eAAe,QAAA,EAAuC;AAGpD,IAAA,OAAO,SAAS,MAAA,YAAkB,IAAA,IAAQ,KAAK,KAAA,CAAM,QAAA,CAAS,SAAS,MAAM,CAAA;AAAA,EAC/E;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,KAAA,CAAM,mBAAA,CAAoB,QAAA,EAAU,IAAA,CAAK,YAAY,CAAA;AAAA,EAC5D;AACF,CAAA;;;AC1EO,IAAM,QAAA,GAAWA,MAAK,MAAA,CAAwB;AAAA,EACnD,IAAA,EAAM,UAAA;AAAA;AAAA;AAAA,EAIN,OAAA,EAAS,kBAAA;AAAA,EAET,QAAA,EAAU,IAAA;AAAA,EAEV,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,gBAAgB,EAAC;AAAA,MACjB,MAAA,EAAQ;AAAA,KACV;AAAA,EACF,CAAA;AAAA,EAEA,aAAA,GAAgB;AACd,IAAA,OAAO;AAAA,MACL,OAAA,EAAS;AAAA,QACP,OAAA,EAAS,KAAA;AAAA,QACT,WAAA,EAAa,KAAA;AAAA,QACb,SAAA,EAAW,CAAC,OAAA,KAAyB;AACnC,UAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,YAAA,CAAa,cAAc,CAAA;AACvD,UAAA,OAAO,WAAA,KAAgB,UAAU,WAAA,KAAgB,EAAA;AAAA,QACnD,CAAA;AAAA,QACA,UAAA,EAAY,CAAC,UAAA,MAAyC;AAAA,UACpD,cAAA,EAAgB,UAAA,CAAW,SAAS,CAAA,GAAI,MAAA,GAAS;AAAA,SACnD;AAAA;AACF,KACF;AAAA,EACF,CAAA;AAAA,EAEA,SAAA,GAAY;AACV,IAAA,OAAO;AAAA,MACL;AAAA,QACE,GAAA,EAAK,CAAA,cAAA,EAAiB,IAAA,CAAK,IAAI,CAAA,EAAA,CAAA;AAAA,QAC/B,QAAA,EAAU;AAAA;AACZ,KACF;AAAA,EACF,CAAA;AAAA,EAEA,UAAA,CAAW,EAAE,IAAA,EAAM,cAAA,EAAe,EAAG;AACnC,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MACA;AAAA,QACE,GAAG,KAAK,OAAA,CAAQ,cAAA;AAAA,QAChB,GAAG,cAAA;AAAA,QACH,aAAa,IAAA,CAAK;AAAA,OACpB;AAAA,MACA;AAAA,QACE,OAAA;AAAA,QACA,EAAE,iBAAiB,OAAA,EAAQ;AAAA,QAC3B;AAAA,UACE,OAAA;AAAA,UACA;AAAA,YACE,IAAA,EAAM,UAAA;AAAA,YACN,OAAA,EAAS,IAAA,CAAK,KAAA,CAAM,SAAS,IAAI,SAAA,GAAY,IAAA;AAAA,YAC7C,YAAA,EAAc;AAAA;AAChB;AACF,OACF;AAAA,MACA,CAAC,OAAO,CAAC;AAAA,KACX;AAAA,EACF,CAAA;AAAA,EAEA,WAAA,GAAc;AACZ,IAAA,MAAM,UAAU,IAAA,CAAK,OAAA;AACrB,IAAA,OAAO,CAAC,IAAA,EAAM,IAAA,EAAM,MAAA,KAClB,IAAI,gBAAA,CAAiB,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,MAAA,EAAQ,CAAA;AAAA,EACxD,CAAA;AAAA,EAEA,WAAA,GAAc;AACZ,IAAA,MAAM,EAAE,MAAK,GAAI,IAAA;AACjB,IAAA,OAAO;AAAA,MACL,YACE,MACA,CAAC,EAAE,KAAA,EAAO,UAAS,KAAM;AACvB,QAAA,MAAM,EAAE,WAAU,GAAI,KAAA;AACtB,QAAA,MAAM,EAAE,OAAM,GAAI,SAAA;AAGlB,QAAA,IAAI,WAAA,GAA6B,IAAA;AACjC,QAAA,IAAI,YAAA,GAAe,IAAA;AAEnB,QAAA,KAAA,IAAS,KAAA,GAAQ,KAAA,CAAM,KAAA,EAAO,KAAA,IAAS,GAAG,KAAA,EAAA,EAAS;AACjD,UAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA;AAC7B,UAAA,IAAI,IAAA,CAAK,IAAA,CAAK,IAAA,KAAS,IAAA,EAAM;AAC3B,YAAA,WAAA,GAAc,KAAA,CAAM,OAAO,KAAK,CAAA;AAChC,YAAA,YAAA,GAAe,IAAA;AACf,YAAA;AAAA,UACF;AAAA,QACF;AAEA,QAAA,IAAI,WAAA,KAAgB,IAAA,IAAQ,CAAC,YAAA,EAAc,OAAO,KAAA;AAElD,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,MAAM,EAAA,GAAK,KAAA,CAAM,EAAA,CAAG,aAAA,CAAc,aAAa,MAAA,EAAW;AAAA,YACxD,GAAG,YAAA,CAAa,KAAA;AAAA,YAChB,OAAA,EAAS,CAAC,YAAA,CAAa,KAAA,CAAM,SAAS;AAAA,WACvC,CAAA;AACD,UAAA,QAAA,CAAS,EAAE,CAAA;AAAA,QACb;AAEA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,KACJ;AAAA,EACF,CAAA;AAAA,EAEA,oBAAA,GAAuB;AACrB,IAAA,OAAO;AAAA,MACL,OAAO,MAAM;AACX,QAAA,IAAI,CAAC,IAAA,CAAK,MAAA,IAAU,CAAC,IAAA,CAAK,UAAU,OAAO,KAAA;AAC3C,QAAA,MAAM,SAAEzC,OAAA,EAAO,IAAA,EAAK,GAAI,IAAA,CAAK,MAAA;AAC7B,QAAA,MAAM,EAAE,KAAA,EAAM,GAAIA,OAAA,CAAM,SAAA;AACxB,QAAA,IAAI,KAAA,CAAM,KAAA,GAAQ,CAAA,IAAK,KAAA,CAAM,IAAA,CAAK,EAAE,CAAA,CAAE,IAAA,KAAS,IAAA,CAAK,QAAA,EAAU,OAAO,KAAA;AAGrE,QAAA,IAAI,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,IAAA,KAAS,aAAa,OAAO,KAAA;AAGnD,QAAA,MAAM,GAAA,GAAM,yBAAyB,KAAK,CAAA;AAC1C,QAAA,IAAI,KAAK,gBAAA,EAAkB;AACzB,UAAA,IAAI,IAAI,gBAAA,EAAkB;AACxB,YAAA,IAAI,0BAA0BA,OAAA,EAAO,IAAA,CAAK,QAAA,EAAU,GAAG,GAAG,OAAO,IAAA;AAAA,UACnE,CAAA,MAAO;AACL,YAAA,IAAI4C,mBAAAA,CAAW5C,OAAA,EAAO,IAAA,CAAK,QAAQ,GAAG,OAAO,IAAA;AAAA,UAC/C;AAAA,QACF;AAQA,QAAA,IAAI6C,wBAAAA,CAAc,IAAA,CAAK,QAAA,EAAU,EAAE,OAAA,EAAS,KAAA,EAAO,CAAA,CAAE7C,OAAA,EAAO,IAAA,CAAK,QAAQ,CAAA,EAAG,OAAO,IAAA;AAKnF,QAAA,IAAI,KAAA,CAAM,MAAA,CAAO,OAAA,CAAQ,IAAA,KAAS,CAAA,EAAG;AACnC,UAAA,MAAM,YAAA,GAAeA,OAAA,CAAM,MAAA,CAAO,KAAA,CAAM,UAAU,CAAA;AAClD,UAAA,IAAI,YAAA,EAAc;AAChB,YAAA,IAAI,mBAAA,GAAsB,EAAA;AAC1B,YAAA,KAAA,IAAS,IAAI,KAAA,CAAM,KAAA,GAAQ,CAAA,EAAG,CAAA,GAAI,GAAG,CAAA,EAAA,EAAK;AACxC,cAAA,IAAI,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,CAAE,SAAS,YAAA,EAAc;AACvC,gBAAA,mBAAA,GAAsB,CAAA;AACtB,gBAAA;AAAA,cACF;AAAA,YACF;AAEA,YAAA,IAAI,sBAAsB,CAAA,EAAG;AAC3B,cAAA,MAAM,KAAKA,OAAA,CAAM,EAAA;AACjB,cAAA,MAAM,aAAA,GAAgB,MAAM,KAAA,GAAQ,CAAA;AACpC,cAAA,MAAM,YAAA,GAAe,KAAA,CAAM,IAAA,CAAK,aAAa,CAAA;AAE7C,cAAA,IAAI,YAAA,CAAa,aAAa,CAAA,EAAG;AAG/B,gBAAA,EAAA,CAAG,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,KAAK,GAAG,KAAA,CAAM,KAAA,CAAM,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,cAC/D,CAAA,MAAO;AACL,gBAAA,MAAM,gBAAgB,aAAA,GAAgB,CAAA;AACtC,gBAAA,MAAM,YAAA,GAAe,KAAA,CAAM,IAAA,CAAK,aAAa,CAAA;AAE7C,gBAAA,IAAI,YAAA,CAAa,cAAc,CAAA,EAAG;AAIhC,kBAAA,EAAA,CAAG,MAAA,CAAO,MAAM,MAAA,CAAO,aAAa,GAAG,KAAA,CAAM,KAAA,CAAM,aAAa,CAAC,CAAA;AAAA,gBACnE,CAAA,MAAO;AAEL,kBAAA,EAAA,CAAG,MAAA,CAAO,MAAM,MAAA,CAAO,aAAa,GAAG,KAAA,CAAM,KAAA,CAAM,aAAa,CAAC,CAAA;AAAA,gBACnE;AAAA,cACF;AAGA,cAAA,MAAM,cAAc,EAAA,CAAG,OAAA,CAAQ,IAAI,KAAA,CAAM,KAAA,CAAM,mBAAmB,CAAC,CAAA;AACnE,cAAA,MAAM,OAAA,GAAU,aAAa,aAAA,EAAc;AAC3C,cAAA,IAAI,OAAA,EAAS;AACX,gBAAA,EAAA,CAAG,MAAA,CAAO,aAAa,OAAO,CAAA;AAC9B,gBAAA,EAAA,CAAG,YAAA,CAAa8C,gBAAU,IAAA,CAAK,EAAA,CAAG,IAAI,OAAA,CAAQ,WAAA,GAAc,CAAC,CAAC,CAAC,CAAA;AAC/D,gBAAA,IAAA,CAAK,QAAA,CAAS,EAAA,CAAG,cAAA,EAAgB,CAAA;AACjC,gBAAA,OAAO,IAAA;AAAA,cACT;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAGA,QAAA,OAAOzB,wBAAa,IAAA,CAAK,QAAQ,CAAA,CAAErB,OAAA,EAAO,KAAK,QAAQ,CAAA;AAAA,MACzD,CAAA;AAAA,MACA,KAAK,MAAM;AACT,QAAA,IAAI,CAAC,IAAA,CAAK,MAAA,IAAU,CAAC,IAAA,CAAK,UAAU,OAAO,KAAA;AAC3C,QAAA,MAAM,EAAE,KAAA,EAAM,GAAI,IAAA,CAAK,OAAO,KAAA,CAAM,SAAA;AACpC,QAAA,IAAI,KAAA,CAAM,KAAA,GAAQ,CAAA,IAAK,KAAA,CAAM,IAAA,CAAK,EAAE,CAAA,CAAE,IAAA,KAAS,IAAA,CAAK,QAAA,EAAU,OAAO,KAAA;AACrE,QAAA,OAAO2C,uBAAAA,CAAa,IAAA,CAAK,QAAQ,CAAA,CAAE,IAAA,CAAK,OAAO,KAAA,EAAO,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA;AAAA,MACjF,CAAA;AAAA,MACA,aAAa,MAAM;AACjB,QAAA,IAAI,CAAC,IAAA,CAAK,MAAA,IAAU,CAAC,IAAA,CAAK,UAAU,OAAO,KAAA;AAC3C,QAAA,MAAM,EAAE,KAAA,EAAM,GAAI,IAAA,CAAK,OAAO,KAAA,CAAM,SAAA;AACpC,QAAA,IAAI,KAAA,CAAM,KAAA,GAAQ,CAAA,IAAK,KAAA,CAAM,IAAA,CAAK,EAAE,CAAA,CAAE,IAAA,KAAS,IAAA,CAAK,QAAA,EAAU,OAAO,KAAA;AACrE,QAAA,OAAOtB,uBAAAA,CAAa,IAAA,CAAK,QAAQ,CAAA,CAAE,IAAA,CAAK,OAAO,KAAA,EAAO,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA;AAAA,MACjF,CAAA;AAAA,MACA,WAAW,MAAM;AACf,QAAA,IAAI,CAAC,IAAA,CAAK,MAAA,IAAU,CAAC,IAAA,CAAK,UAAU,OAAO,KAAA;AAC3C,QAAA,MAAM,EAAE,KAAA,EAAO,IAAA,EAAK,GAAI,IAAA,CAAK,MAAA;AAC7B,QAAA,MAAM,EAAE,KAAA,EAAO,KAAA,EAAM,GAAI,KAAA,CAAM,SAAA;AAG/B,QAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,YAAA,KAAiB,GAAG,OAAO,KAAA;AAG/C,QAAA,IAAI,KAAA,CAAM,MAAA,CAAO,OAAA,CAAQ,IAAA,KAAS,CAAA,EAAG;AACnC,UAAA,MAAM,GAAA,GAAM,yBAAyB,KAAK,CAAA;AAC1C,UAAA,IAAI,GAAA,IAAO,GAAA,CAAI,gBAAA,IAAoB,GAAA,CAAI,gBAAA,EAAkB;AACvD,YAAA,IAAI,+BAA+B,KAAA,EAAO,IAAA,CAAK,QAAA,EAAU,GAAG,GAAG,OAAO,IAAA;AAAA,UACxE;AAAA,QACF;AAGA,QAAA,IAAI,aAAA,GAAgB,EAAA;AACpB,QAAA,KAAA,IAAS,CAAA,GAAI,KAAA,CAAM,KAAA,EAAO,CAAA,GAAI,GAAG,CAAA,EAAA,EAAK;AACpC,UAAA,IAAI,MAAM,IAAA,CAAK,CAAC,CAAA,CAAE,IAAA,KAAS,KAAK,QAAA,EAAU;AACxC,YAAA,aAAA,GAAgB,CAAA;AAChB,YAAA;AAAA,UACF;AAAA,QACF;AACA,QAAA,IAAI,aAAA,KAAkB,IAAI,OAAO,KAAA;AAGjC,QAAA,IAAI,KAAA,CAAM,KAAA,CAAM,aAAa,CAAA,KAAM,GAAG,OAAO,KAAA;AAE7C,QAAA,OAAOA,wBAAa,IAAA,CAAK,QAAQ,CAAA,CAAE,KAAA,EAAO,KAAK,QAAQ,CAAA;AAAA,MACzD,CAAA;AAAA,MACA,aAAa,MAAM;AACjB,QAAA,OAAO,IAAA,CAAK,MAAA,EAAQ,QAAA,CAAS,YAAY,KAAI,IAAK,KAAA;AAAA,MACpD;AAAA,KACF;AAAA,EACF;AACF,CAAC;;;AC5PM,IAAM,QAAA,GAAWoB,MAAK,MAAA,CAAwB;AAAA,EACnD,IAAA,EAAM,UAAA;AAAA,EACN,KAAA,EAAO,YAAA;AAAA,EACP,OAAA,EAAS,WAAA;AAAA,EAET,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,gBAAgB,EAAC;AAAA,MACjB,YAAA,EAAc;AAAA,KAChB;AAAA,EACF,CAAA;AAAA,EAEA,SAAA,GAAY;AACV,IAAA,OAAO;AAAA,MACL;AAAA,QACE,GAAA,EAAK,CAAA,cAAA,EAAiB,IAAA,CAAK,IAAI,CAAA,EAAA,CAAA;AAAA,QAC/B,QAAA,EAAU;AAAA;AAAA;AACZ,KACF;AAAA,EACF,CAAA;AAAA,EAEA,UAAA,CAAW,EAAE,cAAA,EAAe,EAAG;AAC7B,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MACA;AAAA,QACE,GAAG,KAAK,OAAA,CAAQ,cAAA;AAAA,QAChB,GAAG,cAAA;AAAA,QACH,aAAa,IAAA,CAAK;AAAA,OACpB;AAAA,MACA;AAAA,KACF;AAAA,EACF,CAAA;AAAA,EAEA,WAAA,GAAc;AACZ,IAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAI,IAAA;AAC1B,IAAA,OAAO;AAAA,MACL,cAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM;AAChB,QAAA,OAAO,QAAA,CAAS,UAAA,CAAW,IAAA,EAAM,OAAA,CAAQ,YAAY,CAAA;AAAA,MACvD;AAAA,KACJ;AAAA,EACF,CAAA;AAAA,EAEA,oBAAA,GAAuB;AACrB,IAAA,MAAM,EAAE,QAAO,GAAI,IAAA;AACnB,IAAA,OAAO;AAAA,MACL,eAAe,MAAM;AACnB,QAAA,OAAO,MAAA,EAAQ,QAAA,CAAS,gBAAgB,CAAA,IAAI,IAAK,KAAA;AAAA,MACnD;AAAA,KACF;AAAA,EACF,CAAA;AAAA,EAEA,eAAA,GAAiC;AAC/B,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,UAAA;AAAA,QACN,OAAA,EAAS,gBAAA;AAAA,QACT,QAAA,EAAU,UAAA;AAAA,QACV,IAAA,EAAM,YAAA;AAAA,QACN,KAAA,EAAO,WAAA;AAAA,QACP,QAAA,EAAU,aAAA;AAAA,QACV,KAAA,EAAO,OAAA;AAAA,QACP,QAAA,EAAU;AAAA;AACZ,KACF;AAAA,EACF,CAAA;AAAA,EAEA,oBAAA,GAA2C;AACzC,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,WAAA;AAAA,QACN,KAAA,EAAO,YAAA;AAAA,QACP,WAAA,EAAa,kCAAA;AAAA,QACb,IAAA,EAAM,YAAA;AAAA,QACN,KAAA,EAAO,OAAA;AAAA,QACP,QAAA,EAAU,GAAA;AAAA,QACV,QAAA,EAAU,CAAC,MAAA,EAAQ,MAAA,EAAQ,YAAY,OAAO,CAAA;AAAA,QAC9C,QAAA,EAAU,MAAA;AAAA,QACV,OAAA,EAAS,gBAAA;AAAA,QACT,cAAA,EAAgB,CAAC,UAAU;AAAA;AAC7B,KACF;AAAA,EACF,CAAA;AAAA,EAEA,aAAA,GAAgB;AACd,IAAA,OAAO,CAAC,QAAQ,CAAA;AAAA,EAClB,CAAA;AAAA,EAEA,aAAA,GAAgB;AACd,IAAA,MAAM,EAAE,UAAS,GAAI,IAAA;AAErB,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,OAAO,EAAC;AAAA,IACV;AAEA,IAAA,OAAO;AAAA;AAAA,MAEL,iBAAA,CAAkB,EAAE,IAAA,EAAM,gBAAA,EAAkB,IAAA,EAAM,UAAU,KAAA,EAAO,aAAA,EAAe,WAAA,EAAa,IAAA,EAAM,CAAA;AAAA;AAAA,MAErG,iBAAA,CAAkB,EAAE,IAAA,EAAM,iBAAA,EAAmB,IAAA,EAAM,UAAU,KAAA,EAAO,aAAA,EAAe,WAAA,EAAa,IAAA,EAAM;AAAA,KACxG;AAAA,EACF;AACF,CAAC;;;AC7FM,IAAM,IAAA,GAAO,KAAK,MAAA,CAAoB;AAAA,EAC3C,IAAA,EAAM,MAAA;AAAA,EAEN,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,gBAAgB;AAAC,KACnB;AAAA,EACF,CAAA;AAAA,EAEA,SAAA,GAAY;AACV,IAAA,OAAO;AAAA,MACL,EAAE,KAAK,QAAA,EAAS;AAAA,MAChB;AAAA,QACE,GAAA,EAAK,GAAA;AAAA,QACL,QAAA,EAAU,CAAC,IAAA,KAAS;AAClB,UAAA,IAAI,OAAO,IAAA,KAAS,QAAA,EAAU,OAAO,EAAC;AACtC,UAAA,MAAM,UAAA,GAAa,KAAK,KAAA,CAAM,UAAA;AAG9B,UAAA,IAAI,UAAA,KAAe,QAAA,IAAY,UAAA,KAAe,KAAA,EAAO;AACnD,YAAA,OAAO,KAAA;AAAA,UACT;AAEA,UAAA,OAAO,EAAC;AAAA,QACV;AAAA,OACF;AAAA,MACA;AAAA,QACE,KAAA,EAAO,aAAA;AAAA,QACP,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,UAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA;AAGtC,UAAA,MAAM,SAAA,GAAY,QAAA,CAAS,KAAA,EAAO,EAAE,CAAA;AACpC,UAAA,IAAI,CAAC,KAAA,CAAM,SAAS,KAAK,SAAA,IAAa,GAAA,SAAY,EAAC;AAGnD,UAAA,IAAI,kBAAA,CAAmB,IAAA,CAAK,KAAK,CAAA,SAAU,EAAC;AAE5C,UAAA,OAAO,KAAA;AAAA,QACT;AAAA;AACF,KACF;AAAA,EACF,CAAA;AAAA,EAEA,UAAA,CAAW,EAAE,cAAA,EAAe,EAAG;AAC7B,IAAA,OAAO,CAAC,QAAA,EAAU,EAAE,GAAG,IAAA,CAAK,QAAQ,cAAA,EAAgB,GAAG,cAAA,EAAe,EAAG,CAAC,CAAA;AAAA,EAC5E,CAAA;AAAA,EAEA,oBAAA,GAAuB;AACrB,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,MAAM,IAAA,CAAK,MAAA,EAAQ,SAAS,YAAY,CAAA,GAAI,MAAM,CAAA,IAAK;AAAA,KAClE;AAAA,EACF,CAAA;AAAA,EAEA,WAAA,GAAc;AACZ,IAAA,OAAO;AAAA,MACL,OAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM,QAAA,CAAS,QAAQ,MAAM,CAAA;AAAA,MAC3C,SAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM,QAAA,CAAS,UAAU,MAAM,CAAA;AAAA,MAC7C,UAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM,QAAA,CAAS,WAAW,MAAM;AAAA,KAChD;AAAA,EACF,CAAA;AAAA,EAEA,eAAA,GAAiC;AAC/B,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,MAAA;AAAA,QACN,OAAA,EAAS,YAAA;AAAA,QACT,QAAA,EAAU,MAAA;AAAA,QACV,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,MAAA;AAAA,QACP,QAAA,EAAU,OAAA;AAAA,QACV,KAAA,EAAO,QAAA;AAAA,QACP,QAAA,EAAU;AAAA;AACZ,KACF;AAAA,EACF,CAAA;AAAA,EAEA,aAAA,GAAgB;AACd,IAAA,MAAM,WAAW,IAAA,CAAK,QAAA;AACtB,IAAA,IAAI,CAAC,QAAA,EAAU,OAAO,EAAC;AAEvB,IAAA,OAAO;AAAA;AAAA,MAEL,aAAA,CAAc;AAAA,QACZ,MAAM,qBAAA,CAAsB,IAAA;AAAA,QAC5B,IAAA,EAAM;AAAA,OACP;AAAA,KACH;AAAA,EACF;AACF,CAAC;;;AChGM,IAAM,MAAA,GAAS,KAAK,MAAA,CAAsB;AAAA,EAC/C,IAAA,EAAM,QAAA;AAAA,EAEN,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,gBAAgB;AAAC,KACnB;AAAA,EACF,CAAA;AAAA,EAEA,SAAA,GAAY;AACV,IAAA,OAAO;AAAA,MACL,EAAE,KAAK,IAAA,EAAK;AAAA,MACZ;AAAA,QACE,GAAA,EAAK,GAAA;AAAA,QACL,QAAA,EAAU,CAAC,IAAA,KAAS;AAClB,UAAA,IAAI,OAAO,IAAA,KAAS,QAAA,EAAU,OAAO,EAAC;AACtC,UAAA,MAAM,SAAA,GAAY,KAAK,KAAA,CAAM,SAAA;AAG7B,UAAA,IAAI,cAAc,QAAA,EAAU;AAC1B,YAAA,OAAO,KAAA;AAAA,UACT;AAEA,UAAA,OAAO,EAAC;AAAA,QACV;AAAA,OACF;AAAA,MACA;AAAA,QACE,KAAA,EAAO,YAAA;AAAA,QACP,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,UAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA;AACtC,UAAA,OAAO,WAAA,CAAY,IAAA,CAAK,KAAK,CAAA,GAAI,EAAC,GAAI,KAAA;AAAA,QACxC;AAAA;AACF,KACF;AAAA,EACF,CAAA;AAAA,EAEA,UAAA,CAAW,EAAE,cAAA,EAAe,EAAG;AAC7B,IAAA,OAAO,CAAC,IAAA,EAAM,EAAE,GAAG,IAAA,CAAK,QAAQ,cAAA,EAAgB,GAAG,cAAA,EAAe,EAAG,CAAC,CAAA;AAAA,EACxE,CAAA;AAAA,EAEA,oBAAA,GAAuB;AACrB,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,MAAM,IAAA,CAAK,MAAA,EAAQ,SAAS,YAAY,CAAA,GAAI,QAAQ,CAAA,IAAK;AAAA,KACpE;AAAA,EACF,CAAA;AAAA,EAEA,WAAA,GAAc;AACZ,IAAA,OAAO;AAAA,MACL,SAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM,QAAA,CAAS,QAAQ,QAAQ,CAAA;AAAA,MAC7C,WAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM,QAAA,CAAS,UAAU,QAAQ,CAAA;AAAA,MAC/C,YAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM,QAAA,CAAS,WAAW,QAAQ;AAAA,KAClD;AAAA,EACF,CAAA;AAAA,EAEA,eAAA,GAAiC;AAC/B,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,QAAA;AAAA,QACN,OAAA,EAAS,cAAA;AAAA,QACT,QAAA,EAAU,QAAA;AAAA,QACV,IAAA,EAAM,YAAA;AAAA,QACN,KAAA,EAAO,QAAA;AAAA,QACP,QAAA,EAAU,OAAA;AAAA,QACV,KAAA,EAAO,QAAA;AAAA,QACP,QAAA,EAAU;AAAA;AACZ,KACF;AAAA,EACF,CAAA;AAAA,EAEA,aAAA,GAAgB;AACd,IAAA,MAAM,WAAW,IAAA,CAAK,QAAA;AACtB,IAAA,IAAI,CAAC,QAAA,EAAU,OAAO,EAAC;AAEvB,IAAA,OAAO;AAAA;AAAA,MAEL,aAAA,CAAc;AAAA,QACZ,IAAA,EAAM,qBAAA;AAAA,QACN,IAAA,EAAM;AAAA,OACP,CAAA;AAAA;AAAA,MAED,aAAA,CAAc;AAAA,QACZ,IAAA,EAAM,kBAAA;AAAA,QACN,IAAA,EAAM;AAAA,OACP;AAAA,KACH;AAAA,EACF;AACF,CAAC;;;AChGM,IAAM,SAAA,GAAY,KAAK,MAAA,CAAyB;AAAA,EACrD,IAAA,EAAM,WAAA;AAAA,EAEN,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,gBAAgB;AAAC,KACnB;AAAA,EACF,CAAA;AAAA,EAEA,SAAA,GAAY;AACV,IAAA,OAAO;AAAA,MACL,EAAE,KAAK,GAAA,EAAI;AAAA,MACX;AAAA,QACE,KAAA,EAAO,iBAAA;AAAA,QACP,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,UAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA;AAEtC,UAAA,OAAO,KAAA,CAAM,QAAA,CAAS,WAAW,CAAA,GAAI,EAAC,GAAI,KAAA;AAAA,QAC5C;AAAA;AACF,KACF;AAAA,EACF,CAAA;AAAA,EAEA,UAAA,CAAW,EAAE,cAAA,EAAe,EAAG;AAC7B,IAAA,OAAO,CAAC,GAAA,EAAK,EAAE,GAAG,IAAA,CAAK,QAAQ,cAAA,EAAgB,GAAG,cAAA,EAAe,EAAG,CAAC,CAAA;AAAA,EACvE,CAAA;AAAA,EAEA,oBAAA,GAAuB;AACrB,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,MAAM,IAAA,CAAK,MAAA,EAAQ,SAAS,YAAY,CAAA,GAAI,WAAW,CAAA,IAAK;AAAA,KACvE;AAAA,EACF,CAAA;AAAA,EAEA,WAAA,GAAc;AACZ,IAAA,OAAO;AAAA,MACL,YAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM,QAAA,CAAS,QAAQ,WAAW,CAAA;AAAA,MAChD,cAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM,QAAA,CAAS,UAAU,WAAW,CAAA;AAAA,MAClD,eAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM,QAAA,CAAS,WAAW,WAAW;AAAA,KACrD;AAAA,EACF,CAAA;AAAA,EAEA,eAAA,GAAiC;AAC/B,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,WAAA;AAAA,QACN,OAAA,EAAS,iBAAA;AAAA,QACT,QAAA,EAAU,WAAA;AAAA,QACV,IAAA,EAAM,eAAA;AAAA,QACN,KAAA,EAAO,WAAA;AAAA,QACP,QAAA,EAAU,OAAA;AAAA,QACV,KAAA,EAAO,QAAA;AAAA,QACP,QAAA,EAAU;AAAA;AACZ,KACF;AAAA,EACF;AACF,CAAC;;;AC5DM,IAAM,MAAA,GAAS,KAAK,MAAA,CAAsB;AAAA,EAC/C,IAAA,EAAM,QAAA;AAAA,EAEN,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,gBAAgB;AAAC,KACnB;AAAA,EACF,CAAA;AAAA,EAEA,SAAA,GAAY;AACV,IAAA,OAAO;AAAA,MACL,EAAE,KAAK,GAAA,EAAI;AAAA,MACX,EAAE,KAAK,KAAA,EAAM;AAAA,MACb,EAAE,KAAK,QAAA,EAAS;AAAA;AAAA,MAChB;AAAA,QACE,KAAA,EAAO,iBAAA;AAAA,QACP,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,UAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA;AACtC,UAAA,OAAO,KAAA,CAAM,QAAA,CAAS,cAAc,CAAA,GAAI,EAAC,GAAI,KAAA;AAAA,QAC/C;AAAA;AACF,KACF;AAAA,EACF,CAAA;AAAA,EAEA,UAAA,CAAW,EAAE,cAAA,EAAe,EAAG;AAC7B,IAAA,OAAO,CAAC,GAAA,EAAK,EAAE,GAAG,IAAA,CAAK,QAAQ,cAAA,EAAgB,GAAG,cAAA,EAAe,EAAG,CAAC,CAAA;AAAA,EACvE,CAAA;AAAA,EAEA,oBAAA,GAAuB;AACrB,IAAA,OAAO;AAAA,MACL,aAAA,EAAe,MAAM,IAAA,CAAK,MAAA,EAAQ,SAAS,YAAY,CAAA,GAAI,QAAQ,CAAA,IAAK;AAAA,KAC1E;AAAA,EACF,CAAA;AAAA,EAEA,WAAA,GAAc;AACZ,IAAA,OAAO;AAAA,MACL,SAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM,QAAA,CAAS,QAAQ,QAAQ,CAAA;AAAA,MAC7C,WAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM,QAAA,CAAS,UAAU,QAAQ,CAAA;AAAA,MAC/C,YAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM,QAAA,CAAS,WAAW,QAAQ;AAAA,KAClD;AAAA,EACF,CAAA;AAAA,EAEA,eAAA,GAAiC;AAC/B,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,QAAA;AAAA,QACN,OAAA,EAAS,cAAA;AAAA,QACT,QAAA,EAAU,QAAA;AAAA,QACV,IAAA,EAAM,mBAAA;AAAA,QACN,KAAA,EAAO,eAAA;AAAA,QACP,QAAA,EAAU,aAAA;AAAA,QACV,KAAA,EAAO,QAAA;AAAA,QACP,QAAA,EAAU;AAAA;AACZ,KACF;AAAA,EACF,CAAA;AAAA,EAEA,aAAA,GAAgB;AACd,IAAA,MAAM,WAAW,IAAA,CAAK,QAAA;AACtB,IAAA,IAAI,CAAC,QAAA,EAAU,OAAO,EAAC;AAEvB,IAAA,OAAO;AAAA;AAAA,MAEL,aAAA,CAAc;AAAA,QACZ,MAAM,qBAAA,CAAsB,MAAA;AAAA,QAC5B,IAAA,EAAM;AAAA,OACP;AAAA,KACH;AAAA,EACF;AACF,CAAC;;;AC3EM,IAAM,IAAA,GAAO,KAAK,MAAA,CAAoB;AAAA,EAC3C,IAAA,EAAM,MAAA;AAAA,EAEN,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,gBAAgB;AAAC,KACnB;AAAA,EACF,CAAA;AAAA;AAAA;AAAA,EAIA,QAAA,EAAU,GAAA;AAAA;AAAA,EAGV,QAAA,EAAU,KAAA;AAAA,EAEV,SAAA,GAAY;AACV,IAAA,OAAO,CAAC,EAAE,GAAA,EAAK,MAAA,EAAQ,CAAA;AAAA,EACzB,CAAA;AAAA,EAEA,UAAA,CAAW,EAAE,cAAA,EAAe,EAAG;AAC7B,IAAA,OAAO,CAAC,MAAA,EAAQ,EAAE,GAAG,IAAA,CAAK,QAAQ,cAAA,EAAgB,GAAG,cAAA,EAAe,EAAG,CAAC,CAAA;AAAA,EAC1E,CAAA;AAAA,EAEA,oBAAA,GAAuB;AACrB,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,MAAM,IAAA,CAAK,MAAA,EAAQ,SAAS,YAAY,CAAA,GAAI,MAAM,CAAA,IAAK;AAAA,KAClE;AAAA,EACF,CAAA;AAAA,EAEA,WAAA,GAAc;AACZ,IAAA,OAAO;AAAA,MACL,OAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM,QAAA,CAAS,QAAQ,MAAM,CAAA;AAAA,MAC3C,SAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM,QAAA,CAAS,UAAU,MAAM,CAAA;AAAA,MAC7C,UAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM,QAAA,CAAS,WAAW,MAAM;AAAA,KAChD;AAAA,EACF,CAAA;AAAA,EAEA,eAAA,GAAiC;AAC/B,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,MAAA;AAAA,QACN,OAAA,EAAS,YAAA;AAAA,QACT,QAAA,EAAU,MAAA;AAAA,QACV,IAAA,EAAM,MAAA;AAAA,QACN,KAAA,EAAO,MAAA;AAAA,QACP,QAAA,EAAU,OAAA;AAAA,QACV,KAAA,EAAO,QAAA;AAAA,QACP,QAAA,EAAU;AAAA;AACZ,KACF;AAAA,EACF,CAAA;AAAA,EAEA,aAAA,GAAgB;AACd,IAAA,MAAM,WAAW,IAAA,CAAK,QAAA;AACtB,IAAA,IAAI,CAAC,QAAA,EAAU,OAAO,EAAC;AAEvB,IAAA,OAAO;AAAA;AAAA,MAEL,aAAA,CAAc;AAAA,QACZ,MAAM,qBAAA,CAAsB,IAAA;AAAA,QAC5B,IAAA,EAAM;AAAA,OACP;AAAA,KACH;AAAA,EACF;AACF,CAAC;ACtEM,IAAM,kBAAA,GAAqB,IAAIC,eAAAA,CAAU,WAAW;AAQpD,SAAS,gBAAgB,OAAA,EAAyC;AACvE,EAAA,MAAM,EAAE,IAAA,EAAM,WAAA,GAAc,IAAA,EAAM,oBAAA,GAAuB,OAAM,GAAI,OAAA;AAEnE,EAAA,OAAO,IAAIxC,YAAAA,CAAO;AAAA,IAChB,GAAA,EAAK,kBAAA;AAAA,IAEL,KAAA,EAAO;AAAA,MACL,WAAA,CAAY,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO;AAE7B,QAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,UAAA,OAAO,KAAA;AAAA,QACT;AAGA,QAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAClB,UAAA,OAAO,KAAA;AAAA,QACT;AAGA,QAAA,IAAI,IAAA,GAAiC,IAAA;AAErC,QAAA,IAAI,KAAA,CAAM,kBAAkB,iBAAA,EAAmB;AAC7C,UAAA,IAAA,GAAO,KAAA,CAAM,MAAA;AAAA,QACf,CAAA,MAAO;AACL,UAAA,MAAM,SAAS,KAAA,CAAM,MAAA;AACrB,UAAA,IAAI,CAAC,MAAA,EAAQ;AACX,YAAA,OAAO,KAAA;AAAA,UACT;AACA,UAAA,IAAA,GAAO,MAAA,CAAO,QAA2B,GAAG,CAAA;AAC5C,UAAA,IAAI,QAAQ,CAAC,IAAA,CAAK,GAAA,CAAI,QAAA,CAAS,IAAI,CAAA,EAAG;AACpC,YAAA,IAAA,GAAO,IAAA;AAAA,UACT;AAAA,QACF;AAEA,QAAA,IAAI,CAAC,IAAA,EAAM;AACT,UAAA,OAAO,KAAA;AAAA,QACT;AAGA,QAAA,IAAI,oBAAA,EAAsB;AACxB,UAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,IAAA,EAAM,CAAC,CAAA;AACjC,UAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,QAAQ,GAAG,CAAA;AAEvC,UAAA,IAAI,IAAA,CAAK,OAAM,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,IAAI,CAAA,EAAG;AAE7C,YAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,YAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,YAAA;AAC9B,YAAA,IAAI,UAAA,GAAa,GAAA;AACjB,YAAA,IAAI,QAAA,GAAW,GAAA;AAEf,YAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,KAAA,EAAO,WAAA,KAAgB;AACrC,cAAA,MAAM,aAAa,UAAA,GAAa,WAAA;AAChC,cAAA,MAAM,QAAA,GAAW,aAAa,KAAA,CAAM,QAAA;AACpC,cAAA,IAAI,IAAA,CAAK,QAAQ,KAAA,CAAM,KAAK,KAAK,UAAA,IAAc,QAAA,IAAY,YAAY,UAAA,EAAY;AACjF,gBAAA,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,UAAA,EAAY,UAAU,CAAA;AAC5C,gBAAA,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,QAAQ,CAAA;AAAA,cACxC;AAAA,YACF,CAAC,CAAA;AAED,YAAA,MAAM,EAAA,GAAK,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,YAAA;AAAA,cACvBD,oBAAc,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,GAAA,EAAK,YAAY,QAAQ;AAAA,aAC3D;AACA,YAAA,IAAA,CAAK,SAAS,EAAE,CAAA;AAChB,YAAA,OAAO,IAAA;AAAA,UACT;AAAA,QACF;AAEA,QAAA,IAAI,WAAA,EAAa;AAEf,UAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,IAAA,EAAM,CAAC,CAAA;AACjC,UAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,QAAQ,GAAG,CAAA;AACvC,UAAA,MAAM,QAAA,GAAW,KAAK,KAAA,EAAM,CAAE,KAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,IAAI,CAAA;AAEzD,UAAA,MAAM,IAAA,GAAQ,QAAA,EAAU,KAAA,CAAM,MAAM,KAA4B,IAAA,CAAK,IAAA;AACrE,UAAA,MAAM,UAAA,GAAc,QAAA,EAAU,KAAA,CAAM,QAAQ,KAA4B,IAAA,CAAK,MAAA;AAE7E,UAAA,IAAI,IAAA,EAAM;AACR,YAAA,MAAA,CAAO,IAAA,CAAK,IAAA,EAAM,UAAA,IAAc,QAAQ,CAAA;AACxC,YAAA,OAAO,IAAA;AAAA,UACT;AAAA,QACF;AAEA,QAAA,OAAO,KAAA;AAAA,MACT;AAAA;AACF,GACD,CAAA;AACH;ACjGO,IAAM,kBAAA,GAAqB,IAAIyC,eAAAA,CAAU,WAAW;AAYpD,SAAS,gBAAgB,OAAA,EAAyC;AACvE,EAAA,MAAM,EAAE,MAAM,SAAA,GAAY,CAAC,SAAS,QAAQ,CAAA,EAAG,UAAS,GAAI,OAAA;AAE5D,EAAA,OAAO,IAAIxC,YAAAA,CAAO;AAAA,IAChB,GAAA,EAAK,kBAAA;AAAA,IAEL,KAAA,EAAO;AAAA,MACL,WAAA,CAAY,MAAM,KAAA,EAAO;AAEvB,QAAA,MAAM,OAAO,KAAA,CAAM,aAAA,EAAe,OAAA,CAAQ,YAAY,EAAE,IAAA,EAAK;AAC7D,QAAA,IAAI,CAAC,MAAM,OAAO,KAAA;AAGlB,QAAA,IAAI,GAAA;AACJ,QAAA,IAAI;AACF,UAAA,GAAA,GAAM,IAAI,IAAI,IAAI,CAAA;AAAA,QACpB,CAAA,CAAA,MAAQ;AACN,UAAA,OAAO,KAAA;AAAA,QACT;AAGA,QAAA,IAAI,CAAC,SAAA,CAAU,QAAA,CAAS,GAAA,CAAI,QAAQ,CAAA,EAAG;AACrC,UAAA,OAAO,KAAA;AAAA,QACT;AAGA,QAAA,IAAI,QAAA,IAAY,CAAC,QAAA,CAAS,IAAI,CAAA,EAAG;AAC/B,UAAA,OAAO,KAAA;AAAA,QACT;AAEA,QAAA,MAAM,EAAE,KAAA,EAAO,QAAA,EAAS,GAAI,IAAA;AAC5B,QAAA,MAAM,EAAE,IAAA,EAAM,EAAA,EAAI,KAAA,KAAU,KAAA,CAAM,SAAA;AAClC,QAAA,MAAM,KAAK,KAAA,CAAM,EAAA;AAEjB,QAAA,IAAI,KAAA,EAAO;AAET,UAAA,EAAA,CAAG,UAAA,CAAW,IAAA,EAAM,IAAA,EAAM,EAAE,CAAA;AAC5B,UAAA,EAAA,CAAG,OAAA,CAAQ,IAAA,EAAM,IAAA,GAAO,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,MAAA,CAAO,EAAE,IAAA,EAAM,IAAA,EAAM,CAAC,CAAA;AAAA,QAClE,CAAA,MAAO;AAEL,UAAA,EAAA,CAAG,OAAA,CAAQ,MAAM,EAAA,EAAI,IAAA,CAAK,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,CAAC,CAAA;AAAA,QAClD;AAEA,QAAA,QAAA,CAAS,EAAE,CAAA;AACX,QAAA,OAAO,IAAA;AAAA,MACT;AAAA;AACF,GACD,CAAA;AACH;ACrDO,IAAM,iBAAA,GAAoB,IAAIwC,eAAAA,CAAU,UAAU;AAKzD,IAAM,aAAA,GAAgB,cAAA;AAWf,SAAS,eAAe,OAAA,EAAwC;AACrE,EAAA,MAAM;AAAA,IACJ,IAAA;AAAA,IACA,SAAA,GAAY,CAAC,OAAA,EAAS,QAAQ,CAAA;AAAA,IAC9B,eAAA,GAAkB,OAAA;AAAA,IAClB;AAAA,GACF,GAAI,OAAA;AAEJ,EAAA,OAAO,IAAIxC,YAAAA,CAAO;AAAA,IAChB,GAAA,EAAK,iBAAA;AAAA,IAEL,KAAA,EAAO;AAAA,MACL,eAAA,CAAgB,IAAA,EAAM,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM;AAEpC,QAAA,IAAI,CAAC,aAAA,CAAc,IAAA,CAAK,IAAI,CAAA,EAAG;AAC7B,UAAA,OAAO,KAAA;AAAA,QACT;AAEA,QAAA,MAAM,EAAE,OAAM,GAAI,IAAA;AAClB,QAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,GAAA,CAAI,OAAA,CAAQ,IAAI,CAAA;AAGpC,QAAA,MAAM,UAAA,GAAa,MAAM,MAAA,CAAO,WAAA;AAAA,UAC9B,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAA,CAAM,eAAe,GAAG,CAAA;AAAA;AAAA,UACpC,KAAA,CAAM,YAAA;AAAA,UACN,MAAA;AAAA,UACA;AAAA,SACF;AAGA,QAAA,MAAM,OAAA,GAAUO,eAAK,UAAA,EAAY;AAAA,UAC/B;AAAA,SACD,CAAA;AAGD,QAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA;AAC5C,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA,OAAO,KAAA;AAAA,QACT;AAGA,QAAA,IAAI,SAAA,CAAU,SAAS,KAAA,EAAO;AAC5B,UAAA,OAAO,KAAA;AAAA,QACT;AAGA,QAAA,IAAI,SAAA,CAAU,GAAA,KAAQ,UAAA,CAAW,MAAA,EAAQ;AACvC,UAAA,OAAO,KAAA;AAAA,QACT;AAEA,QAAA,MAAM,OAAO,SAAA,CAAU,IAAA;AAGvB,QAAA,IAAI;AACF,UAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,IAAI,CAAA;AACxB,UAAA,IAAI,CAAC,SAAA,CAAU,QAAA,CAAS,GAAA,CAAI,QAAQ,CAAA,EAAG;AACrC,YAAA,OAAO,KAAA;AAAA,UACT;AAAA,QACF,CAAA,CAAA,MAAQ;AACN,UAAA,OAAO,KAAA;AAAA,QACT;AAGA,QAAA,IAAI,cAAA,IAAkB,CAAC,cAAA,CAAe,IAAI,CAAA,EAAG;AAC3C,UAAA,OAAO,KAAA;AAAA,QACT;AAGA,QAAA,MAAM,UAAA,GAAa,OAAO,KAAA,CAAM,YAAA;AAChC,QAAA,MAAM,SAAA,GAAY,aAAa,SAAA,CAAU,KAAA;AACzC,QAAA,MAAM,OAAA,GAAU,aAAa,SAAA,CAAU,GAAA;AAGvC,QAAA,MAAM,UAAA,GAAa,KAAA,CAAM,GAAA,CAAI,OAAA,CAAQ,SAAS,CAAA;AAC9C,QAAA,IAAI,UAAA,CAAW,OAAM,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,IAAI,CAAA,EAAG;AACnD,UAAA,OAAO,KAAA;AAAA,QACT;AAGA,QAAA,MAAM,KAAK,KAAA,CAAM,EAAA;AACjB,QAAA,EAAA,CAAG,OAAA,CAAQ,WAAW,OAAA,EAAS,IAAA,CAAK,OAAO,EAAE,IAAA,EAAM,CAAC,CAAA;AACpD,QAAA,EAAA,CAAG,UAAA,CAAW,IAAA,EAAM,IAAA,EAAM,EAAE,CAAA;AAE5B,QAAA,IAAA,CAAK,SAAS,EAAE,CAAA;AAChB,QAAA,OAAO,IAAA;AAAA,MACT;AAAA;AACF,GACD,CAAA;AACH;ACzHO,IAAM,iBAAA,GAAoB,IAAIiC,eAAAA,CAAU,UAAU;AAalD,SAAS,eAAe,OAAA,EAAwC;AACrE,EAAA,MAAM,EAAE,MAAK,GAAI,OAAA;AAEjB,EAAA,OAAO,IAAIxC,YAAAA,CAAO;AAAA,IAChB,GAAA,EAAK,iBAAA;AAAA,IAEL,KAAA,EAAO;AAAA,MACL,aAAA,CAAc,MAAM,KAAA,EAAO;AACzB,QAAA,IAAI,KAAA,CAAM,GAAA,KAAQ,YAAA,EAAc,OAAO,KAAA;AAEvC,QAAA,MAAM,SAAEF,SAAM,GAAI,IAAA;AAClB,QAAA,MAAM,EAAE,WAAU,GAAIA,OAAA;AAGtB,QAAA,IAAI,EAAE,SAAA,YAAqBC,mBAAAA,CAAAA,IAAkB,CAAC,UAAU,KAAA,EAAO;AAC7D,UAAA,OAAO,KAAA;AAAA,QACT;AAEA,QAAA,MAAM,UAAU,SAAA,CAAU,OAAA;AAC1B,QAAA,IAAI,CAAC,SAAS,OAAO,KAAA;AAMrB,QAAA,MAAM,aAAa,OAAA,CAAQ,UAAA;AAC3B,QAAA,IAAI,CAAC,YAAY,OAAO,KAAA;AAExB,QAAA,MAAM,cAAc,UAAA,CAAW,KAAA;AAC/B,QAAA,MAAM,UAAU,WAAA,CAAY,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,IAAI,CAAA;AACvD,QAAA,IAAI,CAAC,SAAS,OAAO,KAAA;AAIrB,QAAA,MAAM,QAAQ,OAAA,CAAQ,SAAA;AACtB,QAAA,MAAM,YAAA,GAAe,OAAO,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,IAAI,CAAA,IAAK,KAAA;AAElE,QAAA,IAAI,CAAC,YAAA,EAAc;AAEjB,UAAA,MAAM,mBAAmB,WAAA,CAAY,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,IAAI,CAAA;AAClE,UAAA,MAAM,EAAA,GAAKD,OAAA,CAAM,EAAA,CAAG,cAAA,CAAe,gBAAgB,CAAA;AACnD,UAAA,IAAA,CAAK,SAAS,EAAE,CAAA;AAEhB,UAAA,OAAO,KAAA;AAAA,QACT;AAEA,QAAA,OAAO,KAAA;AAAA,MACT;AAAA;AACF,GACD,CAAA;AACH;;;ACTO,IAAM,IAAA,GAAO,KAAK,MAAA,CAAoB;AAAA,EAC3C,IAAA,EAAM,MAAA;AAAA;AAAA;AAAA;AAAA,EAKN,YAAA,EAAc,KAAA;AAAA;AAAA,EAGd,QAAA,EAAU,GAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMV,SAAA,GAAY;AACV,IAAA,OAAO,KAAK,OAAA,CAAQ,QAAA;AAAA,EACtB,CAAA;AAAA,EAEA,UAAA,GAA0B;AACxB,IAAA,OAAO;AAAA,MACL,gBAAgB,EAAC;AAAA,MACjB,SAAA,EAAW,CAAC,OAAA,EAAS,QAAA,EAAU,WAAW,MAAM,CAAA;AAAA,MAChD,WAAA,EAAa,IAAA;AAAA,MACb,cAAA,EAAgB,IAAA;AAAA,MAChB,QAAA,EAAU,IAAA;AAAA,MACV,WAAA,EAAa,IAAA;AAAA,MACb,eAAA,EAAiB,OAAA;AAAA,MACjB,oBAAA,EAAsB;AAAA,KACxB;AAAA,EACF,CAAA;AAAA,EAEA,aAAA,GAAgB;AACd,IAAA,OAAO;AAAA,MACL,IAAA,EAAM;AAAA,QACJ,OAAA,EAAS;AAAA,OACX;AAAA,MACA,MAAA,EAAQ;AAAA,QACN,OAAA,EAAS;AAAA,OACX;AAAA,MACA,GAAA,EAAK;AAAA,QACH,OAAA,EAAS;AAAA,OACX;AAAA,MACA,KAAA,EAAO;AAAA,QACL,OAAA,EAAS;AAAA,OACX;AAAA,MACA,KAAA,EAAO;AAAA,QACL,OAAA,EAAS;AAAA;AACX,KACF;AAAA,EACF,CAAA;AAAA,EAEA,SAAA,GAAY;AACV,IAAA,OAAO;AAAA,MACL;AAAA,QACE,GAAA,EAAK,SAAA;AAAA,QACL,QAAA,EAAU,CAAC,IAAA,KAAS;AAClB,UAAA,IAAI,OAAO,IAAA,KAAS,QAAA,EAAU,OAAO,KAAA;AACrC,UAAA,MAAM,IAAA,GAAO,IAAA,CAAK,YAAA,CAAa,MAAM,CAAA;AAGrC,UAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,UAAA,CAAW,IAAA,EAAM,EAAE,SAAA,EAAW,IAAA,CAAK,OAAA,CAAQ,SAAA,EAAW,CAAA,EAAG;AACrE,YAAA,OAAO,KAAA;AAAA,UACT;AAEA,UAAA,OAAO;AAAA,YACL,IAAA;AAAA,YACA,MAAA,EAAQ,IAAA,CAAK,YAAA,CAAa,QAAQ,CAAA;AAAA,YAClC,GAAA,EAAK,IAAA,CAAK,YAAA,CAAa,KAAK,CAAA;AAAA,YAC5B,KAAA,EAAO,IAAA,CAAK,YAAA,CAAa,OAAO,CAAA;AAAA,YAChC,KAAA,EAAO,IAAA,CAAK,YAAA,CAAa,OAAO;AAAA,WAClC;AAAA,QACF;AAAA;AACF,KACF;AAAA,EACF,CAAA;AAAA,EAEA,UAAA,CAAW,EAAE,cAAA,EAAe,EAAG;AAC7B,IAAA,MAAM,QAAQ,EAAE,GAAG,KAAK,OAAA,CAAQ,cAAA,EAAgB,GAAG,cAAA,EAAe;AAGlE,IAAA,IACE,OAAO,KAAA,CAAM,MAAM,CAAA,KAAM,QAAA,IACzB,CAAC,UAAA,CAAW,KAAA,CAAM,MAAM,CAAA,EAAG,EAAE,SAAA,EAAW,IAAA,CAAK,OAAA,CAAQ,SAAA,EAAW,CAAA,EAChE;AAEA,MAAA,MAAM,EAAE,IAAA,EAAM,CAAA,EAAG,GAAG,MAAK,GAAI,KAAA;AAC7B,MAAA,OAAO,CAAC,GAAA,EAAK,IAAA,EAAM,CAAC,CAAA;AAAA,IACtB;AAGA,IAAA,IACE,IAAA,CAAK,OAAA,CAAQ,cAAA,IACb,KAAA,CAAM,QAAQ,MAAM,QAAA,IACpB,CAAC,KAAA,CAAM,KAAK,CAAA,EACZ;AACA,MAAA,KAAA,CAAM,KAAK,CAAA,GAAI,qBAAA;AAAA,IACjB;AAEA,IAAA,OAAO,CAAC,GAAA,EAAK,KAAA,EAAO,CAAC,CAAA;AAAA,EACvB,CAAA;AAAA,EAEA,WAAA,GAAc;AACZ,IAAA,OAAO;AAAA,MACL,SACE,CAAC,UAAA,KACD,CAAC,EAAE,UAAS,KAAM;AAChB,QAAA,IAAI,CAAC,UAAA,CAAW,UAAA,CAAW,IAAA,EAAM,EAAE,WAAW,IAAA,CAAK,OAAA,CAAQ,SAAA,EAAW,CAAA,EAAG;AACvE,UAAA,OAAO,KAAA;AAAA,QACT;AACA,QAAA,OAAO,QAAA,CAAS,OAAA,CAAQ,MAAA,EAAQ,UAAU,CAAA;AAAA,MAC5C,CAAA;AAAA,MACF,WACE,MACA,CAAC,EAAE,EAAA,EAAI,KAAA,EAAO,UAAS,KAAM;AAC3B,QAAA,MAAM,QAAA,GAAW,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA;AAC1C,QAAA,IAAI,CAAC,UAAU,OAAO,KAAA;AAEtB,QAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAO,GAAI,EAAA,CAAG,SAAA;AAE7B,QAAA,IAAI,KAAA,EAAO;AAET,UAAA,MAAM,OAAO,EAAA,CAAG,GAAA,CAAI,OAAA,CAAQ,EAAA,CAAG,UAAU,IAAI,CAAA;AAC7C,UAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,IAAA,EAAM,QAAQ,CAAA;AACzC,UAAA,IAAI,CAAC,OAAO,OAAO,KAAA;AACnB,UAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AACtB,UAAA,EAAA,CAAG,UAAA,CAAW,KAAA,CAAM,IAAA,EAAM,KAAA,CAAM,IAAI,QAAQ,CAAA;AAAA,QAC9C,CAAA,MAAO;AAGL,UAAA,MAAM,GAAA,GAAM,EAAE,iBAAA,EAAmB,KAAA,EAAM;AACvC,UAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,YAAA,EAAA,CAAG,GAAA,CAAI,YAAA,CAAa,KAAA,CAAM,KAAA,CAAM,GAAA,EAAK,KAAA,CAAM,GAAA,CAAI,GAAA,EAAK,CAAC,IAAA,EAAM,IAAA,EAAM,MAAA,KAAW;AAC1E,cAAA,IAAI,IAAA,CAAK,UAAU,MAAA,EAAQ,IAAA,CAAK,eAAe,QAAQ,CAAA,IAClD,CAAC,IAAA,CAAK,KAAA,CAAM,KAAK,CAAC,CAAA,KAAM,EAAE,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,IAAK,CAAA,CAAE,IAAA,KAAS,QAAQ,CAAA,EAAG;AAC9E,gBAAA,GAAA,CAAI,iBAAA,GAAoB,IAAA;AAAA,cAC1B;AAAA,YACF,CAAC,CAAA;AAAA,UACH;AACA,UAAA,IAAI,CAAC,GAAA,CAAI,iBAAA,EAAmB,OAAO,KAAA;AACnC,UAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAEtB,UAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,YAAA,EAAA,CAAG,WAAW,KAAA,CAAM,KAAA,CAAM,KAAK,KAAA,CAAM,GAAA,CAAI,KAAK,QAAQ,CAAA;AAAA,UACxD;AAAA,QACF;AAEA,QAAA,QAAA,CAAS,EAAE,CAAA;AACX,QAAA,OAAO,IAAA;AAAA,MACT,CAAA;AAAA,MACF,UAAA,EACE,CAAC,UAAA,KACD,CAAC,EAAE,EAAA,EAAI,KAAA,EAAO,UAAS,KAAM;AAC3B,QAAA,IAAI,CAAC,UAAA,CAAW,UAAA,CAAW,IAAA,EAAM,EAAE,WAAW,IAAA,CAAK,OAAA,CAAQ,SAAA,EAAW,CAAA,EAAG;AACvE,UAAA,OAAO,KAAA;AAAA,QACT;AAEA,QAAA,MAAM,QAAA,GAAW,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA;AAC1C,QAAA,IAAI,CAAC,UAAU,OAAO,KAAA;AAEtB,QAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAO,GAAI,EAAA,CAAG,SAAA;AAE7B,QAAA,IAAI,KAAA,EAAO;AAET,UAAA,MAAM,OAAO,EAAA,CAAG,GAAA,CAAI,OAAA,CAAQ,EAAA,CAAG,UAAU,IAAI,CAAA;AAC7C,UAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,IAAA,EAAM,QAAQ,CAAA;AAEzC,UAAA,IAAI,KAAA,IAAS,GAAG,GAAA,CAAI,YAAA,CAAa,MAAM,IAAA,EAAM,KAAA,CAAM,EAAA,EAAI,QAAQ,CAAA,EAAG;AAEhE,YAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AACtB,YAAA,EAAA,CAAG,UAAA,CAAW,KAAA,CAAM,IAAA,EAAM,KAAA,CAAM,IAAI,QAAQ,CAAA;AAAA,UAC9C,CAAA,MAAO;AAEL,YAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AACtB,YAAA,MAAM,cAAc,EAAA,CAAG,WAAA,IAAe,KAAA,CAAM,WAAA,IAAe,KAAK,KAAA,EAAM;AACtE,YAAA,IAAI,QAAA,CAAS,OAAA,CAAQ,WAAW,CAAA,EAAG;AACjC,cAAA,EAAA,CAAG,iBAAiB,QAAQ,CAAA;AAAA,YAC9B,CAAA,MAAO;AACL,cAAA,EAAA,CAAG,aAAA,CAAc,QAAA,CAAS,MAAA,CAAO,UAAU,CAAC,CAAA;AAAA,YAC9C;AAAA,UACF;AAAA,QACF,CAAA,MAAO;AACL,UAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAEtB,UAAA,MAAM,UAAU,MAAA,CAAO,KAAA;AAAA,YAAM,CAAA,KAAA,KAC3B,EAAA,CAAG,GAAA,CAAI,YAAA,CAAa,KAAA,CAAM,MAAM,GAAA,EAAK,KAAA,CAAM,GAAA,CAAI,GAAA,EAAK,QAAQ;AAAA,WAC9D;AACA,UAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,YAAA,IAAI,OAAA,EAAS;AACX,cAAA,EAAA,CAAG,WAAW,KAAA,CAAM,KAAA,CAAM,KAAK,KAAA,CAAM,GAAA,CAAI,KAAK,QAAQ,CAAA;AAAA,YACxD,CAAA,MAAO;AACL,cAAA,EAAA,CAAG,OAAA,CAAQ,KAAA,CAAM,KAAA,CAAM,GAAA,EAAK,KAAA,CAAM,IAAI,GAAA,EAAK,QAAA,CAAS,MAAA,CAAO,UAAU,CAAC,CAAA;AAAA,YACxE;AAAA,UACF;AAAA,QACF;AAEA,QAAA,QAAA,CAAS,EAAE,CAAA;AACX,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,KACJ;AAAA,EACF,CAAA;AAAA,EAEA,oBAAA,GAAuB;AACrB,IAAA,OAAO;AAAA,MACL,SAAS,MAAM;AACb,QAAC,IAAA,CAAK,MAAA,CAA6B,IAAA,CAAK,UAAA,EAAY,EAAE,CAAA;AACtD,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,KACF;AAAA,EACF,CAAA;AAAA,EAEA,eAAA,GAAiC;AAC/B,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,MAAA;AAAA,QACN,OAAA,EAAS,WAAA;AAAA,QACT,SAAA,EAAW,UAAA;AAAA,QACX,QAAA,EAAU,MAAA;AAAA,QACV,IAAA,EAAM,MAAA;AAAA,QACN,KAAA,EAAO,MAAA;AAAA,QACP,QAAA,EAAU,OAAA;AAAA,QACV,KAAA,EAAO,QAAA;AAAA,QACP,QAAA,EAAU;AAAA;AACZ,KACF;AAAA,EACF,CAAA;AAAA,EAEA,qBAAA,GAAwB;AACtB,IAAA,MAAM,WAAW,IAAA,CAAK,QAAA;AACtB,IAAA,IAAI,CAAC,QAAA,EAAU,OAAO,EAAC;AAEvB,IAAA,MAAM,UAAU,EAAC;AAIjB,IAAA,OAAA,CAAQ,IAAA;AAAA,MACN,eAAA,CAAgB;AAAA,QACd,IAAA,EAAM,QAAA;AAAA,QACN,aAAa,IAAA,CAAK,OAAA,CAAQ,gBAAgB,iBAAA,GACtC,IAAA,GACA,KAAK,OAAA,CAAQ,WAAA;AAAA,QACjB,oBAAA,EAAsB,KAAK,OAAA,CAAQ;AAAA,OACpC;AAAA,KACH;AAGA,IAAA,IAAI,IAAA,CAAK,QAAQ,WAAA,EAAa;AAC5B,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN,eAAA,CAAgB;AAAA,UACd,IAAA,EAAM,QAAA;AAAA,UACN,SAAA,EAAW,KAAK,OAAA,CAAQ;AAAA,SACzB;AAAA,OACH;AAAA,IACF;AAGA,IAAA,OAAA,CAAQ,KAAK,cAAA,CAAe,EAAE,IAAA,EAAM,QAAA,EAAU,CAAC,CAAA;AAI/C,IAAA,OAAA,CAAQ,IAAA;AAAA,MACN,IAAIE,YAAAA,CAAO;AAAA,QACT,GAAA,EAAK,IAAIwC,eAAAA,CAAU,iBAAiB,CAAA;AAAA,QACpC,iBAAA,CAAkB,YAAA,EAAc,SAAA,EAAW,QAAA,EAAU;AACnD,UAAA,MAAM,aAAa,YAAA,CAAa,IAAA,CAAK,CAAC,EAAA,KAAO,GAAG,UAAU,CAAA;AAC1D,UAAA,IAAI,CAAC,YAAY,OAAO,IAAA;AAExB,UAAA,MAAM,EAAE,WAAU,GAAI,QAAA;AACtB,UAAA,IAAI,EAAE,SAAA,YAAqBzC,mBAAAA,CAAAA,IAAkB,CAAC,SAAA,CAAU,OAAO,OAAO,IAAA;AAEtE,UAAA,MAAM,UAAU,SAAA,CAAU,OAAA;AAC1B,UAAA,IAAI,OAAA,EAAS,YAAA,KAAiB,CAAA,EAAG,OAAO,IAAA;AAExC,UAAA,MAAM,SAAS,QAAA,CAAS,WAAA;AACxB,UAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAEpB,UAAA,MAAM,UAAU,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,QAAQ,CAAA;AACtD,UAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AAErB,UAAA,OAAO,QAAA,CAAS,EAAA,CAAG,cAAA,CAAe,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,QAAQ,CAAC,CAAA;AAAA,QAC7E;AAAA,OACD;AAAA,KACH;AAGA,IAAA,IAAI,IAAA,CAAK,QAAQ,QAAA,EAAU;AACzB,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN,cAAA,CAAe;AAAA,UACb,IAAA,EAAM,QAAA;AAAA,UACN,SAAA,EAAW,KAAK,OAAA,CAAQ,SAAA;AAAA,UACxB,eAAA,EAAiB,KAAK,OAAA,CAAQ,eAAA;AAAA,UAC9B,GAAI,IAAA,CAAK,OAAA,CAAQ,cAAA,IAAkB;AAAA,YACjC,cAAA,EAAgB,KAAK,OAAA,CAAQ;AAAA;AAC/B,SACD;AAAA,OACH;AAAA,IACF;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AACF,CAAC;;;AC3VM,IAAM,SAAA,GAAY,KAAK,MAAA,CAAyB;AAAA,EACrD,IAAA,EAAM,WAAA;AAAA;AAAA;AAAA,EAIN,QAAA,EAAU,EAAA;AAAA,EAEV,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,gBAAgB;AAAC,KACnB;AAAA,EACF,CAAA;AAAA,EAEA,SAAA,GAAY;AACV,IAAA,OAAO;AAAA,MACL,EAAE,KAAK,KAAA,EAAM;AAAA,MACb;AAAA,QACE,KAAA,EAAO,gBAAA;AAAA,QACP,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,UAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA;AACtC,UAAA,OAAO,KAAA,KAAU,KAAA,GAAQ,EAAC,GAAI,KAAA;AAAA,QAChC;AAAA;AACF,KACF;AAAA,EACF,CAAA;AAAA,EAEA,UAAA,CAAW,EAAE,cAAA,EAAe,EAAG;AAC7B,IAAA,OAAO,CAAC,KAAA,EAAO,EAAE,GAAG,IAAA,CAAK,QAAQ,cAAA,EAAgB,GAAG,cAAA,EAAe,EAAG,CAAC,CAAA;AAAA,EACzE,CAAA;AAAA,EAEA,oBAAA,GAAuB;AACrB,IAAA,OAAO;AAAA,MACL,SAAS,MAAM,IAAA,CAAK,QAAQ,QAAA,CAAS,iBAAiB,KAAI,IAAK;AAAA,KACjE;AAAA,EACF,CAAA;AAAA,EAEA,WAAA,GAAc;AACZ,IAAA,OAAO;AAAA,MACL,YAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM;AAChB,QAAA,QAAA,CAAS,UAAU,aAAa,CAAA;AAChC,QAAA,OAAO,QAAA,CAAS,QAAQ,WAAW,CAAA;AAAA,MACrC,CAAA;AAAA,MACF,cAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM,QAAA,CAAS,UAAU,WAAW,CAAA;AAAA,MAClD,eAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM;AAChB,QAAA,QAAA,CAAS,UAAU,aAAa,CAAA;AAChC,QAAA,OAAO,QAAA,CAAS,WAAW,WAAW,CAAA;AAAA,MACxC;AAAA,KACJ;AAAA,EACF,CAAA;AAAA,EACA,eAAA,GAAiC;AAC/B,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,WAAA;AAAA,QACN,OAAA,EAAS,iBAAA;AAAA,QACT,QAAA,EAAU,WAAA;AAAA,QACV,IAAA,EAAM,eAAA;AAAA,QACN,KAAA,EAAO,WAAA;AAAA,QACP,QAAA,EAAU,OAAA;AAAA,QACV,KAAA,EAAO,QAAA;AAAA,QACP,QAAA,EAAU;AAAA;AACZ,KACF;AAAA,EACF;AACF,CAAC;;;ACtEM,IAAM,WAAA,GAAc,KAAK,MAAA,CAA2B;AAAA,EACzD,IAAA,EAAM,aAAA;AAAA;AAAA;AAAA,EAIN,QAAA,EAAU,EAAA;AAAA,EAEV,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,gBAAgB;AAAC,KACnB;AAAA,EACF,CAAA;AAAA,EAEA,SAAA,GAAY;AACV,IAAA,OAAO;AAAA,MACL,EAAE,KAAK,KAAA,EAAM;AAAA,MACb;AAAA,QACE,KAAA,EAAO,gBAAA;AAAA,QACP,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,UAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA;AACtC,UAAA,OAAO,KAAA,KAAU,OAAA,GAAU,EAAC,GAAI,KAAA;AAAA,QAClC;AAAA;AACF,KACF;AAAA,EACF,CAAA;AAAA,EAEA,UAAA,CAAW,EAAE,cAAA,EAAe,EAAG;AAC7B,IAAA,OAAO,CAAC,KAAA,EAAO,EAAE,GAAG,IAAA,CAAK,QAAQ,cAAA,EAAgB,GAAG,cAAA,EAAe,EAAG,CAAC,CAAA;AAAA,EACzE,CAAA;AAAA,EAEA,oBAAA,GAAuB;AACrB,IAAA,OAAO;AAAA,MACL,SAAS,MAAM,IAAA,CAAK,QAAQ,QAAA,CAAS,mBAAmB,KAAI,IAAK;AAAA,KACnE;AAAA,EACF,CAAA;AAAA,EAEA,WAAA,GAAc;AACZ,IAAA,OAAO;AAAA,MACL,cAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM;AAChB,QAAA,QAAA,CAAS,UAAU,WAAW,CAAA;AAC9B,QAAA,OAAO,QAAA,CAAS,QAAQ,aAAa,CAAA;AAAA,MACvC,CAAA;AAAA,MACF,gBAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM,QAAA,CAAS,UAAU,aAAa,CAAA;AAAA,MACpD,iBAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM;AAChB,QAAA,QAAA,CAAS,UAAU,WAAW,CAAA;AAC9B,QAAA,OAAO,QAAA,CAAS,WAAW,aAAa,CAAA;AAAA,MAC1C;AAAA,KACJ;AAAA,EACF,CAAA;AAAA,EACA,eAAA,GAAiC;AAC/B,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,aAAA;AAAA,QACN,OAAA,EAAS,mBAAA;AAAA,QACT,QAAA,EAAU,aAAA;AAAA,QACV,IAAA,EAAM,iBAAA;AAAA,QACN,KAAA,EAAO,aAAA;AAAA,QACP,QAAA,EAAU,OAAA;AAAA,QACV,KAAA,EAAO,QAAA;AAAA,QACP,QAAA,EAAU;AAAA;AACZ,KACF;AAAA,EACF;AACF,CAAC;;;ACpEM,IAAM,SAAA,GAAY,KAAK,MAAA,CAAyB;AAAA,EACrD,IAAA,EAAM,WAAA;AAAA;AAAA,EAGN,QAAA,EAAU,GAAA;AAAA,EAEV,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,gBAAgB;AAAC,KACnB;AAAA,EACF,CAAA;AAAA,EAEA,SAAA,GAAY;AACV,IAAA,OAAO;AAAA,MACL;AAAA,QACE,GAAA,EAAK,MAAA;AAAA,QACL,QAAA,EAAU,CAAC,OAAA,KAAY;AACrB,UAAA,IAAI,OAAO,OAAA,KAAY,QAAA,EAAU,OAAO,KAAA;AAIxC,UAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,YAAA,CAAa,OAAO,CAAA;AAC9C,UAAA,MAAM,iBACJ,OAAA,CAAQ,YAAA,CAAa,iBAAiB,CAAA,IACtC,OAAA,CAAQ,aAAa,eAAe,CAAA;AACtC,UAAA,IAAI,CAAC,SAAA,IAAa,CAAC,cAAA,EAAgB,OAAO,KAAA;AAC1C,UAAA,OAAO,EAAC;AAAA,QACV;AAAA,OACF;AAAA;AAAA,MAEA,EAAE,KAAK,MAAA;AAAO,KAChB;AAAA,EACF,CAAA;AAAA,EAEA,UAAA,CAAW,EAAE,cAAA,EAAe,EAAG;AAC7B,IAAA,OAAO,CAAC,MAAA,EAAQ,EAAE,GAAG,IAAA,CAAK,QAAQ,cAAA,EAAgB,GAAG,cAAA,EAAe,EAAG,CAAC,CAAA;AAAA,EAC1E,CAAA;AAAA,EAEA,WAAA,GAAc;AACZ,IAAA,OAAO;AAAA,MACL,YAAA,EACE,CAAC,UAAA,KACD,CAAC,EAAE,UAAS,KAAM,QAAA,CAAS,OAAA,CAAQ,WAAA,EAAa,UAAU,CAAA;AAAA,MAE5D,eAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM,QAAA,CAAS,UAAU,WAAW,CAAA;AAAA,MAElD,sBACE,MACA,CAAC,EAAE,KAAA,EAAO,EAAA,EAAI,UAAS,KAAM;AAC3B,QAAA,MAAM,EAAE,IAAA,EAAM,EAAA,EAAI,KAAA,KAAU,EAAA,CAAG,SAAA;AAC/B,QAAA,MAAM,WAAW,IAAA,CAAK,QAAA;AAEtB,QAAA,IAAI,CAAC,UAAU,OAAO,KAAA;AAMtB,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,MAAM,WAAA,GAAc,EAAA,CAAG,WAAA,IAAe,KAAA,CAAM,WAAA;AAC5C,UAAA,IAAI,WAAA,EAAa;AACf,YAAA,MAAM,kBAAkB,WAAA,CAAY,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,QAAQ,CAAA;AACjE,YAAA,IAAI,eAAA,EAAiB;AACnB,cAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,MAAA,CAAO,eAAA,CAAgB,KAAK,CAAA,CAAE,IAAA;AAAA,gBAC1D,CAAC,GAAA,KAAQ,GAAA,KAAQ,IAAA,IAAQ,GAAA,KAAQ;AAAA,eACnC;AACA,cAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,gBAAA,IAAI,QAAA,EAAU;AACZ,kBAAA,EAAA,CAAG,iBAAiB,QAAQ,CAAA;AAC5B,kBAAA,QAAA,CAAS,EAAE,CAAA;AAAA,gBACb;AACA,gBAAA,OAAO,IAAA;AAAA,cACT;AAAA,YACF;AAAA,UACF;AACA,UAAA,OAAO,KAAA;AAAA,QACT;AAGA,QAAA,IAAI,iBAAA,GAAoB,KAAA;AAExB,QAAA,EAAA,CAAG,GAAA,CAAI,YAAA,CAAa,IAAA,EAAM,EAAA,EAAI,CAAC,IAAA,KAAS;AACtC,UAAA,MAAM,aAAA,GAAgB,KAAK,KAAA,CAAM,IAAA;AAAA,YAC/B,CAAC,IAAA,KAAS,IAAA,CAAK,IAAA,CAAK,SAAS,IAAA,CAAK;AAAA,WACpC;AACA,UAAA,IAAI,aAAA,EAAe;AACjB,YAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,MAAA,CAAO,aAAA,CAAc,KAAK,CAAA,CAAE,IAAA;AAAA,cACxD,CAAC,GAAA,KAAQ,GAAA,KAAQ,IAAA,IAAQ,GAAA,KAAQ;AAAA,aACnC;AACA,YAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,cAAA,iBAAA,GAAoB,IAAA;AAAA,YACtB;AAAA,UACF;AAAA,QACF,CAAC,CAAA;AAGD,QAAA,IAAI,CAAC,mBAAmB,OAAO,KAAA;AAE/B,QAAA,IAAI,QAAA,EAAU;AAIZ,UAAA,EAAA,CAAG,IAAI,YAAA,CAAa,IAAA,EAAM,EAAA,EAAI,CAAC,MAAM,GAAA,KAAQ;AAC3C,YAAA,MAAM,OAAO,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,QAAQ,CAAA;AACrD,YAAA,IAAI,IAAA,EAAM;AACR,cAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,CAAE,IAAA;AAAA,gBAC9C,CAAA,CAAA,KAAK,CAAA,KAAM,IAAA,IAAQ,CAAA,KAAM;AAAA,eAC3B;AACA,cAAA,IAAI,CAAC,aAAA,EAAe;AAClB,gBAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,IAAI,CAAA;AACnC,gBAAA,MAAM,SAAS,IAAA,CAAK,GAAA,CAAI,GAAA,GAAM,IAAA,CAAK,UAAU,EAAE,CAAA;AAC/C,gBAAA,EAAA,CAAG,UAAA,CAAW,QAAA,EAAU,MAAA,EAAQ,QAAQ,CAAA;AAAA,cAC1C;AAAA,YACF;AAAA,UACF,CAAC,CAAA;AACD,UAAA,QAAA,CAAS,EAAE,CAAA;AAAA,QACb;AAEA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,KACJ;AAAA,EACF;AACF,CAAC;AChHD,IAAM,YAAA,GAAwB8C,sBAAA;AAAA,EAC5BC,sBAAA;AAAA,EACAC,4BAAA;AAAA,EACAC,uBAAA;AAAA,EACAN;AACF,CAAA;AAEO,IAAM,UAAA,GAAa,UAAU,MAAA,CAA0B;AAAA,EAC5D,IAAA,EAAM,YAAA;AAAA,EAEN,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,KAAA,EAAO;AAAA,KACT;AAAA,EACF,CAAA;AAAA,EAEA,qBAAA,GAAwB;AACtB,IAAA,MAAM,QAAA,GAAW,EAAE,GAAGO,mBAAA,EAAW;AAGjC,IAAA,IAAI,IAAA,CAAK,QAAQ,KAAA,EAAO;AACtB,MAAA,QAAA,CAAS,OAAO,CAAA,GAAI,YAAA;AAAA,IACtB;AAEA,IAAA,OAAO,CAAC/C,aAAAA,CAAO,QAAQ,CAAC,CAAA;AAAA,EAC1B;AACF,CAAC;ACzCM,IAAM,OAAA,GAAU,UAAU,MAAA,CAAuB;AAAA,EACtD,IAAA,EAAM,SAAA;AAAA,EAEN,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,GAAA;AAAA,MACP,aAAA,EAAe;AAAA,KACjB;AAAA,EACF,CAAA;AAAA,EAEA,WAAA,GAAc;AACZ,IAAA,OAAO;AAAA,MACL,IAAA,EACE,MACA,CAAC,EAAE,OAAO,QAAA,EAAS,KACjBgD,YAAA,CAAK,KAAA,EAAO,QAAQ,CAAA;AAAA,MAExB,IAAA,EACE,MACA,CAAC,EAAE,OAAO,QAAA,EAAS,KACjBC,YAAA,CAAK,KAAA,EAAO,QAAQ;AAAA,KAC1B;AAAA,EACF,CAAA;AAAA,EAEA,eAAA,GAAiC;AAC/B,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,MAAA;AAAA,QACN,OAAA,EAAS,MAAA;AAAA,QACT,IAAA,EAAM,uBAAA;AAAA,QACN,KAAA,EAAO,MAAA;AAAA,QACP,QAAA,EAAU,OAAA;AAAA,QACV,KAAA,EAAO,SAAA;AAAA,QACP,QAAA,EAAU;AAAA,OACZ;AAAA,MACA;AAAA,QACE,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,MAAA;AAAA,QACN,OAAA,EAAS,MAAA;AAAA,QACT,IAAA,EAAM,gBAAA;AAAA,QACN,KAAA,EAAO,MAAA;AAAA,QACP,QAAA,EAAU,aAAA;AAAA,QACV,KAAA,EAAO,SAAA;AAAA,QACP,QAAA,EAAU;AAAA;AACZ,KACF;AAAA,EACF,CAAA;AAAA,EAEA,oBAAA,GAAuB;AACrB,IAAA,OAAO;AAAA,MACL,SAAS,MAAM,IAAA,CAAK,MAAA,EAAQ,QAAA,CAAS,MAAK,IAAK,KAAA;AAAA,MAC/C,eAAe,MAAM,IAAA,CAAK,MAAA,EAAQ,QAAA,CAAS,MAAK,IAAK,KAAA;AAAA,MACrD,SAAS,MAAM,IAAA,CAAK,MAAA,EAAQ,QAAA,CAAS,MAAK,IAAK;AAAA,KACjD;AAAA,EACF,CAAA;AAAA,EAEA,qBAAA,GAAwB;AACtB,IAAA,OAAO;AAAA,MACLC,eAAA,CAAQ;AAAA,QACN,KAAA,EAAO,KAAK,OAAA,CAAQ,KAAA;AAAA,QACpB,aAAA,EAAe,KAAK,OAAA,CAAQ;AAAA,OAC7B;AAAA,KACH;AAAA,EACF;AACF,CAAC;ACpEM,IAAM,UAAA,GAAa,UAAU,MAAA,CAA0B;AAAA,EAC5D,IAAA,EAAM,YAAA;AAAA,EAEN,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,cAAA;AAAA,MACP,KAAA,EAAO;AAAA,KACT;AAAA,EACF,CAAA;AAAA,EAEA,qBAAA,GAAwB;AACtB,IAAA,OAAO;AAAA,MACLC,qBAAA,CAAW;AAAA,QACT,KAAA,EAAO,KAAK,OAAA,CAAQ,KAAA;AAAA,QACpB,KAAA,EAAO,KAAK,OAAA,CAAQ,KAAA;AAAA,QACpB,GAAI,IAAA,CAAK,OAAA,CAAQ,KAAA,GAAQ,EAAE,OAAO,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAM,GAAI;AAAC,OAC3D;AAAA,KACH;AAAA,EACF;AACF,CAAC;ACvCM,IAAM,SAAA,GAAY,UAAU,MAAA,CAAO;AAAA,EACxC,IAAA,EAAM,WAAA;AAAA,EAEN,qBAAA,GAAwB;AACtB,IAAA,OAAO,CAACC,qBAAW,CAAA;AAAA,EACrB;AACF,CAAC;ACWD,IAAM,eAAA,GAAkB,IAAId,eAAAA,CAAU,cAAc,CAAA;AAE7C,IAAM,YAAA,GAAe,UAAU,MAAA,CAA4B;AAAA,EAChE,IAAA,EAAM,cAAA;AAAA,EAEN,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,WAAA;AAAA,MACN,QAAA,EAAU,CAAC,WAAW;AAAA,KACxB;AAAA,EACF,CAAA;AAAA,EAEA,qBAAA,GAAkC;AAChC,IAAA,MAAM,EAAE,IAAA,EAAM,QAAA,EAAU,QAAA,KAAa,IAAA,CAAK,OAAA;AAC1C,IAAA,MAAM,+BAAe,IAAI,GAAA,CAAI,CAAC,GAAG,QAAA,EAAU,QAAQ,CAAC,CAAA;AACpD,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI,YAAA;AAEJ,IAAA,OAAO;AAAA,MACL,IAAIxC,YAAAA,CAAO;AAAA,QACT,GAAA,EAAK,eAAA;AAAA,QACL,iBAAA,CAAkB,CAAA,EAAG,EAAA,EAAI,KAAA,EAAO;AAC9B,UAAA,IAAI,CAAC,eAAA,CAAgB,QAAA,CAAS,KAAK,CAAA,EAAG;AACtC,UAAA,OAAO,KAAA,CAAM,GAAG,MAAA,CAAO,KAAA,CAAM,IAAI,OAAA,CAAQ,IAAA,EAAM,IAAA,CAAK,MAAA,EAAQ,CAAA;AAAA,QAC9D,CAAA;AAAA,QACA,KAAA,EAAO;AAAA,UACL,IAAA,CAAK,CAAA,EAAG,EAAE,GAAA,EAAK,QAAO,EAAG;AACvB,YAAA,MAAM,QAAA,GAAW,MAAA,CAAO,KAAA,CAAM,QAAQ,CAAA;AACtC,YAAA,IAAI,CAAC,QAAA,EAAU;AACb,cAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iCAAA,EAAoC,QAAQ,CAAA,CAAA,CAAG,CAAA;AAAA,YACjE;AACA,YAAA,IAAA,GAAO,QAAA;AACP,YAAA,YAAA,GAAe,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA,CACtC,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,YAAA,CAAa,GAAA,CAAI,CAAA,CAAE,IAAI,CAAC,CAAA;AAC1C,YAAA,MAAM,QAAA,GAAW,IAAI,SAAA,EAAW,IAAA;AAChC,YAAA,OAAO,CAAC,CAAC,QAAA,IAAY,YAAA,CAAa,SAAS,QAAQ,CAAA;AAAA,UACrD,CAAA;AAAA,UACA,KAAA,CAAM,IAAI,KAAA,EAAO;AACf,YAAA,IAAI,CAAC,EAAA,CAAG,UAAA,EAAY,OAAO,KAAA;AAC3B,YAAA,MAAM,QAAA,GAAW,EAAA,CAAG,GAAA,CAAI,SAAA,EAAW,IAAA;AACnC,YAAA,OAAO,CAAC,CAAC,QAAA,IAAY,YAAA,CAAa,SAAS,QAAQ,CAAA;AAAA,UACrD;AAAA;AACF,OACD;AAAA,KACH;AAAA,EACF;AACF,CAAC;ACvBM,IAAM,oBAAA,GAAuB,IAAIwC,eAAAA,CAAU,aAAa;AAExD,IAAM,WAAA,GAAc,UAAU,MAAA,CAA2B;AAAA,EAC9D,IAAA,EAAM,aAAA;AAAA,EAEN,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,WAAA,EAAa,wBAAA;AAAA,MACb,oBAAA,EAAsB,IAAA;AAAA,MACtB,cAAA,EAAgB,UAAA;AAAA,MAChB,gBAAA,EAAkB,iBAAA;AAAA,MAClB,eAAA,EAAiB,IAAA;AAAA,MACjB,eAAA,EAAiB;AAAA,KACnB;AAAA,EACF,CAAA;AAAA,EAEA,qBAAA,GAAwB;AACtB,IAAA,OAAO;AAAA,MACL,IAAIxC,YAAAA,CAAO;AAAA,QACT,GAAA,EAAK,oBAAA;AAAA,QACL,KAAA,EAAO;AAAA,UACL,WAAA,EAAa,CAAC,EAAE,GAAA,EAAK,WAAU,KAAM;AACnC,YAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,YAAA,IAAI,CAAC,MAAA,EAAQ,IAAA,EAAM,OAAOuD,kBAAA,CAAc,KAAA;AACxC,YAAA,MAAM,UAAA,GAAa,OAAO,IAAA,CAAK,QAAA;AAE/B,YAAA,IAAI,CAAC,UAAA,IAAc,IAAA,CAAK,OAAA,CAAQ,oBAAA,EAAsB;AACpD,cAAA,OAAOA,kBAAA,CAAc,KAAA;AAAA,YACvB;AAGA,YAAA,MAAM,UAAA,GACJ,GAAA,CAAI,UAAA,KAAe,CAAA,IACnB,GAAA,CAAI,YAAY,WAAA,IAChB,GAAA,CAAI,UAAA,CAAW,OAAA,CAAQ,IAAA,KAAS,CAAA;AAElC,YAAA,MAAM,EAAE,eAAA,EAAiB,eAAA,EAAiB,cAAA,EAAgB,gBAAA,KAAqB,IAAA,CAAK,OAAA;AAEpF,YAAA,MAAMC,YAAAA,GAAc,CAAC,IAAA,KACnB,eAAA,GACI,KAAK,OAAA,CAAQ,IAAA,KAAS,IACtB,IAAA,CAAK,UAAA,KAAe,KACnB,IAAA,CAAK,UAAA,KAAe,KACnB,CAAC,CAAC,KAAK,UAAA,EAAY,MAAA,IACnB,CAAC,IAAA,CAAK,UAAA,CAAW,IAAA;AAEzB,YAAA,MAAM,qBAAqB,CAAC,IAAA,EAAc,QACxC,OAAO,IAAA,CAAK,QAAQ,WAAA,KAAgB,UAAA,GAChC,IAAA,CAAK,OAAA,CAAQ,YAAY,EAAE,IAAA,EAAM,KAAK,CAAA,GACtC,KAAK,OAAA,CAAQ,WAAA;AAEnB,YAAA,MAAM,cAAA,GAAiB,CAAC,IAAA,EAAc,GAAA,KACpCC,gBAAW,IAAA,CAAK,GAAA,EAAK,GAAA,GAAM,IAAA,CAAK,QAAA,EAAU;AAAA,cACxC,KAAA,EAAO,GAAG,cAAc,CAAA,EAAG,aAAa,CAAA,CAAA,EAAI,gBAAgB,KAAK,EAAE,CAAA,CAAA;AAAA,cACnE,kBAAA,EAAoB,kBAAA,CAAmB,IAAA,EAAM,GAAG;AAAA,aACjD,CAAA;AAGH,YAAA,IAAI,eAAA,EAAiB;AACnB,cAAA,MAAM,EAAE,SAAQ,GAAI,SAAA;AACpB,cAAA,IAAI,OAAA,CAAQ,KAAA,KAAU,CAAA,EAAG,OAAOF,kBAAA,CAAc,KAAA;AAC9C,cAAA,MAAM,OAAO,OAAA,CAAQ,MAAA;AACrB,cAAA,IAAI,CAAC,KAAK,WAAA,IAAe,CAACC,aAAY,IAAI,CAAA,SAAUD,kBAAA,CAAc,KAAA;AAClE,cAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA;AACxC,cAAA,OAAOA,kBAAA,CAAc,OAAO,GAAA,EAAK,CAAC,eAAe,IAAA,EAAM,GAAG,CAAC,CAAC,CAAA;AAAA,YAC9D;AAGA,YAAA,MAAM,cAA4B,EAAC;AACnC,YAAA,GAAA,CAAI,WAAA,CAAY,CAAC,IAAA,EAAM,GAAA,KAAQ;AAC7B,cAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACvB,cAAA,IAAI,CAACC,YAAAA,CAAY,IAAI,CAAA,EAAG;AACxB,cAAA,WAAA,CAAY,IAAA,CAAK,cAAA,CAAe,IAAA,EAAM,GAAG,CAAC,CAAA;AAAA,YAC5C,CAAC,CAAA;AAED,YAAA,OAAOD,kBAAA,CAAc,MAAA,CAAO,GAAA,EAAK,WAAW,CAAA;AAAA,UAC9C;AAAA;AACF,OACD;AAAA,KACH;AAAA,EACF;AACF,CAAC;ACrGD,IAAM5B,mCAAkB,IAAI,GAAA,CAAI,CAAC,UAAA,EAAY,UAAU,CAAC,CAAA;AACxD,IAAM+B,sCAAqB,IAAI,GAAA,CAAI,CAAC,YAAA,EAAc,aAAA,EAAe,UAAU,CAAC,CAAA;AAQ5E,SAAS,uBAAuB,KAAA,EAA6B;AAC3D,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,KAAA,CAAM,SAAA;AACxB,EAAA,KAAA,IAAS,CAAA,GAAI,KAAA,CAAM,KAAA,EAAO,CAAA,GAAI,GAAG,CAAA,EAAA,EAAK;AACpC,IAAA,IAAI/B,gBAAAA,CAAgB,IAAI,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,EAAG,OAAO,IAAA;AAAA,EAC3D;AACA,EAAA,OAAO,KAAA;AACT;AASO,SAAS,sBAAA,CACd7B,SACA,QAAA,EACS;AACT,EAAA,MAAM,EAAE,WAAU,GAAIA,OAAA;AAStB,EAAA,IAAI,UAAA;AACJ,EAAA,IAAI,SAAA;AACJ,EAAA,IAAI,UAAA;AACJ,EAAA,IAAI,QAAA;AAEJ,EAAA,IAAI,qBAAqB6D,mBAAA,EAAe;AACtC,IAAA,MAAM,OAAO,SAAA,CAAU,IAAA;AACvB,IAAA,MAAM,OAAO,SAAA,CAAU,KAAA;AAGvB,IAAA,IAAI,IAAA,CAAK,KAAA,KAAU,CAAA,EAAG,OAAO,KAAA;AAC7B,IAAA,IAAI,sBAAA,CAAuB7D,OAAK,CAAA,EAAG,OAAO,KAAA;AAC1C,IAAA,UAAA,GAAa,IAAA,CAAK,MAAM,CAAC,CAAA;AACzB,IAAA,SAAA,GAAY,IAAA;AACZ,IAAA,UAAA,GAAa,SAAA,CAAU,IAAA;AACvB,IAAA,QAAA,GAAW,SAAA,CAAU,EAAA;AAAA,EACvB,CAAA,MAAO;AACL,IAAA,IAAI,CAAC,SAAA,CAAU,KAAA,EAAO,OAAO,KAAA;AAC7B,IAAA,IAAI,sBAAA,CAAuBA,OAAK,CAAA,EAAG,OAAO,KAAA;AAC1C,IAAA,MAAM,EAAE,OAAM,GAAI,SAAA;AAClB,IAAA,IAAI,KAAA,CAAM,KAAA,KAAU,CAAA,EAAG,OAAO,KAAA;AAC9B,IAAA,UAAA,GAAa,KAAA,CAAM,MAAM,CAAC,CAAA;AAC1B,IAAA,SAAA,GAAY,KAAA,CAAM,KAAK,CAAC,CAAA;AACxB,IAAA,UAAA,GAAa,KAAA,CAAM,OAAO,CAAC,CAAA;AAC3B,IAAA,QAAA,GAAW,KAAA,CAAM,MAAM,CAAC,CAAA;AAAA,EAC1B;AAEA,EAAA,IAAI,UAAA,KAAe,GAAG,OAAO,KAAA;AAE7B,EAAA,MAAM,WAAA,GAAcA,OAAA,CAAM,GAAA,CAAI,KAAA,CAAM,aAAa,CAAC,CAAA;AAClD,EAAA,IAAI,CAAC4D,mBAAAA,CAAmB,GAAA,CAAI,YAAY,IAAA,CAAK,IAAI,GAAG,OAAO,KAAA;AAK3D,EAAA,IAAI,UAAA,GAAa,CAAA;AACjB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,UAAA,GAAa,GAAG,CAAA,EAAA,EAAK;AACvC,IAAA,UAAA,IAAc5D,OAAA,CAAM,GAAA,CAAI,KAAA,CAAM,CAAC,CAAA,CAAE,QAAA;AAAA,EACnC;AAEA,EAAA,MAAM,KAAKA,OAAA,CAAM,EAAA;AACjB,EAAA,MAAM,SAAS,qBAAA,CAAsB;AAAA,IACnC,EAAA;AAAA,IACA,UAAA;AAAA,IACA,SAAA;AAAA,IACA,WAAA,EAAa,EAAE,IAAA,EAAM,UAAA,EAAY,IAAI,QAAA;AAAS,GAC/C,CAAA;AACD,EAAA,IAAI,CAAC,MAAA,CAAO,EAAA,IAAM,MAAA,CAAO,UAAA,KAAe,QAAW,OAAO,KAAA;AAC1D,EAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAGtB,EAAA,EAAA,CAAG,YAAA,CAAa8C,eAAAA,CAAU,IAAA,CAAK,EAAA,CAAG,GAAA,CAAI,QAAQ,MAAA,CAAO,UAAA,GAAa,CAAC,CAAC,CAAC,CAAA;AACrE,EAAA,QAAA,CAAS,EAAA,CAAG,gBAAgB,CAAA;AAC5B,EAAA,OAAO,IAAA;AACT;AAsBO,SAAS,wBAAA,CACd9C,SACA,QAAA,EACS;AACT,EAAA,MAAM,EAAE,WAAU,GAAIA,OAAA;AACtB,EAAA,IAAI,CAAC,SAAA,CAAU,KAAA,EAAO,OAAO,KAAA;AAE7B,EAAA,MAAM,EAAE,OAAM,GAAI,SAAA;AAGlB,EAAA,IAAI,aAAA,GAAgB,EAAA;AACpB,EAAA,KAAA,IAAS,CAAA,GAAI,KAAA,CAAM,KAAA,EAAO,CAAA,GAAI,GAAG,CAAA,EAAA,EAAK;AACpC,IAAA,IAAI6B,gBAAAA,CAAgB,IAAI,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,EAAG;AAChD,MAAA,aAAA,GAAgB,CAAA;AAChB,MAAA;AAAA,IACF;AAAA,EACF;AACA,EAAA,IAAI,aAAA,KAAkB,IAAI,OAAO,KAAA;AAOjC,EAAA,MAAM,aAAa,aAAA,GAAgB,CAAA;AACnC,EAAA,IAAI,KAAA,CAAM,KAAA,GAAQ,UAAA,EAAY,OAAO,KAAA;AAErC,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,IAAA,CAAK,aAAa,CAAA;AACzC,EAAA,MAAM,gBAAA,GAAmB,KAAA,CAAM,KAAA,CAAM,aAAa,CAAA;AAGlD,EAAA,IAAI,gBAAA,KAAqB,GAAG,OAAO,KAAA;AAEnC,EAAA,IAAI,gBAAA,KAAqB,QAAA,CAAS,UAAA,GAAa,CAAA,EAAG,OAAO,KAAA;AAIzD,EAAA,MAAM,eAAe,aAAA,GAAgB,CAAA;AACrC,EAAA,IAAI,YAAA,GAAe,GAAG,OAAO,KAAA;AAI7B,EAAA,MAAM,gBAAA,GAAmB,KAAA,CAAM,KAAA,CAAM,YAAY,CAAA;AACjD,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,IAAA,CAAK,YAAY,CAAA;AACvC,EAAA,IAAI,gBAAA,KAAqB,OAAA,CAAQ,UAAA,GAAa,CAAA,EAAG,OAAO,KAAA;AAOxD,EAAA,IAAI,YAAA,GAAe,CAAA,GAAI,CAAA,EAAG,OAAO,KAAA;AACjC,EAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,IAAA,CAAK,YAAA,GAAe,CAAC,CAAA;AACjD,EAAA,MAAM,oBAAA,GAAuB,KAAA,CAAM,KAAA,CAAM,YAAA,GAAe,CAAC,CAAA;AACzD,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,IAAA,CAAK,UAAU,CAAA;AACvC,EAAA,IACE,CAAC,aAAA,CAAc,cAAA;AAAA,IACb,oBAAA,GAAuB,CAAA;AAAA,IACvB,oBAAA,GAAuB,CAAA;AAAA,IACvB,SAAA,CAAU;AAAA,GACZ,EACA;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAEtB,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,MAAA,CAAO,UAAU,CAAA;AAC1C,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,KAAA,CAAM,UAAU,CAAA;AACvC,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,KAAA,CAAM,YAAY,CAAA;AAE3C,EAAA,MAAM,KAAK7B,OAAA,CAAM,EAAA;AAIjB,EAAA,MAAM,YAAY,QAAA,GAAW,UAAA;AAC7B,EAAA,EAAA,CAAG,MAAA,CAAO,YAAY,QAAQ,CAAA;AAC9B,EAAA,MAAM,WAAW,UAAA,GAAa,SAAA;AAC9B,EAAA,EAAA,CAAG,MAAA,CAAO,UAAU,SAAS,CAAA;AAE7B,EAAA,EAAA,CAAG,YAAA,CAAa8C,gBAAU,IAAA,CAAK,EAAA,CAAG,IAAI,OAAA,CAAQ,QAAA,GAAW,CAAC,CAAC,CAAC,CAAA;AAC5D,EAAA,QAAA,CAAS,EAAA,CAAG,gBAAgB,CAAA;AAC5B,EAAA,OAAO,IAAA;AACT;AAEO,IAAM,UAAA,GAAa,UAAU,MAAA,CAAO;AAAA,EACzC,IAAA,EAAM,YAAA;AAAA,EAEN,oBAAA,GAAuB;AACrB,IAAA,MAAM,EAAE,QAAO,GAAI,IAAA;AACnB,IAAA,OAAO;AAAA,MACL,KAAK,MAAM;AACT,QAAA,IAAI,CAAC,QAAQ,OAAO,KAAA;AACpB,QAAA,OAAO,sBAAA,CAAuB,MAAA,CAAO,KAAA,EAAO,MAAA,CAAO,KAAK,QAAQ,CAAA;AAAA,MAClE,CAAA;AAAA,MACA,aAAa,MAAM;AACjB,QAAA,IAAI,CAAC,QAAQ,OAAO,KAAA;AACpB,QAAA,OAAO,wBAAA,CAAyB,MAAA,CAAO,KAAA,EAAO,MAAA,CAAO,KAAK,QAAQ,CAAA;AAAA,MACpE;AAAA,KACF;AAAA,EACF;AACF,CAAC;AC/KM,IAAM,uBAAA,GAA0B,IAAIJ,eAAAA,CAAU,gBAAgB;AAE9D,IAAM,cAAA,GAAiB,UAAU,MAAA,CAGtC;AAAA,EACA,IAAA,EAAM,gBAAA;AAAA,EAEN,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,IAAA;AAAA,MACP,SAAA,EAAW,IAAA;AAAA,MACX,IAAA,EAAM;AAAA,KACR;AAAA,EACF,CAAA;AAAA,EAEA,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,YAAY,MAAM,CAAA;AAAA,MAClB,OAAO,MAAM,CAAA;AAAA,MACb,YAAY,MAAM,CAAA;AAAA,MAClB,WAAW,MAAM,QAAA;AAAA,MACjB,gBAAgB,MAAM,CAAA;AAAA,MACtB,eAAe,MAAM,QAAA;AAAA,MACrB,iBAAiB,MAAM;AAAA,KACzB;AAAA,EACF,CAAA;AAAA,EAEA,QAAA,GAAW;AACT,IAAA,MAAM,gBAAgB,MAAc;AAClC,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,KAAA,CAAM,GAAA;AACpC,MAAA,IAAI,CAAC,KAAK,OAAO,CAAA;AAEjB,MAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,IAAA,KAAS,UAAA,EAAY;AACpC,QAAA,OAAO,GAAA,CAAI,QAAA;AAAA,MACb;AAEA,MAAA,OAAO,IAAI,WAAA,CAAY,MAAA;AAAA,IACzB,CAAA;AAEA,IAAA,MAAM,WAAW,MAAc;AAC7B,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,KAAA,CAAM,GAAA;AACpC,MAAA,IAAI,CAAC,KAAK,OAAO,CAAA;AAEjB,MAAA,MAAM,OAAO,GAAA,CAAI,WAAA;AACjB,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA,CAAE,OAAO,CAAC,IAAA,KAAS,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA;AAChE,MAAA,OAAO,KAAA,CAAM,MAAA;AAAA,IACf,CAAA;AAEA,IAAA,IAAA,CAAK,QAAQ,UAAA,GAAa,aAAA;AAC1B,IAAA,IAAA,CAAK,QAAQ,KAAA,GAAQ,QAAA;AAErB,IAAA,IAAA,CAAK,OAAA,CAAQ,aAAa,MAAM;AAC9B,MAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,KAAA,KAAU,IAAA,EAAM,OAAO,CAAA;AACxC,MAAA,MAAM,QAAQ,aAAA,EAAc;AAC5B,MAAA,OAAO,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,IAAA,CAAK,KAAA,CAAO,QAAQ,IAAA,CAAK,OAAA,CAAQ,KAAA,GAAS,GAAG,CAAC,CAAA;AAAA,IACrE,CAAA;AAEA,IAAA,IAAA,CAAK,OAAA,CAAQ,YAAY,MAAM;AAC7B,MAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,KAAA,KAAU,IAAA,EAAM,OAAO,QAAA;AACxC,MAAA,OAAO,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,OAAA,CAAQ,KAAA,GAAQ,eAAe,CAAA;AAAA,IACzD,CAAA;AAEA,IAAA,IAAA,CAAK,OAAA,CAAQ,iBAAiB,MAAM;AAClC,MAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,SAAA,KAAc,IAAA,EAAM,OAAO,CAAA;AAC5C,MAAA,MAAM,QAAQ,QAAA,EAAS;AACvB,MAAA,OAAO,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,IAAA,CAAK,KAAA,CAAO,QAAQ,IAAA,CAAK,OAAA,CAAQ,SAAA,GAAa,GAAG,CAAC,CAAA;AAAA,IACzE,CAAA;AAEA,IAAA,IAAA,CAAK,OAAA,CAAQ,gBAAgB,MAAM;AACjC,MAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,SAAA,KAAc,IAAA,EAAM,OAAO,QAAA;AAC5C,MAAA,OAAO,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,OAAA,CAAQ,SAAA,GAAY,UAAU,CAAA;AAAA,IACxD,CAAA;AAEA,IAAA,IAAA,CAAK,OAAA,CAAQ,kBAAkB,MAAM;AACnC,MAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,KAAA,KAAU,IAAA,EAAM;AAC/B,QAAA,IAAI,aAAA,EAAc,GAAI,IAAA,CAAK,OAAA,CAAQ,OAAO,OAAO,IAAA;AAAA,MACnD;AACA,MAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,SAAA,KAAc,IAAA,EAAM;AACnC,QAAA,IAAI,QAAA,EAAS,GAAI,IAAA,CAAK,OAAA,CAAQ,WAAW,OAAO,IAAA;AAAA,MAClD;AACA,MAAA,OAAO,KAAA;AAAA,IACT,CAAA;AAAA,EACF,CAAA;AAAA,EAEA,qBAAA,GAAwB;AACtB,IAAA,MAAM,EAAE,KAAA,EAAO,SAAA,EAAW,IAAA,KAAS,IAAA,CAAK,OAAA;AAGxC,IAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,SAAA,KAAc,IAAA,SAAa,EAAC;AAElD,IAAA,OAAO;AAAA,MACL,IAAIxC,YAAAA,CAAO;AAAA,QACT,GAAA,EAAK,uBAAA;AAAA,QACL,iBAAA,EAAmB,CAAC,WAAA,KAAgB;AAElC,UAAA,IAAI,CAAC,WAAA,CAAY,UAAA,EAAY,OAAO,IAAA;AAEpC,UAAA,MAAM,SAAS,WAAA,CAAY,GAAA;AAG3B,UAAA,IAAI,UAAU,IAAA,EAAM;AAClB,YAAA,MAAM,QAAQ,IAAA,KAAS,UAAA,GACnB,MAAA,CAAO,QAAA,GACP,OAAO,WAAA,CAAY,MAAA;AACvB,YAAA,IAAI,KAAA,GAAQ,OAAO,OAAO,KAAA;AAAA,UAC5B;AAGA,UAAA,IAAI,cAAc,IAAA,EAAM;AACtB,YAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,WAAA,CAAY,KAAA,CAAM,KAAK,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,GAAS,CAAC,CAAA;AACxE,YAAA,IAAI,KAAA,CAAM,SAAS,SAAA,EAAW;AAC5B,cAAA,OAAO,KAAA;AAAA,YACT;AAAA,UACF;AAEA,UAAA,OAAO,IAAA;AAAA,QACT;AAAA,OACD;AAAA,KACH;AAAA,EACF;AACF,CAAC;ACtGM,IAAM,UAAA,GAAa,UAAU,MAAA,CAA0B;AAAA,EAC5D,IAAA,EAAM,YAAA;AAAA,EAEN,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,IAAA;AAAA,MACR,QAAA,EAAU,IAAA;AAAA,MACV,MAAA,EAAQ,IAAA;AAAA,MACR,SAAA,EAAW,IAAA;AAAA,MACX,OAAA,EAAS,IAAA;AAAA,MACT,IAAA,EAAM,IAAA;AAAA,MACN,UAAA,EAAY,IAAA;AAAA,MACZ,WAAA,EAAa,IAAA;AAAA,MACb,eAAA,EAAiB,QAAA;AAAA;AAAA,MACjB,gBAAA,EAAkB,QAAA;AAAA;AAAA,MAClB,eAAA,EAAiB,QAAA;AAAA;AAAA,MACjB,gBAAA,EAAkB;AAAA;AAAA,KACpB;AAAA,EACF,CAAA;AAAA,EAEA,aAAA,GAAgB;AACd,IAAA,MAAM,QAAqB,EAAC;AAE5B,IAAA,IAAI,IAAA,CAAK,QAAQ,MAAA,EAAQ;AACvB,MAAA,KAAA,CAAM,IAAA,CAAK,cAAc,EAAE,IAAA,EAAM,OAAO,OAAA,EAAS,QAAA,EAAU,CAAC,CAAA;AAAA,IAC9D;AAEA,IAAA,IAAI,IAAA,CAAK,QAAQ,QAAA,EAAU;AACzB,MAAA,KAAA,CAAM,IAAA,CAAK,cAAc,EAAE,IAAA,EAAM,WAAW,OAAA,EAAS,QAAA,EAAU,CAAC,CAAA;AAAA,IAClE;AAEA,IAAA,IAAI,IAAA,CAAK,QAAQ,MAAA,EAAQ;AACvB,MAAA,KAAA,CAAM,IAAA,CAAK,cAAc,EAAE,IAAA,EAAM,OAAO,OAAA,EAAS,QAAA,EAAU,CAAC,CAAA;AAC5D,MAAA,KAAA,CAAM,IAAA,CAAK,cAAc,EAAE,IAAA,EAAM,OAAO,OAAA,EAAS,QAAA,EAAU,CAAC,CAAA;AAC5D,MAAA,KAAA,CAAM,IAAA,CAAK,cAAc,EAAE,IAAA,EAAM,OAAO,OAAA,EAAS,QAAA,EAAU,CAAC,CAAA;AAAA,IAC9D;AAEA,IAAA,IAAI,IAAA,CAAK,QAAQ,SAAA,EAAW;AAC1B,MAAA,KAAA,CAAM,IAAA,CAAK,cAAc,EAAE,IAAA,EAAM,SAAS,OAAA,EAAS,MAAA,EAAU,CAAC,CAAA;AAC9D,MAAA,KAAA,CAAM,IAAA,CAAK,cAAc,EAAE,IAAA,EAAM,SAAS,OAAA,EAAS,MAAA,EAAU,CAAC,CAAA;AAC9D,MAAA,KAAA,CAAM,IAAA,CAAK,cAAc,EAAE,IAAA,EAAM,SAAS,OAAA,EAAS,MAAA,EAAU,CAAC,CAAA;AAC9D,MAAA,KAAA,CAAM,IAAA,CAAK,cAAc,EAAE,IAAA,EAAM,SAAS,OAAA,EAAS,QAAA,EAAU,CAAC,CAAA;AAC9D,MAAA,KAAA,CAAM,IAAA,CAAK,cAAc,EAAE,IAAA,EAAM,SAAS,OAAA,EAAS,QAAA,EAAU,CAAC,CAAA;AAAA,IAChE;AAEA,IAAA,IAAI,IAAA,CAAK,QAAQ,OAAA,EAAS;AACxB,MAAA,KAAA,CAAM,IAAA,CAAK,cAAc,EAAE,IAAA,EAAM,WAAW,OAAA,EAAS,MAAA,EAAU,CAAC,CAAA;AAChE,MAAA,KAAA,CAAM,IAAA,CAAK,cAAc,EAAE,IAAA,EAAM,WAAW,OAAA,EAAS,MAAA,EAAU,CAAC,CAAA;AAChE,MAAA,KAAA,CAAM,IAAA,CAAK,cAAc,EAAE,IAAA,EAAM,YAAY,OAAA,EAAS,QAAA,EAAU,CAAC,CAAA;AACjE,MAAA,KAAA,CAAM,IAAA,CAAK,cAAc,EAAE,IAAA,EAAM,YAAY,OAAA,EAAS,QAAA,EAAU,CAAC,CAAA;AAAA,IACnE;AAEA,IAAA,IAAI,IAAA,CAAK,QAAQ,IAAA,EAAM;AACrB,MAAA,KAAA,CAAM,IAAA,CAAK,cAAc,EAAE,IAAA,EAAM,UAAU,OAAA,EAAS,MAAA,EAAU,CAAC,CAAA;AAC/D,MAAA,KAAA,CAAM,IAAA,CAAK,cAAc,EAAE,IAAA,EAAM,OAAO,OAAA,EAAS,QAAA,EAAU,CAAC,CAAA;AAC5D,MAAA,KAAA,CAAM,IAAA,CAAK,cAAc,EAAE,IAAA,EAAM,OAAO,OAAA,EAAS,QAAA,EAAU,CAAC,CAAA;AAC5D,MAAA,KAAA,CAAM,IAAA,CAAK,cAAc,EAAE,IAAA,EAAM,OAAO,OAAA,EAAS,QAAA,EAAU,CAAC,CAAA;AAAA,IAC9D;AAEA,IAAA,IAAI,IAAA,CAAK,QAAQ,UAAA,EAAY;AAC3B,MAAA,KAAA,CAAM,IAAA,CAAK,cAAc,EAAE,IAAA,EAAM,OAAO,OAAA,EAAS,MAAA,EAAU,CAAC,CAAA;AAC5D,MAAA,KAAA,CAAM,IAAA,CAAK,cAAc,EAAE,IAAA,EAAM,OAAO,OAAA,EAAS,MAAA,EAAU,CAAC,CAAA;AAAA,IAC9D;AAGA,IAAA,IAAI,IAAA,CAAK,QAAQ,WAAA,EAAa;AAC5B,MAAA,MAAM,EAAE,eAAA,EAAiB,gBAAA,EAAkB,eAAA,EAAiB,gBAAA,KAAqB,IAAA,CAAK,OAAA;AAGtF,MAAA,KAAA,CAAM,IAAA;AAAA,QACJ,IAAIQ,oBAAAA,CAAU,YAAA,EAAc,CAAC,KAAA,EAAO,KAAA,EAAO,OAAO,GAAA,KAAQ;AACxD,UAAA,MAAM,IAAA,GAAO,KAAA,CAAM,CAAC,CAAA,IAAK,EAAA;AACzB,UAAA,OAAO,MAAM,EAAA,CAAG,WAAA;AAAA,YACd,KAAA;AAAA,YACA,GAAA;AAAA,YACA,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,eAAA,GAAkB,OAAO,gBAAgB;AAAA,WAC7D;AAAA,QACF,CAAC;AAAA,OACH;AAIA,MAAA,KAAA,CAAM,IAAA;AAAA,QACJ,IAAIA,oBAAAA,CAAU,yBAAA,EAA2B,CAAC,KAAA,EAAO,KAAA,EAAO,OAAO,GAAA,KAAQ;AACrE,UAAA,MAAM,IAAA,GAAO,KAAA,CAAM,CAAC,CAAA,IAAK,EAAA;AACzB,UAAA,MAAM,MAAA,GAAS,KAAA,CAAM,CAAC,CAAA,CAAE,OAAO,CAAC,CAAA;AAEhC,UAAA,MAAM,YAAY,MAAA,KAAW,GAAA;AAC7B,UAAA,OAAO,MAAM,EAAA,CAAG,WAAA;AAAA,YACd,KAAA;AAAA,YACA,GAAA;AAAA,YACA,MAAM,MAAA,CAAO,IAAA;AAAA,cACX,YACI,MAAA,GAAS,eAAA,GAAkB,IAAA,GAAO,gBAAA,GAClC,kBAAkB,IAAA,GAAO;AAAA;AAC/B,WACF;AAAA,QACF,CAAC;AAAA,OACH;AAAA,IACF;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AACF,CAAC;;;ACzJM,IAAM,SAAA,GAAY,UAAU,MAAA,CAAyB;AAAA,EAC1D,IAAA,EAAM,WAAA;AAAA,EAEN,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,CAAC,SAAA,EAAW,WAAW,CAAA;AAAA,MAC9B,UAAA,EAAY,CAAC,MAAA,EAAQ,QAAA,EAAU,SAAS,SAAS,CAAA;AAAA,MACjD,gBAAA,EAAkB;AAAA,KACpB;AAAA,EACF,CAAA;AAAA,EAEA,mBAAA,GAAsB;AACpB,IAAA,OAAO;AAAA,MACL;AAAA,QACE,KAAA,EAAO,KAAK,OAAA,CAAQ,KAAA;AAAA,QACpB,UAAA,EAAY;AAAA,UACV,SAAA,EAAW;AAAA,YACT,OAAA,EAAS,KAAK,OAAA,CAAQ,gBAAA;AAAA,YACtB,WAAW,CAAC,OAAA,KACV,QAAQ,KAAA,CAAM,SAAA,IAAa,KAAK,OAAA,CAAQ,gBAAA;AAAA,YAC1C,UAAA,EAAY,CAAC,UAAA,KAAwC;AACnD,cAAA,MAAM,SAAA,GAAY,WAAW,WAAW,CAAA;AACxC,cAAA,IAAI,SAAA,KAAc,IAAA,CAAK,OAAA,CAAQ,gBAAA,EAAkB;AAC/C,gBAAA,OAAO,IAAA;AAAA,cACT;AACA,cAAA,OAAO,EAAE,KAAA,EAAO,CAAA,YAAA,EAAe,SAAS,CAAA,CAAA,EAAG;AAAA,YAC7C;AAAA;AACF;AACF;AACF,KACF;AAAA,EACF,CAAA;AAAA,EAEA,WAAA,GAAc;AACZ,IAAA,OAAO;AAAA,MACL,cACE,CAAC,SAAA,KACD,CAAC,EAAE,UAAS,KAAM;AAChB,QAAA,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,QAAA,CAAS,SAAS,CAAA,EAAG;AAChD,UAAA,OAAO,KAAA;AAAA,QACT;AAEA,QAAA,OAAO,KAAK,OAAA,CAAQ,KAAA,CACjB,GAAA,CAAI,CAAC,SAAS,QAAA,CAAS,gBAAA,CAAiB,IAAA,EAAM,EAAE,WAAW,SAAA,EAAW,CAAC,CAAA,CACvE,KAAK,OAAO,CAAA;AAAA,MACjB,CAAA;AAAA,MAEF,cAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM;AAChB,QAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,KAAA,CACjB,GAAA,CAAI,CAAC,IAAA,KAAS,QAAA,CAAS,eAAA,CAAgB,IAAA,EAAM,WAAW,CAAC,CAAA,CACzD,KAAK,OAAO,CAAA;AAAA,MACjB;AAAA,KACJ;AAAA,EACF,CAAA;AAAA,EAEA,oBAAA,GAAuB;AACrB,IAAA,OAAO;AAAA,MACL,eAAe,MACb,IAAA,CAAK,QAAQ,QAAA,CAAS,YAAA,CAAa,MAAM,CAAA,IAAK,KAAA;AAAA,MAChD,eAAe,MACb,IAAA,CAAK,QAAQ,QAAA,CAAS,YAAA,CAAa,QAAQ,CAAA,IAAK,KAAA;AAAA,MAClD,eAAe,MACb,IAAA,CAAK,QAAQ,QAAA,CAAS,YAAA,CAAa,OAAO,CAAA,IAAK,KAAA;AAAA,MACjD,eAAe,MACb,IAAA,CAAK,QAAQ,QAAA,CAAS,YAAA,CAAa,SAAS,CAAA,IAAK;AAAA,KACrD;AAAA,EACF,CAAA;AAAA,EAEA,eAAA,GAAiC;AAC/B,IAAA,MAAM,KAAA,GAAQ,KAAK,OAAA,CAAQ,KAAA;AAC3B,IAAA,MAAM,UAAA,GAAa,CAAC,SAAA,KAClB,KAAA,CAAM,IAAI,CAAC,CAAA,MAAO,EAAE,IAAA,EAAM,GAAG,UAAA,EAAY,EAAE,SAAA,EAAW,SAAA,IAAY,CAAE,CAAA;AAEtE,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,UAAA;AAAA,QACN,IAAA,EAAM,WAAA;AAAA,QACN,IAAA,EAAM,eAAA;AAAA,QACN,KAAA,EAAO,gBAAA;AAAA,QACP,KAAA,EAAO,WAAA;AAAA,QACP,QAAA,EAAU,GAAA;AAAA,QACV,WAAA,EAAa,IAAA;AAAA,QACb,KAAA,EAAO;AAAA,UACL;AAAA,YACE,IAAA,EAAM,QAAA;AAAA,YACN,IAAA,EAAM,WAAA;AAAA,YACN,OAAA,EAAS,cAAA;AAAA,YACT,WAAA,EAAa,CAAC,MAAM,CAAA;AAAA,YACpB,QAAA,EAAU,WAAW,MAAM,CAAA;AAAA,YAC3B,IAAA,EAAM,eAAA;AAAA,YACN,KAAA,EAAO,YAAA;AAAA,YACP,QAAA,EAAU;AAAA,WACZ;AAAA,UACA;AAAA,YACE,IAAA,EAAM,QAAA;AAAA,YACN,IAAA,EAAM,aAAA;AAAA,YACN,OAAA,EAAS,cAAA;AAAA,YACT,WAAA,EAAa,CAAC,QAAQ,CAAA;AAAA,YACtB,QAAA,EAAU,WAAW,QAAQ,CAAA;AAAA,YAC7B,IAAA,EAAM,iBAAA;AAAA,YACN,KAAA,EAAO,cAAA;AAAA,YACP,QAAA,EAAU;AAAA,WACZ;AAAA,UACA;AAAA,YACE,IAAA,EAAM,QAAA;AAAA,YACN,IAAA,EAAM,YAAA;AAAA,YACN,OAAA,EAAS,cAAA;AAAA,YACT,WAAA,EAAa,CAAC,OAAO,CAAA;AAAA,YACrB,QAAA,EAAU,WAAW,OAAO,CAAA;AAAA,YAC5B,IAAA,EAAM,gBAAA;AAAA,YACN,KAAA,EAAO,aAAA;AAAA,YACP,QAAA,EAAU;AAAA,WACZ;AAAA,UACA;AAAA,YACE,IAAA,EAAM,QAAA;AAAA,YACN,IAAA,EAAM,cAAA;AAAA,YACN,OAAA,EAAS,cAAA;AAAA,YACT,WAAA,EAAa,CAAC,SAAS,CAAA;AAAA,YACvB,QAAA,EAAU,WAAW,SAAS,CAAA;AAAA,YAC9B,IAAA,EAAM,kBAAA;AAAA,YACN,KAAA,EAAO,SAAA;AAAA,YACP,QAAA,EAAU;AAAA;AACZ;AACF;AACF,KACF;AAAA,EACF;AACF,CAAC;AC3IM,IAAM,cAAA,GAAiB,IAAIgC,eAAAA,CAAU,OAAO;AAE5C,IAAM,KAAA,GAAQ,UAAU,MAAA,CAAqB;AAAA,EAClD,IAAA,EAAM,OAAA;AAAA,EAEN,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,SAAA,EAAW,WAAA;AAAA,MACX,IAAA,EAAM;AAAA,KACR;AAAA,EACF,CAAA;AAAA,EAEA,qBAAA,GAAwB;AACtB,IAAA,OAAO;AAAA,MACL,IAAIxC,YAAAA,CAAO;AAAA,QACT,GAAA,EAAK,cAAA;AAAA,QACL,KAAA,EAAO;AAAA,UACL,WAAA,EAAa,CAAC,EAAE,GAAA,EAAK,WAAU,KAAM;AACnC,YAAA,MAAM,EAAE,IAAA,EAAM,EAAA,EAAG,GAAI,SAAA;AACrB,YAAA,MAAM,cAA4B,EAAC;AACnC,YAAA,MAAM,eAAoD,EAAC;AAG3D,YAAA,GAAA,CAAI,YAAA,CAAa,IAAA,EAAM,EAAA,EAAI,CAAC,MAAM,GAAA,KAAQ;AACxC,cAAA,IAAI,KAAK,MAAA,EAAQ;AAGjB,cAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,QAAA;AAC3B,cAAA,IAAI,GAAA,IAAO,EAAA,IAAM,OAAA,IAAW,IAAA,EAAM;AAChC,gBAAA,YAAA,CAAa,KAAK,EAAE,GAAA,EAAK,QAAA,EAAU,IAAA,CAAK,UAAU,CAAA;AAAA,cACpD;AAAA,YACF,CAAC,CAAA;AAED,YAAA,IAAI,YAAA,CAAa,WAAW,CAAA,EAAG;AAC7B,cAAA,OAAOuD,kBAAAA,CAAc,KAAA;AAAA,YACvB;AAGA,YAAA,IAAI,eAAA,GAAkB,YAAA;AAEtB,YAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,IAAA,KAAS,SAAA,EAAW;AAEnC,cAAA,MAAM,IAAA,GAAO,YAAA,CAAa,YAAA,CAAa,MAAA,GAAS,CAAC,CAAA;AACjD,cAAA,eAAA,GAAkB,IAAA,GAAO,CAAC,IAAI,CAAA,GAAI,EAAC;AAAA,YACrC,CAAA,MAAA,IAAW,IAAA,CAAK,OAAA,CAAQ,IAAA,KAAS,YAAA,EAAc;AAE7C,cAAA,MAAM,KAAA,GAAQ,aAAa,CAAC,CAAA;AAC5B,cAAA,eAAA,GAAkB,KAAA,GAAQ,CAAC,KAAK,CAAA,GAAI,EAAC;AAAA,YACvC;AAGA,YAAA,KAAA,MAAW,EAAE,GAAA,EAAK,QAAA,EAAS,IAAK,eAAA,EAAiB;AAC/C,cAAA,WAAA,CAAY,IAAA;AAAA,gBACVE,eAAAA,CAAW,IAAA,CAAK,GAAA,EAAK,GAAA,GAAM,QAAA,EAAU;AAAA,kBACnC,KAAA,EAAO,KAAK,OAAA,CAAQ;AAAA,iBACrB;AAAA,eACH;AAAA,YACF;AAEA,YAAA,OAAOF,kBAAAA,CAAc,MAAA,CAAO,GAAA,EAAK,WAAW,CAAA;AAAA,UAC9C;AAAA;AACF,OACD;AAAA,KACH;AAAA,EACF;AACF,CAAC;;;ACrCM,IAAM,UAAA,GAAa,UAAU,MAAA,CAA0B;AAAA,EAC5D,IAAA,EAAM,YAAA;AAAA,EAEN,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,CAAC,WAAA,EAAa,SAAS,CAAA;AAAA,MAC9B,aAAa,CAAC,GAAA,EAAK,MAAA,EAAQ,MAAA,EAAQ,OAAO,GAAG,CAAA;AAAA,MAC7C,iBAAA,EAAmB;AAAA,KACrB;AAAA,EACF,CAAA;AAAA,EAEA,mBAAA,GAAsB;AACpB,IAAA,OAAO;AAAA,MACL;AAAA,QACE,KAAA,EAAO,KAAK,OAAA,CAAQ,KAAA;AAAA,QACpB,UAAA,EAAY;AAAA,UACV,UAAA,EAAY;AAAA,YACV,OAAA,EAAS,KAAK,OAAA,CAAQ,iBAAA;AAAA,YACtB,SAAA,EAAW,CAAC,OAAA,KAAyB;AACnC,cAAA,OAAO,OAAA,CAAQ,KAAA,CAAM,UAAA,IAAc,IAAA,CAAK,OAAA,CAAQ,iBAAA;AAAA,YAClD,CAAA;AAAA,YACA,UAAA,EAAY,CAAC,UAAA,KAAwC;AACnD,cAAA,MAAM,UAAA,GAAa,WAAW,YAAY,CAAA;AAG1C,cAAA,IAAI,CAAC,UAAA,IAAc,UAAA,KAAe,IAAA,CAAK,QAAQ,iBAAA,EAAmB;AAChE,gBAAA,OAAO,IAAA;AAAA,cACT;AAGA,cAAA,IACE,IAAA,CAAK,OAAA,CAAQ,WAAA,CAAY,MAAA,GAAS,CAAA,IAClC,CAAC,IAAA,CAAK,OAAA,CAAQ,WAAA,CAAY,QAAA,CAAS,UAAU,CAAA,EAC7C;AACA,gBAAA,OAAO,IAAA;AAAA,cACT;AAEA,cAAA,OAAO,EAAE,KAAA,EAAO,CAAA,aAAA,EAAgB,UAAU,CAAA,CAAA,EAAG;AAAA,YAC/C;AAAA;AACF;AACF;AACF,KACF;AAAA,EACF,CAAA;AAAA,EAEA,WAAA,GAAc;AACZ,IAAA,OAAO;AAAA,MACL,eACE,CAAC,UAAA,KACD,CAAC,EAAE,UAAS,KAAM;AAEhB,QAAA,IACE,IAAA,CAAK,OAAA,CAAQ,WAAA,CAAY,MAAA,GAAS,CAAA,IAClC,CAAC,IAAA,CAAK,OAAA,CAAQ,WAAA,CAAY,QAAA,CAAS,UAAU,CAAA,EAC7C;AACA,UAAA,OAAO,KAAA;AAAA,QACT;AAEA,QAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,KAAA,CACjB,GAAA,CAAI,CAAC,IAAA,KAAS,QAAA,CAAS,gBAAA,CAAiB,IAAA,EAAM,EAAE,UAAA,EAAY,CAAC,CAAA,CAC7D,KAAK,OAAO,CAAA;AAAA,MACjB,CAAA;AAAA,MAEF,eAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM;AAChB,QAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,KAAA,CACjB,GAAA,CAAI,CAAC,IAAA,KAAS,QAAA,CAAS,eAAA,CAAgB,IAAA,EAAM,YAAY,CAAC,CAAA,CAC1D,KAAK,OAAO,CAAA;AAAA,MACjB;AAAA,KACJ;AAAA,EACF,CAAA;AAAA,EAEA,eAAA,GAAiC;AAC/B,IAAA,IAAI,KAAK,OAAA,CAAQ,WAAA,CAAY,MAAA,KAAW,CAAA,SAAU,EAAC;AAEnD,IAAA,MAAM,KAAA,GAAQ,KAAK,OAAA,CAAQ,KAAA;AAC3B,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,UAAA;AAAA,QACN,IAAA,EAAM,YAAA;AAAA,QACN,IAAA,EAAM,aAAA;AAAA,QACN,KAAA,EAAO,aAAA;AAAA,QACP,KAAA,EAAO,WAAA;AAAA,QACP,QAAA,EAAU,EAAA;AAAA,QACV,WAAA,EAAa,MAAA;AAAA,QACb,YAAA,EAAc,IAAA;AAAA,QACd,KAAA,EAAO;AAAA,UACL,GAAG,IAAA,CAAK,OAAA,CAAQ,YAAY,GAAA,CAAI,CAAC,IAAI,CAAA,MAAO;AAAA,YAC1C,IAAA,EAAM,QAAA;AAAA,YACN,IAAA,EAAM,cAAc,EAAE,CAAA,CAAA;AAAA,YACtB,OAAA,EAAS,eAAA;AAAA,YACT,WAAA,EAAa,CAAC,EAAE,CAAA;AAAA,YAChB,QAAA,EAAU,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,IAAA,EAAM,CAAA,EAAG,UAAA,EAAY,EAAE,UAAA,EAAY,EAAA,IAAK,CAAE,CAAA;AAAA,YACxE,IAAA,EAAM,aAAA;AAAA,YACN,KAAA,EAAO,EAAA;AAAA,YACP,UAAU,GAAA,GAAM;AAAA,WAClB,CAAE,CAAA;AAAA,UACF;AAAA,YACE,IAAA,EAAM,QAAA;AAAA,YACN,IAAA,EAAM,iBAAA;AAAA,YACN,OAAA,EAAS,iBAAA;AAAA,YACT,IAAA,EAAM,aAAA;AAAA,YACN,KAAA,EAAO;AAAA;AACT;AACF;AACF,KACF;AAAA,EACF;AACF,CAAC;AC1JD,SAAS,YAAA,GAAuB;AAK9B,EAAA,IAAI,OAAO,eAAe,WAAA,EAAa;AACrC,IAAA,MAAM,IAAK,UAAA,CAA0D,MAAA;AACrE,IAAA,IAAI,KAAK,OAAO,CAAA,CAAE,eAAe,UAAA,EAAY,OAAO,EAAE,UAAA,EAAW;AAAA,EACnE;AACA,EAAA,OAAO,sCAAA,CAAuC,OAAA,CAAQ,OAAA,EAAS,CAAC,CAAA,KAAM;AACpE,IAAA,MAAM,CAAA,GAAK,IAAA,CAAK,MAAA,EAAO,GAAI,EAAA,GAAM,CAAA;AACjC,IAAA,MAAM,CAAA,GAAI,CAAA,KAAM,GAAA,GAAM,CAAA,GAAK,IAAI,CAAA,GAAO,CAAA;AACtC,IAAA,OAAO,CAAA,CAAE,SAAS,EAAE,CAAA;AAAA,EACtB,CAAC,CAAA;AACH;AAEO,IAAM,iBAAA,GAAoB,IAAIf,eAAAA,CAAU,UAAU;AA4BlD,IAAM,QAAA,GAAW,UAAU,MAAA,CAAwB;AAAA,EACxD,IAAA,EAAM,UAAA;AAAA,EAEN,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,KAAA,EAAO;AAAA,QACL,WAAA;AAAA,QACA,SAAA;AAAA,QACA,YAAA;AAAA,QACA,WAAA;AAAA,QACA,YAAA;AAAA,QACA,aAAA;AAAA,QACA,UAAA;AAAA,QACA,UAAA;AAAA,QACA,UAAA;AAAA,QACA,OAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,aAAA,EAAe,IAAA;AAAA,MACf,UAAA,EAAY,YAAA;AAAA,MACZ,gBAAA,EAAkB;AAAA,KACpB;AAAA,EACF,CAAA;AAAA,EAEA,mBAAA,GAAsB;AACpB,IAAA,OAAO;AAAA,MACL;AAAA,QACE,KAAA,EAAO,KAAK,OAAA,CAAQ,KAAA;AAAA,QACpB,UAAA,EAAY;AAAA,UACV,CAAC,IAAA,CAAK,OAAA,CAAQ,aAAa,GAAG;AAAA,YAC5B,OAAA,EAAS,IAAA;AAAA,YACT,WAAW,CAAC,OAAA,KACV,QAAQ,YAAA,CAAa,IAAA,CAAK,QAAQ,aAAa,CAAA;AAAA,YACjD,UAAA,EAAY,CAAC,UAAA,KAAwC;AACnD,cAAA,MAAM,EAAA,GAAK,UAAA,CAAW,IAAA,CAAK,OAAA,CAAQ,aAAa,CAAA;AAChD,cAAA,IAAI,CAAC,IAAI,OAAO,IAAA;AAChB,cAAA,OAAO,EAAE,CAAC,IAAA,CAAK,OAAA,CAAQ,aAAa,GAAG,EAAA,EAAG;AAAA,YAC5C;AAAA;AACF;AACF;AACF,KACF;AAAA,EACF,CAAA;AAAA,EAEA,qBAAA,GAAwB;AACtB,IAAA,MAAM,EAAE,KAAA,EAAO,aAAA,EAAe,UAAA,EAAY,gBAAA,KAAqB,IAAA,CAAK,OAAA;AACpE,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AAEpB,IAAA,MAAM,oBAAA,GAAuB,CAAC,KAAA,KAAwB;AACpD,MAAA,MAAM,WAAA,uBAAkB,GAAA,EAAY;AAGpC,MAAA,MAAA,EAAQ,KAAA,CAAM,GAAA,CAAI,WAAA,CAAY,CAAC,IAAA,KAAiB;AAC9C,QAAA,MAAM,EAAA,GAAK,IAAA,CAAK,KAAA,CAAM,aAAa,CAAA;AACnC,QAAA,IAAI,EAAA,EAAI,WAAA,CAAY,GAAA,CAAI,EAAE,CAAA;AAAA,MAC5B,CAAC,CAAA;AAGD,MAAA,MAAM,aAAA,GAAgB,CAAC,IAAA,KAAyB;AAC9C,QAAA,IAAI,CAAC,KAAA,CAAM,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,EAAG;AACnC,UAAA,OAAO,IAAA,CAAK,IAAA,CAAK,iBAAA,CAAkB,IAAA,CAAK,OAAO,CAAC,CAAA;AAAA,QAClD;AAEA,QAAA,MAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,aAAa,CAAA;AAC3C,QAAA,IAAI,UAAA,IAAc,WAAA,CAAY,GAAA,CAAI,UAAU,CAAA,EAAG;AAE7C,UAAA,OAAO,KAAK,IAAA,CAAK,MAAA;AAAA,YACf,EAAE,GAAG,IAAA,CAAK,KAAA,EAAO,CAAC,aAAa,GAAG,YAAW,EAAE;AAAA,YAC/C,iBAAA,CAAkB,KAAK,OAAO,CAAA;AAAA,YAC9B,IAAA,CAAK;AAAA,WACP;AAAA,QACF;AAGA,QAAA,IAAI,UAAA,EAAY,WAAA,CAAY,GAAA,CAAI,UAAU,CAAA;AAC1C,QAAA,OAAO,IAAA,CAAK,IAAA,CAAK,iBAAA,CAAkB,IAAA,CAAK,OAAO,CAAC,CAAA;AAAA,MAClD,CAAA;AAEA,MAAA,MAAM,iBAAA,GAAoB,CAAC,QAAA,KAAiC;AAC1D,QAAA,MAAM,QAAkB,EAAC;AACzB,QAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,IAAA,KAAS;AACzB,UAAA,KAAA,CAAM,IAAA,CAAK,aAAA,CAAc,IAAI,CAAC,CAAA;AAAA,QAChC,CAAC,CAAA;AACD,QAAA,OAAOxB,cAAAA,CAAS,KAAK,KAAK,CAAA;AAAA,MAC5B,CAAA;AAEA,MAAA,OAAO,IAAIC,WAAAA;AAAA,QACT,iBAAA,CAAkB,MAAM,OAAO,CAAA;AAAA,QAC/B,KAAA,CAAM,SAAA;AAAA,QACN,KAAA,CAAM;AAAA,OACR;AAAA,IACF,CAAA;AAiBA,IAAA,MAAM,gBAAA,GAAmB,CAAC,GAAA,EAAa,EAAA,KAA0B;AAC/D,MAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,MAAA,GAAA,CAAI,WAAA,CAAY,CAAC,IAAA,EAAM,GAAA,KAAQ;AAC7B,QAAA,IAAI,CAAC,KAAA,CAAM,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,EAAG;AAErC,QAAA,MAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,aAAa,CAAA;AAC3C,QAAA,IAAI,CAAC,UAAA,EAAY;AAIf,UAAA,IAAI,KAAK,UAAA,EAAW;AACpB,UAAA,OAAO,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,OAAQ,UAAA,EAAW;AACrC,UAAA,IAAA,CAAK,IAAI,EAAE,CAAA;AAMX,UAAA,EAAA,CAAG,cAAc,EAAA,CAAG,OAAA,CAAQ,GAAA,CAAI,GAAG,GAAG,MAAA,EAAW;AAAA,YAC/C,GAAG,IAAA,CAAK,KAAA;AAAA,YACR,CAAC,aAAa,GAAG;AAAA,WAClB,CAAA;AACD,UAAA;AAAA,QACF;AACA,QAAA,IAAI,IAAA,CAAK,GAAA,CAAI,UAAU,CAAA,EAAG;AAIxB,UAAA,IAAI,KAAK,UAAA,EAAW;AACpB,UAAA,OAAO,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,OAAQ,UAAA,EAAW;AACrC,UAAA,IAAA,CAAK,IAAI,EAAE,CAAA;AACX,UAAA,EAAA,CAAG,cAAc,EAAA,CAAG,OAAA,CAAQ,GAAA,CAAI,GAAG,GAAG,MAAA,EAAW;AAAA,YAC/C,GAAG,IAAA,CAAK,KAAA;AAAA,YACR,CAAC,aAAa,GAAG;AAAA,WAClB,CAAA;AACD,UAAA;AAAA,QACF;AACA,QAAA,IAAA,CAAK,IAAI,UAAU,CAAA;AAAA,MACrB,CAAC,CAAA;AAAA,IACH,CAAA;AAEA,IAAA,OAAO;AAAA,MACL,IAAIjB,YAAAA,CAAO;AAAA,QACT,GAAA,EAAK,iBAAA;AAAA;AAAA,QAGL,KAAK,UAAA,EAAY;AAIf,UAAA,MAAM,SAAA,GAAY,WAAW,MAAM;AACjC,YAAA,MAAM,EAAA,GAAK,WAAW,KAAA,CAAM,EAAA;AAC5B,YAAA,gBAAA,CAAiB,UAAA,CAAW,KAAA,CAAM,GAAA,EAAK,EAAE,CAAA;AACzC,YAAA,IAAI,GAAG,UAAA,EAAY;AACjB,cAAA,UAAA,CAAW,SAAS,EAAE,CAAA;AAAA,YACxB;AAAA,UACF,GAAG,CAAC,CAAA;AACJ,UAAA,OAAO;AAAA,YACL,OAAA,GAAU;AACR,cAAA,YAAA,CAAa,SAAS,CAAA;AAAA,YACxB;AAAA,WACF;AAAA,QACF,CAAA;AAAA;AAAA,QAGA,iBAAA,CAAkB,YAAA,EAAc,SAAA,EAAW,QAAA,EAAU;AACnD,UAAA,MAAM,aAAa,YAAA,CAAa,IAAA,CAAK,CAACqC,GAAAA,KAAOA,IAAG,UAAU,CAAA;AAC1D,UAAA,IAAI,CAAC,YAAY,OAAO,IAAA;AAExB,UAAA,MAAM,KAAK,QAAA,CAAS,EAAA;AACpB,UAAA,gBAAA,CAAiB,QAAA,CAAS,KAAK,EAAE,CAAA;AAEjC,UAAA,OAAO,EAAA,CAAG,aAAa,EAAA,GAAK,IAAA;AAAA,QAC9B,CAAA;AAAA;AAAA,QAGA,OAAO,gBAAA,GACH;AAAA,UACE,eAAA,EAAiB;AAAA,YAEnB;AAAC,OACN;AAAA,KACH;AAAA,EACF;AACF,CAAC;;;AC/NM,IAAM,oBAAA,GAAiC;AAAA,EAC5C,MAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF;AAQO,IAAM,yBAAA,GAAsC;AAAA,EACjD,WAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF;AAqCO,SAAS,yBAAA,CACd,EAAA,EACA,KAAA,EACA,IAAA,EACA,IACA,KAAA,EACM;AACN,EAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,WAAW,CAAA;AACpD,EAAA,IAAI,CAAC,aAAA,EAAe;AACpB,EAAA,MAAM,aAAuB,EAAC;AAC9B,EAAA,IAAI,UAAU,MAAA,IAAU,KAAA,KAAU,QAAQ,UAAA,CAAW,IAAA,CAAK,SAAS,YAAY,CAAA;AAC/E,EAAA,IAAI,UAAU,IAAA,IAAQ,KAAA,KAAU,QAAQ,UAAA,CAAW,IAAA,CAAK,mBAAmB,sBAAsB,CAAA;AACjG,EAAA,KAAA,CAAM,IAAI,YAAA,CAAa,IAAA,EAAM,EAAA,EAAI,CAAC,MAAM,GAAA,KAAQ;AAC9C,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,EAAQ,OAAO,IAAA;AACzB,IAAA,MAAM,QAAA,GAAW,KAAK,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,aAAa,CAAA;AAChE,IAAA,IAAI,CAAC,UAAU,OAAO,KAAA;AACtB,IAAA,MAAM,WAAA,GAAc,UAAA,CAAW,IAAA,CAAK,CAAC,MAAM,QAAA,CAAS,KAAA,CAAM,CAAC,CAAA,KAAM,IAAA,IAAQ,QAAA,CAAS,KAAA,CAAM,CAAC,MAAM,MAAS,CAAA;AACxG,IAAA,IAAI,CAAC,aAAa,OAAO,KAAA;AACzB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,IAAI,CAAA;AAChC,IAAA,MAAM,MAAM,IAAA,CAAK,GAAA,CAAI,GAAA,GAAM,IAAA,CAAK,UAAU,EAAE,CAAA;AAC5C,IAAA,MAAM,QAAA,GAAoC,EAAE,GAAG,QAAA,CAAS,KAAA,EAAM;AAC9D,IAAA,KAAA,MAAW,CAAA,IAAK,UAAA,EAAY,QAAA,CAAS,CAAC,CAAA,GAAI,IAAA;AAC1C,IAAA,MAAM,SAAA,GAAY,MAAA,CAAO,MAAA,CAAO,QAAQ,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,KAAM,IAAA,IAAQ,CAAA,KAAM,MAAS,CAAA;AACnF,IAAA,EAAA,CAAG,UAAA,CAAW,KAAA,EAAO,GAAA,EAAK,QAAQ,CAAA;AAClC,IAAA,IAAI,SAAA,KAAc,OAAA,CAAQ,KAAA,EAAO,KAAK,aAAA,CAAc,MAAA,CAAO,QAAQ,CAAC,CAAA;AACpE,IAAA,OAAO,KAAA;AAAA,EACT,CAAC,CAAA;AACH;AAEO,IAAM,UAAA,GAAa,UAAU,MAAA,CAA0B;AAAA,EAC5D,IAAA,EAAM,YAAA;AAAA,EAEN,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,yBAAA;AAAA,MACP,QAAA,EAAU,oBAAA;AAAA,MACV,UAAA,EAAY;AAAA,KACd;AAAA,EACF,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,cAAA,GAAiB;AACf,IAAA,IAAI,KAAK,OAAA,CAAQ,QAAA,CAAS,WAAW,CAAA,EAAG,IAAA,CAAK,QAAQ,QAAA,GAAW,oBAAA;AAChE,IAAA,IAAI,KAAK,OAAA,CAAQ,UAAA,CAAW,WAAW,CAAA,EAAG,IAAA,CAAK,QAAQ,UAAA,GAAa,oBAAA;AAAA,EACtE,CAAA;AAAA,EAEA,mBAAA,GAAsB;AACpB,IAAA,OAAO;AAAA,MACL;AAAA,QACE,KAAA,EAAO,KAAK,OAAA,CAAQ,KAAA;AAAA,QACpB,UAAA,EAAY;AAAA,UACV,OAAA,EAAS;AAAA,YACP,OAAA,EAAS,IAAA;AAAA,YACT,SAAA,EAAW,CAAC,OAAA,KAAyB,OAAA,CAAQ,aAAa,eAAe,CAAA;AAAA,YACzE,UAAA,EAAY,CAAC,UAAA,KAAwC;AACnD,cAAA,MAAM,CAAA,GAAI,WAAW,SAAS,CAAA;AAC9B,cAAA,IAAI,CAAC,GAAG,OAAO,IAAA;AACf,cAAA,OAAO,EAAE,iBAAiB,CAAA,EAAE;AAAA,YAC9B;AAAA,WACF;AAAA,UACA,SAAA,EAAW;AAAA,YACT,OAAA,EAAS,IAAA;AAAA,YACT,SAAA,EAAW,CAAC,OAAA,KAAyB,OAAA,CAAQ,aAAa,iBAAiB,CAAA;AAAA,YAC3E,UAAA,EAAY,CAAC,UAAA,KAAwC;AACnD,cAAA,MAAM,CAAA,GAAI,WAAW,WAAW,CAAA;AAChC,cAAA,IAAI,CAAC,GAAG,OAAO,IAAA;AACf,cAAA,OAAO,EAAE,mBAAmB,CAAA,EAAE;AAAA,YAChC;AAAA;AACF;AACF;AACF,KACF;AAAA,EACF,CAAA;AAAA,EAEA,WAAA,GAAc;AACZ,IAAA,MAAM,KAAA,GAAQ,KAAK,OAAA,CAAQ,KAAA;AAC3B,IAAA,MAAM,QAAA,GAAW,KAAK,OAAA,CAAQ,QAAA;AAC9B,IAAA,MAAM,UAAA,GAAa,KAAK,OAAA,CAAQ,UAAA;AAOhC,IAAA,SAAS,cAAc,KAAA,EAAmC;AACxD,MAAA,MAAM,EAAE,KAAA,EAAM,GAAI,KAAA,CAAM,SAAA;AACxB,MAAA,KAAA,IAAS,KAAA,GAAQ,KAAA,CAAM,KAAA,EAAO,KAAA,IAAS,GAAG,KAAA,EAAA,EAAS;AACjD,QAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA;AAC7B,QAAA,IAAI,KAAA,CAAM,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,EAAG;AAElC,UAAA,OAAO,KAAA,KAAU,CAAA,GAAI,CAAA,GAAI,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,QAC7C;AAAA,MACF;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,SAAS,OAAA,CAAQ,MAA+B,OAAA,EAAmB;AACjE,MAAA,OAAO,CAAC,KAAA,KACN,CAAC,EAAE,KAAA,EAAO,UAAS,KAAM;AAEvB,QAAA,IAAI,UAAU,IAAA,IAAQ,CAAC,QAAQ,QAAA,CAAS,KAAK,GAAG,OAAO,KAAA;AACvD,QAAA,MAAM,GAAA,GAAM,cAAc,KAAK,CAAA;AAC/B,QAAA,IAAI,GAAA,KAAQ,MAAM,OAAO,KAAA;AACzB,QAAA,MAAM,IAAA,GAAO,KAAA,CAAM,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA;AACjC,QAAA,IAAI,CAAC,MAAM,OAAO,KAAA;AAClB,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,MAAM,EAAA,GAAK,KAAA,CAAM,EAAA,CAAG,aAAA,CAAc,KAAK,MAAA,EAAW,EAAE,GAAG,IAAA,CAAK,KAAA,EAAO,CAAC,IAAI,GAAG,OAAO,CAAA;AAClF,UAAA,yBAAA,CAA0B,EAAA,EAAI,OAAO,GAAA,EAAK,GAAA,GAAM,KAAK,QAAA,EAAU,IAAA,KAAS,WAAA,GAAc,MAAA,GAAS,IAAI,CAAA;AACnG,UAAA,QAAA,CAAS,EAAE,CAAA;AAAA,QACb;AACA,QAAA,OAAO,IAAA;AAAA,MACT,CAAA;AAAA,IACJ;AAEA,IAAA,OAAO;AAAA,MACL,eAAA,EAAiB,OAAA,CAAQ,SAAA,EAAW,QAAQ,CAAA;AAAA,MAC5C,iBAAA,EAAmB,OAAA,CAAQ,WAAA,EAAa,UAAU,CAAA;AAAA,MAClD,kBACE,MACA,CAAC,EAAE,KAAA,EAAO,UAAS,KAAM;AACvB,QAAA,MAAM,GAAA,GAAM,cAAc,KAAK,CAAA;AAC/B,QAAA,IAAI,GAAA,KAAQ,MAAM,OAAO,KAAA;AACzB,QAAA,MAAM,IAAA,GAAO,KAAA,CAAM,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA;AACjC,QAAA,IAAI,CAAC,MAAM,OAAO,KAAA;AAClB,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,MAAM,EAAA,GAAK,KAAA,CAAM,EAAA,CAAG,aAAA,CAAc,KAAK,MAAA,EAAW;AAAA,YAChD,GAAG,IAAA,CAAK,KAAA;AAAA,YACR,OAAA,EAAS,IAAA;AAAA,YACT,SAAA,EAAW;AAAA,WACZ,CAAA;AACD,UAAA,yBAAA,CAA0B,IAAI,KAAA,EAAO,GAAA,EAAK,GAAA,GAAM,IAAA,CAAK,UAAU,MAAM,CAAA;AACrE,UAAA,QAAA,CAAS,EAAE,CAAA;AAAA,QACb;AACA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,KACJ;AAAA,EACF;AACF,CAAC;ACxJM,IAAMO,UAAAA,GAAY,UAAU,MAAA,CAA2C;AAAA,EAC5E,IAAA,EAAM,WAAA;AAAA,EAEN,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,SAAS,MAAM,EAAA;AAAA,MACf,SAAS,MAAM,IAAA;AAAA,MACf,SAAS,MAAM,IAAA;AAAA,MACf,UAAU,OAAO,EAAE,IAAA,EAAM,CAAA,EAAG,IAAI,CAAA,EAAE,CAAA;AAAA,MAClC,WAAW,MAAM;AAAA,KACnB;AAAA,EACF,CAAA;AAAA,EAEA,QAAA,GAAW;AACT,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AAGpB,IAAA,IAAA,CAAK,OAAA,CAAQ,UAAU,MAAM;AAC3B,MAAA,MAAM,QAAQ,MAAA,EAAQ,KAAA;AACtB,MAAA,IAAI,CAAC,OAAO,OAAO,EAAA;AAEnB,MAAA,MAAM,EAAE,SAAA,EAAW,GAAA,EAAI,GAAI,KAAA;AAC3B,MAAA,MAAM,EAAE,IAAA,EAAM,EAAA,EAAG,GAAI,SAAA;AACrB,MAAA,OAAO,GAAA,CAAI,WAAA,CAAY,IAAA,EAAM,EAAA,EAAI,GAAG,CAAA;AAAA,IACtC,CAAA;AAEA,IAAA,IAAA,CAAK,OAAA,CAAQ,UAAU,MAAM;AAC3B,MAAA,MAAM9C,UAAQ,MAAA,EAAQ,KAAA;AACtB,MAAA,IAAI,CAACA,SAAO,OAAO,IAAA;AAEnB,MAAA,MAAM,EAAE,WAAU,GAAIA,OAAA;AACtB,MAAA,IAAI,qBAAqB6D,mBAAAA,EAAe;AACtC,QAAA,OAAO,SAAA,CAAU,IAAA;AAAA,MACnB;AAEA,MAAA,OAAO,IAAA;AAAA,IACT,CAAA;AAEA,IAAA,IAAA,CAAK,OAAA,CAAQ,UAAU,MAAM;AAC3B,MAAA,MAAM,QAAQ,MAAA,EAAQ,KAAA;AACtB,MAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,MAAA,OAAO,MAAM,SAAA,CAAU,KAAA;AAAA,IACzB,CAAA;AAEA,IAAA,IAAA,CAAK,OAAA,CAAQ,WAAW,MAAM;AAC5B,MAAA,MAAM,QAAQ,MAAA,EAAQ,KAAA;AACtB,MAAA,IAAI,CAAC,KAAA,EAAO,OAAO,EAAE,IAAA,EAAM,CAAA,EAAG,IAAI,CAAA,EAAE;AACpC,MAAA,OAAO,EAAE,MAAM,KAAA,CAAM,SAAA,CAAU,MAAM,EAAA,EAAI,KAAA,CAAM,UAAU,EAAA,EAAG;AAAA,IAC9D,CAAA;AAEA,IAAA,IAAA,CAAK,OAAA,CAAQ,YAAY,MAAM;AAC7B,MAAA,MAAM,QAAQ,MAAA,EAAQ,KAAA;AACtB,MAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,MAAA,MAAM,EAAE,WAAU,GAAI,KAAA;AACtB,MAAA,IAAI,CAAC,SAAA,CAAU,KAAA,EAAO,OAAO,IAAA;AAC7B,MAAA,OAAO,SAAA,CAAU,IAAA;AAAA,IACnB,CAAA;AAAA,EACF,CAAA;AAAA,EAEA,WAAA,GAAc;AACZ,IAAA,OAAO;AAAA,MACL,YAAA,EACE,CAAC,IAAA,EAAc,EAAA,KACf,CAAC,EAAE,EAAA,EAAI,UAAS,KAAM;AACpB,QAAA,MAAM,aAAa,EAAA,IAAM,IAAA;AAGzB,QAAA,IAAI,OAAO,CAAA,IAAK,UAAA,GAAa,EAAA,CAAG,GAAA,CAAI,QAAQ,IAAA,EAAM;AAChD,UAAA,OAAO,KAAA;AAAA,QACT;AAEA,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,MAAM,YAAY5D,mBAAAA,CAAc,MAAA,CAAO,EAAA,CAAG,GAAA,EAAK,MAAM,UAAU,CAAA;AAC/D,UAAA,EAAA,CAAG,aAAa,SAAS,CAAA;AACzB,UAAA,QAAA,CAAS,EAAE,CAAA;AAAA,QACb;AAEA,QAAA,OAAO,IAAA;AAAA,MACT,CAAA;AAAA,MAEF,YACE,CAAC,GAAA,KACD,CAAC,EAAE,EAAA,EAAI,UAAS,KAAM;AAEpB,QAAA,IAAI,MAAM,CAAA,IAAK,GAAA,IAAO,EAAA,CAAG,GAAA,CAAI,QAAQ,IAAA,EAAM;AACzC,UAAA,OAAO,KAAA;AAAA,QACT;AAEA,QAAA,MAAM,IAAA,GAAO,EAAA,CAAG,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA;AAE9B,QAAA,IAAI,CAAC,MAAM,OAAO,KAAA;AAElB,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,MAAM,SAAA,GAAY4D,mBAAAA,CAAc,MAAA,CAAO,EAAA,CAAG,KAAK,GAAG,CAAA;AAClD,UAAA,EAAA,CAAG,aAAa,SAAS,CAAA;AACzB,UAAA,QAAA,CAAS,EAAE,CAAA;AAAA,QACb;AAEA,QAAA,OAAO,IAAA;AAAA,MACT,CAAA;AAAA,MAEF,kBACE,MACA,CAAC,EAAE,EAAA,EAAI,UAAS,KAAM;AAEpB,QAAA,MAAM,EAAE,KAAA,EAAM,GAAI,EAAA,CAAG,SAAA;AAGrB,QAAA,KAAA,IAAS,KAAA,GAAQ,KAAA,CAAM,KAAA,EAAO,KAAA,GAAQ,GAAG,KAAA,EAAA,EAAS;AAChD,UAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA;AAC7B,UAAA,MAAM,GAAA,GAAM,KAAA,CAAM,MAAA,CAAO,KAAK,CAAA;AAE9B,UAAA,IAAI,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,UAAA,KAAe,KAAA,EAAO;AACvC,YAAA,IAAI,QAAA,EAAU;AACZ,cAAA,MAAM,GAAA,GAAMA,mBAAAA,CAAc,MAAA,CAAO,EAAA,CAAG,KAAK,GAAG,CAAA;AAC5C,cAAA,EAAA,CAAG,aAAa,GAAG,CAAA;AACnB,cAAA,QAAA,CAAS,EAAE,CAAA;AAAA,YACb;AACA,YAAA,OAAO,IAAA;AAAA,UACT;AAAA,QACF;AAEA,QAAA,OAAO,KAAA;AAAA,MACT,CAAA;AAAA,MAEF,iBACE,CAAC,SAAA,KACD,CAAC,EAAE,EAAA,EAAI,UAAS,KAAM;AAEpB,QAAA,IAAI,EAAE,IAAA,EAAM,EAAA,EAAG,GAAI,EAAA,CAAG,SAAA;AAMtB,QAAA,QAAQ,SAAA;AAAW,UACjB,KAAK,MAAA;AACH,YAAA,IAAA,GAAO,IAAA,CAAK,IAAIC,eAAA,CAAY,OAAA,CAAQ,GAAG,GAAG,CAAA,CAAE,IAAA,EAAM,IAAA,GAAO,CAAC,CAAA;AAC1D,YAAA;AAAA,UACF,KAAK,OAAA;AACH,YAAA,EAAA,GAAK,IAAA,CAAK,IAAIA,eAAA,CAAY,KAAA,CAAM,GAAG,GAAG,CAAA,CAAE,EAAA,EAAI,EAAA,GAAK,CAAC,CAAA;AAClD,YAAA;AAAA,UACF,KAAK,OAAA;AACH,YAAA,IAAA,GAAOA,eAAA,CAAY,OAAA,CAAQ,EAAA,CAAG,GAAG,CAAA,CAAE,IAAA;AACnC,YAAA;AAAA,UACF,KAAK,KAAA;AACH,YAAA,EAAA,GAAKA,eAAA,CAAY,KAAA,CAAM,EAAA,CAAG,GAAG,CAAA,CAAE,EAAA;AAC/B,YAAA;AAAA;AAGJ,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,MAAM,eAAe7D,mBAAAA,CAAc,MAAA,CAAO,EAAA,CAAG,GAAA,EAAK,MAAM,EAAE,CAAA;AAC1D,UAAA,EAAA,CAAG,aAAa,YAAY,CAAA;AAC5B,UAAA,QAAA,CAAS,EAAE,CAAA;AAAA,QACb;AAEA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,KACJ;AAAA,EACF;AACF,CAAC;AC5NM,IAAM,+BAA+B,IAAIyC,eAAAA;AAAA,EAC9C;AACF;AAEO,IAAM,sBAAsB,SAAA,CAAU,MAAA;AAAA,EAC3C;AAAA,IACE,IAAA,EAAM,qBAAA;AAAA,IAEN,qBAAA,GAAwB;AACtB,MAAA,OAAO;AAAA,QACL,IAAIxC,YAAAA,CAAO;AAAA,UACT,GAAA,EAAK,4BAAA;AAAA,UACL,KAAA,EAAO;AAAA,YACL,eAAA,EAAiB;AAAA,cACf,IAAA,CAAK,MAAM,KAAA,EAAO;AAKhB,gBAAA,MAAM,UAAU,KAAA,CAAM,aAAA;AACtB,gBAAA,IAAI,mBAAmB,WAAA,EAAa;AAMlC,kBAAA,MAAM,YAAA,GAAe,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,YAAY,CAAA;AAClD,kBAAA,MAAM,gBAAA,GAAmB,OAAA,CAAQ,OAAA,CAAQ,YAAY,CAAA;AACrD,kBAAA,MAAM,oBAAA,GACJ,YAAA,KAAiB,IAAA,IACjB,gBAAA,KAAqB,QACrB,gBAAA,KAAqB,YAAA;AACvB,kBAAA,IACE,CAAC,oBAAA,KACA,OAAA,CAAQ,OAAA,CAAQ,qBAAqB,CAAA,IACrC,OAAA,CAAQ,OAAA,CAAQ,aAAa,CAAA,IAC7B,OAAA,CAAQ,OAAA,CAAQ,iBAAiB,CAAA,CAAA,EAClC;AACA,oBAAA,OAAO,KAAA;AAAA,kBACT;AAAA,gBACF;AAEA,gBAAA,MAAM,EAAE,IAAA,EAAM,EAAA,EAAG,GAAI,KAAK,KAAA,CAAM,SAAA;AAChC,gBAAA,IAAI,SAAS,EAAA,EAAI;AACf,kBAAA,IAAA,CAAK,QAAA;AAAA,oBACH,IAAA,CAAK,MAAM,EAAA,CAAG,YAAA;AAAA,sBACZD,mBAAAA,CAAc,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,KAAK,IAAI;AAAA;AAC3C,mBACF;AAAA,gBACF;AACA,gBAAA,OAAO,KAAA;AAAA,cACT;AAAA;AACF;AACF,SACD;AAAA,OACH;AAAA,IACF;AAAA;AAEJ;AC1BO,IAAM,uBAAA,GAA0B,IAAIyC,eAAAA,CAAU,gBAAgB;AAGrE,IAAM,KAAA,GAAQ;AAAA,EACZ,SAAA,EAAW,MAAA;AAAA,EACX,SAAA,EAAW,QAGb,CAAA;AAOA,SAAS,gBAAA,CACP,KACA,OAAA,EACe;AACf,EAAA,MAAM,cAA4B,EAAC;AAEnC,EAAA,GAAA,CAAI,WAAA,CAAY,CAAC,IAAA,EAAM,GAAA,KAAQ;AAC7B,IAAA,IAAI,OAAA,CAAQ,SAAA,IAAa,IAAA,CAAK,IAAA,CAAK,SAAS,WAAA,EAAa;AACvD,MAAA,MAAM,MAAA,GAAS,GAAA,GAAM,IAAA,CAAK,QAAA,GAAW,CAAA;AACrC,MAAA,WAAA,CAAY,IAAA;AAAA,QACViB,eAAAA,CAAW,MAAA;AAAA,UACT,MAAA;AAAA,UACA,MAAM;AACJ,YAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC1C,YAAA,IAAA,CAAK,YAAY,CAAA,EAAG,OAAA,CAAQ,SAAS,CAAA,CAAA,EAAI,QAAQ,SAAS,CAAA,WAAA,CAAA;AAC1D,YAAA,IAAA,CAAK,cAAc,KAAA,CAAM,SAAA;AACzB,YAAA,OAAO,IAAA;AAAA,UACT,CAAA;AAAA,UACA,EAAE,MAAM,EAAA;AAAG;AACb,OACF;AAAA,IACF;AAEA,IAAA,IAAI,OAAA,CAAQ,SAAA,IAAa,IAAA,CAAK,IAAA,CAAK,SAAS,WAAA,EAAa;AACvD,MAAA,WAAA,CAAY,IAAA;AAAA,QACVA,eAAAA,CAAW,MAAA;AAAA,UACT,GAAA;AAAA,UACA,MAAM;AACJ,YAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC1C,YAAA,IAAA,CAAK,YAAY,CAAA,EAAG,OAAA,CAAQ,SAAS,CAAA,CAAA,EAAI,QAAQ,SAAS,CAAA,WAAA,CAAA;AAC1D,YAAA,IAAA,CAAK,cAAc,KAAA,CAAM,SAAA;AACzB,YAAA,OAAO,IAAA;AAAA,UACT,CAAA;AAAA,UACA,EAAE,MAAM,EAAA;AAAG;AACb,OACF;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,IAAA,EAAM;AAC5B,MAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,QAAA,MAAM,IAAA,GAAO,KAAK,CAAC,CAAA;AACnB,QAAA,MAAM,UAAU,GAAA,GAAM,CAAA;AAEtB,QAAA,IAAI,OAAA,CAAQ,KAAA,IAAS,IAAA,KAAS,GAAA,EAAK;AACjC,UAAA,WAAA,CAAY,IAAA;AAAA,YACVA,eAAAA,CAAW,MAAA,CAAO,OAAA,EAAS,OAAA,GAAU,CAAA,EAAG;AAAA,cACtC,OAAO,CAAA,EAAG,OAAA,CAAQ,SAAS,CAAA,CAAA,EAAI,QAAQ,SAAS,CAAA,OAAA,CAAA;AAAA,cAChD,WAAA,EAAa;AAAA,aACd;AAAA,WACH;AAAA,QACF;AAEA,QAAA,IAAI,OAAA,CAAQ,IAAA,IAAQ,IAAA,KAAS,MAAA,EAAU;AACrC,UAAA,WAAA,CAAY,IAAA;AAAA,YACVA,eAAAA,CAAW,MAAA,CAAO,OAAA,EAAS,OAAA,GAAU,CAAA,EAAG;AAAA,cACtC,OAAO,CAAA,EAAG,OAAA,CAAQ,SAAS,CAAA,CAAA,EAAI,QAAQ,SAAS,CAAA,MAAA,CAAA;AAAA,cAChD,WAAA,EAAa;AAAA,aACd;AAAA,WACH;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAOF,kBAAAA,CAAc,MAAA,CAAO,GAAA,EAAK,WAAW,CAAA;AAC9C;AAoDO,IAAM,cAAA,GAAiB,UAAU,MAAA,CAGtC;AAAA,EACA,IAAA,EAAM,gBAAA;AAAA,EAEN,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,SAAA,EAAW,IAAA;AAAA,MACX,SAAA,EAAW,IAAA;AAAA,MACX,KAAA,EAAO,IAAA;AAAA,MACP,IAAA,EAAM,IAAA;AAAA,MACN,SAAA,EAAW;AAAA,KACb;AAAA,EACF,CAAA;AAAA,EAEA,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,QAAQ,MAAY;AAAA,MAEpB,CAAA;AAAA,MACA,WAAW,MAAM;AAAA,KACnB;AAAA,EACF,CAAA;AAAA,EAEA,QAAA,GAAW;AACT,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,MAAM,UAAU,IAAA,CAAK,OAAA;AAErB,IAAA,IAAA,CAAK,OAAA,CAAQ,SAAS,MAAY;AAChC,MAAA,MAAM,QAAQ,MAAA,EAAQ,KAAA;AACtB,MAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,MAAA,MAAM,WAAA,GAAc,uBAAA,CAAwB,QAAA,CAAS,KAAK,CAAA;AAG1D,MAAA,MAAM,cAAA,GAAiB,WAAA,EAAa,OAAA,IAAW,OAAA,CAAQ,OAAA;AAEvD,MAAA,MAAM,EAAA,GAAK,KAAA,CAAM,EAAA,CAAG,OAAA,CAAQ,uBAAA,EAAyB;AAAA,QACnD,SAAS,CAAC;AAAA,OACX,CAAA;AACD,MAAA,MAAA,CAAO,IAAA,CAAK,SAAS,EAAE,CAAA;AAAA,IACzB,CAAA;AAEA,IAAA,IAAA,CAAK,OAAA,CAAQ,YAAY,MAAe;AACtC,MAAA,MAAM,QAAQ,MAAA,EAAQ,KAAA;AACtB,MAAA,IAAI,CAAC,KAAA,EAAO,OAAO,OAAA,CAAQ,OAAA;AAC3B,MAAA,MAAM,WAAA,GAAc,uBAAA,CAAwB,QAAA,CAAS,KAAK,CAAA;AAG1D,MAAA,OAAO,WAAA,EAAa,WAAW,OAAA,CAAQ,OAAA;AAAA,IACzC,CAAA;AAAA,EACF,CAAA;AAAA,EAEA,WAAA,GAAc;AACZ,IAAA,OAAO;AAAA,MACL,oBAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM;AAChB,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,IAAA,CAAK,QAAQ,MAAA,EAAO;AAAA,QACtB;AACA,QAAA,OAAO,IAAA;AAAA,MACT,CAAA;AAAA,MAEF,kBAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM;AAChB,QAAA,IAAI,QAAA,IAAY,CAAC,IAAA,CAAK,OAAA,CAAQ,WAAU,EAAG;AACzC,UAAA,IAAA,CAAK,QAAQ,MAAA,EAAO;AAAA,QACtB;AACA,QAAA,OAAO,IAAA;AAAA,MACT,CAAA;AAAA,MAEF,kBAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM;AAChB,QAAA,IAAI,QAAA,IAAY,IAAA,CAAK,OAAA,CAAQ,SAAA,EAAU,EAAG;AACxC,UAAA,IAAA,CAAK,QAAQ,MAAA,EAAO;AAAA,QACtB;AACA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,KACJ;AAAA,EACF,CAAA;AAAA,EAEA,oBAAA,GAAuB;AACrB,IAAA,OAAO;AAAA,MACL,eAAe,MAAM;AACnB,QAAA,OAAO,IAAA,CAAK,MAAA,EAAQ,QAAA,CAAS,oBAAA,EAAqB,IAAK,KAAA;AAAA,MACzD;AAAA,KACF;AAAA,EACF,CAAA;AAAA,EAEA,eAAA,GAAiC;AAC/B,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,gBAAA;AAAA,QACN,OAAA,EAAS,sBAAA;AAAA,QACT,IAAA,EAAM,WAAA;AAAA,QACN,KAAA,EAAO,sBAAA;AAAA,QACP,QAAA,EAAU,aAAA;AAAA,QACV,KAAA,EAAO,SAAA;AAAA,QACP,QAAA,EAAU,GAAA;AAAA,QACV,UAAA,EAAY,CAAC,MAAA,KAAW;AACtB,UAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,gBAAgB,CAAA;AAG/C,UAAA,OAAO,OAAA,EAAS,aAAY,IAAK,KAAA;AAAA,QACnC;AAAA;AACF,KACF;AAAA,EACF,CAAA;AAAA,EAEA,qBAAA,GAAwB;AACtB,IAAA,MAAM,UAAU,IAAA,CAAK,OAAA;AAErB,IAAA,OAAO;AAAA,MACL,IAAIvD,YAAAA,CAAO;AAAA,QACT,GAAA,EAAK,uBAAA;AAAA,QAEL,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,CAAC,CAAA,EAAG,KAAA,MAAsC;AAAA,YAC9C,SAAS,OAAA,CAAQ,OAAA;AAAA,YACjB,WAAA,EAAa,QAAQ,OAAA,GACjB,gBAAA,CAAiB,MAAM,GAAA,EAAK,OAAO,IACnCuD,kBAAAA,CAAc;AAAA,WACpB,CAAA;AAAA,UACA,KAAA,EAAO,CAAC,EAAA,EAAI,IAAA,EAAiC,WAAW,QAAA,KAAwC;AAC9F,YAAA,MAAM,IAAA,GAAO,EAAA,CAAG,OAAA,CAAQ,uBAAuB,CAAA;AAG/C,YAAA,MAAM,OAAA,GAAU,IAAA,EAAM,OAAA,IAAW,IAAA,CAAK,OAAA;AAEtC,YAAA,IAAI,CAAC,OAAA,EAAS;AACZ,cAAA,IAAI,CAAC,IAAA,CAAK,OAAA,EAAS,OAAO,IAAA;AAC1B,cAAA,OAAO,EAAE,OAAA,EAAS,WAAA,EAAaA,kBAAAA,CAAc,KAAA,EAAM;AAAA,YACrD;AAGA,YAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,cAAA,OAAO,EAAE,OAAA,EAAS,WAAA,EAAa,iBAAiB,QAAA,CAAS,GAAA,EAAK,OAAO,CAAA,EAAE;AAAA,YACzE;AAGA,YAAA,IAAI,GAAG,UAAA,EAAY;AACjB,cAAA,OAAO,EAAE,OAAA,EAAS,WAAA,EAAa,iBAAiB,QAAA,CAAS,GAAA,EAAK,OAAO,CAAA,EAAE;AAAA,YACzE;AAGA,YAAA,OAAO,IAAA;AAAA,UACT;AAAA,SACF;AAAA,QAEA,KAAA,EAAO;AAAA,UACL,WAAA,EAAa,CAAC,KAAA,KAAU;AACtB,YAAA,MAAM,WAAA,GAAc,uBAAA,CAAwB,QAAA,CAAS,KAAK,CAAA;AAG1D,YAAA,OAAO,WAAA,EAAa,eAAeA,kBAAAA,CAAc,KAAA;AAAA,UACnD;AAAA;AACF,OACD;AAAA,KACH;AAAA,EACF;AACF,CAAC;;;AC5SM,IAAM,mBAAA,GAAgC;AAAA;AAAA,EAE3C,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA;AAAA,EAE5C,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA;AAAA,EAE5C,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA;AAAA,EAE5C,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA;AAAA,EAE5C,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW;AAC9C;AAiBO,IAAM,SAAA,GAAY,UAAU,MAAA,CAAyB;AAAA,EAC1D,IAAA,EAAM,WAAA;AAAA,EAEN,YAAA,EAAc,CAAC,WAAW,CAAA;AAAA,EAE1B,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,mBAAA;AAAA,MACR,OAAA,EAAS;AAAA,KACX;AAAA,EACF,CAAA;AAAA,EAEA,mBAAA,GAAsB;AACpB,IAAA,OAAO;AAAA,MACL;AAAA,QACE,KAAA,EAAO,CAAC,WAAW,CAAA;AAAA,QACnB,UAAA,EAAY;AAAA,UACV,KAAA,EAAO;AAAA,YACL,OAAA,EAAS,IAAA;AAAA,YACT,SAAA,EAAW,CAAC,OAAA,KAAyB;AACnC,cAAA,MAAM,MAAM,OAAA,CAAQ,KAAA,CAAM,KAAA,CAAM,OAAA,CAAQ,UAAU,EAAE,CAAA;AACpD,cAAA,OAAO,GAAA,GAAM,cAAA,CAAe,GAAG,CAAA,GAAI,IAAA;AAAA,YACrC,CAAA;AAAA,YACA,UAAA,EAAY,CAAC,UAAA,KAAwC;AACnD,cAAA,MAAM,KAAA,GAAQ,WAAW,OAAO,CAAA;AAIhC,cAAA,MAAM,KAAA,GAAQ,WAAW,YAAY,CAAA;AACrC,cAAA,IAAI,CAAC,KAAA,IAAS,KAAA,EAAO,OAAO,IAAA;AAC5B,cAAA,OAAO,EAAE,KAAA,EAAO,CAAA,OAAA,EAAU,KAAK,CAAA,CAAA,EAAG;AAAA,YACpC;AAAA,WACF;AAAA,UACA,UAAA,EAAY;AAAA,YACV,OAAA,EAAS,IAAA;AAAA,YACT,SAAA,EAAW,CAAC,OAAA,KAAyB,OAAA,CAAQ,aAAa,iBAAiB,CAAA;AAAA,YAC3E,UAAA,EAAY,CAAC,UAAA,KAAwC;AACnD,cAAA,MAAM,KAAA,GAAQ,WAAW,YAAY,CAAA;AACrC,cAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,cAAA,OAAO,EAAE,mBAAmB,KAAA,EAAM;AAAA,YACpC;AAAA;AACF;AACF;AACF,KACF;AAAA,EACF,CAAA;AAAA,EAEA,WAAA,GAAc;AACZ,IAAA,OAAO;AAAA;AAAA;AAAA;AAAA,MAIL,cACE,CAAC,KAAA,KACD,CAAC,EAAE,UAAS,KAAM;AAChB,QAAA,OAAO,SAAS,OAAA,CAAQ,WAAA,EAAa,EAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA;AAAA,MAClE,CAAA;AAAA,MAEF,cAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM;AAChB,QAAA,IAAI,CAAC,SAAS,OAAA,CAAQ,WAAA,EAAa,EAAE,KAAA,EAAO,IAAA,EAAM,CAAA,EAAG,OAAO,KAAA;AAC5D,QAAA,QAAA,CAAS,oBAAA,EAAqB;AAC9B,QAAA,OAAO,IAAA;AAAA,MACT,CAAA;AAAA;AAAA;AAAA,MAIF,mBACE,CAAC,KAAA,KACD,CAAC,EAAE,UAAS,KAAM;AAChB,QAAA,IAAI,CAAC,QAAA,CAAS,OAAA,CAAQ,WAAA,EAAa,EAAE,UAAA,EAAY,KAAA,EAAO,KAAA,EAAO,IAAA,EAAM,CAAA,EAAG,OAAO,KAAA;AAC/E,QAAA,IAAI,KAAA,KAAU,IAAA,EAAM,QAAA,CAAS,oBAAA,EAAqB;AAClD,QAAA,OAAO,IAAA;AAAA,MACT,CAAA;AAAA,MAEF,mBAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM;AAChB,QAAA,IAAI,CAAC,SAAS,OAAA,CAAQ,WAAA,EAAa,EAAE,UAAA,EAAY,IAAA,EAAM,CAAA,EAAG,OAAO,KAAA;AACjE,QAAA,QAAA,CAAS,oBAAA,EAAqB;AAC9B,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,KACJ;AAAA,EACF,CAAA;AAAA,EAEA,aAAA,GAAgB;AACd,IAAA,OAAO,CAAC,SAAS,CAAA;AAAA,EACnB,CAAA;AAAA,EAEA,eAAA,GAAiC;AAC/B,IAAA,IAAI,KAAK,OAAA,CAAQ,MAAA,CAAO,MAAA,KAAW,CAAA,SAAU,EAAC;AAE9C,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,UAAA;AAAA,QACN,IAAA,EAAM,WAAA;AAAA,QACN,IAAA,EAAM,gBAAA;AAAA,QACN,KAAA,EAAO,YAAA;AAAA,QACP,KAAA,EAAO,WAAA;AAAA,QACP,QAAA,EAAU,GAAA;AAAA,QACV,MAAA,EAAQ,MAAA;AAAA,QACR,WAAA,EAAa,KAAK,OAAA,CAAQ,OAAA;AAAA,QAC1B,qBAAA,EAAuB,SAAA;AAAA,QACvB,KAAA,EAAO;AAAA,UACL;AAAA,YACE,IAAA,EAAM,QAAA;AAAA,YACN,IAAA,EAAM,gBAAA;AAAA,YACN,OAAA,EAAS,gBAAA;AAAA,YACT,IAAA,EAAM,UAAA;AAAA,YACN,KAAA,EAAO;AAAA,WACT;AAAA,UACA,GAAG,IAAA,CAAK,OAAA,CAAQ,OAAO,GAAA,CAAI,CAAC,OAAO,CAAA,MAAO;AAAA,YACxC,IAAA,EAAM,QAAA;AAAA,YACN,IAAA,EAAM,aAAa,KAAK,CAAA,CAAA;AAAA,YACxB,OAAA,EAAS,cAAA;AAAA,YACT,WAAA,EAAa,CAAC,KAAK,CAAA;AAAA,YACnB,UAAU,EAAE,IAAA,EAAM,aAAa,UAAA,EAAY,EAAE,OAAM,EAAE;AAAA,YACrD,IAAA,EAAM,EAAA;AAAA,YACN,KAAA,EAAO,KAAA;AAAA,YACP,KAAA;AAAA,YACA,UAAU,GAAA,GAAM;AAAA,WAClB,CAAE;AAAA;AACJ;AACF,KACF;AAAA,EACF;AACF,CAAC;AC7JM,IAAM,wBAAA,GAAqC;AAAA;AAAA,EAEhD,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA;AAAA,EAE5C,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA;AAAA,EAE5C,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA;AAAA,EAE5C,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA;AAAA,EAE5C,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW;AAC9C;AAsBO,IAAM,SAAA,GAAY,UAAU,MAAA,CAAyB;AAAA,EAC1D,IAAA,EAAM,WAAA;AAAA,EAEN,YAAA,EAAc,CAAC,WAAW,CAAA;AAAA,EAE1B,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,wBAAA;AAAA,MACR,OAAA,EAAS,CAAA;AAAA,MACT,YAAA,EAAc;AAAA,KAChB;AAAA,EACF,CAAA;AAAA,EAEA,mBAAA,GAAsB;AACpB,IAAA,MAAM,EAAE,SAAQ,GAAI,IAAA;AACpB,IAAA,OAAO;AAAA,MACL;AAAA,QACE,KAAA,EAAO,CAAC,WAAW,CAAA;AAAA,QACnB,UAAA,EAAY;AAAA,UACV,eAAA,EAAiB;AAAA,YACf,OAAA,EAAS,IAAA;AAAA,YACT,SAAA,EAAW,CAAC,OAAA,KAAyB;AACnC,cAAA,MAAM,MAAM,OAAA,CAAQ,KAAA,CAAM,eAAA,CAAgB,OAAA,CAAQ,UAAU,EAAE,CAAA;AAC9D,cAAA,IAAI,GAAA,EAAK,OAAO,cAAA,CAAe,GAAG,CAAA;AAElC,cAAA,IAAI,OAAA,CAAQ,OAAA,KAAY,MAAA,EAAQ,OAAO,OAAA,CAAQ,YAAA;AAC/C,cAAA,OAAO,IAAA;AAAA,YACT,CAAA;AAAA,YACA,UAAA,EAAY,CAAC,UAAA,KAAwC;AACnD,cAAA,MAAM,EAAA,GAAK,WAAW,iBAAiB,CAAA;AAGvC,cAAA,MAAM,KAAA,GAAQ,WAAW,sBAAsB,CAAA;AAC/C,cAAA,IAAI,CAAC,EAAA,IAAM,KAAA,EAAO,OAAO,IAAA;AACzB,cAAA,OAAO,EAAE,KAAA,EAAO,CAAA,kBAAA,EAAqB,EAAE,CAAA,CAAA,EAAG;AAAA,YAC5C;AAAA,WACF;AAAA,UACA,oBAAA,EAAsB;AAAA,YACpB,OAAA,EAAS,IAAA;AAAA,YACT,SAAA,EAAW,CAAC,OAAA,KAAyB,OAAA,CAAQ,aAAa,eAAe,CAAA;AAAA,YACzE,UAAA,EAAY,CAAC,UAAA,KAAwC;AACnD,cAAA,MAAM,KAAA,GAAQ,WAAW,sBAAsB,CAAA;AAC/C,cAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,cAAA,OAAO,EAAE,iBAAiB,KAAA,EAAM;AAAA,YAClC;AAAA;AACF;AACF;AACF,KACF;AAAA,EACF,CAAA;AAAA,EAEA,WAAA,GAAc;AACZ,IAAA,MAAM,YAAA,GAAe,KAAK,OAAA,CAAQ,YAAA;AAClC,IAAA,OAAO;AAAA;AAAA;AAAA;AAAA,MAIL,cACE,CAAC,UAAA,KACD,CAAC,EAAE,UAAS,KAAM;AAChB,QAAA,MAAM,KAAA,GAAQ,YAAY,KAAA,IAAS,YAAA;AACnC,QAAA,OAAO,QAAA,CAAS,QAAQ,WAAA,EAAa,EAAE,iBAAiB,KAAA,EAAO,oBAAA,EAAsB,MAAM,CAAA;AAAA,MAC7F,CAAA;AAAA,MAEF,cAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM;AAChB,QAAA,IAAI,CAAC,SAAS,OAAA,CAAQ,WAAA,EAAa,EAAE,eAAA,EAAiB,IAAA,EAAM,CAAA,EAAG,OAAO,KAAA;AACtE,QAAA,QAAA,CAAS,oBAAA,EAAqB;AAC9B,QAAA,OAAO,IAAA;AAAA,MACT,CAAA;AAAA,MAEF,iBACE,CAAC,UAAA,KACD,CAAC,EAAE,QAAA,EAAU,OAAM,KAAM;AACvB,QAAA,MAAM,KAAA,GAAQ,YAAY,KAAA,IAAS,YAAA;AACnC,QAAA,MAAM,QAAA,GAAW,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,WAAW,CAAA;AAC/C,QAAA,IAAI,CAAC,UAAU,OAAO,KAAA;AAEtB,QAAA,MAAM,EAAE,IAAA,EAAM,EAAA,EAAI,KAAA,KAAU,KAAA,CAAM,SAAA;AAClC,QAAA,IAAI,YAAA,GAAe,KAAA;AAEnB,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,MAAM,KAAA,GAAQ,MAAM,WAAA,IAAe,KAAA,CAAM,IAAI,OAAA,CAAQ,IAAI,EAAE,KAAA,EAAM;AACjE,UAAA,MAAM,IAAA,GAAO,QAAA,CAAS,OAAA,CAAQ,KAAK,CAAA;AACnC,UAAA,YAAA,GACE,CAAC,CAAC,IAAA,EAAM,KAAA,CAAM,iBAAiB,KAAK,CAAC,CAAC,IAAA,EAAM,KAAA,CAAM,sBAAsB,CAAA;AAAA,QAC5E,CAAA,MAAO;AACL,UAAA,KAAA,CAAM,GAAA,CAAI,YAAA,CAAa,IAAA,EAAM,EAAA,EAAI,CAAC,IAAA,KAAS;AACzC,YAAA,IAAI,cAAc,OAAO,KAAA;AACzB,YAAA,MAAM,IAAA,GAAO,QAAA,CAAS,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA;AACxC,YAAA,IAAI,MAAM,KAAA,CAAM,iBAAiB,KAAK,IAAA,EAAM,KAAA,CAAM,sBAAsB,CAAA,EAAG;AACzE,cAAA,YAAA,GAAe,IAAA;AACf,cAAA,OAAO,KAAA;AAAA,YACT;AACA,YAAA,OAAO,IAAA;AAAA,UACT,CAAC,CAAA;AAAA,QACH;AAEA,QAAA,IAAI,YAAA,EAAc;AAChB,UAAA,QAAA,CAAS,QAAQ,WAAA,EAAa,EAAE,iBAAiB,IAAA,EAAM,oBAAA,EAAsB,MAAM,CAAA;AACnF,UAAA,QAAA,CAAS,oBAAA,EAAqB;AAC9B,UAAA,OAAO,IAAA;AAAA,QACT;AAEA,QAAA,OAAO,QAAA,CAAS,QAAQ,WAAA,EAAa,EAAE,iBAAiB,KAAA,EAAO,oBAAA,EAAsB,MAAM,CAAA;AAAA,MAC7F,CAAA;AAAA;AAAA;AAAA;AAAA,MAKF,yBACE,CAAC,KAAA,KACD,CAAC,EAAE,UAAS,KAAM;AAChB,QAAA,IAAI,CAAC,QAAA,CAAS,OAAA,CAAQ,WAAA,EAAa,EAAE,sBAAsB,KAAA,EAAO,eAAA,EAAiB,IAAA,EAAM,CAAA,EAAG;AAC1F,UAAA,OAAO,KAAA;AAAA,QACT;AACA,QAAA,IAAI,KAAA,KAAU,IAAA,EAAM,QAAA,CAAS,oBAAA,EAAqB;AAClD,QAAA,OAAO,IAAA;AAAA,MACT,CAAA;AAAA,MAEF,yBAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM;AAChB,QAAA,IAAI,CAAC,SAAS,OAAA,CAAQ,WAAA,EAAa,EAAE,oBAAA,EAAsB,IAAA,EAAM,CAAA,EAAG,OAAO,KAAA;AAC3E,QAAA,QAAA,CAAS,oBAAA,EAAqB;AAC9B,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,KACJ;AAAA,EACF,CAAA;AAAA,EAEA,oBAAA,GAAuB;AACrB,IAAA,OAAO;AAAA,MACL,eAAe,MACb,IAAA,CAAK,MAAA,EAAQ,QAAA,CAAS,iBAAgB,IAAK;AAAA,KAC/C;AAAA,EACF,CAAA;AAAA,EAEA,aAAA,GAAgB;AACd,IAAA,MAAM,YAAA,GAAe,KAAK,OAAA,CAAQ,YAAA;AAClC,IAAA,OAAO;AAAA,MACL,IAAI/C,oBAAAA;AAAA,QACF,sBAAA;AAAA,QACA,CAAC,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,GAAA,KAAQ;AAC5B,UAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,WAAW,CAAA;AACpD,UAAA,IAAI,CAAC,eAAe,OAAO,IAAA;AAE3B,UAAA,MAAM,OAAA,GAAU,MAAM,CAAC,CAAA;AACvB,UAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AAErB,UAAA,MAAM,EAAE,IAAG,GAAI,KAAA;AACf,UAAA,EAAA,CAAG,YAAY,KAAA,EAAO,GAAA,EAAK,MAAM,MAAA,CAAO,IAAA,CAAK,OAAO,CAAC,CAAA;AACrD,UAAA,EAAA,CAAG,OAAA;AAAA,YACD,KAAA;AAAA,YACA,QAAQ,OAAA,CAAQ,MAAA;AAAA,YAChB,aAAA,CAAc,MAAA,CAAO,EAAE,eAAA,EAAiB,cAAc;AAAA,WACxD;AACA,UAAA,EAAA,CAAG,iBAAiB,aAAa,CAAA;AACjC,UAAA,OAAO,EAAA;AAAA,QACT;AAAA;AACF,KACF;AAAA,EACF,CAAA;AAAA,EAEA,eAAA,GAAiC;AAC/B,IAAA,MAAM,YAAA,GAAe,KAAK,OAAA,CAAQ,YAAA;AAElC,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG;AACpC,MAAA,OAAO;AAAA,QACL;AAAA,UACE,IAAA,EAAM,QAAA;AAAA,UACN,IAAA,EAAM,WAAA;AAAA,UACN,OAAA,EAAS,iBAAA;AAAA,UACT,QAAA,EAAU,EAAE,IAAA,EAAM,WAAA,EAAa,YAAY,EAAE,eAAA,EAAiB,cAAa,EAAE;AAAA,UAC7E,IAAA,EAAM,mBAAA;AAAA,UACN,KAAA,EAAO,WAAA;AAAA,UACP,QAAA,EAAU,aAAA;AAAA,UACV,KAAA,EAAO,QAAA;AAAA,UACP,QAAA,EAAU;AAAA;AACZ,OACF;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,UAAA;AAAA,QACN,IAAA,EAAM,WAAA;AAAA,QACN,IAAA,EAAM,mBAAA;AAAA,QACN,KAAA,EAAO,WAAA;AAAA,QACP,KAAA,EAAO,QAAA;AAAA,QACP,QAAA,EAAU,GAAA;AAAA,QACV,MAAA,EAAQ,MAAA;AAAA,QACR,WAAA,EAAa,KAAK,OAAA,CAAQ,OAAA;AAAA,QAC1B,KAAA,EAAO;AAAA,UACL;AAAA,YACE,IAAA,EAAM,QAAA;AAAA,YACN,IAAA,EAAM,gBAAA;AAAA,YACN,OAAA,EAAS,gBAAA;AAAA,YACT,IAAA,EAAM,UAAA;AAAA,YACN,KAAA,EAAO;AAAA,WACT;AAAA,UACA,GAAG,IAAA,CAAK,OAAA,CAAQ,OAAO,GAAA,CAAI,CAAC,OAAO,CAAA,MAAO;AAAA,YACxC,IAAA,EAAM,QAAA;AAAA,YACN,IAAA,EAAM,aAAa,KAAK,CAAA,CAAA;AAAA,YACxB,OAAA,EAAS,cAAA;AAAA,YACT,WAAA,EAAa,CAAC,EAAE,KAAA,EAAO,CAAA;AAAA,YACvB,QAAA,EAAU,EAAE,IAAA,EAAM,WAAA,EAAa,YAAY,EAAE,eAAA,EAAiB,OAAM,EAAE;AAAA,YACtE,IAAA,EAAM,EAAA;AAAA,YACN,KAAA,EAAO,KAAA;AAAA,YACP,KAAA;AAAA,YACA,UAAU,GAAA,GAAM;AAAA,WAClB,CAAE;AAAA;AACJ;AACF,KACF;AAAA,EACF;AACF,CAAC;;;ACzPM,IAAM,UAAA,GAAa,UAAU,MAAA,CAA0B;AAAA,EAC5D,IAAA,EAAM,YAAA;AAAA,EAEN,YAAA,EAAc,CAAC,WAAW,CAAA;AAAA,EAE1B,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,YAAA,EAAc,CAAC,OAAA,EAAS,SAAA,EAAW,UAAU,cAAA,EAAgB,iBAAA,EAAmB,SAAA,EAAW,mBAAA,EAAqB,aAAa;AAAA,KAC/H;AAAA,EACF,CAAA;AAAA,EAEA,mBAAA,GAAsB;AACpB,IAAA,OAAO;AAAA,MACL;AAAA,QACE,KAAA,EAAO,CAAC,WAAW,CAAA;AAAA,QACnB,UAAA,EAAY;AAAA,UACV,UAAA,EAAY;AAAA,YACV,OAAA,EAAS,IAAA;AAAA,YACT,SAAA,EAAW,CAAC,OAAA,KAAyB;AACnC,cAAA,OAAO,QAAQ,KAAA,CAAM,UAAA,CAAW,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA,IAAK,IAAA;AAAA,YAC3D,CAAA;AAAA,YACA,UAAA,EAAY,CAAC,UAAA,KAAwC;AACnD,cAAA,MAAM,UAAA,GAAa,WAAW,YAAY,CAAA;AAC1C,cAAA,IAAI,CAAC,YAAY,OAAO,IAAA;AAExB,cAAA,MAAM,QAAQ,UAAA,CAAW,QAAA,CAAS,GAAG,CAAA,GAAI,CAAA,CAAA,EAAI,UAAU,CAAA,CAAA,CAAA,GAAM,UAAA;AAC7D,cAAA,OAAO,EAAE,KAAA,EAAO,CAAA,aAAA,EAAgB,KAAK,CAAA,CAAA,EAAG;AAAA,YAC1C;AAAA;AACF;AACF;AACF,KACF;AAAA,EACF,CAAA;AAAA,EAEA,WAAA,GAAc;AACZ,IAAA,OAAO;AAAA,MACL,eACE,CAAC,UAAA,KACD,CAAC,EAAE,UAAS,KAAM;AAChB,QAAA,OAAO,QAAA,CAAS,OAAA,CAAQ,WAAA,EAAa,EAAE,YAAY,CAAA;AAAA,MACrD,CAAA;AAAA,MAEF,eAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM;AAChB,QAAA,IAAI,CAAC,SAAS,OAAA,CAAQ,WAAA,EAAa,EAAE,UAAA,EAAY,IAAA,EAAM,CAAA,EAAG,OAAO,KAAA;AACjE,QAAA,QAAA,CAAS,oBAAA,EAAqB;AAC9B,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,KACJ;AAAA,EACF,CAAA;AAAA,EAEA,aAAA,GAAgB;AACd,IAAA,OAAO,CAAC,SAAS,CAAA;AAAA,EACnB,CAAA;AAAA,EAEA,eAAA,GAAiC;AAC/B,IAAA,IAAI,KAAK,OAAA,CAAQ,YAAA,CAAa,MAAA,KAAW,CAAA,SAAU,EAAC;AAEpD,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,UAAA;AAAA,QACN,IAAA,EAAM,YAAA;AAAA,QACN,IAAA,EAAM,QAAA;AAAA,QACN,KAAA,EAAO,aAAA;AAAA,QACP,KAAA,EAAO,WAAA;AAAA,QACP,QAAA,EAAU,GAAA;AAAA,QACV,WAAA,EAAa,MAAA;AAAA,QACb,YAAA,EAAc,IAAA;AAAA,QACd,qBAAA,EAAuB,aAAA;AAAA,QACvB,OAAO,IAAA,CAAK,OAAA,CAAQ,aAAa,GAAA,CAAI,CAAC,MAAM,CAAA,MAAO;AAAA,UACjD,IAAA,EAAM,QAAA;AAAA,UACN,IAAA,EAAM,cAAc,IAAI,CAAA,CAAA;AAAA,UACxB,OAAA,EAAS,eAAA;AAAA,UACT,WAAA,EAAa,CAAC,IAAI,CAAA;AAAA,UAClB,QAAA,EAAU,EAAE,IAAA,EAAM,WAAA,EAAa,YAAY,EAAE,UAAA,EAAY,MAAK,EAAE;AAAA,UAChE,IAAA,EAAM,QAAA;AAAA,UACN,KAAA,EAAO,IAAA;AAAA,UACP,KAAA,EAAO,gBAAgB,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,GAAI,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,CAAA,GAAM,IAAI,CAAA,CAAA;AAAA,UAC9D,UAAU,GAAA,GAAM;AAAA,SAClB,CAAE;AAAA;AACJ,KACF;AAAA,EACF;AACF,CAAC;;;AC9EM,IAAM,QAAA,GAAW,UAAU,MAAA,CAAwB;AAAA,EACxD,IAAA,EAAM,UAAA;AAAA,EAEN,YAAA,EAAc,CAAC,WAAW,CAAA;AAAA,EAE1B,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,WAAW,CAAC,MAAA,EAAQ,QAAQ,MAAA,EAAQ,MAAA,EAAQ,QAAQ,MAAM,CAAA;AAAA,MAC1D,SAAA,EAAW;AAAA,KACb;AAAA,EACF,CAAA;AAAA,EAEA,mBAAA,GAAsB;AACpB,IAAA,OAAO;AAAA,MACL;AAAA,QACE,KAAA,EAAO,CAAC,WAAW,CAAA;AAAA,QACnB,UAAA,EAAY;AAAA,UACV,QAAA,EAAU;AAAA,YACR,OAAA,EAAS,IAAA;AAAA,YACT,SAAA,EAAW,CAAC,OAAA,KAAyB;AACnC,cAAA,OAAO,OAAA,CAAQ,MAAM,QAAA,IAAY,IAAA;AAAA,YACnC,CAAA;AAAA,YACA,UAAA,EAAY,CAAC,UAAA,KAAwC;AACnD,cAAA,MAAM,QAAA,GAAW,WAAW,UAAU,CAAA;AACtC,cAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAEtB,cAAA,OAAO,EAAE,KAAA,EAAO,CAAA,WAAA,EAAc,QAAQ,CAAA,CAAA,EAAG;AAAA,YAC3C;AAAA;AACF;AACF;AACF,KACF;AAAA,EACF,CAAA;AAAA,EAEA,WAAA,GAAc;AACZ,IAAA,OAAO;AAAA,MACL,aACE,CAAC,QAAA,KACD,CAAC,EAAE,UAAS,KAAM;AAChB,QAAA,OAAO,QAAA,CAAS,OAAA,CAAQ,WAAA,EAAa,EAAE,UAAU,CAAA;AAAA,MACnD,CAAA;AAAA,MAEF,aAAA,EACE,MACA,CAAC,EAAE,UAAS,KAAM;AAChB,QAAA,IAAI,CAAC,SAAS,OAAA,CAAQ,WAAA,EAAa,EAAE,QAAA,EAAU,IAAA,EAAM,CAAA,EAAG,OAAO,KAAA;AAC/D,QAAA,QAAA,CAAS,oBAAA,EAAqB;AAC9B,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,KACJ;AAAA,EACF,CAAA;AAAA,EAEA,aAAA,GAAgB;AACd,IAAA,OAAO,CAAC,SAAS,CAAA;AAAA,EACnB,CAAA;AAAA,EAEA,eAAA,GAAiC;AAC/B,IAAA,IAAI,KAAK,OAAA,CAAQ,SAAA,CAAU,MAAA,KAAW,CAAA,SAAU,EAAC;AAEjD,IAAA,MAAM,KAAA,GAAQ,KAAK,OAAA,CAAQ,SAAA;AAE3B,IAAA,MAAM,KAAA,GAAyB,KAAA,CAAM,GAAA,CAAI,CAAC,MAAM,CAAA,MAAO;AAAA,MACrD,IAAA,EAAM,QAAA;AAAA,MACN,IAAA,EAAM,YAAY,IAAI,CAAA,CAAA;AAAA,MACtB,OAAA,EAAS,aAAA;AAAA,MACT,WAAA,EAAa,CAAC,IAAI,CAAA;AAAA,MAClB,QAAA,EAAU,EAAE,IAAA,EAAM,WAAA,EAAa,YAAY,EAAE,QAAA,EAAU,MAAK,EAAE;AAAA,MAC9D,IAAA,EAAM,UAAA;AAAA,MACN,KAAA,EAAO,IAAA;AAAA,MACP,UAAU,GAAA,GAAM;AAAA,KAClB,CAAE,CAAA;AAEF,IAAA,IAAI,IAAA,CAAK,QAAQ,SAAA,EAAW;AAC1B,MAAA,KAAA,CAAM,IAAA,CAAK;AAAA,QACT,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,eAAA;AAAA,QACN,OAAA,EAAS,eAAA;AAAA,QACT,IAAA,EAAM,UAAA;AAAA,QACN,KAAA,EAAO,QAAA;AAAA,QACP,QAAA,EAAU;AAAA,OACX,CAAA;AAAA,IACH;AAEA,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,UAAA;AAAA,QACN,IAAA,EAAM,UAAA;AAAA,QACN,IAAA,EAAM,UAAA;AAAA,QACN,KAAA,EAAO,WAAA;AAAA,QACP,KAAA,EAAO,WAAA;AAAA,QACP,QAAA,EAAU,GAAA;AAAA,QACV,WAAA,EAAa,MAAA;AAAA,QACb,YAAA,EAAc,IAAA;AAAA,QACd,oBAAA,EAAsB,MAAA;AAAA,QACtB,qBAAA,EAAuB,WAAA;AAAA,QACvB;AAAA;AACF,KACF;AAAA,EACF;AACF,CAAC;;;AChHM,IAAM,4BAAA,GAAkD,OAAO,MAAA,CAAO;AAAA,EAC3E,MAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAC;AAkBM,IAAM,iBAAA,GAAoB,UAAU,MAAA,CAGzC;AAAA,EACA,IAAA,EAAM,mBAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMN,YAAA,EAAc,CAAC,WAAW,CAAA;AAAA,EAE1B,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,OAAA,EAAS;AAAA,KACX;AAAA,EACF,CAAA;AAAA,EAEA,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ;AAAA,KACV;AAAA,EACF,CAAA;AAAA,EAEA,eAAA,GAAiC;AAC/B,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,aAAA;AAAA;AAAA;AAAA;AAAA,QAIN,OAAA,EAAS,OAAA;AAAA;AAAA;AAAA;AAAA,QAIT,IAAA,EAAM,gBAAA;AAAA,QACN,KAAA,EAAO,2BAAA;AAAA,QACP,SAAA,EAAW,iBAAA;AAAA,QACX,KAAA,EAAO,WAAA;AAAA,QACP,QAAA,EAAU,GAAA;AAAA;AAAA;AAAA;AAAA,QAIV,OAAA,EAAS;AAAA;AACX,KACF;AAAA,EACF;AACF,CAAC;;;ACzFM,IAAM,eAAA,GAAkB,UAAU,MAAA,CAAO;AAAA,EAC9C,IAAA,EAAM,iBAAA;AAAA,EAEN,eAAA,GAAiC;AAC/B,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,iBAAA;AAAA,QACN,OAAA,EAAS,eAAA;AAAA,QACT,IAAA,EAAM,YAAA;AAAA,QACN,KAAA,EAAO,kBAAA;AAAA,QACP,KAAA,EAAO,WAAA;AAAA,QACP,QAAA,EAAU;AAAA;AACZ,KACF;AAAA,EACF;AACF,CAAC;ACAD,IAAM,oBAAA,GAAuB,IAAIgC,eAAAA,CAAU,aAAa,CAAA;AAExD,SAAS,iBAAA,CAAkB,EAAE,MAAA,EAAQ,QAAA,EAAU,WAAU,EAAqC;AAE5F,EAAA,MAAM,EAAA,GAAK,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACvC,EAAA,EAAA,CAAG,SAAA,GAAY,iBAAA;AACf,EAAA,EAAA,CAAG,YAAA,CAAa,qBAAqB,EAAE,CAAA;AACvC,EAAA,EAAA,CAAG,MAAM,OAAA,GAAU,MAAA;AAEnB,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAC5C,EAAA,KAAA,CAAM,IAAA,GAAO,KAAA;AACb,EAAA,KAAA,CAAM,WAAA,GAAc,cAAA;AACpB,EAAA,KAAA,CAAM,SAAA,GAAY,uBAAA;AAClB,EAAA,KAAA,CAAM,YAAA,CAAa,cAAc,KAAK,CAAA;AAEtC,EAAA,MAAM,QAAA,GAAW,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAChD,EAAA,QAAA,CAAS,IAAA,GAAO,QAAA;AAChB,EAAA,QAAA,CAAS,SAAA,GAAY,2CAAA;AACrB,EAAA,QAAA,CAAS,KAAA,GAAQ,YAAA;AACjB,EAAA,QAAA,CAAS,YAAA,CAAa,cAAc,YAAY,CAAA;AAChD,EAAA,QAAA,CAAS,SAAA,GAAY,YAAA,CAAa,OAAO,CAAA,IAAK,EAAA;AAE9C,EAAA,MAAM,SAAA,GAAY,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AACjD,EAAA,SAAA,CAAU,IAAA,GAAO,QAAA;AACjB,EAAA,SAAA,CAAU,SAAA,GAAY,4CAAA;AACtB,EAAA,SAAA,CAAU,KAAA,GAAQ,aAAA;AAClB,EAAA,SAAA,CAAU,YAAA,CAAa,cAAc,aAAa,CAAA;AAClD,EAAA,SAAA,CAAU,SAAA,GAAY,YAAA,CAAa,WAAW,CAAA,IAAK,EAAA;AAEnD,EAAA,EAAA,CAAG,YAAY,KAAK,CAAA;AACpB,EAAA,EAAA,CAAG,YAAY,QAAQ,CAAA;AACvB,EAAA,EAAA,CAAG,YAAY,SAAS,CAAA;AAExB,EAAA,IAAI,MAAA,GAAS,KAAA;AACb,EAAA,IAAI,eAAA,GAAkB,KAAA;AACtB,EAAA,IAAI,eAAA,GAAuC,IAAA;AAC3C,EAAA,IAAI,YAAA,GAAmC,IAAA;AAGvC,EAAA,MAAM,kBAAA,GAAqB,CAAC,KAAA,KAAyB;AACnD,IAAA,MAAM,WAAA,GAAc,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA;AACzC,IAAA,IAAI,WAAA,EAAa,WAAA,CAAY,QAAQ,CAAA,GAAI,KAAA;AAAA,EAC3C,CAAA;AAEA,EAAA,MAAM,IAAA,GAAO,CAAC,aAAA,KAAsC;AAClD,IAAA,YAAA,GAAe,aAAA,IAAiB,IAAA;AAEhC,IAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAA,CAAO,IAAA;AACzB,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,KAAA,CAAM,SAAA;AAC9B,IAAA,IAAI,YAAA,GAA8B,IAAA;AAElC,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,GAAA,CAAI,OAAA,CAAQ,IAAI,CAAA;AACnC,MAAA,MAAM,QAAA,GAAW,KAAK,KAAA,EAAM,CAAE,KAAK,CAAC,CAAA,KAAkC,CAAA,CAAE,IAAA,KAAS,QAAQ,CAAA;AACzF,MAAA,YAAA,GAAe,QAAA,GAAY,QAAA,CAAS,KAAA,CAAkC,MAAM,CAAA,GAAc,IAAA;AAAA,IAC5F,CAAA,MAAO;AAEL,MAAA,MAAM,EAAE,EAAA,EAAG,GAAI,KAAA,CAAM,SAAA;AACrB,MAAA,KAAA,CAAM,GAAA,CAAI,YAAA,CAAa,IAAA,EAAM,EAAA,EAAI,CAAC,IAAA,KAAS;AACzC,QAAA,IAAI,cAAc,OAAO,KAAA;AACzB,QAAA,MAAM,QAAA,GAAW,KAAK,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAkC,CAAA,CAAE,SAAS,QAAQ,CAAA;AACvF,QAAA,IAAI,QAAA,EAAU,YAAA,GAAgB,QAAA,CAAS,KAAA,CAAkC,MAAM,CAAA;AAC/E,QAAA,OAAO,IAAA;AAAA,MACT,CAAC,CAAA;AAAA,IACH;AAEA,IAAA,eAAA,GAAkB,YAAA,KAAiB,IAAA;AACnC,IAAA,KAAA,CAAM,QAAQ,YAAA,IAAgB,EAAA;AAC9B,IAAA,SAAA,CAAU,KAAA,CAAM,OAAA,GAAU,eAAA,GAAkB,EAAA,GAAK,MAAA;AAEjD,IAAA,EAAA,CAAG,MAAM,OAAA,GAAU,EAAA;AACnB,IAAA,EAAA,CAAG,YAAA,CAAa,aAAa,EAAE,CAAA;AAC/B,IAAA,MAAA,GAAS,IAAA;AACT,IAAA,kBAAA,CAAmB,IAAI,CAAA;AAOvB,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,MAAM,EAAE,EAAA,EAAG,GAAI,KAAA,CAAM,SAAA;AACrB,MAAA,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,KAAA,CAAM,EAAA,CAAG,OAAA,CAAQ,sBAAsB,EAAE,IAAA,EAAM,EAAA,EAAI,CAAC,CAAA;AAAA,IAC3E,CAAA,MAAO;AAEL,MAAA,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,IAAA,CAAK,MAAM,EAAE,CAAA;AAAA,IAC3C;AAGA,IAAA,MAAM,YAAgE,aAAA,IAAiB;AAAA,MACrF,uBAAuB,MAAM;AAC3B,QAAA,MAAM,MAAA,GAAS,MAAA,CAAO,IAAA,CAAK,WAAA,CAAY,IAAI,CAAA;AAC3C,QAAA,OAAO,IAAI,OAAA,CAAQ,MAAA,CAAO,IAAA,EAAM,MAAA,CAAO,KAAK,CAAA,EAAG,MAAA,CAAO,MAAA,GAAS,MAAA,CAAO,GAAG,CAAA;AAAA,MAC3E;AAAA,KACF;AAQA,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,MAAM,QAAA,GAAW,aAAA,CAAc,OAAA,CAAqB,YAAY,CAAA;AAChE,MAAA,IAAI,QAAA,IAAY,EAAA,CAAG,aAAA,KAAkB,QAAA,EAAU;AAC7C,QAAA,QAAA,CAAS,YAAY,EAAE,CAAA;AAAA,MACzB;AAAA,IACF,CAAA,MAAA,IAAW,EAAA,CAAG,aAAA,KAAkB,QAAA,CAAS,IAAA,EAAM;AAC7C,MAAA,QAAA,CAAS,IAAA,CAAK,YAAY,EAAE,CAAA;AAAA,IAC9B;AAKA,IAAA,cAAA,CAAe,MAAA,CAAO,MAAM,EAAE,CAAA;AAE9B,IAAA,eAAA,IAAkB;AAClB,IAAA,eAAA,GAAkB,gBAAA,CAAiB,WAAW,EAAA,EAAI;AAAA,MAChD,SAAA,EAAW,gBAAgB,cAAA,GAAiB,QAAA;AAAA,MAC5C,WAAA,EAAa;AAAA,KACd,CAAA;AAED,IAAA,KAAA,CAAM,KAAA,EAAM;AACZ,IAAA,KAAA,CAAM,MAAA,EAAO;AAAA,EACf,CAAA;AAEA,EAAA,MAAMN,QAAO,MAAY;AACvB,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,YAAA,GAAe,IAAA;AACf,IAAA,eAAA,IAAkB;AAClB,IAAA,eAAA,GAAkB,IAAA;AAClB,IAAA,EAAA,CAAG,gBAAgB,WAAW,CAAA;AAC9B,IAAA,EAAA,CAAG,MAAM,OAAA,GAAU,MAAA;AACnB,IAAA,MAAA,GAAS,KAAA;AACT,IAAA,kBAAA,CAAmB,KAAK,CAAA;AAGxB,IAAA,MAAA,CAAO,IAAA,CAAK,SAAS,MAAA,CAAO,IAAA,CAAK,MAAM,EAAA,CAAG,OAAA,CAAQ,oBAAA,EAAsB,IAAI,CAAC,CAAA;AAC7E,IAAA,KAAA,CAAM,KAAA,GAAQ,EAAA;AAAA,EAChB,CAAA;AAEA,EAAA,MAAM,YAAY,MAAY;AAC5B,IAAA,IAAI,IAAA,GAAO,KAAA,CAAM,KAAA,CAAM,IAAA,EAAK;AAC5B,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAAA,KAAAA,EAAK;AACL,MAAA,MAAA,CAAO,KAAK,KAAA,EAAM;AAClB,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,CAAC,sBAAA,CAAuB,IAAA,CAAK,IAAI,CAAA,EAAG;AACtC,MAAA,IAAA,GAAO,UAAA,GAAa,IAAA;AAAA,IACtB;AAEA,IAAA,IAAI,CAAC,UAAA,CAAW,IAAA,EAAM,EAAE,SAAA,EAAW,CAAA,EAAG;AACpC,MAAAA,KAAAA,EAAK;AACL,MAAA,MAAA,CAAO,KAAK,KAAA,EAAM;AAClB,MAAA;AAAA,IACF;AAIA,IAAA,MAAM,SAAEpC,OAAA,EAAM,GAAI,MAAA,CAAO,IAAA;AACzB,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAIA,OAAA,CAAM,SAAA;AAE9B,IAAA,IAAI,SAAS,eAAA,EAAiB;AAC5B,MAAA,MAAM,IAAA,GAAOA,OAAA,CAAM,GAAA,CAAI,OAAA,CAAQ,IAAI,CAAA;AACnC,MAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,IAAA,EAAM,QAAQ,CAAA;AACzC,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,MAAM,EAAA,GAAKA,OAAA,CAAM,EAAA,CACd,YAAA,CAAaC,mBAAAA,CAAc,OAAOD,OAAA,CAAM,GAAA,EAAK,KAAA,CAAM,IAAA,EAAM,KAAA,CAAM,EAAE,CAAC,CAAA,CAClE,OAAA,CAAQ,KAAA,CAAM,IAAA,EAAM,KAAA,CAAM,EAAA,EAAI,SAAS,MAAA,CAAO,EAAE,IAAA,EAAM,CAAC,CAAA;AAC1D,QAAA,MAAA,CAAO,IAAA,CAAK,SAAS,EAAE,CAAA;AACvB,QAAAoC,KAAAA,EAAK;AACL,QAAA,MAAA,CAAO,KAAK,KAAA,EAAM;AAClB,QAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,EAAE,IAAA,EAAM,CAAA;AAChC,IAAAA,KAAAA,EAAK;AACL,IAAA,MAAA,CAAO,KAAK,KAAA,EAAM;AAAA,EACpB,CAAA;AAEA,EAAA,MAAM,aAAa,MAAY;AAC7B,IAAA,MAAA,CAAO,SAAS,SAAA,EAAU;AAC1B,IAAAA,KAAAA,EAAK;AACL,IAAA,MAAA,CAAO,KAAK,KAAA,EAAM;AAAA,EACpB,CAAA;AAGA,EAAA,MAAM,UAAA,GAAa,CAAC,IAAA,KAAgD;AAClE,IAAA,IAAI,MAAA,EAAQ;AACV,MAAAA,KAAAA,EAAK;AACL,MAAA,MAAA,CAAO,KAAK,KAAA,EAAM;AAAA,IACpB,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,KAAK,aAAa,CAAA;AAAA,IACzB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,cAAA,GAAiB,CAAC,CAAA,KAA2B;AACjD,IAAA,IAAI,CAAA,CAAE,QAAQ,OAAA,EAAS;AACrB,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,SAAA,EAAU;AAAA,IACZ,CAAA,MAAA,IAAW,CAAA,CAAE,GAAA,KAAQ,QAAA,EAAU;AAC7B,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAAA,KAAAA,EAAK;AACL,MAAA,MAAA,CAAO,KAAK,KAAA,EAAM;AAAA,IACpB,CAAA,MAAA,IAAW,CAAA,CAAE,GAAA,KAAQ,KAAA,EAAO;AAC1B,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,IAAI,EAAE,QAAA,EAAU;AACd,QAAA,CAAC,eAAA,GAAkB,SAAA,GAAY,QAAA,EAAU,KAAA,EAAM;AAAA,MACjD,CAAA,MAAO;AACL,QAAA,QAAA,CAAS,KAAA,EAAM;AAAA,MACjB;AAAA,IACF;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,eAAA,GAAkB,CAAC,CAAA,KAA2B;AAClD,IAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AACtB,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAAA,KAAAA,EAAK;AACL,MAAA,MAAA,CAAO,KAAK,KAAA,EAAM;AAAA,IACpB,CAAA,MAAA,IAAW,CAAA,CAAE,GAAA,KAAQ,KAAA,EAAO;AAC1B,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,MAAM,SAAS,CAAA,CAAE,MAAA;AACjB,MAAA,IAAI,EAAE,QAAA,EAAU;AACd,QAAA,IAAI,WAAW,QAAA,EAAU;AACvB,UAAA,KAAA,CAAM,KAAA,EAAM;AAAA,QACd,CAAA,MAAO;AACL,UAAA,QAAA,CAAS,KAAA,EAAM;AAAA,QACjB;AAAA,MACF,CAAA,MAAO;AACL,QAAA,IAAI,MAAA,KAAW,YAAY,eAAA,EAAiB;AAC1C,UAAA,SAAA,CAAU,KAAA,EAAM;AAAA,QAClB,CAAA,MAAO;AACL,UAAA,KAAA,CAAM,KAAA,EAAM;AAAA,QACd;AAAA,MACF;AAAA,IACF,CAAA,MAAA,IAAW,CAAA,CAAE,GAAA,KAAQ,OAAA,EAAS;AAC5B,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAC,CAAA,CAAE,OAAuB,KAAA,EAAM;AAAA,IAClC;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,cAAA,GAAiB,CAAC,CAAA,KAAwB;AAC9C,IAAA,IAAI,CAAC,MAAA,IAAU,EAAA,CAAG,QAAA,CAAS,CAAA,CAAE,MAAc,CAAA,EAAG;AAG9C,IAAA,IAAI,YAAA,KAAiB,iBAAiB,CAAA,CAAE,MAAA,IAAU,aAAa,QAAA,CAAS,CAAA,CAAE,MAAc,CAAA,CAAA,EAAI;AAC5F,IAAAA,KAAAA,EAAK;AAAA,EACP,CAAA;AAEA,EAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAAwB;AAC7C,IAAA,CAAA,CAAE,cAAA,EAAe;AAAA,EACnB,CAAA;AAEA,EAAA,OAAO,IAAIlC,YAAAA,CAAO;AAAA,IAChB,GAAA,EAAK,oBAAA;AAAA,IAEL,KAAA,EAAO;AAAA,MACL,IAAA,GAAO;AACL,QAAA,OAAOuD,kBAAAA,CAAc,KAAA;AAAA,MACvB,CAAA;AAAA,MACA,KAAA,CAAM,IAAI,WAAA,EAAa;AACrB,QAAA,MAAM,IAAA,GAAO,EAAA,CAAG,OAAA,CAAQ,oBAAoB,CAAA;AAC5C,QAAA,IAAI,IAAA,KAAS,IAAA,EAAM,OAAOA,kBAAAA,CAAc,KAAA;AACxC,QAAA,IAAI,IAAA,EAAM;AACR,UAAA,OAAOA,kBAAAA,CAAc,MAAA,CAAO,EAAA,CAAG,GAAA,EAAK;AAAA,YAClCE,eAAAA,CAAW,OAAO,IAAA,CAAK,IAAA,EAAM,KAAK,EAAA,EAAI,EAAE,KAAA,EAAO,iBAAA,EAAmB;AAAA,WACnE,CAAA;AAAA,QACH;AACA,QAAA,OAAO,WAAA,CAAY,GAAA,CAAI,EAAA,CAAG,OAAA,EAAS,GAAG,GAAG,CAAA;AAAA,MAC3C;AAAA,KACF;AAAA,IAEA,KAAA,EAAO;AAAA,MACL,YAAY,KAAA,EAAO;AACjB,QAAA,OAAO,oBAAA,CAAqB,SAAS,KAAK,CAAA;AAAA,MAC5C;AAAA,KACF;AAAA,IAEA,MAAM,MAAM;AAEV,MAAA,QAAA,CAAS,IAAA,CAAK,YAAY,EAAE,CAAA;AAI5B,MAAA,KAAA,CAAM,gBAAA,CAAiB,WAAW,cAAc,CAAA;AAChD,MAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,aAAa,CAAA;AACpD,MAAA,QAAA,CAAS,gBAAA,CAAiB,SAAS,SAAS,CAAA;AAC5C,MAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,eAAe,CAAA;AACpD,MAAA,SAAA,CAAU,gBAAA,CAAiB,aAAa,aAAa,CAAA;AACrD,MAAA,SAAA,CAAU,gBAAA,CAAiB,SAAS,UAAU,CAAA;AAC9C,MAAA,SAAA,CAAU,gBAAA,CAAiB,WAAW,eAAe,CAAA;AACrD,MAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,cAAc,CAAA;AACrD,MAAA,MAAA,CAAO,EAAA,CAAG,YAAY,UAAU,CAAA;AAEhC,MAAA,OAAO;AAAA,QACL,SAAS,MAAM;AACb,UAAAvB,KAAAA,EAAK;AACL,UAAA,KAAA,CAAM,mBAAA,CAAoB,WAAW,cAAc,CAAA;AACnD,UAAA,QAAA,CAAS,mBAAA,CAAoB,aAAa,aAAa,CAAA;AACvD,UAAA,QAAA,CAAS,mBAAA,CAAoB,SAAS,SAAS,CAAA;AAC/C,UAAA,QAAA,CAAS,mBAAA,CAAoB,WAAW,eAAe,CAAA;AACvD,UAAA,SAAA,CAAU,mBAAA,CAAoB,aAAa,aAAa,CAAA;AACxD,UAAA,SAAA,CAAU,mBAAA,CAAoB,SAAS,UAAU,CAAA;AACjD,UAAA,SAAA,CAAU,mBAAA,CAAoB,WAAW,eAAe,CAAA;AACxD,UAAA,QAAA,CAAS,mBAAA,CAAoB,aAAa,cAAc,CAAA;AACxD,UAAA,MAAA,CAAO,GAAA,CAAI,YAAY,UAAU,CAAA;AACjC,UAAA,EAAA,CAAG,MAAA,EAAO;AAAA,QACZ;AAAA,OACF;AAAA,IACF;AAAA,GACD,CAAA;AACH;AAEO,IAAM,WAAA,GAAc,UAAU,MAAA,CAA2B;AAAA,EAC9D,IAAA,EAAM,aAAA;AAAA,EAEN,YAAA,EAAc,CAAC,MAAM,CAAA;AAAA,EAErB,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,SAAA,EAAW,CAAC,OAAA,EAAS,QAAA,EAAU,WAAW,MAAM;AAAA,KAClD;AAAA,EACF,CAAA;AAAA,EAEA,qBAAA,GAAwB;AACtB,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA;AAC3C,IAAA,IAAI,CAAC,QAAA,EAAU,OAAO,EAAC;AAEvB,IAAA,OAAO;AAAA,MACL,iBAAA,CAAkB;AAAA,QAChB,MAAA;AAAA,QACA,QAAA;AAAA,QACA,SAAA,EAAW,KAAK,OAAA,CAAQ;AAAA,OACzB;AAAA,KACH;AAAA,EACF;AACF,CAAC;ACpXM,IAAM,mBAAA,GAAsB,IAAIM,eAAAA,CAAU,YAAY;AAG7D,SAAS,iBAAA,CAAkB;AAAA,EACzB,MAAA;AAAA,SACA1C,OAAA;AAAA,EACA,IAAA;AAAA,EACA;AACF,CAAA,EAMY;AACV,EAAA,MAAM,EAAE,WAAU,GAAIA,OAAA;AAGtB,EAAA,IAAI,SAAA,CAAU,OAAO,OAAO,KAAA;AAG5B,EAAA,IAAI,EAAE,SAAA,YAAqBC,mBAAAA,CAAAA,EAAgB,OAAO,KAAA;AAGlD,EAAA,IAAI,CAACD,QAAM,GAAA,CAAI,WAAA,CAAY,MAAM,EAAE,CAAA,CAAE,QAAQ,OAAO,KAAA;AAGpD,EAAA,IAAI,CAAC,MAAA,CAAO,UAAA,EAAY,OAAO,KAAA;AAI/B,EAAA,MAAM,KAAA,GAAQA,OAAA,CAAM,GAAA,CAAI,OAAA,CAAQ,IAAI,CAAA;AACpC,EAAA,KAAA,IAAS,CAAA,GAAI,KAAA,CAAM,KAAA,EAAO,CAAA,GAAI,GAAG,CAAA,EAAA,EAAK;AACpC,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,CAAC,EAAE,IAAA,CAAK,IAAA;AAChC,IAAA,IAAI,IAAA,KAAS,WAAA,IAAe,IAAA,KAAS,aAAA,EAAe,OAAO,KAAA;AAAA,EAC7D;AAEA,EAAA,OAAO,IAAA;AACT;AA6DO,SAAS,uBAAuB,OAAA,EAAgD;AACrF,EAAA,MAAM;AAAA,IACJ,SAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA;AAAA,IACA,UAAA,GAAa,iBAAA;AAAA,IACb,SAAA,GAAY,KAAA;AAAA,IACZ,QAAAgB,OAAAA,GAAS,CAAA;AAAA,IACT,WAAA,GAAc;AAAA,GAChB,GAAI,OAAA;AAEJ,EAAA,IAAI,aAAA,GAAsD,IAAA;AAC1D,EAAA,IAAI,YAAA,GAAqD,IAAA;AACzD,EAAA,IAAI,cAAA,GAAuD,IAAA;AAC3D,EAAA,IAAI,eAAA,GAAuC,IAAA;AAE3C,EAAA,MAAM,cAAA,GAAiB,CAAC,IAAA,EAAkB,IAAA,EAAc,EAAA,KAAqB;AAC3E,IAAA,eAAA,IAAkB;AAKlB,IAAA,MAAM,GAAA,GAAM,KAAK,KAAA,CAAM,SAAA;AACvB,IAAA,IAAI,SAAA,GAAuE,IAAA;AAC3E,IAAA,IAAI,UAAU,GAAA,EAAK;AACjB,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAA;AAC7B,MAAA,IAAI,GAAA,YAAe,aAAa,SAAA,GAAY,GAAA;AAAA,IAC9C;AACA,IAAA,SAAA,KAAc;AAAA,MACZ,uBAAuB,MAAM;AAC3B,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,WAAA,CAAY,IAAI,CAAA;AACnC,QAAA,MAAM,GAAA,GAAM,IAAA,CAAK,WAAA,CAAY,EAAE,CAAA;AAC/B,QAAA,OAAO,IAAI,OAAA;AAAA,UACT,KAAA,CAAM,IAAA;AAAA,UACN,KAAA,CAAM,GAAA;AAAA,UACN,GAAA,CAAI,QAAQ,KAAA,CAAM,IAAA;AAAA,UAClB,GAAA,CAAI,SAAS,KAAA,CAAM;AAAA,SACrB;AAAA,MACF;AAAA,KACF;AAEA,IAAA,eAAA,GAAkB,oBAAA,CAAqB,WAAW,OAAA,EAAS;AAAA,MACzD,SAAA;AAAA,MACA,WAAA,EAAaA;AAAA,KACd,CAAA;AAED,IAAA,OAAA,CAAQ,YAAA,CAAa,aAAa,EAAE,CAAA;AAAA,EACtC,CAAA;AAEA,EAAA,MAAM,WAAW,MAAY;AAC3B,IAAA,eAAA,IAAkB;AAClB,IAAA,eAAA,GAAkB,IAAA;AAClB,IAAA,OAAA,CAAQ,gBAAgB,WAAW,CAAA;AAAA,EACrC,CAAA;AAIA,EAAA,IAAI,UAAA,GAAa,KAAA;AAMjB,EAAA,IAAI,SAAA,GAAY,KAAA;AAEhB,EAAA,MAAM,mBAAA,GAAsB,CAAC,CAAA,KAAwB;AACnD,IAAA,MAAM,SAAS,CAAA,CAAE,MAAA;AACjB,IAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,IAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA,EAAG;AAE9B,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,QAAA,CAAS,MAAM,CAAA,EAAG;AAKtC,IAAA,IAAI,MAAA,YAAkB,WAAA,IAAe,MAAA,CAAO,OAAA,CAAQ,qBAAqB,CAAA,EAAG;AAE5E,IAAA,QAAA,EAAS;AACT,IAAA,UAAA,GAAa,IAAA;AAAA,EACf,CAAA;AAGA,EAAA,MAAM,eAAA,GAAkB,CAAC,CAAA,KAAmB;AAC1C,IAAA,CAAA,CAAE,cAAA,EAAe;AAAA,EACnB,CAAA;AAGA,EAAA,QAAA,EAAS;AAET,EAAA,OAAO,IAAId,YAAAA,CAAO;AAAA,IAChB,GAAA,EAAK,SAAA;AAAA,IAEL,KAAA,EAAO;AAAA,MACL,MAAM,OAA8B;AAAA,QAClC,OAAA,EAAS,KAAA;AAAA,QACT,IAAA,EAAM,CAAA;AAAA,QACN,EAAA,EAAI;AAAA,OACN,CAAA;AAAA,MACA,KAAA,EAAO,CAAC,GAAA,EAAK,SAAA,EAAW,WAAW,QAAA,KAAoC;AACrE,QAAA,MAAM,EAAE,WAAU,GAAI,QAAA;AACtB,QAAA,MAAM,EAAE,IAAA,EAAM,EAAA,EAAG,GAAI,SAAA;AAGrB,QAAA,IAAI,IAAA,KAAS,SAAA,CAAU,IAAA,IAAQ,EAAA,KAAO,UAAU,EAAA,EAAI;AAClD,UAAA,UAAA,GAAa,KAAA;AAAA,QACf;AAGA,QAAA,MAAM,UACJ,CAAC,UAAA,IACD,CAAC,SAAA,CAAU,SACX,UAAA,CAAW;AAAA,UACT,MAAA;AAAA,UACA,MAAM,MAAA,CAAO,IAAA;AAAA,UACb,KAAA,EAAO,QAAA;AAAA,UACP,IAAA;AAAA,UACA;AAAA,SACD,CAAA;AAEH,QAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,EAAA,EAAG;AAAA,MAC7B;AAAA,KACF;AAAA,IAEA,IAAA,EAAM,CAAC,UAAA,KAAe;AAGpB,MAAA,MAAM,QAAA,GAAW,UAAA,CAAW,GAAA,CAAI,OAAA,CAAQ,YAAY,CAAA;AACpD,MAAA,IAAI,QAAA,IAAY,OAAA,CAAQ,aAAA,KAAkB,QAAA,EAAU;AAClD,QAAA,QAAA,CAAS,YAAY,OAAO,CAAA;AAAA,MAC9B;AAGA,MAAA,MAAM,iBAAA,GAAoB,CAAC,CAAA,KAAwB;AACjD,QAAA,IAAI,CAAA,CAAE,WAAW,CAAA,EAAG;AACpB,QAAA,SAAA,GAAY,IAAA;AACZ,QAAA,QAAA,EAAS;AAAA,MACX,CAAA;AACA,MAAA,MAAM,oBAAoB,MAAY;AACpC,QAAA,IAAI,CAAC,SAAA,EAAW;AAChB,QAAA,SAAA,GAAY,KAAA;AAEZ,QAAA,cAAA,GAAiB,WAAW,MAAM;AAChC,UAAA,IAAI,SAAA,EAAW;AACf,UAAA,MAAM,YAAA,GAAe,SAAA,CAAU,QAAA,CAAS,MAAA,CAAO,KAAK,KAAK,CAAA;AAGzD,UAAA,IAAI,cAAc,OAAA,EAAS;AACzB,YAAA,cAAA,CAAe,MAAA,CAAO,IAAA,EAAM,YAAA,CAAa,IAAA,EAAM,aAAa,EAAE,CAAA;AAAA,UAChE;AAAA,QACF,CAAC,CAAA;AAAA,MACH,CAAA;AAEA,MAAA,MAAM,UAAU,MAAY;AAK1B,QAAA,YAAA,GAAe,WAAW,MAAM;AAC9B,UAAA,IAAI,UAAA,EAAY;AACd,YAAA,QAAA,EAAS;AACT,YAAA;AAAA,UACF;AACA,UAAA,IAAI,SAAA,EAAW;AACf,UAAA,MAAM,EAAE,SAAA,EAAU,GAAI,MAAA,CAAO,IAAA,CAAK,KAAA;AAClC,UAAA,MAAM,EAAE,IAAA,EAAM,EAAA,EAAG,GAAI,SAAA;AACrB,UAAA,MAAM,IAAA,GACJ,CAAC,SAAA,CAAU,KAAA,IACX,UAAA,CAAW;AAAA,YACT,MAAA;AAAA,YACA,MAAM,MAAA,CAAO,IAAA;AAAA,YACb,KAAA,EAAO,OAAO,IAAA,CAAK,KAAA;AAAA,YACnB,IAAA;AAAA,YACA;AAAA,WACD,CAAA;AACH,UAAA,IAAI,IAAA,EAAM;AACR,YAAA,cAAA,CAAe,MAAA,CAAO,IAAA,EAAM,IAAA,EAAM,EAAE,CAAA;AAAA,UACtC,CAAA,MAAO;AACL,YAAA,QAAA,EAAS;AAAA,UACX;AAAA,QACF,CAAC,CAAA;AAAA,MACH,CAAA;AAEA,MAAA,MAAM,MAAA,GAAS,CAAC,EAAE,KAAA,EAAM,KAAmC;AAMzD,QAAA,MAAM,UAAU,KAAA,CAAM,aAAA;AACtB,QAAA,IAAI,mBAAmB,WAAA,EAAa;AAClC,UAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,OAAO,CAAA,EAAG;AAC/B,UAAA,IAAI,OAAA,CAAQ,OAAA,CAAQ,qBAAqB,CAAA,EAAG;AAAA,QAC9C;AACA,QAAA,QAAA,EAAS;AAAA,MACX,CAAA;AAGA,MAAA,MAAM,oBAAoB,MAAY;AACpC,QAAA,QAAA,EAAS;AACT,QAAA,UAAA,GAAa,IAAA;AAAA,MACf,CAAA;AAEA,MAAA,OAAA,CAAQ,iBAAiB,WAAA,EAAa,eAAA,EAAiB,EAAE,OAAA,EAAS,MAAM,CAAA;AACxE,MAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,mBAAmB,CAAA;AAC1D,MAAA,UAAA,CAAW,GAAA,CAAI,gBAAA,CAAiB,WAAA,EAAa,iBAAiB,CAAA;AAC9D,MAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,iBAAiB,CAAA;AACtD,MAAA,QAAA,EAAU,gBAAA,CAAiB,uBAAuB,iBAAiB,CAAA;AACnE,MAAA,MAAA,CAAO,EAAA,CAAG,SAAS,OAAO,CAAA;AAC1B,MAAA,MAAA,CAAO,EAAA,CAAG,QAAQ,MAAM,CAAA;AAExB,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,CAAC,IAAA,EAAM,SAAA,KAAc;AAE3B,UAAA,IAAI,KAAK,SAAA,EAAW;AAEpB,UAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,QAAA,CAAS,IAAA,CAAK,KAAK,CAAA;AAG3C,UAAA,MAAM,eAAA,GAAkB,SAAA,CAAU,QAAA,CAAS,SAAS,CAAA;AAOpD,UAAA,IACE,OAAO,OAAA,KAAY,eAAA,EAAiB,WACpC,KAAA,EAAO,IAAA,KAAS,iBAAiB,IAAA,IACjC,KAAA,EAAO,OAAO,eAAA,EAAiB,EAAA,IAC/B,EAAE,KAAA,EAAO,OAAA,IAAW,KAAK,KAAA,CAAM,GAAA,KAAQ,UAAU,GAAA,CAAA,EACjD;AAEA,YAAA,IAAI,CAAC,KAAA,EAAO,OAAA,IAAW,OAAA,CAAQ,YAAA,CAAa,WAAW,CAAA,EAAG;AACxD,cAAA,QAAA,EAAS;AAAA,YACX;AACA,YAAA;AAAA,UACF;AAGA,UAAA,IAAI,aAAA,EAAe;AACjB,YAAA,YAAA,CAAa,aAAa,CAAA;AAC1B,YAAA,aAAA,GAAgB,IAAA;AAAA,UAClB;AAEA,UAAA,IAAI,KAAA,EAAO,OAAA,IAAW,CAAC,SAAA,EAAW;AAEhC,YAAA,IAAI,cAAc,CAAA,EAAG;AACnB,cAAA,aAAA,GAAgB,WAAW,MAAM;AAC/B,gBAAA,cAAA,CAAe,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,KAAA,CAAM,EAAE,CAAA;AAAA,cAC3C,GAAG,WAAW,CAAA;AAAA,YAChB,CAAA,MAAO;AACL,cAAA,cAAA,CAAe,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,KAAA,CAAM,EAAE,CAAA;AAAA,YAC3C;AAAA,UACF,CAAA,MAAO;AACL,YAAA,QAAA,EAAS;AAAA,UACX;AAAA,QACF,CAAA;AAAA,QAEA,SAAS,MAAM;AACb,UAAA,MAAA,CAAO,GAAA,CAAI,SAAS,OAAO,CAAA;AAC3B,UAAA,MAAA,CAAO,GAAA,CAAI,QAAQ,MAAM,CAAA;AACzB,UAAA,OAAA,CAAQ,mBAAA,CAAoB,aAAa,eAAA,EAAiB;AAAA,YACxD,OAAA,EAAS;AAAA,WACV,CAAA;AACD,UAAA,QAAA,CAAS,mBAAA,CAAoB,aAAa,mBAAmB,CAAA;AAC7D,UAAA,UAAA,CAAW,GAAA,CAAI,mBAAA,CAAoB,WAAA,EAAa,iBAAiB,CAAA;AACjE,UAAA,QAAA,CAAS,mBAAA,CAAoB,WAAW,iBAAiB,CAAA;AACzD,UAAA,QAAA,EAAU,mBAAA,CAAoB,uBAAuB,iBAAiB,CAAA;AACtE,UAAA,IAAI,aAAA,EAAe;AACjB,YAAA,YAAA,CAAa,aAAa,CAAA;AAAA,UAC5B;AACA,UAAA,IAAI,YAAA,EAAc;AAChB,YAAA,YAAA,CAAa,YAAY,CAAA;AAAA,UAC3B;AACA,UAAA,IAAI,cAAA,EAAgB;AAClB,YAAA,YAAA,CAAa,cAAc,CAAA;AAAA,UAC7B;AACA,UAAA,QAAA,EAAS;AAAA,QACX;AAAA,OACF;AAAA,IACF;AAAA,GACD,CAAA;AACH;AAEO,IAAM,UAAA,GAAa,UAAU,MAAA,CAA0B;AAAA,EAC5D,IAAA,EAAM,YAAA;AAAA,EAEN,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA;AAAA,MACT,WAAA,EAAa,CAAA;AAAA,MACb,UAAA,EAAY,iBAAA;AAAA,MACZ,SAAA,EAAW,KAAA;AAAA,MACX,MAAA,EAAQ;AAAA,KACV;AAAA,EACF,CAAA;AAAA,EAEA,qBAAA,GAAwB;AACtB,IAAA,MAAM,EAAE,SAAS,WAAA,EAAa,UAAA,EAAY,WAAW,MAAA,EAAAc,OAAAA,KACnD,IAAA,CAAK,OAAA;AAEP,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAO,EAAC;AAAA,IACV;AAEA,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,OAAO,EAAC;AAAA,IACV;AAEA,IAAA,OAAO;AAAA,MACL,sBAAA,CAAuB;AAAA,QACrB,SAAA,EAAW,mBAAA;AAAA,QACX,MAAA;AAAA,QACA,OAAA;AAAA,QACA,UAAA;AAAA,QACA,SAAA;AAAA,QACA,MAAA,EAAAA,OAAAA;AAAA,QACA;AAAA,OACD;AAAA,KACH;AAAA,EACF;AACF,CAAC;;;AClQM,IAAM,UAAA,GAAa,UAAU,MAAA,CAA0B;AAAA,EAC5D,IAAA,EAAM,YAAA;AAAA,EAEN,UAAA,GAAa;AACX,IAAA,OAAO,EAAC;AAAA,EACV,CAAA;AAAA,EAEA,aAAA,GAAgB;AACd,IAAA,MAAM,aAAmC,EAAC;AAG1C,IAAA,MAAM,QAAA,GAAW,CACf,GAAA,EACA,IAAA,KACS;AACT,MAAA,IAAI,SAAS,KAAA,EAAO;AACpB,MAAA,IAAI,QAAQ,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,CAAE,SAAS,CAAA,EAAG;AACxC,QAAA,UAAA,CAAW,IAAA,CAAK,GAAA,CAAI,SAAA,CAAU,IAAI,CAAC,CAAA;AAAA,MACrC,CAAA,MAAO;AACL,QAAA,UAAA,CAAW,KAAK,GAAG,CAAA;AAAA,MACrB;AAAA,IACF,CAAA;AAGA,IAAA,QAAA,CAAS,QAAA,EAAmB,IAAA,CAAK,OAAA,CAAQ,QAAiB,CAAA;AAC1D,IAAA,QAAA,CAAS,IAAA,EAAe,IAAA,CAAK,OAAA,CAAQ,IAAa,CAAA;AAClD,IAAA,QAAA,CAAS,SAAA,EAAW,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAA;AAC1C,IAAA,QAAA,CAAS,OAAA,EAAS,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAA;AACtC,IAAA,QAAA,CAAS,UAAA,EAAY,IAAA,CAAK,OAAA,CAAQ,UAAU,CAAA;AAC5C,IAAA,QAAA,CAAS,SAAA,EAAW,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAA;AAC1C,IAAA,QAAA,CAAS,UAAA,EAAY,IAAA,CAAK,OAAA,CAAQ,UAAU,CAAA;AAC5C,IAAA,QAAA,CAAS,WAAA,EAAa,IAAA,CAAK,OAAA,CAAQ,WAAW,CAAA;AAC9C,IAAA,QAAA,CAAS,QAAA,EAAU,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA;AACxC,IAAA,QAAA,CAAS,cAAA,EAAgB,IAAA,CAAK,OAAA,CAAQ,cAAc,CAAA;AACpD,IAAA,QAAA,CAAS,SAAA,EAAW,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAA;AAC1C,IAAA,QAAA,CAAS,QAAA,EAAU,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA;AACxC,IAAA,QAAA,CAAS,QAAA,EAAU,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA;AAGxC,IAAA,QAAA,CAAS,IAAA,EAAM,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAA;AAChC,IAAA,QAAA,CAAS,MAAA,EAAQ,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA;AACpC,IAAA,QAAA,CAAS,SAAA,EAAW,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAA;AAC1C,IAAA,QAAA,CAAS,MAAA,EAAQ,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA;AACpC,IAAA,QAAA,CAAS,IAAA,EAAM,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAA;AAChC,IAAA,QAAA,CAAS,IAAA,EAAM,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAA;AAGhC,IAAA,QAAA,CAAS,UAAA,EAAY,IAAA,CAAK,OAAA,CAAQ,UAAU,CAAA;AAC5C,IAAA,QAAA,CAAS,OAAA,EAAS,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAA;AACtC,IAAA,QAAA,CAAS,UAAA,EAAY,IAAA,CAAK,OAAA,CAAQ,UAAU,CAAA;AAC5C,IAAA,QAAA,CAAS,SAAA,EAAoB,IAAA,CAAK,OAAA,CAAQ,SAAkB,CAAA;AAC5D,IAAA,QAAA,CAAS,YAAA,EAAc,IAAA,CAAK,OAAA,CAAQ,YAAY,CAAA;AAChD,IAAA,QAAA,CAAS,UAAA,EAAY,IAAA,CAAK,OAAA,CAAQ,UAAU,CAAA;AAO5C,IAAA,IAAI,KAAK,OAAA,CAAQ,UAAA,KAAe,IAAA,EAAM,UAAA,CAAW,KAAK,UAAmB,CAAA;AACzE,IAAA,QAAA,CAAS,WAAA,EAAa,IAAA,CAAK,OAAA,CAAQ,WAAW,CAAA;AAC9C,IAAA,QAAA,CAAS,mBAAA,EAA8B,IAAA,CAAK,OAAA,CAAQ,mBAA4B,CAAA;AAEhF,IAAA,OAAO,UAAA;AAAA,EACT;AACF,CAAC;;;AC1OM,IAAM,OAAA,GAAU","file":"index.cjs","sourcesContent":["/**\n * Callback type for event handlers\n * - Events with payload: (data: T) => void\n * - Events without payload (undefined): () => void\n */\ntype EventCallback<T> = T extends undefined ? () => void : (data: T) => void;\n\n/**\n * Generic, type-safe event emitter\n *\n * @example\n * ```typescript\n * interface MyEvents {\n * update: { value: number };\n * destroy: undefined;\n * }\n *\n * const emitter = new EventEmitter<MyEvents>();\n * emitter.on('update', ({ value }) => console.log(value));\n * emitter.on('destroy', () => console.log('destroyed'));\n * ```\n */\nexport class EventEmitter<Events extends { [K in keyof Events]: unknown } = Record<string, never>> {\n // Protected so Editor subclass can access if needed\n protected callbacks = new Map<keyof Events, Set<EventCallback<unknown>>>();\n\n /**\n * Register an event listener\n */\n on<E extends keyof Events>(event: E, callback: EventCallback<Events[E]>): this {\n const listeners = this.callbacks.get(event);\n\n if (listeners) {\n listeners.add(callback as EventCallback<unknown>);\n } else {\n this.callbacks.set(event, new Set([callback as EventCallback<unknown>]));\n }\n\n return this;\n }\n\n /**\n * Remove an event listener, or all listeners for an event if no callback specified\n */\n off<E extends keyof Events>(event: E, callback?: EventCallback<Events[E]>): this {\n const listeners = this.callbacks.get(event);\n\n if (listeners) {\n if (callback) {\n // Remove specific callback\n listeners.delete(callback as EventCallback<unknown>);\n\n // Clean up empty sets\n if (listeners.size === 0) {\n this.callbacks.delete(event);\n }\n } else {\n // Remove all listeners for this event\n this.callbacks.delete(event);\n }\n }\n\n return this;\n }\n\n /**\n * Emit an event to all registered listeners\n * Uses .call(this) to preserve context for callbacks\n */\n emit<E extends keyof Events>(\n event: E,\n ...args: Events[E] extends undefined ? [] : [Events[E]]\n ): this {\n const listeners = this.callbacks.get(event);\n\n if (listeners) {\n listeners.forEach((callback) => {\n if (args.length > 0) {\n (callback as (data: unknown) => void).call(this, args[0]);\n } else {\n (callback as () => void).call(this);\n }\n });\n }\n\n return this;\n }\n\n /**\n * Register an event listener that fires only once\n */\n once<E extends keyof Events>(event: E, callback: EventCallback<Events[E]>): this {\n const onceWrapper = ((...args: unknown[]) => {\n this.off(event, onceWrapper);\n\n if (args.length > 0) {\n (callback as (data: unknown) => void).call(this, args[0]);\n } else {\n (callback as () => void).call(this);\n }\n }) as EventCallback<Events[E]>;\n\n return this.on(event, onceWrapper);\n }\n\n /**\n * Remove all listeners for a specific event, or all events if no event specified\n */\n removeAllListeners(event?: keyof Events): this {\n if (event !== undefined) {\n this.callbacks.delete(event);\n } else {\n this.callbacks.clear();\n }\n\n return this;\n }\n\n /**\n * Get the number of listeners for a specific event\n */\n listenerCount(event: keyof Events): number {\n return this.callbacks.get(event)?.size ?? 0;\n }\n\n /**\n * Get all event names that have listeners\n */\n eventNames(): (keyof Events)[] {\n return Array.from(this.callbacks.keys());\n }\n}\n","/**\n * Custom inputRules plugin with built-in Backspace undo.\n *\n * Two enhancements over ProseMirror's built-in inputRules plugin:\n *\n * 1. Preserves undo state across appendTransaction (e.g. TrailingNode).\n * PM's plugin clears state on any docChanged transaction, so\n * appendTransaction handlers that fire after an input rule erase the\n * undo info before the user can press Backspace.\n *\n * 2. Handles Backspace directly via handleKeyDown (highest priority in\n * ProseMirror's event dispatch) so no other keymap can intercept it\n * first. If the plugin has stored undo state, Backspace inverts the\n * input rule steps and restores the original typed text.\n */\nimport { Plugin } from '@domternal/pm/state';\nimport type { InputRule } from '@domternal/pm/inputrules';\nimport type { EditorView } from '@domternal/pm/view';\nimport { TextSelection } from '@domternal/pm/state';\nimport type { EditorState, Transaction } from '@domternal/pm/state';\n\ninterface InternalRule {\n match: RegExp;\n handler: (state: EditorState, match: RegExpExecArray, start: number, end: number) => Transaction | null;\n undoable: boolean;\n inCode: boolean | 'only';\n inCodeMark: boolean;\n}\n\nconst MAX_MATCH = 500;\n\nfunction run(\n view: EditorView,\n from: number,\n to: number,\n text: string,\n rules: InputRule[],\n plugin: Plugin,\n): boolean {\n if (view.composing) return false;\n\n const state = view.state;\n const $from = state.doc.resolve(from);\n const textBefore =\n $from.parent.textBetween(\n Math.max(0, $from.parentOffset - MAX_MATCH),\n $from.parentOffset,\n null,\n '\\ufffc',\n ) + text;\n\n for (const rawRule of rules) {\n const rule = rawRule as InputRule & InternalRule;\n\n if (!rule.inCodeMark && $from.marks().some((m) => m.type.spec.code)) continue;\n if ($from.parent.type.spec.code) {\n if (!rule.inCode) continue;\n } else if (rule.inCode === 'only') {\n continue;\n }\n\n const match = rule.match.exec(textBefore);\n if (!match || match[0].length < text.length) continue;\n\n const startPos = from - (match[0].length - text.length);\n\n if (!rule.inCodeMark) {\n const codeMarks: boolean[] = [];\n state.doc.nodesBetween(startPos, $from.pos, (node) => {\n if (node.isInline && node.marks.some((m) => m.type.spec.code)) codeMarks.push(true);\n });\n if (codeMarks.length > 0) continue;\n }\n\n const tr = rule.handler(state, match, startPos, to);\n if (!tr) continue;\n\n if (rule.undoable) {\n tr.setMeta(plugin, { transform: tr, from, to, text });\n }\n view.dispatch(tr);\n return true;\n }\n return false;\n}\n\ninterface InputRulesState {\n transform: Transaction;\n from: number;\n to: number;\n text: string;\n}\n\n/**\n * Undo the last input rule by inverting its steps and restoring\n * the original typed text.\n */\nfunction undoInputRule(plugin: Plugin, state: EditorState, dispatch?: (tr: Transaction) => void): boolean {\n const undoable = plugin.getState(state) as InputRulesState | null;\n if (!undoable) return false;\n\n if (dispatch) {\n const tr = state.tr;\n const toUndo = undoable.transform;\n for (let j = toUndo.steps.length - 1; j >= 0; j--) {\n const step = toUndo.steps[j];\n const doc = toUndo.docs[j];\n if (step && doc) tr.step(step.invert(doc));\n }\n if (undoable.text) {\n const marks = tr.doc.resolve(undoable.from).marks();\n tr.replaceWith(undoable.from, undoable.to, state.schema.text(undoable.text, marks));\n // Place cursor at the end of the restored text\n const endPos = undoable.from + undoable.text.length;\n if (endPos <= tr.doc.content.size) {\n tr.setSelection(TextSelection.create(tr.doc, endPos));\n }\n } else {\n tr.delete(undoable.from, undoable.to);\n }\n dispatch(tr);\n }\n return true;\n}\n\n/**\n * Creates an input rules plugin with built-in Backspace undo.\n *\n * Drop-in replacement for ProseMirror's `inputRules({ rules })`.\n */\nexport function inputRulesPlugin({ rules }: { rules: InputRule[] }): Plugin {\n const plugin: Plugin = new Plugin({\n state: {\n init(): InputRulesState | null {\n return null;\n },\n apply(tr: Transaction, prev: InputRulesState | null): InputRulesState | null {\n const stored = tr.getMeta(plugin) as InputRulesState | undefined;\n if (stored) return stored;\n\n // Preserve state across appendTransaction (e.g. TrailingNode)\n if (tr.getMeta('appendedTransaction')) return prev;\n\n return tr.selectionSet || tr.docChanged ? null : prev;\n },\n },\n props: {\n handleTextInput(view: EditorView, from: number, to: number, text: string) {\n return run(view, from, to, text, rules, plugin);\n },\n handleKeyDown(view: EditorView, event: KeyboardEvent) {\n // Intercept Backspace to undo the last input rule.\n // handleKeyDown fires before any keymap plugin, so this\n // cannot be blocked by extension Backspace handlers.\n if (event.key === 'Backspace' && !event.ctrlKey && !event.metaKey && !event.altKey) {\n return undoInputRule(plugin, view.state, (tr) => { view.dispatch(tr); });\n }\n return false;\n },\n handleDOMEvents: {\n compositionend: (view: EditorView) => {\n setTimeout(() => {\n const { $cursor } = view.state.selection as { $cursor?: { pos: number } };\n if ($cursor) { run(view, $cursor.pos, $cursor.pos, '', rules, plugin); }\n });\n },\n },\n },\n // Tag so external undoInputRule can also find this plugin\n isInputRules: true,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } as ConstructorParameters<typeof Plugin<any>>[0] & { isInputRules: boolean });\n\n return plugin;\n}\n","/**\n * callOrReturn - Helper for context binding in extension config\n *\n * Used to call config functions with proper `this` context,\n * or return the value directly if it's not a function.\n *\n * This enables patterns like:\n * ```typescript\n * const Bold = Mark.create({\n * name: 'bold',\n * addCommands() {\n * return {\n * toggleBold: () => ({ commands }) => {\n * return commands.toggleMark(this.name); // this.name = 'bold'\n * },\n * };\n * },\n * });\n * ```\n */\n\n/**\n * Calls a function with the given context, or returns the value if not a function\n *\n * @param value - Function to call or value to return\n * @param context - The `this` context to bind when calling the function\n * @param args - Additional arguments to pass to the function\n * @returns The function result or the value itself\n */\nexport function callOrReturn<T>(\n value: T | ((...args: unknown[]) => T),\n context: unknown,\n ...args: unknown[]\n): T {\n if (typeof value === 'function') {\n return (value as (...args: unknown[]) => T).call(context, ...args);\n }\n return value;\n}\n","/**\n * ExtensionManager - manages extensions and schema.\n *\n * Handles:\n * - Extension lifecycle (flatten, resolve, bind)\n * - Schema building from Node/Mark extensions\n * - Plugin collection from all extensions\n * - Extension storage management\n * - Conflict detection (duplicate extension names)\n */\nimport { Schema } from '@domternal/pm/model';\nimport type { NodeSpec, MarkSpec } from '@domternal/pm/model';\nimport type { Plugin, Transaction } from '@domternal/pm/state';\nimport type { NodeViewConstructor } from '@domternal/pm/view';\nimport { keymap } from '@domternal/pm/keymap';\nimport type { InputRule } from '@domternal/pm/inputrules';\nimport { inputRulesPlugin as createInputRulesPlugin } from './helpers/inputRulesPlugin.js';\n\nimport type { Command as PMCommand } from '@domternal/pm/state';\n\nimport type { AnyExtension } from './types/EditorOptions.js';\nimport type { CommandMap } from './types/Commands.js';\nimport type { GlobalAttributes, GlobalAttributeSpec } from './types/ExtensionConfig.js';\nimport type { ToolbarItem } from './types/Toolbar.js';\nimport type { FloatingMenuItem } from './types/FloatingMenu.js';\nimport type { Extension } from './Extension.js';\nimport type { Node } from './Node.js';\nimport type { Mark } from './Mark.js';\nimport { callOrReturn } from './helpers/callOrReturn.js';\n\n/**\n * Error event props for safeCall\n */\ninterface ErrorEventProps {\n error: Error;\n context: string;\n}\n\n/**\n * Editor interface for ExtensionManager\n * Forward declaration to avoid circular dependency\n */\nexport interface ExtensionManagerEditor {\n readonly schema: Schema;\n emit?(event: 'error', props: ErrorEventProps): void;\n}\n\n/**\n * Context attached to node view constructors for framework wrappers.\n * Accessible via `(constructor as any).__domternalContext`.\n */\nexport interface NodeViewContext {\n editor: ExtensionManagerEditor;\n extension: { name: string; options: Record<string, unknown> };\n}\n\n/**\n * Options for ExtensionManager constructor\n */\nexport interface ExtensionManagerOptions {\n /**\n * Extensions to process\n * If provided, schema is built from extensions\n */\n extensions?: AnyExtension[] | undefined;\n\n /**\n * Direct schema. If provided, extensions are ignored for schema building.\n */\n schema?: Schema | undefined;\n}\n\n/**\n * Manages editor extensions and schema\n *\n * Supports two modes:\n * 1. Extensions mode: Schema built from Node/Mark extensions\n * 2. Schema mode: Direct schema passed (backward compatible)\n */\n/**\n * Merge HTML attribute objects, concatenating 'style' and 'class' values\n * instead of overwriting them.\n */\nfunction mergeHTMLAttrs(\n target: Record<string, unknown>,\n source: Record<string, unknown>\n): Record<string, unknown> {\n const result = { ...target };\n\n for (const [key, value] of Object.entries(source)) {\n if (key === 'style' && typeof result[key] === 'string' && typeof value === 'string') {\n result[key] = `${result[key]}; ${value}`;\n } else if (key === 'class' && typeof result[key] === 'string' && typeof value === 'string') {\n result[key] = `${result[key]} ${value}`;\n } else {\n result[key] = value;\n }\n }\n\n return result;\n}\n\nexport class ExtensionManager {\n /**\n * Processed extensions (flattened, sorted by priority)\n */\n private readonly _extensions: AnyExtension[];\n\n /**\n * ProseMirror schema (built from extensions or passed directly)\n */\n private readonly _schema: Schema;\n\n /**\n * Reference to the editor instance\n */\n readonly editor: ExtensionManagerEditor;\n\n /**\n * Extension storage (keyed by extension name)\n */\n private readonly _storage: Record<string, unknown> = {};\n\n /**\n * Whether the manager has been destroyed\n */\n private isDestroyed = false;\n\n /**\n * Cached plugins (built lazily)\n */\n private _plugins: Plugin[] | null = null;\n\n /**\n * Cached commands (collected lazily)\n */\n private _commands: CommandMap | null = null;\n\n /**\n * Cached toolbar items (collected lazily)\n */\n private _toolbarItems: ToolbarItem[] | null = null;\n\n /**\n * Cached floating-menu items (collected lazily)\n */\n private _floatingMenuItems: FloatingMenuItem[] | null = null;\n\n /**\n * Cached node views (collected lazily)\n */\n private _nodeViews: Record<string, NodeViewConstructor> | null = null;\n\n /**\n * Creates a new ExtensionManager\n *\n * @param options - Extensions or direct schema\n * @param editor - Editor instance\n */\n constructor(options: ExtensionManagerOptions, editor: ExtensionManagerEditor) {\n this.editor = editor;\n\n // Schema mode (backward compatibility)\n if (options.schema) {\n this._extensions = [];\n this._schema = options.schema;\n return;\n }\n\n // Extensions mode\n if (!options.extensions || options.extensions.length === 0) {\n throw new Error(\n 'ExtensionManager requires either extensions or schema. ' +\n 'Provide at least Document, Text, and Paragraph extensions.'\n );\n }\n\n // Process extensions following the pipeline:\n // 1. Flatten (expand addExtensions)\n // 2. Deduplicate (keep last occurrence - explicit configs override auto-included defaults)\n // 3. Clone (per-editor instances; see cloneExtensions)\n // 4. Resolve (sort by priority)\n // 5. Detect conflicts\n // 6. Check dependencies\n // 7. Bind editor to extensions\n // 8. Build schema\n // 9. Initialize storage\n\n const flattened = this.flattenExtensions(options.extensions);\n const deduped = this.deduplicateExtensions(flattened);\n const cloned = this.cloneExtensions(deduped);\n this._extensions = this.resolveExtensions(cloned);\n this.detectConflicts();\n this.checkDependencies();\n this.bindEditorToExtensions();\n this._schema = this.buildSchema();\n this.initializeStorage();\n }\n\n // === Getters ===\n\n /**\n * Gets the processed extensions array\n */\n get extensions(): readonly AnyExtension[] {\n return this._extensions;\n }\n\n /**\n * Gets the ProseMirror schema\n */\n get schema(): Schema {\n return this._schema;\n }\n\n /**\n * Gets extension storage (accessed via editor.storage)\n */\n get storage(): Record<string, unknown> {\n return this._storage;\n }\n\n /**\n * Gets plugins from all extensions\n * Cached after first call\n */\n get plugins(): Plugin[] {\n this._plugins ??= this.buildPlugins();\n return this._plugins;\n }\n\n /**\n * Gets commands from all extensions\n */\n get commands(): CommandMap {\n this._commands ??= this.collectCommands();\n return this._commands;\n }\n\n /**\n * Gets toolbar items from all extensions\n * Cached after first call\n */\n get toolbarItems(): ToolbarItem[] {\n this._toolbarItems ??= this.collectToolbarItems();\n return this._toolbarItems;\n }\n\n /**\n * Gets floating-menu items from all extensions\n * Cached after first call\n */\n get floatingMenuItems(): FloatingMenuItem[] {\n this._floatingMenuItems ??= this.collectFloatingMenuItems();\n return this._floatingMenuItems;\n }\n\n /**\n * Gets node views from all Node extensions that define addNodeView\n */\n get nodeViews(): Record<string, NodeViewConstructor> {\n this._nodeViews ??= this.collectNodeViews();\n return this._nodeViews;\n }\n\n // === Cache Invalidation ===\n\n /**\n * Clears all caches (plugins, commands)\n * Call when extensions change dynamically\n */\n clearAllCaches(): void {\n this._plugins = null;\n this._commands = null;\n this._toolbarItems = null;\n this._floatingMenuItems = null;\n this._nodeViews = null;\n }\n\n // === Extension Processing ===\n\n /**\n * Recursively flattens extensions by expanding addExtensions()\n * This allows extension bundles like StarterKit to work\n */\n private flattenExtensions(extensions: AnyExtension[]): AnyExtension[] {\n const result: AnyExtension[] = [];\n\n for (const ext of extensions) {\n result.push(ext);\n\n // Check for nested extensions (bundles like StarterKit)\n const nested = callOrReturn(\n (ext as Extension).config.addExtensions,\n ext\n ) as AnyExtension[] | undefined;\n\n if (nested && nested.length > 0) {\n result.push(...this.flattenExtensions(nested));\n }\n }\n\n return result;\n }\n\n /**\n * Removes duplicate extensions by name, keeping the last occurrence.\n * This allows parent extensions to auto-include children via addExtensions()\n * while letting users override with explicitly configured versions.\n */\n private deduplicateExtensions(extensions: AnyExtension[]): AnyExtension[] {\n const seen = new Map<string, number>();\n for (let i = 0; i < extensions.length; i++) {\n const ext = extensions[i];\n if (ext) seen.set(ext.name, i);\n }\n return extensions.filter((ext, i) => seen.get(ext.name) === i);\n }\n\n /**\n * Clone every extension so this editor owns its instances. Extensions hold\n * per-editor mutable state (`editor`, plus the `nodeType`/`markType` getters\n * derived from it), and the same extension object is commonly reused across\n * editors (one shared `extensions` array). Without cloning, binding a later\n * editor clobbers an earlier one: its list `Enter` then falls back to a plain\n * block split, dropping an indented \"child\" paragraph instead of a new `<li>`.\n */\n private cloneExtensions(extensions: AnyExtension[]): AnyExtension[] {\n return extensions.map((ext) => (ext as Extension).clone() as AnyExtension);\n }\n\n /**\n * Sorts extensions by priority (higher priority first)\n * Default priority is 100\n */\n private resolveExtensions(extensions: AnyExtension[]): AnyExtension[] {\n return [...extensions].sort((a, b) => {\n const priorityA = (a as Extension).config.priority ?? 100;\n const priorityB = (b as Extension).config.priority ?? 100;\n return priorityB - priorityA;\n });\n }\n\n /**\n * Detects duplicate extension names.\n * @throws Error if duplicate names found\n */\n private detectConflicts(): void {\n const names = new Set<string>();\n\n for (const ext of this._extensions) {\n if (names.has(ext.name)) {\n throw new Error(\n `Extension name conflict: \"${ext.name}\" is defined multiple times. ` +\n `Each extension must have a unique name.`\n );\n }\n names.add(ext.name);\n }\n }\n\n /**\n * Validates that all extension dependencies are present\n * @throws Error if required dependency is missing\n */\n private checkDependencies(): void {\n const extensionNames = new Set(this._extensions.map((e) => e.name));\n\n for (const ext of this._extensions) {\n const deps = (ext as Extension).config.dependencies;\n if (!deps) continue;\n\n for (const dep of deps) {\n if (!extensionNames.has(dep)) {\n throw new Error(\n `Extension \"${ext.name}\" requires \"${dep}\" extension. ` +\n `Please add it to your extensions array.`\n );\n }\n }\n }\n }\n\n /**\n * Sets editor reference on all extensions\n */\n private bindEditorToExtensions(): void {\n for (const ext of this._extensions) {\n (ext as Extension).editor = this.editor as ExtensionManagerEditor &\n Extension['editor'];\n }\n }\n\n /**\n * Collects global attributes from all extensions.\n * Returns a map of type name -> attribute specs to merge.\n */\n private collectGlobalAttributes(): Map<string, Record<string, GlobalAttributeSpec>> {\n const globalAttrs = new Map<string, Record<string, GlobalAttributeSpec>>();\n\n for (const ext of this._extensions) {\n const addGlobalAttributes = (ext as Extension).config.addGlobalAttributes;\n if (!addGlobalAttributes) continue;\n\n const attrs = this.safeCall(\n () => callOrReturn(addGlobalAttributes, ext) as GlobalAttributes[] | undefined,\n `${ext.name}.addGlobalAttributes`\n );\n\n if (!attrs) continue;\n\n for (const { types, attributes } of attrs) {\n for (const typeName of types) {\n const existing = globalAttrs.get(typeName) ?? {};\n globalAttrs.set(typeName, { ...existing, ...attributes });\n }\n }\n }\n\n return globalAttrs;\n }\n\n /**\n * Applies global attributes to a node or mark spec.\n * Merges extra attrs into spec.attrs, wraps parseDOM getAttrs to parse\n * global attributes from DOM elements, and wraps toDOM to inject rendered\n * global HTML attributes into the output.\n */\n private applyGlobalAttributes(\n spec: NodeSpec | MarkSpec,\n extraAttrs: Record<string, GlobalAttributeSpec>,\n ): void {\n // 1. Convert global attrs to PM attrs and merge\n const convertedAttrs: Record<string, { default?: unknown }> = {};\n for (const [attrName, attrSpec] of Object.entries(extraAttrs)) {\n convertedAttrs[attrName] = { default: attrSpec.default };\n }\n spec.attrs = { ...spec.attrs, ...convertedAttrs };\n\n // 2. Wrap parseDOM handlers to include global attribute parsing\n if (spec.parseDOM) {\n spec.parseDOM = spec.parseDOM.map((rule) => {\n const originalGetAttrs = rule.getAttrs as\n | ((dom: HTMLElement | string) => Record<string, unknown> | false | null)\n | undefined;\n return {\n ...rule,\n getAttrs: (dom: HTMLElement | string) => {\n const baseAttrs = originalGetAttrs\n ? originalGetAttrs(dom)\n : rule.attrs ?? {};\n\n if (baseAttrs === false) return false;\n\n // Parse global attributes from DOM (only if element, not style string)\n const globalParsed: Record<string, unknown> = {};\n if (typeof dom !== 'string') {\n for (const [name, attrSpec] of Object.entries(extraAttrs)) {\n if (attrSpec.parseHTML) {\n globalParsed[name] = attrSpec.parseHTML(dom);\n }\n }\n }\n\n return { ...baseAttrs, ...globalParsed };\n },\n };\n });\n }\n\n // 3. Wrap toDOM to inject rendered global HTML attributes\n const originalToDOM = spec.toDOM;\n if (originalToDOM) {\n // Use a generic wrapper - first arg is always a node or mark with .attrs\n const wrappedToDOM = (...args: unknown[]): unknown => {\n const result = (originalToDOM as (...a: unknown[]) => unknown)(...args);\n if (!Array.isArray(result)) return result;\n\n // First arg is always the node or mark, which has .attrs\n const nodeOrMark = args[0] as { attrs: Record<string, unknown> };\n\n let extraHtmlAttrs: Record<string, string> = {};\n for (const [, attrSpec] of Object.entries(extraAttrs)) {\n if (attrSpec.renderHTML) {\n const rendered = attrSpec.renderHTML(nodeOrMark.attrs);\n if (rendered) {\n extraHtmlAttrs = mergeHTMLAttrs(extraHtmlAttrs, rendered) as Record<string, string>;\n }\n }\n }\n\n // Merge into result[1] if it's an attributes object\n if (\n result.length >= 2 &&\n typeof result[1] === 'object' &&\n result[1] !== null &&\n !Array.isArray(result[1])\n ) {\n const existingAttrs = result[1] as Record<string, unknown>;\n result[1] = { ...existingAttrs, ...extraHtmlAttrs };\n } else if (Object.keys(extraHtmlAttrs).length > 0) {\n // Insert attributes object at position 1\n const rest = result.slice(1) as unknown[];\n return [result[0], extraHtmlAttrs, ...rest];\n }\n\n return result;\n };\n // Cast needed: wrappedToDOM is generic but spec.toDOM expects specific signatures.\n // The wrapper preserves the original signature by forwarding all arguments.\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any\n (spec as any).toDOM = wrappedToDOM;\n }\n }\n\n /**\n * Builds ProseMirror Schema from Node and Mark extensions\n */\n private buildSchema(): Schema {\n // First, collect global attributes from all extensions\n const globalAttrs = this.collectGlobalAttributes();\n\n const nodes: Record<string, NodeSpec> = {};\n const marks: Record<string, MarkSpec> = {};\n let topNode: string | undefined;\n\n for (const ext of this._extensions) {\n if (ext.type === 'node') {\n const nodeExt = ext as Node;\n const spec = nodeExt.createNodeSpec();\n\n const extraAttrs = globalAttrs.get(ext.name);\n if (extraAttrs) {\n this.applyGlobalAttributes(spec, extraAttrs);\n }\n\n nodes[ext.name] = spec;\n\n // Check for topNode (usually 'doc')\n if (nodeExt.config.topNode) {\n topNode = ext.name;\n }\n } else if (ext.type === 'mark') {\n const markExt = ext as Mark;\n const spec = markExt.createMarkSpec();\n\n const extraAttrs = globalAttrs.get(ext.name);\n if (extraAttrs) {\n this.applyGlobalAttributes(spec, extraAttrs);\n }\n\n marks[ext.name] = spec;\n }\n }\n\n return new Schema({\n nodes,\n marks,\n ...(topNode && { topNode }),\n });\n }\n\n /**\n * Initializes storage for all extensions\n */\n private initializeStorage(): void {\n for (const ext of this._extensions) {\n const storageFactory = (ext as Extension).config.addStorage;\n if (storageFactory) {\n const storage = this.safeCall(\n () => callOrReturn(storageFactory, ext),\n `${ext.name}.addStorage`\n );\n if (storage !== undefined) {\n this._storage[ext.name] = storage;\n (ext as Extension).storage = storage;\n }\n }\n // Always expose ext.storage via editor.storage[name], even for\n // extensions without addStorage(). The Extension constructor\n // initialises storage to {} by default - make it accessible.\n if (!(ext.name in this._storage)) {\n this._storage[ext.name] = (ext as Extension).storage;\n }\n }\n }\n\n // === Plugin Collection ===\n\n /**\n * Builds all ProseMirror plugins from extensions\n */\n private buildPlugins(): Plugin[] {\n const plugins: Plugin[] = [];\n\n // Collect input rules and create inputRules plugin.\n // The plugin includes a built-in Backspace handler (via handleKeyDown)\n // that undoes the last input rule before any keymap plugin can intercept it.\n const rules = this.collectInputRules();\n if (rules.length > 0) {\n plugins.push(createInputRulesPlugin({ rules }));\n }\n\n // Collect keyboard shortcuts and create keymap plugin\n const shortcuts = this.collectKeyboardShortcuts();\n if (Object.keys(shortcuts).length > 0) {\n plugins.push(keymap(shortcuts));\n }\n\n // Collect custom plugins from extensions\n for (const ext of this._extensions) {\n const addPlugins = (ext as Extension).config.addProseMirrorPlugins;\n if (addPlugins) {\n const extPlugins = this.safeCall(\n () => callOrReturn(addPlugins, ext) as Plugin[] | undefined,\n `${ext.name}.addProseMirrorPlugins`\n );\n if (extPlugins && extPlugins.length > 0) {\n plugins.push(...extPlugins);\n }\n }\n }\n\n return plugins;\n }\n\n /**\n * Collects keyboard shortcuts from all extensions\n * Returns ProseMirror-compatible commands for keymap plugin\n *\n * Note: Extensions should return PM-compatible commands from addKeyboardShortcuts()\n */\n private collectKeyboardShortcuts(): Record<string, PMCommand> {\n const shortcuts: Record<string, PMCommand> = {};\n\n for (const ext of this._extensions) {\n const addShortcuts = (ext as Extension).config.addKeyboardShortcuts;\n if (addShortcuts) {\n const extShortcuts = this.safeCall(\n () => callOrReturn(addShortcuts, ext),\n `${ext.name}.addKeyboardShortcuts`\n );\n if (extShortcuts) {\n const cast = extShortcuts as unknown as Record<string, PMCommand>;\n for (const [key, handler] of Object.entries(cast)) {\n if (shortcuts[key]) {\n // Chain: try new handler first, fall back to previous\n const prev = shortcuts[key];\n shortcuts[key] = (state, dispatch, view) => {\n return handler(state, dispatch, view) || prev(state, dispatch, view);\n };\n } else {\n shortcuts[key] = handler;\n }\n }\n }\n }\n }\n\n return shortcuts;\n }\n\n /**\n * Collects input rules from all extensions\n */\n private collectInputRules(): InputRule[] {\n const rules: InputRule[] = [];\n\n for (const ext of this._extensions) {\n const addRules = (ext as Extension).config.addInputRules;\n if (addRules) {\n const extRules = this.safeCall(\n () => callOrReturn(addRules, ext) as InputRule[] | undefined,\n `${ext.name}.addInputRules`\n );\n if (extRules && extRules.length > 0) {\n rules.push(...extRules);\n }\n }\n }\n\n return rules;\n }\n\n /**\n * Collects commands from all extensions\n *\n * Note: Commands with the same name will be overwritten by later extensions\n * (lower priority extensions override higher priority). This is intentional\n * to allow customization of built-in commands.\n */\n private collectCommands(): CommandMap {\n const commands: CommandMap = {};\n\n for (const ext of this._extensions) {\n const addCommands = (ext as Extension).config.addCommands;\n if (addCommands) {\n const extCommands = this.safeCall(\n () => callOrReturn(addCommands, ext) as CommandMap | undefined,\n `${ext.name}.addCommands`\n );\n if (extCommands) {\n // Later extensions override earlier ones (intentional for customization)\n Object.assign(commands, extCommands);\n }\n }\n }\n\n return commands;\n }\n\n /**\n * Collects toolbar items from all extensions\n */\n private collectToolbarItems(): ToolbarItem[] {\n const items: ToolbarItem[] = [];\n\n for (const ext of this._extensions) {\n const addItems = (ext as Extension).config.addToolbarItems;\n if (addItems) {\n const extItems = this.safeCall(\n () => callOrReturn(addItems, ext) as ToolbarItem[] | undefined,\n `${ext.name}.addToolbarItems`\n );\n if (extItems && extItems.length > 0) {\n items.push(...extItems);\n }\n }\n }\n\n return items;\n }\n\n /**\n * Collects floating-menu items from all extensions via `addFloatingMenuItems()`.\n */\n private collectFloatingMenuItems(): FloatingMenuItem[] {\n const items: FloatingMenuItem[] = [];\n\n for (const ext of this._extensions) {\n const addItems = (ext as Extension).config.addFloatingMenuItems;\n if (addItems) {\n const extItems = this.safeCall(\n () => callOrReturn(addItems, ext) as FloatingMenuItem[] | undefined,\n `${ext.name}.addFloatingMenuItems`\n );\n if (extItems && extItems.length > 0) {\n items.push(...extItems);\n }\n }\n }\n\n return items;\n }\n\n /**\n * Collects node views from all Node extensions.\n * Returns a map of node name to NodeViewConstructor for EditorView.\n *\n * Each constructor is annotated with `__domternalContext` containing\n * the editor and extension metadata so framework wrappers (React, Vue)\n * can access them without changing the ProseMirror calling convention.\n */\n private collectNodeViews(): Record<string, NodeViewConstructor> {\n const nodeViews: Record<string, NodeViewConstructor> = {};\n\n for (const ext of this._extensions) {\n if (ext.type !== 'node') continue;\n const nodeExt = ext as Node;\n const addNodeView = nodeExt.config.addNodeView;\n if (addNodeView) {\n const nodeView = this.safeCall(\n () => callOrReturn(addNodeView, nodeExt) as NodeViewConstructor | undefined,\n `${ext.name}.addNodeView`\n );\n if (nodeView) {\n // Annotate with editor + extension context for framework wrappers\n (nodeView as NodeViewConstructor & { __domternalContext?: NodeViewContext }).__domternalContext = {\n editor: this.editor,\n extension: { name: nodeExt.name, options: nodeExt.options as Record<string, unknown> },\n };\n nodeViews[ext.name] = nodeView;\n }\n }\n }\n\n return nodeViews;\n }\n\n // === Validation ===\n\n /**\n * Validates that the schema has required nodes\n * @throws Error if schema is missing 'doc' or 'text' nodes\n */\n validateSchema(): void {\n if (this.isDestroyed) {\n throw new Error('ExtensionManager has been destroyed');\n }\n\n const { nodes } = this._schema.spec;\n\n if (!nodes.get('doc')) {\n throw new Error(\n 'Invalid schema: missing required \"doc\" node. ' +\n 'The schema must define a \"doc\" node as the document root.'\n );\n }\n\n if (!nodes.get('text')) {\n throw new Error(\n 'Invalid schema: missing required \"text\" node. ' +\n 'The schema must define a \"text\" node for inline text content.'\n );\n }\n }\n\n // === Lifecycle ===\n\n /**\n * Cleans up the extension manager\n * Calls onDestroy on all extensions and clears all caches\n */\n destroy(): void {\n if (this.isDestroyed) {\n return;\n }\n\n // Call onDestroy on all extensions (wrapped in safeCall)\n for (const ext of this._extensions) {\n const onDestroy = (ext as Extension).config.onDestroy;\n if (onDestroy) {\n this.safeCall(() => {\n callOrReturn(onDestroy, ext);\n }, `${ext.name}.onDestroy`);\n }\n }\n\n // Clear all caches to prevent memory leaks\n // Note: ProseMirror's EditorView.destroy() handles plugin view cleanup\n // Storage is not cleared explicitly - it will be garbage collected\n // when the ExtensionManager instance is no longer referenced\n this.clearAllCaches();\n\n this.isDestroyed = true;\n }\n\n // === Error Handling (2.7: Extension Error Isolation) ===\n\n /**\n * Safely executes a function, catching and reporting errors\n * Prevents a single extension error from crashing the entire editor\n *\n * Handles both synchronous errors and async promise rejections.\n *\n * @param fn - Function to execute\n * @param context - Context for error reporting (e.g., 'Bold.onUpdate')\n * @returns The function result, or undefined if an error occurred\n */\n safeCall<T>(fn: () => T, context: string): T | undefined {\n try {\n const result = fn();\n\n // Handle async functions - catch promise rejections\n if (result instanceof Promise) {\n result.catch((error: unknown) => {\n const errorObj = error instanceof Error ? error : new Error(String(error));\n this.editor.emit?.('error', { error: errorObj, context });\n });\n }\n\n return result;\n } catch (error) {\n const errorObj = error instanceof Error ? error : new Error(String(error));\n\n // Emit error event (Editor will call onError callback via event listener)\n this.editor.emit?.('error', { error: errorObj, context });\n\n return undefined;\n }\n }\n\n // === Extension Lifecycle Hook Calls ===\n\n /**\n * Calls onBeforeCreate on all extensions\n */\n callOnBeforeCreate(): void {\n for (const ext of this._extensions) {\n const hook = (ext as Extension).config.onBeforeCreate;\n if (hook) {\n this.safeCall(() => {\n callOrReturn(hook, ext);\n }, `${ext.name}.onBeforeCreate`);\n }\n }\n }\n\n /**\n * Calls onCreate on all extensions\n */\n callOnCreate(): void {\n for (const ext of this._extensions) {\n const hook = (ext as Extension).config.onCreate;\n if (hook) {\n this.safeCall(() => {\n callOrReturn(hook, ext);\n }, `${ext.name}.onCreate`);\n }\n }\n }\n\n /**\n * Calls onUpdate on all extensions\n */\n callOnUpdate(): void {\n for (const ext of this._extensions) {\n const hook = (ext as Extension).config.onUpdate;\n if (hook) {\n this.safeCall(() => {\n callOrReturn(hook, ext);\n }, `${ext.name}.onUpdate`);\n }\n }\n }\n\n /**\n * Calls onSelectionUpdate on all extensions\n */\n callOnSelectionUpdate(): void {\n for (const ext of this._extensions) {\n const hook = (ext as Extension).config.onSelectionUpdate;\n if (hook) {\n this.safeCall(() => {\n callOrReturn(hook, ext);\n }, `${ext.name}.onSelectionUpdate`);\n }\n }\n }\n\n /**\n * Calls onTransaction on all extensions\n * @param props - Transaction props\n */\n callOnTransaction(props: { transaction: Transaction }): void {\n for (const ext of this._extensions) {\n const hook = (ext as Extension).config.onTransaction;\n if (hook) {\n this.safeCall(() => {\n hook.call(ext, props);\n }, `${ext.name}.onTransaction`);\n }\n }\n }\n\n /**\n * Calls onFocus on all extensions\n * @param props - Focus event props\n */\n callOnFocus(props: { event: FocusEvent }): void {\n for (const ext of this._extensions) {\n const hook = (ext as Extension).config.onFocus;\n if (hook) {\n this.safeCall(() => {\n hook.call(ext, props);\n }, `${ext.name}.onFocus`);\n }\n }\n }\n\n /**\n * Calls onBlur on all extensions\n * @param props - Blur event props\n */\n callOnBlur(props: { event: FocusEvent }): void {\n for (const ext of this._extensions) {\n const hook = (ext as Extension).config.onBlur;\n if (hook) {\n this.safeCall(() => {\n hook.call(ext, props);\n }, `${ext.name}.onBlur`);\n }\n }\n }\n}\n","/**\n * Selection commands - focus, blur, selectAll, selectNodeBackward, deleteSelection\n */\nimport { TextSelection, AllSelection } from '@domternal/pm/state';\nimport type { EditorView } from '@domternal/pm/view';\nimport { selectNodeBackward as pmSelectNodeBackward } from '@domternal/pm/commands';\nimport type { CommandSpec } from '../types/Commands.js';\nimport type { FocusPosition } from '../types/index.js';\n\n/**\n * Resolves focus position to a numeric position in the document\n *\n * Uses the provided doc (tr.doc) rather than view.state.doc to support\n * chain context where prior commands may have modified the document.\n */\nfunction resolveFocusPosition(\n doc: { content: { size: number } },\n position: FocusPosition\n): number | null {\n if (position === null || position === false) {\n return null;\n }\n\n if (position === true || position === 'end') {\n return doc.content.size - 1;\n }\n\n if (position === 'start') {\n return 1;\n }\n\n if (position === 'all') {\n return null;\n }\n\n if (typeof position === 'number') {\n return Math.max(0, Math.min(position, doc.content.size));\n }\n\n return null;\n}\n\n/**\n * Focus command - focuses the editor at the specified position\n *\n * @param position - Where to place the cursor\n * - true/'end': End of document\n * - 'start': Start of document\n * - 'all': Select all content\n * - number: Specific position\n * - null/false: Just focus without changing selection\n */\nexport const focus: CommandSpec<[position?: FocusPosition]> =\n (position: FocusPosition = null) =>\n ({ editor, tr, dispatch }) => {\n const view = editor.view as EditorView;\n\n // Check if view is attached to DOM (dry-run always returns true)\n if (!dispatch) {\n return true;\n }\n\n if (!view.dom.isConnected) {\n return false;\n }\n\n // Focus the editor\n view.focus();\n\n if (position === 'all') {\n const selection = new AllSelection(tr.doc);\n dispatch(tr.setSelection(selection));\n return true;\n }\n\n // Resolve position\n const resolvedPos = resolveFocusPosition(tr.doc, position);\n\n if (resolvedPos !== null) {\n // Use TextSelection.near() to find nearest valid text position\n // (e.g., position 1 inside a blockquote resolves to the paragraph within)\n const $pos = tr.doc.resolve(resolvedPos);\n const selection = TextSelection.near($pos);\n dispatch(tr.setSelection(selection));\n } else {\n dispatch(tr);\n }\n\n return true;\n };\n\n/**\n * Blur command - removes focus from the editor\n */\nexport const blur: CommandSpec =\n () =>\n ({ editor, dispatch }) => {\n const view = editor.view as EditorView;\n\n if (!dispatch) {\n return true;\n }\n\n // blur() is not part of ProseMirror API, but works on the DOM element\n view.dom.blur();\n return true;\n };\n\n/**\n * SelectAll command - selects all content in the editor\n *\n * Uses AllSelection to select the entire document.\n * Uses tr.doc to support chain context.\n */\nexport const selectAll: CommandSpec =\n () =>\n ({ tr, dispatch }) => {\n if (!dispatch) {\n return true;\n }\n\n tr.setSelection(new AllSelection(tr.doc));\n dispatch(tr);\n return true;\n };\n\n/**\n * SelectNodeBackward command - selects the node before the cursor\n *\n * When the cursor is at the start of a textblock, this selects the node before it.\n */\nexport const selectNodeBackward: CommandSpec =\n () =>\n ({ state, dispatch }) => {\n return pmSelectNodeBackward(state, dispatch);\n };\n\n/**\n * DeleteSelection command - deletes the current selection\n *\n * Uses tr.selection to support chain context.\n */\nexport const deleteSelection: CommandSpec =\n () =>\n ({ tr, dispatch }) => {\n const { empty, from, to } = tr.selection;\n\n if (empty) {\n return false;\n }\n\n if (!dispatch) {\n return true;\n }\n\n tr.deleteRange(from, to);\n dispatch(tr);\n return true;\n };\n","/**\n * Create a ProseMirror document from content\n *\n * Supports JSON and HTML content formats (AD-11).\n * Plain text is NOT supported - use HTML or JSON explicitly.\n */\nimport type { Schema} from '@domternal/pm/model';\nimport { Node as PMNode, DOMParser } from '@domternal/pm/model';\nimport type { Content, JSONContent } from '../types/index.js';\n\n/**\n * Options for createDocument\n */\nexport interface CreateDocumentOptions {\n /**\n * Parse options passed to DOMParser\n */\n parseOptions?: Parameters<DOMParser['parse']>[1];\n}\n\n/**\n * Checks if content is a JSON object (has 'type' property)\n */\nfunction isJSONContent(content: unknown): content is JSONContent {\n return (\n typeof content === 'object' &&\n content !== null &&\n 'type' in content &&\n typeof (content as JSONContent).type === 'string'\n );\n}\n\n/**\n * Checks if content is an HTML string (starts with '<')\n *\n * SECURITY NOTE: This function only checks if the string looks like HTML.\n * It does NOT sanitize content. If you're accepting user-provided content,\n * sanitize it before passing to the editor (e.g., using DOMPurify).\n */\nfunction isHTMLContent(content: unknown): content is string {\n return typeof content === 'string' && content.trim().startsWith('<');\n}\n\n/**\n * Creates an empty document with a single empty paragraph\n */\nfunction createEmptyDocument(schema: Schema): PMNode {\n const paragraphType = schema.nodes['paragraph'];\n\n if (paragraphType) {\n return schema.node('doc', null, [paragraphType.create()]);\n }\n\n // Fallback: create doc with whatever the first block type is\n // Try to find the first allowed node type\n for (const [name, nodeType] of Object.entries(schema.nodes)) {\n if (name !== 'doc' && name !== 'text' && nodeType.isBlock) {\n return schema.node('doc', null, [nodeType.create()]);\n }\n }\n\n // Last resort: empty doc (might be invalid for some schemas)\n return schema.node('doc', null, []);\n}\n\n/**\n * Parses HTML string into a ProseMirror document\n */\nfunction parseHTMLContent(\n html: string,\n schema: Schema,\n options?: CreateDocumentOptions\n): PMNode {\n // Create a temporary DOM element to parse the HTML\n const element = document.createElement('div');\n element.innerHTML = html;\n\n const parser = DOMParser.fromSchema(schema);\n return parser.parse(element, options?.parseOptions);\n}\n\n/**\n * Creates a ProseMirror document from content\n *\n * **Security:** Content is NOT sanitized. If accepting user-provided HTML,\n * sanitize it first (e.g., using DOMPurify) to prevent XSS attacks.\n *\n * @param content - JSON content object, HTML string, or null/undefined\n * @param schema - ProseMirror schema to use\n * @param options - Optional parse options\n * @returns ProseMirror Node (document)\n *\n * @throws Error if content format is invalid (plain text without HTML tags)\n *\n * @example\n * ```ts\n * // JSON content\n * const doc = createDocument(\n * { type: 'doc', content: [{ type: 'paragraph' }] },\n * schema\n * );\n *\n * // HTML content\n * const doc = createDocument('<p>Hello world</p>', schema);\n *\n * // Empty document\n * const doc = createDocument(null, schema);\n * ```\n */\nexport function createDocument(\n content: Content | null | undefined,\n schema: Schema,\n options?: CreateDocumentOptions\n): PMNode {\n // Handle null/undefined/empty string - create empty document\n if (content === null || content === undefined || content === '') {\n return createEmptyDocument(schema);\n }\n\n // Handle JSON content\n if (isJSONContent(content)) {\n return PMNode.fromJSON(schema, content);\n }\n\n // Handle HTML string\n if (isHTMLContent(content)) {\n return parseHTMLContent(content, schema, options);\n }\n\n // Handle plain text string (not allowed per AD-11)\n if (typeof content === 'string') {\n throw new Error(\n 'Invalid content format: plain text is not supported. ' +\n 'Use HTML string (e.g., \"<p>Hello</p>\") or JSON content object instead.'\n );\n }\n\n // Unknown content type\n throw new Error(\n `Invalid content format: expected JSON object with 'type' property or HTML string, ` +\n `got ${typeof content}`\n );\n}\n","/**\n * Check if a ProseMirror node is empty\n */\nimport type { Node as PMNode } from '@domternal/pm/model';\n\n/**\n * Options for isNodeEmpty check\n */\nexport interface IsNodeEmptyOptions {\n /**\n * Check child nodes recursively\n * @default true\n */\n checkChildren?: boolean;\n\n /**\n * Ignore hardBreak nodes when checking emptiness\n * @default true\n */\n ignoreHardBreaks?: boolean;\n}\n\n/**\n * Checks if a ProseMirror node is considered empty\n *\n * A node is considered empty if:\n * - It has no content (childCount === 0)\n * - It only contains empty child nodes (when checkChildren is true)\n * - It only contains hardBreaks (when ignoreHardBreaks is true)\n *\n * @param node - ProseMirror node to check\n * @param options - Options for emptiness check\n * @returns true if node is empty\n *\n * @example\n * ```ts\n * // Check if document is empty\n * const empty = isNodeEmpty(editor.state.doc);\n *\n * // Check without recursion\n * const empty = isNodeEmpty(node, { checkChildren: false });\n * ```\n */\nexport function isNodeEmpty(\n node: PMNode,\n options: IsNodeEmptyOptions = {}\n): boolean {\n const { checkChildren = true, ignoreHardBreaks = true } = options;\n\n // Leaf nodes with no content\n if (node.isLeaf) {\n // Text node is empty if it has no text\n if (node.isText) {\n return !node.text || node.text.length === 0;\n }\n\n // HardBreak is considered \"empty\" if ignoreHardBreaks is true\n if (ignoreHardBreaks && node.type.name === 'hardBreak') {\n return true;\n }\n\n // Other leaf nodes (like images, horizontal rules) are not empty\n return false;\n }\n\n // No children = empty\n if (node.childCount === 0) {\n return true;\n }\n\n // If not checking children, has children = not empty\n if (!checkChildren) {\n return false;\n }\n\n // Check all children recursively (with early exit for performance)\n for (let i = 0; i < node.childCount; i++) {\n if (!isNodeEmpty(node.child(i), options)) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Checks if a document node is empty\n *\n * Convenience wrapper for isNodeEmpty with document-specific defaults.\n * A document is empty if it only contains empty paragraphs or no content.\n *\n * @param doc - Document node to check\n * @returns true if document is empty\n */\nexport function isDocumentEmpty(doc: PMNode): boolean {\n return isNodeEmpty(doc, {\n checkChildren: true,\n ignoreHardBreaks: true,\n });\n}\n","/**\n * Mark Input Rule Helper\n *\n * Creates input rules for applying marks based on regex patterns.\n * Used for markdown-style shortcuts like **bold**, *italic*, ~~strike~~, etc.\n */\nimport { InputRule } from '@domternal/pm/inputrules';\nimport type { MarkType } from '@domternal/pm/model';\nimport type { EditorState } from '@domternal/pm/state';\n\n/**\n * Options for creating a mark input rule\n */\nexport interface MarkInputRuleOptions {\n /**\n * The regex pattern to match.\n * Must have a capture group for the content to be marked.\n *\n * @example\n * // Match **text**\n * /(?:\\*\\*)([^*]+)(?:\\*\\*)$/\n */\n find: RegExp;\n\n /**\n * The mark type to apply\n */\n type: MarkType;\n\n /**\n * Whether Backspace can undo this input rule immediately after it fires.\n * @default true\n */\n undoable?: boolean;\n\n /**\n * Optional: get attributes from the match\n *\n * @param match - The regex match array\n * @returns Mark attributes or null to skip\n */\n getAttributes?: (match: RegExpMatchArray) => Record<string, unknown> | null;\n}\n\n/**\n * Creates an input rule that applies a mark to matched text.\n *\n * When the user types text matching the pattern, the delimiters are removed\n * and the mark is applied to the content.\n *\n * @example\n * // **text** → applies bold mark to \"text\"\n * markInputRule({\n * find: /(?:\\*\\*)([^*]+)(?:\\*\\*)$/,\n * type: schema.marks.bold,\n * });\n *\n * @example\n * // `text` → applies code mark to \"text\"\n * markInputRule({\n * find: /(?:`)([^`]+)(?:`)$/,\n * type: schema.marks.code,\n * });\n *\n * @param options - Configuration options\n * @returns ProseMirror InputRule\n */\nexport function markInputRule(options: MarkInputRuleOptions): InputRule {\n const { find, type, getAttributes, undoable } = options;\n\n return new InputRule(\n find,\n (state: EditorState, match: RegExpMatchArray, start: number, end: number) => {\n const attributes = getAttributes ? getAttributes(match) : null;\n\n // If getAttributes returned null, skip this rule\n if (getAttributes && attributes === null) {\n return null;\n }\n\n // match[0] = full match (e.g., \"**text**\")\n // match[1] = captured content (e.g., \"text\")\n const textContent = match[1];\n if (!textContent) {\n return null;\n }\n\n const { tr } = state;\n\n // Replace the matched text (including delimiters) with just the content\n tr.replaceWith(start, end, state.schema.text(textContent));\n\n // Apply the mark to the inserted text\n tr.addMark(start, start + textContent.length, type.create(attributes ?? undefined));\n\n // Remove the mark at the end so typing continues without the mark\n tr.removeStoredMark(type);\n\n return tr;\n },\n undoable !== undefined ? { undoable } : {},\n );\n}\n\n/**\n * Pre-built regex patterns for common mark input rules\n */\nexport const markInputRulePatterns = {\n /**\n * Bold: **text** or __text__\n * Matches text wrapped in double asterisks or underscores\n */\n bold: /(?:\\*\\*|__)([^*_]+)(?:\\*\\*|__)$/,\n\n /**\n * Strike: ~~text~~\n * Matches text wrapped in double tildes\n */\n strike: /(?:~~)([^~]+)(?:~~)$/,\n\n /**\n * Code: `text`\n * Matches text wrapped in backticks\n */\n code: /(?:`)([^`]+)(?:`)$/,\n\n /**\n * Highlight: ==text==\n * Matches text wrapped in double equals\n */\n highlight: /(?:==)([^=]+)(?:==)$/,\n} as const;\n","/**\n * Wrapping Input Rule Helper\n *\n * Drop-in replacement for ProseMirror's wrappingInputRule that exposes\n * the `undoable` option so extension authors can opt out of Backspace undo.\n */\nimport { InputRule } from '@domternal/pm/inputrules';\nimport { findWrapping, canJoin } from '@domternal/pm/transform';\nimport type { NodeType, Node, Attrs } from '@domternal/pm/model';\nimport type { EditorState } from '@domternal/pm/state';\n\nexport interface WrappingInputRuleOptions {\n /**\n * The regex pattern to match. Should start with `^` so it only\n * fires at the start of a textblock.\n */\n find: RegExp;\n\n /**\n * The node type to wrap in.\n */\n type: NodeType;\n\n /**\n * Whether Backspace can undo this input rule immediately after it fires.\n * @default true\n */\n undoable?: boolean;\n\n /**\n * Node attributes, or a function that computes them from the match.\n */\n getAttributes?: Attrs | null | ((match: RegExpMatchArray) => Attrs | null);\n\n /**\n * Predicate that decides whether to join with an adjacent node of\n * the same type above the newly wrapped node.\n */\n joinPredicate?: (match: RegExpMatchArray, node: Node) => boolean;\n\n /**\n * When `true`, also join with an adjacent same-type node AFTER the newly\n * wrapped node, not just the one before. Lists set this so creating a list\n * item on a paragraph between two same-type lists merges all three into one\n * (Notion groups consecutive list items into a single list). Off by default\n * so wrappers like blockquote, where adjacent blocks stay separate, are\n * unaffected. Honours `joinPredicate` against the following node.\n */\n joinForward?: boolean;\n\n /**\n * Optional guard predicate. When provided, the rule only fires if\n * this returns true. Use this to prevent wrapping in certain contexts\n * (e.g. don't create a nested list inside an existing list item).\n */\n guard?: (state: EditorState) => boolean;\n}\n\n/**\n * Creates an input rule that wraps a textblock in a given node type.\n *\n * @example\n * // `> ` at start of line wraps in blockquote\n * wrappingInputRule({\n * find: /^\\s*>\\s$/,\n * type: schema.nodes.blockquote,\n * });\n *\n * @example\n * // Non-undoable wrapping rule\n * wrappingInputRule({\n * find: /^\\s*>\\s$/,\n * type: schema.nodes.blockquote,\n * undoable: false,\n * });\n */\nexport function wrappingInputRule(options: WrappingInputRuleOptions): InputRule {\n const { find, type, getAttributes = null, joinPredicate, undoable, guard, joinForward } = options;\n\n return new InputRule(\n find,\n (state, match, start, end) => {\n if (guard && !guard(state)) return null;\n const attrs = getAttributes instanceof Function ? getAttributes(match) : getAttributes;\n const tr = state.tr.delete(start, end);\n const $start = tr.doc.resolve(start);\n const range = $start.blockRange();\n const wrapping = range && findWrapping(range, type, attrs);\n if (!wrapping) return null;\n tr.wrap(range, wrapping);\n const before = tr.doc.resolve(start - 1).nodeBefore;\n if (before?.type === type && canJoin(tr.doc, start - 1) &&\n (!joinPredicate || joinPredicate(match, before))) {\n tr.join(start - 1);\n }\n\n // Forward join: merge with an adjacent same-type node AFTER the wrapped\n // one too (lists only). Without this, wrapping a paragraph that sits\n // between two same-type lists merges with the list above but leaves the\n // list below as a separate sibling. Resolve the cursor's wrapping node\n // (it may already have merged backward) and join the node after it.\n if (joinForward) {\n const $cursor = tr.selection.$from;\n for (let d = $cursor.depth; d >= 0; d--) {\n if ($cursor.node(d).type === type) {\n const after = $cursor.after(d);\n if (after < tr.doc.content.size && canJoin(tr.doc, after)) {\n const nodeAfter = tr.doc.nodeAt(after);\n if (nodeAfter?.type === type &&\n (!joinPredicate || joinPredicate(match, nodeAfter))) {\n tr.join(after);\n }\n }\n break;\n }\n }\n }\n return tr;\n },\n undoable !== undefined ? { undoable } : {},\n );\n}\n\n/**\n * Guard predicate that prevents a wrapping input rule from firing\n * when the cursor is already inside a list item (listItem or taskItem).\n * Pass as the `guard` option to `wrappingInputRule`.\n */\nexport function notInsideList(state: EditorState): boolean {\n const { $from } = state.selection;\n for (let d = $from.depth; d > 0; d--) {\n const name = $from.node(d).type.name;\n if (name === 'listItem' || name === 'taskItem') return false;\n }\n return true;\n}\n","/**\n * Textblock Type Input Rule Helper\n *\n * Drop-in replacement for ProseMirror's textblockTypeInputRule that exposes\n * the `undoable` option so extension authors can opt out of Backspace undo.\n */\nimport { InputRule } from '@domternal/pm/inputrules';\nimport type { NodeType, Attrs } from '@domternal/pm/model';\n\nexport interface TextblockTypeInputRuleOptions {\n /**\n * The regex pattern to match. Should start with `^` so it only\n * fires at the start of a textblock.\n */\n find: RegExp;\n\n /**\n * The node type to change the textblock to.\n */\n type: NodeType;\n\n /**\n * Whether Backspace can undo this input rule immediately after it fires.\n * @default true\n */\n undoable?: boolean;\n\n /**\n * Node attributes, or a function that computes them from the match.\n */\n getAttributes?: Attrs | null | ((match: RegExpMatchArray) => Attrs | null);\n}\n\n/**\n * Creates an input rule that changes the type of a textblock.\n *\n * @example\n * // `## ` at start of line converts to heading level 2\n * textblockTypeInputRule({\n * find: /^(#{1,4})\\s$/,\n * type: schema.nodes.heading,\n * getAttributes: (match) => ({ level: match[1].length }),\n * });\n */\nexport function textblockTypeInputRule(options: TextblockTypeInputRuleOptions): InputRule {\n const { find, type, getAttributes = null, undoable } = options;\n\n return new InputRule(\n find,\n (state, match, start, end) => {\n const $start = state.doc.resolve(start);\n const attrs = getAttributes instanceof Function ? getAttributes(match) : getAttributes;\n if (!$start.node(-1).canReplaceWith($start.index(-1), $start.indexAfter(-1), type)) return null;\n return state.tr\n .delete(start, end)\n .setBlockType(start, start, type, attrs);\n },\n undoable !== undefined ? { undoable } : {},\n );\n}\n","/**\n * Text Input Rule Helper\n *\n * Creates input rules for simple text replacements (e.g. `--` to em dash).\n */\nimport { InputRule } from '@domternal/pm/inputrules';\n\nexport interface TextInputRuleOptions {\n /**\n * The regex pattern to match.\n */\n find: RegExp;\n\n /**\n * The replacement text.\n */\n replace: string;\n\n /**\n * Whether Backspace can undo this input rule immediately after it fires.\n * @default true\n */\n undoable?: boolean;\n}\n\n/**\n * Creates an input rule that replaces matched text with a string.\n *\n * @example\n * // `--` converts to em dash\n * textInputRule({ find: /--$/, replace: '\\u2014' });\n *\n * @example\n * // Non-undoable replacement\n * textInputRule({ find: /->$/, replace: '\\u2192', undoable: false });\n */\nexport function textInputRule(options: TextInputRuleOptions): InputRule {\n const { find, replace, undoable } = options;\n\n return new InputRule(\n find,\n (state, _match, start, end) => state.tr.replaceWith(start, end, state.schema.text(replace)),\n undoable !== undefined ? { undoable } : {},\n );\n}\n","/**\n * Node Input Rule Helper\n *\n * Creates input rules that replace matched text with a node.\n * Used for nodes like HorizontalRule, Image, Emoji, etc.\n */\nimport { InputRule } from '@domternal/pm/inputrules';\nimport type { NodeType, Attrs } from '@domternal/pm/model';\nimport type { EditorState } from '@domternal/pm/state';\n\nexport interface NodeInputRuleOptions {\n /**\n * The regex pattern to match.\n */\n find: RegExp;\n\n /**\n * The node type to insert.\n */\n type: NodeType;\n\n /**\n * Whether Backspace can undo this input rule immediately after it fires.\n * @default true\n */\n undoable?: boolean;\n\n /**\n * Node attributes, or a function that computes them from the match.\n */\n getAttributes?: Attrs | null | ((match: RegExpMatchArray, state: EditorState) => Attrs | null);\n}\n\n/**\n * Creates an input rule that replaces matched text with a node.\n *\n * @example\n * // `:smile:` inserts an emoji node\n * nodeInputRule({\n * find: /:([a-zA-Z0-9_+-]+):$/,\n * type: schema.nodes.emoji,\n * getAttributes: (match) => ({ name: match[1] }),\n * });\n */\nexport function nodeInputRule(options: NodeInputRuleOptions): InputRule {\n const { find, type, getAttributes = null, undoable } = options;\n\n return new InputRule(\n find,\n (state, match, start, end) => {\n const attrs = getAttributes instanceof Function ? getAttributes(match, state) : getAttributes;\n if (getAttributes instanceof Function && attrs === null) return null;\n return state.tr.replaceWith(start, end, type.create(attrs));\n },\n undoable !== undefined ? { undoable } : {},\n );\n}\n","/**\n * URL Validation Helper\n *\n * Provides a utility for validating URLs.\n */\n\n/**\n * Options for URL validation\n */\nexport interface IsValidUrlOptions {\n /**\n * List of allowed URL protocols\n * @default ['http:', 'https:']\n */\n protocols?: string[];\n}\n\n/**\n * Checks if a string is a valid URL\n *\n * @param url - The string to validate\n * @param options - Validation options\n * @returns True if the string is a valid URL with an allowed protocol\n *\n * @example\n * ```ts\n * isValidUrl('https://example.com'); // true\n * isValidUrl('javascript:alert(1)'); // false (protocol not allowed)\n * isValidUrl('not a url'); // false\n * ```\n */\nexport function isValidUrl(\n url: string,\n options: IsValidUrlOptions = {}\n): boolean {\n const { protocols = ['http:', 'https:'] } = options;\n\n try {\n const parsed = new URL(url);\n return protocols.includes(parsed.protocol);\n } catch {\n return false;\n }\n}\n","/**\n * SSR Helpers\n *\n * Utilities for server-side rendering and content conversion.\n * - generateHTML: Convert JSON content to HTML string\n * - generateJSON: Convert HTML string to JSON content\n * - generateText: Extract plain text from JSON content\n *\n * Note: SSR environment requires 'linkedom' package (optional peer dependency).\n */\nimport {\n Node as PMNode,\n DOMSerializer,\n DOMParser as PMDOMParser,\n} from '@domternal/pm/model';\nimport type { Schema } from '@domternal/pm/model';\nimport type { AnyExtension, JSONContent } from '../types/index.js';\nimport { ExtensionManager } from '../ExtensionManager.js';\n\n// Declare global require for Node.js environment\ndeclare const require: (id: string) => unknown;\n\n/**\n * Build a ProseMirror schema from extensions.\n * Used internally by SSR helpers.\n */\nfunction buildSchemaFromExtensions(extensions: AnyExtension[]): Schema {\n // Create a minimal editor-like object for ExtensionManager\n const mockEditor = {\n state: null,\n view: null,\n schema: null,\n commands: {},\n };\n\n const manager = new ExtensionManager(\n { extensions },\n mockEditor as never\n );\n return manager.schema;\n}\n\n/**\n * Get a DOM document for parsing/serialization.\n * Uses native document in browser, linkedom in Node.js.\n */\nfunction getDocument(): Document {\n // Browser environment\n if (typeof window !== 'undefined') {\n return window.document;\n }\n\n // Server environment - try linkedom\n try {\n // Dynamic require to avoid bundling linkedom in browser builds\n const linkedom = require('linkedom') as { parseHTML: (html: string) => { document: Document } };\n const { document } = linkedom.parseHTML('<!DOCTYPE html><html><body></body></html>');\n return document;\n } catch {\n throw new Error(\n 'SSR requires \"linkedom\" package. Install it with: pnpm add linkedom'\n );\n }\n}\n\nexport interface GenerateHTMLOptions {\n /**\n * Custom document implementation. If not provided, uses native document\n * in browser or linkedom in Node.js.\n */\n document?: Document;\n}\n\n/**\n * Generate HTML string from JSON content.\n *\n * @param content - The JSON content to convert\n * @param extensions - Extensions that define the schema\n * @param options - Optional configuration\n * @returns HTML string\n *\n * @example\n * ```ts\n * const html = generateHTML(\n * { type: 'doc', content: [{ type: 'paragraph', content: [{ type: 'text', text: 'Hello' }] }] },\n * [Document, Paragraph, Text]\n * );\n * // Returns: '<p>Hello</p>'\n * ```\n */\nexport function generateHTML(\n content: JSONContent,\n extensions: AnyExtension[],\n options: GenerateHTMLOptions = {}\n): string {\n const schema = buildSchemaFromExtensions(extensions);\n const doc = PMNode.fromJSON(schema, content);\n const targetDocument = options.document ?? getDocument();\n\n const serializer = DOMSerializer.fromSchema(schema);\n const fragment = serializer.serializeFragment(doc.content, {\n document: targetDocument,\n });\n\n const container = targetDocument.createElement('div');\n container.appendChild(fragment);\n\n return container.innerHTML;\n}\n\nexport interface GenerateJSONOptions {\n /**\n * Custom document implementation. If not provided, uses native document\n * in browser or linkedom in Node.js.\n */\n document?: Document;\n}\n\n/**\n * Generate JSON content from HTML string.\n *\n * @param html - The HTML string to convert\n * @param extensions - Extensions that define the schema\n * @param options - Optional configuration\n * @returns JSON content object\n *\n * @example\n * ```ts\n * const json = generateJSON(\n * '<p>Hello</p>',\n * [Document, Paragraph, Text]\n * );\n * // Returns: { type: 'doc', content: [{ type: 'paragraph', content: [{ type: 'text', text: 'Hello' }] }] }\n * ```\n */\nexport function generateJSON(\n html: string,\n extensions: AnyExtension[],\n options: GenerateJSONOptions = {}\n): JSONContent {\n const schema = buildSchemaFromExtensions(extensions);\n const targetDocument = options.document ?? getDocument();\n\n // Parse HTML into DOM\n const container = targetDocument.createElement('div');\n container.innerHTML = html;\n\n // Use ProseMirror's DOMParser\n const parser = PMDOMParser.fromSchema(schema);\n const doc = parser.parse(container);\n\n return doc.toJSON() as JSONContent;\n}\n\nexport interface GenerateTextOptions {\n /**\n * Separator between block elements.\n * @default '\\n\\n'\n */\n blockSeparator?: string;\n}\n\n/**\n * Generate plain text from JSON content.\n *\n * @param content - The JSON content to extract text from\n * @param extensions - Extensions that define the schema\n * @param options - Optional configuration\n * @returns Plain text string\n *\n * @example\n * ```ts\n * const text = generateText(\n * { type: 'doc', content: [\n * { type: 'paragraph', content: [{ type: 'text', text: 'Hello' }] },\n * { type: 'paragraph', content: [{ type: 'text', text: 'World' }] }\n * ]},\n * [Document, Paragraph, Text]\n * );\n * // Returns: 'Hello\\n\\nWorld'\n * ```\n */\nexport function generateText(\n content: JSONContent,\n extensions: AnyExtension[],\n options: GenerateTextOptions = {}\n): string {\n const { blockSeparator = '\\n\\n' } = options;\n const schema = buildSchemaFromExtensions(extensions);\n const doc = PMNode.fromJSON(schema, content);\n\n return doc.textBetween(0, doc.content.size, blockSeparator);\n}\n","/**\n * Get the range of a mark at a resolved position.\n *\n * Walks backward and forward from the position to find contiguous\n * text nodes that share the same mark type, returning the full range.\n */\nimport type { MarkType, ResolvedPos } from '@domternal/pm/model';\n\nexport interface MarkRange {\n from: number;\n to: number;\n}\n\n/**\n * Returns the contiguous range of a mark around the given resolved position.\n * Returns undefined if the mark is not present at the position.\n */\nexport function getMarkRange(\n $pos: ResolvedPos,\n type: MarkType,\n): MarkRange | undefined {\n const parent = $pos.parent;\n\n // Try the node at/after cursor first, then the node before\n let start = parent.childAfter($pos.parentOffset);\n\n if (!start.node || !type.isInSet(start.node.marks)) {\n start = parent.childBefore($pos.parentOffset);\n }\n\n if (!start.node || !type.isInSet(start.node.marks)) {\n return undefined;\n }\n\n let startIndex = start.index;\n let startPos = $pos.start() + start.offset;\n let endIndex = startIndex + 1;\n let endPos = startPos + start.node.nodeSize;\n\n // Walk backward\n while (startIndex > 0 && type.isInSet(parent.child(startIndex - 1).marks)) {\n startIndex -= 1;\n startPos -= parent.child(startIndex).nodeSize;\n }\n\n // Walk forward\n while (endIndex < parent.childCount && type.isInSet(parent.child(endIndex).marks)) {\n endPos += parent.child(endIndex).nodeSize;\n endIndex += 1;\n }\n\n return { from: startPos, to: endPos };\n}\n","/**\n * Find the closest parent node matching a predicate\n *\n * Returns a curried function: findParentNode(predicate)(selection)\n *\n * @example\n * const details = findParentNode(node => node.type.name === 'details')(selection);\n * if (details) {\n * console.log(details.pos, details.node);\n * }\n */\nimport type { Node as PMNode } from '@domternal/pm/model';\nimport type { Selection } from '@domternal/pm/state';\n\nexport interface FindParentNodeResult {\n pos: number;\n start: number;\n depth: number;\n node: PMNode;\n}\n\nexport const findParentNode =\n (predicate: (node: PMNode) => boolean) =>\n (selection: Selection): FindParentNodeResult | undefined => {\n const { $from } = selection;\n\n for (let depth = $from.depth; depth > 0; depth--) {\n const node = $from.node(depth);\n\n if (predicate(node)) {\n return {\n pos: $from.before(depth),\n start: $from.start(depth),\n depth,\n node,\n };\n }\n }\n\n return undefined;\n };\n","/**\n * Find all children of a node matching a predicate\n *\n * @example\n * const summaries = findChildren(detailsNode, node => node.type.name === 'detailsSummary');\n */\nimport type { Node as PMNode } from '@domternal/pm/model';\n\nexport interface FindChildResult {\n node: PMNode;\n pos: number;\n}\n\nexport const findChildren = (\n node: PMNode,\n predicate: (node: PMNode) => boolean,\n): FindChildResult[] => {\n const result: FindChildResult[] = [];\n\n node.forEach((child, offset) => {\n if (predicate(child)) {\n result.push({ node: child, pos: offset });\n }\n });\n\n return result;\n};\n","/**\n * Get the default block type at a given content match position\n *\n * Finds the first textblock type that can be created without required attributes.\n * Useful for creating new empty blocks (e.g., paragraph after details).\n *\n * @example\n * const type = defaultBlockAt(parent.contentMatchAt(index));\n * if (type) {\n * const node = type.createAndFill();\n * }\n */\nimport type { ContentMatch, NodeType } from '@domternal/pm/model';\n\nexport const defaultBlockAt = (match: ContentMatch): NodeType | null => {\n for (let i = 0; i < match.edgeCount; i++) {\n const { type } = match.edge(i);\n\n if (type.isTextblock && !type.hasRequiredAttrs()) {\n return type;\n }\n }\n\n return null;\n};\n","/**\n * Content commands - setContent, clearContent, insertText, insertContent\n */\nimport { TextSelection } from '@domternal/pm/state';\nimport { Fragment, Slice, DOMParser as ProseMirrorDOMParser } from '@domternal/pm/model';\nimport type { CommandSpec } from '../types/Commands.js';\nimport type { Content } from '../types/index.js';\nimport { createDocument } from '../helpers/index.js';\n\n/**\n * Options for setContent command\n */\nexport interface SetContentOptions {\n /**\n * Emit update event after setting content\n * @default true\n */\n emitUpdate?: boolean;\n\n /**\n * Parse options for HTML content\n */\n parseOptions?: Record<string, unknown>;\n}\n\n/**\n * Options for clearContent command\n */\nexport interface ClearContentOptions {\n /**\n * Emit update event after clearing content\n * @default true\n */\n emitUpdate?: boolean;\n}\n\n/**\n * SetContent command - sets the editor content\n *\n * @param content - JSON or HTML content\n * @param options - Options for setting content\n */\nexport const setContent: CommandSpec<[content: Content, options?: SetContentOptions]> =\n (content: Content, options: SetContentOptions = {}) =>\n ({ state, tr, dispatch }) => {\n const { emitUpdate = true, parseOptions } = options;\n const { schema } = state;\n\n // Parse content into document (with graceful error handling)\n let doc;\n try {\n doc = createDocument(content, schema, { parseOptions });\n } catch {\n // Invalid content - return false to indicate command failed\n return false;\n }\n\n // In dry-run mode, just check if content can be created\n if (!dispatch) {\n return true;\n }\n\n // Replace entire document\n // Use tr.doc for chain compatibility - prior commands may have modified the document\n tr.replaceWith(0, tr.doc.content.size, doc.content);\n\n // Mark transaction to potentially skip update event\n if (!emitUpdate) {\n tr.setMeta('addToHistory', false);\n tr.setMeta('skipUpdate', true);\n }\n\n dispatch(tr);\n return true;\n };\n\n/**\n * ClearContent command - clears the editor content to empty state\n *\n * @param options - Options for clearing content\n */\nexport const clearContent: CommandSpec<[options?: ClearContentOptions]> =\n (options: ClearContentOptions = {}) =>\n ({ state, tr, dispatch }) => {\n const { emitUpdate = true } = options;\n const { schema } = state;\n\n // Create empty document\n const doc = createDocument(null, schema);\n\n // In dry-run mode, just return true\n if (!dispatch) {\n return true;\n }\n\n // Replace entire document\n // Use tr.doc for chain compatibility - prior commands may have modified the document\n tr.replaceWith(0, tr.doc.content.size, doc.content);\n\n if (!emitUpdate) {\n tr.setMeta('addToHistory', false);\n tr.setMeta('skipUpdate', true);\n }\n\n dispatch(tr);\n return true;\n };\n\n/**\n * InsertText command - inserts text at the current selection\n *\n * @param text - Text to insert\n */\nexport const insertText: CommandSpec<[text: string]> =\n (text: string) =>\n ({ tr, dispatch }) => {\n // Use tr.selection for chain compatibility - reflects current position\n const { from, to } = tr.selection;\n\n // For TextSelection, check if parent allows inline content\n // For other selections (AllSelection, NodeSelection), let ProseMirror handle validation\n if (tr.selection instanceof TextSelection) {\n const { $from } = tr.selection;\n if (!$from.parent.inlineContent) {\n return false;\n }\n }\n\n if (!dispatch) {\n return true;\n }\n\n tr.insertText(text, from, to);\n dispatch(tr);\n return true;\n };\n\n/**\n * InsertContent command - inserts content at the current selection\n *\n * @param content - The content to insert (JSON object, array, or HTML string)\n */\nexport const insertContent: CommandSpec<[content: Content]> =\n (content: Content) =>\n ({ state, tr, dispatch }) => {\n const { schema } = state;\n const { from, to } = tr.selection;\n\n // Parse content based on type\n let fragment: Fragment;\n\n if (typeof content === 'string') {\n // HTML string - parse using DOMParser\n if (typeof window === 'undefined') {\n return false; // Can't parse HTML in SSR without DOM\n }\n\n const parser = ProseMirrorDOMParser.fromSchema(schema);\n const wrapper = document.createElement('div');\n wrapper.innerHTML = content;\n const parsed = parser.parse(wrapper);\n fragment = parsed.content;\n } else if (content && typeof content === 'object') {\n // JSON content\n if (Array.isArray(content)) {\n // Array of nodes\n const nodes = content.map(item => schema.nodeFromJSON(item));\n fragment = Fragment.from(nodes);\n } else if ('type' in content) {\n // Single node or document\n const node = schema.nodeFromJSON(content);\n // If it's a doc, use its content; otherwise wrap in fragment\n fragment = node.type.name === 'doc' ? node.content : Fragment.from(node);\n } else {\n return false;\n }\n } else {\n return false;\n }\n\n if (!dispatch) {\n return true;\n }\n\n // Insert the content\n tr.replaceRange(from, to, new Slice(fragment, 0, 0));\n dispatch(tr);\n return true;\n };\n","/**\n * Extension - Base class for all extensions\n *\n * Extensions provide functionality without contributing to the schema.\n * For schema contributions, use Node (for block/inline nodes) or Mark (for inline formatting).\n *\n * Three-tier model:\n * - Extension (type: 'extension') → Pure functionality (History, Placeholder, etc.)\n * - Node (type: 'node') → Schema nodes (Paragraph, Heading, etc.)\n * - Mark (type: 'mark') → Schema marks (Bold, Italic, etc.)\n *\n * @example\n * const History = Extension.create({\n * name: 'history',\n * addOptions() {\n * return { depth: 100 };\n * },\n * addKeyboardShortcuts() {\n * return {\n * 'Mod-z': () => this.editor.commands.undo(),\n * 'Mod-Shift-z': () => this.editor.commands.redo(),\n * };\n * },\n * });\n */\n\nimport type { ExtensionConfig, ExtensionConfigBase, ExtensionContext } from './types/ExtensionConfig.js';\nimport type { SingleCommands } from './types/Commands.js';\nimport type { EditorState } from '@domternal/pm/state';\nimport type { EditorView } from '@domternal/pm/view';\nimport { callOrReturn } from './helpers/callOrReturn.js';\n\n/**\n * Merges extension config with parent binding support.\n *\n * For each function in `extendedConfig` that overrides a function in `parentConfig`,\n * wraps the override so that `this.parent` temporarily points to the parent's version.\n * This enables the `this.parent?.()` pattern in extend():\n *\n * ```typescript\n * Paragraph.extend({\n * addAttributes() {\n * return { ...this.parent?.(), align: { default: 'left' } };\n * },\n * });\n * ```\n */\nexport function mergeConfigWithParentBinding(\n parentConfig: object,\n extendedConfig: object,\n): object {\n const parent = parentConfig as Record<string, unknown>;\n const merged: Record<string, unknown> = { ...parent };\n\n for (const [key, value] of Object.entries(extendedConfig)) {\n if (typeof value === 'function' && typeof parent[key] === 'function') {\n const parentFn = parent[key] as (...args: unknown[]) => unknown;\n const childFn = value as (...args: unknown[]) => unknown;\n\n merged[key] = function (this: Extension, ...args: unknown[]) {\n const previousParent = this.parent;\n this.parent = (...pArgs: unknown[]) => parentFn.call(this, ...pArgs);\n const result = childFn.call(this, ...args);\n this.parent = previousParent;\n return result;\n };\n } else {\n merged[key] = value;\n }\n }\n\n return merged;\n}\n\n/**\n * Editor interface for Extension\n * Forward declaration to avoid circular dependency\n */\nexport interface ExtensionEditorInterface {\n readonly state: EditorState;\n readonly view: EditorView;\n readonly schema: unknown;\n readonly commands: SingleCommands;\n}\n\n/**\n * Base class for all extensions\n *\n * @typeParam Options - Extension options type\n * @typeParam Storage - Extension storage type\n */\nexport class Extension<Options = unknown, Storage = unknown> {\n /**\n * Extension type identifier\n * Used to distinguish between Extension, Node, and Mark\n * Subclasses override this to 'node' or 'mark'\n */\n readonly type: 'extension' | 'node' | 'mark' = 'extension';\n\n /**\n * Unique extension name\n */\n readonly name: string;\n\n /**\n * Extension options (immutable after creation)\n */\n readonly options: Options;\n\n /**\n * Extension storage (mutable state)\n * Accessible via editor.storage[extensionName]\n */\n storage: Storage;\n\n /**\n * The original configuration object\n */\n readonly config: ExtensionConfig<Options, Storage>;\n\n /**\n * Editor instance (set by ExtensionManager after creation)\n * null until ExtensionManager binds it\n */\n editor: ExtensionEditorInterface | null = null;\n\n /**\n * Reference to the parent config method when using extend().\n * Set temporarily during config method execution so overridden\n * methods can call `this.parent?.()` to invoke the original.\n */\n parent?: ((...args: unknown[]) => unknown) | undefined;\n\n /**\n * Protected constructor - use Extension.create() instead\n */\n protected constructor(config: ExtensionConfig<Options, Storage>) {\n // Validate extension name (must be camelCase starting with lowercase letter)\n if (!/^[a-z][a-zA-Z0-9]*$/.test(config.name)) {\n throw new Error(\n `Extension name '${config.name}' is invalid. ` +\n `Names must be camelCase starting with a lowercase letter (e.g., 'myExtension').`\n );\n }\n\n this.config = config;\n this.name = config.name;\n\n // Initialize options using addOptions() with `this` context\n // If addOptions is not defined, default to empty object\n const defaultOptions = callOrReturn(config.addOptions, this);\n this.options = (defaultOptions ?? {}) as Options;\n\n // Initialize storage using addStorage() with `this` context\n // If addStorage is not defined, default to empty object\n const defaultStorage = callOrReturn(config.addStorage, this);\n this.storage = (defaultStorage ?? {}) as Storage;\n }\n\n /**\n * Creates a new extension instance\n *\n * @param config - Extension configuration\n * @returns New extension instance\n *\n * @example\n * const MyExtension = Extension.create({\n * name: 'myExtension',\n * addOptions() {\n * return { enabled: true };\n * },\n * });\n */\n static create<O = unknown, S = unknown>(\n config: ExtensionConfig<O, S>\n ): Extension<O, S> {\n return new Extension(config);\n }\n\n /**\n * Creates a new extension with merged options\n * Original extension is not modified\n *\n * **Note:** Options are merged shallowly using object spread (`...`).\n * Nested objects are replaced entirely, not deeply merged.\n *\n * @param options - Options to merge with existing options\n * @returns New extension instance with merged options\n *\n * @example\n * const configured = MyExtension.configure({ enabled: false });\n *\n * @example\n * // Shallow merge behavior with nested objects:\n * // Given: options = { nested: { a: 1, b: 2 } }\n * // configure({ nested: { b: 3 } })\n * // Result: { nested: { b: 3 } } - 'a' is lost!\n * // To preserve nested values, spread manually:\n * // configure({ nested: { ...original.options.nested, b: 3 } })\n */\n configure(options: Partial<Options>): Extension<Options, Storage> {\n // Create new config with merged options\n const newConfig: ExtensionConfig<Options, Storage> = {\n ...this.config,\n // Override addOptions to return merged options\n addOptions: () => ({\n ...this.options,\n ...options,\n }),\n };\n\n return new Extension(newConfig);\n }\n\n /**\n * Returns a fresh, unbound copy built from the same `config`: `editor` reset to\n * null and `options`/`storage` re-derived, while `configure()`/`extend()`\n * results are preserved (they live in `config`). Polymorphic: a `Node`/`Mark`\n * clones to its own subclass.\n *\n * `ExtensionManager` clones every extension so each editor owns its instances\n * and binding one editor can't mutate extensions shared with another.\n */\n clone(): Extension<Options, Storage> {\n const Ctor = this.constructor as new (\n config: ExtensionConfig<Options, Storage>,\n ) => Extension<Options, Storage>;\n return new Ctor(this.config);\n }\n\n /**\n * Creates a new extension with extended configuration\n * Original extension is not modified\n *\n * **Note:** Config is merged shallowly using object spread (`...`).\n * Config properties (like `addCommands`, `addKeyboardShortcuts`) are\n * replaced entirely, not combined with the base extension's config.\n *\n * @param extendedConfig - Configuration to extend/override\n * @returns New extension instance with extended config\n *\n * @example\n * const Extended = MyExtension.extend({\n * name: 'extendedExtension',\n * addCommands() {\n * return { customCommand: () => ({ tr }) => true };\n * },\n * });\n *\n * @example\n * // To preserve base extension's commands while adding new ones:\n * const Extended = BaseExtension.extend({\n * addCommands() {\n * const baseCommands = BaseExtension.config.addCommands?.call(this) ?? {};\n * return {\n * ...baseCommands,\n * newCommand: () => ({ tr }) => true,\n * };\n * },\n * });\n */\n extend<ExtendedOptions = Options, ExtendedStorage = Storage>(\n extendedConfig: Partial<ExtensionConfigBase<ExtendedOptions, ExtendedStorage>> &\n ThisType<ExtensionContext<ExtendedOptions, ExtendedStorage>>\n ): Extension<ExtendedOptions, ExtendedStorage> {\n const newConfig = mergeConfigWithParentBinding(this.config, extendedConfig);\n\n return new Extension(newConfig as ExtensionConfig<ExtendedOptions, ExtendedStorage>);\n }\n}\n","/**\n * Shared helpers for building ProseMirror node/mark specs.\n *\n * Used by both Node.createNodeSpec() and Mark.createMarkSpec() to\n * eliminate duplicated attribute conversion and HTML attribute building.\n */\nimport type { AttributeSpecs } from '../types/AttributeSpec.js';\n\n/**\n * Converts extension AttributeSpecs to ProseMirror-compatible `attrs` object.\n *\n * @example\n * spec.attrs = buildProseMirrorAttrs(attributeSpecs);\n */\nexport function buildProseMirrorAttrs(\n attributeSpecs: AttributeSpecs,\n): Record<string, { default?: unknown }> {\n const attrs: Record<string, { default?: unknown }> = {};\n\n for (const [name, attrSpec] of Object.entries(attributeSpecs)) {\n const attr: Record<string, unknown> = {\n default: attrSpec.default,\n };\n // Add validate if defined (ProseMirror 1.22.0+)\n if (attrSpec.validate) {\n attr['validate'] = attrSpec.validate;\n }\n attrs[name] = attr;\n }\n\n return attrs;\n}\n\n/**\n * Builds an HTML attributes object from a node/mark's attrs using the\n * attribute specs' renderHTML functions.\n *\n * Used inside toDOM wrappers for both nodes and marks.\n *\n * @example\n * const htmlAttrs = buildHTMLAttributes(node.attrs, attrSpecs);\n * return renderFn.call(instance, { node, HTMLAttributes: htmlAttrs });\n */\nexport function buildHTMLAttributes(\n attrs: Record<string, unknown>,\n attrSpecs: AttributeSpecs,\n): Record<string, unknown> {\n const htmlAttrs: Record<string, unknown> = {};\n\n for (const [name, attrSpec] of Object.entries(attrSpecs)) {\n // Skip if not rendered\n if (attrSpec.rendered === false) continue;\n\n // Use renderHTML if defined, otherwise add directly\n if (attrSpec.renderHTML) {\n const rendered = attrSpec.renderHTML(attrs);\n if (rendered) {\n Object.assign(htmlAttrs, rendered);\n }\n } else if (attrs[name] !== undefined && attrs[name] !== null) {\n // Default: use attribute value directly\n htmlAttrs[name] = attrs[name];\n }\n }\n\n return htmlAttrs;\n}\n","/**\n * Mark - Base class for mark extensions\n *\n * Marks define inline formatting that can be applied to text.\n * Examples: Bold, Italic, Link, Code, etc.\n *\n * Three-tier model:\n * - Extension (type: 'extension') → Pure functionality (History, Placeholder, etc.)\n * - Node (type: 'node') → Schema nodes (Paragraph, Heading, etc.)\n * - Mark (type: 'mark') → Schema marks (Bold, Italic, etc.)\n *\n * @example\n * const Bold = Mark.create({\n * name: 'bold',\n * parseHTML() {\n * return [\n * { tag: 'strong' },\n * { tag: 'b' },\n * { style: 'font-weight=bold' },\n * ];\n * },\n * renderHTML({ HTMLAttributes }) {\n * return ['strong', HTMLAttributes, 0];\n * },\n * });\n */\n\nimport type { MarkSpec, MarkType, ParseRule } from '@domternal/pm/model';\nimport { Extension, type ExtensionEditorInterface, mergeConfigWithParentBinding } from './Extension.js';\nimport type { MarkConfig, MarkContext } from './types/MarkConfig.js';\nimport { callOrReturn } from './helpers/callOrReturn.js';\nimport { buildProseMirrorAttrs, buildHTMLAttributes } from './helpers/specBuilder.js';\n\n/**\n * Extended editor interface for Mark\n * Includes schema access for MarkType getter\n */\nexport interface MarkEditorInterface extends ExtensionEditorInterface {\n readonly schema: {\n marks: Record<string, MarkType>;\n };\n}\n\n/**\n * Base class for mark extensions\n *\n * @typeParam Options - Mark options type\n * @typeParam Storage - Mark storage type\n */\nexport class Mark<Options = unknown, Storage = unknown> extends Extension<\n Options,\n Storage\n> {\n /**\n * Mark type identifier\n * Distinguishes marks from extensions and nodes\n */\n override readonly type = 'mark' as const;\n\n /**\n * The original configuration object\n * Typed as MarkConfig for mark-specific properties\n */\n declare readonly config: MarkConfig<Options, Storage>;\n\n /**\n * Editor instance with schema access\n * null until set by ExtensionManager\n */\n override editor: MarkEditorInterface | null = null;\n\n /**\n * Protected constructor - use Mark.create() instead\n */\n protected constructor(config: MarkConfig<Options, Storage>) {\n super(config);\n }\n\n /**\n * Whether this mark represents visual formatting.\n * Returns false for semantic marks (links, comments) that should\n * survive `unsetAllMarks`. Defaults to true.\n */\n get isFormatting(): boolean {\n return this.config.isFormatting !== false;\n }\n\n /**\n * Get the ProseMirror MarkType from schema\n *\n * This is a lazy getter because schema doesn't exist at mark creation time.\n * Schema is built FROM marks by ExtensionManager.\n *\n * Returns null if editor is not yet initialized.\n * Always check editor is set before using markType.\n */\n get markType(): MarkType | null {\n if (!this.editor) {\n return null;\n }\n return this.editor.schema.marks[this.name] ?? null;\n }\n\n /**\n * Get MarkType or throw if not initialized.\n * Use in contexts where editor is guaranteed to be set (like addCommands).\n */\n get markTypeOrThrow(): MarkType {\n const type = this.markType;\n if (!type) {\n throw new Error(\n `Mark \"${this.name}\" is not initialized. ` +\n `Make sure the editor is created before accessing markType.`\n );\n }\n return type;\n }\n\n /**\n * Creates a new mark instance\n *\n * @param config - Mark configuration\n * @returns New mark instance\n *\n * @example\n * const Bold = Mark.create({\n * name: 'bold',\n * parseHTML() {\n * return [{ tag: 'strong' }, { tag: 'b' }];\n * },\n * });\n */\n static override create<O = unknown, S = unknown>(\n config: MarkConfig<O, S>\n ): Mark<O, S> {\n return new Mark(config);\n }\n\n /**\n * Creates a new mark with merged options. Original mark is not modified.\n * Options merge shallowly (object spread); see {@link Extension.configure}\n * for the nested-object gotcha and a workaround.\n *\n * @example\n * const CustomBold = Bold.configure({ HTMLAttributes: { class: 'custom-bold' } });\n */\n override configure(options: Partial<Options> & { isFormatting?: boolean }): Mark<Options, Storage> {\n const { isFormatting, ...restOptions } = options as Record<string, unknown> & { isFormatting?: boolean };\n const newConfig: MarkConfig<Options, Storage> = {\n ...this.config,\n ...(isFormatting !== undefined ? { isFormatting } : {}),\n addOptions: () => ({\n ...this.options,\n ...restOptions as Partial<Options>,\n }),\n };\n\n return new Mark(newConfig);\n }\n\n /**\n * Creates a new mark with extended configuration\n * Original mark is not modified\n *\n * **Note:** Config is merged shallowly using object spread (`...`).\n * Config properties (like `addAttributes`, `parseHTML`) are\n * replaced entirely, not combined with the base mark's config.\n *\n * @param extendedConfig - Configuration to extend/override\n * @returns New mark instance with extended config\n *\n * @example\n * const CustomBold = Bold.extend({\n * name: 'customBold',\n * addAttributes() {\n * return { ...this.parent?.(), weight: { default: 'bold' } };\n * },\n * });\n *\n * @example\n * // To preserve base mark's parse rules while adding new ones:\n * const Extended = BaseMark.extend({\n * parseHTML() {\n * const baseRules = BaseMark.config.parseHTML?.call(this) ?? [];\n * return [...baseRules, { tag: 'custom-tag' }];\n * },\n * });\n */\n override extend<ExtendedOptions = Options, ExtendedStorage = Storage>(\n extendedConfig: Partial<MarkConfig<ExtendedOptions, ExtendedStorage>> &\n ThisType<MarkContext<ExtendedOptions, ExtendedStorage>>\n ): Mark<ExtendedOptions, ExtendedStorage> {\n const newConfig = mergeConfigWithParentBinding(this.config, extendedConfig);\n\n return new Mark(newConfig as MarkConfig<ExtendedOptions, ExtendedStorage>);\n }\n\n /**\n * Creates a ProseMirror MarkSpec from this mark's configuration\n *\n * Called by ExtensionManager when building the schema.\n * Converts our config format to ProseMirror's MarkSpec format.\n *\n * @returns ProseMirror MarkSpec\n */\n createMarkSpec(): MarkSpec {\n const spec: MarkSpec = {};\n\n // Schema properties - copy directly if defined\n if (this.config.inclusive !== undefined)\n spec.inclusive = callOrReturn(this.config.inclusive, this);\n if (this.config.excludes !== undefined)\n spec.excludes = this.config.excludes;\n if (this.config.group !== undefined) spec.group = this.config.group;\n if (this.config.spanning !== undefined)\n spec.spanning = this.config.spanning;\n\n // Attributes - convert AttributeSpecs to ProseMirror attrs\n const attributeSpecs = callOrReturn(this.config.addAttributes, this);\n if (attributeSpecs) {\n spec.attrs = buildProseMirrorAttrs(attributeSpecs);\n }\n\n // Parse rules - convert to parseDOM\n const parseRules = callOrReturn(this.config.parseHTML, this);\n if (parseRules && parseRules.length > 0) {\n // Build parseDOM array with proper typing\n const parseDOMRules = parseRules.map((rule) => {\n // Build parse rule object\n const parseRule: {\n tag?: string;\n style?: string;\n priority?: number;\n consuming?: boolean;\n getAttrs?: (\n node: HTMLElement | string\n ) => Record<string, unknown> | false | null;\n } = {};\n\n if (rule.tag) parseRule.tag = rule.tag;\n if (rule.style) parseRule.style = rule.style;\n if (rule.priority !== undefined) parseRule.priority = rule.priority;\n if (rule.consuming !== undefined) parseRule.consuming = rule.consuming;\n\n // Handle getAttrs - need to merge with attribute parseHTML\n if (rule.getAttrs || attributeSpecs) {\n parseRule.getAttrs = (node: HTMLElement | string) => {\n // Get attrs from rule\n const ruleAttrs = rule.getAttrs ? rule.getAttrs(node) : {};\n\n // If rule returned null or false, skip this rule\n if (ruleAttrs === null || ruleAttrs === false) {\n return ruleAttrs;\n }\n\n // Get attrs from attribute parseHTML functions\n const parsedAttrs: Record<string, unknown> = { ...ruleAttrs };\n\n // Only run attribute parseHTML for element-based rules\n // For style-based rules (where node is a string), the rule.getAttrs\n // already handles extracting values from the style string\n if (attributeSpecs && typeof node !== 'string') {\n for (const [name, attrSpec] of Object.entries(attributeSpecs)) {\n if (attrSpec.parseHTML) {\n parsedAttrs[name] = attrSpec.parseHTML(node);\n }\n }\n }\n\n return parsedAttrs;\n };\n }\n\n return parseRule;\n });\n\n // Cast required: Our MarkParseRule type is structurally compatible with\n // ProseMirror's ParseRule but TypeScript can't infer this due to\n // our custom getAttrs return type. The cast is safe.\n spec.parseDOM = parseDOMRules as unknown as readonly ParseRule[];\n }\n\n // Render - convert renderHTML to toDOM\n if (this.config.renderHTML) {\n const renderFn = this.config.renderHTML;\n const attrSpecs = attributeSpecs;\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const markInstance = this;\n\n spec.toDOM = (mark, _inline) => {\n const htmlAttrs = attrSpecs\n ? buildHTMLAttributes(mark.attrs, attrSpecs)\n : {};\n\n return renderFn.call(markInstance, { mark, HTMLAttributes: htmlAttrs });\n };\n }\n\n return spec;\n }\n}\n","/**\n * Mark commands - toggleMark, setMark, unsetMark, unsetAllMarks\n */\nimport type { Attrs, MarkType } from '@domternal/pm/model';\nimport type { EditorState, Transaction } from '@domternal/pm/state';\nimport type { CommandSpec } from '../types/Commands.js';\nimport { Mark } from '../Mark.js';\n\n/**\n * Checks if a mark can be applied in the current selection context.\n * Shared by toggleMark and setMark to avoid duplicated logic.\n *\n * For empty selections: checks that the cursor is in inline content,\n * the parent allows the mark type, and no existing marks exclude it.\n *\n * For range selections: checks that at least one parent allows the mark\n * and that applicable text exists (text not excluded by other marks).\n */\nfunction canApplyMark(\n state: EditorState,\n tr: Transaction,\n markType: MarkType,\n): boolean {\n const { empty, ranges } = tr.selection;\n const firstRange = ranges[0];\n if (!firstRange) return false;\n\n if (empty) {\n const $pos = tr.doc.resolve(firstRange.$from.pos);\n if (!$pos.parent.inlineContent || !$pos.parent.type.allowsMarkType(markType)) {\n return false;\n }\n const cursorMarks = tr.storedMarks ?? state.storedMarks ?? $pos.marks();\n if (cursorMarks.some((m) => m.type.excludes(markType) && m.type !== markType)) {\n return false;\n }\n } else {\n const ctx = { parentAllows: false, hasText: false, hasApplicableText: false };\n for (const range of ranges) {\n tr.doc.nodesBetween(range.$from.pos, range.$to.pos, (node) => {\n if (node.inlineContent && node.type.allowsMarkType(markType)) {\n ctx.parentAllows = true;\n }\n if (node.isText) {\n ctx.hasText = true;\n if (!node.marks.some((m) => m.type.excludes(markType) && m.type !== markType)) {\n ctx.hasApplicableText = true;\n }\n }\n });\n }\n if (!ctx.parentAllows || (ctx.hasText && !ctx.hasApplicableText)) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * ToggleMark command - toggles a mark on the current selection\n *\n * In cursor mode (empty selection): toggles stored mark.\n * In range mode: applies/removes mark across the entire selection,\n * respecting CellSelection ranges.\n *\n * @param markName - The name of the mark to toggle\n * @param attributes - Optional attributes for the mark\n */\nexport const toggleMark: CommandSpec<[markName: string, attributes?: Attrs]> =\n (markName: string, attributes?: Attrs) =>\n ({ state, tr, dispatch }) => {\n const markType = state.schema.marks[markName];\n\n if (!markType) {\n return false;\n }\n\n if (!canApplyMark(state, tr, markType)) {\n return false;\n }\n\n const { empty, ranges } = tr.selection;\n const firstRange = ranges[0];\n if (!firstRange) return false;\n\n if (!dispatch) return true;\n\n if (empty) {\n // Cursor mode - toggle stored mark\n const from = firstRange.$from.pos;\n const cursorMarks = tr.storedMarks\n ?? state.storedMarks\n ?? tr.doc.resolve(from).marks();\n\n if (markType.isInSet(cursorMarks)) {\n tr.removeStoredMark(markType);\n } else {\n tr.addStoredMark(markType.create(attributes ?? null));\n }\n } else {\n // Range mode - iterate over selection ranges (handles CellSelection)\n const hasMark = ranges.every(range =>\n tr.doc.rangeHasMark(range.$from.pos, range.$to.pos, markType),\n );\n for (const range of ranges) {\n if (hasMark) {\n tr.removeMark(range.$from.pos, range.$to.pos, markType);\n } else {\n tr.addMark(range.$from.pos, range.$to.pos, markType.create(attributes ?? null));\n }\n }\n }\n\n dispatch(tr);\n return true;\n };\n\n/**\n * SetMark command - adds a mark to the current selection\n *\n * @param markName - The name of the mark to set\n * @param attributes - Optional attributes for the mark\n */\nexport const setMark: CommandSpec<[markName: string, attributes?: Attrs]> =\n (markName: string, attributes?: Attrs) =>\n ({ state, tr, dispatch }) => {\n const markType = state.schema.marks[markName];\n\n if (!markType) {\n return false;\n }\n\n if (!canApplyMark(state, tr, markType)) {\n return false;\n }\n\n const { empty, ranges } = tr.selection;\n const firstRange = ranges[0];\n if (!firstRange) return false;\n\n // Cursor mode - add to stored marks\n if (empty) {\n if (!dispatch) return true;\n\n const from = firstRange.$from.pos;\n // Merge with existing mark attributes to preserve sibling attributes\n // (e.g., fontFamily should not be lost when setting fontSize on textStyle)\n // Priority: stored marks on tr > stored marks on state > marks at cursor position\n const existingMark = tr.storedMarks?.find(m => m.type === markType)\n ?? state.storedMarks?.find(m => m.type === markType)\n ?? tr.doc.resolve(from).marks().find(m => m.type === markType)\n ?? null;\n const mergedAttrs = existingMark\n ? { ...existingMark.attrs, ...attributes }\n : attributes;\n\n const mark = markType.create(mergedAttrs);\n tr.addStoredMark(mark);\n dispatch(tr);\n return true;\n }\n\n if (!dispatch) {\n return true;\n }\n\n // Merge per-node to preserve each node's own attributes.\n // E.g., one word has fontFamily: 'Arial', another has 'Georgia';\n // setting fontSize should preserve each node's fontFamily independently.\n // Iterate over selection ranges to handle CellSelection (multiple ranges)\n const nodeMarks: { from: number; to: number; attrs: Attrs }[] = [];\n for (const range of ranges) {\n const rfrom = range.$from.pos;\n const rto = range.$to.pos;\n tr.doc.nodesBetween(rfrom, rto, (node, pos) => {\n if (!node.isText) return;\n const existing = markType.isInSet(node.marks);\n const nodeAttrs = existing\n ? { ...existing.attrs, ...attributes }\n : (attributes ?? {});\n nodeMarks.push({\n from: Math.max(pos, rfrom),\n to: Math.min(pos + node.nodeSize, rto),\n attrs: nodeAttrs,\n });\n });\n }\n\n if (nodeMarks.length > 0) {\n for (const nm of nodeMarks) {\n tr.addMark(nm.from, nm.to, markType.create(nm.attrs));\n }\n } else {\n // No text nodes found (e.g., selection across empty blocks) - apply globally\n for (const range of ranges) {\n tr.addMark(range.$from.pos, range.$to.pos, markType.create(attributes));\n }\n }\n\n dispatch(tr);\n return true;\n };\n\n/**\n * UnsetMark command - removes a mark from the current selection\n *\n * @param markName - The name of the mark to remove\n */\nexport const unsetMark: CommandSpec<[markName: string]> =\n (markName: string) =>\n ({ state, tr, dispatch }) => {\n const markType = state.schema.marks[markName];\n\n if (!markType) {\n return false;\n }\n\n const { empty, ranges } = tr.selection;\n\n // For empty selection, remove from stored marks\n if (empty) {\n if (!dispatch) {\n return true;\n }\n\n tr.removeStoredMark(markType);\n dispatch(tr);\n return true;\n }\n\n if (!dispatch) {\n return true;\n }\n\n for (const range of ranges) {\n tr.removeMark(range.$from.pos, range.$to.pos, markType);\n }\n dispatch(tr);\n return true;\n };\n\n/**\n * UnsetAllMarks command - removes all formatting marks from the current selection\n *\n * Iterates over all mark types in the schema and removes those with\n * `isFormatting !== false`. Marks like Link that set `isFormatting: false`\n * are preserved.\n *\n * Returns false for empty selections (no range to clear).\n */\nexport const unsetAllMarks: CommandSpec =\n () =>\n ({ state, tr, dispatch, editor }) => {\n const { empty, ranges } = tr.selection;\n\n if (empty) return false;\n if (!dispatch) return true;\n\n // Build set of non-formatting mark names to skip.\n // Mark extensions with isFormatting: false (e.g. Link) survive clear formatting.\n const skipMarks = new Set<string>();\n const mgr = (editor as unknown as { extensionManager: { extensions: readonly unknown[] } }).extensionManager;\n for (const ext of mgr.extensions) {\n if (ext instanceof Mark && !ext.isFormatting) {\n skipMarks.add(ext.name);\n }\n }\n\n for (const markName of Object.keys(state.schema.marks)) {\n if (!skipMarks.has(markName)) {\n for (const range of ranges) {\n tr.removeMark(range.$from.pos, range.$to.pos, state.schema.marks[markName]);\n }\n }\n }\n tr.setStoredMarks([]);\n dispatch(tr);\n return true;\n };\n","/**\n * Shared helpers for locating a list/task item ancestor of a resolved\n * position. Centralises the `LIST_ITEM_TYPE_NAMES` constant + ancestor\n * walk so the four+ consumers (liftCurrentListItem, splitListForInsert,\n * TaskItem keymap, Details proactive lift, slash menu filtering) stay\n * in sync.\n */\nimport type { ResolvedPos } from '@domternal/pm/model';\n\nexport const LIST_ITEM_TYPE_NAMES = new Set(['listItem', 'taskItem']);\n\n/**\n * Returns the depth at which the nearest list/task item ancestor sits,\n * or -1 if none.\n *\n * Walks UP from `$pos.depth` toward 1 (we skip depth 0 = doc itself).\n */\nexport function findListItemAncestorDepth($pos: ResolvedPos): number {\n for (let d = $pos.depth; d >= 1; d--) {\n if (LIST_ITEM_TYPE_NAMES.has($pos.node(d).type.name)) return d;\n }\n return -1;\n}\n\n/** Convenience: true when the cursor has a list/task item ancestor. */\nexport function isInsideListItem($pos: ResolvedPos): boolean {\n return findListItemAncestorDepth($pos) !== -1;\n}\n\n/**\n * True when the cursor sits in the LABEL paragraph (index 0) of its\n * nearest list/task item ancestor. Used to gate Notion-style \"operate\n * on the label\" commands (slash menu CONVERT, INSERT, etc.).\n */\nexport function isInListItemLabel($pos: ResolvedPos): boolean {\n const d = findListItemAncestorDepth($pos);\n if (d === -1) return false;\n return $pos.index(d) === 0;\n}\n","/**\n * Lifts the list/task item that contains the cursor when the cursor sits\n * in the LABEL paragraph (first child) of that item, so a \"CONVERT\"\n * slash-menu command (Heading, Code block, Quote, Details) can transform\n * the now-unwrapped block.\n *\n * Two cases, mirroring Notion's \"Turn into\" (which only changes a block's\n * TYPE and keeps it at its current indentation):\n *\n * TOP-LEVEL item -> `liftListItem` dissolves it to a TOP-LEVEL block\n * (no parent to stay nested under). The parent list splits around it.\n *\n * NESTED item -> the block is lifted ONE level, out of its own\n * list-item wrapping into the PARENT item's children zone (where a\n * heading/quote/etc. is a valid non-first child). It stays visually\n * indented under its parent instead of jumping to the top level.\n * `liftTarget` returns null when the item carries its own sub-blocks\n * (a heading cannot own children in this schema); the convert then\n * no-ops rather than producing a malformed lift.\n */\nimport { liftListItem } from '@domternal/pm/schema-list';\nimport { liftTarget } from '@domternal/pm/transform';\nimport type { EditorState, Transaction } from '@domternal/pm/state';\nimport { findListItemAncestorDepth } from './listItemAncestor.js';\n\nconst LIST_ITEM_TYPES = new Set(['listItem', 'taskItem']);\n\n/**\n * Activation conditions (single-cursor only):\n * - selection is empty (single caret)\n * - cursor's nearest list-item ancestor exists\n * - cursor's containing block is at index 0 (label slot) of that item\n * - `tr` has no prior steps (lift steps captured from a fresh state must\n * replay against the same starting state as `tr`)\n *\n * Returns true if a lift was applied to `tr`. The caller can keep chaining\n * work on `tr` (e.g. `setBlockType`, `wrapIn`) at the new cursor position.\n */\nexport function liftCurrentListItem(\n state: EditorState,\n tr: Transaction,\n): boolean {\n if (!tr.selection.empty) return false;\n if (tr.steps.length !== 0) return false;\n\n const { $from } = tr.selection;\n const listItemDepth = findListItemAncestorDepth($from);\n if (listItemDepth === -1) return false;\n if ($from.index(listItemDepth) !== 0) return false;\n\n // Nested when the item's list wrapper sits inside ANOTHER list item.\n // listItemDepth is always >= 2 (doc > list > listItem), so node(depth - 2)\n // is a real ancestor (the doc itself at worst, which is not a list item).\n const wrapperParent = $from.node(listItemDepth - 2);\n const isNested = LIST_ITEM_TYPES.has(wrapperParent.type.name);\n\n if (isNested) {\n // Keep the block at its current indentation: lift it one level into the\n // parent item's children zone rather than out to the top level.\n const range = $from.blockRange();\n if (!range) return false;\n const target = liftTarget(range);\n if (target === null) return false;\n tr.lift(range, target);\n return true;\n }\n\n // Top-level item: dissolve it to a top-level block.\n const listItemType = $from.node(listItemDepth).type;\n return liftListItem(listItemType)(state, (liftTr) => {\n for (const step of liftTr.steps) tr.step(step);\n if (liftTr.selectionSet) tr.setSelection(liftTr.selection);\n });\n}\n","/**\n * Node commands - setBlockType, toggleBlockType, wrapIn, toggleWrap, lift\n */\nimport { findWrapping, liftTarget } from '@domternal/pm/transform';\nimport type { Attrs, Node as PMNode } from '@domternal/pm/model';\nimport type { CommandSpec } from '../types/Commands.js';\nimport { liftCurrentListItem } from '../utils/liftCurrentListItem.js';\n\n/**\n * SetBlockType command - changes the block type of the selection\n *\n * Uses tr.doc/tr.selection for chain compatibility. Preserves global\n * attributes (textAlign, lineHeight, etc.) by merging existing node\n * attrs with the provided ones via tr.setBlockType's function form.\n *\n * @param nodeName - The name of the node type to set\n * @param attributes - Optional attributes for the node\n */\nexport const setBlockType: CommandSpec<[nodeName: string, attributes?: Attrs]> =\n (nodeName: string, attributes?: Attrs) =>\n ({ state, tr, dispatch }) => {\n const nodeType = state.schema.nodes[nodeName];\n\n if (!nodeType) {\n return false;\n }\n\n // Check if any textblock in the selection can be changed\n const canApply = tr.selection.ranges.some((range) => {\n let found = false;\n tr.doc.nodesBetween(range.$from.pos, range.$to.pos, (node, pos) => {\n if (found) return false;\n if (!node.isTextblock) return;\n const mergedAttrs = { ...node.attrs, ...(attributes ?? {}) };\n if (node.hasMarkup(nodeType, mergedAttrs)) return;\n if (node.type === nodeType) {\n found = true;\n } else {\n const $pos = tr.doc.resolve(pos);\n const index = $pos.index();\n found = $pos.parent.canReplaceWith(index, index + 1, nodeType);\n }\n return;\n });\n return found;\n });\n\n if (!canApply) {\n // Notion-style fallback: cursor sits in the LABEL paragraph (the\n // schema-required first child) of a list/task item and the\n // requested block type cannot fit there. Dissolve the list item\n // by lifting it out, then retry the convert on the (now\n // top-level) paragraph - the user types `/heading 1` in a\n // to-do label and the to-do becomes a heading.\n const liftOk = liftCurrentListItem(state, tr);\n if (!liftOk) return false;\n\n // After the lift, the (formerly) label paragraph has been lifted\n // out of all list nesting to a top-level block. Verify the new\n // BLOCK PARENT accepts the requested node type at the paragraph's\n // index. We check the BLOCK PARENT, not `$reFrom.parent` (which is\n // the textblock itself), because `canReplaceWith` applies at the\n // parent's content slot.\n const $reFrom = tr.doc.resolve(tr.selection.from);\n if ($reFrom.depth < 1) return false;\n const blockParent = $reFrom.node($reFrom.depth - 1);\n const blockIndex = $reFrom.index($reFrom.depth - 1);\n if (!blockParent.canReplaceWith(blockIndex, blockIndex + 1, nodeType)) {\n return false;\n }\n if (!dispatch) return true;\n\n tr.setBlockType(\n tr.selection.from,\n tr.selection.to,\n nodeType,\n (node) => ({ ...node.attrs, ...(attributes ?? {}) }),\n );\n dispatch(tr.scrollIntoView());\n return true;\n }\n if (!dispatch) return true;\n\n // Apply: use function attrs to preserve global attributes (textAlign, lineHeight, etc.)\n for (const range of tr.selection.ranges) {\n const from = range.$from.pos;\n const to = range.$to.pos;\n tr.setBlockType(from, to, nodeType, (node) => ({ ...node.attrs, ...(attributes ?? {}) }));\n }\n\n dispatch(tr.scrollIntoView());\n return true;\n };\n\n/**\n * ToggleBlockType command - toggles between a block type and a default type\n *\n * If the current block is of the target type, changes it to the default type.\n * If the current block is not of the target type, changes it to the target type.\n * Preserves global attributes (textAlign, lineHeight) on toggle.\n *\n * @param nodeName - The name of the node type to toggle to\n * @param defaultNodeName - The name of the default node type (usually 'paragraph')\n * @param attributes - Optional attributes for the node\n */\nexport const toggleBlockType: CommandSpec<[nodeName: string, defaultNodeName: string, attributes?: Attrs]> =\n (nodeName: string, defaultNodeName: string, attributes?: Attrs) =>\n (props) => {\n const { state, tr } = props;\n const nodeType = state.schema.nodes[nodeName];\n const defaultNodeType = state.schema.nodes[defaultNodeName];\n\n if (!nodeType || !defaultNodeType) {\n return false;\n }\n\n // Collect non-empty textblocks in the selection. Empty textblocks\n // (e.g., trailing node from TrailingNode extension) are excluded so they\n // don't affect toggle direction. This handles AllSelection correctly.\n const { from, to } = tr.selection;\n const contentBlocks: { node: PMNode }[] = [];\n tr.doc.nodesBetween(from, to, (node) => {\n if (node.isTextblock && node.content.size > 0) {\n contentBlocks.push({ node });\n }\n });\n\n const allMatch = contentBlocks.length > 0 && contentBlocks.every(({ node }) => {\n const typeMatches = node.type === nodeType;\n const attrsMatch = !attributes || Object.keys(attributes).every(\n (key) => node.attrs[key] === attributes[key]\n );\n return typeMatches && attrsMatch;\n });\n\n if (allMatch) {\n // Toggle OFF → switch to default type, preserving global attrs\n return setBlockType(defaultNodeName)(props);\n }\n\n // Toggle ON → switch to target type with attrs, preserving global attrs\n return setBlockType(nodeName, attributes)(props);\n };\n\n/**\n * WrapIn command - wraps the selection in a node type\n *\n * Uses tr.doc/tr.selection for chain compatibility.\n *\n * @param nodeName - The name of the wrapping node type\n * @param attributes - Optional attributes for the node\n */\nexport const wrapIn: CommandSpec<[nodeName: string, attributes?: Attrs]> =\n (nodeName: string, attributes?: Attrs) =>\n ({ state, tr, dispatch }) => {\n const nodeType = state.schema.nodes[nodeName];\n\n if (!nodeType) {\n return false;\n }\n\n const { $from, $to } = tr.selection;\n const range = $from.blockRange($to);\n if (!range) return false;\n\n const wrapping = findWrapping(range, nodeType, attributes);\n if (wrapping) {\n if (!dispatch) return true;\n tr.wrap(range, wrapping).scrollIntoView();\n dispatch(tr);\n return true;\n }\n\n // Notion-style fallback: `findWrapping` returns null when the cursor\n // sits in the LABEL paragraph of a list/task item and the wrapper\n // (e.g. blockquote, details) cannot occupy the schema-required\n // first-child paragraph slot. Lift the list item out so the now\n // top-level paragraph can be wrapped instead - the user types\n // `/quote` in a bullet label and the bullet becomes a top-level\n // quote.\n const liftOk = liftCurrentListItem(state, tr);\n if (!liftOk) return false;\n\n const $reFrom = tr.doc.resolve(tr.selection.from);\n const $reTo = tr.doc.resolve(tr.selection.to);\n const reRange = $reFrom.blockRange($reTo);\n if (!reRange) return false;\n const reWrapping = findWrapping(reRange, nodeType, attributes);\n if (!reWrapping) return false;\n if (!dispatch) return true;\n\n tr.wrap(reRange, reWrapping).scrollIntoView();\n dispatch(tr);\n return true;\n };\n\n/**\n * ToggleWrap command - toggles wrapping of the selection in a node type\n *\n * If the selection is already wrapped in the node type, lifts it out.\n * Otherwise, wraps the selection in the node type.\n * Uses tr.doc/tr.selection for chain compatibility.\n *\n * @param nodeName - The name of the wrapping node type\n * @param attributes - Optional attributes for the node\n */\nexport const toggleWrap: CommandSpec<[nodeName: string, attributes?: Attrs]> =\n (nodeName: string, attributes?: Attrs) =>\n (props) => {\n const { state, tr, dispatch } = props;\n const nodeType = state.schema.nodes[nodeName];\n\n if (!nodeType) {\n return false;\n }\n\n const { ranges } = tr.selection;\n\n const isInsideWrap = (pos: number): boolean => {\n const $pos = tr.doc.resolve(pos);\n for (let d = $pos.depth; d > 0; d--) {\n if ($pos.node(d).type === nodeType) return true;\n }\n return false;\n };\n\n // Multi-range selection (CellSelection): handle each cell independently\n if (ranges.length > 1) {\n const allWrapped = ranges.every(range => isInsideWrap(range.$from.pos));\n if (!dispatch) return true;\n\n // Snapshot positions and sort descending so bottom-of-doc modifications\n // don't shift positions of cells still to be processed.\n const cellPositions = ranges\n .map((r) => ({ from: r.$from.pos, to: r.$to.pos }))\n .sort((a, b) => b.from - a.from);\n\n for (const cell of cellPositions) {\n const from = tr.mapping.map(cell.from);\n const to = tr.mapping.map(cell.to);\n const $from = tr.doc.resolve(from);\n const $to = tr.doc.resolve(to);\n const blockRange = $from.blockRange($to);\n if (!blockRange) continue;\n\n if (allWrapped) {\n const target = liftTarget(blockRange);\n if (target !== null) tr.lift(blockRange, target);\n } else {\n const wrapping = findWrapping(blockRange, nodeType, attributes);\n if (wrapping) tr.wrap(blockRange, wrapping);\n }\n }\n\n dispatch(tr.scrollIntoView());\n return true;\n }\n\n // Single-range selection: existing logic\n // Collect non-empty textblocks in the selection with their positions.\n // Empty textblocks (e.g., trailing node) are excluded so they don't\n // affect toggle direction. This handles AllSelection correctly.\n const { from, to } = tr.selection;\n const contentBlocks: { pos: number }[] = [];\n tr.doc.nodesBetween(from, to, (node, pos) => {\n if (node.isTextblock && node.content.size > 0) {\n contentBlocks.push({ pos });\n }\n });\n\n const allWrapped = contentBlocks.length > 0\n ? contentBlocks.every(({ pos }) => isInsideWrap(pos))\n : isInsideWrap(from);\n\n if (allWrapped) {\n const first = contentBlocks[0];\n const last = contentBlocks[contentBlocks.length - 1];\n if (first && last) {\n const $liftFrom = tr.doc.resolve(first.pos + 1);\n const $liftTo = tr.doc.resolve(last.pos + 1);\n const range = $liftFrom.blockRange($liftTo);\n if (!range) return false;\n const target = liftTarget(range);\n if (target === null) return false;\n if (!dispatch) return true;\n tr.lift(range, target).scrollIntoView();\n dispatch(tr);\n return true;\n }\n return lift()(props);\n }\n\n return wrapIn(nodeName, attributes)(props);\n };\n\n/**\n * Lift command - lifts the current block out of its parent wrapper\n *\n * Uses tr.doc/tr.selection for chain compatibility.\n * For example, lifts a paragraph out of a blockquote.\n */\nexport const lift: CommandSpec =\n () =>\n ({ tr, dispatch }) => {\n const { ranges } = tr.selection;\n\n // Multi-range selection (CellSelection): lift each cell independently\n if (ranges.length > 1) {\n if (!dispatch) return true;\n\n const cellPositions = ranges\n .map((r) => ({ from: r.$from.pos, to: r.$to.pos }))\n .sort((a, b) => b.from - a.from);\n\n for (const cell of cellPositions) {\n const from = tr.mapping.map(cell.from);\n const to = tr.mapping.map(cell.to);\n const $from = tr.doc.resolve(from);\n const $to = tr.doc.resolve(to);\n const range = $from.blockRange($to);\n if (!range) continue;\n const target = liftTarget(range);\n if (target !== null) tr.lift(range, target);\n }\n dispatch(tr.scrollIntoView());\n return true;\n }\n\n const { $from, $to } = tr.selection;\n const range = $from.blockRange($to);\n if (!range) return false;\n\n const target = liftTarget(range);\n if (target === null) return false;\n if (!dispatch) return true;\n\n tr.lift(range, target).scrollIntoView();\n dispatch(tr);\n return true;\n };\n","import type { ResolvedPos } from '@domternal/pm/model';\n\nconst LIST_ITEM_TYPES = new Set(['listItem', 'taskItem']);\n\n/**\n * Cursor context relative to the INNERMOST containing list/task item,\n * resolved only when the cursor's parent paragraph is a DIRECT child of\n * that item. Innermost so nested lists hand control to the deepest item;\n * direct-child so paragraphs inside blockquote/table-cell/etc. inside a\n * list item fall through to the container's own Enter/Backspace.\n */\nexport interface ListItemCursorContext {\n /** Depth of the containing list item ancestor in the resolved pos. */\n itemDepth: number;\n /** Position right BEFORE the containing list item in the doc. */\n itemPos: number;\n /** Position right BEFORE the containing list wrapper (one depth above the item). */\n wrapperPos: number;\n /** `true` when the parent paragraph is not the first child of the list item. */\n isInChildrenZone: boolean;\n /** `true` when the parent paragraph has no inline content. */\n paragraphIsEmpty: boolean;\n /** `true` when the parent paragraph is the LAST child of the list item. */\n isLastChild: boolean;\n /** Index of the parent paragraph within the list item (0 = label). */\n childIndex: number;\n /** Index of the containing list item within its wrapper. */\n itemIndexInWrapper: number;\n}\n\n/**\n * Resolve list-item cursor context. Returns `null` when the cursor's\n * shape does not match `(wrapper > item > paragraph)`; callers should\n * fall through to default Enter/Backspace in that case.\n */\nexport function getListItemCursorContext(\n $from: ResolvedPos,\n): ListItemCursorContext | null {\n if ($from.parent.type.name !== 'paragraph') return null;\n\n const itemDepth = $from.depth - 1;\n if (itemDepth < 1) return null;\n const itemNode = $from.node(itemDepth);\n if (!LIST_ITEM_TYPES.has(itemNode.type.name)) return null;\n\n const wrapperDepth = itemDepth - 1;\n const childIndex = $from.index(itemDepth);\n\n return {\n itemDepth,\n itemPos: $from.before(itemDepth),\n wrapperPos: $from.before(wrapperDepth),\n isInChildrenZone: childIndex > 0,\n paragraphIsEmpty: $from.parent.content.size === 0,\n isLastChild: childIndex === itemNode.childCount - 1,\n childIndex,\n itemIndexInWrapper: $from.index(wrapperDepth),\n };\n}\n","/**\n * List commands, toggleList\n */\nimport { TextSelection, EditorState } from '@domternal/pm/state';\nimport type { Transaction } from '@domternal/pm/state';\nimport { wrapRangeInList, liftListItem } from '@domternal/pm/schema-list';\nimport { canJoin } from '@domternal/pm/transform';\nimport type { Attrs, NodeType, Node as PMNode } from '@domternal/pm/model';\nimport type { CommandSpec } from '../types/Commands.js';\nimport { getListItemCursorContext } from '../utils/listItemCursorContext.js';\n\n/**\n * Find the innermost list of the given type around the selection,\n * then join it with an adjacent list of the same type if possible.\n */\nfunction joinListBackwards(tr: Transaction, listType: NodeType): void {\n const { $from } = tr.selection;\n for (let d = $from.depth; d >= 0; d--) {\n if ($from.node(d).type === listType) {\n const listPos = $from.before(d);\n if (listPos > 0 && canJoin(tr.doc, listPos)) {\n const nodeBefore = tr.doc.resolve(listPos - 1).parent;\n if (nodeBefore.type === listType) {\n tr.join(listPos);\n }\n }\n return;\n }\n }\n}\n\nfunction joinListForwards(tr: Transaction, listType: NodeType): void {\n const { $from } = tr.selection;\n for (let d = $from.depth; d >= 0; d--) {\n if ($from.node(d).type === listType) {\n const after = $from.after(d);\n if (after < tr.doc.content.size && canJoin(tr.doc, after)) {\n const nodeAfter = tr.doc.nodeAt(after);\n if (nodeAfter?.type === listType) {\n tr.join(after);\n }\n }\n return;\n }\n }\n}\n\n/**\n * ToggleList command - toggles a list type on the current selection\n *\n * If the selection is not in a list, wraps it in the specified list type.\n * If it's in the same list type, lifts the list items out.\n * If it's in a different list type, converts to the new list type in-place.\n *\n * @param listNodeName - The name of the list node type (e.g., 'bulletList', 'orderedList')\n * @param listItemNodeName - The name of the list item node type (usually 'listItem')\n * @param attributes - Optional attributes for the list node\n */\nexport const toggleList: CommandSpec<[listNodeName: string, listItemNodeName: string, attributes?: Attrs]> =\n (listNodeName: string, listItemNodeName: string, attributes?: Attrs) =>\n ({ state, tr, dispatch }) => {\n const listType = state.schema.nodes[listNodeName];\n const listItemType = state.schema.nodes[listItemNodeName];\n\n if (!listType || !listItemType) {\n return false;\n }\n\n interface ListBlockCtx { pos: number; inTargetList: boolean; inSomeList: boolean; otherListPos: number | null }\n\n /** Collect list context for non-empty textblocks in a range.\n * If no textblocks are found (cursor in empty block), falls back to the\n * resolved position's ancestor context so toggle/convert/lift still work. */\n const collectListContext = (doc: PMNode, rfrom: number, rto: number): ListBlockCtx[] => {\n const blocks: ListBlockCtx[] = [];\n doc.nodesBetween(rfrom, rto, (node, pos) => {\n if (!node.isTextblock || node.content.size === 0) return;\n let inTargetList = false;\n let inSomeList = false;\n let otherListPos: number | null = null;\n const $pos = doc.resolve(pos);\n for (let d = $pos.depth; d >= 0; d--) {\n const n = $pos.node(d);\n if (n.type === listType) {\n inTargetList = true;\n inSomeList = true;\n break;\n }\n const groups = (n.type.spec.group ?? '').split(/\\s+/);\n if (groups.includes('list')) {\n inSomeList = true;\n otherListPos = $pos.before(d);\n break;\n }\n }\n blocks.push({ pos, inTargetList, inSomeList, otherListPos });\n });\n\n // Empty-textblock fallback: cursor in empty list item etc.\n // Use the textblock node position (not cursor position) so that\n // pos + 1 points into the textblock content, not past it.\n if (blocks.length === 0) {\n const $cur = doc.resolve(rfrom);\n const nodePos = $cur.parent.inlineContent ? $cur.before($cur.depth) : rfrom;\n let inTargetList = false;\n let inSomeList = false;\n let otherListPos: number | null = null;\n for (let d = $cur.depth; d >= 0; d--) {\n const n = $cur.node(d);\n if (n.type === listType) { inTargetList = true; inSomeList = true; break; }\n const groups = (n.type.spec.group ?? '').split(/\\s+/);\n if (groups.includes('list')) { inSomeList = true; otherListPos = $cur.before(d); break; }\n }\n blocks.push({ pos: nodePos, inTargetList, inSomeList, otherListPos });\n }\n\n return blocks;\n };\n\n const { ranges } = tr.selection;\n\n // Multi-range selection (CellSelection): handle each cell independently\n if (ranges.length > 1) {\n // Snapshot raw positions and sort descending (process bottom-of-doc first\n // so modifications don't shift positions of cells still to be processed)\n const cellPositions = ranges\n .map((r) => ({ from: r.$from.pos, to: r.$to.pos }))\n .sort((a, b) => b.from - a.from);\n\n // Determine global toggle direction on unmodified doc\n const allBlocks: ListBlockCtx[] = [];\n for (const cell of cellPositions) {\n allBlocks.push(...collectListContext(tr.doc, cell.from, cell.to));\n }\n const allInTargetList = allBlocks.length > 0 && allBlocks.every((b) => b.inTargetList);\n if (!dispatch) return true;\n\n if (allInTargetList) {\n // Lift: remove target list from all cells\n for (const cell of cellPositions) {\n const from = tr.mapping.map(cell.from);\n const to = tr.mapping.map(cell.to);\n const cellBlocks = collectListContext(tr.doc, from, to);\n const first = cellBlocks[0];\n const last = cellBlocks[cellBlocks.length - 1];\n if (!first || !last) continue;\n const narrowSel = TextSelection.create(tr.doc, first.pos + 1, last.pos + 1);\n const narrowState = EditorState.create({ doc: tr.doc, selection: narrowSel });\n liftListItem(listItemType)(narrowState, (liftTr) => {\n for (const step of liftTr.steps) {\n tr.step(step);\n }\n });\n }\n } else {\n // Per-cell: skip if already target, convert if in other list, wrap if no list\n for (const cell of cellPositions) {\n const from = tr.mapping.map(cell.from);\n const to = tr.mapping.map(cell.to);\n const cellBlocks = collectListContext(tr.doc, from, to);\n const cellInTarget = cellBlocks.length > 0 && cellBlocks.every((b) => b.inTargetList);\n const cellInSomeList = cellBlocks.length > 0 && cellBlocks.every((b) => b.inSomeList);\n\n if (cellInTarget) {\n continue; // already has target list type\n } else if (cellInSomeList) {\n // Convert: change list type in-place\n const otherPos = cellBlocks.find((b) => b.otherListPos !== null)?.otherListPos;\n if (otherPos === null || otherPos === undefined) continue;\n const listNode = tr.doc.nodeAt(otherPos);\n if (!listNode) continue;\n const firstChild = listNode.firstChild;\n if (firstChild && firstChild.type !== listItemType) {\n // Cross-type (e.g. taskItem → listItem): rebuild items\n const newItems: PMNode[] = [];\n listNode.forEach((child) => {\n newItems.push(listItemType.create(child.attrs, child.content, child.marks));\n });\n tr.replaceWith(otherPos, otherPos + listNode.nodeSize, listType.create(attributes, newItems));\n } else {\n tr.setNodeMarkup(otherPos, listType, attributes);\n }\n } else {\n // Not in any list → wrap\n const $from = tr.doc.resolve(from);\n const $to = tr.doc.resolve(to);\n const blockRange = $from.blockRange($to);\n if (!blockRange) continue;\n wrapRangeInList(tr, blockRange, listType, attributes);\n }\n }\n }\n\n dispatch(tr.scrollIntoView());\n return true;\n }\n\n // Single-range selection\n const { from, to } = tr.selection;\n\n // Children-zone exception. When the cursor is collapsed and sits in\n // a paragraph that is a CHILDREN-ZONE block of a list/task item\n // (i.e. NOT the first-child label paragraph), the user typically\n // wants the slash command, toolbar, etc. to insert a NEW list of\n // the target type at this position rather than to convert the\n // ancestor list. Without this branch, `collectListContext`'s\n // ancestor walk finds the parent list wrapper and the \"convert in\n // place\" path runs, which silently re-types the surrounding bullet\n // list. We wrap the cursor's paragraph in a fresh list of the\n // target type as a sibling within the same children-zone, then\n // run the standard adjacency joins so the new list merges with\n // sibling lists of the same type when applicable (Notion-style\n // \"extend the list\" feel).\n //\n // Only paragraphs are considered: heading / codeBlock have their\n // own slash/Enter semantics and `getListItemCursorContext` already\n // returns null for them.\n if (from === to) {\n const ctx = getListItemCursorContext(tr.selection.$from);\n if (ctx?.isInChildrenZone) {\n if (!dispatch) return true;\n const blockRange = tr.selection.$from.blockRange();\n if (blockRange && wrapRangeInList(tr, blockRange, listType, attributes)) {\n joinListBackwards(tr, listType);\n joinListForwards(tr, listType);\n dispatch(tr.scrollIntoView());\n return true;\n }\n // wrapRangeInList rejected by schema. Fall through to default\n // toggle/convert path so the command still has a chance to do\n // something rather than silently no-op.\n }\n }\n\n const contentBlocks = collectListContext(tr.doc, from, to);\n\n const allInTargetList = contentBlocks.length > 0 && contentBlocks.every((b) => b.inTargetList);\n const allInSomeList = contentBlocks.length > 0 && contentBlocks.every((b) => b.inSomeList);\n\n // Case 1: All non-empty textblocks are in the target list type → lift items out\n if (allInTargetList) {\n const first = contentBlocks[0];\n const last = contentBlocks[contentBlocks.length - 1];\n if (!first || !last) return false;\n const narrowSel = TextSelection.create(tr.doc, first.pos + 1, last.pos + 1);\n const narrowState = EditorState.create({\n doc: tr.doc,\n selection: narrowSel,\n });\n return liftListItem(listItemType)(narrowState, dispatch);\n }\n\n // Case 2: All non-empty textblocks are in some list but not target → convert\n if (allInSomeList) {\n const otherPos = contentBlocks.find((b) => b.otherListPos !== null)?.otherListPos;\n if (otherPos === undefined || otherPos === null) return false;\n\n if (!dispatch) {\n return true; // Can convert\n }\n\n const listNode = tr.doc.nodeAt(otherPos);\n if (!listNode) return false;\n\n const firstChild = listNode.firstChild;\n if (firstChild && firstChild.type !== listItemType) {\n const cursorOffset = tr.selection.from - otherPos;\n const newItems: PMNode[] = [];\n listNode.forEach((child) => {\n newItems.push(listItemType.create(child.attrs, child.content, child.marks));\n });\n const newList = listType.create(attributes, newItems);\n tr.replaceWith(otherPos, otherPos + listNode.nodeSize, newList);\n const restored = otherPos + Math.min(cursorOffset, newList.nodeSize - 1);\n tr.setSelection(TextSelection.near(tr.doc.resolve(restored)));\n } else {\n tr.setNodeMarkup(otherPos, listType, attributes);\n }\n\n dispatch(tr);\n return true;\n }\n\n // Case 3: Not in a list (or mixed) → flatten lists if needed, then wrap\n const blocksInList = contentBlocks.filter((b) => b.inSomeList);\n\n if (blocksInList.length === 0) {\n // Pure wrap: no blocks in any list\n const { $from: $wf, $to: $wt } = tr.selection;\n const wr = $wf.blockRange($wt);\n if (!wr) return false;\n if (!wrapRangeInList(dispatch ? tr : null, wr, listType, attributes)) return false;\n if (dispatch) {\n joinListBackwards(tr, listType);\n joinListForwards(tr, listType);\n dispatch(tr.scrollIntoView());\n }\n return true;\n }\n\n // Mixed selection: some blocks in lists, some not.\n // Flatten existing lists to their child blocks first, then wrap\n // everything in the target list.\n if (!dispatch) return true;\n\n // Collect unique list positions\n const seen = new Set<number>();\n const listPositions: number[] = [];\n for (const block of blocksInList) {\n const $pos = tr.doc.resolve(block.pos);\n for (let d = $pos.depth; d >= 0; d--) {\n const groups = ($pos.node(d).type.spec.group ?? '').split(/\\s+/);\n if (groups.includes('list')) {\n const lpos = $pos.before(d);\n if (!seen.has(lpos)) {\n seen.add(lpos);\n listPositions.push(lpos);\n }\n break;\n }\n }\n }\n\n // Process bottom-to-top so earlier positions stay stable\n listPositions.sort((a, b) => b - a);\n for (const pos of listPositions) {\n const listNode = tr.doc.nodeAt(pos);\n if (!listNode) continue;\n const children: PMNode[] = [];\n listNode.forEach((item) => {\n item.forEach((child) => children.push(child));\n });\n tr.replaceWith(pos, pos + listNode.nodeSize, children);\n }\n\n // Wrap everything in the target list.\n // Use original from/to mapped through the transaction (tr.selection may\n // have collapsed after replaceWith, so we map the raw positions instead).\n const mappedFrom = tr.mapping.map(from, -1);\n const mappedTo = tr.mapping.map(to, 1);\n const $wrapFrom = tr.doc.resolve(mappedFrom);\n const $wrapTo = tr.doc.resolve(mappedTo);\n const wrapRange = $wrapFrom.blockRange($wrapTo);\n if (!wrapRange) return false;\n wrapRangeInList(tr, wrapRange, listType, attributes);\n\n // Merge with adjacent lists of the same type\n joinListBackwards(tr, listType);\n joinListForwards(tr, listType);\n\n dispatch(tr.scrollIntoView());\n return true;\n };\n","/**\n * Attribute commands - updateAttributes, resetAttributes\n */\nimport type { CommandSpec } from '../types/Commands.js';\n\n/**\n * UpdateAttributes command - updates attributes on nodes matching a type\n *\n * Updates attributes on all nodes of the specified type within the selection.\n *\n * @param typeOrName - The node type name or NodeType to update\n * @param attributes - The attributes to merge into existing attributes\n */\nexport const updateAttributes: CommandSpec<[typeOrName: string, attributes: Record<string, unknown>]> =\n (typeOrName: string, attributes: Record<string, unknown>) =>\n ({ state, tr, dispatch }) => {\n const type = state.schema.nodes[typeOrName] ?? state.schema.marks[typeOrName];\n\n if (!type) {\n return false;\n }\n\n const { from, to } = tr.selection;\n const nodeChanges: { pos: number; attrs: Record<string, unknown> }[] = [];\n const markChanges: { pos: number; nodeSize: number; attrs: Record<string, unknown> }[] = [];\n\n // Use tr.doc to support chain context where prior commands may have modified the document\n // For nodes - collect changes\n if (state.schema.nodes[typeOrName]) {\n tr.doc.nodesBetween(from, to, (node, pos) => {\n if (node.type.name === typeOrName) {\n nodeChanges.push({ pos, attrs: { ...node.attrs, ...attributes } });\n }\n });\n }\n\n // For marks - collect changes\n if (state.schema.marks[typeOrName]) {\n const markType = state.schema.marks[typeOrName];\n tr.doc.nodesBetween(from, to, (node, pos) => {\n if (!node.isInline) return;\n\n const mark = markType.isInSet(node.marks);\n if (mark) {\n markChanges.push({\n pos,\n nodeSize: node.nodeSize,\n attrs: { ...mark.attrs, ...attributes },\n });\n }\n });\n }\n\n const hasChanges = nodeChanges.length > 0 || markChanges.length > 0;\n\n if (hasChanges && dispatch) {\n // Apply node changes\n for (const change of nodeChanges) {\n tr.setNodeMarkup(change.pos, undefined, change.attrs);\n }\n\n // Apply mark changes\n if (state.schema.marks[typeOrName]) {\n const markType = state.schema.marks[typeOrName];\n for (const change of markChanges) {\n const newMark = markType.create(change.attrs);\n tr.removeMark(change.pos, change.pos + change.nodeSize, markType);\n tr.addMark(change.pos, change.pos + change.nodeSize, newMark);\n }\n }\n\n dispatch(tr);\n }\n\n return hasChanges;\n };\n\n/**\n * ResetAttributes command - resets an attribute to its default value\n *\n * Resets the specified attribute on all nodes of the given type within the selection\n * to the default value defined in the schema.\n *\n * @param typeOrName - The node type name to update\n * @param attributeName - The name of the attribute to reset\n */\nexport const resetAttributes: CommandSpec<[typeOrName: string, attributeName: string]> =\n (typeOrName: string, attributeName: string) =>\n ({ state, tr, dispatch }) => {\n const nodeType = state.schema.nodes[typeOrName];\n const markType = state.schema.marks[typeOrName];\n\n if (!nodeType && !markType) {\n return false;\n }\n\n const { from, to } = tr.selection;\n const nodeChanges: { pos: number; attrs: Record<string, unknown> }[] = [];\n const markChanges: { pos: number; nodeSize: number; attrs: Record<string, unknown> }[] = [];\n\n // Use tr.doc to support chain context where prior commands may have modified the document\n // For nodes - collect changes\n if (nodeType) {\n const defaultValue: unknown = nodeType.spec.attrs?.[attributeName]?.default;\n\n tr.doc.nodesBetween(from, to, (node, pos) => {\n if (node.type === nodeType) {\n nodeChanges.push({\n pos,\n attrs: { ...node.attrs, [attributeName]: defaultValue },\n });\n }\n });\n }\n\n // For marks - collect changes\n if (markType) {\n const defaultValue: unknown = markType.spec.attrs?.[attributeName]?.default;\n\n tr.doc.nodesBetween(from, to, (node, pos) => {\n if (!node.isInline) return;\n\n const mark = markType.isInSet(node.marks);\n if (mark) {\n markChanges.push({\n pos,\n nodeSize: node.nodeSize,\n attrs: { ...mark.attrs, [attributeName]: defaultValue },\n });\n }\n });\n }\n\n const hasChanges = nodeChanges.length > 0 || markChanges.length > 0;\n\n if (hasChanges && dispatch) {\n // Apply node changes\n for (const change of nodeChanges) {\n tr.setNodeMarkup(change.pos, undefined, change.attrs);\n }\n\n // Apply mark changes\n if (markType) {\n for (const change of markChanges) {\n const newMark = markType.create(change.attrs);\n tr.removeMark(change.pos, change.pos + change.nodeSize, markType);\n tr.addMark(change.pos, change.pos + change.nodeSize, newMark);\n }\n }\n\n dispatch(tr);\n }\n\n return hasChanges;\n };\n","/**\n * Built-in commands for @domternal/core\n *\n * Re-exports from domain-specific command files and assembles the\n * builtInCommands map consumed by CommandManager.\n */\nimport type { CommandMap } from '../types/Commands.js';\n\n// Selection commands\nexport {\n focus,\n blur,\n selectAll,\n selectNodeBackward,\n deleteSelection,\n} from './selectionCommands.js';\n\n// Content commands\nexport {\n setContent,\n clearContent,\n insertText,\n insertContent,\n type SetContentOptions,\n type ClearContentOptions,\n} from './contentCommands.js';\n\n// Mark commands\nexport {\n toggleMark,\n setMark,\n unsetMark,\n unsetAllMarks,\n} from './markCommands.js';\n\n// Node / block commands\nexport {\n setBlockType,\n toggleBlockType,\n wrapIn,\n toggleWrap,\n lift,\n} from './nodeCommands.js';\n\n// List commands\nexport { toggleList } from './listCommands.js';\n\n// Attribute commands\nexport {\n updateAttributes,\n resetAttributes,\n} from './attributeCommands.js';\n\n// --- Assemble the builtInCommands map ---\nimport { focus, blur, selectAll, selectNodeBackward, deleteSelection } from './selectionCommands.js';\nimport { setContent, clearContent, insertText, insertContent } from './contentCommands.js';\nimport { toggleMark, setMark, unsetMark, unsetAllMarks } from './markCommands.js';\nimport { setBlockType, toggleBlockType, wrapIn, toggleWrap, lift } from './nodeCommands.js';\nimport { toggleList } from './listCommands.js';\nimport { updateAttributes, resetAttributes } from './attributeCommands.js';\n\nexport const builtInCommands: CommandMap = {\n focus,\n blur,\n setContent,\n clearContent,\n insertText,\n deleteSelection,\n selectAll,\n toggleMark,\n setMark,\n unsetMark,\n unsetAllMarks,\n setBlockType,\n toggleBlockType,\n wrapIn,\n toggleWrap,\n lift,\n toggleList,\n insertContent,\n selectNodeBackward,\n updateAttributes,\n resetAttributes,\n} as CommandMap;\n\n// Module augmentation: register built-in commands with typed signatures\nimport type { Attrs } from '@domternal/pm/model';\nimport type { CommandSpec } from '../types/Commands.js';\nimport type { FocusPosition, Content } from '../types/index.js';\nimport type { SetContentOptions, ClearContentOptions } from './contentCommands.js';\n\ndeclare module '@domternal/core' {\n interface RawCommands {\n focus: CommandSpec<[position?: FocusPosition]>;\n blur: CommandSpec;\n setContent: CommandSpec<[content: Content, options?: SetContentOptions]>;\n clearContent: CommandSpec<[options?: ClearContentOptions]>;\n insertText: CommandSpec<[text: string]>;\n deleteSelection: CommandSpec;\n selectAll: CommandSpec;\n toggleMark: CommandSpec<[markName: string, attributes?: Attrs]>;\n setMark: CommandSpec<[markName: string, attributes?: Attrs]>;\n unsetMark: CommandSpec<[markName: string]>;\n unsetAllMarks: CommandSpec;\n setBlockType: CommandSpec<[nodeName: string, attributes?: Attrs]>;\n toggleBlockType: CommandSpec<[nodeName: string, defaultNodeName: string, attributes?: Attrs]>;\n wrapIn: CommandSpec<[nodeName: string, attributes?: Attrs]>;\n toggleWrap: CommandSpec<[nodeName: string, attributes?: Attrs]>;\n lift: CommandSpec;\n toggleList: CommandSpec<[listNodeName: string, listItemNodeName: string, attributes?: Attrs]>;\n insertContent: CommandSpec<[content: Content]>;\n selectNodeBackward: CommandSpec;\n updateAttributes: CommandSpec<[typeOrName: string, attributes: Record<string, unknown>]>;\n resetAttributes: CommandSpec<[typeOrName: string, attributeName: string]>;\n }\n}\n","/**\n * Command Props Builder - Shared utility for building CommandProps\n *\n * Provides a factory for creating CommandProps objects with configurable\n * dispatch behavior, used by both ChainBuilder and CanChecker.\n */\nimport { TextSelection } from '@domternal/pm/state';\nimport type { EditorState, Transaction } from '@domternal/pm/state';\nimport type { EditorView } from '@domternal/pm/view';\nimport type {\n CommandProps,\n ChainedCommands,\n CanCommands,\n SingleCommands,\n} from './types/Commands.js';\n\n/**\n * Minimal editor interface for command props building\n */\nexport interface CommandPropsEditor {\n readonly view: EditorView;\n readonly state: EditorState;\n}\n\n/**\n * Options for building CommandProps\n */\nexport interface BuildCommandPropsOptions {\n /** The editor instance */\n editor: CommandPropsEditor;\n\n /** The transaction to use */\n tr: Transaction;\n\n /**\n * Dispatch function - undefined for dry-run mode\n * In chain mode, this accumulates changes on shared transaction\n */\n dispatch: ((tr: Transaction) => void) | undefined;\n\n /** Function to create chain commands */\n chain: () => ChainedCommands;\n\n /** Function to create can commands */\n can: () => CanCommands;\n\n /** Function to create single commands */\n commands: () => SingleCommands;\n}\n\n/**\n * Builds a CommandProps object with the given options\n *\n * @example\n * // For chain mode with dispatch\n * const props = buildCommandProps({\n * editor,\n * tr,\n * dispatch: (transaction) => { ... },\n * chain: () => this.proxy(),\n * can: () => this.buildCanCommands(),\n * commands: () => this.buildSingleCommands(),\n * });\n *\n * @example\n * // For dry-run mode (can check)\n * const props = buildCommandProps({\n * editor,\n * tr,\n * dispatch: undefined,\n * chain: () => createChainBuilder(),\n * can: () => this.proxy(),\n * commands: () => this.buildSingleCommands(tr),\n * });\n */\nexport function buildCommandProps(options: BuildCommandPropsOptions): CommandProps {\n const { editor, tr, dispatch, chain, can, commands } = options;\n\n return {\n // Cast required: CommandPropsEditor is a minimal interface, but CommandProps\n // expects full Editor. Callers ensure the actual editor instance is passed.\n editor: editor as CommandProps['editor'],\n state: editor.view.state,\n tr,\n dispatch,\n chain,\n can,\n commands: commands(),\n };\n}\n\n/**\n * Creates a dispatch function that accumulates steps on a shared transaction\n *\n * Used in chain mode where multiple commands share the same transaction.\n * If a command creates a new transaction, its steps and metadata are copied\n * to the shared one.\n *\n * Metadata propagation is critical for commands like undo/redo:\n * prosemirror-history sets metadata (addToHistory, plugin state) on its\n * transactions. Without copying this metadata, the shared transaction\n * would be recorded as a new history entry, causing undo to oscillate.\n */\nexport function createAccumulatingDispatch(sharedTr: Transaction): (tr: Transaction) => void {\n return (transaction: Transaction): void => {\n if (transaction !== sharedTr) {\n for (const step of transaction.steps) {\n sharedTr.step(step);\n }\n\n // Copy metadata from accumulated transaction to shared transaction.\n // ProseMirror stores metadata as a plain object (tr.meta) accessed\n // via getMeta/setMeta. We access it directly to iterate all entries.\n // Critical for undo/redo: prosemirror-history sets addToHistory and\n // plugin state metadata that must be on the dispatched transaction.\n const meta = (transaction as unknown as { meta: Record<string, unknown> }).meta;\n for (const key of Object.keys(meta)) {\n sharedTr.setMeta(key, meta[key]);\n }\n\n // Copy selection if the accumulated transaction explicitly set one.\n // This ensures commands like undo/redo restore the cursor to the\n // correct position (mapped back through inverted steps).\n // We must re-create the selection against sharedTr.doc because\n // ResolvedPos objects are bound to their document instance.\n if (transaction.selectionSet) {\n const { from, to } = transaction.selection;\n try {\n sharedTr.setSelection(TextSelection.create(sharedTr.doc, from, to));\n } catch {\n // Positions may be invalid if documents diverged - skip\n }\n }\n }\n };\n}\n","/**\n * ChainBuilder - Chainable command builder\n *\n * Provides fluent API for chaining multiple commands with a shared transaction.\n * Commands accumulate changes on the transaction, which is dispatched on run().\n *\n * @example\n * editor.chain()\n * .focus()\n * .insertText('Hello')\n * .toggleBold()\n * .run();\n */\nimport type { EditorState, Transaction } from '@domternal/pm/state';\nimport type { EditorView } from '@domternal/pm/view';\nimport type {\n CommandProps,\n Command,\n CommandMap,\n ChainedCommands,\n SingleCommands,\n CanCommands,\n ChainFailure,\n} from './types/Commands.js';\nimport {\n buildCommandProps,\n createAccumulatingDispatch,\n} from './commandPropsBuilder.js';\n\n/**\n * Editor interface for ChainBuilder\n */\nexport interface ChainBuilderEditor {\n readonly view: EditorView;\n readonly state: EditorState;\n readonly isDestroyed: boolean;\n}\n\n/**\n * Options for creating a ChainBuilder\n */\nexport interface ChainBuilderOptions {\n editor: ChainBuilderEditor;\n rawCommands: CommandMap;\n tr?: Transaction;\n}\n\n/**\n * Builds chainable commands with shared transaction\n *\n * Uses JavaScript Proxy to dynamically generate command methods.\n * Each command method returns `this` for fluent chaining.\n */\nexport class ChainBuilder {\n private readonly editor: ChainBuilderEditor;\n private readonly rawCommands: CommandMap;\n private readonly tr: Transaction;\n private shouldDispatch = true;\n /** Cached proxy instance for performance (avoids creating new Proxy per command) */\n private _cachedProxy: ChainedCommands | null = null;\n /** Tracks the first command failure in the chain */\n private _failure: ChainFailure | null = null;\n /** Current command index in the chain */\n private _commandIndex = 0;\n /** Cached CommandProps for performance */\n private _cachedProps: CommandProps | null = null;\n /** Cached SingleCommands proxy for performance */\n private _cachedSingleCommands: SingleCommands | null = null;\n /** Cached CanCommands proxy for performance */\n private _cachedCanCommands: CanCommands | null = null;\n\n constructor(options: ChainBuilderOptions) {\n this.editor = options.editor;\n this.rawCommands = options.rawCommands;\n // Use provided transaction or create new one from current state\n this.tr = options.tr ?? options.editor.view.state.tr;\n }\n\n /**\n * Gets cached CommandProps or builds new one\n * In chain mode, dispatch adds to shared transaction\n */\n private buildCommandProps(): CommandProps {\n if (this._cachedProps) {\n return this._cachedProps;\n }\n\n const { editor, tr } = this;\n\n this._cachedProps = buildCommandProps({\n editor,\n tr,\n dispatch: createAccumulatingDispatch(tr),\n chain: () => this.proxy(),\n can: () => this.buildCanCommands(),\n commands: () => this.buildSingleCommands(),\n });\n\n return this._cachedProps;\n }\n\n /**\n * Gets cached SingleCommands proxy or builds new one\n */\n private buildSingleCommands(): SingleCommands {\n if (this._cachedSingleCommands) {\n return this._cachedSingleCommands;\n }\n\n const { rawCommands } = this;\n\n this._cachedSingleCommands = new Proxy({} as SingleCommands, {\n get: (_, name: string) => {\n const rawCommand = rawCommands[name];\n if (!rawCommand) {\n return () => false;\n }\n return (...args: unknown[]) => {\n const props = this.buildCommandProps();\n return (rawCommand as (...a: unknown[]) => Command)(...args)(props);\n };\n },\n });\n\n return this._cachedSingleCommands;\n }\n\n /**\n * Gets cached CanCommands proxy or builds new one\n */\n private buildCanCommands(): CanCommands {\n if (this._cachedCanCommands) {\n return this._cachedCanCommands;\n }\n\n const { editor, rawCommands, tr } = this;\n\n this._cachedCanCommands = new Proxy({} as CanCommands, {\n get: (_, name: string) => {\n if (name === 'chain') {\n // Return a function that creates a CanChainBuilder\n return () => this.buildCanChainCommands();\n }\n\n const rawCommand = rawCommands[name];\n if (!rawCommand) {\n return () => false;\n }\n return (...args: unknown[]) => {\n // Dry run - dispatch is undefined\n const props: CommandProps = {\n editor: editor as CommandProps['editor'],\n state: editor.view.state,\n tr,\n dispatch: undefined,\n chain: () => this.proxy(),\n can: () => this.buildCanCommands(),\n commands: this.buildSingleCommands(),\n };\n return (rawCommand as (...a: unknown[]) => Command)(...args)(props);\n };\n },\n });\n\n return this._cachedCanCommands;\n }\n\n /**\n * Builds CanChainedCommands for chained dry-run checks\n */\n private buildCanChainCommands(): ChainedCommands {\n const { editor, rawCommands, tr } = this;\n let allSucceeded = true;\n\n const canChainProxy = new Proxy({} as ChainedCommands, {\n get: (_, name: string) => {\n if (name === 'run') {\n return () => allSucceeded;\n }\n\n const rawCommand = rawCommands[name];\n if (!rawCommand) {\n return () => {\n allSucceeded = false;\n return canChainProxy;\n };\n }\n\n return (...args: unknown[]) => {\n // Dry run - dispatch is undefined\n const props: CommandProps = {\n editor: editor as CommandProps['editor'],\n state: editor.view.state,\n tr,\n dispatch: undefined,\n chain: () => this.proxy(),\n can: () => this.buildCanCommands(),\n commands: this.buildSingleCommands(),\n };\n const result = (rawCommand as (...a: unknown[]) => Command)(...args)(props);\n if (!result) {\n allSucceeded = false;\n }\n return canChainProxy;\n };\n },\n });\n\n return canChainProxy;\n }\n\n /**\n * Execute a custom command within the chain\n *\n * @example\n * editor.chain()\n * .focus()\n * .command(({ tr }) => {\n * tr.insertText('custom');\n * return true;\n * })\n * .run();\n */\n command(fn: (props: CommandProps) => boolean): this {\n const commandIndex = this._commandIndex++;\n const props = this.buildCommandProps();\n const result = fn(props);\n if (!result && !this._failure) {\n this.shouldDispatch = false;\n this._failure = { command: 'command', args: [fn], index: commandIndex };\n }\n return this;\n }\n\n /**\n * Get information about the first command that failed in the chain\n *\n * @returns ChainFailure object or null if no failure occurred\n *\n * @example\n * const chain = editor.chain().toggleBold().setHeading(1);\n * if (!chain.run()) {\n * console.log('Failed:', chain.getFailure());\n * }\n */\n getFailure(): ChainFailure | null {\n return this._failure;\n }\n\n /**\n * Execute the command chain\n * Dispatches the accumulated transaction\n *\n * @returns true if chain was executed successfully\n */\n run(): boolean {\n const { editor, tr, shouldDispatch } = this;\n\n if (editor.isDestroyed) {\n return false;\n }\n\n if (!shouldDispatch) {\n return false;\n }\n\n // Only dispatch if there are actual changes\n if (tr.steps.length === 0 && !tr.selectionSet && !tr.storedMarksSet) {\n return true;\n }\n\n editor.view.dispatch(tr);\n return true;\n }\n\n /**\n * Creates a Proxy that provides dynamic command methods\n * Each method returns `this` for chaining\n *\n * Caches the proxy instance for performance - avoids creating\n * new Proxy objects for each command in the chain.\n */\n proxy(): ChainedCommands {\n if (this._cachedProxy) {\n return this._cachedProxy;\n }\n\n const { rawCommands } = this;\n\n // Create proxy with local const - handlers reference this directly (no assertion needed)\n const proxy: ChainedCommands = new Proxy({} as ChainedCommands, {\n get: (_, name: string) => {\n // Handle special methods\n if (name === 'run') {\n return () => this.run();\n }\n\n if (name === 'getFailure') {\n return () => this.getFailure();\n }\n\n if (name === 'command') {\n return (fn: (props: CommandProps) => boolean) => {\n this.command(fn);\n return proxy;\n };\n }\n\n // Handle dynamic commands\n const rawCommand = rawCommands[name];\n if (!rawCommand) {\n return (...args: unknown[]) => {\n const commandIndex = this._commandIndex++;\n if (!this._failure) {\n this.shouldDispatch = false;\n this._failure = { command: name, args, index: commandIndex };\n }\n return proxy;\n };\n }\n\n return (...args: unknown[]) => {\n const commandIndex = this._commandIndex++;\n const props = this.buildCommandProps();\n const result = (rawCommand as (...a: unknown[]) => Command)(...args)(props);\n if (!result && !this._failure) {\n this.shouldDispatch = false;\n this._failure = { command: name, args, index: commandIndex };\n }\n return proxy;\n };\n },\n });\n\n // Cache for subsequent calls\n this._cachedProxy = proxy;\n return proxy;\n }\n}\n\n/**\n * Creates a new ChainBuilder instance\n */\nexport function createChainBuilder(options: ChainBuilderOptions): ChainedCommands {\n const builder = new ChainBuilder(options);\n return builder.proxy();\n}\n","/**\n * CanChecker - Dry-run command checker\n *\n * Provides API for checking if commands CAN be executed without actually executing them.\n * Commands receive dispatch=undefined to indicate dry-run mode.\n *\n * @example\n * // Check single command\n * if (editor.can().toggleBold()) {\n * // Bold can be applied\n * }\n *\n * // Check command chain\n * if (editor.can().chain().toggleBold().toggleItalic().run()) {\n * // Both commands can be executed\n * }\n */\nimport type { EditorState, Transaction } from '@domternal/pm/state';\nimport type { EditorView } from '@domternal/pm/view';\nimport type {\n CommandProps,\n Command,\n CommandMap,\n CanCommands,\n CanChainedCommands,\n SingleCommands,\n ChainedCommands,\n} from './types/Commands.js';\nimport { buildCommandProps } from './commandPropsBuilder.js';\n\n/**\n * Editor interface for CanChecker\n */\nexport interface CanCheckerEditor {\n readonly view: EditorView;\n readonly state: EditorState;\n readonly isDestroyed: boolean;\n}\n\n/**\n * Options for creating a CanChecker\n */\nexport interface CanCheckerOptions {\n editor: CanCheckerEditor;\n rawCommands: CommandMap;\n /** Function to create a ChainBuilder for chain() within commands */\n createChainBuilder: () => ChainedCommands;\n /**\n * Optional callback when an unknown command is accessed\n * Useful for debugging - called with command name and context\n */\n onUnknownCommand?: (name: string, context: 'single' | 'chain') => void;\n}\n\n/**\n * Checks if commands can be executed (dry-run mode)\n *\n * Uses JavaScript Proxy to dynamically generate command methods.\n * Each command is executed with dispatch=undefined.\n */\nexport class CanChecker {\n private readonly editor: CanCheckerEditor;\n private readonly rawCommands: CommandMap;\n private readonly createChainBuilder: () => ChainedCommands;\n private readonly onUnknownCommand: ((name: string, context: 'single' | 'chain') => void) | undefined;\n\n constructor(options: CanCheckerOptions) {\n this.editor = options.editor;\n this.rawCommands = options.rawCommands;\n this.createChainBuilder = options.createChainBuilder;\n this.onUnknownCommand = options.onUnknownCommand;\n }\n\n /**\n * Builds CommandProps for dry-run checks\n * dispatch is undefined to indicate dry-run mode\n */\n private buildDryRunProps(tr: Transaction): CommandProps {\n const { editor } = this;\n\n return buildCommandProps({\n editor,\n tr,\n dispatch: undefined, // Key difference: undefined for dry-run\n chain: this.createChainBuilder,\n can: () => this.proxy(),\n commands: () => this.buildSingleCommands(tr),\n });\n }\n\n /**\n * Builds SingleCommands for use within can() checks\n */\n private buildSingleCommands(tr: Transaction): SingleCommands {\n const { rawCommands } = this;\n\n return new Proxy({} as SingleCommands, {\n get: (_, name: string) => {\n const rawCommand = rawCommands[name];\n if (!rawCommand) {\n return () => false;\n }\n return (...args: unknown[]) => {\n const props = this.buildDryRunProps(tr);\n return (rawCommand as (...a: unknown[]) => Command)(...args)(props);\n };\n },\n });\n }\n\n /**\n * Creates a Proxy that provides dynamic can() methods\n * Each method returns boolean indicating if command can execute\n */\n proxy(): CanCommands {\n const { editor, rawCommands } = this;\n\n return new Proxy({} as CanCommands, {\n get: (_, name: string) => {\n // Handle chain() method\n if (name === 'chain') {\n return () => this.chainProxy();\n }\n\n // Handle dynamic commands\n const rawCommand = rawCommands[name];\n if (!rawCommand) {\n this.onUnknownCommand?.(name, 'single');\n return () => false;\n }\n\n return (...args: unknown[]) => {\n if (editor.isDestroyed) {\n return false;\n }\n\n const tr = editor.view.state.tr;\n const props = this.buildDryRunProps(tr);\n return (rawCommand as (...a: unknown[]) => Command)(...args)(props);\n };\n },\n });\n }\n\n /**\n * Creates a chain proxy for can().chain()\n * Tracks if all commands in chain can execute\n */\n chainProxy(): CanChainedCommands {\n const { editor, rawCommands } = this;\n let allSucceeded = true;\n const tr = editor.view.state.tr;\n\n const chainProxy: CanChainedCommands = new Proxy({} as CanChainedCommands, {\n get: (_, name: string) => {\n // Handle run() - returns accumulated result\n if (name === 'run') {\n return () => allSucceeded;\n }\n\n // Handle dynamic commands\n const rawCommand = rawCommands[name];\n if (!rawCommand) {\n this.onUnknownCommand?.(name, 'chain');\n return () => {\n allSucceeded = false;\n return chainProxy;\n };\n }\n\n return (...args: unknown[]) => {\n if (editor.isDestroyed) {\n allSucceeded = false;\n return chainProxy;\n }\n\n const props = this.buildDryRunProps(tr);\n const result = (rawCommand as (...a: unknown[]) => Command)(...args)(props);\n if (!result) {\n allSucceeded = false;\n }\n return chainProxy;\n };\n },\n });\n\n return chainProxy;\n }\n}\n\n/**\n * Creates a new CanChecker instance\n */\nexport function createCanChecker(options: CanCheckerOptions): CanCommands {\n const checker = new CanChecker(options);\n return checker.proxy();\n}\n","/**\n * CommandManager - Manages editor commands\n *\n * Provides unified command API with:\n * - Dynamic commands from extensions\n * - Built-in commands (focus, blur, setContent, etc.)\n * - chain() for chainable commands\n * - can() for checking command availability\n */\nimport type { Transaction } from '@domternal/pm/state';\nimport type { EditorView } from '@domternal/pm/view';\nimport type {\n CommandProps,\n Command,\n CommandMap,\n SingleCommands,\n ChainedCommands,\n CanCommands,\n} from './types/Commands.js';\nimport { builtInCommands } from './commands/index.js';\nimport { createChainBuilder } from './ChainBuilder.js';\nimport { createCanChecker } from './CanChecker.js';\n\n// Re-export option types for backward compatibility\nexport type { SetContentOptions, ClearContentOptions } from './commands/index.js';\n\n/**\n * Editor interface for CommandManager\n * Forward declaration to avoid circular dependency\n */\nexport interface CommandManagerEditor {\n readonly view: EditorView;\n readonly state: CommandManagerEditor['view']['state'];\n readonly isDestroyed: boolean;\n emit(event: string, props?: unknown): void;\n /** Extension manager for collecting extension commands */\n readonly extensionManager: {\n readonly commands: CommandMap;\n };\n}\n\n/**\n * Manages editor commands\n *\n * Provides:\n * - editor.commands.* - Single commands that execute immediately\n * - editor.chain().*.run() - Chainable commands with shared transaction\n * - editor.can().* - Dry-run checks if commands can execute\n */\nexport class CommandManager {\n private readonly editor: CommandManagerEditor;\n\n /** Cached raw commands (built-in + extension) */\n private _rawCommands: CommandMap | null = null;\n\n /** Cached commands proxy to avoid allocation on every access */\n private _cachedCommands: SingleCommands | null = null;\n\n /** Cached dispatch function to avoid allocation on every command */\n private readonly _dispatch: (tr: Transaction) => void;\n\n constructor(editor: CommandManagerEditor) {\n this.editor = editor;\n this._dispatch = (tr: Transaction): void => {\n editor.view.dispatch(tr);\n };\n }\n\n /**\n * Gets all raw commands (built-in + extension commands)\n * Cached after first access\n */\n get rawCommands(): CommandMap {\n this._rawCommands ??= {\n ...builtInCommands,\n ...this.editor.extensionManager.commands,\n };\n return this._rawCommands;\n }\n\n /**\n * Builds CommandProps for executing a command\n */\n private buildCommandProps(tr: Transaction, dispatch?: (tr: Transaction) => void): CommandProps {\n const { editor } = this;\n\n return {\n // Cast needed: CommandManagerEditor is a minimal interface for dependency injection,\n // but CommandProps expects the full Editor type. Callers pass the actual Editor instance.\n editor: editor as unknown as CommandProps['editor'],\n state: editor.state,\n tr,\n dispatch,\n chain: () => this.chain(),\n can: () => this.can(),\n commands: this.commands,\n };\n }\n\n /**\n * Single commands that execute immediately.\n * Uses a Proxy to dynamically generate command methods.\n *\n * @example\n * editor.commands.focus('end');\n * editor.commands.insertText('Hello');\n */\n get commands(): SingleCommands {\n if (this._cachedCommands) return this._cachedCommands;\n\n const { editor, rawCommands } = this;\n\n this._cachedCommands = new Proxy({} as SingleCommands, {\n get: (_, name: string) => {\n const rawCommand = rawCommands[name];\n if (!rawCommand) {\n return () => false;\n }\n\n return (...args: unknown[]) => {\n if (editor.isDestroyed) {\n return false;\n }\n\n // Create fresh transaction for each command\n const tr = editor.state.tr;\n\n const props = this.buildCommandProps(tr, this._dispatch);\n return (rawCommand as (...a: unknown[]) => Command)(...args)(props);\n };\n },\n });\n\n return this._cachedCommands;\n }\n\n /**\n * Creates a chainable command builder\n *\n * Commands accumulate on a shared transaction, dispatched on run()\n *\n * @example\n * editor.chain()\n * .focus()\n * .insertText('Hello')\n * .run();\n */\n chain(): ChainedCommands {\n const { editor, rawCommands } = this;\n\n return createChainBuilder({\n editor,\n rawCommands,\n });\n }\n\n /**\n * Creates a command availability checker (dry-run mode)\n *\n * Commands are executed with dispatch=undefined to check if they can run\n *\n * @example\n * if (editor.can().toggleBold()) {\n * // Bold can be applied\n * }\n *\n * if (editor.can().chain().toggleBold().toggleItalic().run()) {\n * // Both can be applied\n * }\n */\n can(): CanCommands {\n const { editor, rawCommands } = this;\n\n return createCanChecker({\n editor,\n rawCommands,\n createChainBuilder: () => this.chain(),\n });\n }\n\n /**\n * Clears cached commands\n * Call this if extensions change dynamically\n */\n clearCache(): void {\n this._rawCommands = null;\n this._cachedCommands = null;\n }\n}\n","/**\n * Inline Styles Utility\n *\n * Applies inline CSS styles to serialized HTML so it renders correctly\n * when pasted outside the editor (email clients, CMS, Google Docs, etc.).\n *\n * Uses hardcoded light-theme defaults (same approach as Google Docs, Notion,\n * TinyMCE). Optionally accepts overrides for custom styling.\n *\n * Only structural styles are inlined (borders, padding, margins, fonts).\n * Colors are NOT inlined - explicit colors (TextColor, Highlight, cell bg)\n * are already inline from renderHTML, and default text color is browser default.\n */\n\n// ---------------------------------------------------------------------------\n// Override keys - users can override any of these\n// ---------------------------------------------------------------------------\n\nexport interface InlineStyleOverrides {\n blockquoteBorder?: string;\n blockquoteColor?: string;\n tableBorder?: string;\n tableHeaderBg?: string;\n codeBg?: string;\n codeFont?: string;\n codeBorder?: string;\n codeBlockBg?: string;\n codeBlockFont?: string;\n hrBorder?: string;\n linkColor?: string;\n detailsBorder?: string;\n detailsBg?: string;\n /**\n * How to export table column widths from `data-colwidth` attributes.\n * - `'percent'` (default): convert to percentage widths on first-row cells\n * - `'pixel'`: convert to pixel widths on first-row cells, table gets fixed width\n * - `'none'`: leave `data-colwidth` as-is, no width styles applied\n */\n tableColumnWidths?: 'percent' | 'pixel' | 'none';\n /**\n * Optional callback to syntax-highlight code blocks.\n * Receives the raw text content and optional language, returns highlighted HTML\n * with `<span class=\"hljs-*\">` markup (or any spans with inline styles).\n *\n * @example\n * ```ts\n * import { createLowlight, common } from 'lowlight';\n * import { toHtml } from 'hast-util-to-html';\n * const lowlight = createLowlight(common);\n *\n * inlineStyles(html, {\n * codeHighlighter: (code, language) => {\n * if (language && lowlight.registered(language)) {\n * return toHtml(lowlight.highlight(language, code));\n * }\n * return null; // no highlighting\n * },\n * });\n * ```\n */\n codeHighlighter?: (code: string, language: string | null) => string | null;\n}\n\n// ---------------------------------------------------------------------------\n// Syntax highlighting colors (from packages/theme/src/_syntax.scss)\n// GitHub-style light theme - hardcoded for consistent export.\n// ---------------------------------------------------------------------------\n\nconst SYNTAX_COLORS: Record<string, string> = {\n // Keywords, types, doctags\n 'hljs-doctag': '#d73a49',\n 'hljs-keyword': '#d73a49',\n 'hljs-template-tag': '#d73a49',\n 'hljs-template-variable': '#d73a49',\n 'hljs-type': '#d73a49',\n\n // Function & class names\n 'hljs-title': '#6f42c1',\n\n // Constants, numbers, operators, attributes\n 'hljs-attr': '#005cc5',\n 'hljs-attribute': '#005cc5',\n 'hljs-literal': '#005cc5',\n 'hljs-meta': '#005cc5',\n 'hljs-number': '#005cc5',\n 'hljs-operator': '#005cc5',\n 'hljs-variable': '#e36209',\n 'hljs-selector-attr': '#005cc5',\n 'hljs-selector-class': '#005cc5',\n 'hljs-selector-id': '#005cc5',\n\n // Strings & regex\n 'hljs-regexp': '#032f62',\n 'hljs-string': '#032f62',\n\n // Built-ins & symbols\n 'hljs-built_in': '#e36209',\n 'hljs-symbol': '#e36209',\n\n // Comments\n 'hljs-comment': '#6a737d',\n 'hljs-code': '#6a737d',\n 'hljs-formula': '#6a737d',\n\n // HTML/XML tag names, selectors\n 'hljs-name': '#22863a',\n 'hljs-quote': '#22863a',\n 'hljs-selector-tag': '#22863a',\n 'hljs-selector-pseudo': '#22863a',\n\n // Markup\n 'hljs-section': '#005cc5',\n 'hljs-bullet': '#22863a',\n\n // Diff\n 'hljs-addition': '#22863a',\n 'hljs-deletion': '#b31d28',\n};\n\n// ---------------------------------------------------------------------------\n// Light-theme defaults (from packages/theme/src/_variables.scss)\n// ---------------------------------------------------------------------------\n\ntype StyleDefaults = Required<Omit<InlineStyleOverrides, 'codeHighlighter'>>;\n\nconst DEFAULTS: StyleDefaults = {\n blockquoteBorder: '3px solid #6a6a6a',\n blockquoteColor: '#6a6a6a',\n tableBorder: '1px solid #e5e7eb',\n tableHeaderBg: '#f8f9fa',\n codeBg: '#f0f0f0',\n codeFont: '\"SF Mono\", \"Fira Code\", Consolas, \"Liberation Mono\", Menlo, monospace',\n codeBorder: '1px solid #e5e7eb',\n codeBlockBg: '#f0f0f0',\n codeBlockFont: '\"SF Mono\", \"Fira Code\", Consolas, \"Liberation Mono\", Menlo, monospace',\n hrBorder: '2px solid #e5e7eb',\n linkColor: '#2563eb',\n detailsBorder: '1px solid #e5e7eb',\n detailsBg: '#f8f9fa',\n tableColumnWidths: 'percent' as const,\n};\n\n// ---------------------------------------------------------------------------\n// Core implementation\n// ---------------------------------------------------------------------------\n\nfunction resolveOverrides(overrides?: InlineStyleOverrides): StyleDefaults {\n if (!overrides) return DEFAULTS;\n return { ...DEFAULTS, ...overrides };\n}\n\n/**\n * Applies inline styles to all elements in a container.\n * Exported for use in clipboardSerializer (operates on DOM directly).\n */\nexport function applyInlineStyles(container: HTMLElement, overrides?: InlineStyleOverrides): void {\n const v = resolveOverrides(overrides);\n\n // Syntax-highlight code blocks if a highlighter is provided\n if (overrides?.codeHighlighter) {\n const codeBlocks = Array.from(container.querySelectorAll('pre > code'));\n for (const code of codeBlocks) {\n const raw = code.textContent || '';\n const langClass = Array.from(code.classList).find(c => c.startsWith('language-'));\n const language = langClass ? langClass.slice('language-'.length) : null;\n const highlighted = overrides.codeHighlighter(raw, language);\n if (highlighted !== null) {\n code.innerHTML = highlighted;\n }\n }\n }\n\n const elements = Array.from(container.querySelectorAll('blockquote, table, td, th, pre, code, hr, a, img, h1, h2, h3, h4, h5, h6, ul, ol, li, details, summary, div, span'));\n\n for (const el of elements) {\n const tag = el.tagName;\n const existing = el.getAttribute('style') ?? '';\n let styles = '';\n\n switch (tag) {\n case 'BLOCKQUOTE':\n styles = `border-left: ${v.blockquoteBorder}; color: ${v.blockquoteColor}; margin: 0.75em 0; padding: 0.25em 0 0.25em 1em;`;\n break;\n\n case 'TABLE':\n styles = `border-collapse: collapse; width: 100%; margin: 0.75em 0;`;\n break;\n\n case 'TD': {\n styles = `border: ${v.tableBorder}; padding: 0.5em 0.75em; overflow-wrap: break-word; word-wrap: break-word; box-sizing: border-box;`;\n const tdTextAlign = el.getAttribute('data-text-align');\n if (tdTextAlign) styles += ` text-align: ${tdTextAlign};`;\n const tdVerticalAlign = el.getAttribute('data-vertical-align');\n if (tdVerticalAlign) styles += ` vertical-align: ${tdVerticalAlign};`;\n break;\n }\n\n case 'TH': {\n styles = `border: ${v.tableBorder}; padding: 0.5em 0.75em; overflow-wrap: break-word; word-wrap: break-word; box-sizing: border-box; font-weight: 600; background: ${v.tableHeaderBg}; text-align: left;`;\n const thTextAlign = el.getAttribute('data-text-align');\n if (thTextAlign) styles += ` text-align: ${thTextAlign};`;\n const thVerticalAlign = el.getAttribute('data-vertical-align');\n if (thVerticalAlign) styles += ` vertical-align: ${thVerticalAlign};`;\n break;\n }\n\n case 'PRE':\n styles = `background: ${v.codeBlockBg}; font-family: ${v.codeBlockFont}; font-size: 0.875em; padding: 1em; border-radius: 0.375rem; overflow-x: auto; margin: 0.75em 0;`;\n break;\n\n case 'CODE': {\n const parent = el.parentElement;\n if (parent?.tagName === 'PRE') {\n // Code inside pre - reset inline code styles\n styles = 'background: none; padding: 0; border: none; border-radius: 0; font-size: inherit;';\n } else {\n // Inline code\n styles = `background: ${v.codeBg}; font-family: ${v.codeFont}; font-size: 0.875em; padding: 0.15em 0.35em; border: ${v.codeBorder}; border-radius: 0.25rem;`;\n }\n break;\n }\n\n case 'HR':\n styles = `border: none; border-top: ${v.hrBorder}; margin: 1.5em 0;`;\n break;\n\n case 'A':\n styles = `color: ${v.linkColor}; text-decoration: underline;`;\n break;\n\n case 'IMG':\n styles = 'max-width: 100%; height: auto; display: block; margin: 0.75em 0;';\n break;\n\n case 'H1':\n styles = 'font-size: 2em; font-weight: 700; line-height: 1.25; margin: 1.5em 0 0.5em;';\n break;\n case 'H2':\n styles = 'font-size: 1.5em; font-weight: 700; line-height: 1.25; margin: 1.5em 0 0.5em;';\n break;\n case 'H3':\n styles = 'font-size: 1.25em; font-weight: 700; line-height: 1.25; margin: 1.5em 0 0.5em;';\n break;\n case 'H4':\n styles = 'font-size: 1.1em; font-weight: 700; line-height: 1.25; margin: 1.5em 0 0.5em;';\n break;\n case 'H5':\n styles = 'font-size: 1em; font-weight: 700; line-height: 1.25; margin: 1.5em 0 0.5em;';\n break;\n case 'H6':\n styles = 'font-size: 0.9em; font-weight: 700; line-height: 1.25; margin: 1.5em 0 0.5em;';\n break;\n\n case 'UL':\n if (el.getAttribute('data-type') === 'taskList') {\n styles = 'list-style: none; padding-left: 0; margin: 0.75em 0;';\n } else {\n styles = 'margin: 0.75em 0; padding-left: 1.5em;';\n }\n break;\n\n case 'OL':\n styles = 'margin: 0.75em 0; padding-left: 1.5em;';\n break;\n\n case 'LI':\n if (el.getAttribute('data-type') === 'taskItem') {\n styles = 'display: flex; align-items: flex-start; gap: 0.5em; margin: 0.25em 0;';\n // Checked task item - style the content div\n if (el.getAttribute('data-checked') === 'true') {\n const contentDiv = el.querySelector(':scope > div');\n if (contentDiv) {\n const contentExisting = contentDiv.getAttribute('style') ?? '';\n contentDiv.setAttribute(\n 'style',\n 'text-decoration: line-through; opacity: 0.6;' + contentExisting,\n );\n }\n }\n } else {\n styles = 'margin: 0.25em 0;';\n }\n break;\n\n case 'DETAILS':\n styles = `border: ${v.detailsBorder}; border-radius: 0.375rem; margin: 0.75em 0;`;\n break;\n\n case 'SUMMARY':\n styles = `font-weight: 600; padding: 0.5em 0.75em; background: ${v.detailsBg}; border-radius: 0.375rem 0.375rem 0 0; cursor: pointer; list-style: none;`;\n break;\n\n case 'DIV':\n if (el.hasAttribute('data-details-content')) {\n styles = `padding: 0.5em 0.75em; border-top: ${v.detailsBorder};`;\n }\n break;\n\n case 'SPAN': {\n if (!el.className) break;\n // Syntax highlighting - apply inline color for hljs-* classes\n const classList = el.className.split(' ');\n for (const cls of classList) {\n const color = SYNTAX_COLORS[cls];\n if (color) {\n styles = `color: ${color};`;\n break;\n }\n }\n // hljs-section is bold, hljs-emphasis italic, hljs-strong bold\n if (el.classList.contains('hljs-section') || el.classList.contains('hljs-strong')) {\n styles += ' font-weight: bold;';\n }\n if (el.classList.contains('hljs-emphasis')) {\n styles += ' font-style: italic;';\n }\n // Diff backgrounds\n if (el.classList.contains('hljs-addition')) {\n styles += ' background-color: #f0fff4;';\n }\n if (el.classList.contains('hljs-deletion')) {\n styles += ' background-color: #ffeef0;';\n }\n break;\n }\n }\n\n // Merge: theme defaults first, then existing inline styles (user-set wins)\n if (styles) {\n el.setAttribute('style', styles + ' ' + existing);\n }\n }\n\n // --- Table column widths (second pass) ---\n if (v.tableColumnWidths !== 'none') {\n const tables = Array.from(container.querySelectorAll('table'));\n for (const table of tables) {\n const firstRow = table.querySelector('tr');\n if (!firstRow) continue;\n\n const firstRowCells = Array.from(firstRow.querySelectorAll<HTMLElement>('td, th'));\n // Collect all column widths from first-row cells (handles colspan via comma-separated values)\n const widths: number[] = [];\n let allHaveWidths = true;\n for (const cell of firstRowCells) {\n const raw = cell.getAttribute('data-colwidth');\n if (!raw) { allHaveWidths = false; break; }\n const parsed = raw.split(',').map(Number);\n if (parsed.some(n => !n || isNaN(n))) { allHaveWidths = false; break; }\n widths.push(...parsed);\n }\n if (!allHaveWidths || widths.length === 0) continue;\n\n const sum = widths.reduce((s, w) => s + w, 0);\n\n // table-layout: fixed ensures the browser respects the exact widths\n const tableStyle = table.getAttribute('style') ?? '';\n if (v.tableColumnWidths === 'percent') {\n table.setAttribute('style', tableStyle + ' table-layout: fixed;');\n for (const cell of firstRowCells) {\n const raw = cell.getAttribute('data-colwidth') ?? '';\n const parsed = raw.split(',').map(Number);\n const cellPercent = parsed.reduce((s, w) => s + w, 0) / sum * 100;\n const existing = cell.getAttribute('style') ?? '';\n cell.setAttribute('style', existing + ` width: ${cellPercent.toFixed(2)}%;`);\n }\n } else {\n // pixel mode\n table.setAttribute('style', tableStyle.replace(/width:\\s*100%/, `width: ${String(sum)}px`) + ' table-layout: fixed;');\n for (const cell of firstRowCells) {\n const raw = cell.getAttribute('data-colwidth') ?? '';\n const parsed = raw.split(',').map(Number);\n const cellWidth = parsed.reduce((s, w) => s + w, 0);\n const existing = cell.getAttribute('style') ?? '';\n cell.setAttribute('style', existing + ` width: ${String(cellWidth)}px;`);\n }\n }\n\n // Keep data-colwidth on cells for round-trip back into the editor\n }\n }\n}\n\n/**\n * Takes an HTML string and returns it with inline CSS styles applied\n * to all elements, so it renders correctly outside the editor.\n *\n * @param html - Serialized HTML string from editor.getHTML()\n * @param overrides - Optional style overrides for custom theming\n *\n * @example\n * ```ts\n * // Default light-theme styles\n * const styled = inlineStyles(editor.getHTML());\n *\n * // With custom overrides\n * const styled = inlineStyles(editor.getHTML(), {\n * blockquoteBorder: '5px solid red',\n * linkColor: '#ff6600',\n * });\n * ```\n */\nexport function inlineStyles(html: string, overrides?: InlineStyleOverrides): string {\n if (!html) return html;\n\n const div = document.createElement('div');\n div.innerHTML = html;\n applyInlineStyles(div, overrides);\n return div.innerHTML;\n}\n","/**\n * Normalizes browser-computed color values (rgb/rgba) to hex format.\n * Browsers convert hex colors to rgb() in element.style, causing\n * isActive mismatches when comparing stored values after HTML re-parsing.\n */\nexport function normalizeColor(color: string): string {\n const rgbMatch = /^rgba?\\(\\s*(\\d+)[\\s,]+(\\d+)[\\s,]+(\\d+)/.exec(color);\n if (rgbMatch?.[1] && rgbMatch[2] && rgbMatch[3]) {\n const r = parseInt(rgbMatch[1], 10);\n const g = parseInt(rgbMatch[2], 10);\n const b = parseInt(rgbMatch[3], 10);\n return `#${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${b.toString(16).padStart(2, '0')}`;\n }\n return color;\n}\n","/**\n * Editor - Main editor class wrapping ProseMirror\n *\n * Manages extensions, schema, commands, and the ProseMirror EditorView/State.\n */\nimport type { Transaction, Plugin, PluginKey } from '@domternal/pm/state';\nimport { EditorState } from '@domternal/pm/state';\nimport { EditorView } from '@domternal/pm/view';\nimport { DOMSerializer } from '@domternal/pm/model';\nimport type { Schema, Fragment } from '@domternal/pm/model';\n\nimport { EventEmitter } from './EventEmitter.js';\nimport { ExtensionManager } from './ExtensionManager.js';\nimport { CommandManager } from './CommandManager.js';\nimport { createDocument, isDocumentEmpty } from './helpers/index.js';\nimport { inlineStyles, type InlineStyleOverrides } from './utils/inlineStyles.js';\nimport { normalizeColor } from './helpers/normalizeColor.js';\nimport {\n focus as focusCommand,\n blur as blurCommand,\n setContent as setContentCommand,\n clearContent as clearContentCommand,\n} from './commands/index.js';\nimport type {\n EditorOptions,\n EditorEvents,\n Content,\n JSONContent,\n FocusPosition,\n SingleCommands,\n ChainedCommands,\n CanCommands,\n Command,\n ToolbarItem,\n FloatingMenuItem,\n} from './types/index.js';\n\n/**\n * Main editor class\n *\n * Wraps ProseMirror's EditorView and EditorState with a cleaner API.\n *\n * @example\n * ```ts\n * import { Editor } from '@domternal/core';\n * import { Schema } from '@domternal/pm/model';\n *\n * const schema = new Schema({\n * nodes: { doc: { content: 'paragraph+' }, paragraph: { content: 'text*' }, text: {} }\n * });\n *\n * const editor = new Editor({\n * schema,\n * element: document.getElementById('editor'),\n * content: '<p>Hello world</p>',\n * });\n *\n * // Get content\n * const json = editor.getJSON();\n * const html = editor.getHTML();\n *\n * // Set content\n * editor.commands.setContent('<p>New content</p>');\n *\n * // Cleanup\n * editor.destroy();\n * ```\n */\nexport class Editor extends EventEmitter<EditorEvents> {\n /**\n * Editor configuration options\n */\n private options: EditorOptions;\n\n /**\n * Manages extensions and schema\n * @internal Exposed for CommandManager, not for public use\n */\n private _extensionManager!: ExtensionManager;\n\n /**\n * Gets the extension manager\n * @internal For CommandManager use only\n */\n get extensionManager(): ExtensionManager {\n return this._extensionManager;\n }\n\n /**\n * Manages commands\n */\n private commandManager!: CommandManager;\n\n /**\n * ProseMirror EditorView instance\n */\n public view!: EditorView;\n\n /**\n * Whether the editor has been destroyed\n */\n private _isDestroyed = false;\n\n /**\n * Timer for autofocus (cleared on destroy to prevent memory leaks)\n */\n private _autofocusTimer: ReturnType<typeof setTimeout> | null = null;\n\n /**\n * Creates a new Editor instance\n *\n * @param options - Editor configuration\n * @throws Error if running in SSR environment (no window)\n * @throws Error if schema is not provided\n */\n constructor(options: EditorOptions) {\n super();\n\n // SSR Guard - Editor requires browser environment\n if (typeof window === 'undefined') {\n throw new Error(\n 'Editor requires a browser environment. ' +\n 'For server-side rendering, use generateHTML() and generateJSON() helpers instead.'\n );\n }\n\n // Validate: need either schema or extensions\n if (!options.schema && (!options.extensions || options.extensions.length === 0)) {\n throw new Error(\n 'Editor requires either schema or extensions. ' +\n 'Provide a ProseMirror schema directly, or use extensions like [Document, Paragraph, Text].'\n );\n }\n\n this.options = {\n editable: true,\n ...options,\n };\n\n this.createEditor();\n }\n\n // === Getters ===\n\n /**\n * Gets the current EditorState\n */\n get state(): EditorState {\n return this.view.state;\n }\n\n /**\n * Gets the ProseMirror schema\n */\n get schema(): Schema {\n return this._extensionManager.schema;\n }\n\n /**\n * Checks if the editor is editable\n */\n get isEditable(): boolean {\n return this.view.editable;\n }\n\n /**\n * Checks if the editor content is empty\n */\n get isEmpty(): boolean {\n return isDocumentEmpty(this.state.doc);\n }\n\n /**\n * Checks if the editor has focus\n */\n get isFocused(): boolean {\n return this.view.hasFocus();\n }\n\n /**\n * Checks if the editor has been destroyed\n */\n get isDestroyed(): boolean {\n return this._isDestroyed;\n }\n\n /**\n * Gets single commands for immediate execution\n * @example editor.commands.focus('end')\n */\n get commands(): SingleCommands {\n return this.commandManager.commands;\n }\n\n /**\n * Creates a command chain for batched execution\n * @example editor.chain().focus().insertText('Hello').run()\n */\n chain(): ChainedCommands {\n return this.commandManager.chain();\n }\n\n /**\n * Checks if commands can be executed (dry-run)\n * @example if (editor.can().toggleBold()) { ... }\n */\n can(): CanCommands {\n return this.commandManager.can();\n }\n\n /**\n * Gets extension storage\n * Access via: editor.storage.extensionName.propertyName\n */\n get storage(): Record<string, unknown> {\n return this._extensionManager.storage;\n }\n\n /**\n * Toolbar items registered by all extensions.\n */\n get toolbarItems(): ToolbarItem[] {\n return this._extensionManager.toolbarItems;\n }\n\n /**\n * Floating-menu items registered by all extensions, rendered as the\n * block-insert menu shown on empty paragraphs.\n */\n get floatingMenuItems(): FloatingMenuItem[] {\n return this._extensionManager.floatingMenuItems;\n }\n\n // === Active State Methods ===\n\n /**\n * Checks if a node or mark is currently active\n *\n * For toolbar button states - returns true if:\n * - For marks: the current selection has the mark applied\n * - For nodes: the cursor is inside that node type\n *\n * @param nameOrAttributes - Extension name, or object with name and attributes\n * @param attributes - Optional attributes to match (for node/mark specific states)\n *\n * @example\n * editor.isActive('bold') // → true if bold mark is active\n * editor.isActive('heading', { level: 2 }) // → true if in h2\n * editor.isActive({ name: 'textAlign', attributes: { align: 'center' } })\n */\n isActive(\n nameOrAttributes: string | { name: string; attributes?: Record<string, unknown> },\n attributes?: Record<string, unknown>\n ): boolean {\n // Normalize arguments\n const name = typeof nameOrAttributes === 'string' ? nameOrAttributes : nameOrAttributes.name;\n const attrs = typeof nameOrAttributes === 'string' ? attributes : nameOrAttributes.attributes;\n\n const { state } = this;\n const { selection, schema } = state;\n const { from, to, $from } = selection;\n\n // Check if it's a mark\n const markType = schema.marks[name];\n if (markType) {\n // For empty selection, check marks at cursor or stored marks\n if (selection.empty) {\n const storedMarks = state.storedMarks ?? $from.marks();\n const hasMark = storedMarks.some(mark => mark.type === markType);\n if (!hasMark) return false;\n\n // Check attributes if specified\n if (attrs) {\n const mark = storedMarks.find(m => m.type === markType);\n return mark ? this.matchAttributes(mark.attrs, attrs) : false;\n }\n return true;\n }\n\n // For range selection, check if all applicable text has the mark.\n // Skip text that can't have this mark: inside blocks that don't allow it\n // (e.g. code blocks) or carrying a mark that excludes it (e.g. inline code).\n const check = { hasApplicableText: false, hasMark: true };\n state.doc.nodesBetween(from, to, (node, _pos, parent) => {\n if (node.isText) {\n if (parent && !parent.type.allowsMarkType(markType)) {\n return; // skip text in mark-incompatible blocks\n }\n if (node.marks.some(m => m.type.excludes(markType) && m.type !== markType)) {\n return; // skip text with marks that exclude this mark type\n }\n check.hasApplicableText = true;\n const nodeMark = node.marks.find(m => m.type === markType);\n if (!nodeMark) {\n check.hasMark = false;\n return false; // Stop iteration\n }\n if (attrs && !this.matchAttributes(nodeMark.attrs, attrs)) {\n check.hasMark = false;\n return false;\n }\n }\n return true;\n });\n return check.hasApplicableText && check.hasMark;\n }\n\n // Check if it's a node\n const nodeType = schema.nodes[name];\n if (nodeType) {\n // NodeSelection - check the selected node directly (atom/leaf nodes like image)\n const selNode = (selection as { node?: { type: typeof nodeType; attrs: Record<string, unknown> } }).node;\n if (selNode?.type === nodeType) {\n return attrs ? this.matchAttributes(selNode.attrs, attrs) : true;\n }\n\n // Check both $from and $to paths - the node must be an ancestor\n // of both ends of the selection for it to be considered active.\n const { $to } = selection;\n\n // For list-group nodes, only the innermost list ancestor should be\n // considered active. This prevents e.g. both bulletList and orderedList\n // showing as active when a bullet list is nested inside an ordered list.\n const isListNode = nodeType.spec.group?.split(' ').includes('list') ?? false;\n\n const findInPath = ($pos: typeof $from): boolean => {\n for (let depth = $pos.depth; depth >= 0; depth--) {\n const node = $pos.node(depth);\n\n if (isListNode) {\n const inListGroup = node.type.spec.group?.split(' ').includes('list') ?? false;\n if (inListGroup) {\n // First (innermost) list ancestor - only match if it's the target type\n if (node.type !== nodeType) return false;\n return attrs ? this.matchAttributes(node.attrs, attrs) : true;\n }\n } else {\n if (node.type === nodeType) {\n return attrs ? this.matchAttributes(node.attrs, attrs) : true;\n }\n }\n }\n return false;\n };\n\n return findInPath($from) && findInPath($to);\n }\n\n return false;\n }\n\n /**\n * Gets attributes of the currently active node or mark\n *\n * Returns empty object if the node/mark is not found or not active.\n *\n * @param name - Extension name (node or mark)\n *\n * @example\n * editor.getAttributes('heading') // → { level: 2 }\n * editor.getAttributes('link') // → { href: 'https://...', target: '_blank' }\n */\n getAttributes(name: string): Record<string, unknown> {\n const { state } = this;\n const { selection, schema } = state;\n const { $from } = selection;\n\n // Check if it's a mark\n const markType = schema.marks[name];\n if (markType) {\n // Get marks at cursor position or stored marks\n const marks = state.storedMarks ?? $from.marks();\n const mark = marks.find(m => m.type === markType);\n return mark ? { ...mark.attrs } : {};\n }\n\n // Check if it's a node\n const nodeType = schema.nodes[name];\n if (nodeType) {\n // Find node in selection path\n for (let depth = $from.depth; depth >= 0; depth--) {\n const node = $from.node(depth);\n if (node.type === nodeType) {\n return { ...node.attrs };\n }\n }\n return {};\n }\n\n return {};\n }\n\n /**\n * Helper to match attributes\n * Returns true if target contains all key/value pairs from source\n */\n private matchAttributes(\n target: Record<string, unknown>,\n source: Record<string, unknown>\n ): boolean {\n for (const [key, value] of Object.entries(source)) {\n if (target[key] !== value) {\n return false;\n }\n }\n return true;\n }\n\n // === Content Methods ===\n\n /**\n * Gets the document content as JSON\n */\n getJSON(): JSONContent {\n return this.state.doc.toJSON() as JSONContent;\n }\n\n /**\n * Gets the document content as HTML string\n *\n * @param options - Optional settings\n * @param options.styled - When true (or an override object), applies inline CSS\n * styles so the HTML renders correctly outside the editor (email, CMS, etc.)\n */\n getHTML(options?: { styled?: boolean | InlineStyleOverrides }): string {\n const fragment = DOMSerializer.fromSchema(this.schema).serializeFragment(\n this.state.doc.content\n );\n\n const div = document.createElement('div');\n div.appendChild(fragment);\n\n // Browser DOM normalizes hex colors to rgb() - convert back to hex within style attrs\n const html = div.innerHTML.replace(/style=\"([^\"]*)\"/g, (_match, style: string) =>\n 'style=\"' +\n style.replace(\n /rgba?\\(\\s*\\d+[\\s,]+\\d+[\\s,]+\\d+[^)]*\\)/g,\n (colorStr) => normalizeColor(colorStr),\n ) +\n '\"',\n );\n\n if (options?.styled) {\n const overrides = typeof options.styled === 'object' ? options.styled : undefined;\n return inlineStyles(html, overrides);\n }\n\n return html;\n }\n\n /**\n * Gets the document content as plain text\n *\n * @param options - Options for text extraction\n * @param options.blockSeparator - String to insert between blocks (default: '\\n\\n')\n */\n getText(options: { blockSeparator?: string } = {}): string {\n const { blockSeparator = '\\n\\n' } = options;\n return this.state.doc.textBetween(\n 0,\n this.state.doc.content.size,\n blockSeparator\n );\n }\n\n /**\n * Executes a command with proper CommandProps\n * @internal\n */\n private runCommand(command: Command): boolean {\n const tr = this.state.tr;\n return command({\n editor: this,\n state: this.state,\n tr,\n dispatch: (t) => { this.view.dispatch(t); },\n chain: () => this.chain(),\n can: () => this.can(),\n commands: this.commands,\n });\n }\n\n /**\n * Sets the editor content\n *\n * @param content - JSON or HTML content\n * @param emitUpdate - Whether to emit update event (default: true)\n * @returns true if content was set successfully, false if content was invalid\n */\n setContent(content: Content, emitUpdate = true): boolean {\n return this.runCommand(setContentCommand(content, { emitUpdate }));\n }\n\n /**\n * Clears the editor content\n *\n * @param emitUpdate - Whether to emit update event (default: true)\n * @returns true if content was cleared successfully\n */\n clearContent(emitUpdate = true): boolean {\n return this.runCommand(clearContentCommand({ emitUpdate }));\n }\n\n // === Lifecycle Methods ===\n\n /**\n * Sets whether the editor is editable\n *\n * @param editable - Whether the editor should be editable\n */\n setEditable(editable: boolean): this {\n this.options.editable = editable;\n\n // Sync aria-readonly with editable state\n if (editable) {\n this.view.dom.removeAttribute('aria-readonly');\n } else {\n this.view.dom.setAttribute('aria-readonly', 'true');\n }\n\n // ProseMirror rechecks editable on each transaction\n // Dispatch empty transaction to trigger re-evaluation\n this.view.dispatch(this.state.tr);\n\n return this;\n }\n\n /**\n * Focuses the editor\n *\n * @param position - Where to place cursor (default: null = just focus)\n */\n focus(position: FocusPosition = null): this {\n this.runCommand(focusCommand(position));\n return this;\n }\n\n /**\n * Removes focus from the editor\n */\n blur(): this {\n this.runCommand(blurCommand());\n return this;\n }\n\n // === Dynamic Plugin Management ===\n\n /**\n * Registers a ProseMirror plugin dynamically at runtime, after the editor\n * has been created. Safe to call repeatedly with the same plugin key.\n */\n registerPlugin(plugin: Plugin): void {\n // Prevent duplicate registration (same plugin key)\n if (plugin.spec.key?.get(this.view.state)) return;\n\n const newState = this.view.state.reconfigure({\n plugins: [...this.view.state.plugins, plugin],\n });\n this.view.updateState(newState);\n }\n\n /**\n * Unregisters a ProseMirror plugin by its PluginKey.\n * Uses PluginKey.get() to identify the plugin to remove.\n */\n unregisterPlugin(key: PluginKey): void {\n const pluginToRemove = key.get(this.view.state);\n if (!pluginToRemove) return;\n\n const newState = this.view.state.reconfigure({\n plugins: this.view.state.plugins.filter((p) => p !== pluginToRemove),\n });\n this.view.updateState(newState);\n }\n\n /**\n * Destroys the editor and cleans up resources\n *\n * After calling destroy(), the editor instance should not be used.\n */\n destroy(): void {\n if (this._isDestroyed) {\n return;\n }\n\n // Clear autofocus timer if pending\n if (this._autofocusTimer) {\n clearTimeout(this._autofocusTimer);\n this._autofocusTimer = null;\n }\n\n this.emit('destroy');\n this.options.onDestroy?.();\n\n // Destroy ProseMirror view\n this.view.destroy();\n\n // Destroy managers\n this._extensionManager.destroy();\n\n // Clear all event listeners\n this.removeAllListeners();\n\n this._isDestroyed = true;\n }\n\n // === Private Methods ===\n\n /**\n * Builds a clipboardSerializer that applies a transform function to HTML on copy/cut.\n */\n private buildClipboardSerializer(\n transform: (html: string) => string,\n schema: Schema,\n ): { clipboardSerializer: DOMSerializer } {\n return {\n clipboardSerializer: {\n serializeFragment: (fragment: unknown, options?: Record<string, unknown>) => {\n const base = DOMSerializer.fromSchema(schema);\n const dom = base.serializeFragment(fragment as Fragment, options);\n const wrapper = document.createElement('div');\n wrapper.appendChild(dom);\n wrapper.innerHTML = transform(wrapper.innerHTML);\n const frag = document.createDocumentFragment();\n while (wrapper.firstChild) frag.appendChild(wrapper.firstChild);\n return frag;\n },\n } as unknown as DOMSerializer,\n };\n }\n\n /**\n * Creates the editor instance\n */\n private createEditor(): void {\n // 1. Emit beforeCreate - extensions can modify options in Step 2\n this.emit('beforeCreate', { editor: this });\n this.options.onBeforeCreate?.({ editor: this });\n // Note: Extension onBeforeCreate is called after ExtensionManager is created (step 2)\n\n // 2. Initialize ExtensionManager with extensions or schema\n this._extensionManager = new ExtensionManager(\n {\n extensions: this.options.extensions,\n schema: this.options.schema,\n },\n this\n );\n\n // 2.1 Call onBeforeCreate on all extensions (now that they have editor reference)\n this._extensionManager.callOnBeforeCreate();\n\n this._extensionManager.validateSchema();\n\n // 3. Create initial document from content (with graceful error handling)\n let doc;\n try {\n doc = createDocument(\n this.options.content ?? null,\n this._extensionManager.schema\n );\n } catch (error) {\n // Emit content error event for invalid content\n const contentError = error instanceof Error ? error : new Error(String(error));\n this.emit('contentError', {\n editor: this,\n error: contentError,\n content: this.options.content,\n });\n this.options.onContentError?.({\n editor: this,\n error: contentError,\n content: this.options.content,\n });\n\n // Fall back to empty document\n doc = createDocument(null, this._extensionManager.schema);\n }\n\n const plugins = this._extensionManager.plugins;\n\n // 5. Create EditorState\n const state = EditorState.create({\n schema: this._extensionManager.schema,\n doc,\n plugins,\n });\n\n // 6. Resolve element - use provided or create detached div\n const element = this.options.element ?? document.createElement('div');\n\n // 7. Create EditorView\n const nodeViews = this._extensionManager.nodeViews;\n this.view = new EditorView(element, {\n state,\n dispatchTransaction: this.dispatchTransaction.bind(this),\n editable: () => this.options.editable ?? true,\n attributes: () => ({\n role: 'textbox',\n 'aria-multiline': 'true',\n 'aria-label': this.options.ariaLabel ?? 'Rich text editor',\n ...((this.options.editable ?? true) ? {} : { 'aria-readonly': 'true' }),\n }),\n ...(Object.keys(nodeViews).length > 0 ? { nodeViews } : {}),\n // Clipboard transform - apply user-provided transform (e.g. inlineStyles) on copy/cut\n ...(this.options.clipboardHTMLTransform\n ? this.buildClipboardSerializer(this.options.clipboardHTMLTransform, this._extensionManager.schema)\n : {}),\n // Handle focus/blur events\n handleDOMEvents: {\n focus: (_view, event) => {\n this.emit('focus', { editor: this, event: event });\n this.options.onFocus?.({ editor: this, event: event });\n this._extensionManager.callOnFocus({ event });\n return false;\n },\n blur: (_view, event) => {\n this.emit('blur', { editor: this, event: event });\n this.options.onBlur?.({ editor: this, event: event });\n this._extensionManager.callOnBlur({ event });\n return false;\n },\n },\n });\n\n // 8. Emit mount event - view is now attached to DOM element\n this.emit('mount', { editor: this, view: this.view });\n this.options.onMount?.({ editor: this, view: this.view });\n\n // 9. Initialize CommandManager\n this.commandManager = new CommandManager(this);\n\n // 10. Handle autofocus\n if (this.options.autofocus) {\n // Use setTimeout to ensure DOM is ready\n // Store reference for cleanup on destroy\n this._autofocusTimer = setTimeout(() => {\n this._autofocusTimer = null;\n if (!this._isDestroyed) {\n this.focus(this.options.autofocus);\n }\n }, 0);\n }\n\n // 11. Set up error event handler for onError callback\n this.on('error', (props) => {\n this.options.onError?.(props);\n });\n\n // 12. Emit create event and call extension onCreate hooks\n this.emit('create', { editor: this });\n this.options.onCreate?.({ editor: this });\n this._extensionManager.callOnCreate();\n }\n\n /**\n * Handles ProseMirror transactions\n */\n private dispatchTransaction(transaction: Transaction): void {\n if (this._isDestroyed) {\n return;\n }\n\n // 1. Apply transaction to state\n const newState = this.view.state.apply(transaction);\n\n // 2. Update view\n this.view.updateState(newState);\n\n // 3. Emit transaction event (fires for EVERY transaction)\n this.emit('transaction', { editor: this, transaction });\n this.options.onTransaction?.({ editor: this, transaction });\n this._extensionManager.callOnTransaction({ transaction });\n\n // 4. Check if we should skip update event\n const skipUpdate = transaction.getMeta('skipUpdate') as boolean | undefined;\n\n // 5. Emit selectionUpdate if selection changed (without doc change)\n if (!transaction.docChanged && transaction.selectionSet) {\n this.emit('selectionUpdate', { editor: this, transaction });\n this.options.onSelectionUpdate?.({ editor: this, transaction });\n this._extensionManager.callOnSelectionUpdate();\n }\n\n // 6. Emit update if document changed\n if (transaction.docChanged && !skipUpdate) {\n this.emit('update', { editor: this, transaction });\n this.options.onUpdate?.({ editor: this, transaction });\n this._extensionManager.callOnUpdate();\n }\n }\n\n /**\n * Emit method - needed for CommandManager interface\n */\n override emit<E extends keyof EditorEvents>(\n event: E,\n ...args: EditorEvents[E] extends undefined ? [] : [EditorEvents[E]]\n ): this {\n return super.emit(event, ...args);\n }\n}\n","/**\n * Thin wrapper around @floating-ui/dom for consistent floating element positioning.\n *\n * Used by BubbleMenu, FloatingMenu, Link Popover, and exposed for extension\n * authors building custom floating UI (emoji suggestion, slash command, etc.).\n */\nimport {\n computePosition,\n flip,\n shift,\n offset,\n hide,\n autoUpdate,\n type Placement,\n} from '@floating-ui/dom';\n\nexport interface PositionFloatingOptions {\n /** Placement relative to reference. @default 'bottom' */\n placement?: Placement;\n /** Distance from reference in px. @default 4 */\n offsetValue?: number;\n /** Viewport padding for flip/shift in px. @default 10 */\n padding?: number;\n /** Track ancestor scroll events. Disable for static anchors (e.g. toolbar buttons). @default true */\n trackScroll?: boolean;\n}\n\n/**\n * Positions a floating element relative to a reference element or virtual rect,\n * and keeps it positioned on scroll, resize, and layout shifts.\n *\n * Uses `autoUpdate` from floating-ui with `animationFrame` polling for\n * jitter-free scroll tracking (rAF syncs with browser paint).\n *\n * Includes `hide` middleware - when the reference element is scrolled out of\n * view, the floating element is hidden via `visibility: hidden`.\n *\n * The floating element must have `position: fixed`.\n *\n * Returns a cleanup function. **Always call it** when hiding or destroying\n * the floating element to stop listeners and prevent memory leaks.\n *\n * @example\n * ```ts\n * // Start auto-positioning (follows scroll/resize)\n * const cleanup = positionFloating(buttonEl, dropdownEl, {\n * placement: 'bottom-start',\n * });\n *\n * // Virtual reference (e.g. cursor position - must return fresh coords)\n * const virtualEl = {\n * getBoundingClientRect: () => {\n * const coords = view.coordsAtPos(pos);\n * return new DOMRect(coords.left, coords.top, 0, coords.bottom - coords.top);\n * },\n * };\n * const cleanup = positionFloating(virtualEl, tooltipEl, { placement: 'top' });\n *\n * // Stop when done\n * cleanup();\n * ```\n */\nexport function positionFloating(\n reference: Element | { getBoundingClientRect: () => DOMRect },\n floating: HTMLElement,\n options?: PositionFloatingOptions,\n): () => void {\n const placementOpt = options?.placement ?? 'bottom';\n const paddingOpt = options?.padding ?? 10;\n const middleware = [\n offset(options?.offsetValue ?? 4),\n flip({ padding: paddingOpt }),\n shift({ padding: paddingOpt }),\n hide(),\n ];\n\n const update = (): void => {\n void computePosition(\n reference as Element,\n floating,\n {\n strategy: 'fixed',\n placement: placementOpt,\n middleware,\n },\n ).then(({ x, y, middlewareData }) => {\n // Use transform instead of left/top - GPU-accelerated, no layout reflow,\n // eliminates visible jitter during scroll tracking.\n Object.assign(floating.style, {\n left: '0',\n top: '0',\n transform: `translate3d(${String(x)}px,${String(y)}px,0)`,\n });\n\n // Hide floating element when reference is scrolled out of view\n const hidden = middlewareData.hide?.referenceHidden;\n floating.style.visibility = hidden ? 'hidden' : '';\n });\n };\n\n // When scroll tracking is enabled, use requestAnimationFrame polling\n // instead of scroll event listeners. rAF runs in the same frame as the\n // browser paint, so the position update is synchronous with the scroll,\n // with no 1-frame lag or jitter. Slightly more CPU than event-based, but\n // imperceptible on modern devices and only active while the element is shown.\n //\n // ancestorScroll is always off: when rAF is enabled it's redundant,\n // when rAF is disabled (trackScroll:false) no scroll tracking is wanted.\n const trackScroll = options?.trackScroll ?? true;\n return autoUpdate(reference as Element, floating, update, {\n ancestorScroll: false,\n animationFrame: trackScroll,\n });\n}\n\n/**\n * Positions a floating element using `strategy: 'absolute'` so it scrolls\n * together with its offsetParent - zero jitter by design.\n *\n * Ideal for dropdowns inside scroll containers (e.g. emoji suggestion inside\n * `.dm-editor`) and toolbar dropdowns. The absolute coordinates are stable\n * across scrolls - only `flip`/`shift` decisions change on scroll, producing\n * a discrete jump rather than continuous jitter.\n *\n * The floating element must have `position: absolute` and its offsetParent\n * must have `position: relative`.\n *\n * Returns a cleanup function - call it when hiding or destroying the\n * floating element.\n */\nexport function positionFloatingOnce(\n reference: Element | { getBoundingClientRect: () => DOMRect },\n floating: HTMLElement,\n options?: PositionFloatingOptions,\n): () => void {\n const placementOpt = options?.placement ?? 'bottom';\n const paddingOpt = options?.padding ?? 10;\n const middleware = [\n offset(options?.offsetValue ?? 4),\n flip({ padding: paddingOpt }),\n shift({ padding: paddingOpt }),\n ];\n\n const update = (): void => {\n void computePosition(\n reference as Element,\n floating,\n {\n strategy: 'absolute',\n placement: placementOpt,\n middleware,\n },\n ).then(({ x, y }) => {\n Object.assign(floating.style, {\n left: '0',\n top: '0',\n transform: `translate3d(${String(Math.round(x))}px,${String(Math.round(y))}px,0)`,\n });\n });\n };\n\n // Track scroll + resize. With strategy:'absolute' the base coordinates\n // are stable across scrolls - only flip/shift decisions change (discrete\n // jump, not continuous jitter).\n const trackScroll = options?.trackScroll ?? true;\n return autoUpdate(reference as Element, floating, update, {\n ancestorScroll: trackScroll,\n layoutShift: false,\n });\n}\n","/**\n * Clipboard helper - writes plain text to the system clipboard.\n *\n * Tries the modern async Clipboard API first; if unavailable or denied\n * (Safari private mode, insecure context, missing user gesture), falls\n * back to a hidden textarea + `document.execCommand('copy')`.\n *\n * Returns `true` on success, `false` on failure. Never throws - callers\n * decide how to surface failure (toast, re-throw, silent).\n *\n * @example\n * ```ts\n * const ok = await writeToClipboard('https://example.com#block-abc123');\n * if (!ok) showError('Copy failed');\n * ```\n */\nexport async function writeToClipboard(text: string): Promise<boolean> {\n // TS DOM types model `navigator` and `navigator.clipboard` as always\n // defined, but in SSR environments `navigator` is undefined entirely,\n // and in insecure / older browsers `clipboard` itself is missing. The\n // runtime checks are genuinely necessary even though TS disagrees.\n /* eslint-disable @typescript-eslint/no-unnecessary-condition */\n if (typeof navigator !== 'undefined' && navigator.clipboard?.writeText) {\n try {\n await navigator.clipboard.writeText(text);\n return true;\n } catch {\n // Fall through to execCommand fallback.\n }\n }\n /* eslint-enable @typescript-eslint/no-unnecessary-condition */\n\n if (typeof document === 'undefined') return false;\n\n const textarea = document.createElement('textarea');\n textarea.value = text;\n // Hide the textarea off-screen but keep it focusable.\n textarea.style.position = 'fixed';\n textarea.style.top = '-1000px';\n textarea.style.left = '-1000px';\n textarea.style.opacity = '0';\n textarea.setAttribute('readonly', '');\n document.body.appendChild(textarea);\n\n try {\n textarea.select();\n textarea.setSelectionRange(0, text.length);\n // `execCommand` is deprecated but remains the only synchronous fallback\n // for clipboard writes when the async API is unavailable. Modern\n // browsers all ship `navigator.clipboard`, so this path is hit only in\n // edge cases (insecure context, permissions denied).\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n return document.execCommand('copy');\n } catch {\n return false;\n } finally {\n textarea.remove();\n }\n}\n","/**\n * Copies `dm-theme-*` classes from the editor's host element onto a\n * floating element that lives OUTSIDE `.dm-editor` (typically portaled\n * to `document.body` to escape `overflow: hidden`). Without the copy\n * the `.dm-theme-dark` cascade does not reach the floating element and\n * it renders with light-theme defaults on a dark page.\n *\n * Call this whenever the floating element is shown - cheap and\n * idempotent. Removes stale theme classes from the target first so\n * runtime theme toggles propagate on the next show.\n */\nexport function copyThemeClass(view: { dom: Element }, target: Element): void {\n const stale: string[] = [];\n target.classList.forEach((cls) => {\n if (cls.startsWith('dm-theme-')) stale.push(cls);\n });\n for (const cls of stale) target.classList.remove(cls);\n\n const source = view.dom.closest('[class*=\"dm-theme-\"]') ?? view.dom.closest('.dm-editor');\n if (!source) return;\n source.classList.forEach((cls) => {\n if (cls.startsWith('dm-theme-')) target.classList.add(cls);\n });\n}\n","import type { Editor } from '../Editor.js';\n\nconst NOTION_MODE_CLASS = 'dm-notion-mode';\n\nconst NOTION_TEXT_CONTEXT: readonly string[] = Object.freeze([\n 'bold', 'italic', 'underline', 'strike', 'code',\n '|', 'link',\n '|', 'textAlign',\n]);\n\nconst STANDARD_TEXT_CONTEXT: readonly string[] = Object.freeze([\n 'bold', 'italic', 'underline', 'strike', 'code',\n '|', 'link',\n]);\n\n/**\n * Default `contexts` map for a bubble menu when the consumer has not\n * supplied one. Returns a richer item set when the editor (or any\n * ancestor) carries the `.dm-notion-mode` class - that class is the\n * project-wide signal that the host is rendering Notion-style UX, so\n * the bubble menu mirrors it by including `link` and `textAlign`.\n *\n * Consumers can always override by passing their own `contexts` prop.\n */\nexport function defaultBubbleContexts(\n editor: Editor,\n): Record<string, string[]> {\n const inNotionMode = editor.view.dom.closest('.' + NOTION_MODE_CLASS) !== null;\n const text = inNotionMode ? NOTION_TEXT_CONTEXT : STANDARD_TEXT_CONTEXT;\n return { text: [...text] };\n}\n","import type { Node as PMNode } from '@domternal/pm/model';\nimport type { Transaction } from '@domternal/pm/state';\n\nconst LIST_ITEM_TYPES = new Set(['listItem', 'taskItem']);\nconst LIST_WRAPPER_TYPES = new Set(['bulletList', 'orderedList', 'taskList']);\n\nexport interface InsertAsListItemChildArgs {\n /** Existing transaction to mutate. Caller dispatches. */\n tr: Transaction;\n /** Position of the list wrapper node (bulletList / orderedList / taskList) in `tr.doc`. */\n wrapperPos: number;\n /**\n * Position of the target list item node (= position right BEFORE the\n * item) in `tr.doc`. When omitted, the wrapper's LAST child is used,\n * matching the Tab keyboard behaviour (\"indent into last item\").\n */\n targetItemPos?: number;\n /** Block node to append as the LAST child of the target item. */\n blockNode: PMNode;\n /**\n * Optional source range to delete in the SAME transaction (when\n * MOVING an existing block instead of creating a new one). Position\n * math handles source-before-vs-after-target ordering automatically.\n */\n sourceRange?: { from: number; to: number };\n}\n\nexport interface InsertAsListItemChildResult {\n /** True when schema accepted the insertion and `tr` was mutated. */\n ok: boolean;\n /**\n * Position right BEFORE the inserted block in the resulting doc.\n * Caller can resolve `insertedAt + 1` to place the caret inside the\n * inserted block. Only present when `ok === true`.\n */\n insertedAt?: number;\n}\n\n/**\n * Insert `blockNode` as the LAST child of a list item (target item or, when\n * omitted, the wrapper's last item). When `sourceRange` is set, the source\n * range is removed in the same transaction so the op is a clean MOVE.\n * Returns `{ ok: false }` WITHOUT mutating `tr` on schema reject so callers\n * can fall through to a sibling-mode fallback.\n */\nexport function insertAsListItemChild(\n args: InsertAsListItemChildArgs,\n): InsertAsListItemChildResult {\n const { tr, wrapperPos, targetItemPos, blockNode, sourceRange } = args;\n\n if (wrapperPos < 0 || wrapperPos >= tr.doc.content.size) return { ok: false };\n const wrapper = tr.doc.nodeAt(wrapperPos);\n if (!wrapper || !LIST_WRAPPER_TYPES.has(wrapper.type.name)) return { ok: false };\n if (wrapper.childCount === 0) return { ok: false };\n\n let targetItem: PMNode;\n let targetItemStart: number;\n if (targetItemPos !== undefined) {\n if (targetItemPos < 0 || targetItemPos >= tr.doc.content.size) return { ok: false };\n const candidate = tr.doc.nodeAt(targetItemPos);\n if (!candidate || !LIST_ITEM_TYPES.has(candidate.type.name)) return { ok: false };\n // Verify the candidate item really sits inside the given wrapper -\n // a mismatched (wrapperPos, targetItemPos) pair would otherwise\n // produce silently-wrong position math.\n if (targetItemPos < wrapperPos + 1 || targetItemPos >= wrapperPos + wrapper.nodeSize) {\n return { ok: false };\n }\n targetItem = candidate;\n targetItemStart = targetItemPos;\n } else {\n const last = wrapper.lastChild;\n if (!last || !LIST_ITEM_TYPES.has(last.type.name)) return { ok: false };\n let pos = wrapperPos + 1;\n for (let i = 0; i < wrapper.childCount - 1; i++) {\n pos += wrapper.child(i).nodeSize;\n }\n targetItem = last;\n targetItemStart = pos;\n }\n\n if (!targetItem.canReplaceWith(targetItem.childCount, targetItem.childCount, blockNode.type)) {\n return { ok: false };\n }\n\n // Position right BEFORE the item's close token = end of its content,\n // where a new last-child is appended. Computed from the PRE-mutation\n // doc so the offset reflects the layout the caller can reason about.\n const targetItemContentEnd = targetItemStart + targetItem.nodeSize - 1;\n\n if (sourceRange) {\n const { from, to } = sourceRange;\n // Self-drop guard: target sits inside the deletion range. Caller's\n // responsibility is primary, but defending here avoids a silent\n // \"insert into removed range\" that would corrupt the document.\n if (targetItemContentEnd >= from && targetItemContentEnd <= to) {\n return { ok: false };\n }\n tr.delete(from, to);\n const adjustedInsertPos =\n targetItemContentEnd > from ? targetItemContentEnd - (to - from) : targetItemContentEnd;\n tr.insert(adjustedInsertPos, blockNode);\n return { ok: true, insertedAt: adjustedInsertPos };\n }\n\n tr.insert(targetItemContentEnd, blockNode);\n return { ok: true, insertedAt: targetItemContentEnd };\n}\n","import type { EditorState, Transaction } from '@domternal/pm/state';\nimport { TextSelection } from '@domternal/pm/state';\nimport { liftTarget } from '@domternal/pm/transform';\nimport type { ListItemCursorContext } from './listItemCursorContext.js';\n\n/**\n * Lift an empty children-zone paragraph out of its list/task item as a\n * top-level sibling. PM's `liftTarget` covers the common case; we fall\n * back to manual delete-and-insert when it returns null (empty p sandwiched\n * before a non-paragraph would leave the after-cut half violating the\n * `paragraph block*` schema).\n */\nexport function liftEmptyChildrenZoneParagraph(\n state: EditorState,\n dispatch: ((tr: Transaction) => void) | undefined,\n ctx: ListItemCursorContext,\n): boolean {\n if (!ctx.isInChildrenZone || !ctx.paragraphIsEmpty) return false;\n\n const { $from } = state.selection;\n // Stale-ctx guard: caller may have computed `ctx` against an older selection.\n if ($from.parent.type.name !== 'paragraph') return false;\n if ($from.parent.content.size !== 0) return false;\n\n const paragraphType = state.schema.nodes['paragraph'];\n if (!paragraphType) return false;\n\n // Path 1: standard lift via PM's liftTarget.\n const range = $from.blockRange();\n if (range) {\n const target = liftTarget(range);\n if (target !== null) {\n if (!dispatch) return true;\n const tr = state.tr.lift(range, target);\n const oldParaStart = $from.before($from.depth);\n const newParaStart = tr.mapping.map(oldParaStart);\n tr.setSelection(TextSelection.create(tr.doc, newParaStart + 1));\n dispatch(tr.scrollIntoView());\n return true;\n }\n }\n\n // Path 2: liftTarget returned null. Delete the empty paragraph in place\n // (label + rest still satisfies `paragraph block*`), then insert a fresh\n // empty paragraph at the top-level slot next to the wrapper.\n const paraStart = $from.before($from.depth);\n const paraEnd = $from.after($from.depth);\n\n const itemNode = state.doc.nodeAt(ctx.itemPos);\n if (!itemNode) return false;\n const itemEnd = ctx.itemPos + itemNode.nodeSize;\n\n const wrapperNode = state.doc.nodeAt(ctx.wrapperPos);\n if (!wrapperNode) return false;\n const wrapperEnd = ctx.wrapperPos + wrapperNode.nodeSize;\n\n const isLastItem = ctx.itemIndexInWrapper === wrapperNode.childCount - 1;\n\n // Pre-flight: wrapper's parent must accept a paragraph at the lift slot,\n // otherwise the manual edits would leave an invalid doc.\n const wrapperParentDepth = ctx.itemDepth - 2;\n if (wrapperParentDepth < 0) return false;\n const wrapperParent = $from.node(wrapperParentDepth);\n const wrapperIndexInParent = $from.index(wrapperParentDepth);\n if (\n !wrapperParent.canReplaceWith(\n wrapperIndexInParent + 1,\n wrapperIndexInParent + 1,\n paragraphType,\n )\n ) {\n return false;\n }\n\n if (!dispatch) return true;\n\n const newPara = paragraphType.create();\n const tr = state.tr;\n\n if (isLastItem) {\n // Last-item case: insert after the wrapper.\n tr.delete(paraStart, paraEnd);\n const insertPos = tr.mapping.map(wrapperEnd);\n tr.insert(insertPos, newPara);\n tr.setSelection(TextSelection.create(tr.doc, insertPos + 1));\n } else {\n // Mid-wrapper: split after the current item; new paragraph lands in the gap.\n tr.delete(paraStart, paraEnd);\n const splitAt = tr.mapping.map(itemEnd);\n tr.split(splitAt, 1);\n const insertPos = splitAt + 1;\n tr.insert(insertPos, newPara);\n tr.setSelection(TextSelection.create(tr.doc, insertPos + 1));\n }\n\n dispatch(tr.scrollIntoView());\n return true;\n}\n","import type { EditorState, Transaction } from '@domternal/pm/state';\nimport { TextSelection } from '@domternal/pm/state';\nimport type { ListItemCursorContext } from './listItemCursorContext.js';\n\n/**\n * Insert an empty paragraph as next sibling inside the same list/task item,\n * keeping the cursor in the children-zone so Enter accumulates blocks at the\n * same nesting level (Notion semantics). Exit paths are Backspace on empty,\n * Shift+Tab, or Enter on the empty label paragraph.\n */\nexport function insertChildrenZoneSibling(\n state: EditorState,\n dispatch: ((tr: Transaction) => void) | undefined,\n ctx: ListItemCursorContext,\n): boolean {\n if (!ctx.isInChildrenZone || !ctx.paragraphIsEmpty) return false;\n\n const paragraphType = state.schema.nodes['paragraph'];\n if (!paragraphType) return false;\n\n const { $from } = state.selection;\n // Stale-ctx guard: caller may have computed `ctx` against an older selection.\n if ($from.parent.type.name !== 'paragraph') return false;\n if ($from.parent.content.size !== 0) return false;\n\n if (!dispatch) return true;\n\n const insertPos = $from.after($from.depth);\n const tr = state.tr.insert(insertPos, paragraphType.create());\n tr.setSelection(TextSelection.create(tr.doc, insertPos + 1));\n dispatch(tr.scrollIntoView());\n return true;\n}\n","/**\n * Positions an INSERT-style command at TOP LEVEL when the cursor sits in\n * the LABEL paragraph of a list/task item. Used by Divider, Table, Image,\n * Table-of-Contents (any command that inserts a NEW block of content\n * rather than transforming the cursor's existing line).\n *\n * Behavior mirrors Notion:\n * - the user's list item stays a list item (its content is preserved)\n * - the new block is inserted at the document level, AFTER the current\n * item, splitting the parent list around it when necessary\n * - if the label is empty, the empty item itself is consumed (so we\n * don't leave a dangling empty bullet above the inserted block)\n *\n * Returns a `{ from, to }` range that the caller should fill with\n * `tr.replaceWith(from, to, [block, optionalTrailingParagraph])`:\n * - `from === to` for the non-empty cases (pure insertion)\n * - `from < to` for the empty case (replacement of the empty paragraph\n * that PM's `liftListItem` produced - replacement avoids leaving a\n * stray empty paragraph above the inserted block when the doc would\n * otherwise become empty)\n */\nimport { liftListItem } from '@domternal/pm/schema-list';\nimport type { EditorState, Transaction } from '@domternal/pm/state';\nimport {\n findListItemAncestorDepth,\n isInsideListItem,\n} from './listItemAncestor.js';\n\nexport interface SplitListForInsertRange {\n from: number;\n to: number;\n}\n\n/**\n * Activation conditions (single-cursor only):\n * - selection is empty\n * - cursor's nearest list-item ancestor exists\n * - cursor's containing block is at index 0 (label slot) of that item\n * - `tr` has no prior steps\n *\n * @returns A range where the caller should call `tr.replaceWith(from, to,\n * [block, optionalTrailingParagraph])`, or `null` if the cursor isn't\n * in a list-item label.\n */\nexport function splitListForInsert(\n state: EditorState,\n tr: Transaction,\n): SplitListForInsertRange | null {\n if (!tr.selection.empty) return null;\n if (tr.steps.length !== 0) return null;\n\n const { $from } = tr.selection;\n const listItemDepth = findListItemAncestorDepth($from);\n if (listItemDepth === -1) return null;\n if ($from.index(listItemDepth) !== 0) return null;\n\n const listDepth = listItemDepth - 1;\n const listItemNode = $from.node(listItemDepth);\n const labelParagraph = listItemNode.firstChild;\n const labelIsEmpty =\n listItemNode.childCount === 1 && (labelParagraph?.content.size ?? 0) === 0;\n\n // ─── Empty-label case ────────────────────────────────────────────────\n // Use PM's `liftListItem` to split the parent list around the empty\n // item (becomes a top-level empty paragraph). The caller then replaces\n // that paragraph with its content. Replacement (not deletion + insert)\n // avoids PM's auto-fill behavior when the resulting doc would be empty.\n //\n // For nested empty items (e.g. ul > li > ul > li(empty) > p) PM's\n // `liftListItem` only lifts ONE wrapper level. Loop until the cursor\n // reaches doc top level, otherwise the caller's `tr.replaceWith` would\n // target a position inside a still-enclosing listItem where a top-level\n // node (hr, table, image) is schema-invalid.\n if (labelIsEmpty) {\n const listItemType = listItemNode.type;\n let safetyLimit = 10;\n while (safetyLimit-- > 0) {\n const stepState = state.apply(tr);\n const liftOk = liftListItem(listItemType)(stepState, (liftTr) => {\n for (const step of liftTr.steps) tr.step(step);\n if (liftTr.selectionSet) tr.setSelection(liftTr.selection);\n });\n if (!liftOk) break;\n if (!isInsideListItem(tr.selection.$from)) break;\n }\n\n const $afterLift = tr.selection.$from;\n if (isInsideListItem($afterLift)) return null;\n return { from: $afterLift.before(), to: $afterLift.after() };\n }\n\n // ─── Non-empty, LAST item in list: insert just after the list ────────\n const listNode = $from.node(listDepth);\n const indexInList = $from.index(listDepth);\n const isLast = indexInList === listNode.childCount - 1;\n if (isLast) {\n const pos = $from.after(listDepth);\n return { from: pos, to: pos };\n }\n\n // ─── Non-empty, MID/FIRST item: split the parent list ────────────────\n // Split point sits inside the parent list, between the current item\n // and the next sibling. depth=1 splits ONLY the list (not the item).\n // After split, the new top-level boundary at the parent level (doc)\n // is `splitPos + 1`.\n const splitPos = $from.after(listItemDepth);\n tr.split(splitPos, 1);\n const pos = splitPos + 1;\n return { from: pos, to: pos };\n}\n","/**\n * Node - Base class for node extensions\n *\n * Nodes define document structure elements that contribute to the schema.\n * Examples: Paragraph, Heading, List, Image, etc.\n *\n * Three-tier model:\n * - Extension (type: 'extension') → Pure functionality (History, Placeholder, etc.)\n * - Node (type: 'node') → Schema nodes (Paragraph, Heading, etc.)\n * - Mark (type: 'mark') → Schema marks (Bold, Italic, etc.)\n *\n * @example\n * const Paragraph = Node.create({\n * name: 'paragraph',\n * group: 'block',\n * content: 'inline*',\n * parseHTML() {\n * return [{ tag: 'p' }];\n * },\n * renderHTML({ HTMLAttributes }) {\n * return ['p', HTMLAttributes, 0];\n * },\n * });\n */\n\nimport type { NodeSpec, NodeType, TagParseRule } from '@domternal/pm/model';\nimport { Extension, type ExtensionEditorInterface, mergeConfigWithParentBinding } from './Extension.js';\nimport type { NodeConfig, NodeContext } from './types/NodeConfig.js';\nimport { callOrReturn } from './helpers/callOrReturn.js';\nimport { buildProseMirrorAttrs, buildHTMLAttributes } from './helpers/specBuilder.js';\n\n/**\n * Extended editor interface for Node\n * Includes schema access for NodeType getter\n */\nexport interface NodeEditorInterface extends ExtensionEditorInterface {\n readonly schema: {\n nodes: Record<string, NodeType>;\n };\n}\n\n/**\n * Base class for node extensions\n *\n * @typeParam Options - Node options type\n * @typeParam Storage - Node storage type\n */\nexport class Node<Options = unknown, Storage = unknown> extends Extension<\n Options,\n Storage\n> {\n /**\n * Node type identifier\n * Distinguishes nodes from extensions and marks\n */\n override readonly type = 'node' as const;\n\n /**\n * The original configuration object\n * Typed as NodeConfig for node-specific properties\n */\n declare readonly config: NodeConfig<Options, Storage>;\n\n /**\n * Editor instance with schema access\n * null until set by ExtensionManager\n */\n override editor: NodeEditorInterface | null = null;\n\n /**\n * Protected constructor - use Node.create() instead\n */\n protected constructor(config: NodeConfig<Options, Storage>) {\n super(config);\n }\n\n /**\n * Get the ProseMirror NodeType from schema\n *\n * This is a lazy getter because schema doesn't exist at node creation time.\n * Schema is built FROM nodes by ExtensionManager.\n *\n * Returns null if editor is not yet initialized.\n * Always check editor is set before using nodeType.\n */\n get nodeType(): NodeType | null {\n if (!this.editor) {\n return null;\n }\n return this.editor.schema.nodes[this.name] ?? null;\n }\n\n /**\n * Get NodeType or throw if not initialized.\n * Use in contexts where editor is guaranteed to be set (like addCommands).\n */\n get nodeTypeOrThrow(): NodeType {\n const type = this.nodeType;\n if (!type) {\n throw new Error(\n `Node \"${this.name}\" is not initialized. ` +\n `Make sure the editor is created before accessing nodeType.`\n );\n }\n return type;\n }\n\n /**\n * Creates a new node instance\n *\n * @param config - Node configuration\n * @returns New node instance\n *\n * @example\n * const Paragraph = Node.create({\n * name: 'paragraph',\n * group: 'block',\n * content: 'inline*',\n * });\n */\n static override create<O = unknown, S = unknown>(\n config: NodeConfig<O, S>\n ): Node<O, S> {\n return new Node(config);\n }\n\n /**\n * Creates a new node with merged options. Original node is not modified.\n * Options merge shallowly (object spread); see {@link Extension.configure}\n * for the nested-object gotcha and a workaround.\n *\n * @example\n * const CustomParagraph = Paragraph.configure({ HTMLAttributes: { class: 'custom' } });\n */\n override configure(options: Partial<Options>): Node<Options, Storage> {\n const newConfig: NodeConfig<Options, Storage> = {\n ...this.config,\n addOptions: () => ({\n ...this.options,\n ...options,\n }),\n };\n\n return new Node(newConfig);\n }\n\n /**\n * Creates a new node with extended configuration\n * Original node is not modified\n *\n * **Note:** Config is merged shallowly using object spread (`...`).\n * Config properties (like `addAttributes`, `parseHTML`) are\n * replaced entirely, not combined with the base node's config.\n *\n * @param extendedConfig - Configuration to extend/override\n * @returns New node instance with extended config\n *\n * @example\n * const CustomParagraph = Paragraph.extend({\n * name: 'customParagraph',\n * addAttributes() {\n * return { ...this.parent?.(), align: { default: 'left' } };\n * },\n * });\n *\n * @example\n * // To preserve base node's parse rules while adding new ones:\n * const Extended = BaseNode.extend({\n * parseHTML() {\n * const baseRules = BaseNode.config.parseHTML?.call(this) ?? [];\n * return [...baseRules, { tag: 'custom-tag' }];\n * },\n * });\n */\n override extend<ExtendedOptions = Options, ExtendedStorage = Storage>(\n extendedConfig: Partial<NodeConfig<ExtendedOptions, ExtendedStorage>> &\n ThisType<NodeContext<ExtendedOptions, ExtendedStorage>>\n ): Node<ExtendedOptions, ExtendedStorage> {\n const newConfig = mergeConfigWithParentBinding(this.config, extendedConfig);\n\n return new Node(newConfig as NodeConfig<ExtendedOptions, ExtendedStorage>);\n }\n\n /**\n * Creates a ProseMirror NodeSpec from this node's configuration\n *\n * Called by ExtensionManager when building the schema.\n * Converts our config format to ProseMirror's NodeSpec format.\n *\n * @returns ProseMirror NodeSpec\n */\n createNodeSpec(): NodeSpec {\n const spec: NodeSpec = {};\n\n // Schema properties - use callOrReturn for group/inline to support dynamic values\n if (this.config.group !== undefined) spec.group = callOrReturn(this.config.group, this);\n if (this.config.content !== undefined) spec.content = this.config.content;\n if (this.config.inline !== undefined) spec.inline = callOrReturn(this.config.inline, this);\n if (this.config.atom !== undefined) spec.atom = this.config.atom;\n if (this.config.selectable !== undefined)\n spec.selectable = this.config.selectable;\n if (this.config.draggable !== undefined)\n spec.draggable = this.config.draggable;\n if (this.config.code !== undefined) spec.code = this.config.code;\n if (this.config.whitespace !== undefined)\n spec.whitespace = this.config.whitespace;\n if (this.config.isolating !== undefined)\n spec.isolating = this.config.isolating;\n if (this.config.defining !== undefined)\n spec.defining = this.config.defining;\n if (this.config.marks !== undefined) spec.marks = this.config.marks;\n if (this.config.allowGapCursor !== undefined)\n (spec as Record<string, unknown>)['allowGapCursor'] =\n this.config.allowGapCursor;\n if (this.config.tableRole !== undefined)\n (spec as Record<string, unknown>)['tableRole'] =\n this.config.tableRole;\n\n // Leaf text - bind to extension instance so this.storage etc. are available\n if (this.config.leafText !== undefined) {\n if (typeof this.config.leafText === 'function') {\n const leafTextFn = this.config.leafText;\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const instance = this;\n spec.leafText = (node) => leafTextFn.call(instance, node);\n } else {\n spec.leafText = () => this.config.leafText as string;\n }\n }\n\n // Attributes - convert AttributeSpecs to ProseMirror attrs\n const attributeSpecs = callOrReturn(this.config.addAttributes, this);\n if (attributeSpecs) {\n spec.attrs = buildProseMirrorAttrs(attributeSpecs);\n }\n\n // Parse rules - convert to parseDOM\n const parseRules = callOrReturn(this.config.parseHTML, this);\n if (parseRules && parseRules.length > 0) {\n // Build parseDOM array with proper typing\n // ProseMirror's TagParseRule type is strict, so we cast through unknown\n const parseDOMRules = parseRules.map((rule) => {\n // Build parse rule object using object literal to avoid index signature issues\n const parseRule: {\n tag?: string;\n style?: string;\n priority?: number;\n consuming?: boolean;\n context?: string;\n preserveWhitespace?: boolean | 'full';\n getAttrs?: (\n node: HTMLElement | string\n ) => Record<string, unknown> | false | null;\n } = {};\n\n if (rule.tag) parseRule.tag = rule.tag;\n if (rule.style) parseRule.style = rule.style;\n if (rule.priority !== undefined) parseRule.priority = rule.priority;\n if (rule.consuming !== undefined) parseRule.consuming = rule.consuming;\n if (rule.context) parseRule.context = rule.context;\n if (rule.preserveWhitespace !== undefined)\n parseRule.preserveWhitespace = rule.preserveWhitespace;\n\n // Handle getAttrs - need to merge with attribute parseHTML\n if (rule.getAttrs || attributeSpecs) {\n parseRule.getAttrs = (node: HTMLElement | string) => {\n // If node is string (for style rules), skip attribute parsing\n if (typeof node === 'string') {\n return rule.getAttrs\n ? rule.getAttrs(node as unknown as HTMLElement) ?? {}\n : {};\n }\n\n // Get attrs from rule\n const ruleAttrs = rule.getAttrs ? rule.getAttrs(node) : {};\n\n // If rule returned null, skip this rule\n if (ruleAttrs === null || ruleAttrs === undefined) {\n return false;\n }\n\n // Get attrs from attribute parseHTML functions\n const parsedAttrs: Record<string, unknown> = { ...ruleAttrs };\n if (attributeSpecs) {\n for (const [name, attrSpec] of Object.entries(attributeSpecs)) {\n if (attrSpec.parseHTML) {\n parsedAttrs[name] = attrSpec.parseHTML(node);\n }\n }\n }\n\n return parsedAttrs;\n };\n }\n\n return parseRule;\n });\n\n // Cast required: Our NodeParseRule type is structurally compatible with\n // ProseMirror's TagParseRule but TypeScript can't infer this due to\n // our custom getAttrs return type. The cast is safe.\n spec.parseDOM = parseDOMRules as unknown as readonly TagParseRule[];\n }\n\n // Render - convert renderHTML to toDOM\n if (this.config.renderHTML) {\n const renderFn = this.config.renderHTML;\n const attrSpecs = attributeSpecs;\n // Capture 'this' (the Node instance) for use in toDOM\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const nodeInstance = this;\n\n spec.toDOM = (node) => {\n const htmlAttrs = attrSpecs\n ? buildHTMLAttributes(node.attrs, attrSpecs)\n : {};\n\n // Call renderFn with Node instance as 'this' context\n return renderFn.call(nodeInstance, { node, HTMLAttributes: htmlAttrs });\n };\n }\n\n return spec;\n }\n}\n","/**\n * ToolbarController - Headless, framework-agnostic toolbar state machine\n *\n * Manages toolbar item collection, grouping, active state tracking,\n * dropdown state, and keyboard navigation. Framework wrappers (Angular,\n * React, Vue) bind their templates to this controller.\n *\n * @example\n * const controller = new ToolbarController(editor, () => {\n * // Called on every state change - trigger framework re-render\n * });\n * controller.subscribe();\n * // ... use controller.groups, controller.activeMap, etc.\n * controller.destroy();\n */\n\nimport type { ToolbarItem, ToolbarButton, ToolbarDropdown, ToolbarLayoutEntry } from './types/Toolbar.js';\n\n/**\n * Editor interface for ToolbarController.\n * Minimal surface to avoid circular dependency on Editor class.\n */\nexport interface ToolbarControllerEditor {\n readonly toolbarItems: ToolbarItem[];\n readonly storage: Record<string, unknown>;\n isActive(\n nameOrAttributes: string | { name: string; attributes?: Record<string, unknown> },\n attributes?: Record<string, unknown>\n ): boolean;\n readonly commands: Record<string, (...args: unknown[]) => boolean>;\n can(): Record<string, (...args: unknown[]) => boolean>;\n on(event: string, handler: (...args: unknown[]) => void): void;\n off(event: string, handler: (...args: unknown[]) => void): void;\n}\n\n/**\n * A group of toolbar items with the same group name.\n */\nexport interface ToolbarGroup {\n name: string;\n items: ToolbarItem[];\n}\n\n/**\n * Flattened button reference for keyboard navigation.\n */\ninterface FlatButton {\n item: ToolbarButton | ToolbarDropdown;\n groupIndex: number;\n itemIndex: number;\n}\n\n/** Minimal editor shape for static helpers (avoids strict ToolbarControllerEditor compatibility issues) */\ninterface ToolbarItemEditor {\n readonly storage: Record<string, unknown>;\n readonly commands: Record<string, (...args: unknown[]) => boolean>;\n isActive(\n nameOrAttributes: string | { name: string; attributes?: Record<string, unknown> },\n attributes?: Record<string, unknown>\n ): boolean;\n}\n\nexport class ToolbarController {\n /**\n * Resolves the active state of a toolbar button against the editor.\n * Shared between ToolbarController and framework components (e.g. bubble-menu).\n */\n static resolveActive(editor: ToolbarItemEditor, item: ToolbarButton): boolean {\n if (item.isActiveFn) return item.isActiveFn(editor);\n if (!item.isActive) return false;\n if (typeof item.isActive === 'string') return editor.isActive(item.isActive);\n if (Array.isArray(item.isActive)) {\n return item.isActive.some(c =>\n typeof c === 'string' ? editor.isActive(c) : editor.isActive(c.name, c.attributes));\n }\n return editor.isActive(item.isActive.name, item.isActive.attributes);\n }\n\n /**\n * Executes a toolbar button's command on the editor.\n * Shared between ToolbarController and framework components (e.g. bubble-menu).\n */\n static executeItem(editor: ToolbarItemEditor, item: ToolbarButton): void {\n const cmd = editor.commands[item.command];\n if (cmd) {\n if (item.commandArgs?.length) {\n cmd(...item.commandArgs);\n } else {\n cmd();\n }\n }\n }\n\n private editor: ToolbarControllerEditor;\n private onChange: () => void;\n private _layout: ToolbarLayoutEntry[] | null;\n private transactionHandler: (() => void) | null = null;\n\n /** Grouped and sorted toolbar items */\n private _groups: ToolbarGroup[] = [];\n\n /** Active state for each button (keyed by item.name) */\n private _activeMap = new Map<string, boolean>();\n\n /** Disabled state for each button (keyed by item.name) */\n private _disabledMap = new Map<string, boolean>();\n\n /** Expanded state for emitEvent buttons - true when their panel is open */\n private _expandedMap = new Map<string, boolean>();\n\n /** Currently open dropdown name (null = none) */\n private _openDropdown: string | null = null;\n\n /** Focused button index for roving tabindex (-1 = none) */\n private _focusedIndex = 0;\n\n /** Flat list of top-level buttons/dropdowns for keyboard nav */\n private _flatButtons: FlatButton[] = [];\n\n constructor(editor: ToolbarControllerEditor, onChange: () => void, layout?: ToolbarLayoutEntry[]) {\n this.editor = editor;\n this.onChange = onChange;\n this._layout = layout ?? null;\n this.rebuild();\n }\n\n // === Getters ===\n\n get groups(): ToolbarGroup[] {\n return this._groups;\n }\n\n get activeMap(): ReadonlyMap<string, boolean> {\n return this._activeMap;\n }\n\n get disabledMap(): ReadonlyMap<string, boolean> {\n return this._disabledMap;\n }\n\n get expandedMap(): ReadonlyMap<string, boolean> {\n return this._expandedMap;\n }\n\n get openDropdown(): string | null {\n return this._openDropdown;\n }\n\n get focusedIndex(): number {\n return this._focusedIndex;\n }\n\n get flatButtonCount(): number {\n return this._flatButtons.length;\n }\n\n // === State Methods ===\n\n /**\n * Checks if a toolbar button is currently active.\n */\n isActive(item: ToolbarButton): boolean {\n return this._activeMap.get(item.name) ?? false;\n }\n\n /**\n * Checks if a toolbar button is currently disabled (command cannot execute).\n */\n isDisabled(item: ToolbarButton): boolean {\n return this._disabledMap.get(item.name) ?? false;\n }\n\n /**\n * Executes a toolbar button's command.\n */\n executeCommand(item: ToolbarButton): void {\n ToolbarController.executeItem(this.editor, item);\n this.updateActiveStates();\n }\n\n /**\n * Toggles a dropdown open/closed.\n */\n toggleDropdown(name: string): void {\n this._openDropdown = this._openDropdown === name ? null : name;\n this.onChange();\n }\n\n /**\n * Closes any open dropdown.\n */\n closeDropdown(): void {\n if (this._openDropdown !== null) {\n this._openDropdown = null;\n this.onChange();\n }\n }\n\n // === Keyboard Navigation ===\n\n /**\n * Move focus to the next button (ArrowRight).\n */\n navigateNext(): number {\n if (this._flatButtons.length === 0) return -1;\n this._focusedIndex = (this._focusedIndex + 1) % this._flatButtons.length;\n this.onChange();\n return this._focusedIndex;\n }\n\n /**\n * Move focus to the previous button (ArrowLeft).\n */\n navigatePrev(): number {\n if (this._flatButtons.length === 0) return -1;\n this._focusedIndex =\n (this._focusedIndex - 1 + this._flatButtons.length) % this._flatButtons.length;\n this.onChange();\n return this._focusedIndex;\n }\n\n /**\n * Move focus to the first button (Home).\n */\n navigateFirst(): number {\n this._focusedIndex = 0;\n this.onChange();\n return this._focusedIndex;\n }\n\n /**\n * Move focus to the last button (End).\n */\n navigateLast(): number {\n this._focusedIndex = Math.max(0, this._flatButtons.length - 1);\n this.onChange();\n return this._focusedIndex;\n }\n\n /**\n * Set focused index directly (e.g. on mouse enter).\n */\n setFocusedIndex(index: number): void {\n if (index >= 0 && index < this._flatButtons.length) {\n this._focusedIndex = index;\n }\n }\n\n /**\n * Get the flat index of a top-level item by name.\n */\n getFlatIndex(name: string): number {\n return this._flatButtons.findIndex((fb) => fb.item.name === name);\n }\n\n // === Lifecycle ===\n\n /**\n * Subscribes to editor transaction events for active state tracking.\n */\n subscribe(): void {\n this.transactionHandler = () => {\n this.updateActiveStates();\n };\n this.editor.on('transaction', this.transactionHandler);\n this.updateActiveStates();\n }\n\n /**\n * Unsubscribes from editor events and cleans up.\n */\n destroy(): void {\n if (this.transactionHandler) {\n this.editor.off('transaction', this.transactionHandler);\n this.transactionHandler = null;\n }\n this._groups = [];\n this._activeMap.clear();\n this._disabledMap.clear();\n this._expandedMap.clear();\n this._flatButtons = [];\n }\n\n // === Internal ===\n\n /**\n * Rebuilds groups and flat button list from editor.toolbarItems.\n * When a layout is provided, uses layout-based resolution instead of default grouping.\n */\n private rebuild(): void {\n const items = this.editor.toolbarItems;\n this._groups = this._layout\n ? this.resolveLayout(items, this._layout)\n : this.groupItems(items);\n this._flatButtons = this.buildFlatList();\n this._focusedIndex = 0;\n }\n\n /**\n * Groups items by their `group` property, preserving extension order within groups.\n * Items without a group go into a default '' group.\n * Within each group, items are sorted by priority (higher first).\n */\n private groupItems(items: ToolbarItem[]): ToolbarGroup[] {\n const groupMap = new Map<string, ToolbarItem[]>();\n const groupOrder: string[] = [];\n\n for (const item of items) {\n // Skip items marked as bubble-menu-only\n if (item.type === 'button' && item.toolbar === false) continue;\n const groupName = ('group' in item && item.group) ? item.group : '';\n let list = groupMap.get(groupName);\n if (!list) {\n list = [];\n groupMap.set(groupName, list);\n groupOrder.push(groupName);\n }\n list.push(item);\n }\n\n // Sort items within each group by priority (higher first)\n const groups: ToolbarGroup[] = [];\n for (const name of groupOrder) {\n const groupItems = groupMap.get(name) ?? [];\n groupItems.sort((a, b) => {\n const pa = a.priority ?? 100;\n const pb = b.priority ?? 100;\n return pb - pa;\n });\n groups.push({ name, items: groupItems });\n }\n\n return groups;\n }\n\n /**\n * Resolves a layout array into ToolbarGroups by looking up registered items by name.\n * Separators ('|') split items into visual groups.\n * String entries resolve to existing buttons or dropdowns.\n * ToolbarLayoutDropdown entries build custom dropdowns from named sub-items.\n */\n private resolveLayout(items: ToolbarItem[], layout: ToolbarLayoutEntry[]): ToolbarGroup[] {\n // Build lookup maps from registered toolbar items\n const buttonMap = new Map<string, ToolbarButton>();\n const dropdownMap = new Map<string, ToolbarDropdown>();\n\n for (const item of items) {\n if (item.type === 'button') {\n buttonMap.set(item.name, item);\n } else if (item.type === 'dropdown') {\n dropdownMap.set(item.name, item);\n for (const sub of item.items) {\n buttonMap.set(sub.name, sub);\n }\n }\n }\n\n // Walk layout entries, building groups split by '|'\n const groups: ToolbarGroup[] = [];\n let current: ToolbarItem[] = [];\n let groupIdx = 0;\n\n for (const entry of layout) {\n if (entry === '|') {\n if (current.length > 0) {\n groups.push({ name: `layout-${String(groupIdx++)}`, items: current });\n current = [];\n }\n continue;\n }\n\n if (typeof entry === 'string') {\n const dd = dropdownMap.get(entry);\n if (dd) {\n current.push(dd);\n } else {\n const btn = buttonMap.get(entry);\n if (btn) current.push(btn);\n }\n continue;\n }\n\n // ToolbarLayoutDropdown - build a custom dropdown from named sub-items\n const subItems: ToolbarButton[] = [];\n for (const subName of entry.items) {\n const btn = buttonMap.get(subName);\n if (btn) subItems.push(btn);\n }\n if (subItems.length > 0) {\n const dd: ToolbarDropdown = {\n type: 'dropdown',\n name: `layout-dd-${entry.dropdown}`,\n icon: entry.icon,\n label: entry.dropdown,\n items: subItems,\n };\n if (entry.displayMode) dd.displayMode = entry.displayMode;\n if (entry.dynamicIcon) dd.dynamicIcon = entry.dynamicIcon;\n current.push(dd);\n }\n }\n\n if (current.length > 0) {\n groups.push({ name: `layout-${String(groupIdx)}`, items: current });\n }\n\n return groups;\n }\n\n /**\n * Builds a flat list of top-level buttons/dropdowns for keyboard navigation.\n */\n private buildFlatList(): FlatButton[] {\n const flat: FlatButton[] = [];\n for (const [gi, group] of this._groups.entries()) {\n for (const [ii, item] of group.items.entries()) {\n if (item.type === 'button' || item.type === 'dropdown') {\n flat.push({ item, groupIndex: gi, itemIndex: ii });\n }\n }\n }\n return flat;\n }\n\n /**\n * Updates active state map by checking editor.isActive() for each button.\n */\n private updateActiveStates(): void {\n // Cache can() proxy once per cycle - avoids creating a new Proxy per button\n let canProxy: Record<string, (...args: unknown[]) => boolean> | null = null;\n try {\n canProxy = this.editor.can();\n } catch {\n // can() may throw if editor is in an invalid state\n }\n\n for (const group of this._groups) {\n for (const item of group.items) {\n if (item.type === 'button') {\n this.checkButtonActive(item);\n this.checkButtonDisabled(item, canProxy);\n this.checkButtonExpanded(item);\n } else if (item.type === 'dropdown') {\n for (const sub of item.items) {\n this.checkButtonActive(sub);\n this.checkButtonDisabled(sub, canProxy);\n }\n // Dropdown trigger is disabled when ALL sub-items are disabled\n const allDisabled = item.items.length > 0\n && item.items.every(sub => this._disabledMap.get(sub.name));\n this._disabledMap.set(item.name, allDisabled);\n }\n }\n }\n\n // Always notify - even when no active/disabled states changed, cursor\n // position may have moved, which affects dynamic trigger labels that\n // read computed styles at cursor (e.g. font-size, font-family dropdowns\n // showing values not in the configured list).\n this.onChange();\n }\n\n private checkButtonDisabled(\n item: ToolbarButton,\n canProxy: Record<string, (...args: unknown[]) => boolean> | null,\n ): boolean {\n const wasDisabled = this._disabledMap.get(item.name) ?? false;\n let nowDisabled = false;\n\n try {\n if (item.emitEvent) {\n // emitEvent buttons open a popover - can't do meaningful can() dry-run\n // because the command needs user-provided args (href, src, etc.).\n // Instead, check if cursor is in a code block where marks/inserts are blocked.\n nowDisabled = this.editor.isActive('codeBlock');\n } else if (canProxy) {\n const canCmd = canProxy[item.command];\n if (canCmd) {\n nowDisabled = item.commandArgs?.length\n ? !canCmd(...item.commandArgs)\n : !canCmd();\n }\n }\n } catch {\n // Command dry-run may throw (e.g. buggy extension) - treat as enabled\n }\n\n if (wasDisabled !== nowDisabled) {\n this._disabledMap.set(item.name, nowDisabled);\n return true;\n }\n\n return false;\n }\n\n private checkButtonActive(item: ToolbarButton): boolean {\n if (!item.isActive && !item.isActiveFn) return false;\n\n const wasActive = this._activeMap.get(item.name) ?? false;\n const nowActive = ToolbarController.resolveActive(this.editor, item);\n\n if (wasActive !== nowActive) {\n this._activeMap.set(item.name, nowActive);\n return true;\n }\n\n return false;\n }\n\n private checkButtonExpanded(item: ToolbarButton): boolean {\n if (!item.emitEvent) return false;\n\n const wasExpanded = this._expandedMap.get(item.name) ?? false;\n const ext = this.editor.storage[item.name] as Record<string, unknown> | undefined;\n const nowExpanded = ext?.['isOpen'] === true;\n\n if (wasExpanded !== nowExpanded) {\n this._expandedMap.set(item.name, nowExpanded);\n return true;\n }\n\n return false;\n }\n}\n","import type { FloatingMenuItem } from '../types/FloatingMenu.js';\n\n/**\n * A group of floating-menu items sharing the same `group` value.\n */\nexport interface FloatingMenuGroup {\n name: string;\n items: FloatingMenuItem[];\n}\n\n/**\n * Groups items by their `group` property, preserving extension insertion\n * order of groups. Within each group, items are sorted by `priority`\n * descending (higher first, default 100).\n *\n * Shared between `FloatingMenuController` (which renders grouped item lists\n * for FloatingMenu + framework wrappers) and `createSlashSuggestionRenderer`\n * (the popup shown by SlashCommand). Having one implementation keeps visual\n * grouping consistent across every trigger mechanism.\n */\nexport function groupFloatingMenuItems(items: FloatingMenuItem[]): FloatingMenuGroup[] {\n const map = new Map<string, FloatingMenuItem[]>();\n const order: string[] = [];\n\n for (const item of items) {\n const name = item.group ?? '';\n let list = map.get(name);\n if (!list) {\n list = [];\n map.set(name, list);\n order.push(name);\n }\n list.push(item);\n }\n\n const groups: FloatingMenuGroup[] = [];\n for (const name of order) {\n const list = (map.get(name) ?? []).slice();\n list.sort((a, b) => (b.priority ?? 100) - (a.priority ?? 100));\n groups.push({ name, items: list });\n }\n return groups;\n}\n","/**\n * FloatingMenuController - Headless, framework-agnostic state machine for the\n * block-insert floating menu.\n *\n * Mirrors the shape of ToolbarController: collects items from extensions,\n * groups them, tracks focused index for roving-tabindex keyboard navigation,\n * and executes commands. Framework wrappers (Angular, React, Vue) bind their\n * templates to this controller.\n *\n * @example\n * const controller = new FloatingMenuController(editor, () => {\n * // onChange - re-render\n * });\n * controller.subscribe();\n * // ... controller.groups, controller.focusedIndex, controller.execute(item)\n * controller.destroy();\n */\n\nimport type { Editor } from './Editor.js';\nimport type { FloatingMenuItem, FloatingMenuItemsOverride } from './types/FloatingMenu.js';\nimport { groupFloatingMenuItems, type FloatingMenuGroup } from './utils/groupFloatingMenuItems.js';\n\nexport type { FloatingMenuGroup };\n\n/** -1 means no item is focused (menu not entered via keyboard). */\nexport const FLOATING_MENU_NO_FOCUS = -1;\n\nexport class FloatingMenuController {\n /**\n * Resolves an `items` option (array | function) against the editor's\n * default floating-menu items. Exposed as static so the plugin can\n * resolve once at init without constructing a controller.\n */\n static resolveItems(\n editor: Editor,\n override?: FloatingMenuItemsOverride,\n ): FloatingMenuItem[] {\n const defaults = editor.floatingMenuItems;\n if (!override) return defaults;\n if (Array.isArray(override)) return override;\n try {\n return override(defaults, editor);\n } catch {\n return defaults;\n }\n }\n\n /**\n * Executes a floating-menu item's command on the editor.\n * String commands are dispatched via `editor.commands[name](...args)`;\n * function commands are called directly.\n */\n static executeItem(editor: Editor, item: FloatingMenuItem): void {\n if (typeof item.command === 'function') {\n item.command(editor);\n return;\n }\n const commands = editor.commands as unknown as Record<string, (...args: unknown[]) => boolean>;\n const cmd = commands[item.command];\n if (!cmd) return;\n if (item.commandArgs?.length) {\n cmd(...item.commandArgs);\n } else {\n cmd();\n }\n }\n\n private editor: Editor;\n private onChange: () => void;\n private override: FloatingMenuItemsOverride | undefined;\n private transactionHandler: (() => void) | null = null;\n\n private _groups: FloatingMenuGroup[] = [];\n private _flatItems: FloatingMenuItem[] = [];\n private _disabledMap = new Map<string, boolean>();\n private _focusedIndex = FLOATING_MENU_NO_FOCUS;\n\n constructor(editor: Editor, onChange: () => void, override?: FloatingMenuItemsOverride) {\n this.editor = editor;\n this.onChange = onChange;\n this.override = override;\n this.rebuild();\n }\n\n // === Getters ===\n\n get groups(): FloatingMenuGroup[] {\n return this._groups;\n }\n\n get flatItems(): FloatingMenuItem[] {\n return this._flatItems;\n }\n\n get disabledMap(): ReadonlyMap<string, boolean> {\n return this._disabledMap;\n }\n\n get focusedIndex(): number {\n return this._focusedIndex;\n }\n\n /** True when keyboard focus is inside the menu (at least one item focused). */\n get isEntered(): boolean {\n return this._focusedIndex >= 0;\n }\n\n get itemCount(): number {\n return this._flatItems.length;\n }\n\n // === State Methods ===\n\n isDisabled(item: FloatingMenuItem): boolean {\n return this._disabledMap.get(item.name) ?? false;\n }\n\n /**\n * Executes an item's command, then closes the menu keyboard focus.\n * Callers should refocus the editor after calling this.\n */\n execute(item: FloatingMenuItem): void {\n if (this.isDisabled(item)) return;\n FloatingMenuController.executeItem(this.editor, item);\n this._focusedIndex = FLOATING_MENU_NO_FOCUS;\n this.onChange();\n }\n\n /**\n * Rebuilds items from the editor. Call when the editor's extensions\n * change (rare) or on explicit refresh. Notification is delegated to\n * `updateDisabledStates` which fires `onChange` only when a disabled\n * state flipped - wrappers that need to react to pure group-structure\n * changes do so by bumping their own render signal after constructing\n * / re-using the controller (see framework wrapper usage).\n */\n rebuild(): void {\n const items = FloatingMenuController.resolveItems(this.editor, this.override);\n this._groups = this.groupItems(items);\n this._flatItems = this._groups.flatMap((g) => g.items);\n if (this._focusedIndex >= this._flatItems.length) {\n this._focusedIndex = FLOATING_MENU_NO_FOCUS;\n }\n this.updateDisabledStates();\n }\n\n // === Keyboard Navigation (roving tabindex) ===\n\n /** Enter keyboard focus on the menu (first item). Called by the plugin's keymap. */\n enterMenu(): number {\n if (this._flatItems.length === 0) {\n this._focusedIndex = FLOATING_MENU_NO_FOCUS;\n return this._focusedIndex;\n }\n this._focusedIndex = 0;\n this.onChange();\n return this._focusedIndex;\n }\n\n /** Leave keyboard focus (Escape). Refocus of the editor is the caller's job. */\n leaveMenu(): void {\n if (this._focusedIndex === FLOATING_MENU_NO_FOCUS) return;\n this._focusedIndex = FLOATING_MENU_NO_FOCUS;\n this.onChange();\n }\n\n /** ArrowDown - wrap to first at end. */\n next(): number {\n if (this._flatItems.length === 0) return FLOATING_MENU_NO_FOCUS;\n const cur = this._focusedIndex < 0 ? -1 : this._focusedIndex;\n this._focusedIndex = (cur + 1) % this._flatItems.length;\n this.onChange();\n return this._focusedIndex;\n }\n\n /** ArrowUp - wrap to last at start. */\n prev(): number {\n if (this._flatItems.length === 0) return FLOATING_MENU_NO_FOCUS;\n const len = this._flatItems.length;\n const cur = this._focusedIndex < 0 ? len : this._focusedIndex;\n this._focusedIndex = (cur - 1 + len) % len;\n this.onChange();\n return this._focusedIndex;\n }\n\n first(): number {\n if (this._flatItems.length === 0) return FLOATING_MENU_NO_FOCUS;\n this._focusedIndex = 0;\n this.onChange();\n return this._focusedIndex;\n }\n\n last(): number {\n if (this._flatItems.length === 0) return FLOATING_MENU_NO_FOCUS;\n this._focusedIndex = this._flatItems.length - 1;\n this.onChange();\n return this._focusedIndex;\n }\n\n /** Set focused index directly (e.g. on pointer hover). */\n setFocusedIndex(index: number): void {\n if (index < 0 || index >= this._flatItems.length) return;\n if (this._focusedIndex === index) return;\n this._focusedIndex = index;\n this.onChange();\n }\n\n /** Get focused item (or null). */\n focusedItem(): FloatingMenuItem | null {\n return this._flatItems[this._focusedIndex] ?? null;\n }\n\n /** Get flat index of item by name (for wrappers binding roving tabindex). */\n getFlatIndex(name: string): number {\n return this._flatItems.findIndex((i) => i.name === name);\n }\n\n // === Lifecycle ===\n\n /** Subscribes to editor transactions for disabled-state tracking. */\n subscribe(): void {\n this.transactionHandler = () => {\n this.updateDisabledStates();\n };\n this.editor.on('transaction', this.transactionHandler);\n }\n\n /** Unsubscribes and clears internal state. */\n destroy(): void {\n if (this.transactionHandler) {\n this.editor.off('transaction', this.transactionHandler);\n this.transactionHandler = null;\n }\n this._groups = [];\n this._flatItems = [];\n this._disabledMap.clear();\n this._focusedIndex = FLOATING_MENU_NO_FOCUS;\n }\n\n // === Internal ===\n\n /**\n * Groups items by `group` preserving insertion order, then sorts by\n * priority (higher first) within each group. Delegates to the shared\n * utility so `SlashCommand`'s renderer and this controller always\n * produce identical ordering.\n */\n private groupItems(items: FloatingMenuItem[]): FloatingMenuGroup[] {\n return groupFloatingMenuItems(items);\n }\n\n /**\n * Updates disabled state for each item. Uses custom predicate when\n * provided; otherwise tries a dry-run against `editor.can()[command]`.\n * Only notifies on change to avoid noisy re-renders.\n */\n private updateDisabledStates(): void {\n let changed = false;\n let canProxy: Record<string, (...args: unknown[]) => boolean> | null = null;\n try {\n canProxy = this.editor.can() as unknown as Record<string, (...args: unknown[]) => boolean>;\n } catch {\n canProxy = null;\n }\n\n for (const item of this._flatItems) {\n const was = this._disabledMap.get(item.name) ?? false;\n let now = false;\n\n if (item.isDisabled) {\n try {\n now = item.isDisabled(this.editor);\n } catch {\n now = false;\n }\n } else if (typeof item.command === 'string' && canProxy) {\n try {\n const canCmd = canProxy[item.command];\n if (canCmd) {\n now = item.commandArgs?.length\n ? !canCmd(...item.commandArgs)\n : !canCmd();\n }\n } catch {\n now = false;\n }\n }\n\n if (was !== now) {\n this._disabledMap.set(item.name, now);\n changed = true;\n }\n }\n\n if (changed) this.onChange();\n }\n}\n","// Phosphor Icons (MIT) - https://phosphoricons.com/\n\nimport type { IconSet } from '../types/Toolbar.js';\n\nexport const defaultIcons: IconSet = {\n // --- Format: Inline ---\n textB:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M178.48,115.7A44,44,0,0,0,148,40H80a8,8,0,0,0-8,8V200a8,8,0,0,0,8,8h80a48,48,0,0,0,18.48-92.3ZM88,56h60a28,28,0,0,1,0,56H88Zm72,136H88V128h72a32,32,0,0,1,0,64Z\"/></svg>',\n\n textItalic:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M200,56a8,8,0,0,1-8,8H157.77L115.1,192H144a8,8,0,0,1,0,16H64a8,8,0,0,1,0-16H98.23L140.9,64H112a8,8,0,0,1,0-16h80A8,8,0,0,1,200,56Z\"/></svg>',\n\n textUnderline:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M200,224a8,8,0,0,1-8,8H64a8,8,0,0,1,0-16H192A8,8,0,0,1,200,224Zm-72-24a64.07,64.07,0,0,0,64-64V56a8,8,0,0,0-16,0v80a48,48,0,0,1-96,0V56a8,8,0,0,0-16,0v80A64.07,64.07,0,0,0,128,200Z\"/></svg>',\n\n textStrikethrough:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M224,128a8,8,0,0,1-8,8H175.93c9.19,7.11,16.07,17.2,16.07,32,0,13.34-7,25.7-19.75,34.79C160.33,211.31,144.61,216,128,216s-32.33-4.69-44.25-13.21C71,193.7,64,181.34,64,168a8,8,0,0,1,16,0c0,17.35,22,32,48,32s48-14.65,48-32c0-14.85-10.54-23.58-38.77-32H40a8,8,0,0,1,0-16H216A8,8,0,0,1,224,128ZM76.33,104a8,8,0,0,0,7.61-10.49A17.3,17.3,0,0,1,83.11,88c0-18.24,19.3-32,44.89-32,18.84,0,34.16,7.42,41,19.85a8,8,0,0,0,14-7.7C173.33,50.52,152.77,40,128,40,93.29,40,67.11,60.63,67.11,88a33.73,33.73,0,0,0,1.62,10.49A8,8,0,0,0,76.33,104Z\"/></svg>',\n\n code:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M69.12,94.15,28.5,128l40.62,33.85a8,8,0,1,1-10.24,12.29l-48-40a8,8,0,0,1,0-12.29l48-40a8,8,0,0,1,10.24,12.3Zm176,27.7-48-40a8,8,0,1,0-10.24,12.3L227.5,128l-40.62,33.85a8,8,0,1,0,10.24,12.29l48-40a8,8,0,0,0,0-12.29ZM162.73,32.48a8,8,0,0,0-10.25,4.79l-64,176a8,8,0,0,0,4.79,10.26A8.14,8.14,0,0,0,96,224a8,8,0,0,0,7.52-5.27l64-176A8,8,0,0,0,162.73,32.48Z\"/></svg>',\n\n highlighterCircle:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M201.54,54.46A104,104,0,0,0,54.46,201.54,104,104,0,0,0,201.54,54.46ZM96,210V152h64v58a88.33,88.33,0,0,1-64,0Zm48-74H112V100.94l32-16Zm46.22,54.22A88.09,88.09,0,0,1,176,201.77V152a16,16,0,0,0-16-16V72a8,8,0,0,0-11.58-7.16l-48,24A8,8,0,0,0,96,96v40a16,16,0,0,0-16,16v49.77a88,88,0,1,1,110.22-11.55Z\"/></svg>',\n\n textSubscript:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M248,208a8,8,0,0,1-8,8H192a8,8,0,0,1-6.4-12.8l43.17-57.56a16,16,0,1,0-27.86-15,8,8,0,0,1-15.09-5.34,32.18,32.18,0,0,1,4.63-8.59,32,32,0,0,1,51.11,38.52L208,200h32A8,8,0,0,1,248,208ZM149.24,50a8,8,0,0,0-11.29.81L92,103.78l-45.95-53A8,8,0,0,0,34,61.24L81.41,116,34,170.76a8,8,0,0,0,12.1,10.48l46-53,45.95,53a8,8,0,1,0,12.1-10.48L102.59,116l47.46-54.76A8,8,0,0,0,149.24,50Z\"/></svg>',\n\n textSuperscript:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M248,144a8,8,0,0,1-8,8H192a8,8,0,0,1-6.4-12.8l43.17-57.55a16,16,0,1,0-27.86-15,8,8,0,0,1-15.09-5.33,32,32,0,1,1,55.74,29.92L208,136h32A8,8,0,0,1,248,144ZM149.24,74a8,8,0,0,0-11.29.8L92,127.79l-45.95-53A8,8,0,0,0,34,85.24L81.41,140,34,194.76a8,8,0,0,0,12.1,10.48l46-53,45.95,53a8,8,0,1,0,12.1-10.48L102.59,140l47.46-54.76A8,8,0,0,0,149.24,74Z\"/></svg>',\n\n link:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M240,88.23a54.43,54.43,0,0,1-16,37L189.25,160a54.27,54.27,0,0,1-38.63,16h-.05A54.63,54.63,0,0,1,96,119.84a8,8,0,0,1,16,.45A38.62,38.62,0,0,0,150.58,160h0a38.39,38.39,0,0,0,27.31-11.31l34.75-34.75a38.63,38.63,0,0,0-54.63-54.63l-11,11A8,8,0,0,1,135.7,59l11-11A54.65,54.65,0,0,1,224,48,54.86,54.86,0,0,1,240,88.23ZM109,185.66l-11,11A38.41,38.41,0,0,1,70.6,208h0a38.63,38.63,0,0,1-27.29-65.94L78,107.31A38.63,38.63,0,0,1,144,135.71a8,8,0,0,0,16,.45A54.86,54.86,0,0,0,144,96a54.65,54.65,0,0,0-77.27,0L32,130.75A54.62,54.62,0,0,0,70.56,224h0a54.28,54.28,0,0,0,38.64-16l11-11A8,8,0,0,0,109,185.66Z\"/></svg>',\n\n // --- Format: Block ---\n paragraph:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M208,40H96a64,64,0,0,0,0,128h40v40a8,8,0,0,0,16,0V56h24V208a8,8,0,0,0,16,0V56h16a8,8,0,0,0,0-16ZM136,152H96a48,48,0,0,1,0-96h40Z\"/></svg>',\n\n textH:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M208,56V200a8,8,0,0,1-16,0V136H64v64a8,8,0,0,1-16,0V56a8,8,0,0,1,16,0v64H192V56a8,8,0,0,1,16,0Z\"/></svg>',\n\n textHOne:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M152,56V176a8,8,0,0,1-16,0V124H48v52a8,8,0,0,1-16,0V56a8,8,0,0,1,16,0v52h88V56a8,8,0,0,1,16,0Zm75.77,49a8,8,0,0,0-8.21.39l-24,16a8,8,0,1,0,8.88,13.32L216,127V208a8,8,0,0,0,16,0V112A8,8,0,0,0,227.77,105Z\"/></svg>',\n\n textHTwo:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M152,56V176a8,8,0,0,1-16,0V124H48v52a8,8,0,0,1-16,0V56a8,8,0,0,1,16,0v52h88V56a8,8,0,0,1,16,0Zm88,144H208l33.55-44.74a32,32,0,1,0-55.73-29.93,8,8,0,1,0,15.08,5.34,16.28,16.28,0,0,1,2.32-4.3,16,16,0,1,1,25.54,19.27L185.6,203.2A8,8,0,0,0,192,216h48a8,8,0,0,0,0-16Z\"/></svg>',\n\n textHThree:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M152,56V176a8,8,0,0,1-16,0V124H48v52a8,8,0,0,1-16,0V56a8,8,0,0,1,16,0v52h88V56a8,8,0,0,1,16,0Zm73.52,90.63,21-30A8,8,0,0,0,240,104H192a8,8,0,0,0,0,16h32.63l-19.18,27.41A8,8,0,0,0,212,160a20,20,0,1,1-14.29,34,8,8,0,1,0-11.42,11.19A36,36,0,0,0,248,180,36.07,36.07,0,0,0,225.52,146.63Z\"/></svg>',\n\n textHFour:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M152,56V176a8,8,0,0,1-16,0V124H48v52a8,8,0,0,1-16,0V56a8,8,0,0,1,16,0v52h88V56a8,8,0,0,1,16,0ZM256,184a8,8,0,0,1-8,8h-8v16a8,8,0,0,1-16,0V192H176a8,8,0,0,1-6.31-12.91l56-72A8,8,0,0,1,240,112v64h8A8,8,0,0,1,256,184Zm-32-48.68L192.36,176H224Z\"/></svg>',\n\n quotes:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M100,56H40A16,16,0,0,0,24,72v64a16,16,0,0,0,16,16h60v8a32,32,0,0,1-32,32,8,8,0,0,0,0,16,48.05,48.05,0,0,0,48-48V72A16,16,0,0,0,100,56Zm0,80H40V72h60ZM216,56H156a16,16,0,0,0-16,16v64a16,16,0,0,0,16,16h60v8a32,32,0,0,1-32,32,8,8,0,0,0,0,16,48.05,48.05,0,0,0,48-48V72A16,16,0,0,0,216,56Zm0,80H156V72h60Z\"/></svg>',\n\n codeBlock:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M58.34,101.66l-32-32a8,8,0,0,1,0-11.32l32-32A8,8,0,0,1,69.66,37.66L43.31,64,69.66,90.34a8,8,0,0,1-11.32,11.32Zm40,0a8,8,0,0,0,11.32,0l32-32a8,8,0,0,0,0-11.32l-32-32A8,8,0,0,0,98.34,37.66L124.69,64,98.34,90.34A8,8,0,0,0,98.34,101.66ZM200,40H176a8,8,0,0,0,0,16h24V200H56V136a8,8,0,0,0-16,0v64a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V56A16,16,0,0,0,200,40Z\"/></svg>',\n\n minus:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M224,128a8,8,0,0,1-8,8H40a8,8,0,0,1,0-16H216A8,8,0,0,1,224,128Z\"/></svg>',\n\n // --- Lists ---\n list:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M224,128a8,8,0,0,1-8,8H40a8,8,0,0,1,0-16H216A8,8,0,0,1,224,128ZM40,72H216a8,8,0,0,0,0-16H40a8,8,0,0,0,0,16ZM216,184H40a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Z\"/></svg>',\n\n listBullets:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M80,64a8,8,0,0,1,8-8H216a8,8,0,0,1,0,16H88A8,8,0,0,1,80,64Zm136,56H88a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Zm0,64H88a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16ZM44,52A12,12,0,1,0,56,64,12,12,0,0,0,44,52Zm0,64a12,12,0,1,0,12,12A12,12,0,0,0,44,116Zm0,64a12,12,0,1,0,12,12A12,12,0,0,0,44,180Z\"/></svg>',\n\n listNumbers:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M224,128a8,8,0,0,1-8,8H104a8,8,0,0,1,0-16H216A8,8,0,0,1,224,128ZM104,72H216a8,8,0,0,0,0-16H104a8,8,0,0,0,0,16ZM216,184H104a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16ZM43.58,55.16,48,52.94V104a8,8,0,0,0,16,0V40a8,8,0,0,0-11.58-7.16l-16,8a8,8,0,0,0,7.16,14.32ZM79.77,156.72a23.73,23.73,0,0,0-9.6-15.95,24.86,24.86,0,0,0-34.11,4.7,23.63,23.63,0,0,0-3.57,6.46,8,8,0,1,0,15,5.47,7.84,7.84,0,0,1,1.18-2.13,8.76,8.76,0,0,1,12-1.59A7.91,7.91,0,0,1,63.93,159a7.64,7.64,0,0,1-1.57,5.78,1,1,0,0,0-.08.11L33.59,203.21A8,8,0,0,0,40,216H72a8,8,0,0,0,0-16H56l19.08-25.53A23.47,23.47,0,0,0,79.77,156.72Z\"/></svg>',\n\n listChecks:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M224,128a8,8,0,0,1-8,8H128a8,8,0,0,1,0-16h88A8,8,0,0,1,224,128ZM128,72h88a8,8,0,0,0,0-16H128a8,8,0,0,0,0,16Zm88,112H128a8,8,0,0,0,0,16h88a8,8,0,0,0,0-16ZM82.34,42.34,56,68.69,45.66,58.34A8,8,0,0,0,34.34,69.66l16,16a8,8,0,0,0,11.32,0l32-32A8,8,0,0,0,82.34,42.34Zm0,64L56,132.69,45.66,122.34a8,8,0,0,0-11.32,11.32l16,16a8,8,0,0,0,11.32,0l32-32a8,8,0,0,0-11.32-11.32Zm0,64L56,196.69,45.66,186.34a8,8,0,0,0-11.32,11.32l16,16a8,8,0,0,0,11.32,0l32-32a8,8,0,0,0-11.32-11.32Z\"/></svg>',\n\n // --- Alignment ---\n textAlignLeft:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M32,64a8,8,0,0,1,8-8H216a8,8,0,0,1,0,16H40A8,8,0,0,1,32,64Zm8,48H168a8,8,0,0,0,0-16H40a8,8,0,0,0,0,16Zm176,24H40a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Zm-48,40H40a8,8,0,0,0,0,16H168a8,8,0,0,0,0-16Z\"/></svg>',\n\n textAlignCenter:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M32,64a8,8,0,0,1,8-8H216a8,8,0,0,1,0,16H40A8,8,0,0,1,32,64ZM64,96a8,8,0,0,0,0,16H192a8,8,0,0,0,0-16Zm152,40H40a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Zm-24,40H64a8,8,0,0,0,0,16H192a8,8,0,0,0,0-16Z\"/></svg>',\n\n textAlignRight:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M32,64a8,8,0,0,1,8-8H216a8,8,0,0,1,0,16H40A8,8,0,0,1,32,64ZM216,96H88a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Zm0,40H40a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Zm0,40H88a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Z\"/></svg>',\n\n textAlignJustify:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M32,64a8,8,0,0,1,8-8H216a8,8,0,0,1,0,16H40A8,8,0,0,1,32,64ZM216,96H40a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Zm0,40H40a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Zm0,40H40a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Z\"/></svg>',\n\n // --- Text Style ---\n textAUnderline:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -23 256 256\" fill=\"currentColor\"><path d=\"M60.59,175.24a8,8,0,0,0,10.65-3.83L87.9,136h80.2l16.66,35.41a8,8,0,1,0,14.48-6.82l-64-136a8,8,0,0,0-14.48,0l-64,136A8,8,0,0,0,60.59,175.24ZM128,50.79,160.57,120H95.43Z\"/></svg>',\n\n palette:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M200.77,53.89A103.27,103.27,0,0,0,128,24h-1.07A104,104,0,0,0,24,128c0,43,26.58,79.06,69.36,94.17A32,32,0,0,0,136,192a16,16,0,0,1,16-16h46.21a31.81,31.81,0,0,0,31.2-24.88,104.43,104.43,0,0,0,2.59-24A103.28,103.28,0,0,0,200.77,53.89Zm13,93.71A15.89,15.89,0,0,1,198.21,160H152a32,32,0,0,0-32,32,16,16,0,0,1-21.31,15.07C62.49,194.3,40,164,40,128a88,88,0,0,1,87.09-88h.9a88.35,88.35,0,0,1,88,87.25A88.86,88.86,0,0,1,213.81,147.6ZM140,76a12,12,0,1,1-12-12A12,12,0,0,1,140,76ZM96,100A12,12,0,1,1,84,88,12,12,0,0,1,96,100Zm0,56a12,12,0,1,1-12-12A12,12,0,0,1,96,156Zm88-56a12,12,0,1,1-12-12A12,12,0,0,1,184,100Z\"/></svg>',\n\n textAa:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M87.24,52.59a8,8,0,0,0-14.48,0l-64,136a8,8,0,1,0,14.48,6.81L39.9,160h80.2l16.66,35.4a8,8,0,1,0,14.48-6.81ZM47.43,144,80,74.79,112.57,144ZM200,96c-12.76,0-22.73,3.47-29.63,10.32a8,8,0,0,0,11.26,11.36c3.8-3.77,10-5.68,18.37-5.68,13.23,0,24,9,24,20v3.22A42.76,42.76,0,0,0,200,128c-22.06,0-40,16.15-40,36s17.94,36,40,36a42.73,42.73,0,0,0,24-7.25,8,8,0,0,0,16-.75V132C240,112.15,222.06,96,200,96Zm0,88c-13.23,0-24-9-24-20s10.77-20,24-20,24,9,24,20S213.23,184,200,184Z\"/></svg>',\n\n textSize:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -23 256 256\" fill=\"currentColor\"><path d=\"M24.59,175.24a8,8,0,0,0,10.65-3.83L51.9,136h80.2l16.66,35.41a8,8,0,1,0,14.48-6.82l-64-136a8,8,0,0,0-14.48,0l-64,136A8,8,0,0,0,24.59,175.24ZM92,50.79,124.57,120H59.43Z\"/><g transform=\"translate(195,112.5) scale(0.68) translate(-105,-146)\"><path d=\"M165.66,194.34a8,8,0,0,1,0,11.32l-32,32a8,8,0,0,1-11.32,0l-32-32a8,8,0,0,1,11.32-11.32L120,212.69V43.31L101.66,61.66A8,8,0,0,1,90.34,50.34l32-32a8,8,0,0,1,11.32,0l32,32a8,8,0,0,1-11.32,11.32L136,43.31V212.69l18.34-18.35A8,8,0,0,1,165.66,194.34Z\"/></g></svg>',\n\n lineSpacing:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M224,128a8,8,0,0,1-8,8H40a8,8,0,0,1,0-16H216A8,8,0,0,1,224,128ZM101.66,53.66,120,35.31V96a8,8,0,0,0,16,0V35.31l18.34,18.35a8,8,0,0,0,11.32-11.32l-32-32a8,8,0,0,0-11.32,0l-32,32a8,8,0,0,0,11.32,11.32Zm52.68,148.68L136,220.69V160a8,8,0,0,0-16,0v60.69l-18.34-18.35a8,8,0,0,0-11.32,11.32l32,32a8,8,0,0,0,11.32,0l32-32a8,8,0,0,0-11.32-11.32Z\"/></svg>',\n\n // --- Link Popover ---\n linkBreak:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M198.63,57.37a32,32,0,0,0-45.19-.06L141.79,69.52a8,8,0,0,1-11.58-11l11.72-12.29a1.59,1.59,0,0,1,.13-.13,48,48,0,0,1,67.88,67.88,1.59,1.59,0,0,1-.13.13l-12.29,11.72a8,8,0,0,1-11-11.58l12.21-11.65A32,32,0,0,0,198.63,57.37ZM114.21,186.48l-11.65,12.21a32,32,0,0,1-45.25-45.25l12.21-11.65a8,8,0,0,0-11-11.58L46.19,141.93a1.59,1.59,0,0,0-.13.13,48,48,0,0,0,67.88,67.88,1.59,1.59,0,0,0,.13-.13l11.72-12.29a8,8,0,1,0-11.58-11ZM216,152H192a8,8,0,0,0,0,16h24a8,8,0,0,0,0-16ZM40,104H64a8,8,0,0,0,0-16H40a8,8,0,0,0,0,16Zm120,80a8,8,0,0,0-8,8v24a8,8,0,0,0,16,0V192A8,8,0,0,0,160,184ZM96,72a8,8,0,0,0,8-8V40a8,8,0,0,0-16,0V64A8,8,0,0,0,96,72Z\"/></svg>',\n\n check:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M229.66,77.66l-128,128a8,8,0,0,1-11.32,0l-56-56a8,8,0,0,1,11.32-11.32L96,188.69,218.34,66.34a8,8,0,0,1,11.32,11.32Z\"/></svg>',\n\n // --- Color Palette ---\n prohibit:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm88,104a87.56,87.56,0,0,1-20.41,56.28L71.72,60.41A88,88,0,0,1,216,128ZM40,128A87.56,87.56,0,0,1,60.41,71.72L184.28,195.59A88,88,0,0,1,40,128Z\"/></svg>',\n\n // --- Details / Accordion ---\n caretCircleRight:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm0,192a88,88,0,1,1,88-88A88.1,88.1,0,0,1,128,216Zm29.66-93.66a8,8,0,0,1,0,11.32l-40,40a8,8,0,0,1-11.32-11.32L140.69,128,106.34,93.66a8,8,0,0,1,11.32-11.32Z\"/></svg>',\n\n // --- Insert ---\n image:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M216,40H40A16,16,0,0,0,24,56V200a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40Zm0,16V158.75l-26.07-26.06a16,16,0,0,0-22.63,0l-20,20-44-44a16,16,0,0,0-22.62,0L40,149.37V56ZM40,172l52-52,80,80H40Zm176,28H194.63l-36-36,20-20L216,181.38V200ZM144,100a12,12,0,1,1,12,12A12,12,0,0,1,144,100Z\"/></svg>',\n\n smiley:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm0,192a88,88,0,1,1,88-88A88.1,88.1,0,0,1,128,216ZM80,108a12,12,0,1,1,12,12A12,12,0,0,1,80,108Zm96,0a12,12,0,1,1-12-12A12,12,0,0,1,176,108Zm-1.07,48c-10.29,17.79-27.4,28-46.93,28s-36.63-10.2-46.92-28a8,8,0,1,1,13.84-8c7.47,12.91,19.21,20,33.08,20s25.61-7.1,33.07-20a8,8,0,0,1,13.86,8Z\"/></svg>',\n\n textIndent:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M224,128a8,8,0,0,1-8,8H112a8,8,0,0,1,0-16H216A8,8,0,0,1,224,128ZM112,72H216a8,8,0,0,0,0-16H112a8,8,0,0,0,0,16ZM216,184H40a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16ZM34.34,141.66a8,8,0,0,0,11.32,0l40-40a8,8,0,0,0,0-11.32l-40-40A8,8,0,0,0,34.34,61.66L68.69,96,34.34,130.34A8,8,0,0,0,34.34,141.66Z\"/></svg>',\n\n // --- Image ---\n trash:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M216,48H176V40a24,24,0,0,0-24-24H104A24,24,0,0,0,80,40v8H40a8,8,0,0,0,0,16h8V208a16,16,0,0,0,16,16H192a16,16,0,0,0,16-16V64h8a8,8,0,0,0,0-16ZM96,40a8,8,0,0,1,8-8h48a8,8,0,0,1,8,8v8H96Zm96,168H64V64H192ZM112,104v64a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Zm48,0v64a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Z\"/></svg>',\n\n // --- Utilities ---\n textT:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M208,56V88a8,8,0,0,1-16,0V64H136V192h24a8,8,0,0,1,0,16H96a8,8,0,0,1,0-16h24V64H64V88a8,8,0,0,1-16,0V56a8,8,0,0,1,8-8H200A8,8,0,0,1,208,56Z\"/></svg>',\n\n textTSlash:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M213.38,221.92a8,8,0,0,1-11.3-.54L136,148.69V192h24a8,8,0,0,1,0,16H96a8,8,0,0,1,0-16h24V131.09L64,69.49V88a8,8,0,0,1-16,0V56a8,8,0,0,1,.72-3.31l-6.64-7.31A8,8,0,1,1,53.92,34.62l160,176A8,8,0,0,1,213.38,221.92ZM105.79,64H120V80.43a8,8,0,0,0,16,0V64h56V88a8,8,0,0,0,16,0V56a8,8,0,0,0-8-8H105.79a8,8,0,0,0,0,16Z\"/></svg>',\n\n // --- History ---\n arrowCounterClockwise:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M224,128a96,96,0,0,1-94.71,96H128A95.38,95.38,0,0,1,62.1,197.8a8,8,0,0,1,11-11.63A80,80,0,1,0,71.43,71.39a3.07,3.07,0,0,1-.26.25L44.59,96H72a8,8,0,0,1,0,16H24a8,8,0,0,1-8-8V56a8,8,0,0,1,16,0V85.8L60.25,60A96,96,0,0,1,224,128Z\"/></svg>',\n\n arrowClockwise:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M240,56v48a8,8,0,0,1-8,8H184a8,8,0,0,1,0-16H211.4L184.81,71.64l-.25-.24a80,80,0,1,0-1.67,114.78,8,8,0,0,1,11,11.63A95.44,95.44,0,0,1,128,224h-1.32A96,96,0,1,1,195.75,60L224,85.8V56a8,8,0,1,1,16,0Z\"/></svg>',\n\n // --- Table ---\n table:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M224,48H32a8,8,0,0,0-8,8V192a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A8,8,0,0,0,224,48ZM40,112H80v32H40Zm56,0H216v32H96ZM216,64V96H40V64ZM40,160H80v32H40Zm176,32H96V160H216v32Z\"/></svg>',\n\n gridNine:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M216,48H40A16,16,0,0,0,24,64V192a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V64A16,16,0,0,0,216,48ZM104,144V112h48v32Zm48,16v32H104V160ZM40,112H88v32H40Zm64-16V64h48V96Zm64,16h48v32H168Zm48-16H168V64h48ZM88,64V96H40V64ZM40,160H88v32H40Zm176,32H168V160h48v32Z\"/></svg>',\n\n // --- Block Handle / Context Menu ---\n plus:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M224,128a8,8,0,0,1-8,8H136v80a8,8,0,0,1-16,0V136H40a8,8,0,0,1,0-16h80V40a8,8,0,0,1,16,0v80h80A8,8,0,0,1,224,128Z\"/></svg>',\n\n dotsSixVertical:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M108,60A16,16,0,1,1,92,44,16,16,0,0,1,108,60Zm56,16A16,16,0,1,0,148,60,16,16,0,0,0,164,76ZM92,112a16,16,0,1,0,16,16A16,16,0,0,0,92,112Zm72,0a16,16,0,1,0,16,16A16,16,0,0,0,164,112ZM92,180a16,16,0,1,0,16,16A16,16,0,0,0,92,180Zm72,0a16,16,0,1,0,16,16A16,16,0,0,0,164,180Z\"/></svg>',\n\n dotsThree:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M140,128a12,12,0,1,1-12-12A12,12,0,0,1,140,128ZM64,116a12,12,0,1,0,12,12A12,12,0,0,0,64,116Zm128,0a12,12,0,1,0,12,12A12,12,0,0,0,192,116Z\"/></svg>',\n\n copy:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M216,32H88a8,8,0,0,0-8,8V80H40a8,8,0,0,0-8,8V216a8,8,0,0,0,8,8H168a8,8,0,0,0,8-8V176h40a8,8,0,0,0,8-8V40A8,8,0,0,0,216,32ZM160,208H48V96H160Zm48-48H176V88a8,8,0,0,0-8-8H96V48H208Z\"/></svg>',\n};\n","/**\n * Document Node\n *\n * The root node of every ProseMirror document.\n * Must have at least one block child.\n */\n\nimport { Node } from '../Node.js';\n\nexport const Document = Node.create({\n name: 'doc',\n topNode: true,\n content: 'block+',\n});\n","/**\n * Text Node\n *\n * Inline text content. Can hold marks (bold, italic, etc.).\n * This is the leaf node that contains actual text content.\n */\n\nimport { Node } from '../Node.js';\n\nexport const Text = Node.create({\n name: 'text',\n group: 'inline',\n});\n","/**\n * Paragraph Node\n *\n * The default block-level text container.\n * Contains inline content (text and inline nodes).\n */\n\nimport { Node } from '../Node.js';\nimport type { CommandSpec } from '../types/Commands.js';\n\ndeclare module '@domternal/core' {\n interface RawCommands {\n setParagraph: CommandSpec;\n }\n}\n\nexport interface ParagraphOptions {\n HTMLAttributes: Record<string, unknown>;\n}\n\nexport const Paragraph = Node.create<ParagraphOptions>({\n name: 'paragraph',\n group: 'block',\n content: 'inline*',\n priority: 1000,\n\n addOptions() {\n return {\n HTMLAttributes: {},\n };\n },\n\n parseHTML() {\n return [{ tag: 'p' }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['p', { ...this.options.HTMLAttributes, ...HTMLAttributes }, 0];\n },\n\n addCommands() {\n const { name } = this;\n return {\n setParagraph:\n () =>\n ({ commands }) => {\n return commands.setBlockType(name);\n },\n };\n },\n\n addKeyboardShortcuts() {\n const { editor } = this;\n return {\n 'Mod-Alt-0': () => {\n return editor?.commands['setParagraph']?.() ?? false;\n },\n };\n },\n});\n","/**\n * Heading Node\n *\n * Block-level heading elements (h1-h6).\n * Supports configurable levels and markdown-style input rules.\n */\n\nimport { Node } from '../Node.js';\nimport { textblockTypeInputRule } from '../helpers/textblockTypeInputRule.js';\nimport { keymap } from '@domternal/pm/keymap';\nimport { Plugin, PluginKey, TextSelection } from '@domternal/pm/state';\nimport type { Command as PMCommand } from '@domternal/pm/state';\nimport type { CommandSpec } from '../types/Commands.js';\nimport type { ToolbarItem, ToolbarButton } from '../types/Toolbar.js';\nimport type { FloatingMenuItem } from '../types/FloatingMenu.js';\n\ndeclare module '@domternal/core' {\n interface RawCommands {\n setHeading: CommandSpec<[attributes?: { level?: number }]>;\n toggleHeading: CommandSpec<[attributes?: { level?: number }]>;\n }\n}\n\nexport interface HeadingOptions {\n levels: number[];\n HTMLAttributes: Record<string, unknown>;\n}\n\nexport const Heading = Node.create<HeadingOptions>({\n name: 'heading',\n group: 'block',\n content: 'inline*',\n defining: true,\n\n addOptions() {\n return {\n levels: [1, 2, 3, 4],\n HTMLAttributes: {},\n };\n },\n\n addAttributes() {\n return {\n level: {\n default: 1,\n parseHTML: (element: HTMLElement) => {\n const match = /^H(\\d)$/i.exec(element.tagName);\n return match?.[1] ? parseInt(match[1], 10) : 1;\n },\n renderHTML: () => {\n // Level is used in the tag name, not as an attribute\n return {};\n },\n },\n };\n },\n\n parseHTML() {\n // `this` is properly typed via ThisType<NodeContext<HeadingOptions>>\n return this.options.levels.map((level) => ({\n tag: `h${String(level)}`,\n attrs: { level },\n }));\n },\n\n renderHTML({ node, HTMLAttributes }) {\n const level = node.attrs['level'] as number;\n // Ensure level is within allowed range\n const validLevel = this.options.levels.includes(level) ? level : this.options.levels[0];\n return [`h${String(validLevel)}`, { ...this.options.HTMLAttributes, ...HTMLAttributes }, 0];\n },\n\n addCommands() {\n const { name, options } = this;\n return {\n setHeading:\n (attributes?: { level?: number }) =>\n ({ commands }) => {\n const level = attributes?.level ?? options.levels[0] ?? 1;\n if (!options.levels.includes(level)) {\n return false;\n }\n return commands.setBlockType(name, { level });\n },\n toggleHeading:\n (attributes?: { level?: number }) =>\n ({ commands }) => {\n const level = attributes?.level ?? options.levels[0] ?? 1;\n if (!options.levels.includes(level)) {\n return false;\n }\n return commands.toggleBlockType(name, 'paragraph', { level });\n },\n };\n },\n\n addKeyboardShortcuts() {\n const shortcuts: Record<string, () => boolean> = {};\n const { options, editor } = this;\n\n options.levels.forEach((level) => {\n shortcuts[`Mod-Alt-${String(level)}`] = () => {\n return editor?.commands['toggleHeading']?.({ level }) ?? false;\n };\n });\n\n // Notion-style Enter on a heading. Lives in addKeyboardShortcuts\n // (the COLLECTED keymap, plugin index 1 in the editor) rather than\n // in addProseMirrorPlugins so it fires BEFORE the BaseKeymap plugin\n // (index 2+, the angular wrapper's `DEFAULT_EXTENSIONS` register\n // BaseKeymap before user extensions). Without that ordering,\n // BaseKeymap's `liftEmptyBlock` would claim Enter on an empty\n // heading first and lift it out of its parent.\n //\n // Behaviour:\n // - End of NON-EMPTY heading -> insert a paragraph as the next\n // sibling and move the caret into it.\n // - EMPTY heading -> convert IN PLACE to a paragraph (no extra\n // block; lets users back out of an accidental `# ` input rule).\n // - Mid / start-of-non-empty heading -> return false so the\n // default split runs (text splits in place; both halves stay\n // heading).\n //\n // ListItem.Enter / TaskItem.Enter both early-bail when the cursor\n // is in a non-paragraph textblock, so this handler also fires for\n // headings nested INSIDE a list item.\n shortcuts['Enter'] = (): boolean => {\n if (!editor) return false;\n const { state, view } = editor;\n const { selection } = state;\n if (!selection.empty) return false;\n const { $from } = selection;\n if ($from.parent.type.name !== 'heading') return false;\n\n const paragraphType = state.schema.nodes['paragraph'];\n if (!paragraphType) return false;\n\n // Empty heading: convert to paragraph in place.\n if ($from.parent.content.size === 0) {\n view.dispatch(\n state.tr.setNodeMarkup($from.before($from.depth), paragraphType).scrollIntoView(),\n );\n return true;\n }\n\n // Non-empty: only act at the END of the heading.\n if ($from.parentOffset !== $from.parent.content.size) return false;\n\n const after = $from.after($from.depth);\n const $after = state.doc.resolve(after);\n const indexAfter = $after.index();\n // Schema check: parent must accept paragraph at this position.\n // Critical for nested-in-li context where the listItem's content\n // rule (`paragraph block*`) restricts what can land where.\n if (!$after.parent.canReplaceWith(indexAfter, indexAfter, paragraphType)) {\n return false;\n }\n\n const tr = state.tr.insert(after, paragraphType.create());\n // Caret at offset 0 inside the new paragraph (`after + 1` skips\n // the paragraph's open token).\n tr.setSelection(TextSelection.create(tr.doc, after + 1));\n view.dispatch(tr.scrollIntoView());\n return true;\n };\n\n return shortcuts;\n },\n\n addToolbarItems(): ToolbarItem[] {\n const iconMap: Record<number, string> = {\n 1: 'textHOne',\n 2: 'textHTwo',\n 3: 'textHThree',\n 4: 'textHFour',\n };\n\n const headingItems: ToolbarButton[] = this.options.levels\n .filter((level) => level <= 4)\n .map((level) => ({\n type: 'button' as const,\n name: `heading${String(level)}`,\n command: 'toggleHeading',\n commandArgs: [{ level }],\n isActive: { name: 'heading', attributes: { level } },\n icon: iconMap[level] ?? 'textH',\n label: `Heading ${String(level)}`,\n shortcut: `Mod-Alt-${String(level)}`,\n }));\n\n const paragraphItem: ToolbarButton = {\n type: 'button',\n name: 'paragraph',\n command: 'setParagraph',\n isActive: 'paragraph',\n icon: 'textT',\n label: 'Normal text',\n shortcut: 'Mod-Alt-0',\n };\n\n return [\n {\n type: 'dropdown',\n name: 'heading',\n icon: 'textH',\n label: 'Heading',\n items: [paragraphItem, ...headingItems],\n group: 'blocks',\n priority: 200,\n dynamicIcon: true,\n },\n ];\n },\n\n addFloatingMenuItems(): FloatingMenuItem[] {\n const iconMap: Record<number, string> = {\n 1: 'textHOne',\n 2: 'textHTwo',\n 3: 'textHThree',\n };\n const descriptionMap: Record<number, string> = {\n 1: 'Big section heading',\n 2: 'Medium section heading',\n 3: 'Small section heading',\n };\n // Only levels 1-3 in the quick-insert menu; deeper levels stay toolbar-only.\n return this.options.levels\n .filter((level) => level <= 3)\n .map((level): FloatingMenuItem => ({\n name: `heading-${String(level)}`,\n label: `Heading ${String(level)}`,\n description: descriptionMap[level] ?? 'Section heading',\n icon: iconMap[level] ?? 'textH',\n group: 'Basic',\n priority: 210 - level * 10,\n keywords: ['heading', `h${String(level)}`, 'title'],\n shortcut: '#'.repeat(level) + ' ',\n command: 'toggleHeading',\n commandArgs: [{ level }],\n }));\n },\n\n addProseMirrorPlugins() {\n const { options, editor } = this;\n\n // Build a map from code (e.g. 'Digit2') to heading level for levels\n // where Alt produces special characters on macOS, preventing the\n // regular keymap from matching.\n const codeToLevel: Record<string, number> = {};\n for (const level of options.levels) {\n codeToLevel[`Digit${String(level)}`] = level;\n }\n // Also handle Mod-Alt-0 for setParagraph\n codeToLevel['Digit0'] = 0;\n\n return [\n new Plugin({\n key: new PluginKey('headingKeydownFix'),\n props: {\n handleDOMEvents: {\n keydown(_view, event) {\n if (!event.altKey || !(event.metaKey || event.ctrlKey)) return false;\n const level = codeToLevel[event.code];\n if (level === undefined) return false;\n\n event.preventDefault();\n if (level === 0) {\n editor?.commands['setParagraph']?.();\n } else {\n editor?.commands['toggleHeading']?.({ level });\n }\n return true;\n },\n },\n },\n }),\n keymap({\n Backspace: ((state, dispatch) => {\n const { selection } = state;\n if (!selection.empty) return false;\n\n const { $from } = selection;\n if ($from.parentOffset !== 0) return false;\n if ($from.parent.type.name !== 'heading') return false;\n\n const paragraphType = state.schema.nodes['paragraph'];\n if (!paragraphType) return false;\n\n if (dispatch) {\n dispatch(\n state.tr.setNodeMarkup($from.before($from.depth), paragraphType).scrollIntoView()\n );\n }\n return true;\n }) as PMCommand,\n }),\n ];\n },\n\n addInputRules() {\n const { nodeType, options } = this;\n\n if (!nodeType) {\n return [];\n }\n\n const maxLevel = Math.max(...options.levels);\n return [\n textblockTypeInputRule({\n find: new RegExp(`^(#{1,${String(maxLevel)}})\\\\s$`),\n type: nodeType,\n getAttributes: (match) => {\n const hashes = match[1];\n if (!hashes) {\n return null;\n }\n const level = hashes.length;\n // Only convert if this level is enabled\n if (!options.levels.includes(level)) {\n return null;\n }\n return { level };\n },\n }),\n ];\n },\n});\n","/**\n * Blockquote Node\n *\n * Block-level quote container that can hold other blocks.\n * Supports nested blockquotes and markdown-style input rule.\n */\n\nimport { Node } from '../Node.js';\nimport { wrappingInputRule } from '../helpers/wrappingInputRule.js';\nimport type { CommandSpec } from '../types/Commands.js';\nimport type { ToolbarItem } from '../types/Toolbar.js';\nimport type { FloatingMenuItem } from '../types/FloatingMenu.js';\n\ndeclare module '@domternal/core' {\n interface RawCommands {\n setBlockquote: CommandSpec;\n toggleBlockquote: CommandSpec;\n unsetBlockquote: CommandSpec;\n }\n}\n\nexport interface BlockquoteOptions {\n HTMLAttributes: Record<string, unknown>;\n}\n\nexport const Blockquote = Node.create<BlockquoteOptions>({\n name: 'blockquote',\n group: 'block',\n content: 'block+',\n defining: true,\n\n addOptions() {\n return {\n HTMLAttributes: {},\n };\n },\n\n parseHTML() {\n return [{ tag: 'blockquote' }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['blockquote', { ...this.options.HTMLAttributes, ...HTMLAttributes }, 0];\n },\n\n addCommands() {\n const { name } = this;\n return {\n setBlockquote:\n () =>\n ({ commands }) => {\n return commands.wrapIn(name);\n },\n toggleBlockquote:\n () =>\n ({ commands }) => {\n return commands.toggleWrap(name);\n },\n unsetBlockquote:\n () =>\n ({ commands }) => {\n return commands.lift();\n },\n };\n },\n\n addKeyboardShortcuts() {\n const { editor } = this;\n return {\n 'Mod-Shift-b': () => {\n return editor?.commands['toggleBlockquote']?.() ?? false;\n },\n };\n },\n\n addToolbarItems(): ToolbarItem[] {\n return [\n {\n type: 'button',\n name: 'blockquote',\n command: 'toggleBlockquote',\n isActive: 'blockquote',\n icon: 'quotes',\n label: 'Blockquote',\n shortcut: 'Mod-Shift-B',\n group: 'blocks',\n priority: 150,\n },\n ];\n },\n\n addFloatingMenuItems(): FloatingMenuItem[] {\n return [\n {\n name: 'blockquote',\n label: 'Quote',\n description: 'Capture a quote',\n icon: 'quotes',\n group: 'Basic',\n priority: 170,\n keywords: ['quote', 'blockquote', 'citation'],\n shortcut: '> ',\n command: 'toggleBlockquote',\n },\n ];\n },\n\n addInputRules() {\n const { nodeType } = this;\n\n if (!nodeType) {\n return [];\n }\n\n return [\n wrappingInputRule({ find: /^\\s*>\\s$/, type: nodeType }),\n ];\n },\n});\n","/**\n * CodeBlock Node\n *\n * Block-level code container with syntax highlighting support.\n * Preserves whitespace and disallows marks.\n *\n * Keyboard shortcuts:\n * - Mod-Alt-C: Toggle code block\n * - Enter (triple): Exit code block when last 2 lines are empty\n * - ArrowDown: Exit code block when cursor is at the end and it's the last block\n */\n\nimport { Node } from '../Node.js';\nimport { textblockTypeInputRule } from '../helpers/textblockTypeInputRule.js';\nimport { TextSelection } from '@domternal/pm/state';\nimport type { CommandSpec } from '../types/Commands.js';\nimport type { ToolbarItem } from '../types/Toolbar.js';\nimport type { FloatingMenuItem } from '../types/FloatingMenu.js';\n\ndeclare module '@domternal/core' {\n interface RawCommands {\n setCodeBlock: CommandSpec<[attributes?: { language?: string }]>;\n toggleCodeBlock: CommandSpec<[attributes?: { language?: string }]>;\n }\n}\n\nexport interface CodeBlockOptions {\n languageClassPrefix: string;\n HTMLAttributes: Record<string, unknown>;\n exitOnTripleEnter: boolean;\n}\n\nexport const CodeBlock = Node.create<CodeBlockOptions>({\n name: 'codeBlock',\n group: 'block',\n content: 'text*',\n marks: '',\n code: true,\n defining: true,\n\n addOptions() {\n return {\n languageClassPrefix: 'language-',\n HTMLAttributes: {},\n exitOnTripleEnter: true,\n };\n },\n\n addAttributes() {\n const { options } = this;\n return {\n language: {\n default: null,\n parseHTML: (element: HTMLElement) => {\n const codeEl = element.querySelector('code');\n if (!codeEl) return null;\n\n const prefix = options.languageClassPrefix;\n\n // Find class starting with language prefix\n const classes = codeEl.className.split(/\\s+/);\n for (const cls of classes) {\n if (cls.startsWith(prefix)) {\n return cls.slice(prefix.length) || null;\n }\n }\n return null;\n },\n renderHTML: () => {\n // Language is rendered on the code element, not pre\n return {};\n },\n },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: 'pre',\n preserveWhitespace: 'full' as const,\n },\n ];\n },\n\n renderHTML({ node, HTMLAttributes }) {\n const language = node.attrs['language'] as string | null;\n\n const codeAttrs: Record<string, unknown> = {};\n if (language) {\n codeAttrs['class'] = `${this.options.languageClassPrefix}${language}`;\n }\n\n return [\n 'pre',\n { ...this.options.HTMLAttributes, ...HTMLAttributes },\n ['code', codeAttrs, 0],\n ];\n },\n\n addCommands() {\n const { name } = this;\n return {\n setCodeBlock:\n (attributes?: { language?: string }) =>\n ({ commands }) => {\n return commands.setBlockType(name, attributes);\n },\n toggleCodeBlock:\n (attributes?: { language?: string }) =>\n ({ commands }) => {\n return commands.toggleBlockType(name, 'paragraph', attributes);\n },\n };\n },\n\n addKeyboardShortcuts() {\n const { editor } = this;\n\n const exitCodeBlock = (): boolean => {\n if (!editor) return false;\n const { state, view } = editor;\n const after = state.selection.$head.after();\n const paragraph = state.schema.nodes['paragraph']?.createAndFill();\n if (!paragraph) return false;\n const tr = state.tr.insert(after, paragraph);\n tr.setSelection(TextSelection.near(tr.doc.resolve(after + 1)));\n view.dispatch(tr.scrollIntoView());\n return true;\n };\n\n return {\n 'Mod-Alt-c': () => editor?.commands['toggleCodeBlock']?.() ?? false,\n\n Enter: () => {\n if (!this.options.exitOnTripleEnter || !editor) return false;\n const { $head } = editor.state.selection;\n if ($head.parent.type !== this.nodeType) return false;\n const pos = $head.parentOffset;\n if (pos < 2 || pos !== $head.parent.content.size) return false;\n const text = $head.parent.textContent;\n if (text[pos - 1] !== '\\n' || text[pos - 2] !== '\\n') return false;\n editor.view.dispatch(editor.state.tr.delete($head.pos - 2, $head.pos));\n return exitCodeBlock();\n },\n\n ArrowDown: () => {\n if (!editor) return false;\n const { $head } = editor.state.selection;\n if ($head.parent.type !== this.nodeType) return false;\n if ($head.parentOffset !== $head.parent.content.size) return false;\n const after = $head.after();\n if (after < editor.state.doc.content.size && editor.state.doc.resolve(after).nodeAfter) return false;\n return exitCodeBlock();\n },\n };\n },\n\n addToolbarItems(): ToolbarItem[] {\n return [\n {\n type: 'button',\n name: 'codeBlock',\n command: 'toggleCodeBlock',\n isActive: 'codeBlock',\n icon: 'codeBlock',\n label: 'Code Block',\n shortcut: 'Mod-Alt-C',\n group: 'blocks',\n priority: 140,\n },\n ];\n },\n\n addFloatingMenuItems(): FloatingMenuItem[] {\n return [\n {\n name: 'code-block',\n label: 'Code block',\n description: 'Capture a code snippet',\n icon: 'codeBlock',\n group: 'Basic',\n priority: 160,\n keywords: ['code', 'snippet', 'pre'],\n shortcut: '``` ',\n command: 'toggleCodeBlock',\n },\n ];\n },\n\n addInputRules() {\n const { nodeType } = this;\n\n if (!nodeType) {\n return [];\n }\n\n return [\n textblockTypeInputRule({\n find: /^```([a-z]*)?[\\s\\n]$/,\n type: nodeType,\n getAttributes: (match) => {\n const language = match[1] ?? null;\n return { language };\n },\n }),\n ];\n },\n});\n","/**\n * ListKeymap Extension\n *\n * Provides keyboard shortcuts for list manipulation:\n * - Tab: Sink (indent) list item\n * - Shift-Tab: Lift (outdent) list item\n * - Backspace: Lift list item when at start of empty item.\n * Also handles the \"exit-join\" case: when the cursor is at start of an\n * empty paragraph whose previous sibling is a list-group node\n * (bulletList / orderedList / taskList), delete the empty paragraph and\n * place the caret at the end of the last textblock of the previous list.\n * Without this, PM's `joinBackward` wraps the empty paragraph back into\n * the list as a fresh listItem/taskItem, producing the \"ping-pong\"\n * regression: Enter (creates empty item), BS (lift -> empty top-level p),\n * BS again (joinBackward wraps p back as new item).\n */\nimport { TextSelection } from '@domternal/pm/state';\nimport { liftListItem, sinkListItem } from '@domternal/pm/schema-list';\nimport { canJoin } from '@domternal/pm/transform';\nimport type { NodeType } from '@domternal/pm/model';\nimport type { EditorState } from '@domternal/pm/state';\nimport type { EditorView } from '@domternal/pm/view';\nimport { Extension } from '../Extension.js';\nimport type { ExtensionEditorInterface } from '../Extension.js';\n\nconst LIST_GROUP_TYPES = new Set(['bulletList', 'orderedList', 'taskList']);\n\nexport interface ListKeymapOptions {\n /**\n * Name of the list item node type.\n * @default 'listItem'\n */\n listItem: string;\n}\n\n/** Resolves the list item NodeType and checks if cursor is inside one.\n * Returns null when a different item type (e.g. taskItem) sits closer\n * to the cursor than the target listItem, preventing cross-type interference. */\nfunction getListItemContext(\n editor: ExtensionEditorInterface,\n listItemName: string,\n): { state: EditorState; view: EditorView; listItemType: NodeType } | null {\n const { state, view } = editor as { state: EditorState; view: EditorView };\n const listItemType = state.schema.nodes[listItemName];\n if (!listItemType) return null;\n\n const { $from } = state.selection;\n for (let d = $from.depth; d > 0; d--) {\n const node = $from.node(d);\n // If we hit a different item type first (e.g. taskItem), bail out\n if (node.type.spec.defining && node.type !== listItemType && node.type.isBlock) {\n const parent = d > 0 ? $from.node(d - 1) : null;\n if (parent?.type.spec.group?.includes('list')) {\n return null;\n }\n }\n if (node.type === listItemType) {\n return { state, view, listItemType };\n }\n }\n\n return null;\n}\n\nexport const ListKeymap = Extension.create<ListKeymapOptions>({\n name: 'listKeymap',\n\n addOptions() {\n return {\n listItem: 'listItem',\n };\n },\n\n addKeyboardShortcuts() {\n return {\n // Tab to sink (indent) list item\n Tab: () => {\n if (!this.editor) return false;\n const ctx = getListItemContext(this.editor, this.options.listItem);\n if (!ctx) return false;\n return sinkListItem(ctx.listItemType)(ctx.state, ctx.view.dispatch);\n },\n\n // Shift-Tab to lift (outdent) list item\n 'Shift-Tab': () => {\n if (!this.editor) return false;\n const ctx = getListItemContext(this.editor, this.options.listItem);\n if (!ctx) return false;\n return liftListItem(ctx.listItemType)(ctx.state, ctx.view.dispatch);\n },\n\n // Backspace at start of list item to lift\n Backspace: () => {\n const editor = this.editor;\n if (!editor) return false;\n\n const { state, view } = editor as { state: EditorState; view: EditorView };\n const { $from, empty } = state.selection;\n\n // Only at start of textblock with empty selection\n if (!empty || $from.parentOffset !== 0) return false;\n\n // \"Exit-join\" path: cursor at start of an EMPTY paragraph whose\n // previous sibling (in its container) is a list-group node. Without\n // this, PM's `joinBackward` would wrap the empty paragraph back\n // into the list as a new listItem/taskItem (the \"ping-pong\" bug).\n // We delete the empty paragraph and move the caret to the end of\n // the last textblock of the previous list - the natural intent\n // when the user backspaces from the line just below a list.\n //\n // Additionally, when the empty paragraph sits BETWEEN two\n // same-type list groups (the common shape after splitListItem +\n // liftListItem on a middle item), join them so the original list\n // is reunified rather than left as two adjacent siblings.\n if (\n $from.parent.type.name === 'paragraph' &&\n $from.parent.content.size === 0 &&\n $from.depth >= 1\n ) {\n const containerDepth = $from.depth - 1;\n const idx = $from.index(containerDepth);\n if (idx > 0) {\n const container = $from.node(containerDepth);\n const prev = container.child(idx - 1);\n if (LIST_GROUP_TYPES.has(prev.type.name)) {\n const paraStart = $from.before($from.depth);\n const paraEnd = $from.after($from.depth);\n const listEnd = paraStart;\n const listStart = listEnd - prev.nodeSize;\n let lastTextblockEnd = -1;\n state.doc.nodesBetween(listStart, listEnd, (n, p) => {\n if (n.isTextblock) lastTextblockEnd = p + 1 + n.content.size;\n return true;\n });\n if (lastTextblockEnd !== -1) {\n const tr = state.tr.delete(paraStart, paraEnd);\n\n // If the next sibling is a list group of the SAME type,\n // join it onto the previous list. After the delete, the\n // boundary between the two lists sits at `paraStart` in\n // the new doc, so `tr.join(paraStart)` merges them.\n // `canJoin` validates the schema accepts the merge before\n // we call `join` (avoids try-catch that would swallow\n // unrelated errors).\n const next = idx + 1 < container.childCount\n ? container.child(idx + 1)\n : null;\n if (next?.type === prev.type && canJoin(tr.doc, paraStart)) {\n tr.join(paraStart);\n }\n\n tr.setSelection(TextSelection.create(tr.doc, lastTextblockEnd));\n view.dispatch(tr.scrollIntoView());\n return true;\n }\n }\n }\n }\n\n const listItemType = state.schema.nodes[this.options.listItem];\n if (!listItemType) return false;\n\n // Check if we're at the start of a list item\n let listItemDepth = -1;\n for (let d = $from.depth; d > 0; d--) {\n if ($from.node(d).type === listItemType) {\n listItemDepth = d;\n break;\n }\n }\n\n if (listItemDepth === -1) return false;\n\n // Only lift if we're at the very start of the list item content\n // (i.e., cursor is at start of first child of list item)\n const listItemNode = $from.node(listItemDepth);\n const firstChild = listItemNode.firstChild;\n\n if (firstChild?.isTextblock) {\n // Check if the textblock is empty or cursor is at its start\n const posInListItem = $from.pos - $from.start(listItemDepth);\n if (posInListItem <= 1) {\n return liftListItem(listItemType)(state, view.dispatch);\n }\n }\n\n return false;\n },\n };\n },\n});\n","/**\n * Enter / Backspace state machine for listItem (cursor's parent must be a paragraph):\n *\n * LABEL paragraph (childIndex 0):\n * Enter, empty -> liftListItem (exit empty bullet)\n * Enter, non-empty -> splitListItem (new sibling listItem)\n * Backspace, empty -> falls through to ListKeymap (liftListItem)\n *\n * CHILDREN-ZONE paragraph (childIndex > 0):\n * Enter, empty -> insertChildrenZoneSibling (accumulate inside the item)\n * Enter, non-empty -> splitBlock (both halves stay inside the same item)\n * Backspace, empty -> liftEmptyChildrenZoneParagraph (exit as top-level)\n *\n * Tab / Shift-Tab handled by the ListKeymap extension.\n */\nimport { Node } from '../Node.js';\nimport { splitListItem, liftListItem } from '@domternal/pm/schema-list';\nimport { Selection } from '@domternal/pm/state';\nimport { splitBlock } from '@domternal/pm/commands';\nimport { ListKeymap } from '../extensions/ListKeymap.js';\nimport { getListItemCursorContext } from '../utils/listItemCursorContext.js';\nimport { insertChildrenZoneSibling } from '../utils/insertChildrenZoneSibling.js';\nimport { liftEmptyChildrenZoneParagraph } from '../utils/liftEmptyChildrenZoneParagraph.js';\n\nexport interface ListItemOptions {\n HTMLAttributes: Record<string, unknown>;\n}\n\nexport const ListItem = Node.create<ListItemOptions>({\n name: 'listItem',\n // Notion-strict: paragraph must be the first child (the \"label\" line aligned\n // with the bullet); additional blocks render below as nested children.\n content: 'paragraph block*',\n defining: true,\n\n addOptions() {\n return {\n HTMLAttributes: {},\n };\n },\n\n parseHTML() {\n return [{ tag: 'li' }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['li', { ...this.options.HTMLAttributes, ...HTMLAttributes }, 0];\n },\n\n addExtensions() {\n return [ListKeymap];\n },\n\n addKeyboardShortcuts() {\n return {\n Enter: () => {\n if (!this.editor || !this.nodeType) return false;\n const { state, view } = this.editor;\n const { $from } = state.selection;\n if ($from.depth < 1 || $from.node(-1).type !== this.nodeType) return false;\n // Defer if cursor is in a nested non-paragraph block (heading, codeBlock)\n // so that block's own Enter handler runs instead of splitListItem.\n if ($from.parent.type.name !== 'paragraph') return false;\n\n // Children-zone Enter accumulates inside the item (Notion semantics),\n // never splits the wrapper into a sibling listItem.\n const ctx = getListItemCursorContext($from);\n if (ctx?.isInChildrenZone) {\n if (ctx.paragraphIsEmpty) {\n if (insertChildrenZoneSibling(state, view.dispatch, ctx)) return true;\n } else {\n if (splitBlock(state, view.dispatch)) return true;\n }\n }\n\n if (splitListItem(this.nodeType)(state, view.dispatch)) return true;\n\n // Empty listItem inside a list that's inside a taskItem: liftListItem would\n // place a bare paragraph in the taskItem (loses bullet marker). Instead,\n // delete the empty item and create a new taskItem in the parent taskList\n // (one level up, not jumping to a distant ancestor).\n const listDepth = $from.depth - 2;\n const taskItemType = state.schema.nodes['taskItem'];\n if ($from.parent.content.size === 0 && listDepth > 0\n && taskItemType && $from.node(listDepth - 1).type === taskItemType) {\n const tr = state.tr;\n const delDepth = $from.node(listDepth).childCount <= 1 ? listDepth : $from.depth - 1;\n tr.delete($from.before(delDepth), $from.after(delDepth));\n const taskItemDepth = listDepth - 1;\n const end = tr.mapping.map($from.after(taskItemDepth));\n const item = taskItemType.createAndFill();\n if (item) {\n tr.insert(end, item);\n tr.setSelection(Selection.near(tr.doc.resolve(end + 2)));\n view.dispatch(tr.scrollIntoView());\n return true;\n }\n }\n\n return liftListItem(this.nodeType)(state, view.dispatch);\n },\n\n Backspace: () => {\n if (!this.editor || !this.nodeType) return false;\n const { state, view } = this.editor;\n const { $from, empty } = state.selection;\n if (!empty || $from.parentOffset !== 0) return false;\n if ($from.parent.content.size !== 0) return false;\n\n // Empty children-zone paragraph: lift it out as a top-level sibling.\n // Empty-label backspace falls through to ListKeymap (liftListItem).\n const ctx = getListItemCursorContext($from);\n if (ctx && ctx.isInChildrenZone && ctx.paragraphIsEmpty) {\n if (liftEmptyChildrenZoneParagraph(state, view.dispatch, ctx)) return true;\n }\n\n return false;\n },\n };\n },\n});\n","/**\n * BulletList Node\n *\n * Block-level unordered list container.\n * Supports markdown-style input rules and keyboard shortcuts.\n */\n\nimport { Node } from '../Node.js';\nimport { wrappingInputRule, notInsideList } from '../helpers/wrappingInputRule.js';\nimport type { CommandSpec } from '../types/Commands.js';\nimport type { ToolbarItem } from '../types/Toolbar.js';\nimport type { FloatingMenuItem } from '../types/FloatingMenu.js';\nimport { ListItem } from './ListItem.js';\n\ndeclare module '@domternal/core' {\n interface RawCommands {\n toggleBulletList: CommandSpec;\n }\n}\n\nexport interface BulletListOptions {\n HTMLAttributes: Record<string, unknown>;\n itemTypeName: string;\n}\n\nexport const BulletList = Node.create<BulletListOptions>({\n name: 'bulletList',\n group: 'block list',\n content: 'listItem+',\n\n addOptions() {\n return {\n HTMLAttributes: {},\n itemTypeName: 'listItem',\n };\n },\n\n parseHTML() {\n return [{ tag: 'ul' }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['ul', { ...this.options.HTMLAttributes, ...HTMLAttributes }, 0];\n },\n\n addCommands() {\n const { name, options } = this;\n return {\n toggleBulletList:\n () =>\n ({ commands }) => {\n return commands.toggleList(name, options.itemTypeName);\n },\n };\n },\n\n addToolbarItems(): ToolbarItem[] {\n return [\n {\n type: 'button',\n name: 'bulletList',\n command: 'toggleBulletList',\n isActive: 'bulletList',\n icon: 'listBullets',\n label: 'Bullet List',\n shortcut: 'Mod-Shift-8',\n group: 'lists',\n priority: 200,\n },\n ];\n },\n\n addFloatingMenuItems(): FloatingMenuItem[] {\n return [\n {\n name: 'bullet-list',\n label: 'Bulleted list',\n description: 'Create a simple bulleted list',\n icon: 'listBullets',\n group: 'Lists',\n priority: 200,\n keywords: ['bullet', 'list', 'unordered', 'ul'],\n shortcut: '- ',\n command: 'toggleBulletList',\n // Don't offer \"Bulleted list\" while cursor is already inside one,\n // otherwise picking it lifts the user out of the list.\n hideWhenInside: ['bulletList'],\n },\n ];\n },\n\n addKeyboardShortcuts() {\n const { editor } = this;\n return {\n 'Mod-Shift-8': () => {\n return editor?.commands['toggleBulletList']?.() ?? false;\n },\n };\n },\n\n addExtensions() {\n return [ListItem];\n },\n\n addInputRules() {\n const { nodeType } = this;\n\n if (!nodeType) {\n return [];\n }\n\n return [\n // - item\n wrappingInputRule({ find: /^\\s*[-]\\s$/, type: nodeType, guard: notInsideList, joinForward: true }),\n // * item\n wrappingInputRule({ find: /^\\s*[*]\\s$/, type: nodeType, guard: notInsideList, joinForward: true }),\n // + item\n wrappingInputRule({ find: /^\\s*[+]\\s$/, type: nodeType, guard: notInsideList, joinForward: true }),\n ];\n },\n});\n","/**\n * OrderedList Node\n *\n * Block-level ordered (numbered) list container.\n * Supports start attribute and markdown-style input rules.\n */\n\nimport { Node } from '../Node.js';\nimport { wrappingInputRule, notInsideList } from '../helpers/wrappingInputRule.js';\nimport type { CommandSpec } from '../types/Commands.js';\nimport type { ToolbarItem } from '../types/Toolbar.js';\nimport type { FloatingMenuItem } from '../types/FloatingMenu.js';\nimport { ListItem } from './ListItem.js';\n\ndeclare module '@domternal/core' {\n interface RawCommands {\n toggleOrderedList: CommandSpec;\n }\n}\n\nexport interface OrderedListOptions {\n HTMLAttributes: Record<string, unknown>;\n itemTypeName: string;\n}\n\nexport const OrderedList = Node.create<OrderedListOptions>({\n name: 'orderedList',\n group: 'block list',\n content: 'listItem+',\n\n addOptions() {\n return {\n HTMLAttributes: {},\n itemTypeName: 'listItem',\n };\n },\n\n addAttributes() {\n return {\n start: {\n default: 1,\n parseHTML: (element: HTMLElement) => {\n const start = element.getAttribute('start');\n return start ? parseInt(start, 10) : 1;\n },\n renderHTML: (attributes: Record<string, unknown>) => {\n const start = attributes['start'] as number;\n if (start === 1) {\n return {};\n }\n return { start: String(start) };\n },\n },\n };\n },\n\n parseHTML() {\n return [{ tag: 'ol' }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['ol', { ...this.options.HTMLAttributes, ...HTMLAttributes }, 0];\n },\n\n addCommands() {\n const { name, options } = this;\n return {\n toggleOrderedList:\n () =>\n ({ commands }) => {\n return commands.toggleList(name, options.itemTypeName);\n },\n };\n },\n\n addToolbarItems(): ToolbarItem[] {\n return [\n {\n type: 'button',\n name: 'orderedList',\n command: 'toggleOrderedList',\n isActive: 'orderedList',\n icon: 'listNumbers',\n label: 'Ordered List',\n shortcut: 'Mod-Shift-7',\n group: 'lists',\n priority: 190,\n },\n ];\n },\n\n addFloatingMenuItems(): FloatingMenuItem[] {\n return [\n {\n name: 'ordered-list',\n label: 'Numbered list',\n description: 'Create a numbered list',\n icon: 'listNumbers',\n group: 'Lists',\n priority: 190,\n keywords: ['ordered', 'numbered', 'list', 'ol', '1.'],\n shortcut: '1. ',\n command: 'toggleOrderedList',\n hideWhenInside: ['orderedList'],\n },\n ];\n },\n\n addKeyboardShortcuts() {\n const { editor } = this;\n return {\n 'Mod-Shift-7': () => {\n return editor?.commands['toggleOrderedList']?.() ?? false;\n },\n };\n },\n\n addExtensions() {\n return [ListItem];\n },\n\n addInputRules() {\n const { nodeType } = this;\n\n if (!nodeType) {\n return [];\n }\n\n return [\n // 1. item (any number followed by . )\n wrappingInputRule({\n find: /^(\\d+)\\.\\s$/,\n type: nodeType,\n guard: notInsideList,\n joinForward: true,\n getAttributes: (match) => {\n const num = match[1];\n return { start: num ? parseInt(num, 10) : 1 };\n },\n }),\n ];\n },\n});\n","/**\n * HorizontalRule Node\n *\n * Block-level thematic break element (hr).\n * Supports markdown-style input rules: ---, ***, ___\n */\n\nimport { Node } from '../Node.js';\nimport { InputRule } from '@domternal/pm/inputrules';\nimport type { EditorState } from '@domternal/pm/state';\nimport { TextSelection } from '@domternal/pm/state';\nimport type { CommandSpec } from '../types/Commands.js';\nimport type { ToolbarItem } from '../types/Toolbar.js';\nimport type { FloatingMenuItem } from '../types/FloatingMenu.js';\nimport { splitListForInsert } from '../utils/splitListForInsert.js';\n\ndeclare module '@domternal/core' {\n interface RawCommands {\n setHorizontalRule: CommandSpec;\n }\n}\n\nexport interface HorizontalRuleOptions {\n HTMLAttributes: Record<string, unknown>;\n}\n\nexport const HorizontalRule = Node.create<HorizontalRuleOptions>({\n name: 'horizontalRule',\n group: 'block',\n\n addOptions() {\n return {\n HTMLAttributes: {},\n };\n },\n\n parseHTML() {\n return [{ tag: 'hr' }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['hr', { ...this.options.HTMLAttributes, ...HTMLAttributes }];\n },\n\n addCommands() {\n return {\n setHorizontalRule:\n () =>\n ({ state, tr, dispatch }) => {\n if (!this.nodeType) return false;\n\n const { $from } = tr.selection;\n const parent = $from.parent;\n\n // Block insertion when selection is not in a textblock (e.g. CellSelection\n // resolves $from at the tableRow level - inserting HR there splits the table)\n if (!parent.isTextblock) return false;\n\n const paragraphType = state.schema.nodes['paragraph'];\n const hrNode = this.nodeType.create();\n const trailingParagraph = paragraphType?.create();\n const nodes = trailingParagraph ? [hrNode, trailingParagraph] : [hrNode];\n\n // List-item-aware path: cursor in the LABEL paragraph of a\n // list/task item. The divider belongs at TOP LEVEL, not nested\n // inside the list item. The util splits the parent list around\n // the current item (empty label is consumed) so the existing\n // bullet/number/check stays intact above the divider.\n const listRange = splitListForInsert(state, tr);\n if (listRange) {\n if (!dispatch) return true;\n tr.replaceWith(listRange.from, listRange.to, nodes);\n const sel = TextSelection.findFrom(\n tr.doc.resolve(listRange.from + 1),\n 1,\n );\n if (sel) tr.setSelection(sel);\n dispatch(tr.scrollIntoView());\n return true;\n }\n\n if (dispatch) {\n // If cursor is in an empty block, replace it with HR + new paragraph\n if (parent.content.size === 0 && parent.type.name === 'paragraph') {\n const from = $from.before();\n const to = $from.after();\n tr.replaceWith(from, to, nodes);\n const sel = TextSelection.findFrom(tr.doc.resolve(from + 1), 1);\n if (sel) tr.setSelection(sel);\n } else {\n // Insert HR after current position\n const end = $from.after();\n tr.insert(end, nodes);\n const sel = TextSelection.findFrom(tr.doc.resolve(end + 1), 1);\n if (sel) tr.setSelection(sel);\n }\n\n dispatch(tr);\n }\n\n return true;\n },\n };\n },\n\n addToolbarItems(): ToolbarItem[] {\n return [\n {\n type: 'button',\n name: 'horizontalRule',\n command: 'setHorizontalRule',\n icon: 'minus',\n label: 'Horizontal Rule',\n group: 'blocks',\n priority: 130,\n },\n ];\n },\n\n addFloatingMenuItems(): FloatingMenuItem[] {\n return [\n {\n name: 'horizontal-rule',\n label: 'Divider',\n description: 'Insert a horizontal rule',\n icon: 'minus',\n group: 'Basic',\n priority: 150,\n keywords: ['divider', 'hr', 'line', 'separator', 'horizontal rule'],\n shortcut: '--- ',\n command: 'setHorizontalRule',\n },\n ];\n },\n\n addInputRules() {\n const { nodeType } = this;\n\n if (!nodeType) {\n return [];\n }\n\n return [\n new InputRule(\n /^(?:---|—-|___|\\*\\*\\*)\\s$/,\n (state: EditorState, match: RegExpMatchArray, start: number) => {\n const { tr } = state;\n\n if (match[0]) {\n const $start = state.doc.resolve(start);\n // Replace the entire parent block (paragraph) with HR + new paragraph\n const from = $start.before();\n const to = $start.after();\n const paragraph = state.schema.nodes['paragraph']?.create();\n const nodes = paragraph\n ? [nodeType.create(), paragraph]\n : [nodeType.create()];\n tr.replaceWith(from, to, nodes);\n\n // Move selection into the new paragraph after the HR\n const sel = TextSelection.findFrom(tr.doc.resolve(from + 1), 1);\n if (sel) {\n tr.setSelection(sel);\n }\n }\n\n return tr;\n }\n ),\n ];\n },\n});\n","/**\n * HardBreak Node\n *\n * Inline line break element (br).\n * Keyboard shortcuts: Mod-Enter, Shift-Enter\n */\n\nimport { Node } from '../Node.js';\nimport type { CommandSpec } from '../types/Commands.js';\nimport type { ToolbarItem } from '../types/Toolbar.js';\n\ndeclare module '@domternal/core' {\n interface RawCommands {\n setHardBreak: CommandSpec;\n insertNbsp: CommandSpec;\n }\n}\n\nexport interface HardBreakOptions {\n HTMLAttributes: Record<string, unknown>;\n}\n\nexport const HardBreak = Node.create<HardBreakOptions>({\n name: 'hardBreak',\n group: 'inline',\n inline: true,\n selectable: false,\n\n addOptions() {\n return {\n HTMLAttributes: {},\n };\n },\n\n parseHTML() {\n return [{ tag: 'br' }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['br', { ...this.options.HTMLAttributes, ...HTMLAttributes }];\n },\n\n addCommands() {\n const { name } = this;\n return {\n setHardBreak:\n () =>\n ({ commands }) => {\n return commands.insertContent({ type: name });\n },\n insertNbsp:\n () =>\n ({ tr, dispatch }) => {\n if (dispatch) {\n tr.insertText('\\u00A0');\n dispatch(tr);\n }\n return true;\n },\n };\n },\n\n addToolbarItems(): ToolbarItem[] {\n return [\n {\n type: 'button',\n name: 'hardBreak',\n command: 'setHardBreak',\n icon: 'linkBreak',\n label: 'Hard Break',\n shortcut: 'Shift-Enter',\n group: 'insert',\n priority: 50,\n },\n ];\n },\n\n addKeyboardShortcuts() {\n const { editor } = this;\n return {\n 'Mod-Enter': () => {\n return editor?.commands['setHardBreak']?.() ?? false;\n },\n 'Shift-Enter': () => {\n return editor?.commands['setHardBreak']?.() ?? false;\n },\n 'Mod-Shift-Space': () => {\n return editor?.commands['insertNbsp']?.() ?? false;\n },\n };\n },\n});\n","/**\n * Translates checkbox mouse interaction into ProseMirror transactions.\n * Without a NodeView, clicking the checkbox flips it visually but PM never\n * learns about it - `node.attrs.checked` stays the same and the next render\n * restores the old state. Mod+Enter already worked via `toggleTask`; this\n * NodeView fixes the mouse path. DOM matches TaskItem.renderHTML so parseDOM\n * round-trips cleanly. `stopEvent` and `ignoreMutation` guard the label\n * subtree so PM does not turn checkbox clicks into node selections or roll\n * back our DOM edits.\n */\n\nimport type { Node as PMNode, NodeType } from '@domternal/pm/model';\nimport type { EditorView, NodeView, ViewMutationRecord } from '@domternal/pm/view';\nimport type { TaskItemOptions } from './TaskItem.js';\n\ninterface TaskItemNodeViewArgs {\n options: TaskItemOptions;\n node: PMNode;\n view: EditorView;\n getPos: () => number | undefined;\n}\n\nexport class TaskItemNodeView implements NodeView {\n readonly dom: HTMLLIElement;\n readonly contentDOM: HTMLDivElement;\n private readonly label: HTMLLabelElement;\n private readonly input: HTMLInputElement;\n private readonly view: EditorView;\n private readonly nodeType: NodeType;\n private readonly getPos: () => number | undefined;\n private node: PMNode;\n\n constructor({ options, node, view, getPos }: TaskItemNodeViewArgs) {\n this.view = view;\n this.nodeType = node.type;\n this.node = node;\n this.getPos = getPos;\n\n this.dom = document.createElement('li');\n // Apply consumer-supplied HTMLAttributes first so our identity\n // attributes (data-type, data-checked) take precedence on collision.\n for (const [key, value] of Object.entries(options.HTMLAttributes)) {\n if (value !== null && value !== undefined) {\n this.dom.setAttribute(key, typeof value === 'string' ? value : JSON.stringify(value));\n }\n }\n this.dom.setAttribute('data-type', 'taskItem');\n this.dom.setAttribute('data-checked', node.attrs['checked'] ? 'true' : 'false');\n\n this.label = document.createElement('label');\n this.label.setAttribute('contenteditable', 'false');\n\n this.input = document.createElement('input');\n this.input.type = 'checkbox';\n this.input.checked = !!node.attrs['checked'];\n this.input.disabled = !view.editable;\n this.input.setAttribute('aria-label', 'Task status');\n\n this.label.appendChild(this.input);\n this.dom.appendChild(this.label);\n\n this.contentDOM = document.createElement('div');\n this.dom.appendChild(this.contentDOM);\n\n this.input.addEventListener('change', this.handleChange);\n }\n\n private handleChange = (event: Event): void => {\n event.preventDefault();\n if (!this.view.editable) {\n // Revert the visual flip; PM never sees a transaction.\n this.input.checked = !!this.node.attrs['checked'];\n return;\n }\n const pos = this.getPos();\n if (pos === undefined) return;\n const { state, dispatch } = this.view;\n const tr = state.tr.setNodeMarkup(pos, undefined, {\n ...this.node.attrs,\n checked: this.input.checked,\n });\n dispatch(tr);\n };\n\n update(node: PMNode): boolean {\n // Type mismatch: tell PM to rebuild the view. Different node type\n // means different schema, so reusing this DOM tree is unsafe.\n if (node.type !== this.nodeType) return false;\n this.node = node;\n const checked = !!node.attrs['checked'];\n this.dom.setAttribute('data-checked', checked ? 'true' : 'false');\n this.input.checked = checked;\n this.input.disabled = !this.view.editable;\n return true;\n }\n\n stopEvent(event: Event): boolean {\n // Events on the label / input subtree are owned by the checkbox.\n // Returning true keeps PM from treating the click as a selection\n // or otherwise interfering with the native checkbox interaction.\n return event.target instanceof Node && this.label.contains(event.target);\n }\n\n ignoreMutation(mutation: ViewMutationRecord): boolean {\n // We manage the label / input DOM ourselves (toggling checked,\n // disabled). PM should not interpret those mutations as edits.\n return mutation.target instanceof Node && this.label.contains(mutation.target);\n }\n\n destroy(): void {\n this.input.removeEventListener('change', this.handleChange);\n }\n}\n","/**\n * Enter / Backspace state machine for taskItem (cursor's parent must be a paragraph):\n *\n * LABEL paragraph (childIndex 0):\n * Enter, empty -> splitListItem fall-through, then taskItem-in-listItem\n * promotion (nested orderedList > listItem > taskList > taskItem\n * context), else liftListItem.\n * Enter, non-empty -> splitListItem (new sibling taskItem)\n * Backspace, empty -> liftListItem (exit empty checkbox)\n *\n * CHILDREN-ZONE paragraph (childIndex > 0):\n * Enter, empty -> insertChildrenZoneSibling (accumulate inside the item)\n * Enter, non-empty -> splitBlock (both halves stay inside the same item)\n * Backspace, empty -> liftEmptyChildrenZoneParagraph (exit as top-level)\n *\n * Tab / Shift-Tab sink / lift the item; Mod-Enter toggles checked state.\n */\nimport { Node } from '../Node.js';\nimport { splitListItem, liftListItem, sinkListItem } from '@domternal/pm/schema-list';\nimport { Selection } from '@domternal/pm/state';\nimport { splitBlock } from '@domternal/pm/commands';\nimport type { CommandSpec } from '../types/Commands.js';\nimport { getListItemCursorContext } from '../utils/listItemCursorContext.js';\nimport { insertChildrenZoneSibling } from '../utils/insertChildrenZoneSibling.js';\nimport { liftEmptyChildrenZoneParagraph } from '../utils/liftEmptyChildrenZoneParagraph.js';\nimport { TaskItemNodeView } from './TaskItemNodeView.js';\n\ndeclare module '@domternal/core' {\n interface RawCommands {\n toggleTask: CommandSpec;\n }\n}\n\nexport interface TaskItemOptions {\n HTMLAttributes: Record<string, unknown>;\n nested: boolean;\n}\n\nexport const TaskItem = Node.create<TaskItemOptions>({\n name: 'taskItem',\n\n // Paragraph must be the first child so flex alignment binds to the label\n // baseline; a heading-first child would visually break the checkbox.\n content: 'paragraph block*',\n\n defining: true,\n\n addOptions() {\n return {\n HTMLAttributes: {},\n nested: true,\n };\n },\n\n addAttributes() {\n return {\n checked: {\n default: false,\n keepOnSplit: false,\n parseHTML: (element: HTMLElement) => {\n const dataChecked = element.getAttribute('data-checked');\n return dataChecked === 'true' || dataChecked === '';\n },\n renderHTML: (attributes: Record<string, unknown>) => ({\n 'data-checked': attributes['checked'] ? 'true' : 'false',\n }),\n },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: `li[data-type=\"${this.name}\"]`,\n priority: 51,\n },\n ];\n },\n\n renderHTML({ node, HTMLAttributes }) {\n return [\n 'li',\n {\n ...this.options.HTMLAttributes,\n ...HTMLAttributes,\n 'data-type': this.name,\n },\n [\n 'label',\n { contenteditable: 'false' },\n [\n 'input',\n {\n type: 'checkbox',\n checked: node.attrs['checked'] ? 'checked' : null,\n 'aria-label': 'Task status',\n },\n ],\n ],\n ['div', 0],\n ];\n },\n\n addNodeView() {\n const options = this.options;\n return (node, view, getPos) =>\n new TaskItemNodeView({ options, node, view, getPos });\n },\n\n addCommands() {\n const { name } = this;\n return {\n toggleTask:\n () =>\n ({ state, dispatch }) => {\n const { selection } = state;\n const { $from } = selection;\n\n // Find the task item node\n let taskItemPos: number | null = null;\n let taskItemNode = null;\n\n for (let depth = $from.depth; depth >= 0; depth--) {\n const node = $from.node(depth);\n if (node.type.name === name) {\n taskItemPos = $from.before(depth);\n taskItemNode = node;\n break;\n }\n }\n\n if (taskItemPos === null || !taskItemNode) return false;\n\n if (dispatch) {\n const tr = state.tr.setNodeMarkup(taskItemPos, undefined, {\n ...taskItemNode.attrs,\n checked: !taskItemNode.attrs['checked'],\n });\n dispatch(tr);\n }\n\n return true;\n },\n };\n },\n\n addKeyboardShortcuts() {\n return {\n Enter: () => {\n if (!this.editor || !this.nodeType) return false;\n const { state, view } = this.editor;\n const { $from } = state.selection;\n if ($from.depth < 1 || $from.node(-1).type !== this.nodeType) return false;\n // Defer if cursor is in a nested non-paragraph block (heading, codeBlock)\n // so that block's own Enter handler runs instead of splitListItem.\n if ($from.parent.type.name !== 'paragraph') return false;\n\n // Children-zone Enter accumulates inside the taskItem (Notion semantics).\n const ctx = getListItemCursorContext($from);\n if (ctx?.isInChildrenZone) {\n if (ctx.paragraphIsEmpty) {\n if (insertChildrenZoneSibling(state, view.dispatch, ctx)) return true;\n } else {\n if (splitBlock(state, view.dispatch)) return true;\n }\n }\n\n // Standard split for non-empty items. Pass `{ checked: false }` so\n // a freshly-spawned task item always starts unchecked - splitting\n // off a checked task otherwise inherits checked: true (Notion\n // semantics: each new task is fresh work). Other attrs assigned\n // by sibling extensions (UniqueID's `id`, etc.) are intentionally\n // NOT forwarded so those extensions can regenerate them.\n if (splitListItem(this.nodeType, { checked: false })(state, view.dispatch)) return true;\n\n // For empty taskItem nested inside a parent list item (e.g. orderedList > listItem > taskList > taskItem),\n // delete the taskItem, clean up the taskList if empty, and create a new parent listItem.\n // Without this, liftListItem alone leaves a bare empty paragraph inside the listItem.\n if ($from.parent.content.size === 0) {\n const listItemType = state.schema.nodes['listItem'];\n if (listItemType) {\n let parentListItemDepth = -1;\n for (let d = $from.depth - 2; d > 0; d--) {\n if ($from.node(d).type === listItemType) {\n parentListItemDepth = d;\n break;\n }\n }\n\n if (parentListItemDepth > 0) {\n const tr = state.tr;\n const taskItemDepth = $from.depth - 1;\n const taskItemNode = $from.node(taskItemDepth);\n\n if (taskItemNode.childCount > 1) {\n // TaskItem has content beyond the empty paragraph (e.g. paragraph + nested list + empty paragraph).\n // Only delete the trailing empty paragraph, not the whole taskItem.\n tr.delete($from.before($from.depth), $from.after($from.depth));\n } else {\n const taskListDepth = taskItemDepth - 1;\n const taskListNode = $from.node(taskListDepth);\n\n if (taskListNode.childCount <= 1) {\n // Only child - delete the entire taskList. Deleting just the taskItem\n // would leave an empty taskList, violating its content spec and causing\n // ProseMirror's replaceStep to silently skip the deletion.\n tr.delete($from.before(taskListDepth), $from.after(taskListDepth));\n } else {\n // Multiple children - delete just the empty taskItem\n tr.delete($from.before(taskItemDepth), $from.after(taskItemDepth));\n }\n }\n\n // 3. Insert a new listItem after the parent listItem\n const listItemEnd = tr.mapping.map($from.after(parentListItemDepth));\n const newItem = listItemType.createAndFill();\n if (newItem) {\n tr.insert(listItemEnd, newItem);\n tr.setSelection(Selection.near(tr.doc.resolve(listItemEnd + 2)));\n view.dispatch(tr.scrollIntoView());\n return true;\n }\n }\n }\n }\n\n // Standard lift for non-nested empty items\n return liftListItem(this.nodeType)(state, view.dispatch);\n },\n Tab: () => {\n if (!this.editor || !this.nodeType) return false;\n const { $from } = this.editor.state.selection;\n if ($from.depth < 1 || $from.node(-1).type !== this.nodeType) return false;\n return sinkListItem(this.nodeType)(this.editor.state, this.editor.view.dispatch);\n },\n 'Shift-Tab': () => {\n if (!this.editor || !this.nodeType) return false;\n const { $from } = this.editor.state.selection;\n if ($from.depth < 1 || $from.node(-1).type !== this.nodeType) return false;\n return liftListItem(this.nodeType)(this.editor.state, this.editor.view.dispatch);\n },\n Backspace: () => {\n if (!this.editor || !this.nodeType) return false;\n const { state, view } = this.editor;\n const { $from, empty } = state.selection;\n\n // Only at start of a textblock with empty selection\n if (!empty || $from.parentOffset !== 0) return false;\n\n // Empty children-zone paragraph: lift it out as a top-level sibling.\n if ($from.parent.content.size === 0) {\n const ctx = getListItemCursorContext($from);\n if (ctx && ctx.isInChildrenZone && ctx.paragraphIsEmpty) {\n if (liftEmptyChildrenZoneParagraph(state, view.dispatch, ctx)) return true;\n }\n }\n\n // Find enclosing taskItem\n let taskItemDepth = -1;\n for (let d = $from.depth; d > 0; d--) {\n if ($from.node(d).type === this.nodeType) {\n taskItemDepth = d;\n break;\n }\n }\n if (taskItemDepth === -1) return false;\n\n // Only lift when cursor is in the first child of the taskItem\n if ($from.index(taskItemDepth) !== 0) return false;\n\n return liftListItem(this.nodeType)(state, view.dispatch);\n },\n 'Mod-Enter': () => {\n return this.editor?.commands['toggleTask']?.() ?? false;\n },\n };\n },\n});\n","/**\n * TaskList Node\n *\n * Block-level task/checkbox list container.\n * Supports markdown-style input rules with `[ ]` and `[x]`.\n */\n\nimport { Node } from '../Node.js';\nimport { wrappingInputRule, notInsideList } from '../helpers/wrappingInputRule.js';\nimport type { CommandSpec } from '../types/Commands.js';\nimport type { ToolbarItem } from '../types/Toolbar.js';\nimport type { FloatingMenuItem } from '../types/FloatingMenu.js';\nimport { TaskItem } from './TaskItem.js';\n\ndeclare module '@domternal/core' {\n interface RawCommands {\n toggleTaskList: CommandSpec;\n }\n}\n\nexport interface TaskListOptions {\n HTMLAttributes: Record<string, unknown>;\n itemTypeName: string;\n}\n\nexport const TaskList = Node.create<TaskListOptions>({\n name: 'taskList',\n group: 'block list',\n content: 'taskItem+',\n\n addOptions() {\n return {\n HTMLAttributes: {},\n itemTypeName: 'taskItem',\n };\n },\n\n parseHTML() {\n return [\n {\n tag: `ul[data-type=\"${this.name}\"]`,\n priority: 51, // Higher priority than regular bulletList\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n 'ul',\n {\n ...this.options.HTMLAttributes,\n ...HTMLAttributes,\n 'data-type': this.name,\n },\n 0,\n ];\n },\n\n addCommands() {\n const { name, options } = this;\n return {\n toggleTaskList:\n () =>\n ({ commands }) => {\n return commands.toggleList(name, options.itemTypeName);\n },\n };\n },\n\n addKeyboardShortcuts() {\n const { editor } = this;\n return {\n 'Mod-Shift-9': () => {\n return editor?.commands['toggleTaskList']?.() ?? false;\n },\n };\n },\n\n addToolbarItems(): ToolbarItem[] {\n return [\n {\n type: 'button',\n name: 'taskList',\n command: 'toggleTaskList',\n isActive: 'taskList',\n icon: 'listChecks',\n label: 'Task List',\n shortcut: 'Mod-Shift-9',\n group: 'lists',\n priority: 170,\n },\n ];\n },\n\n addFloatingMenuItems(): FloatingMenuItem[] {\n return [\n {\n name: 'task-list',\n label: 'To-do list',\n description: 'Track tasks with a checkbox list',\n icon: 'listChecks',\n group: 'Lists',\n priority: 180,\n keywords: ['todo', 'task', 'checkbox', 'check'],\n shortcut: '[ ] ',\n command: 'toggleTaskList',\n hideWhenInside: ['taskList'],\n },\n ];\n },\n\n addExtensions() {\n return [TaskItem];\n },\n\n addInputRules() {\n const { nodeType } = this;\n\n if (!nodeType) {\n return [];\n }\n\n return [\n // [ ] at start of line creates unchecked task\n wrappingInputRule({ find: /^\\s*\\[\\s?\\]\\s$/, type: nodeType, guard: notInsideList, joinForward: true }),\n // [x] or [X] at start of line creates checked task\n wrappingInputRule({ find: /^\\s*\\[[xX]\\]\\s$/, type: nodeType, guard: notInsideList, joinForward: true }),\n ];\n },\n});\n","/**\n * Bold Mark\n *\n * Applies bold formatting to text. Supports multiple HTML tags\n * and CSS font-weight styles.\n *\n * @example\n * ```ts\n * import { Bold } from '@domternal/core';\n *\n * const editor = new Editor({\n * extensions: [Document, Paragraph, Text, Bold],\n * });\n *\n * // Toggle bold with keyboard shortcut: Mod-b\n * // Or use input rule: **text**\n * ```\n */\nimport { Mark } from '../Mark.js';\nimport { markInputRule, markInputRulePatterns } from '../helpers/markInputRule.js';\nimport type { ToolbarItem } from '../types/Toolbar.js';\nimport type { CommandSpec } from '../types/Commands.js';\n\n/**\n * Options for the Bold mark\n */\nexport interface BoldOptions {\n /**\n * HTML attributes to add to the rendered element\n */\n HTMLAttributes: Record<string, unknown>;\n}\n\n/**\n * Bold mark for text formatting\n */\nexport const Bold = Mark.create<BoldOptions>({\n name: 'bold',\n\n addOptions() {\n return {\n HTMLAttributes: {},\n };\n },\n\n parseHTML() {\n return [\n { tag: 'strong' },\n {\n tag: 'b',\n getAttrs: (node) => {\n if (typeof node === 'string') return {};\n const fontWeight = node.style.fontWeight;\n\n // Google Docs uses <b style=\"font-weight:normal\"> for non-bold text\n if (fontWeight === 'normal' || fontWeight === '400') {\n return false;\n }\n\n return {};\n },\n },\n {\n style: 'font-weight',\n getAttrs: (value) => {\n if (typeof value !== 'string') return false;\n\n // Match numeric weight >= 600 (semibold and above)\n const numWeight = parseInt(value, 10);\n if (!isNaN(numWeight) && numWeight >= 600) return {};\n\n // Match named weights\n if (/^(bold|bolder)$/i.test(value)) return {};\n\n return false;\n },\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['strong', { ...this.options.HTMLAttributes, ...HTMLAttributes }, 0];\n },\n\n addKeyboardShortcuts() {\n return {\n 'Mod-b': () => this.editor?.commands['toggleMark']?.('bold') ?? false,\n };\n },\n\n addCommands() {\n return {\n setBold:\n () =>\n ({ commands }) => commands.setMark('bold'),\n unsetBold:\n () =>\n ({ commands }) => commands.unsetMark('bold'),\n toggleBold:\n () =>\n ({ commands }) => commands.toggleMark('bold'),\n };\n },\n\n addToolbarItems(): ToolbarItem[] {\n return [\n {\n type: 'button',\n name: 'bold',\n command: 'toggleBold',\n isActive: 'bold',\n icon: 'textB',\n label: 'Bold',\n shortcut: 'Mod-B',\n group: 'format',\n priority: 200,\n },\n ];\n },\n\n addInputRules() {\n const markType = this.markType;\n if (!markType) return [];\n\n return [\n // **text** or __text__\n markInputRule({\n find: markInputRulePatterns.bold,\n type: markType,\n }),\n ];\n },\n});\n\ndeclare module '@domternal/core' {\n interface RawCommands {\n setBold: CommandSpec;\n unsetBold: CommandSpec;\n toggleBold: CommandSpec;\n }\n}\n","/**\n * Italic Mark\n *\n * Applies italic formatting to text. Supports multiple HTML tags\n * and CSS font-style styles.\n *\n * @example\n * ```ts\n * import { Italic } from '@domternal/core';\n *\n * const editor = new Editor({\n * extensions: [Document, Paragraph, Text, Italic],\n * });\n *\n * // Toggle italic with keyboard shortcut: Mod-i\n * // Or use input rule: *text* or _text_\n * ```\n */\nimport { Mark } from '../Mark.js';\nimport type { CommandSpec } from '../types/Commands.js';\nimport { markInputRule } from '../helpers/markInputRule.js';\nimport type { ToolbarItem } from '../types/Toolbar.js';\n\n/**\n * Options for the Italic mark\n */\nexport interface ItalicOptions {\n /**\n * HTML attributes to add to the rendered element\n */\n HTMLAttributes: Record<string, unknown>;\n}\n\n/**\n * Italic mark for text formatting\n */\nexport const Italic = Mark.create<ItalicOptions>({\n name: 'italic',\n\n addOptions() {\n return {\n HTMLAttributes: {},\n };\n },\n\n parseHTML() {\n return [\n { tag: 'em' },\n {\n tag: 'i',\n getAttrs: (node) => {\n if (typeof node === 'string') return {};\n const fontStyle = node.style.fontStyle;\n\n // Google Docs uses <i style=\"font-style:normal\"> for non-italic text\n if (fontStyle === 'normal') {\n return false;\n }\n\n return {};\n },\n },\n {\n style: 'font-style',\n getAttrs: (value) => {\n if (typeof value !== 'string') return false;\n return /^italic$/i.test(value) ? {} : false;\n },\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['em', { ...this.options.HTMLAttributes, ...HTMLAttributes }, 0];\n },\n\n addKeyboardShortcuts() {\n return {\n 'Mod-i': () => this.editor?.commands['toggleMark']?.('italic') ?? false,\n };\n },\n\n addCommands() {\n return {\n setItalic:\n () =>\n ({ commands }) => commands.setMark('italic'),\n unsetItalic:\n () =>\n ({ commands }) => commands.unsetMark('italic'),\n toggleItalic:\n () =>\n ({ commands }) => commands.toggleMark('italic'),\n };\n },\n\n addToolbarItems(): ToolbarItem[] {\n return [\n {\n type: 'button',\n name: 'italic',\n command: 'toggleItalic',\n isActive: 'italic',\n icon: 'textItalic',\n label: 'Italic',\n shortcut: 'Mod-I',\n group: 'format',\n priority: 190,\n },\n ];\n },\n\n addInputRules() {\n const markType = this.markType;\n if (!markType) return [];\n\n return [\n // *text* - using negative lookbehind to avoid matching **text**\n markInputRule({\n find: /(?<!\\*)\\*([^*]+)\\*$/,\n type: markType,\n }),\n // _text_ - using negative lookbehind to avoid matching __text__\n markInputRule({\n find: /(?<!_)_([^_]+)_$/,\n type: markType,\n }),\n ];\n },\n});\n\ndeclare module '@domternal/core' {\n interface RawCommands {\n setItalic: CommandSpec;\n unsetItalic: CommandSpec;\n toggleItalic: CommandSpec;\n }\n}\n","/**\n * Underline Mark\n *\n * Applies underline formatting to text.\n *\n * @example\n * ```ts\n * import { Underline } from '@domternal/core';\n *\n * const editor = new Editor({\n * extensions: [Document, Paragraph, Text, Underline],\n * });\n *\n * // Toggle underline with keyboard shortcut: Mod-u\n * ```\n */\nimport { Mark } from '../Mark.js';\nimport type { CommandSpec } from '../types/Commands.js';\nimport type { ToolbarItem } from '../types/Toolbar.js';\n\n/**\n * Options for the Underline mark\n */\nexport interface UnderlineOptions {\n /**\n * HTML attributes to add to the rendered element\n */\n HTMLAttributes: Record<string, unknown>;\n}\n\n/**\n * Underline mark for text formatting\n */\nexport const Underline = Mark.create<UnderlineOptions>({\n name: 'underline',\n\n addOptions() {\n return {\n HTMLAttributes: {},\n };\n },\n\n parseHTML() {\n return [\n { tag: 'u' },\n {\n style: 'text-decoration',\n getAttrs: (value) => {\n if (typeof value !== 'string') return false;\n // text-decoration can be \"underline\" or \"underline dotted\" etc.\n return value.includes('underline') ? {} : false;\n },\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['u', { ...this.options.HTMLAttributes, ...HTMLAttributes }, 0];\n },\n\n addKeyboardShortcuts() {\n return {\n 'Mod-u': () => this.editor?.commands['toggleMark']?.('underline') ?? false,\n };\n },\n\n addCommands() {\n return {\n setUnderline:\n () =>\n ({ commands }) => commands.setMark('underline'),\n unsetUnderline:\n () =>\n ({ commands }) => commands.unsetMark('underline'),\n toggleUnderline:\n () =>\n ({ commands }) => commands.toggleMark('underline'),\n };\n },\n\n addToolbarItems(): ToolbarItem[] {\n return [\n {\n type: 'button',\n name: 'underline',\n command: 'toggleUnderline',\n isActive: 'underline',\n icon: 'textUnderline',\n label: 'Underline',\n shortcut: 'Mod-U',\n group: 'format',\n priority: 180,\n },\n ];\n },\n});\n\ndeclare module '@domternal/core' {\n interface RawCommands {\n setUnderline: CommandSpec;\n unsetUnderline: CommandSpec;\n toggleUnderline: CommandSpec;\n }\n}\n","/**\n * Strike Mark\n *\n * Applies strikethrough formatting to text.\n *\n * @example\n * ```ts\n * import { Strike } from '@domternal/core';\n *\n * const editor = new Editor({\n * extensions: [Document, Paragraph, Text, Strike],\n * });\n *\n * // Toggle strike with keyboard shortcut: Mod-Shift-s\n * // Or use input rule: ~~text~~\n * ```\n */\nimport { Mark } from '../Mark.js';\nimport type { CommandSpec } from '../types/Commands.js';\nimport { markInputRule, markInputRulePatterns } from '../helpers/markInputRule.js';\nimport type { ToolbarItem } from '../types/Toolbar.js';\n\n/**\n * Options for the Strike mark\n */\nexport interface StrikeOptions {\n /**\n * HTML attributes to add to the rendered element\n */\n HTMLAttributes: Record<string, unknown>;\n}\n\n/**\n * Strike mark for text formatting\n */\nexport const Strike = Mark.create<StrikeOptions>({\n name: 'strike',\n\n addOptions() {\n return {\n HTMLAttributes: {},\n };\n },\n\n parseHTML() {\n return [\n { tag: 's' },\n { tag: 'del' },\n { tag: 'strike' }, // Deprecated but still common\n {\n style: 'text-decoration',\n getAttrs: (value) => {\n if (typeof value !== 'string') return false;\n return value.includes('line-through') ? {} : false;\n },\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['s', { ...this.options.HTMLAttributes, ...HTMLAttributes }, 0];\n },\n\n addKeyboardShortcuts() {\n return {\n 'Mod-Shift-s': () => this.editor?.commands['toggleMark']?.('strike') ?? false,\n };\n },\n\n addCommands() {\n return {\n setStrike:\n () =>\n ({ commands }) => commands.setMark('strike'),\n unsetStrike:\n () =>\n ({ commands }) => commands.unsetMark('strike'),\n toggleStrike:\n () =>\n ({ commands }) => commands.toggleMark('strike'),\n };\n },\n\n addToolbarItems(): ToolbarItem[] {\n return [\n {\n type: 'button',\n name: 'strike',\n command: 'toggleStrike',\n isActive: 'strike',\n icon: 'textStrikethrough',\n label: 'Strikethrough',\n shortcut: 'Mod-Shift-S',\n group: 'format',\n priority: 170,\n },\n ];\n },\n\n addInputRules() {\n const markType = this.markType;\n if (!markType) return [];\n\n return [\n // ~~text~~\n markInputRule({\n find: markInputRulePatterns.strike,\n type: markType,\n }),\n ];\n },\n});\n\ndeclare module '@domternal/core' {\n interface RawCommands {\n setStrike: CommandSpec;\n unsetStrike: CommandSpec;\n toggleStrike: CommandSpec;\n }\n}\n","/**\n * Code Mark\n *\n * Applies inline code formatting to text. This mark is exclusive,\n * meaning it cannot be combined with other marks like bold or italic.\n *\n * @example\n * ```ts\n * import { Code } from '@domternal/core';\n *\n * const editor = new Editor({\n * extensions: [Document, Paragraph, Text, Code],\n * });\n *\n * // Toggle code with keyboard shortcut: Mod-e\n * // Or use input rule: `text`\n * ```\n */\nimport { Mark } from '../Mark.js';\nimport type { CommandSpec } from '../types/Commands.js';\nimport { markInputRule, markInputRulePatterns } from '../helpers/markInputRule.js';\nimport type { ToolbarItem } from '../types/Toolbar.js';\n\n/**\n * Options for the Code mark\n */\nexport interface CodeOptions {\n /**\n * HTML attributes to add to the rendered element\n */\n HTMLAttributes: Record<string, unknown>;\n}\n\n/**\n * Code mark for inline code formatting\n */\nexport const Code = Mark.create<CodeOptions>({\n name: 'code',\n\n addOptions() {\n return {\n HTMLAttributes: {},\n };\n },\n\n // Code mark is exclusive - it cannot be combined with other marks\n // ProseMirror uses '_' to mean \"exclude all marks\"\n excludes: '_',\n\n // Code should not span across multiple nodes\n spanning: false,\n\n parseHTML() {\n return [{ tag: 'code' }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['code', { ...this.options.HTMLAttributes, ...HTMLAttributes }, 0];\n },\n\n addKeyboardShortcuts() {\n return {\n 'Mod-e': () => this.editor?.commands['toggleMark']?.('code') ?? false,\n };\n },\n\n addCommands() {\n return {\n setCode:\n () =>\n ({ commands }) => commands.setMark('code'),\n unsetCode:\n () =>\n ({ commands }) => commands.unsetMark('code'),\n toggleCode:\n () =>\n ({ commands }) => commands.toggleMark('code'),\n };\n },\n\n addToolbarItems(): ToolbarItem[] {\n return [\n {\n type: 'button',\n name: 'code',\n command: 'toggleCode',\n isActive: 'code',\n icon: 'code',\n label: 'Code',\n shortcut: 'Mod-E',\n group: 'format',\n priority: 160,\n },\n ];\n },\n\n addInputRules() {\n const markType = this.markType;\n if (!markType) return [];\n\n return [\n // `text`\n markInputRule({\n find: markInputRulePatterns.code,\n type: markType,\n }),\n ];\n },\n});\n\ndeclare module '@domternal/core' {\n interface RawCommands {\n setCode: CommandSpec;\n unsetCode: CommandSpec;\n toggleCode: CommandSpec;\n }\n}\n","/**\n * Link Click Plugin\n *\n * Handles click on links to open them.\n * When editable: opens on click.\n * When read-only: browser handles link clicks natively.\n */\nimport { Plugin, PluginKey, TextSelection } from '@domternal/pm/state';\nimport type { MarkType } from '@domternal/pm/model';\n\n/**\n * Options for the link click plugin\n */\nexport interface LinkClickPluginOptions {\n /**\n * The link mark type\n */\n type: MarkType;\n\n /**\n * When to open links on click\n * - true: Open on click\n * - false: Never open\n * - 'whenNotEditable': Only open when editor is read-only (browser handles natively)\n * @default true\n */\n openOnClick?: boolean | 'whenNotEditable';\n\n /**\n * Select the full link text range when clicking a link\n * @default false\n */\n enableClickSelection?: boolean;\n}\n\n/**\n * Plugin key for link click plugin\n */\nexport const linkClickPluginKey = new PluginKey('linkClick');\n\n/**\n * Creates a plugin that handles clicking on links to open them.\n *\n * @param options - Plugin options\n * @returns ProseMirror Plugin\n */\nexport function linkClickPlugin(options: LinkClickPluginOptions): Plugin {\n const { type, openOnClick = true, enableClickSelection = false } = options;\n\n return new Plugin({\n key: linkClickPluginKey,\n\n props: {\n handleClick(view, _pos, event) {\n // Only left clicks\n if (event.button !== 0) {\n return false;\n }\n\n // When not editable, let browser handle natively (links navigate normally)\n if (!view.editable) {\n return false;\n }\n\n // Find the <a> element from the click target\n let link: HTMLAnchorElement | null = null;\n\n if (event.target instanceof HTMLAnchorElement) {\n link = event.target;\n } else {\n const target = event.target as HTMLElement | null;\n if (!target) {\n return false;\n }\n link = target.closest<HTMLAnchorElement>('a');\n if (link && !view.dom.contains(link)) {\n link = null;\n }\n }\n\n if (!link) {\n return false;\n }\n\n // Select full link range on click\n if (enableClickSelection) {\n const pos = view.posAtDOM(link, 0);\n const $pos = view.state.doc.resolve(pos);\n\n if ($pos.marks().some((m) => m.type === type)) {\n // Find contiguous mark range within the parent text block\n const parent = $pos.parent;\n const blockStart = pos - $pos.parentOffset;\n let rangeStart = pos;\n let rangeEnd = pos;\n\n parent.forEach((child, childOffset) => {\n const childStart = blockStart + childOffset;\n const childEnd = childStart + child.nodeSize;\n if (type.isInSet(child.marks) && childStart <= rangeEnd && childEnd >= rangeStart) {\n rangeStart = Math.min(rangeStart, childStart);\n rangeEnd = Math.max(rangeEnd, childEnd);\n }\n });\n\n const tr = view.state.tr.setSelection(\n TextSelection.create(view.state.doc, rangeStart, rangeEnd)\n );\n view.dispatch(tr);\n return true;\n }\n }\n\n if (openOnClick) {\n // Get href/target from ProseMirror mark (validated by renderHTML), fallback to DOM\n const pos = view.posAtDOM(link, 0);\n const $pos = view.state.doc.resolve(pos);\n const linkMark = $pos.marks().find((m) => m.type === type);\n\n const href = (linkMark?.attrs['href'] as string | undefined) ?? link.href;\n const linkTarget = (linkMark?.attrs['target'] as string | undefined) ?? link.target;\n\n if (href) {\n window.open(href, linkTarget || '_blank');\n return true;\n }\n }\n\n return false;\n },\n },\n });\n}\n","/**\n * Link Paste Plugin\n *\n * Handles pasting URLs:\n * - If text is selected: wraps selection in a link\n * - If no selection: inserts URL as clickable link text\n */\nimport { Plugin, PluginKey } from '@domternal/pm/state';\nimport type { MarkType } from '@domternal/pm/model';\n\n/**\n * Options for the link paste plugin\n */\nexport interface LinkPastePluginOptions {\n /**\n * The link mark type\n */\n type: MarkType;\n\n /**\n * Allowed URL protocols\n * @default ['http:', 'https:']\n */\n protocols?: string[];\n\n /**\n * Custom URL validation function\n * Return false to prevent linking specific URLs\n */\n validate?: (url: string) => boolean;\n}\n\n/**\n * Plugin key for link paste plugin\n */\nexport const linkPastePluginKey = new PluginKey('linkPaste');\n\n/**\n * Creates a plugin that handles pasting URLs.\n *\n * Behavior:\n * - Text selected + paste URL = wrap selection in link\n * - No selection + paste URL = insert URL as link\n *\n * @param options - Plugin options\n * @returns ProseMirror Plugin\n */\nexport function linkPastePlugin(options: LinkPastePluginOptions): Plugin {\n const { type, protocols = ['http:', 'https:'], validate } = options;\n\n return new Plugin({\n key: linkPastePluginKey,\n\n props: {\n handlePaste(view, event) {\n // Get pasted text\n const text = event.clipboardData?.getData('text/plain').trim();\n if (!text) return false;\n\n // Check if pasted text is a URL\n let url: URL;\n try {\n url = new URL(text);\n } catch {\n return false; // Not a URL, let default paste handling continue\n }\n\n // Validate protocol\n if (!protocols.includes(url.protocol)) {\n return false;\n }\n\n // Custom validation\n if (validate && !validate(text)) {\n return false;\n }\n\n const { state, dispatch } = view;\n const { from, to, empty } = state.selection;\n const tr = state.tr;\n\n if (empty) {\n // No selection - insert URL as linked text\n tr.insertText(text, from, to);\n tr.addMark(from, from + text.length, type.create({ href: text }));\n } else {\n // Has selection - wrap selection in link\n tr.addMark(from, to, type.create({ href: text }));\n }\n\n dispatch(tr);\n return true;\n },\n },\n });\n}\n","/**\n * Autolink Plugin\n *\n * Automatically converts typed URLs into clickable links.\n * Triggers when user types a space, punctuation, or presses Enter after a URL.\n * Uses linkifyjs for robust URL detection.\n */\nimport { Plugin, PluginKey } from '@domternal/pm/state';\nimport type { MarkType } from '@domternal/pm/model';\nimport { find } from 'linkifyjs';\n\n/**\n * Options for the autolink plugin\n */\nexport interface AutolinkPluginOptions {\n /**\n * The link mark type\n */\n type: MarkType;\n\n /**\n * Allowed URL protocols\n * @default ['http:', 'https:']\n */\n protocols?: string[];\n\n /**\n * Default protocol to add to bare URLs (e.g., 'example.com' → 'https://example.com')\n * @default 'https'\n */\n defaultProtocol?: string;\n\n /**\n * Custom validation function\n * Return false to prevent auto-linking specific URLs\n */\n shouldAutoLink?: (url: string) => boolean;\n}\n\n/**\n * Plugin key for autolink plugin\n */\nexport const autolinkPluginKey = new PluginKey('autolink');\n\n/**\n * Characters that trigger autolink detection\n */\nconst TRIGGER_CHARS = /[\\s.,!?;:\\n]/;\n\n/**\n * Creates a plugin that auto-converts typed URLs to links.\n *\n * When user types a URL followed by space/punctuation, the URL\n * is automatically wrapped in a link mark.\n *\n * @param options - Plugin options\n * @returns ProseMirror Plugin\n */\nexport function autolinkPlugin(options: AutolinkPluginOptions): Plugin {\n const {\n type,\n protocols = ['http:', 'https:'],\n defaultProtocol = 'https',\n shouldAutoLink,\n } = options;\n\n return new Plugin({\n key: autolinkPluginKey,\n\n props: {\n handleTextInput(view, from, to, text) {\n // Only trigger on space, punctuation, or newline\n if (!TRIGGER_CHARS.test(text)) {\n return false;\n }\n\n const { state } = view;\n const $from = state.doc.resolve(from);\n\n // Get text before cursor in current text block\n const textBefore = $from.parent.textBetween(\n Math.max(0, $from.parentOffset - 500), // Look back max 500 chars\n $from.parentOffset,\n undefined,\n '\\ufffc'\n );\n\n // Use linkifyjs to find URLs in the text\n const matches = find(textBefore, {\n defaultProtocol: defaultProtocol as 'http' | 'https',\n });\n\n // Get the last match (most recent URL)\n const lastMatch = matches[matches.length - 1];\n if (!lastMatch) {\n return false;\n }\n\n // Only process URL types (not email, etc.)\n if (lastMatch.type !== 'url') {\n return false;\n }\n\n // Check if URL ends right before the trigger character\n if (lastMatch.end !== textBefore.length) {\n return false;\n }\n\n const href = lastMatch.href;\n\n // Validate protocol\n try {\n const url = new URL(href);\n if (!protocols.includes(url.protocol)) {\n return false;\n }\n } catch {\n return false;\n }\n\n // Custom validation\n if (shouldAutoLink && !shouldAutoLink(href)) {\n return false;\n }\n\n // Calculate positions in document\n const blockStart = from - $from.parentOffset;\n const linkStart = blockStart + lastMatch.start;\n const linkEnd = blockStart + lastMatch.end;\n\n // Check if already has link mark\n const $linkStart = state.doc.resolve(linkStart);\n if ($linkStart.marks().some((m) => m.type === type)) {\n return false;\n }\n\n // Apply link mark and insert trigger character\n const tr = state.tr;\n tr.addMark(linkStart, linkEnd, type.create({ href }));\n tr.insertText(text, from, to);\n\n view.dispatch(tr);\n return true;\n },\n },\n });\n}\n","/**\n * Link Exit Plugin\n *\n * Allows users to \"exit\" a link mark by pressing ArrowRight at the\n * end of the link. After exiting, newly typed text will not have\n * the link mark applied.\n *\n * Enabled when the Link mark has `exitable: true` configured.\n */\nimport { Plugin, PluginKey, TextSelection } from '@domternal/pm/state';\nimport type { MarkType } from '@domternal/pm/model';\n\n/**\n * Options for the link exit plugin\n */\nexport interface LinkExitPluginOptions {\n /**\n * The link mark type\n */\n type: MarkType;\n}\n\n/**\n * Plugin key for link exit plugin\n */\nexport const linkExitPluginKey = new PluginKey('linkExit');\n\n/**\n * Creates a plugin that allows exiting a link mark with ArrowRight.\n *\n * When the cursor is at the end boundary of a link mark (the next\n * character has no link mark, or there is no next character), pressing\n * ArrowRight will set storedMarks to exclude the link mark. This means\n * any text typed after will not be linked.\n *\n * @param options - Plugin options\n * @returns ProseMirror Plugin\n */\nexport function linkExitPlugin(options: LinkExitPluginOptions): Plugin {\n const { type } = options;\n\n return new Plugin({\n key: linkExitPluginKey,\n\n props: {\n handleKeyDown(view, event) {\n if (event.key !== 'ArrowRight') return false;\n\n const { state } = view;\n const { selection } = state;\n\n // Only handle cursor (collapsed) selections\n if (!(selection instanceof TextSelection) || !selection.empty) {\n return false;\n }\n\n const $cursor = selection.$cursor;\n if (!$cursor) return false;\n\n // Check the node before cursor for the link mark.\n // We use nodeBefore.marks instead of $cursor.marks() because\n // nodeBefore always reflects the actual marks on the text node,\n // regardless of the mark's inclusive setting.\n const nodeBefore = $cursor.nodeBefore;\n if (!nodeBefore) return false;\n\n const marksOnNode = nodeBefore.marks;\n const hasLink = marksOnNode.some((m) => m.type === type);\n if (!hasLink) return false;\n\n // Check if we're at the end of the mark range:\n // The next character either doesn't exist or doesn't have the link mark\n const after = $cursor.nodeAfter;\n const afterHasLink = after?.marks.some((m) => m.type === type) ?? false;\n\n if (!afterHasLink) {\n // We're at the boundary - strip link from storedMarks\n const marksWithoutLink = marksOnNode.filter((m) => m.type !== type);\n const tr = state.tr.setStoredMarks(marksWithoutLink);\n view.dispatch(tr);\n // Don't prevent default - let ArrowRight move cursor normally\n return false;\n }\n\n return false;\n },\n },\n });\n}\n","/**\n * Hyperlink mark with `href` and `target` attributes.\n */\nimport { Plugin, PluginKey, TextSelection } from '@domternal/pm/state';\nimport { Mark } from '../Mark.js';\nimport type { CommandSpec } from '../types/Commands.js';\nimport { isValidUrl } from '../helpers/isValidUrl.js';\nimport { getMarkRange } from '../helpers/getMarkRange.js';\nimport { linkClickPlugin } from './helpers/linkClickPlugin.js';\nimport { linkPastePlugin } from './helpers/linkPastePlugin.js';\nimport { autolinkPlugin } from './helpers/autolinkPlugin.js';\nimport { linkExitPlugin } from './helpers/linkExitPlugin.js';\nimport type { Editor } from '../Editor.js';\nimport type { ToolbarItem } from '../types/Toolbar.js';\n\nexport interface LinkOptions {\n /**\n * HTML attributes to add to the rendered element\n */\n HTMLAttributes: Record<string, unknown>;\n /**\n * List of allowed URL protocols\n * @default ['http:', 'https:', 'mailto:', 'tel:']\n */\n protocols: string[];\n /**\n * When to open links on click\n * - true: Open on click (when editable)\n * - false: Never open\n * - 'whenNotEditable': Only open when editor is read-only\n * @default true\n */\n openOnClick: boolean | 'whenNotEditable';\n /**\n * Whether to add rel=\"noopener noreferrer\" to links\n * @default true\n */\n addRelNoopener: boolean;\n /**\n * Auto-convert typed URLs to links\n * @default true\n */\n autolink: boolean;\n /**\n * Convert pasted URLs to links (wraps selection or inserts as link)\n * @default true\n */\n linkOnPaste: boolean;\n /**\n * Default protocol for bare URLs (e.g., 'example.com' → 'https://example.com')\n * @default 'https'\n */\n defaultProtocol: string;\n /**\n * Custom validation for autolink\n * Return false to prevent auto-linking specific URLs\n */\n shouldAutoLink?: (url: string) => boolean;\n /**\n * Select the full link text range when clicking a link\n * @default false\n */\n enableClickSelection: boolean;\n}\n\n/**\n * Attributes for the Link mark\n */\nexport interface LinkAttributes {\n href: string;\n target?: string | null;\n rel?: string | null;\n title?: string | null;\n class?: string | null;\n}\n\n/**\n * Link mark for hyperlinks\n */\nexport const Link = Mark.create<LinkOptions>({\n name: 'link',\n\n // Links are semantic data, not visual formatting.\n // They survive `unsetAllMarks` (clear formatting).\n // Override with: Link.configure({ isFormatting: true })\n isFormatting: false,\n\n // Links have lower priority than other marks\n priority: 1000,\n\n // When autolink is enabled, the mark is inclusive so that typing at\n // the end of a link naturally extends it (e.g. adding path segments\n // to an autolinked URL). When autolink is off, links are set manually\n // and should not extend on typing.\n inclusive() {\n return this.options.autolink;\n },\n\n addOptions(): LinkOptions {\n return {\n HTMLAttributes: {},\n protocols: ['http:', 'https:', 'mailto:', 'tel:'],\n openOnClick: true,\n addRelNoopener: true,\n autolink: true,\n linkOnPaste: true,\n defaultProtocol: 'https',\n enableClickSelection: false,\n };\n },\n\n addAttributes() {\n return {\n href: {\n default: null,\n },\n target: {\n default: null,\n },\n rel: {\n default: null,\n },\n title: {\n default: null,\n },\n class: {\n default: null,\n },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: 'a[href]',\n getAttrs: (node) => {\n if (typeof node === 'string') return false;\n const href = node.getAttribute('href');\n\n // Validate URL\n if (!href || !isValidUrl(href, { protocols: this.options.protocols })) {\n return false;\n }\n\n return {\n href,\n target: node.getAttribute('target'),\n rel: node.getAttribute('rel'),\n title: node.getAttribute('title'),\n class: node.getAttribute('class'),\n };\n },\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n const attrs = { ...this.options.HTMLAttributes, ...HTMLAttributes };\n\n // Validate href before rendering\n if (\n typeof attrs['href'] === 'string' &&\n !isValidUrl(attrs['href'], { protocols: this.options.protocols })\n ) {\n // Remove the href if invalid, keeping other attributes\n const { href: _, ...rest } = attrs;\n return ['a', rest, 0];\n }\n\n // Add rel=\"noopener noreferrer\" for external links\n if (\n this.options.addRelNoopener &&\n attrs['target'] === '_blank' &&\n !attrs['rel']\n ) {\n attrs['rel'] = 'noopener noreferrer';\n }\n\n return ['a', attrs, 0];\n },\n\n addCommands() {\n return {\n setLink:\n (attributes: LinkAttributes) =>\n ({ commands }) => {\n if (!isValidUrl(attributes.href, { protocols: this.options.protocols })) {\n return false;\n }\n return commands.setMark('link', attributes);\n },\n unsetLink:\n () =>\n ({ tr, state, dispatch }) => {\n const markType = state.schema.marks['link'];\n if (!markType) return false;\n\n const { empty, ranges } = tr.selection;\n\n if (empty) {\n // Extend to full link range around cursor\n const $pos = tr.doc.resolve(tr.selection.from);\n const range = getMarkRange($pos, markType);\n if (!range) return false;\n if (!dispatch) return true;\n tr.removeMark(range.from, range.to, markType);\n } else {\n // Check that at least one text node in the selection is in a context that allows links.\n // This correctly handles CellSelection (multiple ranges) and code blocks (marks: '').\n const ctx = { hasApplicableText: false };\n for (const range of ranges) {\n tr.doc.nodesBetween(range.$from.pos, range.$to.pos, (node, _pos, parent) => {\n if (node.isText && parent?.type.allowsMarkType(markType)\n && !node.marks.some((m) => m.type.excludes(markType) && m.type !== markType)) {\n ctx.hasApplicableText = true;\n }\n });\n }\n if (!ctx.hasApplicableText) return false;\n if (!dispatch) return true;\n // Iterate over selection ranges (handles CellSelection with multiple ranges)\n for (const range of ranges) {\n tr.removeMark(range.$from.pos, range.$to.pos, markType);\n }\n }\n\n dispatch(tr);\n return true;\n },\n toggleLink:\n (attributes: LinkAttributes) =>\n ({ tr, state, dispatch }) => {\n if (!isValidUrl(attributes.href, { protocols: this.options.protocols })) {\n return false;\n }\n\n const markType = state.schema.marks['link'];\n if (!markType) return false;\n\n const { empty, ranges } = tr.selection;\n\n if (empty) {\n // Extend to full link range around cursor\n const $pos = tr.doc.resolve(tr.selection.from);\n const range = getMarkRange($pos, markType);\n\n if (range && tr.doc.rangeHasMark(range.from, range.to, markType)) {\n // Has link - remove it from the full range\n if (!dispatch) return true;\n tr.removeMark(range.from, range.to, markType);\n } else {\n // No link - toggle stored mark for cursor\n if (!dispatch) return true;\n const cursorMarks = tr.storedMarks ?? state.storedMarks ?? $pos.marks();\n if (markType.isInSet(cursorMarks)) {\n tr.removeStoredMark(markType);\n } else {\n tr.addStoredMark(markType.create(attributes));\n }\n }\n } else {\n if (!dispatch) return true;\n // Iterate over selection ranges (handles CellSelection with multiple ranges)\n const hasMark = ranges.every(range =>\n tr.doc.rangeHasMark(range.$from.pos, range.$to.pos, markType),\n );\n for (const range of ranges) {\n if (hasMark) {\n tr.removeMark(range.$from.pos, range.$to.pos, markType);\n } else {\n tr.addMark(range.$from.pos, range.$to.pos, markType.create(attributes));\n }\n }\n }\n\n dispatch(tr);\n return true;\n },\n };\n },\n\n addKeyboardShortcuts() {\n return {\n 'Mod-k': () => {\n (this.editor as unknown as Editor).emit('linkEdit', {});\n return true;\n },\n };\n },\n\n addToolbarItems(): ToolbarItem[] {\n return [\n {\n type: 'button',\n name: 'link',\n command: 'unsetLink',\n emitEvent: 'linkEdit',\n isActive: 'link',\n icon: 'link',\n label: 'Link',\n shortcut: 'Mod-K',\n group: 'format',\n priority: 120,\n },\n ];\n },\n\n addProseMirrorPlugins() {\n const markType = this.markType;\n if (!markType) return [];\n\n const plugins = [];\n\n // Click plugin - always added (handles link opening on click)\n // 'whenNotEditable' → true: browser handles read-only links natively\n plugins.push(\n linkClickPlugin({\n type: markType,\n openOnClick: this.options.openOnClick === 'whenNotEditable'\n ? true\n : this.options.openOnClick,\n enableClickSelection: this.options.enableClickSelection,\n })\n );\n\n // Paste plugin - wraps selection or inserts URL as link\n if (this.options.linkOnPaste) {\n plugins.push(\n linkPastePlugin({\n type: markType,\n protocols: this.options.protocols,\n })\n );\n }\n\n // Exit plugin - ArrowRight at end of link exits the mark\n plugins.push(linkExitPlugin({ type: markType }));\n\n // keepOnSplit: strip link from storedMarks after a block split so that\n // pressing Enter at the end of a link does not carry it to the new line.\n plugins.push(\n new Plugin({\n key: new PluginKey('linkKeepOnSplit'),\n appendTransaction(transactions, _oldState, newState) {\n const docChanged = transactions.some((tr) => tr.docChanged);\n if (!docChanged) return null;\n\n const { selection } = newState;\n if (!(selection instanceof TextSelection) || !selection.empty) return null;\n\n const $cursor = selection.$cursor;\n if ($cursor?.parentOffset !== 0) return null;\n\n const stored = newState.storedMarks;\n if (!stored) return null;\n\n const hasLink = stored.some((m) => m.type === markType);\n if (!hasLink) return null;\n\n return newState.tr.setStoredMarks(stored.filter((m) => m.type !== markType));\n },\n })\n );\n\n // Autolink plugin - converts typed URLs to links\n if (this.options.autolink) {\n plugins.push(\n autolinkPlugin({\n type: markType,\n protocols: this.options.protocols,\n defaultProtocol: this.options.defaultProtocol,\n ...(this.options.shouldAutoLink && {\n shouldAutoLink: this.options.shouldAutoLink,\n }),\n })\n );\n }\n\n return plugins;\n },\n});\n\ndeclare module '@domternal/core' {\n interface RawCommands {\n setLink: CommandSpec<[attributes: LinkAttributes]>;\n unsetLink: CommandSpec;\n toggleLink: CommandSpec<[attributes: LinkAttributes]>;\n }\n}\n","/**\n * Subscript Mark\n *\n * Applies subscript formatting to text (e.g., H₂O).\n *\n * @example\n * ```ts\n * import { Subscript } from '@domternal/core';\n *\n * const editor = new Editor({\n * extensions: [Document, Paragraph, Text, Subscript],\n * });\n *\n * // Toggle subscript with keyboard shortcut: Mod-,\n * ```\n */\nimport { Mark } from '../Mark.js';\nimport type { CommandSpec } from '../types/Commands.js';\nimport type { ToolbarItem } from '../types/Toolbar.js';\n\n/**\n * Options for the Subscript mark\n */\nexport interface SubscriptOptions {\n /**\n * HTML attributes to add to the rendered element\n */\n HTMLAttributes: Record<string, unknown>;\n}\n\n/**\n * Subscript mark for text formatting\n */\nexport const Subscript = Mark.create<SubscriptOptions>({\n name: 'subscript',\n\n // Mutual exclusion handled in toggle commands (not schema)\n // so can() dry-run works correctly for toolbar disabled state\n excludes: '',\n\n addOptions() {\n return {\n HTMLAttributes: {},\n };\n },\n\n parseHTML() {\n return [\n { tag: 'sub' },\n {\n style: 'vertical-align',\n getAttrs: (value) => {\n if (typeof value !== 'string') return false;\n return value === 'sub' ? {} : false;\n },\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['sub', { ...this.options.HTMLAttributes, ...HTMLAttributes }, 0];\n },\n\n addKeyboardShortcuts() {\n return {\n 'Mod-,': () => this.editor?.commands['toggleSubscript']?.() ?? false,\n };\n },\n\n addCommands() {\n return {\n setSubscript:\n () =>\n ({ commands }) => {\n commands.unsetMark('superscript');\n return commands.setMark('subscript');\n },\n unsetSubscript:\n () =>\n ({ commands }) => commands.unsetMark('subscript'),\n toggleSubscript:\n () =>\n ({ commands }) => {\n commands.unsetMark('superscript');\n return commands.toggleMark('subscript');\n },\n };\n },\n addToolbarItems(): ToolbarItem[] {\n return [\n {\n type: 'button',\n name: 'subscript',\n command: 'toggleSubscript',\n isActive: 'subscript',\n icon: 'textSubscript',\n label: 'Subscript',\n shortcut: 'Mod-,',\n group: 'format',\n priority: 140,\n },\n ];\n },\n});\n\ndeclare module '@domternal/core' {\n interface RawCommands {\n setSubscript: CommandSpec;\n unsetSubscript: CommandSpec;\n toggleSubscript: CommandSpec;\n }\n}\n","/**\n * Superscript Mark\n *\n * Applies superscript formatting to text (e.g., x²).\n *\n * @example\n * ```ts\n * import { Superscript } from '@domternal/core';\n *\n * const editor = new Editor({\n * extensions: [Document, Paragraph, Text, Superscript],\n * });\n *\n * // Toggle superscript with keyboard shortcut: Mod-.\n * ```\n */\nimport { Mark } from '../Mark.js';\nimport type { CommandSpec } from '../types/Commands.js';\nimport type { ToolbarItem } from '../types/Toolbar.js';\n\n/**\n * Options for the Superscript mark\n */\nexport interface SuperscriptOptions {\n /**\n * HTML attributes to add to the rendered element\n */\n HTMLAttributes: Record<string, unknown>;\n}\n\n/**\n * Superscript mark for text formatting\n */\nexport const Superscript = Mark.create<SuperscriptOptions>({\n name: 'superscript',\n\n // Mutual exclusion handled in toggle commands (not schema)\n // so can() dry-run works correctly for toolbar disabled state\n excludes: '',\n\n addOptions() {\n return {\n HTMLAttributes: {},\n };\n },\n\n parseHTML() {\n return [\n { tag: 'sup' },\n {\n style: 'vertical-align',\n getAttrs: (value) => {\n if (typeof value !== 'string') return false;\n return value === 'super' ? {} : false;\n },\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['sup', { ...this.options.HTMLAttributes, ...HTMLAttributes }, 0];\n },\n\n addKeyboardShortcuts() {\n return {\n 'Mod-.': () => this.editor?.commands['toggleSuperscript']?.() ?? false,\n };\n },\n\n addCommands() {\n return {\n setSuperscript:\n () =>\n ({ commands }) => {\n commands.unsetMark('subscript');\n return commands.setMark('superscript');\n },\n unsetSuperscript:\n () =>\n ({ commands }) => commands.unsetMark('superscript'),\n toggleSuperscript:\n () =>\n ({ commands }) => {\n commands.unsetMark('subscript');\n return commands.toggleMark('superscript');\n },\n };\n },\n addToolbarItems(): ToolbarItem[] {\n return [\n {\n type: 'button',\n name: 'superscript',\n command: 'toggleSuperscript',\n isActive: 'superscript',\n icon: 'textSuperscript',\n label: 'Superscript',\n shortcut: 'Mod-.',\n group: 'format',\n priority: 130,\n },\n ];\n },\n});\n\ndeclare module '@domternal/core' {\n interface RawCommands {\n setSuperscript: CommandSpec;\n unsetSuperscript: CommandSpec;\n toggleSuperscript: CommandSpec;\n }\n}\n","/**\n * TextStyle Mark\n *\n * A \"carrier mark\" for inline text styling. This mark itself has no attributes,\n * but other extensions (TextColor, FontFamily, FontSize) can inject attributes\n * into it via addGlobalAttributes.\n *\n * @example\n * ```ts\n * import { TextStyle, TextColor, FontFamily } from '@domternal/core';\n *\n * const editor = new Editor({\n * extensions: [\n * // ... other extensions\n * TextStyle,\n * TextColor,\n * FontFamily.configure({ fontFamilies: ['Arial', 'Times New Roman'] }),\n * ],\n * });\n *\n * editor.commands.setTextColor('#ff0000');\n * editor.commands.setFontFamily('Arial');\n * ```\n */\nimport { Mark } from '../Mark.js';\nimport type { CommandSpec } from '../types/Commands.js';\n\nexport interface TextStyleOptions {\n /**\n * HTML attributes to add to the rendered element.\n * @default {}\n */\n HTMLAttributes: Record<string, unknown>;\n}\n\nexport const TextStyle = Mark.create<TextStyleOptions>({\n name: 'textStyle',\n\n // Lower priority so it renders after other marks\n priority: 101,\n\n addOptions() {\n return {\n HTMLAttributes: {},\n };\n },\n\n parseHTML() {\n return [\n {\n tag: 'span',\n getAttrs: (element) => {\n if (typeof element === 'string') return false;\n // Accept spans carrying styling: either inline CSS, or named color\n // tokens (data-text-color / data-bg-color) written by token-based\n // pickers such as NotionColorPicker.\n const hasStyles = element.hasAttribute('style');\n const hasColorTokens =\n element.hasAttribute('data-text-color') ||\n element.hasAttribute('data-bg-color');\n if (!hasStyles && !hasColorTokens) return false;\n return {};\n },\n },\n // Parse <mark> elements as textStyle (Highlight extension adds backgroundColor attribute)\n { tag: 'mark' },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['span', { ...this.options.HTMLAttributes, ...HTMLAttributes }, 0];\n },\n\n addCommands() {\n return {\n setTextStyle:\n (attributes: Record<string, unknown>) =>\n ({ commands }) => commands.setMark('textStyle', attributes),\n\n removeTextStyle:\n () =>\n ({ commands }) => commands.unsetMark('textStyle'),\n\n removeEmptyTextStyle:\n () =>\n ({ state, tr, dispatch }) => {\n const { from, to, empty } = tr.selection;\n const markType = this.markType;\n\n if (!markType) return false;\n\n // For empty selection, check stored marks - setMark on empty selection\n // only modifies stored marks, so the document still has the old mark.\n // An empty textStyle stored mark (all attrs null) would cause future\n // typed text to get a meaningless <span> wrapper.\n if (empty) {\n const storedMarks = tr.storedMarks ?? state.storedMarks;\n if (storedMarks) {\n const storedTextStyle = storedMarks.find(m => m.type === markType);\n if (storedTextStyle) {\n const hasNonNullAttr = Object.values(storedTextStyle.attrs).some(\n (val) => val !== null && val !== undefined\n );\n if (!hasNonNullAttr) {\n if (dispatch) {\n tr.removeStoredMark(markType);\n dispatch(tr);\n }\n return true;\n }\n }\n }\n return false;\n }\n\n // Non-empty selection: check document marks\n let hasEmptyTextStyle = false;\n\n tr.doc.nodesBetween(from, to, (node) => {\n const textStyleMark = node.marks.find(\n (mark) => mark.type.name === this.name\n );\n if (textStyleMark) {\n const hasNonNullAttr = Object.values(textStyleMark.attrs).some(\n (val) => val !== null && val !== undefined\n );\n if (!hasNonNullAttr) {\n hasEmptyTextStyle = true;\n }\n }\n });\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (!hasEmptyTextStyle) return false;\n\n if (dispatch) {\n // Only remove textStyle from nodes where ALL attributes are null.\n // A blanket tr.removeMark(from, to) would also strip marks that\n // have active attributes (e.g. color) on adjacent nodes.\n tr.doc.nodesBetween(from, to, (node, pos) => {\n const mark = node.marks.find(m => m.type === markType);\n if (mark) {\n const hasActiveAttr = Object.values(mark.attrs).some(\n v => v !== null && v !== undefined,\n );\n if (!hasActiveAttr) {\n const nodeFrom = Math.max(pos, from);\n const nodeTo = Math.min(pos + node.nodeSize, to);\n tr.removeMark(nodeFrom, nodeTo, markType);\n }\n }\n });\n dispatch(tr);\n }\n\n return true;\n },\n };\n },\n});\n\ndeclare module '@domternal/core' {\n interface RawCommands {\n setTextStyle: CommandSpec<[attributes: Record<string, unknown>]>;\n removeTextStyle: CommandSpec;\n removeEmptyTextStyle: CommandSpec;\n }\n}\n","/**\n * BaseKeymap Extension\n *\n * Adds essential keyboard shortcuts for basic editing operations.\n * This includes Enter (new paragraph), Backspace, Delete, and other\n * fundamental editing commands from ProseMirror's baseKeymap.\n *\n * @example\n * ```ts\n * import { BaseKeymap } from '@domternal/core';\n *\n * const editor = new Editor({\n * extensions: [Document, Paragraph, Text, BaseKeymap],\n * });\n * ```\n *\n * ## Included Shortcuts\n * - Enter: Create new paragraph / split block\n * - Backspace: Delete backward\n * - Delete: Delete forward\n * - Mod-Backspace: Delete to start of line\n * - Mod-Delete: Delete to end of line\n * - Alt-ArrowUp/Down: Join with block above/below\n * - Mod-a: Select all\n * - And more standard editing commands\n */\nimport { Extension } from '../Extension.js';\nimport { keymap } from '@domternal/pm/keymap';\nimport {\n baseKeymap,\n chainCommands,\n createParagraphNear,\n liftEmptyBlock,\n newlineInCode,\n splitBlock,\n} from '@domternal/pm/commands';\nimport type { Command } from '@domternal/pm/state';\n\nexport interface BaseKeymapOptions {\n /**\n * Whether to include the default Enter behavior.\n * @default true\n */\n enter: boolean;\n}\n\n// Enhanced Enter command that handles more cases\nconst enterCommand: Command = chainCommands(\n newlineInCode,\n createParagraphNear,\n liftEmptyBlock,\n splitBlock\n);\n\nexport const BaseKeymap = Extension.create<BaseKeymapOptions>({\n name: 'baseKeymap',\n\n addOptions() {\n return {\n enter: true,\n };\n },\n\n addProseMirrorPlugins() {\n const bindings = { ...baseKeymap };\n\n // Override Enter with our enhanced version if enabled\n if (this.options.enter) {\n bindings['Enter'] = enterCommand;\n }\n\n return [keymap(bindings)];\n },\n});\n","/**\n * History Extension\n *\n * Provides undo/redo functionality using prosemirror-history.\n */\nimport { history, undo, redo } from '@domternal/pm/history';\nimport { Extension } from '../Extension.js';\nimport type { CommandSpec } from '../types/Commands.js';\nimport type { ToolbarItem } from '../types/Toolbar.js';\n\ndeclare module '@domternal/core' {\n interface RawCommands {\n undo: CommandSpec;\n redo: CommandSpec;\n }\n}\n\nexport interface HistoryOptions {\n /**\n * Maximum number of undo steps to keep in history.\n * @default 100\n */\n depth: number;\n\n /**\n * Time in milliseconds to group changes into a single undo step.\n * Changes within this delay will be combined.\n * @default 500\n */\n newGroupDelay: number;\n}\n\nexport const History = Extension.create<HistoryOptions>({\n name: 'history',\n\n addOptions() {\n return {\n depth: 100,\n newGroupDelay: 500,\n };\n },\n\n addCommands() {\n return {\n undo:\n () =>\n ({ state, dispatch }) =>\n undo(state, dispatch),\n\n redo:\n () =>\n ({ state, dispatch }) =>\n redo(state, dispatch),\n };\n },\n\n addToolbarItems(): ToolbarItem[] {\n return [\n {\n type: 'button',\n name: 'undo',\n command: 'undo',\n icon: 'arrowCounterClockwise',\n label: 'Undo',\n shortcut: 'Mod-Z',\n group: 'history',\n priority: 200,\n },\n {\n type: 'button',\n name: 'redo',\n command: 'redo',\n icon: 'arrowClockwise',\n label: 'Redo',\n shortcut: 'Mod-Shift-Z',\n group: 'history',\n priority: 190,\n },\n ];\n },\n\n addKeyboardShortcuts() {\n return {\n 'Mod-z': () => this.editor?.commands.undo() ?? false,\n 'Mod-Shift-z': () => this.editor?.commands.redo() ?? false,\n 'Mod-y': () => this.editor?.commands.redo() ?? false,\n };\n },\n\n addProseMirrorPlugins() {\n return [\n history({\n depth: this.options.depth,\n newGroupDelay: this.options.newGroupDelay,\n }),\n ];\n },\n});\n","/**\n * Dropcursor Extension\n *\n * Shows a visual indicator when dragging content to help users\n * see where the content will be dropped.\n */\nimport { dropCursor } from '@domternal/pm/dropcursor';\nimport { Extension } from '../Extension.js';\n\nexport interface DropcursorOptions {\n /**\n * Color of the drop cursor line.\n * @default 'currentColor'\n */\n color: string;\n\n /**\n * Width of the drop cursor line in pixels.\n * @default 1\n */\n width: number;\n\n /**\n * CSS class to add to the drop cursor element.\n * @default undefined\n */\n class?: string;\n}\n\nexport const Dropcursor = Extension.create<DropcursorOptions>({\n name: 'dropcursor',\n\n addOptions() {\n return {\n color: 'currentColor',\n width: 1,\n };\n },\n\n addProseMirrorPlugins() {\n return [\n dropCursor({\n color: this.options.color,\n width: this.options.width,\n ...(this.options.class ? { class: this.options.class } : {}),\n }),\n ];\n },\n});\n","/**\n * Gapcursor Extension\n *\n * Allows cursor to be placed in positions that normally wouldn't accept text,\n * like before/after tables or other block nodes.\n */\nimport { gapCursor } from '@domternal/pm/gapcursor';\nimport { Extension } from '../Extension.js';\n\nexport const Gapcursor = Extension.create({\n name: 'gapcursor',\n\n addProseMirrorPlugins() {\n return [gapCursor()];\n },\n});\n","/**\n * TrailingNode Extension\n *\n * Ensures there's always a trailing node (usually paragraph) at the end\n * of the document, making it easier to type after block elements like\n * code blocks, images, or tables.\n */\nimport { Plugin, PluginKey } from '@domternal/pm/state';\nimport type { NodeType } from '@domternal/pm/model';\nimport { Extension } from '../Extension.js';\n\nexport interface TrailingNodeOptions {\n /**\n * The node type name to insert as trailing node.\n * @default 'paragraph'\n */\n node: string;\n\n /**\n * Node types after which a trailing node should NOT be added.\n * Typically includes the trailing node type itself.\n * @default ['paragraph']\n */\n notAfter: string[];\n}\n\nconst trailingNodeKey = new PluginKey('trailingNode');\n\nexport const TrailingNode = Extension.create<TrailingNodeOptions>({\n name: 'trailingNode',\n\n addOptions() {\n return {\n node: 'paragraph',\n notAfter: ['paragraph'],\n };\n },\n\n addProseMirrorPlugins(): Plugin[] {\n const { node: nodeName, notAfter } = this.options;\n const ignoredNames = new Set([...notAfter, nodeName]);\n let type: NodeType;\n let triggerTypes: NodeType[];\n\n return [\n new Plugin({\n key: trailingNodeKey,\n appendTransaction(_, __, state) {\n if (!trailingNodeKey.getState(state)) return;\n return state.tr.insert(state.doc.content.size, type.create());\n },\n state: {\n init(_, { doc, schema }) {\n const nodeType = schema.nodes[nodeName];\n if (!nodeType) {\n throw new Error(`TrailingNode: invalid node type '${nodeName}'`);\n }\n type = nodeType;\n triggerTypes = Object.values(schema.nodes)\n .filter((n) => !ignoredNames.has(n.name));\n const lastType = doc.lastChild?.type;\n return !!lastType && triggerTypes.includes(lastType);\n },\n apply(tr, value) {\n if (!tr.docChanged) return value;\n const lastType = tr.doc.lastChild?.type;\n return !!lastType && triggerTypes.includes(lastType);\n },\n },\n }),\n ];\n },\n});\n","/**\n * Placeholder Extension\n *\n * Shows placeholder text when the editor is empty.\n * Supports both static and dynamic (function-based) placeholders.\n */\nimport { Plugin, PluginKey } from '@domternal/pm/state';\nimport { Decoration, DecorationSet } from '@domternal/pm/view';\nimport type { Node as PMNode } from '@domternal/pm/model';\nimport { Extension } from '../Extension.js';\n\nexport interface PlaceholderOptions {\n /**\n * Placeholder text to show. Can be a string or function for per-node placeholders.\n * @default 'Write something …'\n */\n placeholder: string | ((props: { node: PMNode; pos: number }) => string);\n\n /**\n * Only show placeholder when editor is editable.\n * @default true\n */\n showOnlyWhenEditable: boolean;\n\n /**\n * CSS class applied to empty nodes.\n * @default 'is-empty'\n */\n emptyNodeClass: string;\n\n /**\n * CSS class applied when entire editor is empty.\n * @default 'is-editor-empty'\n */\n emptyEditorClass: string;\n\n /**\n * Show placeholder only in the currently focused/selected node.\n * @default true\n */\n showOnlyCurrent: boolean;\n\n /**\n * Include children when checking if a node is empty.\n * @default false\n */\n includeChildren: boolean;\n}\n\nexport const placeholderPluginKey = new PluginKey('placeholder');\n\nexport const Placeholder = Extension.create<PlaceholderOptions>({\n name: 'placeholder',\n\n addOptions() {\n return {\n placeholder: 'Write something …',\n showOnlyWhenEditable: true,\n emptyNodeClass: 'is-empty',\n emptyEditorClass: 'is-editor-empty',\n showOnlyCurrent: true,\n includeChildren: false,\n };\n },\n\n addProseMirrorPlugins() {\n return [\n new Plugin({\n key: placeholderPluginKey,\n props: {\n decorations: ({ doc, selection }) => {\n const editor = this.editor;\n if (!editor?.view) return DecorationSet.empty;\n const isEditable = editor.view.editable;\n\n if (!isEditable && this.options.showOnlyWhenEditable) {\n return DecorationSet.empty;\n }\n\n // Check if document is empty (for editor-level class)\n const isDocEmpty =\n doc.childCount === 1 &&\n doc.firstChild?.isTextblock &&\n doc.firstChild.content.size === 0;\n\n const { includeChildren, showOnlyCurrent, emptyNodeClass, emptyEditorClass } = this.options;\n\n const isNodeEmpty = (node: PMNode): boolean =>\n includeChildren\n ? node.content.size === 0\n : node.childCount === 0 ||\n (node.childCount === 1 &&\n !!node.firstChild?.isText &&\n !node.firstChild.text);\n\n const getPlaceholderText = (node: PMNode, pos: number): string =>\n typeof this.options.placeholder === 'function'\n ? this.options.placeholder({ node, pos })\n : this.options.placeholder;\n\n const makeDecoration = (node: PMNode, pos: number): Decoration =>\n Decoration.node(pos, pos + node.nodeSize, {\n class: `${emptyNodeClass}${isDocEmpty ? ` ${emptyEditorClass}` : ''}`,\n 'data-placeholder': getPlaceholderText(node, pos),\n });\n\n // Fast path: showOnlyCurrent (default) - O(1), check only the anchor node\n if (showOnlyCurrent) {\n const { $anchor } = selection;\n if ($anchor.depth === 0) return DecorationSet.empty;\n const node = $anchor.parent;\n if (!node.isTextblock || !isNodeEmpty(node)) return DecorationSet.empty;\n const pos = $anchor.before($anchor.depth);\n return DecorationSet.create(doc, [makeDecoration(node, pos)]);\n }\n\n // Slow path: show placeholder in all empty textblocks\n const decorations: Decoration[] = [];\n doc.descendants((node, pos) => {\n if (!node.isTextblock) return;\n if (!isNodeEmpty(node)) return;\n decorations.push(makeDecoration(node, pos));\n });\n\n return DecorationSet.create(doc, decorations);\n },\n },\n }),\n ];\n },\n});\n","/**\n * Keyboard indent across list boundaries. `Tab` on a top-level block whose\n * previous sibling is a list moves the block INTO the last item as a nested\n * child; `Shift-Tab` reverses for a block sitting as the last child of the\n * last item.\n *\n * Trigger is intentionally narrow so ListKeymap retains in-list Tab/Shift-Tab\n * (`sinkListItem` / `liftListItem`). Schema is validated via `canReplaceWith`;\n * invalid placements are a clean no-op so the keymap chain falls through.\n *\n * Intentional design restrictions (NOT bugs to \"fix\"):\n * - Tab indents into the IMMEDIATE last item only, not recursively into a\n * deeper \"deepest last item\". Users get deeper nesting via repeated Tab\n * inside the now-nested context (then ListKeymap takes over).\n * - Tab only fires for cursors in TOP-LEVEL blocks (depth === 1). Cursors\n * inside other containers (blockquote, table cell) fall through.\n * - Shift-Tab only fires when the block is BOTH the last child of its\n * item AND the item is the last in its wrapper. Mid-position outdent\n * would require splitting the list item, which is deferred.\n *\n * Registration order: must come AFTER ListKeymap so this extension's keymap\n * runs FIRST and can defer to ListKeymap for in-list flows.\n */\nimport { Extension } from '../Extension.js';\nimport { NodeSelection, Selection } from '@domternal/pm/state';\nimport type { EditorState, Transaction } from '@domternal/pm/state';\nimport type { Node as PMNode } from '@domternal/pm/model';\nimport { insertAsListItemChild } from '../utils/insertAsListItemChild.js';\n\nconst LIST_ITEM_TYPES = new Set(['listItem', 'taskItem']);\nconst LIST_WRAPPER_TYPES = new Set(['bulletList', 'orderedList', 'taskList']);\n\n/**\n * Returns true when ANY ancestor of the cursor's resolved position is\n * a list item. Used to defer Tab/Shift-Tab to ListKeymap whenever the\n * cursor is somewhere inside a list (nested heading, label paragraph,\n * deeply nested block, etc.).\n */\nfunction isCursorInsideListItem(state: EditorState): boolean {\n const { $from } = state.selection;\n for (let d = $from.depth; d > 0; d--) {\n if (LIST_ITEM_TYPES.has($from.node(d).type.name)) return true;\n }\n return false;\n}\n\n/**\n * `Tab` handler: indent a top-level block as the last child of the\n * last item of the immediately-preceding list wrapper. Returns true\n * when the operation succeeded (and dispatched, if `dispatch` is\n * provided), false when any precondition fails so the keymap chain\n * can fall through to the next handler.\n */\nexport function indentBlockAsListChild(\n state: EditorState,\n dispatch?: (tr: Transaction) => void,\n): boolean {\n const { selection } = state;\n\n // Identify the top-level \"subject\" block to indent. Two paths:\n // - TextSelection with empty caret in a top-level textblock: the\n // block is the cursor's depth-1 ancestor.\n // - NodeSelection on a top-level atom block (hr, image, etc.):\n // user explicitly selected the block; treat it as the subject.\n // Anything else (range selection, deeper nesting, in-list-item)\n // bails so the keymap chain falls through.\n let blockIndex: number;\n let blockNode: PMNode;\n let blockStart: number;\n let blockEnd: number;\n\n if (selection instanceof NodeSelection) {\n const node = selection.node;\n const $pos = selection.$from;\n // Atom block selected at top-level: the selected node is a direct\n // child of the doc; the parent depth is 0.\n if ($pos.depth !== 0) return false;\n if (isCursorInsideListItem(state)) return false;\n blockIndex = $pos.index(0);\n blockNode = node;\n blockStart = selection.from;\n blockEnd = selection.to;\n } else {\n if (!selection.empty) return false;\n if (isCursorInsideListItem(state)) return false;\n const { $from } = selection;\n if ($from.depth !== 1) return false;\n blockIndex = $from.index(0);\n blockNode = $from.node(1);\n blockStart = $from.before(1);\n blockEnd = $from.after(1);\n }\n\n if (blockIndex === 0) return false;\n\n const prevSibling = state.doc.child(blockIndex - 1);\n if (!LIST_WRAPPER_TYPES.has(prevSibling.type.name)) return false;\n\n // Position of the previous sibling (= the list wrapper) at the doc\n // level. Pre-computed here so a dry-run (no dispatch) and the\n // dispatch path share the same value.\n let wrapperPos = 0;\n for (let i = 0; i < blockIndex - 1; i++) {\n wrapperPos += state.doc.child(i).nodeSize;\n }\n\n const tr = state.tr;\n const result = insertAsListItemChild({\n tr,\n wrapperPos,\n blockNode,\n sourceRange: { from: blockStart, to: blockEnd },\n });\n if (!result.ok || result.insertedAt === undefined) return false;\n if (!dispatch) return true;\n\n // Caret in the (now nested) block at offset 0 of its content.\n tr.setSelection(Selection.near(tr.doc.resolve(result.insertedAt + 1)));\n dispatch(tr.scrollIntoView());\n return true;\n}\n\n/**\n * `Shift-Tab` handler: lift a non-label nested block out of its list\n * item to become a top-level sibling AFTER the list wrapper. Only\n * fires for the strict end-of-end case (last child of last item) so\n * the lift is deterministic and never needs to split a list item.\n *\n * Precondition table:\n * - cursor empty\n * - cursor textblock parent is NOT a paragraph (so we never\n * accidentally outdent the label; ListKeymap.Shift-Tab handles\n * in-label cases via liftListItem)\n * - the cursor's enclosing list item exists in the ancestry\n * - the cursor's containing block is a DIRECT child of the list\n * item (depth = listItemDepth + 1) - keeps the math local to\n * immediate li children rather than reaching deeper into nested\n * containers\n * - the block is the LAST child of the list item\n * - the list item is the LAST child of its wrapper\n * - the wrapper's parent accepts the block as a sibling (schema)\n */\nexport function outdentBlockFromListItem(\n state: EditorState,\n dispatch?: (tr: Transaction) => void,\n): boolean {\n const { selection } = state;\n if (!selection.empty) return false;\n\n const { $from } = selection;\n\n // Find the immediate list item ancestor.\n let listItemDepth = -1;\n for (let d = $from.depth; d > 0; d--) {\n if (LIST_ITEM_TYPES.has($from.node(d).type.name)) {\n listItemDepth = d;\n break;\n }\n }\n if (listItemDepth === -1) return false;\n\n // The block to outdent is the DIRECT child of the list item that\n // contains the cursor - identified by walking from the cursor's\n // depth down to listItemDepth + 1. The cursor itself can be deeper\n // (e.g. cursor in a paragraph INSIDE a blockquote that sits as a\n // direct li child); we still treat the blockquote as the subject.\n const blockDepth = listItemDepth + 1;\n if ($from.depth < blockDepth) return false;\n\n const listItem = $from.node(listItemDepth);\n const blockIndexInItem = $from.index(listItemDepth);\n // Skip first-child (the label paragraph slot). Defers the in-label\n // case to ListKeymap.Shift-Tab (`liftListItem`).\n if (blockIndexInItem === 0) return false;\n // MVP: only outdent when the block is the LAST child of the item.\n if (blockIndexInItem !== listItem.childCount - 1) return false;\n\n // List item must be the LAST in its wrapper. (Wrapper is the parent\n // of the list item, which sits at depth = listItemDepth - 1.)\n const wrapperDepth = listItemDepth - 1;\n if (wrapperDepth < 0) return false;\n // Use $from.index(wrapperDepth) - the list item's index inside the\n // wrapper. (A previous attempt used `wrapperDepth - 1` here, which\n // returns the wrapper's index in ITS parent - the wrong number.)\n const liIndexInWrapper = $from.index(wrapperDepth);\n const wrapper = $from.node(wrapperDepth);\n if (liIndexInWrapper !== wrapper.childCount - 1) return false;\n\n // Schema check: can the wrapper's parent accept the block as a\n // sibling right AFTER the wrapper?\n // `wrapperDepth - 1` may equal -1 only when the wrapper sits at\n // depth 0 - i.e. the wrapper IS the doc itself. The schema disallows\n // this, but we guard defensively below.\n if (wrapperDepth - 1 < 0) return false;\n const wrapperParent = $from.node(wrapperDepth - 1);\n const wrapperIndexInParent = $from.index(wrapperDepth - 1);\n const blockNode = $from.node(blockDepth);\n if (\n !wrapperParent.canReplaceWith(\n wrapperIndexInParent + 1,\n wrapperIndexInParent + 1,\n blockNode.type,\n )\n ) {\n return false;\n }\n\n if (!dispatch) return true;\n\n const blockStart = $from.before(blockDepth);\n const blockEnd = $from.after(blockDepth);\n const wrapperEnd = $from.after(wrapperDepth);\n\n const tr = state.tr;\n // Delete the block from inside the list item; positions AFTER the\n // delete shift left by `blockEnd - blockStart`. The wrapper end\n // sits AFTER the deleted range so we adjust it.\n const blockSize = blockEnd - blockStart;\n tr.delete(blockStart, blockEnd);\n const insertAt = wrapperEnd - blockSize;\n tr.insert(insertAt, blockNode);\n // Caret at offset 0 of the lifted block's content.\n tr.setSelection(Selection.near(tr.doc.resolve(insertAt + 1)));\n dispatch(tr.scrollIntoView());\n return true;\n}\n\nexport const ListIndent = Extension.create({\n name: 'listIndent',\n\n addKeyboardShortcuts() {\n const { editor } = this;\n return {\n Tab: () => {\n if (!editor) return false;\n return indentBlockAsListChild(editor.state, editor.view.dispatch);\n },\n 'Shift-Tab': () => {\n if (!editor) return false;\n return outdentBlockFromListItem(editor.state, editor.view.dispatch);\n },\n };\n },\n});\n","/**\n * CharacterCount Extension\n *\n * Provides character and word counting with optional limits.\n * Access counts via editor.storage.characterCount.characters() and .words()\n */\nimport { Plugin, PluginKey } from '@domternal/pm/state';\nimport { Extension } from '../Extension.js';\n\nexport interface CharacterCountOptions {\n /**\n * Maximum number of characters allowed. Set to null for no limit.\n * @default null\n */\n limit: number | null;\n\n /**\n * Maximum number of words allowed. Set to null for no limit.\n * @default null\n */\n wordLimit: number | null;\n\n /**\n * How to count characters:\n * - 'textSize': Count text characters only\n * - 'nodeSize': Count ProseMirror node size (includes structural characters)\n * @default 'textSize'\n */\n mode: 'textSize' | 'nodeSize';\n}\n\nexport interface CharacterCountStorage {\n /**\n * Get current character count.\n */\n characters: () => number;\n\n /**\n * Get current word count.\n */\n words: () => number;\n\n /**\n * Get percentage of limit used (0-100). Returns 0 if no limit.\n */\n percentage: () => number;\n\n /**\n * Get remaining characters before limit. Returns Infinity if no limit.\n */\n remaining: () => number;\n\n /**\n * Get percentage of word limit used (0-100). Returns 0 if no word limit.\n */\n wordPercentage: () => number;\n\n /**\n * Get remaining words before limit. Returns Infinity if no word limit.\n */\n wordRemaining: () => number;\n\n /**\n * Check if limit is exceeded.\n */\n isLimitExceeded: () => boolean;\n}\n\nexport const characterCountPluginKey = new PluginKey('characterCount');\n\nexport const CharacterCount = Extension.create<\n CharacterCountOptions,\n CharacterCountStorage\n>({\n name: 'characterCount',\n\n addOptions() {\n return {\n limit: null,\n wordLimit: null,\n mode: 'textSize',\n };\n },\n\n addStorage() {\n return {\n characters: () => 0,\n words: () => 0,\n percentage: () => 0,\n remaining: () => Infinity,\n wordPercentage: () => 0,\n wordRemaining: () => Infinity,\n isLimitExceeded: () => false,\n };\n },\n\n onCreate() {\n const getCharacters = (): number => {\n const doc = this.editor?.view.state.doc;\n if (!doc) return 0;\n\n if (this.options.mode === 'nodeSize') {\n return doc.nodeSize;\n }\n\n return doc.textContent.length;\n };\n\n const getWords = (): number => {\n const doc = this.editor?.view.state.doc;\n if (!doc) return 0;\n\n const text = doc.textContent;\n const words = text.split(/\\s+/).filter((word) => word.length > 0);\n return words.length;\n };\n\n this.storage.characters = getCharacters;\n this.storage.words = getWords;\n\n this.storage.percentage = () => {\n if (this.options.limit === null) return 0;\n const chars = getCharacters();\n return Math.min(100, Math.round((chars / this.options.limit) * 100));\n };\n\n this.storage.remaining = () => {\n if (this.options.limit === null) return Infinity;\n return Math.max(0, this.options.limit - getCharacters());\n };\n\n this.storage.wordPercentage = () => {\n if (this.options.wordLimit === null) return 0;\n const words = getWords();\n return Math.min(100, Math.round((words / this.options.wordLimit) * 100));\n };\n\n this.storage.wordRemaining = () => {\n if (this.options.wordLimit === null) return Infinity;\n return Math.max(0, this.options.wordLimit - getWords());\n };\n\n this.storage.isLimitExceeded = () => {\n if (this.options.limit !== null) {\n if (getCharacters() > this.options.limit) return true;\n }\n if (this.options.wordLimit !== null) {\n if (getWords() > this.options.wordLimit) return true;\n }\n return false;\n };\n },\n\n addProseMirrorPlugins() {\n const { limit, wordLimit, mode } = this.options;\n\n // If no limits, no need for filtering plugin\n if (limit === null && wordLimit === null) return [];\n\n return [\n new Plugin({\n key: characterCountPluginKey,\n filterTransaction: (transaction) => {\n // Allow non-document changes (selection, etc.)\n if (!transaction.docChanged) return true;\n\n const newDoc = transaction.doc;\n\n // Character limit check - use same counting mode as characters()\n if (limit !== null) {\n const count = mode === 'nodeSize'\n ? newDoc.nodeSize\n : newDoc.textContent.length;\n if (count > limit) return false;\n }\n\n // Word limit check\n if (wordLimit !== null) {\n const words = newDoc.textContent.split(/\\s+/).filter((w) => w.length > 0);\n if (words.length > wordLimit) {\n return false;\n }\n }\n\n return true;\n },\n }),\n ];\n },\n});\n","/**\n * Typography Extension\n *\n * Provides automatic typographic replacements via input rules:\n * - -- → — (em-dash)\n * - ... → … (ellipsis)\n * - Smart quotes\n * - Arrows, fractions, symbols\n */\nimport { InputRule } from '@domternal/pm/inputrules';\nimport { textInputRule } from '../helpers/textInputRule.js';\nimport { Extension } from '../Extension.js';\n\nexport interface TypographyOptions {\n /**\n * Enable em-dash replacement (-- → —)\n * @default true\n */\n emDash: boolean;\n\n /**\n * Enable ellipsis replacement (... → …)\n * @default true\n */\n ellipsis: boolean;\n\n /**\n * Enable arrow replacements (<- → ←, -> → →)\n * @default true\n */\n arrows: boolean;\n\n /**\n * Enable fraction replacements (1/2 → ½, 1/4 → ¼, 3/4 → ¾)\n * @default true\n */\n fractions: boolean;\n\n /**\n * Enable symbol replacements ((c) → ©, (r) → ®, (tm) → ™)\n * @default true\n */\n symbols: boolean;\n\n /**\n * Enable math replacements (+/- → ±, != → ≠)\n * @default true\n */\n math: boolean;\n\n /**\n * Enable guillemet replacements (<< → «, >> → »)\n * @default true\n */\n guillemets: boolean;\n\n /**\n * Enable smart quote replacements (\"text\" → \"text\", 'text' → 'text')\n * @default true\n */\n smartQuotes: boolean;\n\n /**\n * Opening double quote character.\n * @default '\"'\n */\n openDoubleQuote: string;\n\n /**\n * Closing double quote character.\n * @default '\"'\n */\n closeDoubleQuote: string;\n\n /**\n * Opening single quote character.\n * @default '''\n */\n openSingleQuote: string;\n\n /**\n * Closing single quote character.\n * @default '''\n */\n closeSingleQuote: string;\n}\n\nexport const Typography = Extension.create<TypographyOptions>({\n name: 'typography',\n\n addOptions() {\n return {\n emDash: true,\n ellipsis: true,\n arrows: true,\n fractions: true,\n symbols: true,\n math: true,\n guillemets: true,\n smartQuotes: true,\n openDoubleQuote: '\\u201C', // \"\n closeDoubleQuote: '\\u201D', // \"\n openSingleQuote: '\\u2018', // '\n closeSingleQuote: '\\u2019', // '\n };\n },\n\n addInputRules() {\n const rules: InputRule[] = [];\n\n if (this.options.emDash) {\n rules.push(textInputRule({ find: /--$/, replace: '\\u2014' })); // -- → —\n }\n\n if (this.options.ellipsis) {\n rules.push(textInputRule({ find: /\\.\\.\\.$/, replace: '\\u2026' })); // ... → …\n }\n\n if (this.options.arrows) {\n rules.push(textInputRule({ find: /<-$/, replace: '\\u2190' })); // <- → ←\n rules.push(textInputRule({ find: /->$/, replace: '\\u2192' })); // -> → →\n rules.push(textInputRule({ find: /=>$/, replace: '\\u21D2' })); // => → ⇒\n }\n\n if (this.options.fractions) {\n rules.push(textInputRule({ find: /1\\/2$/, replace: '\\u00BD' })); // 1/2 → ½\n rules.push(textInputRule({ find: /1\\/4$/, replace: '\\u00BC' })); // 1/4 → ¼\n rules.push(textInputRule({ find: /3\\/4$/, replace: '\\u00BE' })); // 3/4 → ¾\n rules.push(textInputRule({ find: /1\\/3$/, replace: '\\u2153' })); // 1/3 → ⅓\n rules.push(textInputRule({ find: /2\\/3$/, replace: '\\u2154' })); // 2/3 → ⅔\n }\n\n if (this.options.symbols) {\n rules.push(textInputRule({ find: /\\(c\\)$/i, replace: '\\u00A9' })); // (c) → ©\n rules.push(textInputRule({ find: /\\(r\\)$/i, replace: '\\u00AE' })); // (r) → ®\n rules.push(textInputRule({ find: /\\(tm\\)$/i, replace: '\\u2122' })); // (tm) → ™\n rules.push(textInputRule({ find: /\\(sm\\)$/i, replace: '\\u2120' })); // (sm) → ℠\n }\n\n if (this.options.math) {\n rules.push(textInputRule({ find: /\\+\\/-$/, replace: '\\u00B1' })); // +/- → ±\n rules.push(textInputRule({ find: /!=$/, replace: '\\u2260' })); // != → ≠\n rules.push(textInputRule({ find: /<=$/, replace: '\\u2264' })); // <= → ≤\n rules.push(textInputRule({ find: />=$/, replace: '\\u2265' })); // >= → ≥\n }\n\n if (this.options.guillemets) {\n rules.push(textInputRule({ find: /<<$/, replace: '\\u00AB' })); // << → «\n rules.push(textInputRule({ find: />>$/, replace: '\\u00BB' })); // >> → »\n }\n\n // Smart quotes (need match groups, can't use textReplace)\n if (this.options.smartQuotes) {\n const { openDoubleQuote, closeDoubleQuote, openSingleQuote, closeSingleQuote } = this.options;\n\n // \"text\" → \"text\" (double quotes)\n rules.push(\n new InputRule(/\"([^\"]+)\"$/, (state, match, start, end) => {\n const text = match[1] ?? '';\n return state.tr.replaceWith(\n start,\n end,\n state.schema.text(openDoubleQuote + text + closeDoubleQuote)\n );\n })\n );\n\n // 'text' → 'text' (single quotes - only when clearly a quote pair)\n // Use pattern to avoid matching apostrophes in contractions\n rules.push(\n new InputRule(/(?:^|[\\s([{])'([^']+)'$/, (state, match, start, end) => {\n const text = match[1] ?? '';\n const prefix = match[0].charAt(0);\n // If there's a prefix character (space, bracket, etc.), keep it\n const hasPrefix = prefix !== \"'\";\n return state.tr.replaceWith(\n start,\n end,\n state.schema.text(\n hasPrefix\n ? prefix + openSingleQuote + text + closeSingleQuote\n : openSingleQuote + text + closeSingleQuote\n )\n );\n })\n );\n }\n\n return rules;\n },\n});\n","/**\n * TextAlign Extension\n *\n * Adds text alignment capabilities to specified node types.\n * Uses addGlobalAttributes to inject textAlign attribute into nodes.\n */\nimport { Extension } from '../Extension.js';\nimport type { CommandSpec } from '../types/Commands.js';\nimport type { ToolbarItem } from '../types/Toolbar.js';\n\ndeclare module '@domternal/core' {\n interface RawCommands {\n setTextAlign: CommandSpec<[alignment: string]>;\n unsetTextAlign: CommandSpec;\n }\n}\n\nexport interface TextAlignOptions {\n /**\n * Node types that can have text alignment.\n * @default ['heading', 'paragraph']\n */\n types: string[];\n\n /**\n * Allowed alignment values.\n * @default ['left', 'center', 'right', 'justify']\n */\n alignments: string[];\n\n /**\n * Default alignment value.\n * @default 'left'\n */\n defaultAlignment: string;\n}\n\nexport const TextAlign = Extension.create<TextAlignOptions>({\n name: 'textAlign',\n\n addOptions() {\n return {\n types: ['heading', 'paragraph'],\n alignments: ['left', 'center', 'right', 'justify'],\n defaultAlignment: 'left',\n };\n },\n\n addGlobalAttributes() {\n return [\n {\n types: this.options.types,\n attributes: {\n textAlign: {\n default: this.options.defaultAlignment,\n parseHTML: (element: HTMLElement) =>\n element.style.textAlign || this.options.defaultAlignment,\n renderHTML: (attributes: Record<string, unknown>) => {\n const textAlign = attributes['textAlign'] as string;\n if (textAlign === this.options.defaultAlignment) {\n return null;\n }\n return { style: `text-align: ${textAlign}` };\n },\n },\n },\n },\n ];\n },\n\n addCommands() {\n return {\n setTextAlign:\n (alignment: string) =>\n ({ commands }) => {\n if (!this.options.alignments.includes(alignment)) {\n return false;\n }\n\n return this.options.types\n .map((type) => commands.updateAttributes(type, { textAlign: alignment }))\n .some(Boolean);\n },\n\n unsetTextAlign:\n () =>\n ({ commands }) => {\n return this.options.types\n .map((type) => commands.resetAttributes(type, 'textAlign'))\n .some(Boolean);\n },\n };\n },\n\n addKeyboardShortcuts() {\n return {\n 'Mod-Shift-l': () =>\n this.editor?.commands.setTextAlign('left') ?? false,\n 'Mod-Shift-e': () =>\n this.editor?.commands.setTextAlign('center') ?? false,\n 'Mod-Shift-r': () =>\n this.editor?.commands.setTextAlign('right') ?? false,\n 'Mod-Shift-j': () =>\n this.editor?.commands.setTextAlign('justify') ?? false,\n };\n },\n\n addToolbarItems(): ToolbarItem[] {\n const types = this.options.types;\n const makeActive = (alignment: string): { name: string; attributes: Record<string, unknown> }[] =>\n types.map((t) => ({ name: t, attributes: { textAlign: alignment } }));\n\n return [\n {\n type: 'dropdown',\n name: 'textAlign',\n icon: 'textAlignLeft',\n label: 'Text Alignment',\n group: 'alignment',\n priority: 200,\n dynamicIcon: true,\n items: [\n {\n type: 'button',\n name: 'alignLeft',\n command: 'setTextAlign',\n commandArgs: ['left'],\n isActive: makeActive('left'),\n icon: 'textAlignLeft',\n label: 'Align Left',\n shortcut: 'Mod-Shift-L',\n },\n {\n type: 'button',\n name: 'alignCenter',\n command: 'setTextAlign',\n commandArgs: ['center'],\n isActive: makeActive('center'),\n icon: 'textAlignCenter',\n label: 'Align Center',\n shortcut: 'Mod-Shift-E',\n },\n {\n type: 'button',\n name: 'alignRight',\n command: 'setTextAlign',\n commandArgs: ['right'],\n isActive: makeActive('right'),\n icon: 'textAlignRight',\n label: 'Align Right',\n shortcut: 'Mod-Shift-R',\n },\n {\n type: 'button',\n name: 'alignJustify',\n command: 'setTextAlign',\n commandArgs: ['justify'],\n isActive: makeActive('justify'),\n icon: 'textAlignJustify',\n label: 'Justify',\n shortcut: 'Mod-Shift-J',\n },\n ],\n },\n ];\n },\n});\n","/**\n * Focus Extension\n *\n * Adds CSS classes to nodes that contain the current selection.\n * Useful for highlighting the focused paragraph or block.\n */\nimport { Plugin, PluginKey } from '@domternal/pm/state';\nimport { Decoration, DecorationSet } from '@domternal/pm/view';\nimport { Extension } from '../Extension.js';\n\nexport interface FocusOptions {\n /**\n * CSS class to add to focused nodes.\n * @default 'has-focus'\n */\n className: string;\n\n /**\n * Which nodes to mark as focused:\n * - 'all': All nodes containing the selection\n * - 'deepest': Only the innermost focused node\n * - 'shallowest': Only the outermost focused node\n * @default 'all'\n */\n mode: 'all' | 'deepest' | 'shallowest';\n}\n\nexport const focusPluginKey = new PluginKey('focus');\n\nexport const Focus = Extension.create<FocusOptions>({\n name: 'focus',\n\n addOptions() {\n return {\n className: 'has-focus',\n mode: 'all',\n };\n },\n\n addProseMirrorPlugins() {\n return [\n new Plugin({\n key: focusPluginKey,\n props: {\n decorations: ({ doc, selection }) => {\n const { from, to } = selection;\n const decorations: Decoration[] = [];\n const focusedNodes: { pos: number; nodeSize: number }[] = [];\n\n // Collect all nodes containing the selection\n doc.nodesBetween(from, to, (node, pos) => {\n if (node.isText) return;\n\n // Check if this node actually contains part of the selection\n const nodeEnd = pos + node.nodeSize;\n if (pos <= to && nodeEnd >= from) {\n focusedNodes.push({ pos, nodeSize: node.nodeSize });\n }\n });\n\n if (focusedNodes.length === 0) {\n return DecorationSet.empty;\n }\n\n // Apply mode filtering\n let nodesToDecorate = focusedNodes;\n\n if (this.options.mode === 'deepest') {\n // Only the innermost (last) node\n const last = focusedNodes[focusedNodes.length - 1];\n nodesToDecorate = last ? [last] : [];\n } else if (this.options.mode === 'shallowest') {\n // Only the outermost (first) node\n const first = focusedNodes[0];\n nodesToDecorate = first ? [first] : [];\n }\n\n // Create decorations\n for (const { pos, nodeSize } of nodesToDecorate) {\n decorations.push(\n Decoration.node(pos, pos + nodeSize, {\n class: this.options.className,\n })\n );\n }\n\n return DecorationSet.create(doc, decorations);\n },\n },\n }),\n ];\n },\n});\n","/**\n * LineHeight Extension\n *\n * Adds line height styling to block nodes.\n *\n * @example\n * ```ts\n * import { LineHeight } from '@domternal/core';\n *\n * const editor = new Editor({\n * extensions: [\n * // ... other extensions\n * LineHeight.configure({\n * types: ['paragraph', 'heading'],\n * lineHeights: ['1', '1.5', '2'],\n * }),\n * ],\n * });\n *\n * editor.commands.setLineHeight('1.5');\n * editor.commands.unsetLineHeight();\n * ```\n */\nimport { Extension } from '../Extension.js';\nimport type { CommandSpec } from '../types/Commands.js';\nimport type { ToolbarItem } from '../types/Toolbar.js';\n\ndeclare module '@domternal/core' {\n interface RawCommands {\n setLineHeight: CommandSpec<[lineHeight: string]>;\n unsetLineHeight: CommandSpec;\n }\n}\n\nexport interface LineHeightOptions {\n /**\n * Node types that should support line height.\n * @default ['paragraph', 'heading']\n */\n types: string[];\n\n /**\n * List of allowed line heights (e.g., ['1', '1.5', '2']).\n * If empty, all values are allowed.\n * @default ['1', '1.15', '1.25', '1.5', '2']\n */\n lineHeights: string[];\n\n /**\n * Default line height value.\n * @default null\n */\n defaultLineHeight: string | null;\n}\n\nexport const LineHeight = Extension.create<LineHeightOptions>({\n name: 'lineHeight',\n\n addOptions() {\n return {\n types: ['paragraph', 'heading'],\n lineHeights: ['1', '1.15', '1.25', '1.5', '2'],\n defaultLineHeight: null,\n };\n },\n\n addGlobalAttributes() {\n return [\n {\n types: this.options.types,\n attributes: {\n lineHeight: {\n default: this.options.defaultLineHeight,\n parseHTML: (element: HTMLElement) => {\n return element.style.lineHeight || this.options.defaultLineHeight;\n },\n renderHTML: (attributes: Record<string, unknown>) => {\n const lineHeight = attributes['lineHeight'] as string | null;\n\n // Don't render if it's the default\n if (!lineHeight || lineHeight === this.options.defaultLineHeight) {\n return null;\n }\n\n // Validate if lineHeights list is provided\n if (\n this.options.lineHeights.length > 0 &&\n !this.options.lineHeights.includes(lineHeight)\n ) {\n return null;\n }\n\n return { style: `line-height: ${lineHeight}` };\n },\n },\n },\n },\n ];\n },\n\n addCommands() {\n return {\n setLineHeight:\n (lineHeight: string) =>\n ({ commands }) => {\n // Validate if lineHeights list is provided\n if (\n this.options.lineHeights.length > 0 &&\n !this.options.lineHeights.includes(lineHeight)\n ) {\n return false;\n }\n\n return this.options.types\n .map((type) => commands.updateAttributes(type, { lineHeight }))\n .some(Boolean);\n },\n\n unsetLineHeight:\n () =>\n ({ commands }) => {\n return this.options.types\n .map((type) => commands.resetAttributes(type, 'lineHeight'))\n .some(Boolean);\n },\n };\n },\n\n addToolbarItems(): ToolbarItem[] {\n if (this.options.lineHeights.length === 0) return [];\n\n const types = this.options.types;\n return [\n {\n type: 'dropdown',\n name: 'lineHeight',\n icon: 'lineSpacing',\n label: 'Line Height',\n group: 'textStyle',\n priority: 50,\n displayMode: 'text',\n dynamicLabel: true,\n items: [\n ...this.options.lineHeights.map((lh, i) => ({\n type: 'button' as const,\n name: `lineHeight-${lh}`,\n command: 'setLineHeight',\n commandArgs: [lh],\n isActive: types.map((t) => ({ name: t, attributes: { lineHeight: lh } })),\n icon: 'lineSpacing',\n label: lh,\n priority: 200 - i,\n })),\n {\n type: 'button' as const,\n name: 'unsetLineHeight',\n command: 'unsetLineHeight',\n icon: 'lineSpacing',\n label: 'Default',\n },\n ],\n },\n ];\n },\n});\n","/**\n * Canonical block-id system. Assigns ids to configured node types and is\n * read by TableOfContents and BlockContextMenu.\n */\nimport { Extension } from '../Extension.js';\nimport { Plugin, PluginKey, type Transaction } from '@domternal/pm/state';\nimport { Fragment, Slice } from '@domternal/pm/model';\nimport type { Node as PMNode } from '@domternal/pm/model';\nimport type { Editor } from '../Editor.js';\n\nfunction generateUUID(): string {\n // Prefer the browser/Node crypto API: cryptographically random and\n // standardised. Fall back to Math.random() for hostile or test\n // environments (jsdom prior to v22, very old shims) where\n // `crypto.randomUUID` is missing.\n if (typeof globalThis !== 'undefined') {\n const c = (globalThis as { crypto?: { randomUUID?: () => string } }).crypto;\n if (c && typeof c.randomUUID === 'function') return c.randomUUID();\n }\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\nexport const uniqueIDPluginKey = new PluginKey('uniqueID');\n\nexport interface UniqueIDOptions {\n /**\n * Node types that should receive unique IDs.\n * @default ['paragraph', 'heading', 'blockquote', 'codeBlock', 'bulletList', 'orderedList', 'taskList', 'listItem', 'taskItem', 'image', 'horizontalRule']\n */\n types: string[];\n\n /**\n * Attribute name to store the unique ID.\n * @default 'id'\n */\n attributeName: string;\n\n /**\n * Function to generate unique IDs.\n * @default generateUUID\n */\n generateID: () => string;\n\n /**\n * Whether to filter duplicates when pasting content.\n * @default true\n */\n filterDuplicates: boolean;\n}\n\nexport const UniqueID = Extension.create<UniqueIDOptions>({\n name: 'uniqueID',\n\n addOptions() {\n return {\n types: [\n 'paragraph',\n 'heading',\n 'blockquote',\n 'codeBlock',\n 'bulletList',\n 'orderedList',\n 'taskList',\n 'listItem',\n 'taskItem',\n 'image',\n 'horizontalRule',\n ],\n attributeName: 'id',\n generateID: generateUUID,\n filterDuplicates: true,\n };\n },\n\n addGlobalAttributes() {\n return [\n {\n types: this.options.types,\n attributes: {\n [this.options.attributeName]: {\n default: null,\n parseHTML: (element: HTMLElement) =>\n element.getAttribute(this.options.attributeName),\n renderHTML: (attributes: Record<string, unknown>) => {\n const id = attributes[this.options.attributeName] as string | null;\n if (!id) return null;\n return { [this.options.attributeName]: id };\n },\n },\n },\n },\n ];\n },\n\n addProseMirrorPlugins() {\n const { types, attributeName, generateID, filterDuplicates } = this.options;\n const editor = this.editor as Editor | null;\n\n const transformPastedSlice = (slice: Slice): Slice => {\n const existingIDs = new Set<string>();\n\n // Collect existing IDs in document\n editor?.state.doc.descendants((node: PMNode) => {\n const id = node.attrs[attributeName] as string | undefined;\n if (id) existingIDs.add(id);\n });\n\n // Transform pasted content\n const transformNode = (node: PMNode): PMNode => {\n if (!types.includes(node.type.name)) {\n return node.copy(transformFragment(node.content));\n }\n\n const existingID = node.attrs[attributeName] as string | undefined;\n if (existingID && existingIDs.has(existingID)) {\n // Regenerate ID for duplicate\n return node.type.create(\n { ...node.attrs, [attributeName]: generateID() },\n transformFragment(node.content),\n node.marks\n );\n }\n\n // Track new ID\n if (existingID) existingIDs.add(existingID);\n return node.copy(transformFragment(node.content));\n };\n\n const transformFragment = (fragment: Fragment): Fragment => {\n const nodes: PMNode[] = [];\n fragment.forEach((node) => {\n nodes.push(transformNode(node));\n });\n return Fragment.from(nodes);\n };\n\n return new Slice(\n transformFragment(slice.content),\n slice.openStart,\n slice.openEnd\n );\n };\n\n // Helper to assign IDs to nodes that lack them, AND rename\n // duplicates so the doc stays a unique-id space (which is required\n // for native browser `#hash` anchors and `getElementById`).\n //\n // The duplicate-rename guarantee covers two real scenarios:\n // 1. setContent with markup that already has colliding ids (e.g.\n // a saved snapshot with corrupted ids, or hand-written HTML).\n // 2. PM transactions that copy a node with its id (some commands\n // like duplicateBlock spread attrs and would propagate the id;\n // callers can override via transformAttrs, but if they don't,\n // this catch-all keeps the doc consistent).\n //\n // Paste from outside the editor goes through `transformPasted`\n // (further down) and is handled there before this runs. This pass\n // is the safety net.\n const assignMissingIDs = (doc: PMNode, tr: Transaction): void => {\n const seen = new Set<string>();\n doc.descendants((node, pos) => {\n if (!types.includes(node.type.name)) return;\n\n const existingID = node.attrs[attributeName] as string | undefined;\n if (!existingID) {\n // Missing: assign a fresh one. Track it so subsequent nodes\n // with the same generated id (astronomically unlikely with\n // UUIDs) don't pass through.\n let id = generateID();\n while (seen.has(id)) id = generateID();\n seen.add(id);\n // Map the position through steps already applied to `tr` so\n // each setNodeMarkup lands at the right place even when the\n // earlier iteration changed offsets. (`setNodeMarkup` is not\n // length-changing, but the discipline matches the safer\n // pattern that other plugins use.)\n tr.setNodeMarkup(tr.mapping.map(pos), undefined, {\n ...node.attrs,\n [attributeName]: id,\n });\n return;\n }\n if (seen.has(existingID)) {\n // Collision: rename the second occurrence. The first\n // occurrence keeps its id - \"first wins\" is the same rule\n // most editors use when reconciling duplicate anchors.\n let id = generateID();\n while (seen.has(id)) id = generateID();\n seen.add(id);\n tr.setNodeMarkup(tr.mapping.map(pos), undefined, {\n ...node.attrs,\n [attributeName]: id,\n });\n return;\n }\n seen.add(existingID);\n });\n };\n\n return [\n new Plugin({\n key: uniqueIDPluginKey,\n\n // Apply initial IDs after the view is ready\n view(editorView) {\n // Use setTimeout to avoid dispatching during plugin init, but\n // re-create the transaction from the *current* state inside the\n // callback to avoid stale-transaction bugs.\n const timeoutId = setTimeout(() => {\n const tr = editorView.state.tr;\n assignMissingIDs(editorView.state.doc, tr);\n if (tr.docChanged) {\n editorView.dispatch(tr);\n }\n }, 0);\n return {\n destroy() {\n clearTimeout(timeoutId);\n },\n };\n },\n\n // Ensure new nodes get IDs\n appendTransaction(transactions, _oldState, newState) {\n const docChanged = transactions.some((tr) => tr.docChanged);\n if (!docChanged) return null;\n\n const tr = newState.tr;\n assignMissingIDs(newState.doc, tr);\n\n return tr.docChanged ? tr : null;\n },\n\n // Handle paste - filter duplicates\n props: filterDuplicates\n ? {\n transformPasted: transformPastedSlice,\n }\n : {},\n }),\n ];\n },\n});\n","/**\n * Tints whole blocks via `bgColor` / `textColor` attributes rendered as\n * `data-bg-color` / `data-text-color`. Theme's `_block-colors.scss` maps\n * names to CSS custom properties with light/dark variants. `null` clears\n * the attribute; unknown palette names are rejected by commands.\n */\nimport { Extension } from '../Extension.js';\nimport type { Command, CommandSpec } from '../types/Commands.js';\nimport type { EditorState, Transaction } from '@domternal/pm/state';\n\ndeclare module '@domternal/core' {\n interface RawCommands {\n setBlockBgColor: CommandSpec<[color: string | null]>;\n setBlockTextColor: CommandSpec<[color: string | null]>;\n unsetBlockColors: CommandSpec;\n }\n}\n\n/**\n * Notion's public palette. Names are semantic (not tied to specific hex);\n * the stylesheet owns the actual colors so themes can customize them.\n * `'default'` is implicit - represented by `null` (no data attribute).\n */\nexport const DEFAULT_BLOCK_COLORS: string[] = [\n 'gray',\n 'brown',\n 'orange',\n 'yellow',\n 'green',\n 'blue',\n 'purple',\n 'pink',\n 'red',\n];\n\n/**\n * Default set of block types that receive the color attributes. `codeBlock`\n * is intentionally excluded - `<pre><code>` already has its own background\n * that would conflict visually. Similarly, details-content blocks have\n * their own affordance. Callers can extend via `types` option.\n */\nexport const DEFAULT_BLOCK_COLOR_TYPES: string[] = [\n 'paragraph',\n 'heading',\n 'blockquote',\n 'bulletList',\n 'orderedList',\n 'taskList',\n 'listItem',\n 'taskItem',\n];\n\nexport interface BlockColorOptions {\n /**\n * Node types that receive `bgColor` / `textColor` attributes.\n * @default DEFAULT_BLOCK_COLOR_TYPES\n */\n types: string[];\n /**\n * Palette used by the `setBlockBgColor` command. Commands reject values\n * outside this list (no-op + false return) so host apps can curate\n * what's selectable.\n * @default DEFAULT_BLOCK_COLORS\n */\n bgColors: string[];\n /**\n * Palette used by the `setBlockTextColor` command.\n * @default DEFAULT_BLOCK_COLORS\n */\n textColors: string[];\n}\n\n/**\n * Strip any inline `textStyle` marks inside [from, to] that carry the inline\n * counterpart of a block-level color attribute. Mutates the transaction in\n * place. This makes \"last action wins\": applying a block color erases\n * conflicting inline colors so the new block tint isn't visually hidden by\n * old span overrides.\n *\n * `which` may be 'text', 'bg', or 'both' - 'both' handles the unset case\n * in a single pass so the two strip operations don't step on each other's\n * replaced mark instances.\n *\n * Exported so `BlockContextMenu` (which writes node attrs directly via\n * `setNodeMarkup` instead of going through `setBlockBgColor` /\n * `setBlockTextColor`) shares the same conflict-stripping behavior.\n */\nexport function stripInlineColorConflicts(\n tr: Transaction,\n state: EditorState,\n from: number,\n to: number,\n which: 'text' | 'bg' | 'both',\n): void {\n const textStyleType = state.schema.marks['textStyle'];\n if (!textStyleType) return;\n const inlineKeys: string[] = [];\n if (which === 'text' || which === 'both') inlineKeys.push('color', 'colorToken');\n if (which === 'bg' || which === 'both') inlineKeys.push('backgroundColor', 'backgroundColorToken');\n state.doc.nodesBetween(from, to, (node, pos) => {\n if (!node.isText) return true;\n const existing = node.marks.find((m) => m.type === textStyleType);\n if (!existing) return false;\n const hasConflict = inlineKeys.some((k) => existing.attrs[k] !== null && existing.attrs[k] !== undefined);\n if (!hasConflict) return false;\n const start = Math.max(pos, from);\n const end = Math.min(pos + node.nodeSize, to);\n const newAttrs: Record<string, unknown> = { ...existing.attrs };\n for (const k of inlineKeys) newAttrs[k] = null;\n const stillUsed = Object.values(newAttrs).some((v) => v !== null && v !== undefined);\n tr.removeMark(start, end, existing);\n if (stillUsed) tr.addMark(start, end, textStyleType.create(newAttrs));\n return false;\n });\n}\n\nexport const BlockColor = Extension.create<BlockColorOptions>({\n name: 'blockColor',\n\n addOptions() {\n return {\n types: DEFAULT_BLOCK_COLOR_TYPES,\n bgColors: DEFAULT_BLOCK_COLORS,\n textColors: DEFAULT_BLOCK_COLORS,\n };\n },\n\n // Defensive fallback: an empty `bgColors`/`textColors` array would render\n // a broken Colors UI (section title with only the null-reset swatch).\n // Replace empties with the default palette so users who pass `{}` as an\n // override still get a working picker. Runs AFTER `addOptions()` merges\n // user config with defaults, so this only fires for explicit empty arrays.\n onBeforeCreate() {\n if (this.options.bgColors.length === 0) this.options.bgColors = DEFAULT_BLOCK_COLORS;\n if (this.options.textColors.length === 0) this.options.textColors = DEFAULT_BLOCK_COLORS;\n },\n\n addGlobalAttributes() {\n return [\n {\n types: this.options.types,\n attributes: {\n bgColor: {\n default: null,\n parseHTML: (element: HTMLElement) => element.getAttribute('data-bg-color'),\n renderHTML: (attributes: Record<string, unknown>) => {\n const v = attributes['bgColor'] as string | null;\n if (!v) return null;\n return { 'data-bg-color': v };\n },\n },\n textColor: {\n default: null,\n parseHTML: (element: HTMLElement) => element.getAttribute('data-text-color'),\n renderHTML: (attributes: Record<string, unknown>) => {\n const v = attributes['textColor'] as string | null;\n if (!v) return null;\n return { 'data-text-color': v };\n },\n },\n },\n },\n ];\n },\n\n addCommands() {\n const types = this.options.types;\n const bgColors = this.options.bgColors;\n const textColors = this.options.textColors;\n\n /**\n * Walks up from the selection to the first ancestor whose node type is\n * in the configured `types` list. Returns the position of that\n * ancestor, or null if the selection isn't inside one.\n */\n function findTargetPos(state: EditorState): number | null {\n const { $from } = state.selection;\n for (let depth = $from.depth; depth >= 0; depth--) {\n const node = $from.node(depth);\n if (types.includes(node.type.name)) {\n // depth 0 is the document itself; `before(0)` isn't defined.\n return depth === 0 ? 0 : $from.before(depth);\n }\n }\n return null;\n }\n\n function setAttr(attr: 'bgColor' | 'textColor', palette: string[]) {\n return (color: string | null): Command =>\n ({ state, dispatch }) => {\n // Palette guard - `null` always allowed (clears the attr).\n if (color !== null && !palette.includes(color)) return false;\n const pos = findTargetPos(state);\n if (pos === null) return false;\n const node = state.doc.nodeAt(pos);\n if (!node) return false;\n if (dispatch) {\n const tr = state.tr.setNodeMarkup(pos, undefined, { ...node.attrs, [attr]: color });\n stripInlineColorConflicts(tr, state, pos, pos + node.nodeSize, attr === 'textColor' ? 'text' : 'bg');\n dispatch(tr);\n }\n return true;\n };\n }\n\n return {\n setBlockBgColor: setAttr('bgColor', bgColors),\n setBlockTextColor: setAttr('textColor', textColors),\n unsetBlockColors:\n (): Command =>\n ({ state, dispatch }) => {\n const pos = findTargetPos(state);\n if (pos === null) return false;\n const node = state.doc.nodeAt(pos);\n if (!node) return false;\n if (dispatch) {\n const tr = state.tr.setNodeMarkup(pos, undefined, {\n ...node.attrs,\n bgColor: null,\n textColor: null,\n });\n stripInlineColorConflicts(tr, state, pos, pos + node.nodeSize, 'both');\n dispatch(tr);\n }\n return true;\n },\n };\n },\n});\n","/**\n * Selection Extension\n *\n * Provides selection utilities and helpers for working with\n * the editor's current selection state.\n *\n * @example\n * ```ts\n * import { Selection } from '@domternal/core';\n *\n * const editor = new Editor({\n * extensions: [\n * // ... other extensions\n * Selection,\n * ],\n * });\n *\n * // Get selected text\n * const text = editor.storage.selection.getText();\n *\n * // Check if selection is empty\n * if (editor.storage.selection.isEmpty()) {\n * console.log('Cursor is collapsed');\n * }\n *\n * // Get selection range\n * const { from, to } = editor.storage.selection.getRange();\n *\n * // Set selection programmatically\n * editor.commands.setSelection(5, 10);\n * ```\n */\nimport { Extension } from '../Extension.js';\nimport { NodeSelection, TextSelection, Selection as PMSelection } from '@domternal/pm/state';\nimport type { Node as PMNode } from '@domternal/pm/model';\nimport type { Editor } from '../Editor.js';\nimport type { CommandSpec } from '../types/Commands.js';\n\ndeclare module '@domternal/core' {\n interface RawCommands {\n setSelection: CommandSpec<[from: number, to?: number]>;\n selectNode: CommandSpec<[pos: number]>;\n selectParentNode: CommandSpec;\n extendSelection: CommandSpec<[direction: 'left' | 'right' | 'start' | 'end']>;\n }\n}\n\nexport interface SelectionOptions {}\n\nexport interface SelectionStorage {\n /**\n * Returns the currently selected text content.\n */\n getText: () => string;\n\n /**\n * Returns the selected node (if a node selection).\n */\n getNode: () => PMNode | null;\n\n /**\n * Returns true if the selection is empty.\n */\n isEmpty: () => boolean;\n\n /**\n * Returns the selection range { from, to }.\n */\n getRange: () => { from: number; to: number };\n\n /**\n * Returns the current cursor position (null if range selection).\n */\n getCursor: () => number | null;\n}\n\nexport const Selection = Extension.create<SelectionOptions, SelectionStorage>({\n name: 'selection',\n\n addStorage() {\n return {\n getText: () => '',\n getNode: () => null,\n isEmpty: () => true,\n getRange: () => ({ from: 0, to: 0 }),\n getCursor: () => null,\n };\n },\n\n onCreate() {\n const editor = this.editor as Editor | null;\n\n // Initialize storage methods\n this.storage.getText = () => {\n const state = editor?.state;\n if (!state) return '';\n\n const { selection, doc } = state;\n const { from, to } = selection;\n return doc.textBetween(from, to, ' ');\n };\n\n this.storage.getNode = () => {\n const state = editor?.state;\n if (!state) return null;\n\n const { selection } = state;\n if (selection instanceof NodeSelection) {\n return selection.node;\n }\n\n return null;\n };\n\n this.storage.isEmpty = () => {\n const state = editor?.state;\n if (!state) return true;\n return state.selection.empty;\n };\n\n this.storage.getRange = () => {\n const state = editor?.state;\n if (!state) return { from: 0, to: 0 };\n return { from: state.selection.from, to: state.selection.to };\n };\n\n this.storage.getCursor = () => {\n const state = editor?.state;\n if (!state) return null;\n const { selection } = state;\n if (!selection.empty) return null;\n return selection.from;\n };\n },\n\n addCommands() {\n return {\n setSelection:\n (from: number, to?: number) =>\n ({ tr, dispatch }) => {\n const resolvedTo = to ?? from;\n\n // Use tr.doc for chain compatibility - prior commands may have modified the document\n if (from < 0 || resolvedTo > tr.doc.content.size) {\n return false;\n }\n\n if (dispatch) {\n const selection = TextSelection.create(tr.doc, from, resolvedTo);\n tr.setSelection(selection);\n dispatch(tr);\n }\n\n return true;\n },\n\n selectNode:\n (pos: number) =>\n ({ tr, dispatch }) => {\n // Use tr.doc for chain compatibility - prior commands may have modified the document\n if (pos < 0 || pos >= tr.doc.content.size) {\n return false;\n }\n\n const node = tr.doc.nodeAt(pos);\n\n if (!node) return false;\n\n if (dispatch) {\n const selection = NodeSelection.create(tr.doc, pos);\n tr.setSelection(selection);\n dispatch(tr);\n }\n\n return true;\n },\n\n selectParentNode:\n () =>\n ({ tr, dispatch }) => {\n // Use tr.selection/tr.doc for chain compatibility\n const { $from } = tr.selection;\n\n // Find the nearest parent node that can be selected\n for (let depth = $from.depth; depth > 0; depth--) {\n const node = $from.node(depth);\n const pos = $from.before(depth);\n\n if (node.type.spec.selectable !== false) {\n if (dispatch) {\n const sel = NodeSelection.create(tr.doc, pos);\n tr.setSelection(sel);\n dispatch(tr);\n }\n return true;\n }\n }\n\n return false;\n },\n\n extendSelection:\n (direction: 'left' | 'right' | 'start' | 'end') =>\n ({ tr, dispatch }) => {\n // Use tr.selection/tr.doc for chain compatibility\n let { from, to } = tr.selection;\n\n // Use Selection.atStart/atEnd to find the first/last valid\n // text position, which handles nested structures correctly\n // (e.g. doc > blockquote > paragraph where position 1 is not\n // inside a textblock).\n switch (direction) {\n case 'left':\n from = Math.max(PMSelection.atStart(tr.doc).from, from - 1);\n break;\n case 'right':\n to = Math.min(PMSelection.atEnd(tr.doc).to, to + 1);\n break;\n case 'start':\n from = PMSelection.atStart(tr.doc).from;\n break;\n case 'end':\n to = PMSelection.atEnd(tr.doc).to;\n break;\n }\n\n if (dispatch) {\n const newSelection = TextSelection.create(tr.doc, from, to);\n tr.setSelection(newSelection);\n dispatch(tr);\n }\n\n return true;\n },\n };\n },\n});\n","/**\n * SelectionDecoration Extension\n *\n * Collapses the editor's range selection to a cursor when the editor loses\n * focus. This prevents a \"ghost selection\" from lingering after the user\n * clicks outside the editor (approach A - same as Google Docs / Notion).\n *\n * Toolbar and bubble-menu buttons call `event.preventDefault()` on\n * `mousedown`, so they never trigger blur - the selection stays intact\n * while the user interacts with editor UI.\n */\nimport { Plugin, PluginKey, TextSelection } from '@domternal/pm/state';\nimport { Extension } from '../Extension.js';\n\nexport interface SelectionDecorationOptions {}\n\nexport const selectionDecorationPluginKey = new PluginKey(\n 'selectionDecoration'\n);\n\nexport const SelectionDecoration = Extension.create<SelectionDecorationOptions>(\n {\n name: 'selectionDecoration',\n\n addProseMirrorPlugins() {\n return [\n new Plugin({\n key: selectionDecorationPluginKey,\n props: {\n handleDOMEvents: {\n blur(view, event) {\n // Don't collapse selection when focus moves to editor-related\n // UI (e.g. toolbar, bubble menu, link popover input).\n // Elements marked with [data-dm-editor-ui] or inside\n // .dm-toolbar / .dm-bubble-menu are treated as part of the editor.\n const related = event.relatedTarget;\n if (related instanceof HTMLElement) {\n // Scope the \"editor UI\" check to THIS editor. On a page with\n // several editors, each editor container can carry\n // [data-dm-editor-ui] (e.g. the Angular editor host), so a\n // bare closest() match would treat a click into ANOTHER editor\n // as our own UI and wrongly keep this editor's ghost selection.\n const ownContainer = view.dom.closest('.dm-editor');\n const relatedContainer = related.closest('.dm-editor');\n const movedToAnotherEditor =\n ownContainer !== null &&\n relatedContainer !== null &&\n relatedContainer !== ownContainer;\n if (\n !movedToAnotherEditor &&\n (related.closest('[data-dm-editor-ui]') ||\n related.closest('.dm-toolbar') ||\n related.closest('.dm-bubble-menu'))\n ) {\n return false;\n }\n }\n\n const { from, to } = view.state.selection;\n if (from !== to) {\n view.dispatch(\n view.state.tr.setSelection(\n TextSelection.create(view.state.doc, from)\n )\n );\n }\n return false;\n },\n },\n },\n }),\n ];\n },\n }\n);\n","/**\n * InvisibleChars Extension\n *\n * Shows invisible characters like spaces, paragraph marks, and hard breaks.\n * Useful for document editing where whitespace matters.\n *\n * Styles are included automatically via `@domternal/theme` (`_invisible-chars.scss`).\n *\n * @example\n * ```ts\n * import { InvisibleChars } from '@domternal/core';\n *\n * const editor = new Editor({\n * extensions: [\n * // ... other extensions\n * InvisibleChars.configure({\n * visible: false, // Start hidden\n * paragraph: true,\n * hardBreak: true,\n * space: true,\n * nbsp: true,\n * }),\n * ],\n * });\n *\n * // Toggle visibility\n * editor.commands.toggleInvisibleChars();\n *\n * // Check current state\n * const isVisible = editor.storage.invisibleChars.isVisible();\n * ```\n */\nimport { Extension } from '../Extension.js';\nimport { Plugin, PluginKey } from '@domternal/pm/state';\nimport { Decoration, DecorationSet } from '@domternal/pm/view';\nimport type { Node as ProseMirrorNode } from '@domternal/pm/model';\nimport type { Editor } from '../Editor.js';\nimport type { CommandSpec } from '../types/Commands.js';\nimport type { ToolbarItem } from '../types/Toolbar.js';\n\ndeclare module '@domternal/core' {\n interface RawCommands {\n toggleInvisibleChars: CommandSpec;\n showInvisibleChars: CommandSpec;\n hideInvisibleChars: CommandSpec;\n }\n}\n\nexport const invisibleCharsPluginKey = new PluginKey('invisibleChars');\n\n// Unicode characters for display\nconst CHARS = {\n paragraph: '¶',\n hardBreak: '↵',\n space: '·',\n nbsp: '°',\n};\n\ninterface InvisibleCharsPluginState {\n visible: boolean;\n decorations: DecorationSet;\n}\n\nfunction buildDecorations(\n doc: ProseMirrorNode,\n options: InvisibleCharsOptions,\n): DecorationSet {\n const decorations: Decoration[] = [];\n\n doc.descendants((node, pos) => {\n if (options.paragraph && node.type.name === 'paragraph') {\n const endPos = pos + node.nodeSize - 1;\n decorations.push(\n Decoration.widget(\n endPos,\n () => {\n const span = document.createElement('span');\n span.className = `${options.className} ${options.className}--paragraph`;\n span.textContent = CHARS.paragraph;\n return span;\n },\n { side: -1 }\n )\n );\n }\n\n if (options.hardBreak && node.type.name === 'hardBreak') {\n decorations.push(\n Decoration.widget(\n pos,\n () => {\n const span = document.createElement('span');\n span.className = `${options.className} ${options.className}--hardBreak`;\n span.textContent = CHARS.hardBreak;\n return span;\n },\n { side: -1 }\n )\n );\n }\n\n if (node.isText && node.text) {\n const text = node.text;\n for (let i = 0; i < text.length; i++) {\n const char = text[i];\n const charPos = pos + i;\n\n if (options.space && char === ' ') {\n decorations.push(\n Decoration.inline(charPos, charPos + 1, {\n class: `${options.className} ${options.className}--space`,\n 'data-char': 'space',\n })\n );\n }\n\n if (options.nbsp && char === '\\u00A0') {\n decorations.push(\n Decoration.inline(charPos, charPos + 1, {\n class: `${options.className} ${options.className}--nbsp`,\n 'data-char': 'nbsp',\n })\n );\n }\n }\n }\n });\n\n return DecorationSet.create(doc, decorations);\n}\n\nexport interface InvisibleCharsOptions {\n /**\n * Whether invisible characters are shown.\n * @default false\n */\n visible: boolean;\n\n /**\n * Show paragraph markers (¶).\n * @default true\n */\n paragraph: boolean;\n\n /**\n * Show hard break markers (↵).\n * @default true\n */\n hardBreak: boolean;\n\n /**\n * Show space markers (·).\n * @default true\n */\n space: boolean;\n\n /**\n * Show non-breaking space markers (°).\n * @default true\n */\n nbsp: boolean;\n\n /**\n * Custom CSS class for invisible char decorations.\n * @default 'invisible-char'\n */\n className: string;\n}\n\nexport interface InvisibleCharsStorage {\n /**\n * Toggle visibility of invisible characters.\n */\n toggle: () => void;\n\n /**\n * Current visibility state.\n */\n isVisible: () => boolean;\n}\n\nexport const InvisibleChars = Extension.create<\n InvisibleCharsOptions,\n InvisibleCharsStorage\n>({\n name: 'invisibleChars',\n\n addOptions() {\n return {\n visible: false,\n paragraph: true,\n hardBreak: true,\n space: true,\n nbsp: true,\n className: 'invisible-char',\n };\n },\n\n addStorage() {\n return {\n toggle: (): void => {\n // Initialized in onCreate\n },\n isVisible: () => false,\n };\n },\n\n onCreate() {\n const editor = this.editor as Editor | null;\n const options = this.options;\n\n this.storage.toggle = (): void => {\n const state = editor?.state;\n if (!state) return;\n\n const pluginState = invisibleCharsPluginKey.getState(state) as\n | InvisibleCharsPluginState\n | undefined;\n const currentVisible = pluginState?.visible ?? options.visible;\n\n const tr = state.tr.setMeta(invisibleCharsPluginKey, {\n visible: !currentVisible,\n });\n editor.view.dispatch(tr);\n };\n\n this.storage.isVisible = (): boolean => {\n const state = editor?.state;\n if (!state) return options.visible;\n const pluginState = invisibleCharsPluginKey.getState(state) as\n | InvisibleCharsPluginState\n | undefined;\n return pluginState?.visible ?? options.visible;\n };\n },\n\n addCommands() {\n return {\n toggleInvisibleChars:\n () =>\n ({ dispatch }) => {\n if (dispatch) {\n this.storage.toggle();\n }\n return true;\n },\n\n showInvisibleChars:\n () =>\n ({ dispatch }) => {\n if (dispatch && !this.storage.isVisible()) {\n this.storage.toggle();\n }\n return true;\n },\n\n hideInvisibleChars:\n () =>\n ({ dispatch }) => {\n if (dispatch && this.storage.isVisible()) {\n this.storage.toggle();\n }\n return true;\n },\n };\n },\n\n addKeyboardShortcuts() {\n return {\n 'Mod-Shift-i': () => {\n return this.editor?.commands.toggleInvisibleChars() ?? false;\n },\n };\n },\n\n addToolbarItems(): ToolbarItem[] {\n return [\n {\n type: 'button',\n name: 'invisibleChars',\n command: 'toggleInvisibleChars',\n icon: 'paragraph',\n label: 'Invisible Characters',\n shortcut: 'Mod-Shift-I',\n group: 'utility',\n priority: 100,\n isActiveFn: (editor) => {\n const storage = editor.storage['invisibleChars'] as\n | { isVisible?: () => boolean }\n | undefined;\n return storage?.isVisible?.() ?? false;\n },\n },\n ];\n },\n\n addProseMirrorPlugins() {\n const options = this.options;\n\n return [\n new Plugin({\n key: invisibleCharsPluginKey,\n\n state: {\n init: (_, state): InvisibleCharsPluginState => ({\n visible: options.visible,\n decorations: options.visible\n ? buildDecorations(state.doc, options)\n : DecorationSet.empty,\n }),\n apply: (tr, prev: InvisibleCharsPluginState, _oldState, newState): InvisibleCharsPluginState => {\n const meta = tr.getMeta(invisibleCharsPluginKey) as\n | { visible: boolean }\n | undefined;\n const visible = meta?.visible ?? prev.visible;\n\n if (!visible) {\n if (!prev.visible) return prev;\n return { visible, decorations: DecorationSet.empty };\n }\n\n // Visibility just toggled on - full rebuild\n if (!prev.visible) {\n return { visible, decorations: buildDecorations(newState.doc, options) };\n }\n\n // Doc changed - rebuild\n if (tr.docChanged) {\n return { visible, decorations: buildDecorations(newState.doc, options) };\n }\n\n // No change - reuse cached\n return prev;\n },\n },\n\n props: {\n decorations: (state) => {\n const pluginState = invisibleCharsPluginKey.getState(state) as\n | InvisibleCharsPluginState\n | undefined;\n return pluginState?.decorations ?? DecorationSet.empty;\n },\n },\n }),\n ];\n },\n});\n","/**\n * TextColor Extension\n *\n * Adds text color styling via the TextStyle mark.\n * Requires TextStyle mark to be enabled.\n *\n * @example\n * ```ts\n * import { TextStyle, TextColor } from '@domternal/core';\n *\n * const editor = new Editor({\n * extensions: [\n * // ... other extensions\n * TextStyle,\n * TextColor, // uses the default 25-color palette\n * ],\n * });\n *\n * editor.commands.setTextColor('#ff0000');\n * editor.commands.unsetTextColor();\n * ```\n */\nimport { Extension } from '../Extension.js';\nimport { normalizeColor } from '../helpers/normalizeColor.js';\nimport type { CommandSpec } from '../types/Commands.js';\nimport type { ToolbarItem } from '../types/Toolbar.js';\nimport { TextStyle } from '../marks/TextStyle.js';\n\ndeclare module '@domternal/core' {\n interface RawCommands {\n setTextColor: CommandSpec<[color: string]>;\n unsetTextColor: CommandSpec;\n setTextColorToken: CommandSpec<[token: string | null]>;\n unsetTextColorToken: CommandSpec;\n }\n}\n\n/**\n * Default 25-color palette (5 columns x 5 rows).\n * Row 1: neutrals (black → white)\n * Row 2: pastel tints\n * Row 3: vivid / saturated\n * Row 4: medium shades\n * Row 5: dark shades\n *\n * Columns: Red, Orange/Yellow, Green, Blue, Purple\n */\nexport const DEFAULT_TEXT_COLORS: string[] = [\n // Row 1 - Neutrals\n '#000000', '#595959', '#a6a6a6', '#d9d9d9', '#ffffff',\n // Row 2 - Pastel\n '#ffc9c9', '#fff3bf', '#b2f2bb', '#a5d8ff', '#d0bfff',\n // Row 3 - Vivid\n '#e03131', '#f08c00', '#2f9e44', '#1971c2', '#7048e8',\n // Row 4 - Medium\n '#ff6b6b', '#ffd43b', '#69db7c', '#4dabf7', '#9775fa',\n // Row 5 - Dark\n '#c92a2a', '#e67700', '#2b8a3e', '#1864ab', '#6741d9',\n];\n\nexport interface TextColorOptions {\n /**\n * List of color values for the palette.\n * Defaults to a 25-color grid (5 cols x 5 rows).\n * Pass a custom array to restrict to specific colors.\n */\n colors: string[];\n\n /**\n * Number of columns in the palette grid.\n * @default 5\n */\n columns: number;\n}\n\nexport const TextColor = Extension.create<TextColorOptions>({\n name: 'textColor',\n\n dependencies: ['textStyle'],\n\n addOptions() {\n return {\n colors: DEFAULT_TEXT_COLORS,\n columns: 5,\n };\n },\n\n addGlobalAttributes() {\n return [\n {\n types: ['textStyle'],\n attributes: {\n color: {\n default: null,\n parseHTML: (element: HTMLElement) => {\n const raw = element.style.color.replace(/['\"]+/g, '');\n return raw ? normalizeColor(raw) : null;\n },\n renderHTML: (attributes: Record<string, unknown>) => {\n const color = attributes['color'] as string | null;\n // Token wins: when a named token is set we render the data\n // attribute (below) and skip the inline style to avoid mixed\n // sources of truth for the same visual color.\n const token = attributes['colorToken'] as string | null;\n if (!color || token) return null;\n return { style: `color: ${color}` };\n },\n },\n colorToken: {\n default: null,\n parseHTML: (element: HTMLElement) => element.getAttribute('data-text-color'),\n renderHTML: (attributes: Record<string, unknown>) => {\n const token = attributes['colorToken'] as string | null;\n if (!token) return null;\n return { 'data-text-color': token };\n },\n },\n },\n },\n ];\n },\n\n addCommands() {\n return {\n // Hex-based color. Mutual exclusion: clears the named token so the\n // legacy hex picker and Notion-style picker can't write conflicting\n // values to the same mark.\n setTextColor:\n (color: string) =>\n ({ commands }) => {\n return commands.setMark('textStyle', { color, colorToken: null });\n },\n\n unsetTextColor:\n () =>\n ({ commands }) => {\n if (!commands.setMark('textStyle', { color: null })) return false;\n commands.removeEmptyTextStyle();\n return true;\n },\n\n // Named-token color. Mutual exclusion: clears the hex `color` so the\n // theme-aware data attribute is the only source of truth.\n setTextColorToken:\n (token: string | null) =>\n ({ commands }) => {\n if (!commands.setMark('textStyle', { colorToken: token, color: null })) return false;\n if (token === null) commands.removeEmptyTextStyle();\n return true;\n },\n\n unsetTextColorToken:\n () =>\n ({ commands }) => {\n if (!commands.setMark('textStyle', { colorToken: null })) return false;\n commands.removeEmptyTextStyle();\n return true;\n },\n };\n },\n\n addExtensions() {\n return [TextStyle];\n },\n\n addToolbarItems(): ToolbarItem[] {\n if (this.options.colors.length === 0) return [];\n\n return [\n {\n type: 'dropdown',\n name: 'textColor',\n icon: 'textAUnderline',\n label: 'Text Color',\n group: 'textStyle',\n priority: 200,\n layout: 'grid',\n gridColumns: this.options.columns,\n defaultIndicatorColor: '#000000',\n items: [\n {\n type: 'button' as const,\n name: 'unsetTextColor',\n command: 'unsetTextColor',\n icon: 'prohibit',\n label: 'Default',\n },\n ...this.options.colors.map((color, i) => ({\n type: 'button' as const,\n name: `textColor-${color}`,\n command: 'setTextColor',\n commandArgs: [color],\n isActive: { name: 'textStyle', attributes: { color } },\n icon: '',\n label: color,\n color,\n priority: 200 - i,\n })),\n ],\n },\n ];\n },\n});\n","/**\n * Highlight Extension\n *\n * Adds background-color highlighting via the TextStyle mark.\n * Requires TextStyle mark to be enabled.\n *\n * @example\n * ```ts\n * import { TextStyle, Highlight } from '@domternal/core';\n *\n * const editor = new Editor({\n * extensions: [\n * // ... other extensions\n * TextStyle,\n * Highlight, // uses the default 25-color palette\n * ],\n * });\n *\n * editor.commands.setHighlight({ color: '#fef08a' });\n * editor.commands.unsetHighlight();\n * editor.commands.toggleHighlight();\n * ```\n */\nimport { Extension } from '../Extension.js';\nimport { normalizeColor } from '../helpers/normalizeColor.js';\nimport { InputRule } from '@domternal/pm/inputrules';\nimport type { CommandSpec } from '../types/Commands.js';\nimport type { ToolbarItem } from '../types/Toolbar.js';\n\ndeclare module '@domternal/core' {\n interface RawCommands {\n setHighlight: CommandSpec<[attributes?: { color?: string }]>;\n unsetHighlight: CommandSpec;\n toggleHighlight: CommandSpec<[attributes?: { color?: string }]>;\n setBackgroundColorToken: CommandSpec<[token: string | null]>;\n unsetBackgroundColorToken: CommandSpec;\n }\n}\n\n/**\n * Default 25-color highlight palette (5 columns x 5 rows).\n * Row 1–2: warm pastels (yellow → pink)\n * Row 3–4: cool pastels (green → purple)\n * Row 5: neutrals\n */\nexport const DEFAULT_HIGHLIGHT_COLORS: string[] = [\n // Row 1 - Classic warm highlights\n '#fef08a', '#fde68a', '#fed7aa', '#fecaca', '#fbcfe8',\n // Row 2 - Lighter warm pastels\n '#fef9c3', '#fef3c7', '#ffedd5', '#fee2e2', '#fce7f3',\n // Row 3 - Cool highlights\n '#a7f3d0', '#99f6e4', '#a5f3fc', '#bfdbfe', '#c4b5fd',\n // Row 4 - Lighter cool pastels\n '#d1fae5', '#ccfbf1', '#cffafe', '#dbeafe', '#ede9fe',\n // Row 5 - Neutrals\n '#e5e7eb', '#d1d5db', '#f3f4f6', '#fafafa', '#ffffff',\n];\n\nexport interface HighlightOptions {\n /**\n * List of color values for the highlight palette.\n * Pass an empty array to get a simple toggle button instead of a dropdown.\n */\n colors: string[];\n\n /**\n * Number of columns in the palette grid.\n * @default 5\n */\n columns: number;\n\n /**\n * Default highlight color used by keyboard shortcut and ==text== input rule.\n * @default '#fef08a'\n */\n defaultColor: string;\n}\n\nexport const Highlight = Extension.create<HighlightOptions>({\n name: 'highlight',\n\n dependencies: ['textStyle'],\n\n addOptions() {\n return {\n colors: DEFAULT_HIGHLIGHT_COLORS,\n columns: 5,\n defaultColor: '#fef08a',\n };\n },\n\n addGlobalAttributes() {\n const { options } = this;\n return [\n {\n types: ['textStyle'],\n attributes: {\n backgroundColor: {\n default: null,\n parseHTML: (element: HTMLElement) => {\n const raw = element.style.backgroundColor.replace(/['\"]+/g, '');\n if (raw) return normalizeColor(raw);\n // Plain <mark> without inline background-color → use default\n if (element.tagName === 'MARK') return options.defaultColor;\n return null;\n },\n renderHTML: (attributes: Record<string, unknown>) => {\n const bg = attributes['backgroundColor'] as string | null;\n // Token wins: when a named token is set, render data attribute\n // only (below) so theme variables control the actual color.\n const token = attributes['backgroundColorToken'] as string | null;\n if (!bg || token) return null;\n return { style: `background-color: ${bg}` };\n },\n },\n backgroundColorToken: {\n default: null,\n parseHTML: (element: HTMLElement) => element.getAttribute('data-bg-color'),\n renderHTML: (attributes: Record<string, unknown>) => {\n const token = attributes['backgroundColorToken'] as string | null;\n if (!token) return null;\n return { 'data-bg-color': token };\n },\n },\n },\n },\n ];\n },\n\n addCommands() {\n const defaultColor = this.options.defaultColor;\n return {\n // Hex-based highlight. Mutual exclusion: clears any named bg token so\n // the legacy hex picker and the Notion-style picker can't write\n // conflicting values to the same mark.\n setHighlight:\n (attributes?: { color?: string }) =>\n ({ commands }) => {\n const color = attributes?.color ?? defaultColor;\n return commands.setMark('textStyle', { backgroundColor: color, backgroundColorToken: null });\n },\n\n unsetHighlight:\n () =>\n ({ commands }) => {\n if (!commands.setMark('textStyle', { backgroundColor: null })) return false;\n commands.removeEmptyTextStyle();\n return true;\n },\n\n toggleHighlight:\n (attributes?: { color?: string }) =>\n ({ commands, state }) => {\n const color = attributes?.color ?? defaultColor;\n const markType = state.schema.marks['textStyle'];\n if (!markType) return false;\n\n const { from, to, empty } = state.selection;\n let hasHighlight = false;\n\n if (empty) {\n const marks = state.storedMarks ?? state.doc.resolve(from).marks();\n const mark = markType.isInSet(marks);\n hasHighlight =\n !!mark?.attrs['backgroundColor'] || !!mark?.attrs['backgroundColorToken'];\n } else {\n state.doc.nodesBetween(from, to, (node) => {\n if (hasHighlight) return false;\n const mark = markType.isInSet(node.marks);\n if (mark?.attrs['backgroundColor'] || mark?.attrs['backgroundColorToken']) {\n hasHighlight = true;\n return false;\n }\n return true;\n });\n }\n\n if (hasHighlight) {\n commands.setMark('textStyle', { backgroundColor: null, backgroundColorToken: null });\n commands.removeEmptyTextStyle();\n return true;\n }\n\n return commands.setMark('textStyle', { backgroundColor: color, backgroundColorToken: null });\n },\n\n // Named-token highlight. Mutual exclusion: clears the hex\n // backgroundColor so the theme-aware data attribute is the sole source\n // of truth.\n setBackgroundColorToken:\n (token: string | null) =>\n ({ commands }) => {\n if (!commands.setMark('textStyle', { backgroundColorToken: token, backgroundColor: null })) {\n return false;\n }\n if (token === null) commands.removeEmptyTextStyle();\n return true;\n },\n\n unsetBackgroundColorToken:\n () =>\n ({ commands }) => {\n if (!commands.setMark('textStyle', { backgroundColorToken: null })) return false;\n commands.removeEmptyTextStyle();\n return true;\n },\n };\n },\n\n addKeyboardShortcuts() {\n return {\n 'Mod-Shift-h': () =>\n this.editor?.commands.toggleHighlight() ?? false,\n };\n },\n\n addInputRules() {\n const defaultColor = this.options.defaultColor;\n return [\n new InputRule(\n /(?:==)([^=]+)(?:==)$/,\n (state, match, start, end) => {\n const textStyleType = state.schema.marks['textStyle'];\n if (!textStyleType) return null;\n\n const content = match[1];\n if (!content) return null;\n\n const { tr } = state;\n tr.replaceWith(start, end, state.schema.text(content));\n tr.addMark(\n start,\n start + content.length,\n textStyleType.create({ backgroundColor: defaultColor }),\n );\n tr.removeStoredMark(textStyleType);\n return tr;\n },\n ),\n ];\n },\n\n addToolbarItems(): ToolbarItem[] {\n const defaultColor = this.options.defaultColor;\n\n if (this.options.colors.length === 0) {\n return [\n {\n type: 'button',\n name: 'highlight',\n command: 'toggleHighlight',\n isActive: { name: 'textStyle', attributes: { backgroundColor: defaultColor } },\n icon: 'highlighterCircle',\n label: 'Highlight',\n shortcut: 'Mod-Shift-H',\n group: 'format',\n priority: 150,\n },\n ];\n }\n\n return [\n {\n type: 'dropdown',\n name: 'highlight',\n icon: 'highlighterCircle',\n label: 'Highlight',\n group: 'format',\n priority: 150,\n layout: 'grid',\n gridColumns: this.options.columns,\n items: [\n {\n type: 'button' as const,\n name: 'unsetHighlight',\n command: 'unsetHighlight',\n icon: 'prohibit',\n label: 'No highlight',\n },\n ...this.options.colors.map((color, i) => ({\n type: 'button' as const,\n name: `highlight-${color}`,\n command: 'setHighlight',\n commandArgs: [{ color }],\n isActive: { name: 'textStyle', attributes: { backgroundColor: color } },\n icon: '',\n label: color,\n color,\n priority: 200 - i,\n })),\n ],\n },\n ];\n },\n});\n","/**\n * FontFamily Extension\n *\n * Adds font family styling via the TextStyle mark.\n * Requires TextStyle mark to be enabled.\n *\n * @example\n * ```ts\n * import { TextStyle, FontFamily } from '@domternal/core';\n *\n * const editor = new Editor({\n * extensions: [\n * // ... other extensions\n * TextStyle,\n * FontFamily.configure({\n * fontFamilies: ['Arial', 'Times New Roman', 'Courier New'],\n * }),\n * ],\n * });\n *\n * editor.commands.setFontFamily('Arial');\n * editor.commands.unsetFontFamily();\n * ```\n */\nimport { Extension } from '../Extension.js';\nimport type { CommandSpec } from '../types/Commands.js';\nimport type { ToolbarItem } from '../types/Toolbar.js';\nimport { TextStyle } from '../marks/TextStyle.js';\n\ndeclare module '@domternal/core' {\n interface RawCommands {\n setFontFamily: CommandSpec<[fontFamily: string]>;\n unsetFontFamily: CommandSpec;\n }\n}\n\nexport interface FontFamilyOptions {\n /**\n * List of font families shown in the toolbar dropdown.\n * Any font family is accepted from pasted HTML regardless of this list.\n * @default ['Arial', 'Verdana', 'Tahoma', 'Trebuchet MS', 'Times New Roman', 'Georgia', 'Palatino Linotype', 'Courier New']\n */\n fontFamilies: string[];\n}\n\nexport const FontFamily = Extension.create<FontFamilyOptions>({\n name: 'fontFamily',\n\n dependencies: ['textStyle'],\n\n addOptions() {\n return {\n fontFamilies: ['Arial', 'Verdana', 'Tahoma', 'Trebuchet MS', 'Times New Roman', 'Georgia', 'Palatino Linotype', 'Courier New'],\n };\n },\n\n addGlobalAttributes() {\n return [\n {\n types: ['textStyle'],\n attributes: {\n fontFamily: {\n default: null,\n parseHTML: (element: HTMLElement) => {\n return element.style.fontFamily.replace(/['\"]+/g, '') || null;\n },\n renderHTML: (attributes: Record<string, unknown>) => {\n const fontFamily = attributes['fontFamily'] as string | null;\n if (!fontFamily) return null;\n\n const value = fontFamily.includes(' ') ? `'${fontFamily}'` : fontFamily;\n return { style: `font-family: ${value}` };\n },\n },\n },\n },\n ];\n },\n\n addCommands() {\n return {\n setFontFamily:\n (fontFamily: string) =>\n ({ commands }) => {\n return commands.setMark('textStyle', { fontFamily });\n },\n\n unsetFontFamily:\n () =>\n ({ commands }) => {\n if (!commands.setMark('textStyle', { fontFamily: null })) return false;\n commands.removeEmptyTextStyle();\n return true;\n },\n };\n },\n\n addExtensions() {\n return [TextStyle];\n },\n\n addToolbarItems(): ToolbarItem[] {\n if (this.options.fontFamilies.length === 0) return [];\n\n return [\n {\n type: 'dropdown',\n name: 'fontFamily',\n icon: 'textAa',\n label: 'Font Family',\n group: 'textStyle',\n priority: 150,\n displayMode: 'text',\n dynamicLabel: true,\n computedStyleProperty: 'font-family',\n items: this.options.fontFamilies.map((font, i) => ({\n type: 'button' as const,\n name: `fontFamily-${font}`,\n command: 'setFontFamily',\n commandArgs: [font],\n isActive: { name: 'textStyle', attributes: { fontFamily: font } },\n icon: 'textAa',\n label: font,\n style: `font-family: ${font.includes(' ') ? `'${font}'` : font}`,\n priority: 200 - i,\n })),\n },\n ];\n },\n});\n","/**\n * FontSize Extension\n *\n * Adds font size styling via the TextStyle mark.\n * Requires TextStyle mark to be enabled.\n *\n * @example\n * ```ts\n * import { TextStyle, FontSize } from '@domternal/core';\n *\n * const editor = new Editor({\n * extensions: [\n * // ... other extensions\n * TextStyle,\n * FontSize.configure({\n * fontSizes: ['12px', '14px', '16px', '18px', '24px', '32px'],\n * }),\n * ],\n * });\n *\n * editor.commands.setFontSize('16px');\n * editor.commands.unsetFontSize();\n * ```\n */\nimport { Extension } from '../Extension.js';\nimport type { CommandSpec } from '../types/Commands.js';\nimport type { ToolbarButton, ToolbarItem } from '../types/Toolbar.js';\nimport { TextStyle } from '../marks/TextStyle.js';\n\ndeclare module '@domternal/core' {\n interface RawCommands {\n setFontSize: CommandSpec<[fontSize: string]>;\n unsetFontSize: CommandSpec;\n }\n}\n\nexport interface FontSizeOptions {\n /**\n * List of font sizes shown in the toolbar dropdown.\n * Any font size is accepted from pasted HTML regardless of this list.\n * @default ['12px', '14px', '16px', '18px', '24px', '32px']\n */\n fontSizes: string[];\n\n /**\n * Show an unset/reset button at the end of the dropdown.\n * @default false\n */\n showReset: boolean;\n}\n\nexport const FontSize = Extension.create<FontSizeOptions>({\n name: 'fontSize',\n\n dependencies: ['textStyle'],\n\n addOptions() {\n return {\n fontSizes: ['12px', '14px', '16px', '18px', '24px', '32px'],\n showReset: false,\n };\n },\n\n addGlobalAttributes() {\n return [\n {\n types: ['textStyle'],\n attributes: {\n fontSize: {\n default: null,\n parseHTML: (element: HTMLElement) => {\n return element.style.fontSize || null;\n },\n renderHTML: (attributes: Record<string, unknown>) => {\n const fontSize = attributes['fontSize'] as string | null;\n if (!fontSize) return null;\n\n return { style: `font-size: ${fontSize}` };\n },\n },\n },\n },\n ];\n },\n\n addCommands() {\n return {\n setFontSize:\n (fontSize: string) =>\n ({ commands }) => {\n return commands.setMark('textStyle', { fontSize });\n },\n\n unsetFontSize:\n () =>\n ({ commands }) => {\n if (!commands.setMark('textStyle', { fontSize: null })) return false;\n commands.removeEmptyTextStyle();\n return true;\n },\n };\n },\n\n addExtensions() {\n return [TextStyle];\n },\n\n addToolbarItems(): ToolbarItem[] {\n if (this.options.fontSizes.length === 0) return [];\n\n const sizes = this.options.fontSizes;\n\n const items: ToolbarButton[] = sizes.map((size, i) => ({\n type: 'button' as const,\n name: `fontSize-${size}`,\n command: 'setFontSize',\n commandArgs: [size],\n isActive: { name: 'textStyle', attributes: { fontSize: size } },\n icon: 'textSize',\n label: size,\n priority: 200 - i,\n }));\n\n if (this.options.showReset) {\n items.push({\n type: 'button' as const,\n name: 'unsetFontSize',\n command: 'unsetFontSize',\n icon: 'textSize',\n label: '–',\n priority: 0,\n });\n }\n\n return [\n {\n type: 'dropdown',\n name: 'fontSize',\n icon: 'textSize',\n label: 'Font Size',\n group: 'textStyle',\n priority: 100,\n displayMode: 'text',\n dynamicLabel: true,\n dynamicLabelFallback: '16px',\n computedStyleProperty: 'font-size',\n items,\n },\n ];\n },\n});\n","/**\n * NotionColorPicker Extension\n *\n * Provides toolbar registration for a Notion-style inline color picker that\n * drives the `colorToken` / `backgroundColorToken` attributes on the textStyle\n * mark (added by TextColor and Highlight).\n *\n * Owns:\n * - The shared named-token palette (default: 9 Notion-style colors).\n * - A bubble-menu-only toolbar item (`notionColor`) that emits a custom\n * `notionColorOpen` event when clicked. Framework wrappers listen for the\n * event and render the actual picker panel.\n *\n * The panel renders the full palette every time it opens; no MRU/recent\n * tracking is kept because all 18 swatches (9 text + 9 bg) fit in one view.\n *\n * @example\n * ```ts\n * import { TextStyle, TextColor, Highlight, NotionColorPicker } from '@domternal/core';\n *\n * const editor = new Editor({\n * extensions: [\n * TextStyle,\n * TextColor,\n * Highlight,\n * NotionColorPicker,\n * ],\n * });\n * ```\n */\nimport { Extension } from '../Extension.js';\nimport type { ToolbarItem } from '../types/Toolbar.js';\n\n/**\n * Default named tokens. Match the BlockColor palette + theme tokens\n * (`--dm-block-text-<token>`, `--dm-block-bg-<token>`) so light and dark\n * themes render the right hex without any extra CSS work.\n */\nexport const DEFAULT_NOTION_COLOR_PALETTE: readonly string[] = Object.freeze([\n 'gray',\n 'brown',\n 'orange',\n 'yellow',\n 'green',\n 'blue',\n 'purple',\n 'pink',\n 'red',\n]);\n\nexport interface NotionColorPickerOptions {\n /**\n * Named tokens shown in the picker. Each token must have matching\n * `--dm-block-text-<token>` and `--dm-block-bg-<token>` CSS variables in\n * the active theme; tokens with no theme support render as transparent\n * swatches.\n * @default DEFAULT_NOTION_COLOR_PALETTE\n */\n palette: readonly string[];\n}\n\nexport interface NotionColorPickerStorage {\n /** Whether the picker panel is currently open. UI sets this. */\n isOpen: boolean;\n}\n\nexport const NotionColorPicker = Extension.create<\n NotionColorPickerOptions,\n NotionColorPickerStorage\n>({\n name: 'notionColorPicker',\n\n // The picker writes textStyle.colorToken / textStyle.backgroundColorToken,\n // so TextStyle must be present. TextColor and Highlight are recommended\n // (they own those attribute schemas) but not strictly required: a host app\n // could supply its own attribute providers if it really wants to.\n dependencies: ['textStyle'],\n\n addOptions() {\n return {\n palette: DEFAULT_NOTION_COLOR_PALETTE,\n };\n },\n\n addStorage() {\n return {\n isOpen: false,\n };\n },\n\n addToolbarItems(): ToolbarItem[] {\n return [\n {\n type: 'button',\n name: 'notionColor',\n // emitEvent takes priority over `command` at click time. The `command`\n // field is required by the ToolbarButton schema, so we point it at a\n // harmless built-in that fires only if a host disables the popover UI.\n command: 'focus',\n // The \"A with an underline\" glyph is the closest match in our icon\n // set; the framework wrapper can repaint the underline to reflect\n // the current selection's color.\n icon: 'textAUnderline',\n label: 'Text and background color',\n emitEvent: 'notionColorOpen',\n group: 'textStyle',\n priority: 250,\n // Bubble-menu-only: the legacy hex pickers (TextColor / Highlight)\n // stay in the main toolbar; this token-based picker is a Notion-mode\n // affordance surfaced beside the text-format buttons in the bubble.\n toolbar: false,\n },\n ];\n },\n});\n","/**\n * ClearFormatting Extension\n *\n * Adds a toolbar button that removes all formatting marks from the current\n * selection. Marks with `isFormatting: false` (like Link) are preserved.\n *\n * Uses the built-in `unsetAllMarks` command.\n *\n * @example\n * ```ts\n * import { ClearFormatting } from '@domternal/core';\n *\n * const editor = new Editor({\n * extensions: [\n * // ... other extensions\n * ClearFormatting,\n * ],\n * });\n *\n * editor.commands.unsetAllMarks(); // removes formatting marks from selection\n * ```\n */\nimport { Extension } from '../Extension.js';\nimport type { ToolbarItem } from '../types/Toolbar.js';\n\nexport const ClearFormatting = Extension.create({\n name: 'clearFormatting',\n\n addToolbarItems(): ToolbarItem[] {\n return [\n {\n type: 'button',\n name: 'clearFormatting',\n command: 'unsetAllMarks',\n icon: 'textTSlash',\n label: 'Clear Formatting',\n group: 'utilities',\n priority: 200,\n },\n ];\n },\n});\n","/**\n * LinkPopover Extension\n *\n * Provides a floating URL input popover for editing links.\n * This is a UI extension - it creates DOM elements and should only be used\n * when a visual link-editing UI is desired. In headless (core-only) setups\n * this extension can be omitted; users build their own link UI instead.\n *\n * Listens for the `linkEdit` editor event (emitted by Link's Mod-K shortcut\n * and the toolbar link button) to toggle the popover.\n *\n * Included in StarterKit by default. Disable with:\n * ```ts\n * StarterKit.configure({ linkPopover: false })\n * ```\n */\nimport { Plugin, PluginKey, TextSelection } from '@domternal/pm/state';\nimport type { MarkType } from '@domternal/pm/model';\nimport { Decoration, DecorationSet } from '@domternal/pm/view';\nimport { Extension } from '../Extension.js';\nimport { isValidUrl } from '../helpers/isValidUrl.js';\nimport { getMarkRange } from '../helpers/getMarkRange.js';\nimport { defaultIcons } from '../icons/index.js';\nimport { positionFloating } from '../utils/positionFloating.js';\nimport { copyThemeClass } from '../utils/copyThemeClass.js';\nimport type { Editor } from '../Editor.js';\n\nexport interface LinkPopoverOptions {\n /**\n * List of allowed URL protocols (should match Link mark's protocols)\n * @default ['http:', 'https:', 'mailto:', 'tel:']\n */\n protocols: string[];\n}\n\ninterface LinkPopoverPluginOptions {\n editor: Editor;\n markType: MarkType;\n protocols: string[];\n}\n\nconst linkPopoverPluginKey = new PluginKey('linkPopover');\n\nfunction linkPopoverPlugin({ editor, markType, protocols }: LinkPopoverPluginOptions): Plugin {\n // Build DOM elements\n const el = document.createElement('div');\n el.className = 'dm-link-popover';\n el.setAttribute('data-dm-editor-ui', '');\n el.style.display = 'none';\n\n const input = document.createElement('input');\n input.type = 'url';\n input.placeholder = 'Enter URL...';\n input.className = 'dm-link-popover-input';\n input.setAttribute('aria-label', 'URL');\n\n const applyBtn = document.createElement('button');\n applyBtn.type = 'button';\n applyBtn.className = 'dm-link-popover-btn dm-link-popover-apply';\n applyBtn.title = 'Apply link';\n applyBtn.setAttribute('aria-label', 'Apply link');\n applyBtn.innerHTML = defaultIcons['check'] ?? '';\n\n const removeBtn = document.createElement('button');\n removeBtn.type = 'button';\n removeBtn.className = 'dm-link-popover-btn dm-link-popover-remove';\n removeBtn.title = 'Remove link';\n removeBtn.setAttribute('aria-label', 'Remove link');\n removeBtn.innerHTML = defaultIcons['linkBreak'] ?? '';\n\n el.appendChild(input);\n el.appendChild(applyBtn);\n el.appendChild(removeBtn);\n\n let isOpen = false;\n let hasExistingLink = false;\n let cleanupFloating: (() => void) | null = null;\n let toggleAnchor: HTMLElement | null = null;\n\n /** Write isOpen state to the Link mark's storage for toolbar expanded state */\n const setLinkStorageOpen = (value: boolean): void => {\n const linkStorage = editor.storage['link'] as Record<string, unknown> | undefined;\n if (linkStorage) linkStorage['isOpen'] = value;\n };\n\n const show = (anchorElement?: HTMLElement): void => {\n toggleAnchor = anchorElement ?? null;\n // Detect existing link at cursor\n const { state } = editor.view;\n const { from, empty } = state.selection;\n let existingHref: string | null = null;\n\n if (empty) {\n const $pos = state.doc.resolve(from);\n const linkMark = $pos.marks().find((m: { type: { name: string } }) => m.type === markType);\n existingHref = linkMark ? (linkMark.attrs as Record<string, unknown>)['href'] as string : null;\n } else {\n // Check marks in selection\n const { to } = state.selection;\n state.doc.nodesBetween(from, to, (node) => {\n if (existingHref) return false;\n const linkMark = node.marks.find((m: { type: { name: string } }) => m.type === markType);\n if (linkMark) existingHref = (linkMark.attrs as Record<string, unknown>)['href'] as string;\n return true;\n });\n }\n\n hasExistingLink = existingHref !== null;\n input.value = existingHref ?? '';\n removeBtn.style.display = hasExistingLink ? '' : 'none';\n\n el.style.display = '';\n el.setAttribute('data-show', '');\n isOpen = true;\n setLinkStorageOpen(true);\n\n // Show a visual decoration on the selected range while the popover is\n // open. The browser removes native selection highlight when the input\n // takes focus, so we render our own via ProseMirror DecorationSet.\n // Dispatch AFTER setting storage['isOpen'] so the toolbar transaction\n // handler sees the updated value.\n if (!empty) {\n const { to } = state.selection;\n editor.view.dispatch(state.tr.setMeta(linkPopoverPluginKey, { from, to }));\n } else {\n // No decoration needed but still trigger toolbar active-state refresh\n editor.view.dispatch(editor.view.state.tr);\n }\n\n // Position below the anchor element (toolbar/bubble-menu button) or cursor\n const reference: Element | { getBoundingClientRect: () => DOMRect } = anchorElement ?? {\n getBoundingClientRect: () => {\n const coords = editor.view.coordsAtPos(from);\n return new DOMRect(coords.left, coords.top, 0, coords.bottom - coords.top);\n },\n };\n\n // When the popover was triggered from a bubble-menu / toolbar button\n // (anchor present), reparent into the editor wrapper so it inherits\n // `.dm-editor` CSS custom properties and aligns visually with the\n // anchor button - mirrors NotionColorPicker. Without an anchor (Mod-K\n // shortcut path) keep the popover in document.body to avoid\n // overflow-clip from the editor wrapper.\n if (anchorElement) {\n const editorEl = anchorElement.closest<HTMLElement>('.dm-editor');\n if (editorEl && el.parentElement !== editorEl) {\n editorEl.appendChild(el);\n }\n } else if (el.parentElement !== document.body) {\n document.body.appendChild(el);\n }\n // Refresh on every show so runtime theme toggles propagate. Reparenting\n // back into .dm-editor (anchor path) does not need this since the editor's\n // own classes cascade, but the body-portaled path otherwise misses\n // the `dm-theme-dark` token cascade.\n copyThemeClass(editor.view, el);\n\n cleanupFloating?.();\n cleanupFloating = positionFloating(reference, el, {\n placement: anchorElement ? 'bottom-start' : 'bottom',\n offsetValue: 4,\n });\n\n input.focus();\n input.select();\n };\n\n const hide = (): void => {\n if (!isOpen) return;\n toggleAnchor = null;\n cleanupFloating?.();\n cleanupFloating = null;\n el.removeAttribute('data-show');\n el.style.display = 'none';\n isOpen = false;\n setLinkStorageOpen(false);\n // Clear pending-link decoration - dispatch AFTER setting storage['isOpen']\n // so the toolbar transaction handler sees the updated value.\n editor.view.dispatch(editor.view.state.tr.setMeta(linkPopoverPluginKey, null));\n input.value = '';\n };\n\n const applyLink = (): void => {\n let href = input.value.trim();\n if (!href) {\n hide();\n editor.view.focus();\n return;\n }\n\n // Auto-prepend https:// if no protocol\n if (!/^[a-z][a-z0-9+.-]*:/i.test(href)) {\n href = 'https://' + href;\n }\n\n if (!isValidUrl(href, { protocols })) {\n hide();\n editor.view.focus();\n return;\n }\n\n // If cursor is on existing link with no selection, select the full link range\n // and apply the mark in a single transaction to avoid visual flash\n const { state } = editor.view;\n const { from, empty } = state.selection;\n\n if (empty && hasExistingLink) {\n const $pos = state.doc.resolve(from);\n const range = getMarkRange($pos, markType);\n if (range) {\n const tr = state.tr\n .setSelection(TextSelection.create(state.doc, range.from, range.to))\n .addMark(range.from, range.to, markType.create({ href }));\n editor.view.dispatch(tr);\n hide();\n editor.view.focus();\n return;\n }\n }\n\n editor.commands.setLink({ href });\n hide();\n editor.view.focus();\n };\n\n const removeLink = (): void => {\n editor.commands.unsetLink();\n hide();\n editor.view.focus();\n };\n\n // Event handlers\n const onLinkEdit = (data: { anchorElement?: HTMLElement }): void => {\n if (isOpen) {\n hide();\n editor.view.focus();\n } else {\n show(data.anchorElement);\n }\n };\n\n const onInputKeydown = (e: KeyboardEvent): void => {\n if (e.key === 'Enter') {\n e.preventDefault();\n applyLink();\n } else if (e.key === 'Escape') {\n e.preventDefault();\n hide();\n editor.view.focus();\n } else if (e.key === 'Tab') {\n e.preventDefault();\n if (e.shiftKey) {\n (hasExistingLink ? removeBtn : applyBtn).focus();\n } else {\n applyBtn.focus();\n }\n }\n };\n\n const onButtonKeydown = (e: KeyboardEvent): void => {\n if (e.key === 'Escape') {\n e.preventDefault();\n hide();\n editor.view.focus();\n } else if (e.key === 'Tab') {\n e.preventDefault();\n const target = e.target as HTMLElement;\n if (e.shiftKey) {\n if (target === applyBtn) {\n input.focus();\n } else {\n applyBtn.focus();\n }\n } else {\n if (target === applyBtn && hasExistingLink) {\n removeBtn.focus();\n } else {\n input.focus();\n }\n }\n } else if (e.key === 'Enter') {\n e.preventDefault();\n (e.target as HTMLElement).click();\n }\n };\n\n const onClickOutside = (e: MouseEvent): void => {\n if (!isOpen || el.contains(e.target as Node)) return;\n // Skip if clicking the toolbar button that toggles this popover -\n // the button's click handler will fire onLinkEdit to toggle.\n if (toggleAnchor && (toggleAnchor === e.target || toggleAnchor.contains(e.target as Node))) return;\n hide();\n };\n\n const onPreventBlur = (e: MouseEvent): void => {\n e.preventDefault();\n };\n\n return new Plugin({\n key: linkPopoverPluginKey,\n\n state: {\n init() {\n return DecorationSet.empty;\n },\n apply(tr, decorations) {\n const meta = tr.getMeta(linkPopoverPluginKey) as { from: number; to: number } | null | undefined;\n if (meta === null) return DecorationSet.empty;\n if (meta) {\n return DecorationSet.create(tr.doc, [\n Decoration.inline(meta.from, meta.to, { class: 'dm-link-pending' }),\n ]);\n }\n return decorations.map(tr.mapping, tr.doc);\n },\n },\n\n props: {\n decorations(state) {\n return linkPopoverPluginKey.getState(state) as DecorationSet;\n },\n },\n\n view: () => {\n // Append to document.body so it's not clipped by .dm-editor overflow:hidden\n document.body.appendChild(el);\n\n // Register all event listeners here - ProseMirror calls destroy()/view()\n // on plugin view rebuilds, so listeners must be re-attached each time.\n input.addEventListener('keydown', onInputKeydown);\n applyBtn.addEventListener('mousedown', onPreventBlur);\n applyBtn.addEventListener('click', applyLink);\n applyBtn.addEventListener('keydown', onButtonKeydown);\n removeBtn.addEventListener('mousedown', onPreventBlur);\n removeBtn.addEventListener('click', removeLink);\n removeBtn.addEventListener('keydown', onButtonKeydown);\n document.addEventListener('mousedown', onClickOutside);\n editor.on('linkEdit', onLinkEdit);\n\n return {\n destroy: () => {\n hide();\n input.removeEventListener('keydown', onInputKeydown);\n applyBtn.removeEventListener('mousedown', onPreventBlur);\n applyBtn.removeEventListener('click', applyLink);\n applyBtn.removeEventListener('keydown', onButtonKeydown);\n removeBtn.removeEventListener('mousedown', onPreventBlur);\n removeBtn.removeEventListener('click', removeLink);\n removeBtn.removeEventListener('keydown', onButtonKeydown);\n document.removeEventListener('mousedown', onClickOutside);\n editor.off('linkEdit', onLinkEdit);\n el.remove();\n },\n };\n },\n });\n}\n\nexport const LinkPopover = Extension.create<LinkPopoverOptions>({\n name: 'linkPopover',\n\n dependencies: ['link'],\n\n addOptions() {\n return {\n protocols: ['http:', 'https:', 'mailto:', 'tel:'],\n };\n },\n\n addProseMirrorPlugins() {\n const editor = this.editor as unknown as Editor;\n const markType = editor.schema.marks['link'];\n if (!markType) return [];\n\n return [\n linkPopoverPlugin({\n editor,\n markType,\n protocols: this.options.protocols,\n }),\n ];\n },\n});\n","/**\n * Floating menu shown when text is selected. Contextual formatting toolbar.\n */\nimport { Extension } from '../Extension.js';\nimport { Plugin, PluginKey, TextSelection } from '@domternal/pm/state';\nimport type { EditorView } from '@domternal/pm/view';\nimport type { EditorState } from '@domternal/pm/state';\nimport type { Editor } from '../Editor.js';\nimport { positionFloatingOnce } from '../utils/positionFloating.js';\n\nexport const bubbleMenuPluginKey = new PluginKey('bubbleMenu');\n\n// Default shouldShow: text selection with actual content in an editable editor\nfunction defaultShouldShow({\n editor,\n state,\n from,\n to,\n}: {\n editor: Editor;\n view: EditorView;\n state: EditorState;\n from: number;\n to: number;\n}): boolean {\n const { selection } = state;\n\n // Must have a non-empty selection\n if (selection.empty) return false;\n\n // Must be a text selection (not NodeSelection for images/HR)\n if (!(selection instanceof TextSelection)) return false;\n\n // Must have actual text content (double-click empty paragraph produces from!=to but no text)\n if (!state.doc.textBetween(from, to).length) return false;\n\n // Don't show if editor is not editable\n if (!editor.isEditable) return false;\n\n // Don't show inside table cells - the cell toolbar handles table formatting.\n // Extensions can opt-in via a custom shouldShow if needed.\n const $from = state.doc.resolve(from);\n for (let d = $from.depth; d > 0; d--) {\n const name = $from.node(d).type.name;\n if (name === 'tableCell' || name === 'tableHeader') return false;\n }\n\n return true;\n}\n\nexport interface BubbleMenuOptions {\n /**\n * The HTML element that contains the menu.\n * Must be provided by the user.\n */\n element: HTMLElement | null;\n\n /**\n * Duration in ms to wait before showing the menu.\n * @default 0\n */\n updateDelay: number;\n\n /**\n * Function to determine if the menu should be shown.\n * By default, shows for text selections with actual content in an editable editor.\n */\n shouldShow: (props: {\n editor: Editor;\n view: EditorView;\n state: EditorState;\n from: number;\n to: number;\n }) => boolean;\n\n /**\n * Placement of the menu relative to the selection.\n * @default 'top'\n */\n placement: 'top' | 'bottom';\n\n /**\n * Offset in pixels from the selection.\n * @default 8\n */\n offset: number;\n}\n\ninterface BubbleMenuPluginState {\n visible: boolean;\n from: number;\n to: number;\n}\n\nexport interface CreateBubbleMenuPluginOptions {\n pluginKey: PluginKey;\n editor: Editor;\n element: HTMLElement;\n shouldShow?: BubbleMenuOptions['shouldShow'];\n placement?: 'top' | 'bottom';\n offset?: number;\n updateDelay?: number;\n}\n\n/**\n * Creates a standalone BubbleMenu ProseMirror plugin.\n * Can be used by framework wrappers (Angular, React, Vue) to create the plugin\n * independently of the extension system.\n */\nexport function createBubbleMenuPlugin(options: CreateBubbleMenuPluginOptions): Plugin {\n const {\n pluginKey,\n editor,\n element,\n shouldShow = defaultShouldShow,\n placement = 'top',\n offset = 8,\n updateDelay = 0,\n } = options;\n\n let updateTimeout: ReturnType<typeof setTimeout> | null = null;\n let focusTimeout: ReturnType<typeof setTimeout> | null = null;\n let mouseupTimeout: ReturnType<typeof setTimeout> | null = null;\n let cleanupFloating: (() => void) | null = null;\n\n const updatePosition = (view: EditorView, from: number, to: number): void => {\n cleanupFloating?.();\n\n // For NodeSelection (images, HRs, etc.), use the actual DOM element\n // for precise alignment. coordsAtPos gives paragraph-wide coords\n // which misaligns the menu for small centered nodes.\n const sel = view.state.selection;\n let reference: Element | { getBoundingClientRect: () => DOMRect } | null = null;\n if ('node' in sel) {\n const dom = view.nodeDOM(from);\n if (dom instanceof HTMLElement) reference = dom;\n }\n reference ??= {\n getBoundingClientRect: () => {\n const start = view.coordsAtPos(from);\n const end = view.coordsAtPos(to);\n return new DOMRect(\n start.left,\n start.top,\n end.right - start.left,\n end.bottom - start.top,\n );\n },\n };\n\n cleanupFloating = positionFloatingOnce(reference, element, {\n placement,\n offsetValue: offset,\n });\n\n element.setAttribute('data-show', '');\n };\n\n const hideMenu = (): void => {\n cleanupFloating?.();\n cleanupFloating = null;\n element.removeAttribute('data-show');\n };\n\n // When the user clicks outside the bubble menu and outside the editor\n // (e.g. on the toolbar), suppress the menu until the selection changes.\n let suppressed = false;\n\n // Suppress bubble menu during active mouse drag inside the editor.\n // Without this, the bubble menu appears mid-drag, and its DOM element\n // blocks prosemirror-tables' posAtCoords() from resolving the cell\n // under the cursor - preventing TextSelection → CellSelection conversion.\n let mouseDown = false;\n\n const onDocumentMousedown = (e: MouseEvent): void => {\n const target = e.target as Node | null;\n if (!target) return;\n // Click inside bubble menu - ignore (handled by onMenuMousedown)\n if (element.contains(target)) return;\n // Click inside editor - let ProseMirror handle selection change\n if (editor.view.dom.contains(target)) return;\n // Click inside an editor-UI overlay (NotionColorPicker, popovers carrying\n // [data-dm-editor-ui]) - treat as part of the bubble menu's interaction\n // surface so the menu doesn't dismiss while the user is operating its\n // own dropdown. Matches the whitelist `onBlur` already uses below.\n if (target instanceof HTMLElement && target.closest('[data-dm-editor-ui]')) return;\n // Outside everything - hide and suppress until selection changes\n hideMenu();\n suppressed = true;\n };\n\n // Prevent blur when clicking inside the bubble menu\n const onMenuMousedown = (e: Event): void => {\n e.preventDefault();\n };\n\n // Initially hide\n hideMenu();\n\n return new Plugin({\n key: pluginKey,\n\n state: {\n init: (): BubbleMenuPluginState => ({\n visible: false,\n from: 0,\n to: 0,\n }),\n apply: (_tr, prevValue, _oldState, newState): BubbleMenuPluginState => {\n const { selection } = newState;\n const { from, to } = selection;\n\n // Reset suppression when the selection range changes\n if (from !== prevValue.from || to !== prevValue.to) {\n suppressed = false;\n }\n\n // Determine visibility\n const visible =\n !suppressed &&\n !selection.empty &&\n shouldShow({\n editor,\n view: editor.view,\n state: newState,\n from,\n to,\n });\n\n return { visible, from, to };\n },\n },\n\n view: (editorView) => {\n // Move element inside .dm-editor (position:relative) so it uses\n // position:absolute - CSS compositor handles scroll, zero jitter.\n const editorEl = editorView.dom.closest('.dm-editor');\n if (editorEl && element.parentElement !== editorEl) {\n editorEl.appendChild(element);\n }\n\n // Track mouse drag to suppress bubble menu during active drag.\n const onEditorMousedown = (e: MouseEvent): void => {\n if (e.button !== 0) return; // only primary button\n mouseDown = true;\n hideMenu();\n };\n const onDocumentMouseup = (): void => {\n if (!mouseDown) return;\n mouseDown = false;\n // Defer to let ProseMirror finalize selection changes from the mouseup\n mouseupTimeout = setTimeout(() => {\n if (mouseDown) return; // new drag started\n const currentState = pluginKey.getState(editor.view.state) as\n | BubbleMenuPluginState\n | undefined;\n if (currentState?.visible) {\n updatePosition(editor.view, currentState.from, currentState.to);\n }\n });\n };\n\n const onFocus = (): void => {\n // Re-evaluate after focus (selection may have settled).\n // Must re-check shouldShow with current state - plugin state may be stale\n // if blur/focus happened without a transaction (e.g. cell handle click,\n // browser extension, or external focus change).\n focusTimeout = setTimeout(() => {\n if (suppressed) {\n hideMenu();\n return;\n }\n if (mouseDown) return; // don't show during drag\n const { selection } = editor.view.state;\n const { from, to } = selection;\n const show =\n !selection.empty &&\n shouldShow({\n editor,\n view: editor.view,\n state: editor.view.state,\n from,\n to,\n });\n if (show) {\n updatePosition(editor.view, from, to);\n } else {\n hideMenu();\n }\n });\n };\n\n const onBlur = ({ event }: { event: FocusEvent }): void => {\n // Don't hide if focus moved to the bubble menu itself or to any\n // overlay that opts into editor-UI semantics by carrying the\n // [data-dm-editor-ui] marker (e.g. NotionColorPicker, popovers).\n // Matches the same whitelist `SelectionDecoration` uses to avoid\n // collapsing the range selection.\n const related = event.relatedTarget;\n if (related instanceof HTMLElement) {\n if (element.contains(related)) return;\n if (related.closest('[data-dm-editor-ui]')) return;\n }\n hideMenu();\n };\n\n // Dismiss when another overlay opens (e.g. table dropdown)\n const onDismissOverlays = (): void => {\n hideMenu();\n suppressed = true;\n };\n\n element.addEventListener('mousedown', onMenuMousedown, { capture: true });\n document.addEventListener('mousedown', onDocumentMousedown);\n editorView.dom.addEventListener('mousedown', onEditorMousedown);\n document.addEventListener('mouseup', onDocumentMouseup);\n editorEl?.addEventListener('dm:dismiss-overlays', onDismissOverlays);\n editor.on('focus', onFocus);\n editor.on('blur', onBlur);\n\n return {\n update: (view, prevState) => {\n // Skip during IME composition\n if (view.composing) return;\n\n const state = pluginKey.getState(view.state) as\n | BubbleMenuPluginState\n | undefined;\n const prevPluginState = pluginKey.getState(prevState) as\n | BubbleMenuPluginState\n | undefined;\n\n // Skip if nothing changed - but reposition when the doc changed\n // while the menu is visible (e.g. image float attribute changed,\n // the DOM element moved but the selection stayed at the same pos)\n if (\n state?.visible === prevPluginState?.visible &&\n state?.from === prevPluginState?.from &&\n state?.to === prevPluginState?.to &&\n !(state?.visible && view.state.doc !== prevState.doc)\n ) {\n // Safety: ensure DOM matches state (onFocus setTimeout can race)\n if (!state?.visible && element.hasAttribute('data-show')) {\n hideMenu();\n }\n return;\n }\n\n // Clear pending update\n if (updateTimeout) {\n clearTimeout(updateTimeout);\n updateTimeout = null;\n }\n\n if (state?.visible && !mouseDown) {\n // Show menu with delay\n if (updateDelay > 0) {\n updateTimeout = setTimeout(() => {\n updatePosition(view, state.from, state.to);\n }, updateDelay);\n } else {\n updatePosition(view, state.from, state.to);\n }\n } else {\n hideMenu();\n }\n },\n\n destroy: () => {\n editor.off('focus', onFocus);\n editor.off('blur', onBlur);\n element.removeEventListener('mousedown', onMenuMousedown, {\n capture: true,\n });\n document.removeEventListener('mousedown', onDocumentMousedown);\n editorView.dom.removeEventListener('mousedown', onEditorMousedown);\n document.removeEventListener('mouseup', onDocumentMouseup);\n editorEl?.removeEventListener('dm:dismiss-overlays', onDismissOverlays);\n if (updateTimeout) {\n clearTimeout(updateTimeout);\n }\n if (focusTimeout) {\n clearTimeout(focusTimeout);\n }\n if (mouseupTimeout) {\n clearTimeout(mouseupTimeout);\n }\n hideMenu();\n },\n };\n },\n });\n}\n\nexport const BubbleMenu = Extension.create<BubbleMenuOptions>({\n name: 'bubbleMenu',\n\n addOptions() {\n return {\n element: null,\n updateDelay: 0,\n shouldShow: defaultShouldShow,\n placement: 'top' as const,\n offset: 8,\n };\n },\n\n addProseMirrorPlugins() {\n const { element, updateDelay, shouldShow, placement, offset } =\n this.options;\n\n if (!element) {\n return [];\n }\n\n const editor = this.editor as Editor | null;\n if (!editor) {\n return [];\n }\n\n return [\n createBubbleMenuPlugin({\n pluginKey: bubbleMenuPluginKey,\n editor,\n element,\n shouldShow,\n placement,\n offset,\n updateDelay,\n }),\n ];\n },\n});\n","/**\n * StarterKit Extension\n *\n * A convenient bundle of commonly-used extensions for quick setup.\n * All included extensions can be configured or disabled individually.\n */\nimport { Extension } from '../Extension.js';\nimport type { AnyExtensionConfig } from '../types/index.js';\n\n// Nodes\nimport { Document } from '../nodes/Document.js';\nimport { Text } from '../nodes/Text.js';\nimport { Paragraph, type ParagraphOptions } from '../nodes/Paragraph.js';\nimport { Heading, type HeadingOptions } from '../nodes/Heading.js';\nimport { Blockquote, type BlockquoteOptions } from '../nodes/Blockquote.js';\nimport { CodeBlock, type CodeBlockOptions } from '../nodes/CodeBlock.js';\nimport { BulletList, type BulletListOptions } from '../nodes/BulletList.js';\nimport { OrderedList, type OrderedListOptions } from '../nodes/OrderedList.js';\nimport { ListItem, type ListItemOptions } from '../nodes/ListItem.js';\nimport {\n HorizontalRule,\n type HorizontalRuleOptions,\n} from '../nodes/HorizontalRule.js';\nimport { HardBreak, type HardBreakOptions } from '../nodes/HardBreak.js';\nimport { TaskList, type TaskListOptions } from '../nodes/TaskList.js';\nimport { TaskItem, type TaskItemOptions } from '../nodes/TaskItem.js';\n\n// Marks\nimport { Bold, type BoldOptions } from '../marks/Bold.js';\nimport { Italic, type ItalicOptions } from '../marks/Italic.js';\nimport { Underline, type UnderlineOptions } from '../marks/Underline.js';\nimport { Strike, type StrikeOptions } from '../marks/Strike.js';\nimport { Code, type CodeOptions } from '../marks/Code.js';\nimport { Link, type LinkOptions } from '../marks/Link.js';\n\n// Functionality\nimport { BaseKeymap, type BaseKeymapOptions } from './BaseKeymap.js';\nimport { History, type HistoryOptions } from './History.js';\nimport { Dropcursor, type DropcursorOptions } from './Dropcursor.js';\nimport { Gapcursor } from './Gapcursor.js';\nimport { TrailingNode, type TrailingNodeOptions } from './TrailingNode.js';\nimport { ListKeymap, type ListKeymapOptions } from './ListKeymap.js';\nimport { ListIndent } from './ListIndent.js';\nimport { LinkPopover, type LinkPopoverOptions } from './LinkPopover.js';\nimport { SelectionDecoration } from './SelectionDecoration.js';\n\nexport interface StarterKitOptions {\n // Nodes\n /**\n * Set to false to disable the Document node.\n */\n document?: false;\n /**\n * Set to false to disable the Text node.\n */\n text?: false;\n /**\n * Set to false to disable the Paragraph node, or pass options to configure it.\n */\n paragraph?: false | Partial<ParagraphOptions>;\n /**\n * Set to false to disable the Heading node, or pass options to configure it.\n */\n heading?: false | Partial<HeadingOptions>;\n /**\n * Set to false to disable the Blockquote node, or pass options to configure it.\n */\n blockquote?: false | Partial<BlockquoteOptions>;\n /**\n * Set to false to disable the CodeBlock node, or pass options to configure it.\n */\n codeBlock?: false | Partial<CodeBlockOptions>;\n /**\n * Set to false to disable the BulletList node, or pass options to configure it.\n */\n bulletList?: false | Partial<BulletListOptions>;\n /**\n * Set to false to disable the OrderedList node, or pass options to configure it.\n */\n orderedList?: false | Partial<OrderedListOptions>;\n /**\n * Set to false to disable the ListItem node, or pass options to configure it.\n */\n listItem?: false | Partial<ListItemOptions>;\n /**\n * Set to false to disable the HorizontalRule node, or pass options to configure it.\n */\n horizontalRule?: false | Partial<HorizontalRuleOptions>;\n /**\n * Set to false to disable the HardBreak node, or pass options to configure it.\n */\n hardBreak?: false | Partial<HardBreakOptions>;\n /**\n * Set to false to disable the TaskList node, or pass options to configure it.\n */\n taskList?: false | Partial<TaskListOptions>;\n /**\n * Set to false to disable the TaskItem node, or pass options to configure it.\n */\n taskItem?: false | Partial<TaskItemOptions>;\n\n // Marks\n /**\n * Set to false to disable the Bold mark, or pass options to configure it.\n */\n bold?: false | Partial<BoldOptions>;\n /**\n * Set to false to disable the Italic mark, or pass options to configure it.\n */\n italic?: false | Partial<ItalicOptions>;\n /**\n * Set to false to disable the Underline mark, or pass options to configure it.\n */\n underline?: false | Partial<UnderlineOptions>;\n /**\n * Set to false to disable the Strike mark, or pass options to configure it.\n */\n strike?: false | Partial<StrikeOptions>;\n /**\n * Set to false to disable the Code mark, or pass options to configure it.\n */\n code?: false | Partial<CodeOptions>;\n /**\n * Set to false to disable the Link mark, or pass options to configure it.\n */\n link?: false | Partial<LinkOptions>;\n\n // Functionality\n /**\n * Set to false to disable the BaseKeymap extension, or pass options to configure it.\n */\n baseKeymap?: false | Partial<BaseKeymapOptions>;\n /**\n * Set to false to disable the History extension, or pass options to configure it.\n */\n history?: false | Partial<HistoryOptions>;\n /**\n * Set to false to disable the Dropcursor extension, or pass options to configure it.\n */\n dropcursor?: false | Partial<DropcursorOptions>;\n /**\n * Set to false to disable the Gapcursor extension.\n */\n gapcursor?: false;\n /**\n * Set to false to disable the TrailingNode extension, or pass options to configure it.\n */\n trailingNode?: false | Partial<TrailingNodeOptions>;\n /**\n * Set to false to disable the ListKeymap extension, or pass options to configure it.\n */\n listKeymap?: false | Partial<ListKeymapOptions>;\n /**\n * Off by default. Set to `true` to enable the ListIndent extension, which\n * adds a Tab / Shift-Tab keymap that indents a top-level block under the\n * previous list (and outdents back). Kept off by default because it captures\n * Tab on a paragraph that merely follows a list, so Tab no longer moves focus\n * to the next field in embedded / form usage, and the same nesting is\n * reachable via the block-menu drag. Registered AFTER ListKeymap so the\n * in-list-item Tab/Shift-Tab keep priority.\n */\n listIndent?: boolean;\n /**\n * Set to false to disable the LinkPopover extension, or pass options to configure it.\n */\n linkPopover?: false | Partial<LinkPopoverOptions>;\n /**\n * Set to false to disable the SelectionDecoration extension.\n * When enabled, the editor collapses range selections on blur to prevent\n * ghost selections from lingering after clicking outside the editor.\n */\n selectionDecoration?: false;\n}\n\nexport const StarterKit = Extension.create<StarterKitOptions>({\n name: 'starterKit',\n\n addOptions() {\n return {};\n },\n\n addExtensions() {\n const extensions: AnyExtensionConfig[] = [];\n\n // Helper to conditionally add extension\n const maybeAdd = <T extends object>(\n ext: { configure: (opts: Partial<T>) => AnyExtensionConfig } & AnyExtensionConfig,\n opts: false | Partial<T> | undefined\n ): void => {\n if (opts === false) return;\n if (opts && Object.keys(opts).length > 0) {\n extensions.push(ext.configure(opts));\n } else {\n extensions.push(ext);\n }\n };\n\n // Nodes\n maybeAdd(Document as never, this.options.document as never);\n maybeAdd(Text as never, this.options.text as never);\n maybeAdd(Paragraph, this.options.paragraph);\n maybeAdd(Heading, this.options.heading);\n maybeAdd(Blockquote, this.options.blockquote);\n maybeAdd(CodeBlock, this.options.codeBlock);\n maybeAdd(BulletList, this.options.bulletList);\n maybeAdd(OrderedList, this.options.orderedList);\n maybeAdd(ListItem, this.options.listItem);\n maybeAdd(HorizontalRule, this.options.horizontalRule);\n maybeAdd(HardBreak, this.options.hardBreak);\n maybeAdd(TaskList, this.options.taskList);\n maybeAdd(TaskItem, this.options.taskItem);\n\n // Marks\n maybeAdd(Bold, this.options.bold);\n maybeAdd(Italic, this.options.italic);\n maybeAdd(Underline, this.options.underline);\n maybeAdd(Strike, this.options.strike);\n maybeAdd(Code, this.options.code);\n maybeAdd(Link, this.options.link);\n\n // Functionality\n maybeAdd(BaseKeymap, this.options.baseKeymap);\n maybeAdd(History, this.options.history);\n maybeAdd(Dropcursor, this.options.dropcursor);\n maybeAdd(Gapcursor as never, this.options.gapcursor as never);\n maybeAdd(TrailingNode, this.options.trailingNode);\n maybeAdd(ListKeymap, this.options.listKeymap);\n // ListIndent is opt-in (off by default): only added on `listIndent: true`.\n // MUST be registered AFTER ListKeymap: collected keymaps run in\n // `LATER || EARLIER` order, so a later `addKeyboardShortcuts` runs FIRST.\n // ListIndent fires first, bails when the cursor is inside a list item, and\n // ListKeymap then handles the in-list Tab/Shift-Tab (sinkListItem /\n // liftListItem). Reordering breaks that delegation.\n if (this.options.listIndent === true) extensions.push(ListIndent as never);\n maybeAdd(LinkPopover, this.options.linkPopover);\n maybeAdd(SelectionDecoration as never, this.options.selectionDecoration as never);\n\n return extensions;\n },\n});\n","/**\n * @domternal/core\n * Framework-agnostic ProseMirror editor engine\n */\n\nexport const VERSION = '0.1.0';\n\n// === Type exports ===\nexport type {\n // Content types\n JSONAttribute,\n JSONMark,\n JSONContent,\n Content,\n Range,\n // Editor options\n AnyExtension,\n FocusPosition,\n EditorOptions,\n // Editor events\n EditorInstance,\n TransactionEventProps,\n FocusEventProps,\n CreateEventProps,\n ContentErrorProps,\n PasteEventProps,\n DropEventProps,\n MountEventProps,\n DeleteEventProps,\n EditorEvents,\n EditorEventName,\n // Command types\n CommandEditor,\n CommandProps,\n Command,\n CommandSpec,\n CommandMap,\n RawCommands,\n SingleCommands,\n ChainedCommands,\n ChainFailure,\n CanCommands,\n CanChainedCommands,\n KeyboardShortcutCommand,\n // Extension config types\n ExtensionEditor,\n AnyExtensionConfig,\n GlobalAttributeSpec,\n GlobalAttributes,\n ExtensionConfig,\n // Attribute types\n AttributeSpec,\n AttributeSpecs,\n // Node config types\n NodeParseRule,\n NodeRenderHTMLProps,\n NodeConfig,\n // Mark config types\n MarkParseRule,\n MarkRenderHTMLProps,\n MarkConfig,\n // Toolbar types\n IconSet,\n ToolbarButton,\n ToolbarDropdown,\n ToolbarSeparator,\n ToolbarItem,\n ToolbarLayoutDropdown,\n ToolbarLayoutEntry,\n // Floating menu types\n FloatingMenuItem,\n FloatingMenuItemsOverride,\n} from './types/index.js';\n\n// === ProseMirror re-exports (for framework wrappers) ===\nexport { PluginKey } from '@domternal/pm/state';\n\n// === Core classes ===\nexport { EventEmitter } from './EventEmitter.js';\nexport { Editor } from './Editor.js';\nexport {\n ExtensionManager,\n type ExtensionManagerOptions,\n type ExtensionManagerEditor,\n type NodeViewContext,\n} from './ExtensionManager.js';\nexport {\n CommandManager,\n type SetContentOptions,\n type ClearContentOptions,\n type CommandManagerEditor,\n} from './CommandManager.js';\n\n// === Floating UI ===\nexport {\n positionFloating,\n positionFloatingOnce,\n type PositionFloatingOptions,\n} from './utils/positionFloating.js';\n\n// === Inline Styles ===\nexport {\n inlineStyles,\n applyInlineStyles,\n type InlineStyleOverrides,\n} from './utils/inlineStyles.js';\n\n// === Clipboard ===\nexport { writeToClipboard } from './utils/clipboard.js';\n\n// === Theme cascade for portaled elements ===\nexport { copyThemeClass } from './utils/copyThemeClass.js';\n\n// === Bubble menu defaults ===\nexport { defaultBubbleContexts } from './utils/defaultBubbleContexts.js';\n\n// === List utilities ===\nexport {\n insertAsListItemChild,\n type InsertAsListItemChildArgs,\n type InsertAsListItemChildResult,\n} from './utils/insertAsListItemChild.js';\nexport {\n getListItemCursorContext,\n type ListItemCursorContext,\n} from './utils/listItemCursorContext.js';\nexport {\n liftEmptyChildrenZoneParagraph,\n} from './utils/liftEmptyChildrenZoneParagraph.js';\nexport {\n insertChildrenZoneSibling,\n} from './utils/insertChildrenZoneSibling.js';\nexport {\n liftCurrentListItem,\n} from './utils/liftCurrentListItem.js';\nexport {\n splitListForInsert,\n type SplitListForInsertRange,\n} from './utils/splitListForInsert.js';\nexport {\n findListItemAncestorDepth,\n isInsideListItem,\n isInListItemLabel,\n LIST_ITEM_TYPE_NAMES,\n} from './utils/listItemAncestor.js';\n\n// === Helpers ===\nexport {\n createDocument,\n isNodeEmpty,\n isDocumentEmpty,\n callOrReturn,\n markInputRule,\n markInputRulePatterns,\n wrappingInputRule,\n textblockTypeInputRule,\n textInputRule,\n nodeInputRule,\n isValidUrl,\n generateHTML,\n generateJSON,\n generateText,\n type CreateDocumentOptions,\n type IsNodeEmptyOptions,\n type MarkInputRuleOptions,\n type WrappingInputRuleOptions,\n type TextblockTypeInputRuleOptions,\n type TextInputRuleOptions,\n type NodeInputRuleOptions,\n type IsValidUrlOptions,\n type GenerateHTMLOptions,\n type GenerateJSONOptions,\n type GenerateTextOptions,\n getMarkRange,\n type MarkRange,\n findParentNode,\n type FindParentNodeResult,\n findChildren,\n type FindChildResult,\n defaultBlockAt,\n} from './helpers/index.js';\n\n// === Extension System ===\nexport { Extension } from './Extension.js';\nexport { Node } from './Node.js';\n\n// === Toolbar ===\nexport {\n ToolbarController,\n type ToolbarControllerEditor,\n type ToolbarGroup,\n} from './ToolbarController.js';\n\n// === Floating Menu Controller ===\nexport {\n FloatingMenuController,\n FLOATING_MENU_NO_FOCUS,\n type FloatingMenuGroup,\n} from './FloatingMenuController.js';\n\n// === Shared helpers ===\nexport { groupFloatingMenuItems } from './utils/groupFloatingMenuItems.js';\n\n// === Icons ===\nexport { defaultIcons } from './icons/index.js';\n\nexport { Mark } from './Mark.js';\n\n// === Command System ===\nexport {\n ChainBuilder,\n createChainBuilder,\n type ChainBuilderEditor,\n type ChainBuilderOptions,\n} from './ChainBuilder.js';\nexport {\n CanChecker,\n createCanChecker,\n type CanCheckerEditor,\n type CanCheckerOptions,\n} from './CanChecker.js';\nexport {\n buildCommandProps,\n createAccumulatingDispatch,\n type CommandPropsEditor,\n type BuildCommandPropsOptions,\n} from './commandPropsBuilder.js';\nexport {\n builtInCommands,\n // Basic commands\n focus,\n blur,\n setContent,\n clearContent,\n insertText,\n deleteSelection,\n selectAll,\n // Mark commands\n toggleMark,\n setMark,\n unsetMark,\n unsetAllMarks,\n // Block commands\n setBlockType,\n toggleBlockType,\n // Wrap commands\n wrapIn,\n toggleWrap,\n lift,\n // List commands\n toggleList,\n // Insert commands\n insertContent,\n // Selection commands\n selectNodeBackward,\n // Attribute commands\n updateAttributes,\n resetAttributes,\n} from './commands/index.js';\n\n// === Nodes ===\nexport {\n Document,\n Text,\n Paragraph,\n type ParagraphOptions,\n Heading,\n type HeadingOptions,\n Blockquote,\n type BlockquoteOptions,\n CodeBlock,\n type CodeBlockOptions,\n BulletList,\n type BulletListOptions,\n OrderedList,\n type OrderedListOptions,\n ListItem,\n type ListItemOptions,\n HorizontalRule,\n type HorizontalRuleOptions,\n HardBreak,\n type HardBreakOptions,\n TaskList,\n type TaskListOptions,\n TaskItem,\n type TaskItemOptions,\n} from './nodes/index.js';\n\n// === Marks ===\nexport {\n Bold,\n type BoldOptions,\n Italic,\n type ItalicOptions,\n Underline,\n type UnderlineOptions,\n Strike,\n type StrikeOptions,\n Code,\n type CodeOptions,\n Link,\n type LinkOptions,\n type LinkAttributes,\n Subscript,\n type SubscriptOptions,\n Superscript,\n type SuperscriptOptions,\n TextStyle,\n type TextStyleOptions,\n // Link helpers\n linkClickPlugin,\n linkClickPluginKey,\n type LinkClickPluginOptions,\n linkPastePlugin,\n linkPastePluginKey,\n type LinkPastePluginOptions,\n autolinkPlugin,\n autolinkPluginKey,\n type AutolinkPluginOptions,\n linkExitPlugin,\n linkExitPluginKey,\n type LinkExitPluginOptions,\n} from './marks/index.js';\n\n// === Extensions ===\nexport {\n // Core functionality\n BaseKeymap,\n type BaseKeymapOptions,\n History,\n type HistoryOptions,\n Dropcursor,\n type DropcursorOptions,\n Gapcursor,\n TrailingNode,\n type TrailingNodeOptions,\n Placeholder,\n placeholderPluginKey,\n type PlaceholderOptions,\n // List & Count\n ListKeymap,\n type ListKeymapOptions,\n ListIndent,\n indentBlockAsListChild,\n outdentBlockFromListItem,\n CharacterCount,\n characterCountPluginKey,\n type CharacterCountOptions,\n type CharacterCountStorage,\n // Styling\n Typography,\n type TypographyOptions,\n TextAlign,\n type TextAlignOptions,\n Focus,\n focusPluginKey,\n type FocusOptions,\n LineHeight,\n type LineHeightOptions,\n // Block Attributes\n UniqueID,\n uniqueIDPluginKey,\n type UniqueIDOptions,\n BlockColor,\n DEFAULT_BLOCK_COLORS,\n DEFAULT_BLOCK_COLOR_TYPES,\n stripInlineColorConflicts,\n type BlockColorOptions,\n // Selection & Editor Utilities\n Selection,\n type SelectionOptions,\n type SelectionStorage,\n SelectionDecoration,\n selectionDecorationPluginKey,\n type SelectionDecorationOptions,\n InvisibleChars,\n invisibleCharsPluginKey,\n type InvisibleCharsOptions,\n type InvisibleCharsStorage,\n // Text Style Extensions\n TextColor,\n DEFAULT_TEXT_COLORS,\n type TextColorOptions,\n Highlight,\n DEFAULT_HIGHLIGHT_COLORS,\n type HighlightOptions,\n FontFamily,\n type FontFamilyOptions,\n FontSize,\n type FontSizeOptions,\n NotionColorPicker,\n DEFAULT_NOTION_COLOR_PALETTE,\n type NotionColorPickerOptions,\n type NotionColorPickerStorage,\n // Formatting Utilities\n ClearFormatting,\n // Link UI\n LinkPopover,\n type LinkPopoverOptions,\n // Menu Extensions\n BubbleMenu,\n createBubbleMenuPlugin,\n bubbleMenuPluginKey,\n type BubbleMenuOptions,\n type CreateBubbleMenuPluginOptions,\n // Bundle\n StarterKit,\n type StarterKitOptions,\n} from './extensions/index.js';\n"]}