@edrlab/thorium-web 1.2.0 → 1.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-S4M7ED5Q.mjs → chunk-P4V3LA5R.mjs} +3 -3
- package/dist/{chunk-S4M7ED5Q.mjs.map → chunk-P4V3LA5R.mjs.map} +1 -1
- package/dist/{chunk-H4J2VY7Z.mjs → chunk-PXAUQJEU.mjs} +2 -2
- package/dist/chunk-PXAUQJEU.mjs.map +1 -0
- package/dist/{chunk-34MVY33F.mjs → chunk-QPE574OW.mjs} +3 -3
- package/dist/{chunk-34MVY33F.mjs.map → chunk-QPE574OW.mjs.map} +1 -1
- package/dist/components/Epub/index.css +7 -0
- package/dist/components/Epub/index.css.map +1 -1
- package/dist/components/Epub/index.mjs +2 -2
- package/dist/components/Reader/index.css +7 -0
- package/dist/components/Reader/index.css.map +1 -1
- package/dist/components/Reader/index.d.mts +1 -1
- package/dist/components/Reader/index.mjs +3 -3
- package/dist/components/WebPub/index.css +7 -0
- package/dist/components/WebPub/index.css.map +1 -1
- package/dist/components/WebPub/index.d.mts +1 -1
- package/dist/components/WebPub/index.mjs +2 -2
- package/dist/core/Hooks/index.d.mts +1 -1
- package/dist/locales/en/thorium-shared.json +84 -0
- package/dist/locales/et/thorium-shared.json +93 -2
- package/dist/locales/fi/thorium-shared.json +68 -0
- package/dist/{useWebPubNavigator-Che8r5Wg.d.mts → useWebPubNavigator-CuSNQKMw.d.mts} +1 -1
- package/package.json +1 -1
- package/dist/chunk-H4J2VY7Z.mjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/Actions/assets/styles/thorium-web.overflow.module.css","../src/components/Actions/Triggers/UnstableStatefulShortcut.tsx","../src/components/Actions/Triggers/StatefulOverflowMenuItem.tsx","../src/components/assets/styles/thorium-web.button.module.css","../src/components/Actions/Triggers/StatefulActionIcon.tsx","../src/components/Actions/Fullscreen/assets/icons/fullscreen.svg","../src/components/Actions/Fullscreen/assets/icons/fullscreen_exit.svg","../src/components/Actions/Fullscreen/StatefulFullscreenTrigger.tsx","../src/components/Actions/assets/icons/more_vert.svg","../src/components/Actions/StatefulOverflowMenu.tsx","../src/components/Actions/StatefulCollapsibleActionsBar.tsx","../src/core/Navigator/NavigatorProvider.tsx","../src/core/Navigator/hooks/useNavigatorContext.ts","../src/components/Sheets/assets/styles/thorium-web.sheets.module.css","../src/components/Docking/assets/styles/thorium-web.docking.module.css","../src/components/Docking/assets/icons/dock_to_right.svg","../src/components/Docking/assets/icons/dock_to_left.svg","../src/components/Docking/StatefulDockStart.tsx","../src/components/Docking/StatefulDockEnd.tsx","../src/components/Docking/assets/icons/stack.svg","../src/components/Docking/StatefulDockTransientPopover.tsx","../src/components/Docking/StatefulDocker.tsx","../src/components/Sheets/hooks/useWebkitPatch.ts","../src/components/Sheets/StatefulPopoverSheet.tsx","../src/components/Sheets/StatefulBottomSheet.tsx","../src/components/Sheets/StatefulFullScreenSheet.tsx","../src/components/Sheets/StatefulDockedSheet.tsx","../src/components/Sheets/StatefulSheetWrapper.tsx","../src/components/Docking/hooks/useDocking.ts","../src/components/Actions/JumpToPosition/assets/styles/thorium-web.jumpToPosition.module.css","../src/components/Actions/JumpToPosition/helpers/utils.ts","../src/components/Actions/JumpToPosition/StatefulJumpToPositionContainer.tsx","../src/components/Actions/JumpToPosition/assets/icons/pin_drop.svg","../src/components/Actions/JumpToPosition/StatefulJumpToPositionTrigger.tsx","../src/components/Settings/assets/styles/thorium-web.reader.settings.module.css","../src/components/Settings/StatefulGroupWrapper.tsx","../src/components/Plugins/PluginRegistry.ts","../src/components/Plugins/PluginProvider.tsx","../src/components/Settings/Spacing/StatefulSpacingGroup.tsx","../src/components/Settings/Text/StatefulTextGroup.tsx","../src/components/Actions/Settings/StatefulSettingsContainer.tsx","../src/components/Actions/Settings/assets/icons/match_case.svg","../src/components/Actions/Settings/StatefulSettingsTrigger.tsx","../src/components/Actions/Toc/assets/styles/thorium-web.toc.module.css","../src/components/Actions/Toc/assets/icons/chevron_right.svg","../src/components/Actions/Toc/StatefulTocContainer.tsx","../src/components/Actions/Toc/assets/icons/toc.svg","../src/components/Actions/Toc/StatefulTocTrigger.tsx","../src/components/Settings/hooks/useGridTemplate.ts","../src/components/Settings/hooks/useGridNavigation.ts","../src/components/Settings/StatefulRadioGroup.tsx","../src/components/Epub/Settings/assets/icons/document_scanner.svg","../src/components/Epub/Settings/assets/icons/article.svg","../src/components/Epub/Settings/assets/icons/menu_book.svg","../src/components/Epub/Settings/StatefulColumns.tsx","../src/components/Settings/StatefulDropdown.tsx","../src/components/Settings/Text/StatefulFontFamily.tsx","../src/components/Settings/Text/assets/icons/format_bold_wght200.svg","../src/components/Settings/Text/assets/icons/format_bold_wght500.svg","../src/components/Settings/Text/StatefulFontWeight.tsx","../src/components/Settings/StatefulSwitch.tsx","../src/components/Settings/Text/StatefulHyphens.tsx","../src/components/Epub/Settings/assets/icons/contract.svg","../src/components/Epub/Settings/assets/icons/docs.svg","../src/components/Epub/Settings/StatefulLayout.tsx","../src/components/Settings/StatefulNumberField.tsx","../src/components/Settings/StatefulSlider.tsx","../src/components/Settings/hooks/useSettingsComponentStatus.ts","../src/components/Settings/Spacing/hooks/useSpacingPresets.ts","../src/components/Settings/hooks/usePlaceholder.ts","../src/components/Settings/Spacing/StatefulLetterSpacing.tsx","../src/components/Settings/Spacing/hooks/useLineHeight.ts","../src/components/Settings/assets/icons/book.svg","../src/components/Settings/Spacing/assets/icons/density_small.svg","../src/components/Settings/Spacing/assets/icons/density_medium.svg","../src/components/Settings/Spacing/assets/icons/density_large.svg","../src/components/Settings/Spacing/StatefulLineHeight.tsx","../src/components/Settings/Spacing/StatefulParagraphIndent.tsx","../src/components/Settings/Spacing/StatefulParagraphSpacing.tsx","../src/components/Settings/StatefulPublisherStyles.tsx","../src/components/Settings/Spacing/assets/icons/accessibility.svg","../src/components/Settings/Spacing/assets/icons/tune.svg","../src/components/Settings/Spacing/helpers/spacingSettings.ts","../src/components/Settings/Spacing/StatefulSpacingPresets.tsx","../src/components/Settings/Text/assets/icons/format_align_left.svg","../src/components/Settings/Text/assets/icons/format_align_right.svg","../src/components/Settings/Text/assets/icons/format_align_justify.svg","../src/components/Settings/Text/StatefulTextAlign.tsx","../src/components/Settings/Text/StatefulTextNormalize.tsx","../src/components/Epub/Settings/assets/icons/check.svg","../src/components/Epub/Settings/StatefulTheme.tsx","../src/components/Settings/Spacing/StatefulWordSpacing.tsx","../src/components/Settings/assets/icons/text_decrease.svg","../src/components/Settings/assets/icons/text_increase.svg","../src/components/Settings/assets/icons/zoom_out.svg","../src/components/Settings/assets/icons/zoom_in.svg","../src/components/Settings/StatefulZoom.tsx","../src/components/Plugins/helpers/createDefaultPlugin.ts","../src/components/StatefulPreferencesProvider.tsx","../src/hooks/useReaderTransitions.ts","../src/helpers/deserializePositions.ts","../src/hooks/usePublication.ts","../src/hooks/usePositionStorage.ts","../src/components/assets/styles/thorium-web.reader.app.module.css","../src/components/Docking/hooks/useResizablePanel.ts","../src/components/Docking/StatefulDockingWrapper.tsx","../src/components/assets/styles/thorium-web.reader.header.module.css","../src/components/assets/styles/thorium-web.backlink.module.css","../src/components/StatefulBackLink.tsx","../src/components/StatefulReaderRunningHead.tsx","../src/components/StatefulReaderHeader.tsx","../src/components/assets/styles/thorium-web.reader.pagination.module.css","../src/components/assets/styles/thorium-web.reader.progression.module.css","../src/components/StatefulReaderProgression.tsx","../src/components/StatefulReaderPagination.tsx","../src/components/StatefulReaderFooter.tsx","../src/core/Hooks/fonts/androidPatchCss.ts","../src/core/Hooks/fonts/useFonts.ts","../src/helpers/peripherals.ts","../src/components/Helpers/getReaderClassNames.ts"],"names":["hint","popover","menu","menuItem","menuItemLabel","menuItemShortcut","jsx","Fragment","icon","dockerButton","closeButton","backButton","tooltip","alwaysVisible","partiallyVisible","iconCompSm","iconCompLg","iconApplyStroke","classNames","useRef","fullscreen","draggable","draggableFullHeightDetent","draggableContentHeightDetent","draggableBackdrop","draggableScrim","draggableScroller","dragIndicator","docked","dockedLeftBorder","dockedRightBorder","dialog","header","draggableHeader","heading","body","dockerWrapper","docker","resizeHandle","resizeHandleGrab","resizeHandleGrabLeft","resizeHandleGrabRight","useCallback","jsxs","useEffect","React","snapArray","scrimPref","className","detent","wrapper","form","label","input","button","numberField","useState","item","group","advancedGroup","advancedIcon","groupLabel","radioWrapper","groupWrapper","numberFieldWrapper","sliderWrapper","slider","resetButton","radio","themeRadio","themesWrapper","sliderLabel","sliderOutput","sliderTrack","sliderThumb","sliderPlaceholder","sliderWithTicks","dropdown","dropdownButton","dropdownPopover","dropdownListbox","dropdownListboxItem","switch","switchIndicator","createContext","useContext","useMemo","search","searchLabel","searchInput","searchIcon","clearButton","tree","treeItem","treeItemButton","treeItemText","treeItemTextTitle","treeItemTextPosition","empty","filterValue","items","value","setLetterSpacing","setLineHeight","setParagraphIndent","setParagraphSpacing","setPublisherStyles","textAlign","theme","t","setWordSpacing","error","Link","main","shell","leftDock","rightDock","bottomBar","topBar","barOverlay","headerOverlay","footerOverlay","iframeContainer","loading","srOnly","dockingMap","backlinkWrapper","actionsWrapper","link","listItem","previousButton","progression","nextButton","useFocusWithin"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA,IAAA,4BAAA,GAAA;AAAA,EAAsF,IAAA,EAAAA,2BAAAA;AAAA,EAYrF,OAAA,EAAAC,8BAAAA;AAAA,EAYA,IAAA,EAAAC,2BAAAA;AAAA,EAIA,QAAA,EAAAC,+BAAAA;AAAA,EA2BA,aAAA,EAAAC,oCAAAA;AAAA,EAIA,gBAAA,EAAAC;AAAA,CAAA;AC/CM,IAAM,2BAA2B,CAAC;AAAA,EACvC,SAAA;AAAA,EACA,OAAA;AAAA,EACA,cAAA;AAAA,EACA;AACF,CAAA,KAAwB;AACtB,EAAA,MAAM,EAAE,WAAA,EAAY,GAAI,cAAA,EAAe;AACvC,EAAA,MAAM,gBAAA,GAAmB,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,OAAO,gBAAgB,CAAA;AAE9E,EAAA,cAAA,GAAiB,cAAA,GAAiB,cAAA,GAAiB,WAAA,CAAY,SAAA,CAAU,cAAA,IAAA,QAAA;AACzE,EAAA,MAAA,GAAS,MAAA,GAAS,MAAA,GAAS,WAAA,CAAY,SAAA,CAAU,MAAA,IAAU,KAAA;AAE3D,EAAA,MAAM,WAAA,GAAc,cAAc,OAAO,CAAA;AAEzC,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,IAAI,yBAAyB,EAAC;AAE9B,IAAA,KAAA,MAAW,IAAA,IAAQ,YAAY,SAAA,EAAW;AACxC,MAAA,IAAI,WAAA,CAAY,SAAA,CAAU,IAAI,CAAA,EAAG;AAC/B,QAAA,IAAI,SAAS,aAAA,EAAe;AAC1B,UAAA,sBAAA,CAAuB,IAAA,CAAK,gBAAA,CAAiB,cAAc,CAAC,CAAA;AAAA,QAC9D,CAAA,MAAO;AACL,UAAA,MAAM,OAAA,GAAU,SAAS,IAAI,CAAA;AAC7B,UAAA,sBAAA,CAAuB,IAAA,CAAK,OAAA,CAAQ,cAAgD,CAAC,CAAA;AAAA,QACvF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,YAAY,IAAA,EAAM;AACpB,MAAA,sBAAA,CAAuB,IAAA,CAAK,YAAY,IAAI,CAAA;AAAA,IAC9C;AAEA,IAAA,IAAI,sBAAA,CAAuB,SAAS,CAAA,EAAG;AACrC,MAAA,MAAM,eAAA,GAAkB,sBAAA,CAAuB,IAAA,CAAK,MAAM,CAAA;AAE1D,MAAA,uBACE,GAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAA0B,QAAA,EAAA,eAAA,EAAiB,CAAA;AAAA,IAEzD,CAAA,MAAO;AACL,MAAA,uBACE,GAAA,CAAA,QAAA,EAAA,EAAE,CAAA;AAAA,IAEN;AAAA,EACF;AAEA,EAAA,uBACE,GAAA,CAAA,QAAA,EAAA,EAAE,CAAA;AAEN,CAAA;AC7CO,IAAM,2BAA2B,CAAC;AAAA,EACvC,EAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA,GAAW,MAAA;AAAA,EACX,GAAG;AACL,CAAA,KAAqC;AACnC,EAAA,MAAM,eAAA,GAAkB,GAAG,EAAE,CAAA,MAAA,CAAA;AAE7B,EAAA,uBACEC,GAAAA,CAAAC,QAAAA,EAAA,EACA,QAAA,kBAAA,IAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,EAAA;AAAA,MACA,KAAA;AAAA,MACA,WAAY,4BAAA,CAAmB,QAAA;AAAA,MAC/B,iBAAA,EAAkB,eAAA;AAAA,MAChB,GAAG,KAAA;AAAA,MAEH,QAAA,EAAA;AAAA,QAAA,OAAA,oBAAWD,GAAAA,CAAC,OAAA,EAAA,EAAQ,aAAA,EAAY,MAAA,EAAO,WAAU,OAAA,EAAQ,CAAA;AAAA,wBAC3DA,GAAAA;AAAA,UAAC,IAAA;AAAA,UAAA;AAAA,YACC,WAAY,4BAAA,CAAmB,aAAA;AAAA,YAC/B,IAAA,EAAK,OAAA;AAAA,YACL,EAAA,EAAK,eAAA;AAAA,YAEH,QAAA,EAAA;AAAA;AAAA,SACJ;AAAA,QACE,4BAAYA,GAAAA;AAAA,UAAC,wBAAA;AAAA,UAAA;AAAA,YACb,WAAY,4BAAA,CAAmB,gBAAA;AAAA,YAC/B,OAAA,EAAU;AAAA;AAAA;AACZ;AAAA;AAAA,GACF,EACA,CAAA;AAEJ;;;AChDA,IAAA,0BAAA,GAAA;AAAA,EAAC,IAAA,EAAAE,yBAAAA;AAAA,EACA,YAAA,EAAAC,iCAAAA;AAAA,EACA,WAAA,EAAAC,gCAAAA;AAAA,EACA,UAAA,EAAAC,+BAAAA;AAAA,EAuDA,OAAA,EAAAC,4BAAAA;AAAA,EASA,aAAA,EAAAC,kCAAAA;AAAA,EAIqF,gBAAA,EAAAC,qCAAAA;AAAA,EAMrF,UAAA,EAAAC,+BAAAA;AAAA,EAUA,UAAA,EAAAC,+BAAAA;AAAA,EASA,eAAA,EAAAC;AAAA;ACtEM,IAAM,qBAAqB,CAAC;AAAA,EAClC,UAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACC,GAAG;AACL,CAAA,KAA+B;AAC7B,EAAA,MAAM,EAAE,WAAA,EAAY,GAAI,cAAA,EAAe;AAEvC,EAAA,MAAM,UAAA,GAAa,OAA0B,IAAI,CAAA;AAEjD,EAAA,MAAM,WAAW,cAAA,EAAe;AAEhC,EAAA,MAAM,2BAA2B,MAAM;AACrC,IAAA,IAAI,SAAA,GAAY,EAAA;AAEhB,IAAA,QAAO,UAAA;AAAY,MACjB,KAAA,QAAA;AACE,QAAA,SAAA,GAAY,0BAAA,CAAe,aAAA;AAC3B,QAAA;AAAA,MACF,KAAA,WAAA;AACE,QAAA,SAAA,GAAY,0BAAA,CAAe,gBAAA;AAC3B,QAAA;AAGA;AAGJ,IAAA,OAAO,SAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,qBAAqB,MAAM;AAC/B,IAAA,QAAA,CAAS,YAAA,CAAa,KAAK,CAAC,CAAA;AAAA,EAC9B,CAAA;AAEA,EAAA,MAAM,eAAA,GAAkB,CAAC,KAAA,KAA4B;AAGnD,IAAA,IAAI,mBAAA,CAAoB,KAAA,CAAM,MAAM,CAAA,EAAG;AACrC,MAAA,QAAA,CAAS,YAAA,CAAa,KAAK,CAAC,CAAA;AAAA,IAC9B;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,SAAA,GAAY,CAAC,KAAA,KAA+B;AAEhD,IAAA,IAAI,UAAA,CAAW,WAAW,eAAA,CAAgB,UAAA,CAAW,OAAO,CAAA,IAAK,KAAA,CAAM,SAAS,QAAA,EAAU;AACxF,MAAA,UAAA,CAAW,QAAQ,IAAA,EAAK;AAAA,IAC1B;AAAA,EACF,CAAA;AAEA,EAAA,uBACEX,GAAAA;AAAA,IAAC,cAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAM,UAAA;AAAA,MACN,WAAYY,WAAA,CAAW,0BAAA,CAAe,MAAM,wBAAA,EAAyB,EAAG,MAAM,SAAS,CAAA;AAAA,MACvF,OAAA,EAAU,MAAM,OAAA,IAAW,kBAAA;AAAA,MAC3B,SAAA,EAAY,SAAA;AAAA,MACZ,OAAA,EAAU,eAAA;AAAA,MACV,WAAY,YAAA,GAAe;AAAA,QACzB,cAAA,EAAgB;AAAA,UACd,KAAA,EAAO,WAAA,CAAY,OAAA,CAAQ,IAAA,CAAK,YAAA;AAAA,UAChC,UAAA,EAAY,WAAA,CAAY,OAAA,CAAQ,IAAA,CAAK;AAAA,SACvC;AAAA,QACA,OAAA,EAAS;AAAA,UACP,WAAW,0BAAA,CAAe,OAAA;AAAA,UAC1B,SAAA;AAAA,UACA,MAAA,EAAQ,WAAA,CAAY,OAAA,CAAQ,IAAA,CAAK,aAAA,IAAiB;AAAA,SACpD;AAAA,QACA,KAAA,EAAO;AAAA,OACT,GAAI,MAAA;AAAA,MACF,GAAG,MAAA,CAAO,WAAA,CAAY,MAAA,CAAO,QAAQ,KAAK,CAAA,CAAE,MAAA,CAAO,CAAC,CAAC,GAAG,CAAA,KAAM,GAAA,KAAQ,WAAW,CAAC,CAAA;AAAA,MAElF;AAAA;AAAA,GACJ;AAEJ;ACnGA,IAAM,aAAA,GAAgB,2BAASZ,GAAAA,CAAC,SAAI,KAAA,EAAM,4BAAA,EAA6B,MAAA,EAAO,MAAA,EAAO,OAAA,EAAQ,gBAAA,EAAiB,OAAM,MAAA,EAAO,IAAA,EAAK,WAAW,GAAG,KAAA,EAAO,0BAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,kIAAA,EAAmI,CAAA,EAAE,CAAA;AAClS,IAAO,kBAAA,GAAQ,aAAA;ACDf,IAAM,iBAAA,GAAoB,2BAASA,GAAAA,CAAC,SAAI,KAAA,EAAM,4BAAA,EAA6B,MAAA,EAAO,MAAA,EAAO,OAAA,EAAQ,gBAAA,EAAiB,OAAM,MAAA,EAAO,IAAA,EAAK,WAAW,GAAG,KAAA,EAAO,0BAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,kIAAA,EAAmI,CAAA,EAAE,CAAA;AACtS,IAAO,uBAAA,GAAQ,iBAAA;ACsBR,IAAM,yBAAA,GAA4B,CAAC,EAAE,OAAA,EAAQ,KAAkC;AAIpF,EAAA,MAAM,EAAE,WAAA,EAAY,GAAI,cAAA,EAAe;AACvC,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,OAAA,EAAQ;AAEtB,EAAA,MAAM,WAAW,cAAA,EAAe;AAChC,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,CAAC,YAAA,KAA0B;AACtD,IAAA,QAAA,CAAS,aAAA,CAAc,YAAY,CAAC,CAAA;AAAA,EACtC,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAA,MAAM,EAAA,GAAK,cAAc,QAAQ,CAAA;AAEjC,EAAA,MAAM,QAAQ,EAAA,CAAG,YAAA,GAAe,EAAE,yBAAyB,CAAA,GAAI,EAAE,2BAA2B,CAAA;AAC5F,EAAA,MAAM,IAAA,GAAO,EAAA,CAAG,YAAA,GAAe,uBAAA,GAAiB,kBAAA;AAEhD,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,EAAA,CAAG,gBAAA,EAAiB;AAEpB,IAAA,QAAA,CAAS,WAAA,CAAY,KAAK,CAAC,CAAA;AAAA,EAE7B,CAAA;AAMA,EAAA,IAAI,CAAC,QAAA,CAAS,iBAAA,IAAqB,QAAA,IAAY,OAAO,IAAA;AAEtD,EAAA,uBACEA,GAAAA,CAAAC,QAAAA,EAAA,EACG,QAAA,EAAA,OAAA,IAAW,oDACVD,GAAAA;AAAA,IAAC,wBAAA;AAAA,IAAA;AAAA,MACC,KAAA;AAAA,MACA,OAAA,EAAU,IAAA;AAAA,MACV,QAAA,EAAW,WAAA,CAAY,OAAA,CAAQ,IAAA,CAAA,YAAA,kBAA6B,CAAE,QAAA;AAAA,MAC9D,UAAW,EAAA,CAAG,gBAAA;AAAA,MACd,EAAA,EAAA,YAAA;AAAA;AAAA,sBAEFA,GAAAA;AAAA,IAAC,kBAAA;AAAA,IAAA;AAAA,MACC,WAAY,0BAAA,CAAe,UAAA;AAAA,MAC3B,UAAA,EAAa,WAAA,CAAY,OAAA,CAAQ,IAAA,CAAA,YAAA,kBAA6B,CAAE,UAAA;AAAA,MAChE,YAAA,EAAa,KAAA;AAAA,MACb,SAAA,EAAU,QAAA;AAAA,MACV,YAAA,EAAe,EAAE,2BAA2B,CAAA;AAAA,MAC5C,OAAA,EAAU,WAAA;AAAA,MAEV,0BAAAA,GAAAA,CAAC,IAAA,EAAA,EAAK,aAAA,EAAY,MAAA,EAAO,WAAU,OAAA,EAAQ;AAAA;AAAA,GAC7C,EAEJ,CAAA;AAEJ;AC5EA,IAAM,WAAA,GAAc,2BAASA,GAAAA,CAAC,SAAI,KAAA,EAAM,4BAAA,EAA6B,MAAA,EAAO,MAAA,EAAO,OAAA,EAAQ,gBAAA,EAAiB,OAAM,MAAA,EAAO,IAAA,EAAK,WAAW,GAAG,KAAA,EAAO,0BAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,gTAAA,EAAiT,CAAA,EAAE,CAAA;AAC9c,IAAO,iBAAA,GAAQ,WAAA;ACyBR,IAAM,uBAAuB,CAAC;AAAA,EACnC,EAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,KAAiC;AAC/B,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,OAAA,EAAQ;AACtB,EAAA,MAAM,WAAW,cAAA,EAAe;AAEhC,EAAA,MAAM,eAAA,GAAkB,CAAC,KAAA,KAAmB;AAC1C,IAAA,QAAA,CAAS,WAAA,CAAY;AAAA,MACnB,GAAA,EAAK,EAAA;AAAA,MACL,MAAA,EAAQ;AAAA,KACT,CAAC,CAAA;AAAA,EACJ,CAAA;AAEA,EAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,IAAA,uBACEA,GAAAA,CAAAC,QAAAA,EAAA,EACA,QAAA,kBAAAD,GAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,EAAA;AAAA,QACA,UAAA;AAAA,QACA,aAAA,EAAc,MAAA;AAAA,QACd,WAAY,4BAAA,CAAmB,IAAA;AAAA,QAC/B,YAAA,EAAe,CAAC,SAAS,CAAA;AAAA,QACzB,KAAA;AAAA,QACA,SAAA,EAAW;AAAA,UACT,WAAA,EAAa;AAAA,YACX,YAAA,EAAc,CAAC,GAAA,KAAiB,eAAA,CAAgB,GAAG;AAAA,WACrD;AAAA,UACA,OAAA,EAAS;AAAA,YACP,SAAA,EAAW,QAAA;AAAA,YACX,WAAW,4BAAA,CAAmB;AAAA,WAChC;AAAA,UACA,wBACEA,GAAAA;AAAA,YAAC,kBAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAY,SAAA,GAAY,SAAA,GAAY,4BAAA,CAAmB,MAAA;AAAA,cACvD,YAAA,EAAa,EAAE,oCAAoC,CAAA;AAAA,cACnD,SAAA,EAAU,QAAA;AAAA,cACV,YAAA,EAAe,EAAE,oCAAoC,CAAA;AAAA,cACrD,UAAA,EAAA,QAAA;AAAA,cAEA,0BAAAA,GAAAA,CAAC,iBAAA,EAAA,EAAS,aAAA,EAAY,MAAA,EAAO,WAAU,OAAA,EAAQ;AAAA;AAAA;AACjD;AAEJ;AAAA,KACF,EACA,CAAA;AAAA,EAEJ;AACF;AC5DO,IAAM,gCAAgC,CAAC;AAAA,EAC5C,EAAA;AAAA,EACA,KAAA;AAAA,EACA,qBAAA;AAAA,EACA,GAAG;AACL,CAAA,KAA0C;AACxC,EAAA,MAAM,GAAA,GAAMa,OAA8B,IAAI,CAAA;AAC9C,EAAA,MAAM,UAAA,GAAa,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,QAAQ,UAAU,CAAA;AAEnE,EAAA,uBACEb,GAAAA,CAAAC,QAAAA,EAAA,EACA,QAAA,kBAAAD,GAAAA;AAAA,IAAC,uBAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,EAAA;AAAA,MACA,KAAA;AAAA,MACA,UAAA;AAAA,MACA,SAAA,EAAW;AAAA,QACT,sBAAOA,GAAAA;AAAA,UAAC,oBAAA;AAAA,UAAA;AAAA,YACN,EAAA;AAAA,YACA,UAAA,EAAa,GAAA;AAAA,YACb,SAAA,EAAY,qBAAA;AAAA,YACZ,OAAQ;AAAC;AAAA;AACb,OAAI;AAAA,MACF,GAAG;AAAA;AAAA,GACP,EACA,CAAA;AAEJ;ACtCA,IAAM,gBAAA,GAAmB,cAA4C,IAAI,CAAA;AAOlE,IAAM,iBAAA,GAAoB,CAAC,EAAE,SAAA,EAAW,UAAS,KAA8B;AACpF,EAAA,uBACEA,IAAC,gBAAA,CAAiB,QAAA,EAAjB,EAA0B,KAAA,EAAO,EAAE,SAAA,EAAU,EAC1C,QAAA,EACJ,CAAA;AAEJ;AAEO,IAAM,sBAAsB,MAAM;AACvC,EAAA,MAAM,OAAA,GAAU,WAAW,gBAAgB,CAAA;AAC3C,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,MAAM,uDAAuD,CAAA;AAAA,EACzE;AACA,EAAA,OAAO,OAAA,CAAQ,SAAA;AACjB,CAAA;;;ACdO,IAAM,eAAe,MAAM;AAChC,EAAA,OAAO,mBAAA,EAAoB;AAC7B;;;ACfA,IAAA,0BAAA,GAAA;AAAA,EAGC,UAAA,EAAAc,+BAAAA;AAAA,EAmBA,OAAA,EAAAnB,4BAAAA;AAAA,EAkBA,SAAA,EAAAoB,8BAAAA;AAAA,EA+BA,yBAAA,EAAAC,8CAAAA;AAAA,EAIA,4BAAA,EAAAC,iDAAAA;AAAA,EAUA,iBAAA,EAAAC,sCAAAA;AAAA,EAMA,cAAA,EAAAC,mCAAAA;AAAA,EAUA,iBAAA,EAAAC,sCAAAA;AAAA,EAKA,aAAA,EAAAC,kCAAAA;AAAA,EAmBA,MAAA,EAAAC,2BAAAA;AAAA,EAeA,gBAAA,EAAAC,qCAAAA;AAAA,EAIA,iBAAA,EAAAC,sCAAAA;AAAA,EAIA,MAAA,EAAAC,2BAAAA;AAAA,EAIA,MAAA,EAAAC,2BAAAA;AAAA,EAaA,eAAA,EAAAC,oCAAAA;AAAA,EAoBA,OAAA,EAAAC,4BAAAA;AAAA,EAOA,IAAA,EAAAC;AAAA,CAAA;;;AChMD,IAAA,2BAAA,GAAA;AAAA,EAAC,aAAA,EAAAC,mCAAAA;AAAA,EAQA,MAAA,EAAAC,4BAAAA;AAAA,EAKA,YAAA,EAAAC,kCAAAA;AAAA,EASA,gBAAA,EAAAC,sCAAAA;AAAA,EAWA,oBAAA,EAAAC,0CAAAA;AAAA,EAIA,qBAAA,EAAAC;AAAA,CAAA;ACpCD,IAAM,cAAA,GAAiB,2BAASnC,GAAAA,CAAC,SAAI,KAAA,EAAM,4BAAA,EAA6B,MAAA,EAAO,MAAA,EAAO,OAAA,EAAQ,gBAAA,EAAiB,OAAM,MAAA,EAAO,IAAA,EAAK,WAAW,GAAG,KAAA,EAAO,0BAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,wLAAA,EAAyL,CAAA,EAAE,CAAA;AACzV,IAAO,qBAAA,GAAQ,cAAA;ACDf,IAAM,aAAA,GAAgB,2BAASA,GAAAA,CAAC,SAAI,KAAA,EAAM,4BAAA,EAA6B,MAAA,EAAO,MAAA,EAAO,OAAA,EAAQ,gBAAA,EAAiB,OAAM,MAAA,EAAO,IAAA,EAAK,WAAW,GAAG,KAAA,EAAO,0BAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,wLAAA,EAAyL,CAAA,EAAE,CAAA;AACxV,IAAO,oBAAA,GAAQ,aAAA;ACqBR,IAAM,iBAAA,GAAoB,CAAC,EAAE,OAAA,EAAS,eAAc,KAAkC;AAC3F,EAAA,MAAM,EAAE,WAAA,EAAY,GAAI,cAAA,EAAe;AACvC,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,OAAA,EAAQ;AACtB,EAAA,MAAM,SAAA,GAAY,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,OAAO,SAAS,CAAA;AAChE,EAAA,MAAM,UAAA,GAAa,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,QAAQ,IAAI,CAAA;AAC7D,EAAA,MAAM,KAAA,GAAQ,SAAA,KAAA,KAAA;AACd,EAAA,MAAM,cAAA,GAAiB,QACnB,+BAAA,GACA,8BAAA;AACJ,EAAA,MAAM,SAAA,GAAY;AAAA,IAChB,OAAA,EAAS,CAAA,CAAE,CAAA,EAAI,cAAe,CAAA,QAAA,CAAU,CAAA;AAAA,IACxC,OAAA,EAAS,CAAA,CAAE,CAAA,EAAI,cAAe,CAAA,QAAA,CAAU;AAAA,GAC1C;AAEA,EAAA,MAAM,OAAA,GAAU,WAAW,UAAU,CAAA;AACrC,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,WAAA,CAAY,aAAa,CAAA,KAAA,cAAA;AAEpD,EAAA,MAAM,WAAW,cAAA,EAAe;AAEhC,EAAA,MAAM,WAAA,GAAcoC,YAAY,MAAM;AACpC,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,QAAA,CAAS,UAAA,CAAW;AAAA,QAClB,GAAA,EAAK,aAAA;AAAA,QACL,UAAA,EAAA,cAAA;AAAA,OACD,CAAC,CAAA;AAAA,IACJ;AAAA,EACF,CAAA,EAAG,CAAC,QAAA,EAAU,aAAa,CAAC,CAAA;AAE5B,EAAA,uBACEpC,GAAAA,CAAAC,QAAAA,EAAA,EACG,QAAA,EAAA,OAAA,IAAW,oDACVD,GAAAA;AAAA,IAAC,wBAAA;AAAA,IAAA;AAAA,MACC,OAAQ,SAAA,CAAU,OAAA;AAAA,MAClB,OAAA,EAAU,QAAQ,oBAAA,GAAc,qBAAA;AAAA,MAChC,QAAA,EAAW,WAAA,CAAY,OAAA,CAAQ,IAAA,CAAA,cAAA,aAAwB,CAAE,QAAA;AAAA,MACzD,QAAA,EAAW,WAAA;AAAA,MACX,EAAA,EAAK,CAAA,EAAA,cAAA,aAAwB,CAAA,EAAK,aAAc,CAAA,CAAA;AAAA,MAChD;AAAA;AAAA,sBAEFA,GAAAA;AAAA,IAAC,kBAAA;AAAA,IAAA;AAAA,MACC,WAAY,0BAAA,CAAe,YAAA;AAAA,MAC3B,cAAa,SAAA,CAAU,OAAA;AAAA,MACvB,SAAA,EAAU,QAAA;AAAA,MACV,cAAe,SAAA,CAAU,OAAA;AAAA,MACzB,OAAA,EAAU,WAAA;AAAA,MACV,UAAA;AAAA,MAEE,QAAA,EAAA,KAAA,mBACEA,GAAAA,CAAC,oBAAA,EAAA,EAAY,eAAY,MAAA,EAAO,SAAA,EAAU,OAAA,EAAQ,CAAA,mBAClDA,GAAAA,CAAC,qBAAA,EAAA,EAAW,aAAA,EAAY,MAAA,EAAO,WAAU,OAAA,EAAQ;AAAA;AAAA,GAEvD,EAEJ,CAAA;AAEJ,CAAA;ACvDO,IAAM,eAAA,GAAkB,CAAC,EAAE,OAAA,EAAS,eAAc,KAAkC;AACzF,EAAA,MAAM,EAAE,WAAA,EAAY,GAAI,cAAA,EAAe;AACvC,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,OAAA,EAAQ;AACtB,EAAA,MAAM,SAAA,GAAY,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,OAAO,SAAS,CAAA;AAChE,EAAA,MAAM,UAAA,GAAa,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,QAAQ,IAAI,CAAA;AAC7D,EAAA,MAAM,KAAA,GAAQ,SAAA,KAAA,KAAA;AACd,EAAA,MAAM,cAAA,GAAiB,QACnB,8BAAA,GACA,+BAAA;AACJ,EAAA,MAAM,SAAA,GAAY;AAAA,IAChB,OAAA,EAAS,CAAA,CAAE,CAAA,EAAI,cAAe,CAAA,QAAA,CAAU,CAAA;AAAA,IACxC,OAAA,EAAS,CAAA,CAAE,CAAA,EAAI,cAAe,CAAA,QAAA,CAAU;AAAA,GAC1C;AAEA,EAAA,MAAM,OAAA,GAAU,WAAW,UAAU,CAAA;AACrC,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,WAAA,CAAY,aAAa,CAAA,KAAA,YAAA;AAEpD,EAAA,MAAM,WAAW,cAAA,EAAe;AAEhC,EAAA,MAAM,WAAA,GAAcoC,YAAY,MAAM;AACpC,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,QAAA,CAAS,UAAA,CAAW;AAAA,QAClB,GAAA,EAAK,aAAA;AAAA,QACL,UAAA,EAAA,YAAA;AAAA,OACD,CAAC,CAAA;AAAA,IACJ;AAAA,EACF,CAAA,EAAG,CAAC,QAAA,EAAU,aAAa,CAAC,CAAA;AAE5B,EAAA,uBACEpC,GAAAA,CAAAC,QAAAA,EAAA,EACG,QAAA,EAAA,OAAA,IAAW,oDACVD,GAAAA;AAAA,IAAC,wBAAA;AAAA,IAAA;AAAA,MACC,OAAQ,SAAA,CAAU,OAAA;AAAA,MAClB,OAAA,EAAU,QAAQ,qBAAA,GAAa,oBAAA;AAAA,MAC/B,QAAA,EAAW,WAAA,CAAY,OAAA,CAAQ,IAAA,CAAA,YAAA,WAAsB,CAAE,QAAA;AAAA,MACvD,QAAA,EAAW,WAAA;AAAA,MACX,EAAA,EAAK,CAAA,EAAA,YAAA,WAAsB,CAAA,EAAK,aAAc,CAAA,CAAA;AAAA,MAC9C;AAAA;AAAA,sBAEFA,GAAAA;AAAA,IAAC,kBAAA;AAAA,IAAA;AAAA,MACC,WAAY,0BAAA,CAAe,YAAA;AAAA,MAC3B,cAAa,SAAA,CAAU,OAAA;AAAA,MACvB,SAAA,EAAU,QAAA;AAAA,MACV,cAAe,SAAA,CAAU,OAAA;AAAA,MACzB,OAAA,EAAU,WAAA;AAAA,MACV,UAAA;AAAA,MAEE,QAAA,EAAA,KAAA,mBACEA,GAAAA,CAAC,oBAAA,EAAA,EAAY,eAAY,MAAA,EAAO,SAAA,EAAU,OAAA,EAAQ,CAAA,mBAClDA,GAAAA,CAAC,qBAAA,EAAA,EAAW,aAAA,EAAY,MAAA,EAAO,WAAU,OAAA,EAAQ;AAAA;AAAA,GAEvD,EAEJ,CAAA;AAEJ,CAAA;AC7EA,IAAM,QAAA,GAAW,2BAASA,GAAAA,CAAC,SAAI,KAAA,EAAM,4BAAA,EAA6B,MAAA,EAAO,MAAA,EAAO,OAAA,EAAQ,gBAAA,EAAiB,OAAM,MAAA,EAAO,IAAA,EAAK,WAAW,GAAG,KAAA,EAAO,0BAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,2QAAA,EAA4Q,CAAA,EAAE,CAAA;AACta,IAAO,aAAA,GAAQ,QAAA;ACoBR,IAAM,4BAAA,GAA+B,CAAC,EAAE,OAAA,EAAS,eAAc,KAAkC;AACtG,EAAA,MAAM,EAAE,WAAA,EAAY,GAAI,cAAA,EAAe;AACvC,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,OAAA,EAAQ;AACtB,EAAA,MAAM,UAAA,GAAa,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,QAAQ,IAAI,CAAA;AAC7D,EAAA,MAAM,OAAA,GAAU,WAAW,UAAU,CAAA;AACrC,EAAA,MAAM,UAAA,GAAa,CAAC,OAAA,CAAQ,QAAA,CAAS,aAAa,CAAA,IAAK,OAAA,CAAQ,YAAY,aAAa,CAAA,KAAA,kBAAA;AAExF,EAAA,MAAM,WAAW,cAAA,EAAe;AAEhC,EAAA,MAAM,WAAA,GAAcoC,YAAY,MAAM;AACpC,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,QAAA,CAAS,UAAA,CAAW;AAAA,QAClB,GAAA,EAAK,aAAA;AAAA,QACL,UAAA,EAAA,kBAAA;AAAA,OACD,CAAC,CAAA;AAAA,IACJ;AAAA,EACF,CAAA,EAAG,CAAC,QAAA,EAAU,aAAa,CAAC,CAAA;AAE5B,EAAA,uBACEpC,GAAAA,CAAAC,QAAAA,EAAA,EACG,QAAA,EAAA,OAAA,IAAW,oDACVD,GAAAA;AAAA,IAAC,wBAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAQ,EAAE,mCAAmC,CAAA;AAAA,MAC7C,OAAA,EAAU,aAAA;AAAA,MACV,QAAA,EAAW,WAAA,CAAY,OAAA,CAAQ,IAAA,CAAA,kBAAA,iBAA4B,CAAE,QAAA;AAAA,MAC7D,QAAA,EAAW,WAAA;AAAA,MACX,EAAA,EAAK,CAAA,EAAA,kBAAA,iBAA4B,CAAA,EAAK,aAAc,CAAA,CAAA;AAAA,MACpD;AAAA;AAAA,sBAEFA,GAAAA;AAAA,IAAC,kBAAA;AAAA,IAAA;AAAA,MACC,WAAY,0BAAA,CAAe,YAAA;AAAA,MAC3B,YAAA,EAAa,EAAE,mCAAmC,CAAA;AAAA,MAClD,SAAA,EAAU,QAAA;AAAA,MACV,YAAA,EAAe,EAAE,mCAAmC,CAAA;AAAA,MACpD,OAAA,EAAU,WAAA;AAAA,MACV,UAAA;AAAA,MAEA,0BAAAA,GAAAA,CAAC,aAAA,EAAA,EAAM,aAAA,EAAY,MAAA,EAAO,WAAU,OAAA,EAAQ;AAAA;AAAA,GAC9C,EAEJ,CAAA;AAEJ,CAAA;ACxCA,IAAM,oBAAA,GAAuB;AAAA,EAC3B,8BAAuB;AAAA,IACrB,OAAA,EAAS;AAAA,GACX;AAAA,EACA,0BAAqB;AAAA,IACnB,OAAA,EAAS;AAAA,GACX;AAAA,EACA,sCAA2B;AAAA,IACzB,OAAA,EAAS;AAAA;AAEb,CAAA;AASO,IAAM,iBAAiB,CAAC;AAAA,EAC7B,EAAA;AAAA,EACA,IAAA;AAAA,EACA,GAAA;AAAA,EACA;AACF,CAAA,KAA2B;AACzB,EAAA,MAAM,EAAE,WAAA,EAAY,GAAI,cAAA,EAAe;AACvC,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,OAAA,EAAQ;AAEtB,EAAA,MAAM,eAAA,GAAkBoC,YAAY,MAAM;AACxC,IAAA,MAAM,eAA+C,EAAC;AAEtD,IAAA,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ;AAChB,MAAA,YAAA,CAAa,IAAA,CAAK;AAAA,QAChB,OAAA,EAAS,oBAAA,CAAqB,GAAG,CAAA,CAAE,OAAA;AAAA,QACnC,GAAA;AAAA,QACA,aAAA,EAAe;AAAA,OAChB,CAAA;AAAA,IACH,CAAC,CAAA;AAED,IAAA,OAAO,YAAA;AAAA,EACT,CAAA,EAAG,CAAC,IAAA,EAAM,EAAE,CAAC,CAAA;AAEb,EAAA,uBACEpC,IAAAC,QAAAA,EAAA,EACA,0BAAAoC,IAAAA,CAAC,OAAA,EAAA,EAAQ,SAAA,EAAY,2BAAA,CAAc,aAAA,EACjC,QAAA,EAAA;AAAA,oBAAArC,GAAAA;AAAA,MAAC,6BAAA;AAAA,MAAA;AAAA,QACC,EAAA,EAAK,GAAI,EAAG,CAAA,oBAAA,CAAA;AAAA,QACZ,OAAQ,eAAA,EAAgB;AAAA,QACxB,WAAY,2BAAA,CAAc,MAAA;AAAA,QAC1B,uBAAwB,0BAAA,CAAe,YAAA;AAAA,QACvC,OAAQ,WAAA,CAAY,OAAA;AAAA,QACpB,YAAA,EAAa,EAAE,2BAA2B;AAAA;AAAA,KAC5C;AAAA,oBAEAA,GAAAA;AAAA,MAAC,aAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,WAAY,0BAAA,CAAe,YAAA;AAAA,QAC3B,YAAA,EAAa,EAAE,sBAAsB,CAAA;AAAA,QACrC,OAAA,EAAU,OAAA;AAAA,QACV,SAAA,EAAY;AAAA,UACV,cAAA,EAAgB;AAAA,YACd,KAAA,EAAO,WAAA,CAAY,OAAA,CAAQ,IAAA,CAAK,YAAA;AAAA,YAChC,UAAA,EAAY,WAAA,CAAY,OAAA,CAAQ,IAAA,CAAK;AAAA,WACvC;AAAA,UACA,OAAA,EAAS;AAAA,YACP,WAAW,0BAAA,CAAe;AAAA,WAC5B;AAAA,UACA,KAAA,EAAO,EAAE,sBAAsB;AAAA;AACjC;AAAA;AACF,GAAA,EACF,CAAA,EACA,CAAA;AAEJ,CAAA;AChFO,IAAM,cAAA,GAAiB,CAAC,MAAA,KAAoB;AACjD,EAAA,MAAM,OAAA,GAAU,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,OAAO,OAAO,CAAA;AAC5D,EAAA,MAAM,WAAW,OAAA,KAAY,QAAA;AAC7B,EAAA,MAAM,MAAA,GAAS,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,SAAS,MAAM,CAAA;AAC5D,EAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,YAAY,KAAK,CAAA;AAC7D,EAAA,MAAM,QAAA,GAAW,QAAA,IAAa,MAAA,IAAU,CAAC,KAAA;AAEzC,EAAA,MAAM;AAAA,IACJ;AAAA,MACE,YAAA,EAAa;AAEjB,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,QAAA,IAAY,CAAC,MAAA,EAAQ;AAIvB,MAAA,MAAM,SAAA,GAAY,QAAA,CAAS,cAAA,CAAe,uBAAuB,CAAA;AACjE,MAAA,IAAI,CAAC,SAAA,EAAW;AAEhB,MAAA,MAAM,gBAAgB,SAAA,CAAU,YAAA;AAChC,MAAA,SAAA,CAAU,KAAA,CAAM,MAAA,GAAS,CAAA,EAAI,aAAA,GAAgB,CAAE,CAAA,EAAA,CAAA;AAG/C,MAAA,UAAA,CAAW,MAAM;AACf,QAAA,SAAA,CAAU,MAAM,MAAA,GAAS,EAAA;AAOzB,QAAA,MAAM,KAAA,GAAQ,UAAA,EAAW,GAAI,CAAC,CAAA;AAC9B,QAAA,IAAI,CAAC,KAAA,EAAO,MAAA,EAAQ,QAAA,EAAU,gBAAA,EAAkB;AAEhD,QAAA,MAAM,gBAAA,GAAmB,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,gBAAA,CAAiB,SAAA;AAEhE,QAAA,IAAI,mBAAmB,CAAA,EAAG;AACxB,UAAA,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,gBAAA,CAAiB,SAAA,GAAY,gBAAA,GAAmB,CAAA;AAAA,QACxE,CAAA,MAAO;AACL,UAAA,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,gBAAA,CAAiB,SAAA,GAAY,gBAAA,GAAmB,CAAA;AAAA,QACxE;AAEA,QAAA,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,gBAAA,CAAiB,SAAA,GAAY,gBAAA;AAAA,MACrD,GAAG,CAAC,CAAA;AAAA,IACN;AAAA,EACF,CAAA,EAAG,CAAC,QAAA,EAAU,MAAA,EAAQ,UAAU,CAAC,CAAA;AACnC,CAAA;ACjCO,IAAM,uBAAuB,CAAC;AAAA,EACjC,EAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA,aAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,cAAA;AAAA,EACA,aAAA;AAAA,EACA,gBAAA;AAAA,EACA;AACF,CAAA,KAAiC;AACjC,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,OAAA,EAAQ;AACtB,EAAA,MAAM,SAAA,GAAY,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,OAAO,SAAS,CAAA;AAChE,EAAA,MAAM,UAAA,GAAaa,OAA8B,IAAI,CAAA;AACrD,EAAA,MAAM,gBAAA,GAAmBA,OAA8B,IAAI,CAAA;AAC3D,EAAA,MAAM,cAAA,GAAiBA,OAA8B,IAAI,CAAA;AACzD,EAAA,MAAM,eAAA,GAAkBA,OAAiC,IAAI,CAAA;AAG7D,EAAAyB,UAAU,MAAM;AACd,IAAA,IAAI,MAAA,IAAU,UAAA,CAAW,OAAA,IAAW,gBAAA,CAAiB,OAAA,EAAS;AAC5D,MAAA,UAAA,CAAW,QAAQ,KAAA,CAAM,WAAA;AAAA,QACvB,CAAA,EAAA,EAAM,YAAA,CAAa,qBAAqB,CAAE,CAAA,CAAA;AAAA,QAC1C,CAAA,EAAI,gBAAA,CAAiB,OAAA,CAAQ,YAAa,CAAA,EAAA;AAAA,OAC5C;AAAA,IACF;AAAA,EACF,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAGX,EAAA,cAAA,CAAe,CAAC,CAAC,MAAM,CAAA;AAEvB,EAAA,IAAIC,QAAM,QAAA,CAAS,OAAA,CAAQ,QAAQ,CAAA,CAAE,SAAS,CAAA,EAAG;AAC/C,IAAA,uBACEvC,GAAAA,CAAAC,QAAAA,EAAA,EACA,QAAA,kBAAAoC,IAAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAM,UAAA;AAAA,QACN,UAAA;AAAA,QACA,YAAA,EAAc;AAAA,UACZ,WAAW,cAAA,IAAkB,cAAA;AAAA,UAC7B,YAAA,EAAc,MAAA;AAAA,UACd,WAAA,EAAa,eAAA;AAAA,UACb,YAAA,EAAc,aAAA;AAAA,UACd,MAAA,EAAQ;AAAA,YACN,IAAA,EAAM,OAAA;AAAA,YACN,OAAA,EAAS;AAAA,cACP,aAAA,EAAe,mBAAmB,IAAA,GAAO,KAAA;AAAA,cACzC,oBAAA,EAAsB;AAAA;AACxB,WACF;AAAA,UACA,WAAA,EAAa;AAAA,SACf;AAAA,QACA,WAAY,SAAA,IAAa,QAAA;AAAA,QACzB,SAAA,EAAYzB,WAAAA,CAAW,0BAAA,CAAY,OAAA,EAAU,SAAS,CAAA;AAAA,QACtD,MAAA;AAAA,QACA,YAAA;AAAA,QACA,yBAAA,EAA4B,qBAAA;AAAA,QAC5B,SAAA,EAAW;AAAA,UACT,MAAA,EAAQ;AAAA,YACN,WAAW,0BAAA,CAAY;AAAA;AACzB,SACF;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAAZ,GAAAA;AAAA,YAAC,iBAAA;AAAA,YAAA;AAAA,cACC,GAAA,EAAM,gBAAA;AAAA,cACN,WAAY,0BAAA,CAAY,MAAA;AAAA,cACxB,KAAA,EAAQ,OAAA;AAAA,cACR,SAAA,EAAW;AAAA,gBACT,OAAA,EAAS;AAAA,kBACP,WAAW,0BAAA,CAAY;AAAA;AACzB,eACF;AAAA,cAEE,wEACEA,GAAAA;AAAA,gBAAC,kBAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAY,SAAA,KAAc,KAAA,GAAQ,MAAA,GAAS,OAAA;AAAA,kBAC3C,KAAA,EAAQ,EAAE,yBAAyB,CAAA;AAAA,kBACnC,GAAA,EAAM,eAAA;AAAA,kBACN,SAAA,EAAYY,WAAAA,CAAW,SAAA,EAAW,0BAAA,CAAe,UAAU,CAAA;AAAA,kBAC3D,YAAA,EAAa,EAAE,yBAAyB,CAAA;AAAA,kBACxC,OAAA,EAAU;AAAA;AAAA,kCAEVZ,GAAAA;AAAA,gBAAC,cAAA;AAAA,gBAAA;AAAA,kBACD,EAAA;AAAA,kBACA,IAAA,EAAO,UAAU,EAAC;AAAA,kBAClB,GAAA,EAAM,eAAA;AAAA,kBACN,OAAA,EAAU;AAAA;AAAA;AACZ;AAAA,WAEN;AAAA,0BACAA,GAAAA;AAAA,YAAC,eAAA;AAAA,YAAA;AAAA,cACC,GAAA,EAAM,cAAA;AAAA,cACN,WAAY,0BAAA,CAAY,IAAA;AAAA,cAEtB;AAAA;AAAA;AACJ;AAAA;AAAA,KACF,EACA,CAAA;AAAA,EAEJ;AACF;ACtGA,IAAM,kBAAA,GAAqB;AAAA,EACzB,GAAA,EAAK,GAAA;AAAA,EACL,IAAA,EAAM,GAAA;AAAA,EACN,GAAA,EAAK;AACP,CAAA;AAEO,IAAM,sBAAsB,CAAC;AAAA,EAClC,EAAA;AAAA,EACA,OAAA;AAAA,EACA,aAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,cAAA;AAAA,EACA,aAAA;AAAA,EACA,gBAAA;AAAA,EACA;AACF,CAAA,KAAgC;AAC9B,EAAA,MAAM,EAAE,WAAA,EAAY,GAAI,cAAA,EAAe;AACvC,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,OAAA,EAAQ;AACtB,EAAA,MAAM,YAAY,cAAA,CAAe,CAAC,KAAA,KAAU,KAAA,CAAM,OAAO,SAAS,CAAA;AAClE,EAAA,MAAM,oBAAA,GAAuB,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,QAAQ,oBAAoB,CAAA;AAEvF,EAAA,MAAM,QAAA,GAAWa,OAAwB,IAAI,CAAA;AAC7C,EAAA,MAAM,iBAAA,GAAoBA,OAA8B,IAAI,CAAA;AAC5D,EAAA,MAAM,kBAAA,GAAqBA,OAA8B,IAAI,CAAA;AAC7D,EAAA,MAAM,mBAAA,GAAsBA,OAAiC,IAAI,CAAA;AAEjE,EAAA,MAAM,MAAA,GAASA,OAA4B,aAAa,CAAA;AACxD,EAAA,MAAM,WAAA,GAAcA,OAAgB,IAAI,CAAA;AAExC,EAAA,MAAM,SAAA,GAAY,QAAQ,MAAM;AAE9B,IAAA,MAAM,YAAA,GAAe,CAAC,GAAA,EAAa,GAAA,KAAgB;AACjD,MAAA,IAAI,MAAM,GAAA,EAAK;AACb,QAAA,OAAO,GAAA;AAAA,MACT,CAAA,MAAO;AACL,QAAA,OAAA,CAAS,CAAA,GAAI,OAAO,CAAA,GAAK,GAAA;AAAA,MAC3B;AAAA,IACF,CAAA;AAKA,IAAA,IAAI2B,UAAAA,GAAsB,CAAC,CAAC,CAAA;AAE5B,IAAA,MAAM,QAAA,GAAW,WAAA,CAAY,OAAA,CAAQ,IAAA,CAAK,EAA2C,CAAA,CAAE,OAAA;AACvF,IAAA,IAAI,QAAA,EAAU;AAKZ,MAAA,IAAI,SAAS,SAAA,EAAW;AACtB,QAAA,QAAO,SAAS,SAAA;AAAW,UACzB,KAAK,gBAAA;AAAA,UACL,KAAK,aAAA;AAAA,UACL,KAAK,GAAA;AACH,YAAA,MAAA,CAAO,OAAA,GAAU,QAAA,CAAS,SAAA,KAAc,GAAA,GAAM,gBAAgB,QAAA,CAAS,SAAA;AACvE,YAAA,WAAA,CAAY,OAAA,GAAU,KAAA;AACtB,YAAA,OAAO,EAAC;AAAA,UACV;AACE,YAAA,MAAM,MAAA,GAAS,SAAS,SAAA,GAAY,GAAA;AAEpC,YAAA,MAAA,GAAS,CAAA,IAAK,MAAA,GAAS,CAAA,GACnBA,UAAAA,CAAU,IAAA,CAAK,MAAM,CAAA,GACrBA,UAAAA,CAAU,IAAA,CAAK,kBAAA,CAAmB,GAAG,CAAA;AACzC,YAAA;AAAA;AACJ,MACF,CAAA,MAAO;AAEL,QAAAA,UAAAA,CAAU,IAAA,CAAK,kBAAA,CAAmB,GAAG,CAAA;AAAA,MACvC;AAQA,MAAA,IAAI,SAAS,UAAA,EAAY;AACvB,QAAA,QAAO,SAAS,UAAA;AAAY,UAC1B,KAAK,gBAAA;AAAA,UACL,KAAK,aAAA;AAAA,UACL,KAAK,GAAA;AACH,YAAA,MAAA,CAAO,OAAA,GAAU,QAAA,CAAS,UAAA,KAAe,GAAA,GAAM,gBAAgB,QAAA,CAAS,UAAA;AACxE,YAAAA,UAAAA,CAAU,KAAK,CAAC,CAAA;AAChB,YAAA,OAAOA,UAAAA;AAAA,UACT;AACE,YAAA,MAAM,OAAA,GAAU,SAAS,UAAA,GAAa,GAAA;AACtC,YAAA,MAAM,OAAA,GAAUA,WAAU,CAAC,CAAA;AAE3B,YAAA,OAAA,GAAU,KAAK,OAAA,GAAU,CAAA,GACrBA,UAAAA,CAAU,IAAA,CAAK,aAAa,OAAA,EAAS,OAAO,CAAC,CAAA,GAC7CA,WAAU,IAAA,CAAK,YAAA,CAAa,kBAAA,CAAmB,IAAA,EAAM,OAAO,CAAC,CAAA;AACjE,YAAA;AAAA;AACJ,MACF,CAAA,MAAO;AAEL,QAAAA,UAAAA,CAAU,KAAK,YAAA,CAAa,kBAAA,CAAmB,MAAMA,UAAAA,CAAU,CAAC,CAAC,CAAC,CAAA;AAAA,MACpE;AAKA,MAAA,IAAI,SAAS,SAAA,EAAW;AACtB,QAAA,QAAO,SAAS,SAAA;AAAW,UACzB,KAAK,gBAAA;AAAA,UACL,KAAK,aAAA;AAAA,UACL,KAAK,GAAA;AACH,YAAA,MAAA,CAAO,OAAA,GAAU,QAAA,CAAS,SAAA,KAAc,GAAA,GAAM,gBAAgB,QAAA,CAAS,SAAA;AACvE,YAAAA,UAAAA,CAAU,KAAK,CAAC,CAAA;AAChB,YAAA,OAAOA,UAAAA;AAAA,UACT;AACE,YAAA,MAAM,MAAA,GAAS,SAAS,SAAA,GAAY,GAAA;AACpC,YAAA,MAAM,OAAA,GAAUA,WAAU,CAAC,CAAA;AAE3B,YAAA,MAAA,GAAS,KAAK,MAAA,GAAS,CAAA,GACnBA,UAAAA,CAAU,IAAA,CAAK,aAAa,MAAA,EAAQ,OAAO,CAAC,CAAA,GAC5CA,WAAU,IAAA,CAAK,YAAA,CAAa,kBAAA,CAAmB,GAAA,EAAK,OAAO,CAAC,CAAA;AAChE,YAAA;AAAA;AACJ,MACF,CAAA,MAAO;AAEL,QAAAA,UAAAA,CAAU,KAAK,YAAA,CAAa,kBAAA,CAAmB,KAAKA,UAAAA,CAAU,CAAC,CAAC,CAAC,CAAA;AAAA,MACnE;AAAA,IACF,CAAA,MAAO;AAGL,MAAAA,WAAU,IAAA,CAAK,kBAAA,CAAmB,KAAK,kBAAA,CAAmB,IAAA,EAAM,mBAAmB,GAAG,CAAA;AAAA,IACxF;AAEA,IAAA,OAAOA,UAAAA;AAAA,EACT,CAAA,EAAG,CAAC,EAAA,EAAI,WAAW,CAAC,CAAA;AAEpB,EAAA,MAAM,OAAA,GAAU3B,OAAsB,IAAI,CAAA;AAE1C,EAAA,MAAM,mBAAA,GAAsBuB,YAAY,MAAM;AAC5C,IAAA,IAAI,OAAA,CAAQ,YAAY,IAAA,EAAM;AAE5B,MAAA,MAAM,OAAA,GAAU,QAAQ,OAAA,KAAY,SAAA,CAAU,SAAS,CAAA,GAAI,CAAA,GAAI,QAAQ,OAAA,GAAU,CAAA;AACjF,MAAA,QAAA,CAAS,OAAA,EAAS,OAAO,OAAO,CAAA;AAAA,IAClC;AAAA,EACF,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAEd,EAAA,MAAM,iBAAA,GAAoBA,WAAAA,CAAY,CAAC,CAAA,KAAqB;AAC1D,IAAA,IAAI,OAAA,CAAQ,YAAY,IAAA,EAAM;AAC5B,MAAA,QAAO,EAAE,IAAA;AAAM,QACb,KAAK,QAAA;AACH,UAAA,IAAI,OAAA,CAAQ,OAAA,KAAY,SAAA,CAAU,MAAA,GAAS,CAAA,EAAG;AAC9C,UAAA,QAAA,CAAS,OAAA,EAAS,MAAA,CAAO,SAAA,CAAU,MAAA,GAAS,CAAC,CAAA;AAC7C,UAAA;AAAA,QACF,KAAK,SAAA;AACH,UAAA,IAAI,OAAA,CAAQ,OAAA,KAAY,SAAA,CAAU,MAAA,GAAS,CAAA,EAAG;AAC9C,UAAA,QAAA,CAAS,OAAA,EAAS,MAAA,CAAO,OAAA,CAAQ,OAAA,GAAU,CAAC,CAAA;AAC5C,UAAA;AAAA,QACF,KAAK,UAAA;AACH,UAAA,YAAA,EAAa;AACb,UAAA;AAAA,QACF,KAAK,WAAA;AACH,UAAA,IAAI,OAAA,CAAQ,YAAY,CAAA,EAAG;AACzB,YAAA,YAAA,EAAa;AACb,YAAA;AAAA,UACF;AACA,UAAA,QAAA,CAAS,OAAA,EAAS,MAAA,CAAO,OAAA,CAAQ,OAAA,GAAU,CAAC,CAAA;AAC5C,UAAA;AAEA;AACJ,IACF;AAAA,EACF,CAAA,EAAG,CAAC,SAAA,EAAW,YAAY,CAAC,CAAA;AAE5B,EAAA,MAAM,YAAA,GAAe,QAAQ,MAAM;AACjC,IAAA,MAAM,WAAW,WAAA,CAAY,OAAA,CAAQ,IAAA,CAAK,EAA2C,EAAE,OAAA,EAAS,QAAA;AAChG,IAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACnC,MAAA,OAAO,MAAA;AAAA,IACT,CAAA,MAAA,IAAW,aAAa,IAAA,EAAM;AAC5B,MAAA,OAAO,MAAA;AAAA,IACT,CAAA,MAAO;AACL,MAAA,OAAO,GAAI,QAAS,CAAA,EAAA,CAAA;AAAA,IACtB;AAAA,EACF,CAAA,EAAG,CAAC,EAAA,EAAI,WAAW,CAAC,CAAA;AAEpB,EAAA,MAAM,SAAA,GAAY,QAAQ,MAAM;AAC9B,IAAA,IAAIK,UAAAA,GAAuB;AAAA,MACzB,MAAA,EAAQ,KAAA;AAAA,MACR,QAAA,EAAU;AAAA,KACZ;AACA,IAAA,MAAM,QAAQ,WAAA,CAAY,OAAA,CAAQ,IAAA,CAAK,EAA2C,EAAE,OAAA,EAAS,KAAA;AAC7F,IAAA,IAAI,KAAA,EAAO;AACT,MAAAA,WAAU,MAAA,GAAS,IAAA;AAEnB,MAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,QAAAA,WAAU,QAAA,GAAW,KAAA;AAAA,MACvB;AAAA,IACF;AAEA,IAAA,OAAOA,UAAAA;AAAA,EACT,CAAA,EAAG,CAAC,EAAA,EAAI,WAAW,CAAC,CAAA;AAEpB,EAAA,MAAM,eAAA,GAAkB,QAAQ,MAAM;AACpC,IAAA,IAAIC,UAAAA,GAAY,EAAA;AAChB,IAAA,IAAI,MAAA,CAAO,YAAY,gBAAA,EAAkB;AACvC,MAAAA,aAAY,0BAAA,CAAY,4BAAA;AAAA,IAC1B,CAAA,MAAO;AACL,MAAAA,aAAY,0BAAA,CAAY,yBAAA;AAAA,IAC1B;AACA,IAAA,OAAOA,UAAAA;AAAA,EACT,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAA,MAAM,cAAA,GAAiB,QAAQ,MAAM;AACnC,IAAA,OAAO,SAAA,CAAU,MAAA,GAAS,0BAAA,CAAY,cAAA,GAAiB,EAAA;AAAA,EACzD,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAEd,EAAA,MAAM,aAAA,GAAgB,CAACC,OAAAA,KAA6C;AAClE,IAAA,QAAOA,OAAAA;AAAQ,MACb,KAAK,gBAAA;AACH,QAAA,OAAO,SAAA;AAAA,MACT,KAAK,aAAA;AACH,QAAA,OAAO,SAAA;AAAA,MACT;AACE,QAAA,OAAO,SAAA;AAAA;AACX,EACF,CAAA;AAEA,EAAA,IAAIJ,QAAM,QAAA,CAAS,OAAA,CAAQ,QAAQ,CAAA,CAAE,SAAS,CAAA,EAAG;AAC/C,IAAA,uBACEvC,GAAAA,CAAAC,QAAAA,EAAA,EACA,QAAA,kBAAAoC,IAAAA;AAAA,MAAC,aAAA;AAAA,MAAA;AAAA,QACC,EAAA;AAAA,QACA,GAAA,EAAM,QAAA;AAAA,QACN,WAAY,0BAAA,CAAY,aAAA;AAAA,QACxB,MAAA;AAAA,QACA,YAAA,EAAc;AAAA,UACZ,WAAW,cAAA,IAAkB,kBAAA;AAAA,UAC7B,YAAA,EAAc,MAAA;AAAA,UACd,WAAA,EAAa,mBAAA;AAAA,UACb,YAAA,EAAc,aAAA;AAAA,UACd,MAAA,EAAQ;AAAA,YACN,IAAA,EAAM,OAAA;AAAA,YACN,OAAA,EAAS;AAAA,cACP,aAAA,EAAe,IAAA;AAAA;AAAA,cACf,oBAAA,EAAsB;AAAA;AACxB,WACF;AAAA,UACA,WAAA,EAAa;AAAA,SACf;AAAA,QACA,YAAA;AAAA,QACA,yBAAA,EAA4B,qBAAA;AAAA,QAC1B,GAAI,SAAA,CAAU,MAAA,GAAS,CAAA,GACrB;AAAA,UACA,UAAA,EAAY,SAAA;AAAA,UACZ,WAAA,EAAa,CAAA;AAAA,UACb,MAAA,EAAQ,aAAA,CAAc,MAAA,CAAO,OAAO;AAAA,SACtC,GACE;AAAA,UACA,MAAA,EAAQ,aAAA,CAAc,MAAA,CAAO,OAAO;AAAA,SACtC;AAAA,QAEF,MAAA,EAAS,CAAC,KAAA,KAAU;AAAE,UAAA,OAAA,CAAQ,OAAA,GAAU,KAAA;AAAA,QAAM,CAAA;AAAA,QAC9C,oBAAA;AAAA,QACA,SAAA,EAAY;AAAA,UACV,SAAA,EAAW;AAAA,YACT,SAAA,EAAWzB,WAAAA,CAAW,0BAAA,CAAY,SAAA,EAAW,eAAe,CAAA;AAAA,YAC5D,GAAA,EAAK,iBAAA;AAAA,YACL,KAAA,EAAO;AAAA,cACL,QAAA,EAAU;AAAA;AACZ,WACF;AAAA,UACA,aAAA,EAAe;AAAA,YACb,WAAW,0BAAA,CAAY,aAAA;AAAA,YACvB,OAAA,EAAS,mBAAA;AAAA,YACT,SAAA,EAAW;AAAA,WACb;AAAA,UACA,OAAA,EAAS;AAAA,YACP,SAAA,EAAWA,WAAAA,CAAW,0BAAA,CAAY,gBAAA,EAAkB,SAAS,CAAA;AAAA,YAC7D,WAAA,EAAa;AAAA,WACf;AAAA,UACA,QAAA,EAAU;AAAA,YACR,WAAW,0BAAA,CAAY;AAAA,WACzB;AAAA,UACA,QAAA,EAAU;AAAA,YACR,SAAA,EAAWA,WAAAA,CAAW,0BAAA,CAAY,iBAAA,EAAmB,cAAc,CAAA;AAAA,YACnE,KAAA,EAAO,EAAE,CAAC,CAAA,EAAA,EAAM,YAAA,CAAa,uBAAuB,CAAE,CAAA,CAAE,GAAG,SAAA,CAAU,QAAA;AAAS;AAChF,SACF;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAAZ,GAAAA;AAAA,YAAC,iBAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAQ,OAAA;AAAA,cACR,WAAY,0BAAA,CAAY,eAAA;AAAA,cACxB,SAAA,EAAY;AAAA,gBACV,OAAA,EAAS;AAAA,kBACP,WAAW,0BAAA,CAAY;AAAA;AACzB,eACF;AAAA,cAEA,wEACIA,GAAAA;AAAA,gBAAC,kBAAA;AAAA,gBAAA;AAAA,kBACD,SAAA,EAAY,SAAA,KAAc,KAAA,GAAQ,MAAA,GAAS,OAAA;AAAA,kBAC3C,KAAA,EAAQ,EAAE,yBAAyB,CAAA;AAAA,kBACnC,GAAA,EAAM,mBAAA;AAAA,kBACN,SAAA,EAAYY,WAAAA,CAAW,SAAA,EAAW,0BAAA,CAAe,UAAU,CAAA;AAAA,kBAC3D,YAAA,EAAa,EAAE,yBAAyB,CAAA;AAAA,kBACxC,OAAA,EAAU;AAAA;AAAA,kCAEVZ,GAAAA;AAAA,gBAAC,aAAA;AAAA,gBAAA;AAAA,kBACD,GAAA,EAAM,mBAAA;AAAA,kBACN,WAAY,0BAAA,CAAe,WAAA;AAAA,kBAC3B,YAAA,EAAa,EAAE,sBAAsB,CAAA;AAAA,kBACrC,OAAA,EAAU;AAAA;AAAA;AACZ;AAAA,WAEJ;AAAA,0BACAA,GAAAA;AAAA,YAAC,eAAA;AAAA,YAAA;AAAA,cACC,GAAA,EAAM,kBAAA;AAAA,cACN,WAAY,0BAAA,CAAY,IAAA;AAAA,cAEtB;AAAA;AAAA;AACJ;AAAA;AAAA,KACF,EACA,CAAA;AAAA,EAEJ;AACF;AC7UO,IAAM,0BAA0B,CAAC;AAAA,EACpC,OAAA;AAAA,EACA,aAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,cAAA;AAAA,EACA,aAAA;AAAA,EACA,gBAAA;AAAA,EACA;AACF,CAAA,KAAoC;AACpC,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,OAAA,EAAQ;AACtB,EAAA,MAAM,SAAA,GAAY,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,OAAO,SAAS,CAAA;AAChE,EAAA,MAAM,aAAA,GAAgBa,OAA8B,IAAI,CAAA;AACxD,EAAA,MAAM,mBAAA,GAAsBA,OAA8B,IAAI,CAAA;AAC9D,EAAA,MAAM,iBAAA,GAAoBA,OAA8B,IAAI,CAAA;AAC5D,EAAA,MAAM,kBAAA,GAAqBA,OAAiC,IAAI,CAAA;AAGhE,EAAAyB,UAAU,MAAM;AACd,IAAA,IAAI,MAAA,IAAU,aAAA,CAAc,OAAA,IAAW,mBAAA,CAAoB,OAAA,EAAS;AAClE,MAAA,aAAA,CAAc,QAAQ,KAAA,CAAM,WAAA;AAAA,QAC1B,CAAA,EAAA,EAAM,YAAA,CAAa,qBAAqB,CAAE,CAAA,CAAA;AAAA,QAC1C,CAAA,EAAI,mBAAA,CAAoB,OAAA,CAAQ,YAAa,CAAA,EAAA;AAAA,OAC/C;AAAA,IACF;AAAA,EACF,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAGX,EAAA,cAAA,CAAe,CAAC,CAAC,MAAM,CAAA;AAEvB,EAAA,IAAIC,QAAM,QAAA,CAAS,OAAA,CAAQ,QAAQ,CAAA,CAAE,SAAS,CAAA,EAAG;AAC/C,IAAA,uBACEvC,GAAAA,CAAAC,QAAAA,EAAA,EACA,QAAA,kBAAAoC,IAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAM,aAAA;AAAA,QACN,YAAA,EAAc;AAAA,UACZ,WAAW,cAAA,IAAkB,iBAAA;AAAA,UAC7B,YAAA,EAAc,MAAA;AAAA,UACd,WAAA,EAAa,kBAAA;AAAA,UACb,YAAA,EAAc,aAAA;AAAA,UACd,MAAA,EAAQ;AAAA,YACN,IAAA,EAAM,OAAA;AAAA,YACN,OAAA,EAAS;AAAA,cACP,aAAA,EAAe,mBAAmB,IAAA,GAAO,KAAA;AAAA,cACzC,oBAAA,EAAsB;AAAA;AACxB,WACF;AAAA,UACA,WAAA,EAAa;AAAA,SACf;AAAA,QACA,SAAA,EAAW;AAAA,UACT,MAAA,EAAQ;AAAA,YACN,WAAW,0BAAA,CAAY;AAAA;AACzB,SACF;AAAA,QACA,MAAA;AAAA,QACA,YAAA;AAAA,QACA,aAAA,EAAgB,IAAA;AAAA,QAChB,SAAA,EAAYzB,WAAAA,CAAW,0BAAA,CAAY,UAAA,EAAY,SAAS,CAAA;AAAA,QACxD,yBAAA,EAA4B,qBAAA;AAAA,QAE5B,QAAA,EAAA;AAAA,0BAAAZ,GAAAA;AAAA,YAAC,iBAAA;AAAA,YAAA;AAAA,cACC,GAAA,EAAM,mBAAA;AAAA,cACN,WAAY,0BAAA,CAAY,MAAA;AAAA,cACxB,KAAA,EAAQ,OAAA;AAAA,cACR,SAAA,EAAW;AAAA,gBACT,OAAA,EAAS;AAAA,kBACP,WAAW,0BAAA,CAAY;AAAA;AACzB,eACF;AAAA,cAEE,wEACIA,GAAAA;AAAA,gBAAC,kBAAA;AAAA,gBAAA;AAAA,kBACD,SAAA,EAAY,SAAA,KAAc,KAAA,GAAQ,MAAA,GAAS,OAAA;AAAA,kBAC3C,KAAA,EAAQ,EAAE,yBAAyB,CAAA;AAAA,kBACnC,GAAA,EAAM,kBAAA;AAAA,kBACN,SAAA,EAAYY,WAAAA,CAAW,SAAA,EAAW,0BAAA,CAAe,UAAU,CAAA;AAAA,kBAC3D,YAAA,EAAa,EAAE,yBAAyB,CAAA;AAAA,kBACxC,OAAA,EAAU;AAAA;AAAA,kCAEVZ,GAAAA;AAAA,gBAAC,aAAA;AAAA,gBAAA;AAAA,kBACD,GAAA,EAAM,kBAAA;AAAA,kBACN,WAAY,0BAAA,CAAe,WAAA;AAAA,kBAC3B,YAAA,EAAa,EAAE,sBAAsB,CAAA;AAAA,kBACrC,OAAA,EAAU;AAAA;AAAA;AACZ;AAAA,WAEN;AAAA,0BACAA,GAAAA;AAAA,YAAC,eAAA;AAAA,YAAA;AAAA,cACC,GAAA,EAAM,iBAAA;AAAA,cACN,WAAY,0BAAA,CAAY,IAAA;AAAA,cAEtB;AAAA;AAAA;AACJ;AAAA;AAAA,KACF,EACA,CAAA;AAAA,EAEJ;AACF;ACpGO,IAAM,sBAAsB,CAAC;AAAA,EAChC,EAAA;AAAA,EACA,OAAA;AAAA,EACA,aAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAA;AAAA,EACA,cAAA;AAAA,EACA;AACF,CAAA,KAAgC;AAChC,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,OAAA,EAAQ;AACtB,EAAA,MAAM,UAAA,GAAa,IAAA,IAAQ,QAAA,CAAS,cAAA,CAAe,IAAI,CAAA;AACvD,EAAA,MAAM,cAAA,GAAiBa,OAA8B,IAAI,CAAA;AACzD,EAAA,MAAM,oBAAA,GAAuBA,OAA8B,IAAI,CAAA;AAC/D,EAAA,MAAM,kBAAA,GAAqBA,OAA8B,IAAI,CAAA;AAC7D,EAAA,MAAM,mBAAA,GAAsBA,OAAiC,IAAI,CAAA;AAEjE,EAAA,MAAM,SAAA,GAAY,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,OAAO,SAAS,CAAA;AAGhE,EAAAyB,UAAU,MAAM;AACd,IAAA,IAAI,MAAA,IAAU,cAAA,CAAe,OAAA,IAAW,oBAAA,CAAqB,OAAA,EAAS;AACpE,MAAA,cAAA,CAAe,QAAQ,KAAA,CAAM,WAAA;AAAA,QAC3B,CAAA,EAAA,EAAM,YAAA,CAAa,qBAAqB,CAAE,CAAA,CAAA;AAAA,QAC1C,CAAA,EAAI,oBAAA,CAAqB,OAAA,CAAQ,YAAa,CAAA,EAAA;AAAA,OAChD;AAAA,IACF;AAAA,EACF,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAA,MAAM,aAAA,GAAgBF,YAAY,MAAM;AACtC,IAAA,IAAI,IAAA,KAAA,cAAA,cAA8B;AAChC,MAAA,OAAO,SAAA,KAAA,KAAA,aAAsC,0BAAA,CAAY,gBAAA,GAAmB,0BAAA,CAAY,iBAAA;AAAA,IAC1F,WAAW,IAAA,KAAA,YAAA,YAA4B;AACrC,MAAA,OAAO,SAAA,KAAA,KAAA,aAAsC,0BAAA,CAAY,iBAAA,GAAoB,0BAAA,CAAY,gBAAA;AAAA,IAC3F;AAAA,EACF,CAAA,EAAG,CAAC,IAAA,EAAM,SAAS,CAAC,CAAA;AAEpB,EAAA,IAAIG,QAAM,QAAA,CAAS,OAAA,CAAQ,QAAQ,CAAA,CAAE,SAAS,CAAA,EAAG;AAC/C,IAAA,uBACEvC,GAAAA,CAAAC,QAAAA,EAAA,EACA,QAAA,kBAAAoC,IAAAA;AAAA,MAAC,aAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAM,cAAA;AAAA,QACN,MAAA;AAAA,QACA,MAAA,EAAS,UAAA;AAAA,QACT,YAAA,EAAc;AAAA,UACZ,WAAW,cAAA,IAAkB,kBAAA;AAAA,UAC7B,YAAA,EAAc,MAAA;AAAA,UACd,WAAA,EAAa,mBAAA;AAAA,UACb,YAAA,EAAc,aAAA;AAAA,UACd,MAAA,EAAQ;AAAA,YACN,IAAA,EAAM,gBAAA;AAAA,YACN,OAAA,EAAS;AAAA,cACP,QAAA,EAAU,SAAA;AAAA,cACV,KAAA,EAAO,QAAA;AAAA,cACP,MAAA,EAAQ;AAAA;AACV,WACF;AAAA,UACA,WAAA,EAAa;AAAA,SACf;AAAA,QACA,WAAYzB,WAAAA,CAAW,0BAAA,CAAY,MAAA,EAAQ,SAAA,EAAW,eAAe,CAAA;AAAA,QAErE,QAAA,EAAA;AAAA,0BAAAZ,GAAAA;AAAA,YAAC,iBAAA;AAAA,YAAA;AAAA,cACC,GAAA,EAAM,oBAAA;AAAA,cACN,WAAY,0BAAA,CAAY,MAAA;AAAA,cACxB,KAAA,EAAQ,OAAA;AAAA,cACR,SAAA,EAAW;AAAA,gBACT,OAAA,EAAS;AAAA,kBACP,WAAW,0BAAA,CAAY;AAAA;AACzB,eACF;AAAA,cAEE,wEACEA,GAAAA;AAAA,gBAAC,kBAAA;AAAA,gBAAA;AAAA,kBACD,SAAA,EAAY,SAAA,KAAc,KAAA,GAAQ,MAAA,GAAS,OAAA;AAAA,kBAC3C,KAAA,EAAQ,EAAE,yBAAyB,CAAA;AAAA,kBACnC,GAAA,EAAM,mBAAA;AAAA,kBACN,SAAA,EAAYY,WAAAA,CAAW,SAAA,EAAW,0BAAA,CAAe,UAAU,CAAA;AAAA,kBAC3D,YAAA,EAAa,EAAE,yBAAyB,CAAA;AAAA,kBACxC,OAAA,EAAU;AAAA;AAAA,kCAEVZ,GAAAA;AAAA,gBAAC,cAAA;AAAA,gBAAA;AAAA,kBACD,EAAA;AAAA,kBACA,IAAA,EAAO,UAAU,EAAC;AAAA,kBAClB,GAAA,EAAM,mBAAA;AAAA,kBACN,OAAA,EAAU;AAAA;AAAA;AACZ;AAAA,WAEJ;AAAA,0BACAA,GAAAA;AAAA,YAAC,eAAA;AAAA,YAAA;AAAA,cACC,GAAA,EAAM,kBAAA;AAAA,cACN,WAAY,0BAAA,CAAY,IAAA;AAAA,cAEtB;AAAA;AAAA;AACJ;AAAA;AAAA,KACF,EACA,CAAA;AAAA,EAEJ;AACF;ACtHA,IAAM,YAAA,GAAe;AAAA,EACnB,2BAAwB,oBAAA;AAAA,EACxB,mCAA4B,mBAAA;AAAA,EAC5B,iCAA2B,uBAAA;AAAA,EAC3B,CAAA,cAAA,qBAA4B,CAAC,KAAA,qBAAoCA,GAAAA,CAAC,mBAAA,EAAA,EAAsB,GAAG,KAAA,EAAQ,IAAA,EAAA,cAAA,cAA6B,CAAA;AAAA,EAChI,CAAA,YAAA,mBAA0B,CAAC,KAAA,qBAAoCA,GAAAA,CAAC,mBAAA,EAAA,EAAsB,GAAG,KAAA,EAAQ,IAAA,EAAA,YAAA,YAA2B;AAC9H,CAAA;AAEO,IAAM,uBAAuB,CAAC;AAAA,EACnC,SAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA,KAIM;AAEJ,EAAA,uBACEA,GAAAA;AAAA,IAAC,wBAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAO,SAAA;AAAA,MACP,YAAA;AAAA,MACA,KAAA,EAAQ,UAAA;AAAA,MAEN;AAAA;AAAA,GACJ;AAEJ;ACxBA,IAAI,UAAA,GAA8D,IAAA;AAE3D,IAAM,UAAA,GAAa,CAAmB,GAAA,KAAW;AACtD,EAAA,MAAM,EAAE,WAAA,EAAY,GAAI,cAAA,EAAe;AACvC,EAAA,MAAM,UAAA,GAAa,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,QAAQ,UAAU,CAAA;AACnE,EAAA,MAAM,UAAA,GAAa,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,QAAQ,IAAI,CAAA;AAC7D,EAAA,MAAM,WAAA,GAAc,WAAW,GAAG,CAAA;AAClC,EAAA,MAAM,WAAW,cAAA,EAAe;AAEhC,EAAA,MAAM,OAAA,GAAU,WAAW,UAAU,CAAA;AAErC,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,UAAA,GAAa,kBAAA,CAAmC;AAAA,MAC9C,YAAA,EAAA,MAAA;AAAA,MACA,QAAA,EAAU,cAAA;AAAA,MACV,IAAA,EAAM,YAAY,OAAA,CAAQ,IAAA;AAAA,MAC1B,aAAA,EAAA,MAAA;AAAA,KACD,CAAA;AAAA,EACH;AACA,EAAA,MAAM,iBAAA,GAAoB,UAAA,IAAc,UAAA,CAAW,UAAU,CAAA;AAG7D,EAAA,MAAM,eAAgB,WAAA,CAAY,OAAA,CAAQ,IAAA,CAAK,GAA4C,GAAI,MAAA,EAAQ,QAAA,IAAA,MAAA;AAEvG,EAAA,MAAM,eAAgB,WAAA,CAAY,OAAA,CAAQ,IAAA,CAAK,GAA4C,GAAI,KAAA,EAAO,YAAA,IAAA,SAAA;AAEtG,EAAA,MAAM,WAAW,kBAAA,CAAiC;AAAA,IAChD,cAAe,WAAA,CAAY,OAAA,CAAQ,IAAA,CAAK,GAA4C,GAAI,KAAA,EAAO,YAAA,IAAA,SAAA;AAAA,IAC/F,QAAA,EAAU,YAAA;AAAA,IACV,MAAO,WAAA,CAAY,OAAA,CAAQ,IAAA,CAAK,GAA4C,GAAI,KAAA,EAAO;AAAA,GACxF,CAAA;AACD,EAAA,MAAM,SAAA,GAAY,UAAA,IAAc,QAAA,CAAS,UAAU,CAAA,IAAK,YAAA;AAExD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAuB,YAAY,CAAA;AACrE,EAAA,MAAM,iBAAA,GAAoB,YAAY,SAAS,CAAA;AAG/C,EAAA,MAAM,WAAA,GAAcoC,WAAAA,CAAY,CAAC,IAAA,KAAoD;AACjF,IAAA,OAAA,CAAQ,iBAAA,KAAsB,IAAA,IAAQ,iBAAA,KAAA,MAAA,iBAC9B,YAAA,KAAiB,IAAA,IAAQ,YAAA,KAAA,MAAA,YAAA;AAAA,EACrC,CAAA,EAAG,CAAC,iBAAA,EAAmB,YAAY,CAAC,CAAA;AAGpC,EAAA,MAAM,iBAAA,GAAoBA,WAAAA,CAAY,CAAC,IAAA,KAA6D;AAClG,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,OAAO,SAAA,KAAc,IAAA;AAAA,IACvB,CAAA,MAAO;AACL,MAAA,OAAO,SAAA,KAAA,cAAA,sBAA0C,SAAA,KAAA,YAAA;AAAA,IACnD;AAAA,EACF,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAGd,EAAA,MAAM,SAAA,GAAYA,YAAY,MAAuB;AAGnD,IAAA,IAAI,YAAA,KAAA,MAAA,oBAA6C,EAAC;AAElD,IAAA,IAAI,iBAAA,KAAA,MAAA,oBAAkD,EAAC;AAEvD,IAAA,IAAI,SAAA,KAAA,YAAA,qBAAyC,SAAA,KAAA,aAAA,oBAAwC,OAAO,EAAC;AAG7F,IAAA,IAAI,aAA8B,EAAC;AAGnC,IAAA,WAAA,CAAY,OAAA,CAAQ,YAAA,CAAa,OAAA,CAAQ,CAAC,UAAA,KAA8B;AACtE,MAAA,QAAO,UAAA;AAAY,QACjB,KAAA,kBAAA;AAEE,UAAA,UAAA,CAAW,KAAK,UAAU,CAAA;AAC1B,UAAA;AAAA,QACF,KAAA,cAAA;AACE,UAAA,IAAI,gCAAgC,EAAG;AACrC,YAAA,UAAA,CAAW,KAAK,UAAU,CAAA;AAAA,UAC5B;AACA,UAAA;AAAA,QACF,KAAA,YAAA;AACE,UAAA,IAAI,4BAA8B,EAAG;AACnC,YAAA,UAAA,CAAW,KAAK,UAAU,CAAA;AAAA,UAC5B;AACA,UAAA;AAEA;AACJ,IACF,CAAC,CAAA;AAGD,IAAA,IAAI,WAAW,MAAA,KAAW,CAAA,IAAK,WAAW,CAAC,CAAA,KAAA,kBAAA,yBAAsC,EAAC;AAElF,IAAA,OAAO,UAAA;AAAA,EACT,CAAA,EAAG,CAAC,WAAA,CAAY,OAAA,CAAQ,cAAc,iBAAA,EAAmB,SAAA,EAAW,YAAA,EAAc,WAAW,CAAC,CAAA;AAE9F,EAAA,MAAM,YAAA,GAAeA,YAAY,MAAM;AAErC,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,OAAO,SAAA;AAAA,IACT;AAGA,IAAA,IAAI,YAAA,KAAA,MAAA,aAAsC;AAExC,MAAA,IAAI,mBAAkB,EAAG;AACvB,QAAA,OAAO,YAAA;AAAA,MACT,CAAA,MAAO;AAEL,QAAA,OAAO,SAAA;AAAA,MACT;AAAA,IACF;AAKA,IAAA,QAAQ,aAAa,OAAA;AAAS;AAAA;AAAA,MAI5B,KAAA,kBAAA;AACE,QAAA,IAAI,mBAAkB,EAAG;AACvB,UAAA,OAAO,YAAA;AAAA,QACT,CAAA,MAAO;AACL,UAAA,OAAO,SAAA;AAAA,QACT;AAAA;AAAA,MAGF,KAAA,cAAA;AACE,QAAA,IAAI,gCAAgC,EAAG;AACrC,UAAA,OAAA,cAAA;AAAA,QACF,CAAA,MAAO;AAGL,UAAA,IAAI,CAAC,mDAA0C,EAAG;AAChD,YAAA,OAAO,SAAA;AAAA,UACT,CAAA,MAAO;AACL,YAAA,OAAO,YAAA;AAAA,UACT;AAAA,QACF;AAAA,MAEF,KAAA,YAAA;AACE,QAAA,IAAI,4BAA8B,EAAG;AACnC,UAAA,OAAA,YAAA;AAAA,QACF,CAAA,MAAO;AAGL,UAAA,IAAI,CAAC,+CAAwC,EAAG;AAC9C,YAAA,OAAO,SAAA;AAAA,UACT,CAAA,MAAO;AACL,YAAA,OAAO,YAAA;AAAA,UACT;AAAA,QACF;AAAA;AAAA;AAAA,MAIF,KAAK,IAAA;AAAA,MACL,KAAK,MAAA;AAEH,QAAA,IAAI,mDAA0C,EAAG;AAC/C,UAAA,IAAI,gCAAgC,EAAG;AACrC,YAAA,OAAA,cAAA;AAAA,UACF,CAAA,MAAO;AACL,YAAA,OAAO,YAAA;AAAA,UACT;AAAA,QACF,CAAA,MAAA,IAAW,+CAAwC,EAAG;AACpD,UAAA,IAAI,4BAA8B,EAAG;AACnC,YAAA,OAAA,YAAA;AAAA,UACF,CAAA,MAAO;AACL,YAAA,OAAO,YAAA;AAAA,UACT;AAAA,QACF,CAAA,MAAO;AACL,UAAA,OAAO,SAAA;AAAA,QACT;AAAA,MACF;AACE,QAAA,OAAO,YAAA;AAAA;AACX,EACF,CAAA,EAAG,CAAC,YAAA,EAAc,SAAA,EAAW,YAAA,EAAc,WAAA,EAAa,OAAA,EAAS,WAAA,EAAa,iBAAA,EAAmB,UAAA,EAAY,SAAS,CAAC,CAAA;AAGvH,EAAAE,UAAU,MAAM;AACd,IAAA,YAAA,CAAa,cAAc,CAAA;AAAA,EAC7B,GAAG,CAAC,SAAA,EAAW,mBAAmB,WAAA,EAAa,OAAA,EAAS,YAAY,CAAC,CAAA;AAGrE,EAAAA,UAAU,MAAM;AAEd,IAAA,IAAI,aAAa,OAAA,KAAA,kBAAA,kBAAqC;AAEtD,IAAA,IAAI,kDAA0C,SAAA,KAAA,YAAA,kBAAsC;AAClF,MAAA,IAAI,0DAAkD,iBAAA,KAAA,YAAA,kBAA8C;AAClG,QAAA,QAAA,CAAS,aAAA,CAAc;AAAA,UACrB,GAAA;AAAA,UACA,MAAA,EAAQ;AAAA,SACT,CAAC,CAAA;AAAA,MACJ;AAAA,IACF;AAAA,EACF,CAAA,EAAG,CAAC,QAAA,EAAU,GAAA,EAAK,WAAW,iBAAA,EAAmB,WAAA,EAAa,OAAO,CAAC,CAAA;AAGtE,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,WAAA,EAAa,UAAU,IAAA,EAAM;AAC/B,MAAA,IAAI,SAAA,KAAA,cAAA,oBAAwC;AAC1C,QAAA,QAAA,CAAS,UAAA,CAAW;AAAA,UAClB,GAAA;AAAA,UACA,UAAA,EAAA,cAAA;AAAA,SACD,CAAC,CAAA;AACF,QAAA,QAAA,CAAS,aAAA,CAAc;AAAA,UACrB,GAAA;AAAA,UACA,MAAA,EAAQ;AAAA,SACT,CAAC,CAAA;AAAA,MACJ,WAAW,SAAA,KAAA,YAAA,kBAAsC;AAC/C,QAAA,QAAA,CAAS,UAAA,CAAW;AAAA,UAClB,GAAA;AAAA,UACA,UAAA,EAAA,YAAA;AAAA,SACD,CAAC,CAAA;AACF,QAAA,QAAA,CAAS,aAAA,CAAc;AAAA,UACrB,GAAA;AAAA,UACA,MAAA,EAAQ;AAAA,SACT,CAAC,CAAA;AAAA,MACJ;AAAA,IACF;AAAA,EACF,CAAC,CAAA;AAQD,EAAAA,UAAU,MAAM;AAOd,IAAA,IAAI,WAAA,EAAa,MAAA,IAAU,IAAA,IAAQ,WAAA,EAAa,WAAW,IAAA,EAAM;AAC/D,MAAA,IAAI,SAAA,KAAA,cAAA,oBAAwC;AAG1C,QAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,WAAA,CAAY,GAAG,CAAA;AAC1C,QAAA,IAAI,UAAA,KAAA,cAAA,cAAoC;AACtC,UAAA,QAAA,CAAS,UAAA,CAAW;AAAA,YAClB,GAAA;AAAA,YACA,UAAA,EAAA,cAAA;AAAA,WACD,CAAC,CAAA;AAAA,QACJ;AAAA,MACF,WAAW,SAAA,KAAA,YAAA,kBAAsC;AAG/C,QAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,WAAA,CAAY,GAAG,CAAA;AAC1C,QAAA,IAAI,UAAA,KAAA,YAAA,YAAkC;AACpC,UAAA,QAAA,CAAS,UAAA,CAAW;AAAA,YAClB,GAAA;AAAA,YACA,UAAA,EAAA,YAAA;AAAA,WACD,CAAC,CAAA;AAAA,QACJ;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAA,EAAG,CAAC,QAAA,EAAU,GAAA,EAAK,SAAA,EAAW,aAAa,MAAA,EAAQ,WAAA,EAAa,OAAA,EAAS,OAAO,CAAC,CAAA;AAEjF,EAAA,OAAO;AAAA,IACL,SAAA;AAAA,IACA;AAAA,GACF;AACF;;;ACrRA,IAAA,kCAAA,GAAA;AAAA,EAAC,OAAA,EAAAM,oCAAAA;AAAA,EAEA,IAAA,EAAAC,iCAAAA;AAAA,EAKA,KAAA,EAAAC,kCAAAA;AAAA,EAKA,KAAA,EAAAC,kCAAAA;AAAA,EAQA,MAAA,EAAAC,mCAAAA;AAAA,EAmBA,WAAA,EAAAC;AAAA,CAAA;;;ACrCM,IAAM,oBAAA,GAAuB,CAAC,aAAA,KAAqD;AACxF,EAAA,OAAO,CAAC,EAAE,aAAA,IAAiB,aAAA,CAAc,MAAA,GAAS,CAAA,IAAK,aAAA,CAAc,IAAA,CAAK,CAAA,IAAA,KAAQ,IAAA,CAAK,SAAA,EAAW,QAAQ,CAAA,CAAA;AAC5G,CAAA;ACmBO,IAAM,kCAAkC,CAAC;AAAA,EAC9C;AACF,CAAA,KAAoC;AAClC,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,OAAA,EAAQ;AACtB,EAAA,MAAM,cAAc,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,OAAA,CAAQ,2CAAkC,CAAA;AAC5F,EAAA,MAAM,aAAA,GAAgB,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,YAAY,aAAa,CAAA;AAE7E,EAAA,MAAM,kBAAkB,cAAA,CAAe,CAAA,KAAA,KAAS,MAAM,WAAA,CAAY,gBAAA,EAAkB,aAAa,gBAAgB,CAAA;AAEjH,EAAA,MAAM,aAAA,GAAgB,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,QAAQ,oBAAoB,CAAA;AAChF,EAAA,MAAM,WAAW,cAAA,EAAe;AAEhC,EAAA,MAAM,UAAU,UAAA,CAAA,gBAAA,sBAAuC;AACvD,EAAA,MAAM,YAAY,OAAA,CAAQ,SAAA;AAE1B,EAAA,MAAM,EAAE,EAAA,EAAG,GAAI,gBAAA,EAAiB;AAIhC,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIC,SAAS,CAAC,CAAA;AAC1C,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,QAAAA,EAAiB;AAIzD,EAAA,MAAM,eAAA,GAAkBd,YAAY,MAAM;AACxC,IAAA,IAAI,CAAC,iBAAiB,OAAO,KAAA;AAC7B,IAAA,OAAO,eAAA,CAAgB,MAAA,KAAW,CAAA,GAC9B,QAAA,IAAY,eAAA,CAAgB,CAAC,CAAA,IAAK,QAAA,IAAY,eAAA,CAAgB,CAAC,CAAA,GAC/D,QAAA,KAAa,gBAAgB,CAAC,CAAA;AAAA,EACpC,CAAA,EAAG,CAAC,QAAA,EAAU,eAAe,CAAC,CAAA;AAG9B,EAAA,MAAM,KAAA,GAAQ,EAAE,6BAAA,EAA+B,EAAE,eAAe,CAAA,EAAG,WAAA,EAAa,aAAA,CAAc,MAAA,EAAQ,CAAA;AAEtG,EAAA,MAAM,OAAA,GAAUA,WAAAA,CAAY,CAAC,KAAA,KAAmB;AAC9C,IAAA,QAAA,CAAS,aAAA,CAAc;AAAA,MACrB,GAAA,EAAA,gBAAA;AAAA,MACA,MAAA,EAAQ;AAAA,KACT,CAAC,CAAA;AAAA,EACJ,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAIb,EAAA,MAAM,WAAA,GAAcA,WAAAA,CAAY,CAAC,CAAA,KAAmC;AAClE,IAAA,MAAM,SAAS,CAAA,CAAE,MAAA;AACjB,IAAA,WAAA,CAAY,QAAA,CAAS,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,EACpC,CAAA,EAAG,EAAE,CAAA;AAIL,EAAA,MAAM,YAAA,GAAeA,WAAAA,CAAY,CAAC,CAAA,KAAkC;AAClE,IAAA,CAAA,CAAE,cAAA,EAAe;AAEjB,IAAA,IAAI,CAAC,aAAA,EAAe;AAEpB,IAAA,eAAA,CAAgB,MAAS,CAAA;AAEzB,IAAA,MAAM,IAAA,GAAO,cAAc,IAAA,CAAK,CAAAe,UAAQA,KAAAA,CAAK,SAAA,CAAU,aAAa,QAAQ,CAAA;AAE5E,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,eAAA,CAAgB,CAAA,CAAE,sCAAsC,CAAC,CAAA;AACzD,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,eAAA,EAAgB,EAAG,OAAO,OAAA,CAAQ,KAAK,CAAA;AAE3C,IAAA,MAAM,KAAK,MAAM;AACf,MAAA,OAAA,CAAQ,KAAK,CAAA;AACb,MAAA,QAAA,CAAS,YAAA,CAAa,IAAI,CAAC,CAAA;AAC3B,MAAA,QAAA,CAAS,gBAAA,CAAiB,IAAI,CAAC,CAAA;AAAA,IACjC,CAAA;AAEA,IAAA,EAAA,CAAG,IAAA,EAAM,CAAC,aAAA,EAAe,EAAE,CAAA;AAAA,EAC7B,CAAA,EAAG,CAAC,QAAA,EAAU,aAAA,EAAe,aAAA,EAAe,GAAG,eAAA,EAAiB,EAAA,EAAI,OAAA,EAAS,QAAQ,CAAC,CAAA;AAGtF,EAAAb,UAAU,MAAM;AACd,IAAA,eAAA,IAAmB,WAAA,CAAY,eAAA,CAAgB,CAAC,CAAC,CAAA;AAAA,EACnD,CAAA,EAAG,CAAC,eAAe,CAAC,CAAA;AAGpB,EAAA,IAAI,CAAC,oBAAA,CAAqB,aAAa,CAAA,EAAG,OAAO,IAAA;AAEjD,EAAA,uBACEtC,GAAAA,CAAAC,QAAAA,EAAA,EACE,QAAA,kBAAAD,GAAAA;AAAA,IAAC,oBAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,UAAA,EAAY;AAAA,QACV,EAAA,EAAA,gBAAA;AAAA,QACA,UAAA;AAAA,QACA,OAAA,EAAS,EAAE,yCAAyC,CAAA;AAAA,QACpD,WAAW,kCAAA,CAAqB,OAAA;AAAA,QAChC,SAAA,EAAW,QAAA;AAAA,QACX,MAAA,EAAQ,aAAa,MAAA,IAAU,KAAA;AAAA,QAC/B,YAAA,EAAc,OAAA;AAAA,QACd,YAAA,EAAc,MAAM,OAAA,CAAQ,KAAK,CAAA;AAAA,QACjC,MAAA,EAAQ,QAAQ,SAAA;AAAU,OAC5B;AAAA,MAEA,QAAA,kBAAAA,GAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAQ,EAAE,0BAA0B,CAAA;AAAA,UACpC,WAAY,kCAAA,CAAqB,IAAA;AAAA,UACjC,QAAA,EAAW,YAAA;AAAA,UACX,SAAA,EAAW;AAAA,YACT,MAAA,EAAQ;AAAA,cACN,WAAW,kCAAA,CAAqB,MAAA;AAAA,cAChC,UAAA,EAAY,CAAC,QAAA,IAAY,eAAA;AAAgB;AAC3C,WACF;AAAA,UAEA,QAAA,kBAAAA,GAAAA;AAAA,YAAC,iBAAA;AAAA,YAAA;AAAA,cACC,KAAA;AAAA,cACA,IAAA,EAAK,gBAAA;AAAA,cACL,WAAY,kCAAA,CAAqB,WAAA;AAAA,cACjC,QAAA,EAAW,WAAA;AAAA,cACX,OAAA,EAAU,WAAA;AAAA,cACV,KAAA,EAAQ,QAAA;AAAA,cACR,QAAA,EAAW,CAAA;AAAA,cACX,UAAW,aAAA,CAAc,MAAA;AAAA,cACzB,IAAA,EAAO,CAAA;AAAA,cACP,aAAA,EAAe,EAAE,KAAA,EAAO,SAAA,EAAU;AAAA,cAClC,eAAA,EAAkB,IAAA;AAAA,cAClB,YAAA;AAAA,cACA,SAAA,EAAW;AAAA,gBACT,KAAA,EAAO;AAAA,kBACL,WAAW,kCAAA,CAAqB;AAAA,iBAClC;AAAA,gBACA,KAAA,EAAO;AAAA,kBACL,WAAW,kCAAA,CAAqB,KAAA;AAAA,kBAChC,SAAA,EAAW;AAAA;AACb;AACF;AAAA;AACF;AAAA;AACF;AAAA,GACF,EACF,CAAA;AAEJ;AC/JA,IAAM,UAAA,GAAa,2BAASA,GAAAA,CAAC,SAAI,KAAA,EAAM,4BAAA,EAA6B,MAAA,EAAO,MAAA,EAAO,OAAA,EAAQ,gBAAA,EAAiB,OAAM,MAAA,EAAO,IAAA,EAAK,WAAW,GAAG,KAAA,EAAO,0BAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,2UAAA,EAA4U,CAAA,EAAE,CAAA;AACxe,IAAO,gBAAA,GAAQ,UAAA;ACeR,IAAM,6BAAA,GAAgC,CAAC,EAAE,OAAA,EAAQ,KAAkC;AACxF,EAAA,MAAM,EAAE,WAAA,EAAY,GAAI,cAAA,EAAe;AACvC,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,OAAA,EAAQ;AACtB,EAAA,MAAM,cAAc,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,OAAA,CAAQ,2CAAkC,CAAA;AAC5F,EAAA,MAAM,aAAA,GAAgB,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,YAAY,aAAa,CAAA;AAC7E,EAAA,MAAM,WAAW,cAAA,EAAe;AAEhC,EAAA,MAAM,OAAA,GAAU,CAAC,KAAA,KAAmB;AAClC,IAAA,QAAA,CAAS,aAAA,CAAc;AAAA,MACrB,GAAA,EAAA,gBAAA;AAAA,MACA,MAAA,EAAQ;AAAA,KACT,CAAC,CAAA;AAAA,EACJ,CAAA;AAGA,EAAA,IAAI,CAAC,oBAAA,CAAqB,aAAa,CAAA,EAAG,OAAO,IAAA;AAEjD,EAAA,uBACEA,GAAAA,CAAAC,QAAAA,EAAA,EACG,QAAA,EAAA,OAAA,IAAW,oDACXD,GAAAA;AAAA,IAAC,wBAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAQ,EAAE,yCAAyC,CAAA;AAAA,MAClD,OAAA,EAAU,gBAAA;AAAA,MACV,QAAA,EAAW,WAAA,CAAY,OAAA,CAAQ,IAAA,CAAA,gBAAA,sBAAiC,CAAE,QAAA;AAAA,MAClE,EAAA,EAAA,gBAAA;AAAA,MACA,QAAA,EAAW,MAAM,OAAA,CAAQ,CAAC,aAAa,MAAM;AAAA;AAAA,sBAE/CA,GAAAA;AAAA,IAAC,kBAAA;AAAA,IAAA;AAAA,MACC,UAAA,EAAa,WAAA,CAAY,OAAA,CAAQ,IAAA,CAAA,gBAAA,sBAAiC,CAAE,UAAA;AAAA,MACpE,YAAA,EAAa,EAAE,yCAAyC,CAAA;AAAA,MACxD,SAAA,EAAU,QAAA;AAAA,MACV,YAAA,EAAe,EAAE,qCAAqC,CAAA;AAAA,MACtD,OAAA,EAAU,MAAM,OAAA,CAAQ,CAAC,aAAa,MAAM,CAAA;AAAA,MAE5C,0BAAAA,GAAAA,CAAC,gBAAA,EAAA,EAAW,aAAA,EAAY,MAAA,EAAO,WAAU,OAAA,EAAQ;AAAA;AAAA,GACnD,EAEJ,CAAA;AAEJ;;;ACxDA,IAAA,mCAAA,GAAA;AAAA,EAAC,OAAA,EAAA4C,qCAAAA;AAAA,EAEA,KAAA,EAAAQ,mCAAAA;AAAA,EAIA,aAAA,EAAAC,2CAAAA;AAAA,EAIA,YAAA,EAAAC,0CAAAA;AAAA,EAMA,KAAA,EAAAR,mCAAAA;AAAA,EAOA,UAAA,EAAAS,wCAAAA;AAAA,EAIA,YAAA,EAAAC,0CAAAA;AAAA,EACA,YAAA,EAAAC,0CAAAA;AAAA,EAMA,WAAA,EAAAR,yCAAAA;AAAA,EAyBA,kBAAA,EAAAS,gDAAAA;AAAA,EACA,aAAA,EAAAC,2CAAAA;AAAA,EAOe,MAAA,EAAAC,oCAAAA;AAAA,EAcf,WAAA,EAAAC,yCAAAA;AAAA,EAMa,KAAA,EAAAd,mCAAAA;AAAA,EAYb,KAAA,EAAAe,mCAAAA;AAAA,EAOW,UAAA,EAAAC,wCAAAA;AAAA,EAoDX,aAAA,EAAAC,2CAAAA;AAAA,EA6CA,WAAA,EAAAC,yCAAAA;AAAA,EAQA,YAAA,EAAAC,0CAAAA;AAAA,EASA,WAAA,EAAAC,yCAAAA;AAAA,EAoBA,WAAA,EAAAC,yCAAAA;AAAA,EAuBA,iBAAA,EAAAC,+CAAAA;AAAA,EAMA,eAAA,EAAAC,6CAAAA;AAAA,EAuDA,QAAA,EAAAC,sCAAAA;AAAA,EAIA,cAAA,EAAAC,4CAAAA;AAAA,EAwBA,eAAA,EAAAC,6CAAAA;AAAA,EAcA,eAAA,EAAAC,6CAAAA;AAAA,EAMA,mBAAA,EAAAC,iDAAAA;AAAA,EAkBA,MAAA,EAAAC,oCAAAA;AAAA,EAQA,eAAA,EAAAC;AAAA,CAAA;ACtWM,IAAM,uBAAuB,CAAgE;AAAA,EAClG,KAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,aAAA;AAAA,EACA,KAAA;AAAA,EACA,YAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA,KAAoC;AAClC,EAAA,MAAM,EAAE,WAAA,EAAY,GAAI,cAAA,EAAe;AAEvC,EAAA,MAAM,IAAA,GAAO,KAAA,EAAO,IAAA,IAAQ,YAAA,CAAa,IAAA;AACzC,EAAA,MAAM,eAAe,KAAA,EAAO,QAAA,KAAa,MAAA,GACrC,KAAA,CAAM,WACN,YAAA,CAAa,QAAA;AAEjB,EAAA,MAAM,aAAA,GAAgB;AAAA,IACpB,IAAA;AAAA,IACA,QAAA,EAAU;AAAA,GACZ;AAEA,EAAA,uBACE7E,GAAAA,CAAAC,QAAAA,EAAA,EACA,QAAA,kBAAAD,GAAAA;AAAA,IAAC,iBAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAYY,WAAAA,CAAW,mCAAA,CAAe,KAAA,EAAO,oCAAe,aAAa,CAAA;AAAA,MACzE,KAAA;AAAA,MACA,KAAA,EAAQ,aAAA;AAAA,MACR,KAAA,EAAQ,aAAA;AAAA,MACR,SAAA,EAAW;AAAA,QACT,GAAI,SAAA,EAAW,OAAA,GACX,EAAE,OAAA,EAAS,SAAA,CAAU,SAAQ,GAC7B;AAAA,UACE,OAAA,EAAS;AAAA,YACP,SAAA,EAAWA,WAAAA,CAAW,mCAAA,CAAe,KAAA,EAAO,oCAAe,UAAU;AAAA;AACvE,SACF;AAAA,QACJ,MAAA,EAAQ;AAAA,UACN,SAAA,EAAWA,WAAAA,CAAW,0BAAA,CAAe,IAAA,EAAM,oCAAe,YAAY,CAAA;AAAA,UACtE,YAAA,EAAc,SAAA;AAAA,UACd,UAAA;AAAA,UACA,SAAA,EAAW;AAAA,YACT,cAAA,EAAgB;AAAA,cACd,KAAA,EAAO,WAAA,CAAY,OAAA,CAAQ,IAAA,CAAK,YAAA;AAAA,cAChC,UAAA,EAAY,WAAA,CAAY,OAAA,CAAQ,IAAA,CAAK;AAAA,aACvC;AAAA,YACA,OAAA,EAAS;AAAA,cACP,WAAW,0BAAA,CAAe,OAAA;AAAA,cAC1B,SAAA,EAAW,KAAA;AAAA,cACX,MAAA,EAAQ,WAAA,CAAY,OAAA,CAAQ,IAAA,CAAK,aAAA,IAAiB;AAAA,aACpD;AAAA,YACA,KAAA,EAAO;AAAA,WACT;AAAA,UACA,OAAA,EAAS;AAAA;AACX;AACF;AAAA,GACF,EACA,CAAA;AAEJ;;;ACzEA,IAAM,eAA2B,EAAC;AAElC,IAAM,sBAAN,MAA0B;AAAA,EACxB,SAAS,MAAA,EAAwB;AAC/B,IAAA,MAAM,sBAAsB,YAAA,CAAa,SAAA,CAAU,OAAK,CAAA,CAAE,EAAA,KAAO,OAAO,EAAE,CAAA;AAE1E,IAAA,IAAI,uBAAuB,CAAA,EAAG;AAC5B,MAAA,YAAA,CAAa,mBAAmB,CAAA,GAAI,MAAA;AAAA,IACtC,CAAA,MAAO;AACL,MAAA,YAAA,CAAa,KAAK,MAAM,CAAA;AAAA,IAC1B;AAAA,EACF;AAAA,EAEA,WAAW,QAAA,EAAwB;AACjC,IAAA,MAAM,kBAAkB,YAAA,CAAa,MAAA,CAAO,CAAA,MAAA,KAAU,MAAA,CAAO,OAAO,QAAQ,CAAA;AAG5E,IAAA,YAAA,CAAa,MAAA,GAAS,CAAA;AACtB,IAAA,YAAA,CAAa,IAAA,CAAK,GAAG,eAAe,CAAA;AAAA,EACtC;AAAA,EAEA,UAAA,GAAyB;AACvB,IAAA,OAAO,CAAC,GAAG,YAAY,CAAA;AAAA,EACzB;AAAA,EAEA,gBAAA,GAAmB;AACjB,IAAA,MAAM,uBAAwD,EAAC;AAC/D,IAAA,MAAM,wBAA0D,EAAC;AAGjE,IAAA,CAAC,GAAG,YAAY,CAAA,CAAE,OAAA,EAAQ,CAAE,QAAQ,CAAA,MAAA,KAAU;AAE5C,MAAA,IAAI,MAAA,CAAO,WAAW,OAAA,EAAS;AAC7B,QAAA,MAAA,CAAO,OAAA,CAAQ,MAAA,CAAO,UAAA,CAAW,OAAO,CAAA,CAAE,QAAQ,CAAC,CAAC,GAAA,EAAK,SAAS,CAAA,KAAM;AACtE,UAAA,oBAAA,CAAqB,GAAa,CAAA,GAAI,SAAA;AAAA,QACxC,CAAC,CAAA;AAAA,MACH;AAGA,MAAA,IAAI,MAAA,CAAO,WAAW,QAAA,EAAU;AAC9B,QAAA,MAAA,CAAO,OAAA,CAAQ,MAAA,CAAO,UAAA,CAAW,QAAQ,CAAA,CAAE,QAAQ,CAAC,CAAC,GAAA,EAAK,SAAS,CAAA,KAAM;AACvE,UAAA,qBAAA,CAAsB,GAAa,CAAA,GAAI,SAAA;AAAA,QACzC,CAAC,CAAA;AAAA,MACH;AAAA,IACF,CAAC,CAAA;AAED,IAAA,OAAO;AAAA,MACL,oBAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF,CAAA;AAGO,IAAM,gBAAA,GAAmB,IAAI,mBAAA;ACnEpC,IAAM,kBAAkBkE,aAAAA,CAAmC;AAAA,EACzD,sBAAsB,EAAC;AAAA,EACvB,uBAAuB,EAAC;AAAA,EACxB,2BAA2B,EAAC;AAAA,EAC5B,8BAA8B,EAAC;AAAA,EAC/B,cAAA,EAAgB,gBAAA,CAAiB,QAAA,CAAS,IAAA,CAAK,gBAAgB,CAAA;AAAA,EAC/D,gBAAA,EAAkB,gBAAA,CAAiB,UAAA,CAAW,IAAA,CAAK,gBAAgB;AACrE,CAAC,CAAA;AAEM,IAAM,UAAA,GAAa,MAAMC,UAAAA,CAAW,eAAe,CAAA;AAEnD,IAAM,gBAAA,GAAmB,CAAC,EAAE,QAAA,EAAS,KAAqC;AAC/E,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAI7B,SAKvC,MAAM;AAEP,IAAA,MAAM,IAAA,GAAO,iBAAiB,gBAAA,EAAiB;AAC/C,IAAA,OAAO;AAAA,MACL,GAAG,IAAA;AAAA,MACH,yBAAA,EAA2B,0BAAA,CAA2B,IAAA,CAAK,qBAAA,EAAuB,MAAM,CAAA;AAAA,MACxF,4BAAA,EAA8B,0BAAA,CAA2B,IAAA,CAAK,qBAAA,EAAuB,SAAS;AAAA,KAChG;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,SAAS,0BAAA,CACP,eACA,IAAA,EACkC;AAClC,IAAA,OAAO,MAAA,CAAO,QAAQ,aAAa,CAAA,CAChC,OAAO,CAAC,CAAC,GAAG,SAAS,CAAA,KAAM,UAAU,IAAA,KAAS,IAAI,EAClD,MAAA,CAAO,CAAC,KAAK,CAAC,GAAA,EAAK,SAAS,CAAA,KAAM;AACjC,MAAA,GAAA,CAAI,GAAG,CAAA,GAAI,SAAA;AACX,MAAA,OAAO,GAAA;AAAA,IACT,CAAA,EAAG,EAAsC,CAAA;AAAA,EAC7C;AAGA,EAAAZ,UAAU,MAAM;AACd,IAAA,MAAM,sBAAsB,MAAM;AAChC,MAAA,MAAM,IAAA,GAAO,iBAAiB,gBAAA,EAAiB;AAC/C,MAAA,gBAAA,CAAiB;AAAA,QACf,GAAG,IAAA;AAAA,QACH,yBAAA,EAA2B,0BAAA,CAA2B,IAAA,CAAK,qBAAA,EAAuB,MAAM,CAAA;AAAA,QACxF,4BAAA,EAA8B,0BAAA,CAA2B,IAAA,CAAK,qBAAA,EAAuB,SAAS;AAAA,OAC/F,CAAA;AAAA,IACH,CAAA;AAGA,IAAA,mBAAA,EAAoB;AAAA,EACtB,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,cAAA,GAAiB,CAAC,MAAA,KAA4D;AAClF,IAAA,gBAAA,CAAiB,SAAS,MAAM,CAAA;AAAA,EAClC,CAAA;AAGA,EAAA,MAAM,gBAAA,GAAmB,CAAC,QAAA,KAAqB;AAC7C,IAAA,gBAAA,CAAiB,WAAW,QAAQ,CAAA;AAAA,EACtC,CAAA;AAGA,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ,GAAG,aAAA;AAAA,IACH,cAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,uBACEtC,GAAAA,CAAC,eAAA,CAAgB,QAAA,EAAhB,EAAyB,OACtB,QAAA,EACJ,CAAA;AAEJ;ACvEO,IAAM,uBAAuB,MAAM;AACxC,EAAA,MAAM,EAAE,WAAA,EAAY,GAAI,cAAA,EAAe;AACvC,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,OAAA,EAAQ;AACtB,EAAA,MAAM,EAAE,4BAAA,EAA6B,GAAI,UAAA,EAAW;AAEpD,EAAA,MAAM,WAAW,cAAA,EAAe;AAEhC,EAAA,MAAM,mBAAA,GAAsBoC,YAAY,MAAM;AAC5C,IAAA,QAAA,CAAS,6CAAqD,CAAA;AAAA,EAChE,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAA,uBACEpC,GAAAA,CAAAC,QAAAA,EAAA,EACA,QAAA,kBAAAD,GAAAA;AAAA,IAAC,oBAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAQ,EAAE,kCAAkC,CAAA;AAAA,MAC5C,SAAA,EAAY,EAAE,0CAA0C,CAAA;AAAA,MACxD,WAAA,EAAc,EAAE,0CAA0C,CAAA;AAAA,MAC1D,WAAA,EAAc,mBAAA;AAAA,MACd,aAAA,EAAgB,4BAAA;AAAA,MAChB,KAAA,EAAQ,YAAY,QAAA,CAAS,OAAA;AAAA,MAC7B,YAAA,EAAe;AAAA,QACb,IAAA,EAAM,0BAAA;AAAA,QACN,QAAA,EAAU;AAAA;AACZ;AAAA,GACF,EACA,CAAA;AAEJ;AAEO,IAAM,gCAAgC,MAAM;AACjD,EAAA,MAAM,EAAE,WAAA,EAAY,GAAI,cAAA,EAAe;AAEvC,EAAA,MAAM,YAAA,GAAe,WAAA,CAAY,QAAA,CAAS,OAAA,EAAS,QAAA,IAA0D,8BAAA;AAC7G,EAAA,MAAM,EAAE,4BAAA,EAA6B,GAAI,UAAA,EAAW;AAEpD,EAAA,uBACEA,GAAAA,CAAAC,QAAAA,EAAA,EACE,QAAA,EAAA,YAAA,CAAa,GAAA,CAAI,CAAC,GAAA,KAA+B;AACjD,IAAA,MAAM,KAAA,GAAQ,6BAA6B,GAAG,CAAA;AAC9C,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,aAAA,EAAiB,GAAI,CAAA,gEAAA,CAAkE,CAAA;AACpG,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,uBAAOD,GAAAA,CAAC,KAAA,CAAM,MAAN,EAAuB,UAAA,EAAa,QAAnB,GAA0B,CAAA;AAAA,EACrD,CAAC,CAAA,EACD,CAAA;AAEJ;AC/CO,IAAM,oBAAoB,MAAM;AACrC,EAAA,MAAM,EAAE,WAAA,EAAY,GAAI,cAAA,EAAe;AACvC,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,OAAA,EAAQ;AACtB,EAAA,MAAM,EAAE,yBAAA,EAA0B,GAAI,UAAA,EAAW;AAEjD,EAAA,MAAM,WAAW,cAAA,EAAe;AAEhC,EAAA,MAAM,gBAAA,GAAmBoC,YAAY,MAAM;AACzC,IAAA,QAAA,CAAS,uCAAkD,CAAA;AAAA,EAC7D,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAA,uBACEpC,GAAAA,CAAAC,QAAAA,EAAA,EACA,QAAA,kBAAAD,GAAAA;AAAA,IAAC,oBAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAQ,EAAE,yBAAyB,CAAA;AAAA,MACnC,SAAA,EAAY,EAAE,uCAAuC,CAAA;AAAA,MACrD,WAAA,EAAc,EAAE,uCAAuC,CAAA;AAAA,MACvD,WAAA,EAAc,gBAAA;AAAA,MACd,aAAA,EAAgB,yBAAA;AAAA,MAChB,KAAA,EAAQ,YAAY,QAAA,CAAS,IAAA;AAAA,MAC7B,YAAA,EAAe;AAAA,QACb,IAAA,EAAM,uBAAA;AAAA,QACN,QAAA,EAAU;AAAA;AACZ;AAAA,GACF,EACA,CAAA;AAEJ;AAEO,IAAM,6BAA6B,MAAM;AAC9C,EAAA,MAAM,EAAE,WAAA,EAAY,GAAI,cAAA,EAAe;AACvC,EAAA,MAAM,YAAA,GAAe,WAAA,CAAY,QAAA,CAAS,IAAA,EAAM,QAAA,IAAuD,2BAAA;AACvG,EAAA,MAAM,EAAE,yBAAA,EAA0B,GAAI,UAAA,EAAW;AAEjD,EAAA,uBACEA,GAAAA,CAAAC,QAAAA,EAAA,EACE,QAAA,EAAA,YAAA,CAAa,GAAA,CAAI,CAAC,GAAA,KAA4B;AAC9C,IAAA,MAAM,KAAA,GAAQ,0BAA0B,GAAG,CAAA;AAC3C,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,YAAA,EAAgB,GAAI,CAAA,gEAAA,CAAkE,CAAA;AACnG,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,uBAAOD,GAAAA,CAAC,KAAA,CAAM,MAAN,EAAuB,UAAA,EAAa,QAAnB,GAA0B,CAAA;AAAA,EACrD,CAAC,CAAA,EACD,CAAA;AAEJ;AC5BO,IAAM,4BAA4B,CAAC;AAAA,EACxC;AACF,CAAA,KAAoC;AAClC,EAAA,MAAM;AAAA,IACJ,eAAA;AAAA,IACA,uBAAA;AAAA,IACA,oBAAA;AAAA,IACA,kBAAA;AAAA,IACA,2BAAA;AAAA,IACA,wBAAA;AAAA,IACA;AAAA,MACE,iBAAA,EAAkB;AACtB,EAAA,MAAM,EAAE,WAAA,EAAY,GAAI,cAAA,EAAe;AACvC,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,OAAA,EAAQ;AACtB,EAAA,MAAM,EAAE,qBAAA,EAAsB,GAAI,UAAA,EAAW;AAC7C,EAAA,MAAM,OAAA,GAAU,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,OAAO,OAAO,CAAA;AAC5D,EAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,YAAY,KAAK,CAAA;AAC7D,EAAA,MAAM,0BAAA,GAA6B,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,YAAY,0BAA0B,CAAA;AACvG,EAAA,MAAM,QAAA,GAAW,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,OAAO,iBAAiB,CAAA;AACvE,EAAA,MAAM,cAAc,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,OAAA,CAAQ,+BAA4B,CAAA;AACtF,EAAA,MAAM,WAAW,cAAA,EAAe;AAEhC,EAAA,MAAM,YAAA,GAAegF,QAAQ,MAAM;AACjC,IAAA,OAAO,OAAA,KAAY,QAAA,GACf,kBAAA,GACA,KAAA,GACE,eAAA,GACA,kBAAA;AAAA,EACR,GAAG,CAAC,OAAA,EAAS,OAAO,eAAA,EAAiB,kBAAA,EAAoB,kBAAkB,CAAC,CAAA;AAE5E,EAAA,MAAM,UAAU,UAAA,CAAA,UAAA,gBAAiC;AACjD,EAAA,MAAM,YAAY,OAAA,CAAQ,SAAA;AAE1B,EAAA,MAAM,OAAA,GAAU,CAAC,KAAA,KAAmB;AAClC,IAAA,QAAA,CAAS,aAAA,CAAc;AAAA,MACrB,GAAA,EAAA,UAAA;AAAA,MACA,MAAA,EAAQ;AAAA,KACT,CAAC,CAAA;AAGF,IAAA,IAAI,CAAC,KAAA,EAAO,QAAA,CAAS,WAAA,CAAY,KAAK,CAAC,CAAA;AAAA,EACzC,CAAA;AAEA,EAAA,MAAM,UAAA,GAAa5C,YAAY,MAAM;AACnC,IAAA,QAAA,CAAS,6CAAqD,CAAA;AAAA,EAChE,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAA,MAAM,YAAA,GAAeA,WAAAA,CAAY,CAAC,GAAA,KAAgB;AAChD,IAAA,MAAM,YAAA,GAAe;AAAA,MACnB,oBAAA,IAAwB,uBAAA;AAAA,MACxB,wBAAA,IAA4B;AAAA,MAC5B,IAAA,EAAK;AAEP,IAAA,OAAO,YAAA,CAAa,SAAS,GAAG,CAAA;AAAA,EAClC,CAAA,EAAG,CAAC,oBAAA,EAAsB,wBAAwB,CAAC,CAAA;AAEnD,EAAA,MAAM,eAAA,GAAkBA,WAAAA,CAAY,CAAC,GAAA,KAAgB;AACnD,IAAA,MAAM,eAAA,GAAkB;AAAA,MACtB,uBAAA,IAA2B,0BAAA;AAAA,MAC3B,2BAAA,IAA+B;AAAA,MAC/B,IAAA,EAAK;AAEP,IAAA,OAAO,eAAA,CAAgB,SAAS,GAAG,CAAA;AAAA,EACrC,CAAA,EAAG,CAAC,uBAAA,EAAyB,2BAA2B,CAAC,CAAA;AAEzD,EAAA,MAAM,gBAAA,GAAmBA,WAAAA,CAAY,CAAC,GAAA,KAAgB;AAEpD,IAAA,IAAI,YAAY,QAAA,EAAU;AACxB,MAAA,OAAO,KAAA;AAAA,IACT;AAGA,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,OAAO,KAAA;AAAA,IACT;AAGA,IAAA,IAAI,MAAA,CAAO,MAAA,CAAO,kBAAkB,CAAA,CAAE,SAAS,GAAyB,CAAA,IACpE,MAAA,CAAO,MAAA,CAAO,qBAAqB,CAAA,CAAE,QAAA,CAAS,GAA4B,CAAA,IAC1E,uCACA,GAAA,KAAA,cAAA,qBAAqC;AACvC,MAAA,OAAO,CAAC,0BAAA;AAAA,IACV;AAGA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,EAAG,CAAC,OAAA,EAAS,0BAA0B,CAAC,CAAA;AAExC,EAAA,MAAM,cAAA,GAAiBA,YAAY,MAAM;AACvC,IAAA,QAAQ,QAAA;AAAU,MAChB,KAAA,MAAA;AACE,QAAA,uBAAOpC,IAAC,0BAAA,EAAA,EAA2B,CAAA;AAAA,MAErC,KAAA,SAAA;AACE,QAAA,uBAAOA,IAAC,6BAAA,EAAA,EAA8B,CAAA;AAAA,MAExC,KAAA,SAAA;AAAA,MACA;AACE,QAAA,uBACEA,GAAAA,CAAAC,QAAAA,EAAA,EACI,QAAA,EAAA,YAAA,CAAa,MAAA,GAAS,CAAA,IAAK,qBAAA,GACzB,YAAA,CACC,MAAA,CAAO,CAAC,GAAA,KAAQ;AAEf,UAAA,IAAI,YAAA,CAAa,GAAG,CAAA,IAAK,eAAA,CAAgB,GAAG,CAAA,EAAG;AAC7C,YAAA,OAAO,KAAA;AAAA,UACT;AAEA,UAAA,IAAI,gBAAA,CAAiB,GAAG,CAAA,EAAG;AACzB,YAAA,OAAO,KAAA;AAAA,UACT;AAEA,UAAA,OAAO,IAAA;AAAA,QACT,CAAC,CAAA,CACA,GAAA,CAAI,CAAC,GAAA,KAAQ;AACZ,UAAA,MAAM,KAAA,GAAQ,sBAAsB,GAAG,CAAA;AACvC,UAAA,IAAI,CAAC,KAAA,EAAO;AACV,YAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,YAAA,EAAgB,GAAI,CAAA,gEAAA,CAAkE,CAAA;AACnG,YAAA,OAAO,IAAA;AAAA,UACT;AACA,UAAA,uBAAOD,IAAC,KAAA,CAAM,IAAA,EAAN,EAAyB,GAAG,KAAA,CAAM,SAAjB,GAAyB,CAAA;AAAA,QACpD,CAAC,CAAA,mBACDA,GAAAA,CAAAC,QAAAA,EAAA,EAAE,CAAA,EAER,CAAA;AAAA;AAEN,EACF,CAAA,EAAG,CAAC,qBAAA,EAAuB,QAAA,EAAU,cAAc,YAAA,EAAc,eAAA,EAAiB,gBAAgB,CAAC,CAAA;AAEnG,EAAA,MAAM,UAAA,GAAamC,YAAY,MAAM;AACnC,IAAA,QAAQ,QAAA;AAAU,MAChB,KAAA,MAAA;AACE,QAAA,OAAO,EAAE,yBAAyB,CAAA;AAAA,MAEpC,KAAA,SAAA;AACE,QAAA,OAAO,EAAE,kCAAkC,CAAA;AAAA,MAE7C,KAAA,SAAA;AAAA,MACA;AACE,QAAA,OAAO,EAAE,0BAA0B,CAAA;AAAA;AACvC,EACF,CAAA,EAAG,CAAC,QAAA,EAAU,CAAC,CAAC,CAAA;AAEhB,EAAA,MAAM,gBAAA,GAAmBA,YAAY,MAAM;AACzC,IAAA,QAAQ,QAAA;AAAU,MAChB,KAAA,MAAA;AACE,QAAA,OAAO,WAAA,CAAY,SAAS,IAAA,EAAM,MAAA,IAAA,OAAA;AAAA,MAEpC,KAAA,SAAA;AACE,QAAA,OAAO,WAAA,CAAY,SAAS,OAAA,EAAS,MAAA,IAAA,OAAA;AAAA,MAEvC,KAAA,SAAA;AAAA,MACA;AACE,QAAA,OAAA,OAAA;AAAA;AACJ,EACF,CAAA,EAAG,CAAC,QAAA,EAAU,WAAA,CAAY,SAAS,OAAA,EAAS,WAAA,CAAY,QAAA,CAAS,IAAI,CAAC,CAAA;AAEtE,EAAAE,UAAU,MAAM;AACd,IAAA,MAAM,YAAA,GAAe,CAAC,KAAA,KAAyB;AAC7C,MAAA,IAAI,KAAA,CAAM,GAAA,KAAQ,QAAA,IAAY,QAAA,KAAA,SAAA,gBAA8C;AAC1E,QAAA,QAAA,CAAS,6CAAqD,CAAA;AAAA,MAChE;AAAA,IACF,CAAA;AAEF,IAAA,QAAA,CAAS,gBAAA,CAAiB,SAAA,EAAW,YAAA,EAAc,IAAI,CAAA;AAEvD,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,YAAA,EAAc,IAAI,CAAA;AAAA,IAC5D,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,QAAA,EAAU,QAAQ,CAAC,CAAA;AAIrB,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,WAAA,EAAa,MAAA,EAAQ,UAAA,EAAW;AAAA,EACvC,CAAA,EAAG,CAAC,WAAA,EAAa,MAAA,EAAQ,UAAU,CAAC,CAAA;AAEpC,EAAA,uBACEtC,GAAAA,CAAAC,QAAAA,EAAA,EACA,QAAA,kBAAAD,GAAAA;AAAA,IAAC,oBAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,UAAA,EAAa;AAAA,QACX,EAAA,EAAA,UAAA;AAAA,QACA,UAAA;AAAA,QACA,SAAS,UAAA,EAAW;AAAA,QACpB,eAAe,gBAAA,EAAiB;AAAA,QAChC,WAAW,mCAAA,CAAe,OAAA;AAAA,QAC1B,SAAA,EAAW,QAAA;AAAA,QACX,MAAA,EAAQ,aAAa,MAAA,IAAU,KAAA;AAAA,QAC/B,YAAA,EAAc,OAAA;AAAA,QACd,cAAc,MAAM;AAAE,UAAA,QAAA,KAAA,SAAA,iBAA+C,OAAA,CAAQ,KAAK,CAAA,GAAI,UAAA,EAAW;AAAA,QAAE,CAAA;AAAA,QACnG,MAAA,EAAQ,QAAQ,SAAA,EAAU;AAAA,QAC1B,UAAA,EAAY,QAAA;AAAA,QACZ,gBAAA,EAAkB,IAAA;AAAA,QAClB,qBAAA,EAAuB,QAAA,KAAA,SAAA;AAAA,OACzB;AAAA,MAEE,QAAA,EAAA,cAAA;AAAe;AAAA,GACnB,EACA,CAAA;AAEJ;AC9OA,IAAM,YAAA,GAAe,2BAASA,GAAAA,CAAC,SAAI,KAAA,EAAM,4BAAA,EAA6B,MAAA,EAAO,MAAA,EAAO,OAAA,EAAQ,gBAAA,EAAiB,OAAM,MAAA,EAAO,IAAA,EAAK,WAAW,GAAG,KAAA,EAAO,0BAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,4XAAA,EAA6X,CAAA,EAAE,CAAA;AAC3hB,IAAO,kBAAA,GAAQ,YAAA;ACgBR,IAAM,uBAAA,GAA0B,CAAC,EAAE,OAAA,EAAQ,KAAkC;AAClF,EAAA,MAAM,EAAE,WAAA,EAAY,GAAI,cAAA,EAAe;AACvC,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,OAAA,EAAQ;AACtB,EAAA,MAAM,cAAc,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,OAAA,CAAQ,+BAA4B,CAAA;AACtF,EAAA,MAAM,WAAW,cAAA,EAAe;AAEhC,EAAA,MAAM,OAAA,GAAU,CAAC,KAAA,KAAmB;AAClC,IAAA,QAAA,CAAS,aAAA,CAAc;AAAA,MACrB,GAAA,EAAA,UAAA;AAAA,MACA,MAAA,EAAQ;AAAA,KACT,CAAC,CAAA;AAGF,IAAA,IAAI,CAAC,KAAA,EAAO,QAAA,CAAS,WAAA,CAAY,KAAK,CAAC,CAAA;AAAA,EACzC,CAAA;AAEA,EAAA,uBACEA,GAAAA,CAAAC,QAAAA,EAAA,EACG,QAAA,EAAA,OAAA,IAAW,oDACVD,GAAAA;AAAA,IAAC,wBAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAQ,EAAE,0BAA0B,CAAA;AAAA,MACpC,OAAA,EAAU,kBAAA;AAAA,MACV,QAAA,EAAW,WAAA,CAAY,OAAA,CAAQ,IAAA,CAAA,UAAA,gBAA2B,CAAE,QAAA;AAAA,MAC5D,EAAA,EAAA,UAAA;AAAA,MACA,QAAA,EAAW,MAAM,OAAA,CAAQ,CAAC,aAAa,MAAM;AAAA;AAAA,sBAE/CA,GAAAA;AAAA,IAAC,kBAAA;AAAA,IAAA;AAAA,MACC,UAAA,EAAa,WAAA,CAAY,OAAA,CAAQ,IAAA,CAAA,UAAA,gBAA2B,CAAE,UAAA;AAAA,MAC9D,YAAA,EAAa,EAAE,0BAA0B,CAAA;AAAA,MACzC,SAAA,EAAU,QAAA;AAAA,MACV,YAAA,EAAe,EAAE,0BAA0B,CAAA;AAAA,MAC3C,OAAA,EAAU,MAAM,OAAA,CAAQ,CAAC,aAAa,MAAM,CAAA;AAAA,MAE5C,0BAAAA,GAAAA,CAAC,kBAAA,EAAA,EAAS,aAAA,EAAY,MAAA,EAAO,WAAU,OAAA,EAAQ;AAAA;AAAA,GACjD,EAEJ,CAAA;AAEJ;;;ACxDA,IAAA,uBAAA,GAAA;AAAA,EACC,OAAA,EAAA4C,yBAAAA;AAAA,EAEA,MAAA,EAAAqC,wBAAAA;AAAA,EAUA,WAAA,EAAAC,6BAAAA;AAAA,EAKA,WAAA,EAAAC,6BAAAA;AAAA,EAoBA,UAAA,EAAAC,4BAAAA;AAAA,EACA,WAAA,EAAAC,6BAAAA;AAAA,EAyBA,IAAA,EAAAC,sBAAAA;AAAA,EAUA,QAAA,EAAAC,0BAAAA;AAAA,EASU,cAAA,EAAAC,gCAAAA;AAAA,EAQV,YAAA,EAAAC,8BAAAA;AAAA,EAKA,iBAAA,EAAAC,mCAAAA;AAAA,EAIA,oBAAA,EAAAC,sCAAAA;AAAA,EAiDA,KAAA,EAAAC;AAAA,CAAA;ACpJD,IAAM,eAAA,GAAkB,2BAAS5F,GAAAA,CAAC,SAAI,KAAA,EAAM,4BAAA,EAA6B,MAAA,EAAO,MAAA,EAAO,OAAA,EAAQ,gBAAA,EAAiB,OAAM,MAAA,EAAO,IAAA,EAAK,WAAW,GAAG,KAAA,EAAO,0BAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,uDAAA,EAAwD,CAAA,EAAE,CAAA;AACzN,IAAO,qBAAA,GAAQ,eAAA;AC+BR,IAAM,oBAAA,GAAuB,CAAC,EAAE,UAAA,EAAW,KAAoC;AACpF,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,OAAA,EAAQ;AAEtB,EAAA,MAAM,OAAA,GAAUa,OAAuB,IAAI,CAAA;AAC3C,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,IAAIqC,QAAAA,iBAAmB,IAAI,KAAK,CAAA;AAEpE,EAAA,MAAM,gBAAA,GAAmB,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,YAAY,gBAAgB,CAAA;AACnF,EAAA,MAAM,QAAA,GAAW,kBAAkB,GAAA,EAAK,YAAA;AACxC,EAAA,MAAM,OAAA,GAAU,kBAAkB,GAAA,EAAK,IAAA;AAEvC,EAAA,MAAM,SAAA,GAAY,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,OAAO,SAAS,CAAA;AAChE,EAAA,MAAM,KAAA,GAAQ,SAAA,KAAA,KAAA;AAEd,EAAA,MAAM,cAAc,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,OAAA,CAAQ,qBAAuB,CAAA;AACjF,EAAA,MAAM,WAAW,cAAA,EAAe;AAEhC,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,YAAA,EAAa;AAEhC,EAAA,MAAM,UAAU,UAAA,CAAA,KAAA,WAA4B;AAC5C,EAAA,MAAM,YAAY,OAAA,CAAQ,SAAA;AAE1B,EAAA,MAAM,EAAE,QAAA,EAAS,GAAI,UAAU,EAAE,WAAA,EAAa,QAAQ,CAAA;AACtD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIX,OAAAA,CAAM,SAAS,EAAE,CAAA;AACvD,EAAA,MAAM,cAAA,GAAiBA,OAAAA,CAAM,MAAA,CAAyB,IAAI,CAAA;AAE1D,EAAA,MAAM,aAAA,GAAgB,CAAC,KAAA,EAAkBsD,YAAAA,KAAmC;AAC1E,IAAA,IAAI,CAACA,YAAAA,EAAa;AAChB,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,MAAM,eAAA,GAAkB,CAACC,MAAAA,KAAgC;AACvD,MAAA,OAAOA,MAAAA,CAAM,MAAA,CAAO,CAAC,GAAA,EAAgB,IAAA,KAAkB;AACrD,QAAA,IAAI,KAAK,KAAA,IAAS,QAAA,CAAS,IAAA,CAAK,KAAA,EAAOD,YAAW,CAAA,EAAG;AACnD,UAAA,GAAA,CAAI,KAAK,EAAE,GAAG,IAAA,EAAM,QAAA,EAAU,QAAW,CAAA;AAAA,QAC3C;AACA,QAAA,IAAI,KAAK,QAAA,EAAU;AACjB,UAAA,GAAA,CAAI,IAAA,CAAK,GAAG,eAAA,CAAgB,IAAA,CAAK,QAAQ,CAAC,CAAA;AAAA,QAC5C;AACA,QAAA,OAAO,GAAA;AAAA,MACT,CAAA,EAAG,EAAE,CAAA;AAAA,IACP,CAAA;AAEA,IAAA,MAAM,MAAA,GAAS,gBAAgB,KAAK,CAAA;AACpC,IAAA,OAAO,MAAA,CAAO,GAAA,CAAI,CAAC,IAAA,EAAe,WAAmB,EAAE,GAAG,IAAA,EAAM,GAAA,EAAK,GAAG,IAAA,CAAK,EAAE,CAAA,CAAA,EAAI,KAAK,IAAG,CAAE,CAAA;AAAA,EAC/F,CAAA;AAEA,EAAA,MAAM,gBAAA,GAAmB,aAAA,CAAc,OAAA,IAAW,IAAI,WAAW,CAAA;AAEjE,EAAA,MAAM,OAAA,GAAUzD,WAAAA,CAAY,CAAC,KAAA,KAAmB;AAC9C,IAAA,IAAI,CAAC,KAAA,EAAO,cAAA,CAAe,EAAE,CAAA;AAE7B,IAAA,QAAA,CAAS,aAAA,CAAc;AAAA,MACrB,GAAA,EAAA,KAAA;AAAA,MACA,MAAA,EAAQ;AAAA,KACT,CAAC,CAAA;AAAA,EACJ,CAAA,EAAG,CAAC,QAAA,EAAU,cAAc,CAAC,CAAA;AAE7B,EAAA,MAAM,YAAA,GAAe,CAAC,IAAA,KAAoB;AACxC,IAAA,IAAI,SAAS,KAAA,IAAS,CAAC,IAAA,IAAQ,IAAA,CAAK,SAAS,CAAA,EAAG;AAEhD,IAAA,MAAM,GAAA,GAAM,CAAC,GAAG,IAAI,EAAE,CAAC,CAAA;AAEvB,IAAA,MAAM,EAAA,GAAK,QAAA,CAAS,aAAA,CAAc,CAAA,UAAA,EAAa,GAAG,CAAA,CAAA,CAAG,CAAA;AACrD,IAAA,MAAM,IAAA,GAAO,EAAA,EAAI,YAAA,CAAa,WAAW,CAAA;AAEzC,IAAA,IAAI,CAAC,IAAA,EAAM;AAEX,IAAA,MAAM,IAAA,GAAa,IAAI,IAAA,CAAK,EAAE,MAAY,CAAA;AAE1C,IAAA,MAAM,EAAA,GAAK,WAAA,EAAa,MAAA,KACrB,SAAA,KAAA,cAAA,sBAA0C,8CACvC,MAAM;AACN,MAAA,QAAA,CAAS,WAAA,CAAY,GAAG,CAAC,CAAA;AACzB,MAAA,QAAA,CAAS,YAAA,CAAa,IAAI,CAAC,CAAA;AAC3B,MAAA,QAAA,CAAS,gBAAA,CAAiB,IAAI,CAAC,CAAA;AAAA,IACjC,IACE,MAAM;AACN,MAAA,QAAA,CAAS,WAAA,CAAY,GAAG,CAAC,CAAA;AACzB,MAAA,QAAA,CAAS,YAAA,CAAa,IAAI,CAAC,CAAA;AAC3B,MAAA,QAAA,CAAS,gBAAA,CAAiB,IAAI,CAAC,CAAA;AAC/B,MAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,IACf,CAAA;AAEJ,IAAA,MAAA,CAAO,IAAA,EAAM,MAAM,EAAE,CAAA;AAAA,EACvB,CAAA;AAIA,EAAAE,UAAU,MAAM;AACd,IAAA,IAAI,aAAa,MAAA,KAAW,CAAC,WAAA,EAAa,OAAA,IAAW,aAAa,OAAA,KAAA,kBAAA,iBAAA,EAAsC;AACtG,MAAA,MAAM,YAAA,GAAe,CAAC,KAAA,KAAyB;AAC7C,QAAA,IAAK,CAAC,gBAAgB,cAAA,CAAe,OAAO,KAAK,CAAC,WAAA,IAAgB,KAAA,CAAM,GAAA,KAAQ,QAAA,EAAW;AACzF,UAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,QACf;AAAA,MACF,CAAA;AAEA,MAAA,QAAA,CAAS,gBAAA,CAAiB,SAAA,EAAW,YAAA,EAAc,IAAI,CAAA;AAEvD,MAAA,OAAO,MAAM;AACX,QAAA,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,YAAA,EAAc,IAAI,CAAA;AAAA,MAC5D,CAAA;AAAA,IACF;AAAA,EACF,CAAA,EAAG,CAAC,WAAA,EAAa,OAAA,EAAS,WAAW,CAAC,CAAA;AAGtC,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,YAAY,OAAA,EAAS;AACvB,MAAA,eAAA,CAAgB,CAAA,gBAAA,KAAoB;AAElC,QAAA,MAAM,eAAA,GAAkB,IAAI,GAAA,CAAS,gBAAgB,CAAA;AACrD,QAAA,IAAI,UAAA,GAAa,KAAA;AAGjB,QAAA,MAAM,cAAA,GAAiB,CAAC,KAAA,KAA8B;AACpD,UAAA,OAAO,KAAA,CAAM,KAAK,CAAA,IAAA,KAAQ;AACxB,YAAA,IAAI,IAAA,CAAK,EAAA,KAAO,QAAA,EAAU,OAAO,IAAA;AACjC,YAAA,IAAI,KAAK,QAAA,EAAU;AACjB,cAAA,MAAM,QAAA,GAAW,cAAA,CAAe,IAAA,CAAK,QAAQ,CAAA;AAC7C,cAAA,IAAI,YAAY,CAAC,eAAA,CAAgB,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,EAAG;AAC7C,gBAAA,eAAA,CAAgB,GAAA,CAAI,KAAK,EAAE,CAAA;AAC3B,gBAAA,UAAA,GAAa,IAAA;AAAA,cACf;AACA,cAAA,OAAO,QAAA;AAAA,YACT;AACA,YAAA,OAAO,KAAA;AAAA,UACT,CAAC,CAAA;AAAA,QACH,CAAA;AAGA,QAAA,cAAA,CAAe,OAAO,CAAA;AACtB,QAAA,OAAO,aAAa,eAAA,GAAkB,gBAAA;AAAA,MACxC,CAAC,CAAA;AAAA,IACH;AAAA,EACF,CAAA,EAAG,CAAC,QAAA,EAAU,OAAO,CAAC,CAAA;AAEtB,EAAA,uBACEtC,GAAAA,CAAAC,QAAAA,EAAA,EACA,QAAA,kBAAAD,GAAAA;AAAA,IAAC,oBAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,UAAA,EAAa;AAAA,QACX,EAAA,EAAA,KAAA;AAAA,QACA,UAAA;AAAA,QACA,OAAA,EAAS,EAAE,8BAA8B,CAAA;AAAA,QACzC,WAAW,uBAAA,CAAU,OAAA;AAAA,QACrB,SAAA,EAAW,QAAA;AAAA,QACX,MAAA,EAAQ,aAAa,MAAA,IAAU,KAAA;AAAA,QAC/B,YAAA,EAAc,OAAA;AAAA,QACd,YAAA,EAAc,MAAM,OAAA,CAAQ,KAAK,CAAA;AAAA,QACjC,MAAA,EAAQ,QAAQ,SAAA,EAAU;AAAA,QAC1B,UAAA,EAAY,QAAA;AAAA,QACZ,cAAA,EAAgB;AAAA,OAClB;AAAA,MAEE,qBAAW,OAAA,CAAQ,MAAA,GAAS,oBAC3BqC,IAAAA,CAAApC,UAAA,EACD,QAAA,EAAA;AAAA,wBAAAD,GAAAA;AAAA,UAAC,iBAAA;AAAA,UAAA;AAAA,YACC,YAAA,EAAa,EAAE,uBAAuB,CAAA;AAAA,YACtC,KAAA,EAAQ,WAAA;AAAA,YACR,QAAA,EAAW,cAAA;AAAA,YACX,OAAA,EAAU,MAAM,cAAA,CAAe,EAAE,CAAA;AAAA,YACjC,WAAY,uBAAA,CAAU,MAAA;AAAA,YACtB,SAAA,EAAW;AAAA,cACT,KAAA,EAAO;AAAA,gBACL,WAAW,uBAAA,CAAU;AAAA,eACvB;AAAA,cACA,KAAA,EAAO;AAAA,gBACL,GAAA,EAAK,cAAA;AAAA,gBACL,WAAW,uBAAA,CAAU,WAAA;AAAA,gBACrB,WAAA,EAAa,EAAE,uBAAuB;AAAA,eACxC;AAAA,cACA,UAAA,EAAY;AAAA,gBACV,WAAW,uBAAA,CAAU,UAAA;AAAA,gBACrB,MAAA,EAAQ,CAAC,CAAC;AAAA,eACZ;AAAA,cACA,WAAA,EAAa;AAAA,gBACX,WAAW,uBAAA,CAAU,WAAA;AAAA,gBACrB,YAAY,CAAC,WAAA;AAAA,gBACb,YAAA,EAAc,EAAE,sBAAsB;AAAA;AACxC;AACF;AAAA,SACF;AAAA,wBACAA,GAAAA;AAAA,UAAC,IAAA;AAAA,UAAA;AAAA,YACC,GAAA,EAAM,OAAA;AAAA,YACN,YAAA,EAAa,EAAE,oBAAoB,CAAA;AAAA,YACnC,aAAA,EAAc,QAAA;AAAA,YACd,KAAA,EAAQ,gBAAA;AAAA,YACR,WAAY,uBAAA,CAAU,IAAA;AAAA,YACtB,iBAAA,EAAoB,YAAA;AAAA,YACpB,YAAA,EAAe,QAAA,GAAW,CAAC,QAAQ,IAAI,EAAC;AAAA,YACxC,YAAA;AAAA,YACA,gBAAA,EAAmB,eAAA;AAAA,YAEjB,QAAA,EAAA,SAAS,WAAW,IAAA,EAAM;AAC1B,cAAA,uBACEqC,IAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,aAAY,IAAA,CAAK,IAAA;AAAA,kBACjB,WAAY,uBAAA,CAAU,QAAA;AAAA,kBACtB,SAAA,EAAY,KAAK,KAAA,IAAS,EAAA;AAAA,kBAE1B,QAAA,EAAA;AAAA,oCAAAA,KAAC,eAAA,EAAA,EACE,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAK,4BACJrC,GAAAA;AAAA,wBAAC,MAAA;AAAA,wBAAA;AAAA,0BACC,IAAA,EAAK,SAAA;AAAA,0BACL,WAAW,uBAAA,CAAU,cAAA;AAAA,0BACrB,KAAA,EAAO,EAAE,SAAA,EAAW,KAAA,GAAQ,eAAe,MAAA,EAAO;AAAA,0BAElD,0BAAAA,GAAAA,CAAC,qBAAA,EAAA,EAAQ,aAAA,EAAY,MAAA,EAAO,WAAU,OAAA,EAAQ;AAAA;AAAA,uBAChD;AAAA,sCAEFqC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAY,wBAAU,YAAA,EACzB,QAAA,EAAA;AAAA,wCAAArC,IAAC,KAAA,EAAA,EAAI,SAAA,EAAY,uBAAA,CAAU,iBAAA,EAAsB,eAAK,KAAA,EAAO,CAAA;AAAA,wBAC3D,IAAA,CAAK,4BAAYA,GAAAA,CAAC,SAAI,SAAA,EAAY,uBAAA,CAAU,oBAAA,EAAyB,QAAA,EAAA,IAAA,CAAK,QAAA,EAAU;AAAA,uBAAA,EACxF;AAAA,qBAAA,EACF,CAAA;AAAA,oCACAA,GAAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EAAQ,IAAA,CAAK,UACrB,QAAA,EAAA,UAAA,EACJ;AAAA;AAAA;AAAA,eACF;AAAA,YAEJ;AAAA;AAAA;AACF,OAAA,EACF,CAAA,mBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAY,uBAAA,CAAU,KAAA,EAAU,QAAA,EAAA,CAAA,CAAE,+CAA+C,CAAA,EAAG;AAAA;AAAA,GAE7F,EACA,CAAA;AAEJ;ACnQA,IAAM,MAAA,GAAS,2BAASA,GAAAA,CAAC,SAAI,KAAA,EAAM,4BAAA,EAA6B,MAAA,EAAO,MAAA,EAAO,OAAA,EAAQ,gBAAA,EAAiB,OAAM,MAAA,EAAO,IAAA,EAAK,WAAW,GAAG,KAAA,EAAO,0BAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,oXAAA,EAAqX,CAAA,EAAE,CAAA;AAC7gB,IAAO,WAAA,GAAQ,MAAA;ACgBR,IAAM,kBAAA,GAAqB,CAAC,EAAE,OAAA,EAAQ,KAAkC;AAC7E,EAAA,MAAM,EAAE,WAAA,EAAY,GAAI,cAAA,EAAe;AACvC,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,OAAA,EAAQ;AACtB,EAAA,MAAM,cAAc,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,OAAA,CAAQ,qBAAuB,CAAA;AACjF,EAAA,MAAM,WAAW,cAAA,EAAe;AAEhC,EAAA,MAAM,OAAA,GAAU,CAAC,KAAA,KAAmB;AAClC,IAAA,QAAA,CAAS,aAAA,CAAc;AAAA,MACrB,GAAA,EAAA,KAAA;AAAA,MACA,MAAA,EAAQ;AAAA,KACT,CAAC,CAAA;AAAA,EACJ,CAAA;AAEA,EAAA,uBACEA,GAAAA,CAAAC,QAAAA,EAAA,EACG,QAAA,EAAA,OAAA,IAAW,oDACVD,GAAAA;AAAA,IAAC,wBAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAQ,EAAE,8BAA8B,CAAA;AAAA,MACxC,OAAA,EAAU,WAAA;AAAA,MACV,QAAA,EAAW,WAAA,CAAY,OAAA,CAAQ,IAAA,CAAA,KAAA,WAAsB,CAAE,QAAA;AAAA,MACvD,EAAA,EAAA,KAAA;AAAA,MACA,QAAA,EAAW,MAAM,OAAA,CAAQ,CAAC,aAAa,MAAM;AAAA;AAAA,sBAE/CA,GAAAA;AAAA,IAAC,kBAAA;AAAA,IAAA;AAAA,MACC,UAAA,EAAa,WAAA,CAAY,OAAA,CAAQ,IAAA,CAAA,KAAA,WAAsB,CAAE,UAAA;AAAA,MACzD,YAAA,EAAa,EAAE,8BAA8B,CAAA;AAAA,MAC7C,SAAA,EAAU,QAAA;AAAA,MACV,YAAA,EAAe,EAAE,8BAA8B,CAAA;AAAA,MAC/C,OAAA,EAAU,MAAM,OAAA,CAAQ,CAAC,aAAa,MAAM,CAAA;AAAA,MAE5C,0BAAAA,GAAAA,CAAC,WAAA,EAAA,EAAQ,aAAA,EAAY,MAAA,EAAO,WAAU,OAAA,EAAQ;AAAA;AAAA,GAChD,EAEJ,CAAA;AAEJ;AC/CO,IAAM,eAAA,GAAkB,CAAC,GAAA,EAA6C,IAAA,GAA2B,SAAA,KAAc;AACpH,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIkD,SAAwB,IAAI,CAAA;AAExE,EAAA,MAAM,uBAAuB,MAAM;AACjC,IAAA,IAAI,CAAC,IAAI,OAAA,EAAS;AAClB,IAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,gBAAA,CAAiB,GAAA,CAAI,OAAO,CAAA;AACzD,IAAA,MAAM,OAAA,GAAU,aAAA,CAAc,gBAAA,CAAiB,CAAA,cAAA,EAAkB,IAAK,CAAA,CAAE,CAAA;AACxE,IAAA,MAAM,WAAA,GAAc,QAAQ,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,MAAA;AAC1D,IAAA,iBAAA,CAAkB,WAAW,CAAA;AAAA,EAC/B,CAAA;AAEA,EAAA,MAAM,6BAAA,GAAgC,QAAA,CAAS,oBAAA,EAAsB,GAAG,CAAA;AAExE,EAAAZ,UAAU,MAAM;AACd,IAAA,oBAAA,EAAqB;AAErB,IAAA,MAAM,cAAA,GAAiB,IAAI,cAAA,CAAe,6BAA6B,CAAA;AACvE,IAAA,IAAI,IAAI,OAAA,EAAS;AACf,MAAA,cAAA,CAAe,OAAA,CAAQ,IAAI,OAAO,CAAA;AAAA,IACpC;AAEA,IAAA,OAAO,MAAM;AACX,MAAA,cAAA,CAAe,UAAA,EAAW;AAC1B,MAAA,6BAAA,CAA8B,KAAA,EAAM;AAAA,IACtC,CAAA;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO,cAAA;AACT;AClBO,IAAM,oBAAoB,CAAC;AAAA,EAChC,YAAA;AAAA,EACA,KAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,KAA8B;AAC5B,EAAA,MAAM,cAAA,GAAiB,eAAA,CAAgB,YAAA,EAAc,SAAS,CAAA;AAE9D,EAAA,MAAM,SAAA,GAAYC,OAAAA,CAAM,WAAA,CAAY,CAAC,CAAA,KAA2B;AAC9D,IAAA,MAAM,UAAU,cAAA,IAAkB,CAAA;AAClC,IAAA,IAAI,OAAA,IAAW,CAAA,IAAK,CAAC,KAAA,CAAM,SAAS,MAAA,EAAQ;AAG5C,IAAA,MAAM,UAAA,GAAa,KAAA,CAAM,OAAA,CAAQ,SAAA,CAAU,CAAC,GAAA,KAAQ;AAClD,MAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,IAAY,GAAA,KAAQ,IAAA,IAAQ,WAAW,GAAA,EAAK;AAC7D,QAAA,OAAO,IAAI,KAAA,KAAU,YAAA;AAAA,MACvB;AACA,MAAA,OAAO,GAAA,KAAQ,YAAA;AAAA,IACjB,CAAC,CAAA;AAED,IAAA,IAAI,eAAe,EAAA,EAAI;AAEvB,IAAA,IAAI,OAAA,GAAyB,IAAA;AAE7B,IAAA,QAAQ,EAAE,IAAA;AAAM,MACd,KAAK,SAAA;AACH,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,OAAA,GAAU,UAAA,GAAa,OAAA;AACvB,QAAA;AAAA,MACF,KAAK,WAAA;AACH,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,OAAA,GAAU,UAAA,GAAa,OAAA;AACvB,QAAA;AAAA,MACF,KAAK,WAAA;AACH,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,OAAA,GAAU,KAAA,GAAQ,UAAA,GAAa,CAAA,GAAI,UAAA,GAAa,CAAA;AAChD,QAAA;AAAA,MACF,KAAK,YAAA;AACH,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,OAAA,GAAU,KAAA,GAAQ,UAAA,GAAa,CAAA,GAAI,UAAA,GAAa,CAAA;AAChD,QAAA;AAAA,MACF,KAAK,QAAA;AACH,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,QAAA,EAAS;AAAA,QACX;AACA,QAAA;AAAA,MACF;AACE,QAAA;AAAA;AAGJ,IAAA,IAAI,YAAY,IAAA,IAAQ,OAAA,IAAW,KAAK,OAAA,GAAU,KAAA,CAAM,QAAQ,MAAA,EAAQ;AACtE,MAAA,MAAM,QAAA,GAAW,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA;AAGtC,MAAA,MAAM,SAAA,GAAa,OAAO,QAAA,KAAa,QAAA,IAAY,aAAa,IAAA,IAAQ,OAAA,IAAW,QAAA,GAC/E,QAAA,CAAS,KAAA,GACT,QAAA;AAEJ,MAAA,QAAA,CAAS,SAAS,CAAA;AAElB,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,OAAA,CAAQ,SAAS,CAAA;AAAA,MACnB;AAAA,IACF;AAAA,EACF,CAAA,EAAG,CAAC,cAAA,EAAgB,KAAA,EAAO,cAAc,QAAA,EAAU,KAAA,EAAO,QAAA,EAAU,OAAO,CAAC,CAAA;AAE5E,EAAA,OAAO,EAAE,SAAA,EAAU;AACrB;ACjEO,IAAM,qBAAqB,CAAC;AAAA,EACjC,GAAA;AAAA,EACA,UAAA;AAAA,EACA,sBAAA,GAAyB,IAAA;AAAA,EACzB,KAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG;AACL,CAAA,KAA+B;AAC7B,EAAA,MAAM,QAAA,GAAW1B,MAAAA,CAAO,KAAA,IAAS,EAAE,CAAA;AACnC,EAAA,MAAM,UAAA,GAAaA,OAA8B,IAAI,CAAA;AACrD,EAAA,MAAM,SAAA,GAAY,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,OAAO,SAAS,CAAA;AAChE,EAAA,MAAM,KAAA,GAAQ,SAAA,KAAA,KAAA;AACd,EAAA,MAAM,iBAAA,GAAoB,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,OAAO,iBAAiB,CAAA;AAEhF,EAAA,MAAM,WAAW,cAAA,EAAe;AAGhC,EAAA,MAAM,gBAAA,GAAmBuB,YAAY,MAAM;AACzC,IAAA,IAAI,iBAAA,KAAA,SAAA,gBAAuD;AAEzD,MAAA,QAAA,CAAS,6CAAqD,CAAA;AAAA,IAChE,CAAA,MAAO;AAEL,MAAA,QAAA,CAAS,aAAA,CAAc;AAAA,QACrB,GAAA,EAAA,UAAA;AAAA,QACA,MAAA,EAAQ;AAAA,OACT,CAAC,CAAA;AAAA,IACJ;AAAA,EACF,CAAA,EAAG,CAAC,QAAA,EAAU,iBAAiB,CAAC,CAAA;AAGhC,EAAA,MAAM,eAAA,GAAkBA,WAAAA,CAAY,CAAC2D,MAAAA,KAAkB;AACrD,IAAA,MAAM,UAAU,UAAA,CAAW,OAAA,EAAS,aAAA,CAAc,CAAA,QAAA,EAAYA,MAAM,CAAA,EAAA,CAAI,CAAA;AACxE,IAAA,IAAI,OAAA,EAAU,OAAA,CAAwB,KAAA,EAAM;AAAA,EAC9C,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,EAAE,SAAA,EAAU,GAAI,iBAAA,CAAkB;AAAA,IACtC,YAAA,EAAc,UAAA;AAAA,IACd,OAAO,sBAAA,KAA2B,KAAA,GAAQ,WAAW,EAAE,OAAA,EAAS,EAAC,EAAE;AAAA,IACnE,YAAA,EAAc,sBAAA,KAA2B,KAAA,GAAQ,KAAA,GAAQ,IAAA;AAAA,IACzD,QAAA,EAAU,aAAa,MAAM;AAAA,IAAC,CAAA,CAAA;AAAA,IAC9B,KAAA;AAAA,IACA,UAAU,QAAA,IAAY,gBAAA;AAAA,IACtB,OAAA,EAAS;AAAA,GACV,CAAA;AAEH,EAAA,uBACE/F,GAAAA,CAAAC,QAAAA,EAAA,EACA,QAAA,kBAAAD,GAAAA;AAAA,IAAC,YAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,SAAA,EAAY,UAAA,GAAa,mCAAA,CAAe,KAAA,GAAQ,EAAA;AAAA,MAC9C,GAAG,KAAA;AAAA,MACH,GAAI,UAAA,GAAa,EAAE,OAAa,GAAI,EAAE,cAAc,KAAA,EAAM;AAAA,MAC5D,KAAA;AAAA,MACA,QAAA;AAAA,MACA,KAAA,EAAQ,sBAAA,KAA2B,KAAA,GAAQ,KAAA,GAAQ,EAAC;AAAA,MACpD,SAAA,EAAW;AAAA,QACT,OAAA,EAAS;AAAA,UACP,WAAW,mCAAA,CAAe,YAAA;AAAA,UAC1B,GAAA,EAAK;AAAA,SACP;AAAA,QACA,KAAA,EAAO;AAAA,UACL,WAAW,mCAAA,CAAe;AAAA,SAC5B;AAAA,QACA,KAAA,EAAO;AAAA,UACL,WAAW,mCAAA,CAAe,KAAA;AAAA,UAC1B,SAAA,EAAW,sBAAA,KAA2B,KAAA,GAAQ,SAAA,GAAY;AAAA;AAC5D,OACF;AAAA,MAEE;AAAA;AAAA,GACJ,EACA,CAAA;AAEF;ACnGA,IAAM,kBAAA,GAAqB,2BAASA,GAAAA,CAAC,SAAI,KAAA,EAAM,4BAAA,EAA6B,MAAA,EAAO,MAAA,EAAO,OAAA,EAAQ,gBAAA,EAAiB,OAAM,MAAA,EAAO,IAAA,EAAK,WAAW,GAAG,KAAA,EAAO,0BAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,+VAAA,EAAgW,CAAA,EAAE,CAAA;AACpgB,IAAO,wBAAA,GAAQ,kBAAA;ACDf,IAAM,UAAA,GAAa,2BAASA,GAAAA,CAAC,SAAI,KAAA,EAAM,4BAAA,EAA6B,MAAA,EAAO,MAAA,EAAO,OAAA,EAAQ,gBAAA,EAAiB,OAAM,MAAA,EAAO,IAAA,EAAK,WAAW,GAAG,KAAA,EAAO,0BAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,mOAAA,EAAoO,CAAA,EAAE,CAAA;AAChY,IAAO,eAAA,GAAQ,UAAA;ACDf,IAAM,WAAA,GAAc,2BAASA,GAAAA,CAAC,SAAI,KAAA,EAAM,4BAAA,EAA6B,MAAA,EAAO,MAAA,EAAO,OAAA,EAAQ,gBAAA,EAAiB,OAAM,MAAA,EAAO,IAAA,EAAK,WAAW,GAAG,KAAA,EAAO,0BAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,qwBAAA,EAAswB,CAAA,EAAE,CAAA;AACn6B,IAAO,iBAAA,GAAQ,WAAA;ACgBR,IAAM,kBAAkB,MAAM;AACnC,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,OAAA,EAAQ;AACtB,EAAA,MAAM,MAAA,GAAS,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,SAAS,MAAM,CAAA;AAC5D,EAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,YAAY,KAAK,CAAA;AAC7D,EAAA,MAAM,QAAA,GAAW,UAAU,CAAC,KAAA;AAE5B,EAAA,MAAM,cAAc,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,QAAA,CAAS,WAAW,CAAA,IAAK,MAAA;AAC3E,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIkD,SAAS,WAAW,CAAA;AAEhE,EAAA,MAAM,QAAA,GAAW,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,SAAS,QAAQ,CAAA;AAChE,EAAA,MAAM,UAAA,GAAa,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,SAAS,UAAU,CAAA;AACpE,EAAA,MAAM,WAAA,GAAc,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,SAAS,WAAW,CAAA;AACtE,EAAA,MAAM,aAAA,GAAgB,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,SAAS,aAAa,CAAA;AAC1E,EAAA,MAAM,eAAA,GAAkB,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,SAAS,eAAe,CAAA;AAE9E,EAAA,MAAM,cAAA,GAAiB8B,QAAQ,MAAM;AACnC,IAAA,OAAO;AAAA,MACL,QAAA;AAAA,MACA,UAAA;AAAA,MACA,WAAA;AAAA,MACA,aAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,GAAG,CAAC,QAAA,EAAU,YAAY,WAAA,EAAa,aAAA,EAAe,eAAe,CAAC,CAAA;AAEtE,EAAA,MAAM,WAAW,cAAA,EAAe;AAEhC,EAAA,MAAM,EAAE,iBAAA,EAAmB,UAAA,EAAW,GAAI,gBAAA,EAAiB;AAE3D,EAAA,MAAM,KAAA,GAAQA,QAAQ,MAAM;AAAA,IAC1B;AAAA,MACE,EAAA,EAAI,MAAA;AAAA,MACJ,IAAA,EAAM,wBAAA;AAAA,MACN,KAAA,EAAO,EAAE,iCAAiC,CAAA;AAAA,MAC1C,KAAA,EAAO;AAAA,KACT;AAAA,IACA;AAAA,MACE,EAAA,EAAI,GAAA;AAAA,MACJ,IAAA,EAAM,eAAA;AAAA,MACN,KAAA,EAAO,EAAE,2CAA2C,CAAA;AAAA,MACpD,KAAA,EAAO;AAAA,KACT;AAAA,IACA;AAAA,MACE,EAAA,EAAI,GAAA;AAAA,MACJ,IAAA,EAAM,iBAAA;AAAA,MACN,KAAA,EAAO,EAAE,yCAAyC,CAAA;AAAA,MAClD,KAAA,EAAO,GAAA;AAAA;AAAA;AAAA;AAAA,MAIP,UAAA,EAAY,cAAA,KAAmB,GAAA,IAAO,WAAA,KAAgB;AAAA;AACxD,GACF,EAAG,CAAC,CAAA,EAAG,cAAA,EAAgB,WAAW,CAAC,CAAA;AAEnC,EAAA,MAAM,oBAAA,GAAuB5C,WAAAA,CAAY,CAAC,UAAA,EAAoB,OAAA,KAA2B;AACvF,IAAA,MAAM,eAAe,UAAA,KAAe,MAAA,IAAU,YAAY,IAAA,GAAO,MAAA,GAAS,QAAQ,QAAA,EAAS;AAC3F,IAAA,iBAAA,CAAkB,YAAY,CAAA;AAAA,EAChC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,gBAAA,GAAmBA,WAAAA,CAAY,OAAO,KAAA,KAAkB;AAC5D,IAAA,MAAM,QAAA,GAAW,KAAA,KAAU,MAAA,GAAS,IAAA,GAAO,OAAO,KAAK,CAAA;AACvD,IAAA,MAAM,iBAAA,CAAkB,EAAE,WAAA,EAAa,QAAA,EAAU,CAAA;AACjD,IAAA,oBAAA,CAAqB,KAAA,EAAO,UAAA,CAAW,aAAa,CAAC,CAAA;AACrD,IAAA,QAAA,CAAS,cAAA,CAAe,KAAK,CAAC,CAAA;AAAA,EAChC,GAAG,CAAC,iBAAA,EAAmB,UAAA,EAAY,oBAAA,EAAsB,QAAQ,CAAC,CAAA;AAElE,EAAA,MAAM,eAAA,GAAkBA,YAAY,MAAM;AACxC,IAAA,MAAM,SAAS,MAAM,oBAAA,CAAqB,WAAA,EAAa,UAAA,CAAW,aAAa,CAAC,CAAA;AAChF,IAAA,QAAA,CAAS,MAAA,EAAQ,EAAE,CAAA,EAAE;AAAA,EAMvB,GAAG,CAAC,WAAA,EAAa,cAAA,EAAgB,UAAA,EAAY,oBAAoB,CAAC,CAAA;AAElE,EAAAE,UAAU,MAAM;AACd,IAAA,eAAA,EAAgB;AAEhB,IAAA,MAAA,CAAO,gBAAA,CAAiB,UAAU,eAAe,CAAA;AAEjD,IAAA,OAAO,MAAM;AACX,MAAA,MAAA,CAAO,mBAAA,CAAoB,UAAU,eAAe,CAAA;AAAA,IACtD,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,eAAe,CAAC,CAAA;AAEpB,EAAA,uBACEtC,GAAAA,CAAAC,QAAAA,EAAA,EACA,QAAA,kBAAAD,GAAAA;AAAA,IAAC,kBAAA;AAAA,IAAA;AAAA,MACC,UAAA,EAAa,IAAA;AAAA,MACb,KAAA,EAAQ,EAAE,kCAAkC,CAAA;AAAA,MAC5C,WAAA,EAAY,YAAA;AAAA,MACZ,KAAA,EAAQ,cAAA;AAAA,MACR,QAAA,EAAW,OAAO,GAAA,KAAgB,MAAM,iBAAiB,GAAG,CAAA;AAAA,MAC5D,UAAA,EAAa,QAAA;AAAA,MACb;AAAA;AAAA,GACF,EACA,CAAA;AAEJ;ACvGO,IAAM,mBAAmB,CAAC;AAAA,EAC/B,UAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAG;AACL,CAAA,KAA6B;AAE3B,EAAA,uBACEA,GAAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACG,GAAG,KAAA;AAAA,MACH,GAAI,UAAA,GAAa,EAAE,OAAM,GAAI,EAAE,cAAc,KAAA,EAAM;AAAA,MACrD,SAAA,EAAYY,WAAAA;AAAA,QACV,mCAAA,CAAe,QAAA;AAAA,QACf,cAAc,mCAAA,CAAe,KAAA;AAAA,QAC7B;AAAA,OACF;AAAA,MACE,SAAA,EAAW;AAAA,QACT,KAAA,EAAO;AAAA,UACL,WAAW,mCAAA,CAAe,KAAA;AAAA,UAC1B,GAAI,SAAA,EAAW,KAAA,IAAS;AAAC,SAC3B;AAAA,QACA,GAAI2B,OAAAA,CAAM,cAAA,CAAe,SAAA,EAAW,MAAM,IACtC,EAAE,MAAA,EAAQ,SAAA,CAAU,MAAA,EAAO,GAC3B;AAAA,UACE,MAAA,EAAQ;AAAA,YACN,WAAW,mCAAA,CAAe,cAAA;AAAA,YAC1B,GAAI,SAAA,EAAW,MAAA,IAAU;AAAC;AAC5B,SACF;AAAA,QACJ,OAAA,EAAS;AAAA,UACP,WAAW,mCAAA,CAAe,eAAA;AAAA,UAC1B,SAAA,EAAW,QAAA;AAAA,UACX,GAAI,SAAA,EAAW,OAAA,IAAW;AAAC,SAC7B;AAAA,QACA,GAAIA,OAAAA,CAAM,cAAA,CAAe,SAAA,EAAW,OAAO,IACvC,EAAE,OAAA,EAAS,SAAA,CAAU,OAAA,EAAQ,GAC7B;AAAA,UACE,OAAA,EAAS;AAAA,YACP,WAAW,mCAAA,CAAe,eAAA;AAAA,YAC1B,GAAI,SAAA,EAAW,OAAA,IAAW;AAAC,WAC7B;AAAA,UACA,WAAA,EAAa;AAAA,YACX,WAAW,mCAAA,CAAe,mBAAA;AAAA,YAC1B,GAAI,SAAA,EAAW,WAAA,IAAe;AAAC;AACjC;AACF;AACN;AAAA,GACF;AAEN;AC5CO,IAAM,kBAAA,GAAqB,CAAC,EAAE,UAAA,GAAa,MAAK,KAAoE;AACzH,EAAA,MAAM,EAAE,eAAA,EAAiB,YAAA,EAAa,GAAI,cAAA,EAAe;AACzD,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,OAAA,EAAQ;AAEtB,EAAA,MAAM,kBAAA,GAAqBH,WAAAA,CAAY,CAAC,IAAA,KAAiC;AAEvE,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,IAAI,OAAO,IAAA,CAAK,KAAA,KAAU,QAAA,EAAU;AAClC,QAAA,OAAO,CAAA,CAAE,KAAK,KAAA,EAAO,EAAE,cAAc,IAAA,CAAK,KAAA,IAAS,IAAA,CAAK,IAAA,EAAM,CAAA;AAAA,MAChE,WAAW,OAAO,IAAA,CAAK,UAAU,QAAA,IAAY,KAAA,IAAS,KAAK,KAAA,EAAO;AAChE,QAAA,OAAO,CAAA,CAAE,IAAA,CAAK,KAAA,CAAM,GAAA,EAAK;AAAA,UACvB,YAAA,EAAc,IAAA,CAAK,KAAA,CAAM,QAAA,IAAY,IAAA,CAAK;AAAA,SAC3C,CAAA;AAAA,MACH;AAAA,IACF;AAGA,IAAA,OAAO,IAAA,CAAK,IAAA;AAAA,EACd,CAAA,EAAG,CAAC,CAAC,CAAC,CAAA;AAEN,EAAA,MAAM,OAAA,GAAU,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,OAAO,OAAO,CAAA;AAC5D,EAAA,MAAM,WAAW,OAAA,KAAY,QAAA;AAE7B,EAAA,MAAM,eAAe,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,WAAA,CAAY,YAAY,CAAA,IAAK,SAAA;AAGhF,EAAA,MAAM,eAAA,GAAkB,YAAA,CAAa,EAAE,QAAA,EAAU,cAAc,CAAA;AAE/D,EAAA,MAAM,UAAA,GAAa,eAAe,CAAA,KAAA,KAAS;AACzC,IAAA,MAAM,eAAe,QAAA,GAAW,KAAA,CAAM,cAAA,CAAe,UAAA,GAAa,MAAM,QAAA,CAAS,UAAA;AACjF,IAAA,OAAO,YAAA,CAAa,YAAY,CAAA,IAAK,WAAA;AAAA,EACvC,CAAC,CAAA;AAGD,EAAA,MAAM,gBAAA,uBAAuB,GAAA,CAAI;AAAA,IAC/B,WAAA;AAAA,IACA,GAAG,MAAA,CAAO,IAAA,CAAK,eAAe;AAAA,GAC/B,CAAA;AACD,EAAA,MAAM,iBAAA,GAAoB,gBAAA,CAAiB,GAAA,CAAI,UAAU,IAAI,UAAA,GAAa,WAAA;AAE1E,EAAA,MAAM,oBAAoBvB,MAAAA,CAAO;AAAA,IAC/B;AAAA,MACE,EAAA,EAAI,WAAA;AAAA,MACJ,KAAA,EAAO,EAAE,yCAAyC,CAAA;AAAA,MAClD,KAAA,EAAO;AAAA,KACT;AAAA,IACA,GAAG,MAAA,CAAO,OAAA,CAAQ,eAAe,CAAA,CAAE,IAAI,CAAC,CAAC,EAAA,EAAI,IAAI,CAAA,KAAM;AACrD,MAAA,MAAM,QAAA,GAAW,gBAAgB,EAAE,CAAA;AACnC,MAAA,OAAO;AAAA,QACL,EAAA;AAAA,QACA,KAAA,EAAO,mBAAmB,IAAI,CAAA;AAAA,QAC9B,KAAA,EAAO,QAAA,CAAS,SAAA,IAAa,QAAA,CAAS;AAAA,OACxC;AAAA,IACF,CAAC;AAAA,GACF,CAAA;AAED,EAAA,MAAM,WAAW,cAAA,EAAe;AAEhC,EAAA,MAAM,EAAE,UAAA,EAAY,iBAAA,EAAkB,GAAI,YAAA,EAAa;AAEvD,EAAA,MAAM,gBAAA,GAAmBuB,WAAAA,CAAY,OAAO,GAAA,KAAoB;AAC9D,IAAA,IAAI,CAAC,GAAA,IAAO,GAAA,KAAQ,UAAA,EAAY;AAEhC,IAAA,MAAM,cAAA,GAAiB,kBAAkB,OAAA,CAAQ,IAAA,CAAK,CAAC,MAAA,KAAW,MAAA,CAAO,OAAO,GAAG,CAAA;AAMnF,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,MAAM,iBAAA,CAAkB,EAAE,UAAA,EAAY,cAAA,CAAe,OAAO,CAAA;AAE5D,MAAA,MAAM,cAAA,GAAiB,WAAW,YAAY,CAAA;AAG9C,MAAA,IAAI,mBAAmB,IAAA,EAAM;AAC3B,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,QAAA,CAAS,oBAAoB,EAAE,GAAA,EAAK,cAAc,KAAA,EAAO,WAAA,EAAa,CAAC,CAAA;AAAA,QACzE,CAAA,MAAO;AACL,UAAA,QAAA,CAAS,cAAc,EAAE,GAAA,EAAK,cAAc,KAAA,EAAO,WAAA,EAAa,CAAC,CAAA;AAAA,QACnE;AACA,QAAA;AAAA,MACF;AAGA,MAAA,MAAM,KAAA,GAAQ,OAAO,OAAA,CAAQ,eAAe,EAAE,IAAA,CAAK,CAAC,CAAC,EAAE,CAAA,KAAM;AAC3D,QAAA,MAAM,QAAA,GAAW,gBAAgB,EAAE,CAAA;AACnC,QAAA,OAAO,QAAA,CAAS,SAAA,KAAc,cAAA,IACvB,QAAA,CAAS,UAAA,KAAe,cAAA;AAAA,MACjC,CAAC,CAAA;AAED,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,MAAM,CAAC,gBAAgB,CAAA,GAAI,KAAA;AAC3B,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,QAAA,CAAS,oBAAoB,EAAE,GAAA,EAAK,cAAc,KAAA,EAAO,gBAAA,EAAkB,CAAC,CAAA;AAAA,QAC9E,CAAA,MAAO;AACL,UAAA,QAAA,CAAS,cAAc,EAAE,GAAA,EAAK,cAAc,KAAA,EAAO,gBAAA,EAAkB,CAAC,CAAA;AAAA,QACxE;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAA,EAAG,CAAC,QAAA,EAAU,YAAA,EAAc,UAAA,EAAY,mBAAmB,UAAA,EAAY,eAAA,EAAiB,eAAA,EAAiB,QAAQ,CAAC,CAAA;AAElH,EAAA,uBACEpC,GAAAA;AAAA,IAAC,gBAAA;AAAA,IAAA;AAAA,MACC,UAAA;AAAA,MACA,KAAA,EAAQ,EAAE,qCAAqC,CAAA;AAAA,MAC/C,WAAA,EAAc,iBAAA;AAAA,MACd,iBAAA,EAAoB,OAAO,GAAA,KAAQ,MAAM,iBAAiB,GAAG,CAAA;AAAA,MAC7D,SAAA,EAAY;AAAA,QACV,yBACEA,GAAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,WAAY,mCAAA,CAAe,eAAA;AAAA,YAC3B,OAAQ,iBAAA,CAAkB,OAAA;AAAA,YAExB,QAAA,EAAA,CAAC,yBACDA,GAAAA;AAAA,cAAC,WAAA;AAAA,cAAA;AAAA,gBACC,WAAY,mCAAA,CAAe,mBAAA;AAAA,gBAC3B,IAAK,IAAA,CAAK,EAAA;AAAA,gBAEV,SAAA,EAAY,KAAK,KAAA,IAAS,MAAA;AAAA,gBAC1B,KAAA,EAAO,EAAE,UAAA,EAAY,IAAA,CAAK,SAAS,MAAA,EAAU;AAAA,gBAE3C,QAAA,EAAA,IAAA,CAAK;AAAA,eAAA;AAAA,cAJD,IAAA,CAAK;AAAA;AAKb;AAAA;AAEJ;AAEJ;AAAA,GACF;AAEJ;ACrJA,IAAM,oBAAA,GAAuB,2BAASA,GAAAA,CAAC,SAAI,KAAA,EAAM,4BAAA,EAA6B,MAAA,EAAO,MAAA,EAAO,OAAA,EAAQ,gBAAA,EAAiB,OAAM,MAAA,EAAO,IAAA,EAAK,WAAW,GAAG,KAAA,EAAO,0BAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,0aAAA,EAA2a,CAAA,EAAE,CAAA;AACjlB,IAAO,2BAAA,GAAQ,oBAAA;ACDf,IAAM,oBAAA,GAAuB,2BAASA,GAAAA,CAAC,SAAI,KAAA,EAAM,4BAAA,EAA6B,MAAA,EAAO,MAAA,EAAO,OAAA,EAAQ,gBAAA,EAAiB,OAAM,MAAA,EAAO,IAAA,EAAK,WAAW,GAAG,KAAA,EAAO,0BAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,obAAA,EAAqb,CAAA,EAAE,CAAA;AAC3lB,IAAO,2BAAA,GAAQ,oBAAA;ACkBR,IAAM,0BAAA,GAA6B,CAAC,EAAE,UAAA,GAAa,MAAK,KAAiC;AAC9F,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,OAAA,EAAQ;AAEtB,EAAA,MAAM,OAAA,GAAU,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,OAAO,OAAO,CAAA;AAC5D,EAAA,MAAM,WAAW,OAAA,KAAY,QAAA;AAE7B,EAAA,MAAM,UAAA,GAAa,cAAA,CAAe,CAAA,KAAA,KAAS,QAAA,GAAW,KAAA,CAAM,eAAe,UAAA,GAAa,KAAA,CAAM,QAAA,CAAS,UAAU,CAAA,IAAK,GAAA;AAEtH,EAAA,MAAM,WAAW,cAAA,EAAe;AAEhC,EAAA,MAAM,EAAE,UAAA,EAAY,iBAAA,EAAkB,GAAI,YAAA,EAAa;AAEvD,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ;AAAA,MACE,EAAA,EAAI,SAAA;AAAA,MACJ,IAAA,EAAM,2BAAA;AAAA,MACN,KAAA,EAAO,EAAE,sCAAsC,CAAA;AAAA,MAC/C,KAAA,EAAO;AAAA,KACT;AAAA,IACA;AAAA,MACE,EAAA,EAAI,QAAA;AAAA,MACJ,IAAA,EAAM,2BAAA;AAAA,MACN,KAAA,EAAO,EAAE,oCAAoC,CAAA;AAAA,MAC7C,KAAA,EAAO;AAAA;AACT,GACF;AAEA,EAAA,MAAM,YAAA,GAAegF,QAAQ,MAAM;AACjC,IAAA,IAAI,eAAe,GAAA,EAAK;AACtB,MAAA,OAAO,SAAA;AAAA,IACT,CAAA,MAAA,IAAW,eAAe,GAAA,EAAK;AAC7B,MAAA,OAAO,QAAA;AAAA,IACT;AACA,IAAA,OAAO,SAAA;AAAA,EACT,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAEf,EAAA,MAAM,gBAAA,GAAmB5C,WAAAA,CAAY,OAAO,KAAA,KAAsB;AAChE,IAAA,MAAM,eAAA,GAAkB,KAAA,KAAU,SAAA,GAAY,GAAA,GAAM,GAAA;AACpD,IAAA,MAAM,iBAAA,CAAkB,EAAE,UAAA,EAAY,eAAA,EAAiB,CAAA;AACvD,IAAA,MAAM,gBAAA,GAAmB,WAAW,YAAY,CAAA;AAEhD,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,QAAA,CAAS,mBAAA,CAAoB,gBAAgB,CAAC,CAAA;AAAA,IAChD,CAAA,MAAO;AACL,MAAA,QAAA,CAAS,aAAA,CAAc,gBAAgB,CAAC,CAAA;AAAA,IAC1C;AAAA,EACF,GAAG,CAAC,QAAA,EAAU,iBAAA,EAAmB,UAAA,EAAY,QAAQ,CAAC,CAAA;AAEtD,EAAA,uBACEpC,GAAAA,CAAAC,QAAAA,EAAA,EACA,QAAA,kBAAAD,GAAAA;AAAA,IAAC,kBAAA;AAAA,IAAA;AAAA,MACC,UAAA;AAAA,MACA,KAAA,EAAQ,EAAE,qCAAqC,CAAA;AAAA,MAC/C,WAAA,EAAY,YAAA;AAAA,MACZ,KAAA,EAAQ,YAAA;AAAA,MACR,QAAA,EAAW,OAAO,GAAA,KAAgB,MAAM,iBAAiB,GAAiB,CAAA;AAAA,MAC1E;AAAA;AAAA,GACF,EACA,CAAA;AAEJ;ACtEO,IAAM,iBAAiB,CAAC;AAAA,EAC7B,UAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,GAAG;AACL,CAAA,KAA2B;AACzB,EAAA,uBACEA,GAAAA,CAAAC,QAAAA,EAAA,EACA,QAAA,kBAAAD,GAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACG,GAAG,KAAA;AAAA,MACH,GAAI,UAAA,GAAa,EAAE,OAAA,KAAqB,EAAC;AAAA,MAC3C,KAAA;AAAA,MACA,WAAY,mCAAA,CAAe,MAAA;AAAA,MAC3B,SAAA,EAAW;AAAA,QACT,OAAA,EAAS;AAAA,UACP,WAAW,mCAAA,CAAe;AAAA,SAC5B;AAAA,QACA,OAAA,EAAS;AAAA,UACP,WAAW,mCAAA,CAAe;AAAA,SAC5B;AAAA,QACA,SAAA,EAAW;AAAA,UACT,WAAW,mCAAA,CAAe;AAAA;AAC5B;AACF;AAAA,GACF,EACA,CAAA;AAEJ;ACpBO,IAAM,eAAA,GAAkB,CAAC,EAAE,UAAA,GAAa,MAAK,KAAiC;AACnF,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,OAAA,EAAQ;AAEtB,EAAA,MAAM,OAAA,GAAU,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,OAAO,OAAO,CAAA;AAC5D,EAAA,MAAM,WAAW,OAAA,KAAY,QAAA;AAE7B,EAAA,MAAM,OAAA,GAAU,cAAA,CAAe,CAAA,KAAA,KAAS,QAAA,GAAW,KAAA,CAAM,eAAe,OAAA,GAAU,KAAA,CAAM,QAAA,CAAS,OAAO,CAAA,IAAK,KAAA;AAC7G,EAAA,MAAM,SAAA,GAAY,eAAe,CAAA,KAAA,KAAS,QAAA,GAAW,MAAM,cAAA,CAAe,SAAA,GAAY,KAAA,CAAM,QAAA,CAAS,SAAS,CAAA,IAAA,WAAA;AAE9G,EAAA,MAAM,WAAW,cAAA,EAAe;AAEhC,EAAA,MAAM,EAAE,UAAA,EAAY,iBAAA,EAAkB,GAAI,YAAA,EAAa;AAEvD,EAAA,MAAM,gBAAA,GAAmBoC,WAAAA,CAAY,OAAO,KAAA,KAAmB;AAC7D,IAAA,MAAM,iBAAA,CAAkB,EAAE,OAAA,EAAS,KAAA,EAAO,CAAA;AAC1C,IAAA,MAAM,gBAAA,GAAmB,WAAW,SAAS,CAAA;AAE7C,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,QAAA,CAAS,gBAAA,CAAiB,gBAAgB,CAAC,CAAA;AAAA,IAC7C,CAAA,MAAO;AACL,MAAA,QAAA,CAAS,UAAA,CAAW,gBAAgB,CAAC,CAAA;AAAA,IACvC;AAAA,EACF,GAAG,CAAC,QAAA,EAAU,iBAAA,EAAmB,UAAA,EAAY,QAAQ,CAAC,CAAA;AAEtD,EAAA,uBACEpC,GAAAA,CAAAC,QAAAA,EAAA,EACA,QAAA,kBAAAD,GAAAA;AAAA,IAAC,cAAA;AAAA,IAAA;AAAA,MACC,UAAA;AAAA,MACA,OAAA,EAAU,EAAE,kCAAkC,CAAA;AAAA,MAC9C,KAAA,EAAQ,EAAE,kCAAkC,CAAA;AAAA,MAC5C,QAAA,EAAW,OAAO,UAAA,KAAwB,MAAM,iBAAiB,UAAU,CAAA;AAAA,MAC3E,YAAa,OAAA,IAAW,KAAA;AAAA,MACxB,UAAA,EAAa,SAAA,KAAA,WAAA;AAAA;AAAA,GACf,EACA,CAAA;AAEJ;ACpDA,IAAM,WAAA,GAAc,2BAASA,GAAAA,CAAC,SAAI,KAAA,EAAM,4BAAA,EAA6B,MAAA,EAAO,MAAA,EAAO,OAAA,EAAQ,gBAAA,EAAiB,OAAM,MAAA,EAAO,IAAA,EAAK,WAAW,GAAG,KAAA,EAAO,0BAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,kQAAA,EAAmQ,CAAA,EAAE,CAAA;AACha,IAAO,gBAAA,GAAQ,WAAA;ACDf,IAAM,OAAA,GAAU,2BAASA,GAAAA,CAAC,SAAI,KAAA,EAAM,4BAAA,EAA6B,MAAA,EAAO,MAAA,EAAO,OAAA,EAAQ,gBAAA,EAAiB,OAAM,MAAA,EAAO,IAAA,EAAK,WAAW,GAAG,KAAA,EAAO,0BAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,wOAAA,EAAyO,CAAA,EAAE,CAAA;AAClY,IAAO,YAAA,GAAQ,OAAA;ACeR,IAAM,iBAAiB,MAAM;AAClC,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,OAAA,EAAQ;AACtB,EAAA,MAAM,MAAA,GAAS,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,SAAS,MAAM,CAAA;AAC5D,EAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,YAAY,KAAK,CAAA;AAC7D,EAAA,MAAM,QAAA,GAAW,UAAU,CAAC,KAAA;AAE5B,EAAA,MAAM,WAAW,cAAA,EAAe;AAEhC,EAAA,MAAM,EAAE,UAAA,EAAY,iBAAA,EAAkB,GAAI,gBAAA,EAAiB;AAE3D,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ;AAAA,MACE,EAAA,EAAA,aAAA;AAAA,MACA,IAAA,EAAM,YAAA;AAAA,MACN,KAAA,EAAO,EAAE,qCAAqC,CAAA;AAAA,MAC9C,KAAA,EAAA,aAAA;AAAA,KACF;AAAA,IACA;AAAA,MACE,EAAA,EAAA,eAAA;AAAA,MACA,IAAA,EAAM,gBAAA;AAAA,MACN,KAAA,EAAO,EAAE,oCAAoC,CAAA;AAAA,MAC7C,KAAA,EAAA,eAAA;AAAA;AACF,GACF;AAEA,EAAA,MAAM,gBAAA,GAAmBoC,WAAAA,CAAY,OAAO,KAAA,KAAkB;AAC5D,IAAA,MAAM,YAAA,GAAe,KAAA,KAAA,eAAA;AACrB,IAAA,MAAM,iBAAA,CAAkB,EAAE,MAAA,EAAQ,YAAA,EAAc,CAAA;AAChD,IAAA,QAAA,CAAS,SAAA,CAAU,UAAA,CAAW,QAAQ,CAAC,CAAC,CAAA;AAAA,EAC1C,CAAA,EAAG,CAAC,iBAAA,EAAmB,UAAA,EAAY,QAAQ,CAAC,CAAA;AAE5C,EAAA,uBACEpC,GAAAA,CAAAC,QAAAA,EAAA,EACA,QAAA,kBAAAD,GAAAA;AAAA,IAAC,kBAAA;AAAA,IAAA;AAAA,MACC,UAAA,EAAa,IAAA;AAAA,MACb,KAAA,EAAQ,EAAE,iCAAiC,CAAA;AAAA,MAC3C,WAAA,EAAY,YAAA;AAAA,MACZ,KAAA,EAAQ,QAAA,GAAA,eAAA,gBAAA,aAAA;AAAA,MACR,QAAA,EAAW,OAAO,GAAA,KAAgB,MAAM,iBAAiB,GAAG,CAAA;AAAA,MAC5D;AAAA;AAAA,GACF,EACA,CAAA;AAEJ;AC1CO,IAAM,sBAAsB,CAAC;AAAA,EAClC,UAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,KAAA;AAAA,EACA,UAAA;AAAA,EACA,GAAG;AACL,CAAA,KAAgC;AAC9B,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,OAAA,EAAQ;AACtB,EAAA,MAAM,EAAE,WAAA,EAAY,GAAI,cAAA,EAAe;AAEvC,EAAA,uBACEA,GAAAA,CAAAC,QAAAA,EAAA,EACA,QAAA,kBAAAD,GAAAA;AAAA,IAAC,aAAA;AAAA,IAAA;AAAA,MACC,KAAA;AAAA,MACE,GAAG,KAAA;AAAA,MACH,GAAI,UAAA,GAAa,EAAE,OAAa,GAAI,EAAE,cAAc,KAAA,EAAM;AAAA,MAC5D,WAAA;AAAA,MACA,WAAY,mCAAA,CAAe,WAAA;AAAA,MAC3B,SAAA,EAAW;AAAA,QACT,OAAA,EAAS;AAAA,UACP,SAAA,EAAWY,WAAAA;AAAA,YACT,mCAAA,CAAe,kBAAA;AAAA,YACf,cAAc,mCAAA,CAAe;AAAA;AAC/B,SACF;AAAA,QACA,KAAA,EAAO;AAAA,UACL,WAAW,mCAAA,CAAe;AAAA,SAC5B;AAAA,QACA,KAAA,EAAO;AAAA,UACL,WAAW,mCAAA,CAAe;AAAA,SAC5B;AAAA,QACA,OAAA,EAAS;AAAA,UACP,WAAW,0BAAA,CAAe;AAAA,SAC5B;AAAA,QACA,KAAA,EAAO;AAAA,UACL,WAAW,mCAAA,CAAe;AAAA,SAC5B;AAAA,QACA,KAAA,EAAO;AAAA,UACL,SAAA,EAAWA,WAAAA,CAAW,0BAAA,CAAe,IAAA,EAAM,oCAAe,WAAW,CAAA;AAAA,UACrE,SAAA,EAAW;AAAA,YACT,cAAA,EAAgB;AAAA,cACd,KAAA,EAAO,WAAA,CAAY,OAAA,CAAQ,KAAA,CAAM,YAAA;AAAA,cACjC,UAAA,EAAY,WAAA,CAAY,OAAA,CAAQ,KAAA,CAAM;AAAA,aACxC;AAAA,YACA,OAAA,EAAS;AAAA,cACP,WAAW,0BAAA,CAAe;AAAA,aAC5B;AAAA,YACA,KAAA,EAAO,UAAA,IAAc,CAAA,CAAE,sBAAsB;AAAA;AAC/C;AACF;AACF;AAAA,GACA,EACF,CAAA;AAEJ;ACtDO,IAAM,iBAAiB,CAAC;AAAA,EAC7B,UAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA,GAAe,KAAA;AAAA,EACf,KAAA;AAAA,EACA,UAAA;AAAA,EACA,GAAG;AACL,CAAA,KAA2B;AACzB,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,OAAA,EAAQ;AACtB,EAAA,MAAM,EAAE,WAAA,EAAY,GAAI,cAAA,EAAe;AAEvC,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ,GAAI,YAAA,IAAgB,KAAA,CAAM,KAAA,IAAS,MAAM,IAAA,GAAO;AAAA,MAC9C,sBAAsB,MAAM;AAC1B,QAAA,MAAM,CAAC,GAAA,EAAK,GAAG,CAAA,GAAI,CAAC,KAAK,GAAA,CAAI,GAAG,KAAA,CAAM,KAAK,GAAG,IAAA,CAAK,GAAA,CAAI,GAAG,KAAA,CAAM,KAAK,CAAC,CAAA;AACtE,QAAA,MAAM,IAAA,GAAO,MAAM,IAAA,IAAQ,CAAA;AAC3B,QAAA,MAAM,QAAQ,GAAA,GAAM,GAAA;AACpB,QAAA,MAAM,iBAAiB,KAAA,GAAQ,IAAA;AAC/B,QAAA,OAAO,IAAA,CAAK,KAAK,cAAc,CAAA;AAAA,MACjC,CAAA;AAAG,QACD,EAAC;AAAA,IACL,GAAG,KAAA,CAAM;AAAA,GACX;AAEA,EAAA,uBACEZ,GAAAA,CAAAC,QAAAA,EAAA,EACA,QAAA,kBAAAD,GAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,KAAA;AAAA,MACE,GAAG,KAAA;AAAA,MACH,GAAI,UAAA,GAAa,EAAE,OAAa,GAAI,EAAC,cAAc,KAAA,EAAK;AAAA,MAC1D,WAAA;AAAA,MACA,SAAA,EAAYY,WAAAA;AAAA,QACV,mCAAA,CAAe,MAAA;AAAA,QACf,gBAAgB,mCAAA,CAAe;AAAA,OACjC;AAAA,MACA,KAAA;AAAA,MACA,SAAA,EAAW;AAAA,QACT,OAAA,EAAS;AAAA,UACP,SAAA,EAAWA,WAAAA;AAAA,YACT,mCAAA,CAAe,aAAA;AAAA,YACf,cAAc,mCAAA,CAAe;AAAA;AAC/B,SACF;AAAA,QACA,KAAA,EAAO;AAAA,UACL,SAAA,EAAWA,WAAAA,CAAW,mCAAA,CAAe,KAAA,EAAO,oCAAe,WAAW;AAAA,SACxE;AAAA,QACA,MAAA,EAAQ;AAAA,UACN,WAAW,mCAAA,CAAe;AAAA,SAC5B;AAAA,QACA,WAAA,EAAa;AAAA,UACX,WAAW,mCAAA,CAAe;AAAA,SAC5B;AAAA,QACA,KAAA,EAAO;AAAA,UACL,WAAW,mCAAA,CAAe;AAAA,SAC5B;AAAA,QACA,KAAA,EAAO;AAAA,UACL,WAAW,mCAAA,CAAe;AAAA,SAC5B;AAAA,QACA,KAAA,EAAO;AAAA,UACL,SAAA,EAAWA,WAAAA,CAAW,0BAAA,CAAe,IAAA,EAAM,oCAAe,WAAW,CAAA;AAAA,UACrE,SAAA,EAAW;AAAA,YACT,cAAA,EAAgB;AAAA,cACd,KAAA,EAAO,WAAA,CAAY,OAAA,CAAQ,KAAA,CAAM,YAAA;AAAA,cACjC,UAAA,EAAY,WAAA,CAAY,OAAA,CAAQ,KAAA,CAAM;AAAA,aACxC;AAAA,YACA,OAAA,EAAS;AAAA,cACP,WAAW,0BAAA,CAAe;AAAA,aAC5B;AAAA,YACA,KAAA,EAAO,UAAA,IAAc,CAAA,CAAE,sBAAsB;AAAA;AAC/C;AACF;AACF;AAAA,GACF,EACA,CAAA;AAEJ;AC3DO,SAAS,2BAA2B,OAAA,EAAqE;AAC9G,EAAA,MAAM,EAAE,WAAA,EAAa,eAAA,EAAiB,aAAA,EAAe,mBAAA,GAAsB,MAAK,GAAI,OAAA;AAEpF,EAAA,MAAM,EAAE,4BAAA,EAA8B,yBAAA,EAA2B,qBAAA,KAA0B,UAAA,EAAW;AACtG,EAAA,MAAM,EAAE,WAAA,EAAY,GAAI,cAAA,EAAe;AAEvC,EAAA,OAAOoE,QAAQ,MAAM;AAEnB,IAAA,MAAM,qBAAA,GAAwB,CAAC,EAC7B,qBAAA,GAAwB,WAAW,KACnC,4BAAA,GAA+B,WAAW,CAAA,IAC1C,yBAAA,GAA4B,WAAW,CAAA,CAAA;AAIzC,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,QAAQ,eAAA;AAAiB,MACvB,KAAK,QAAA;AACH,QAAA,SAAA,GAAY,WAAA,CAAY,QAAA,EAAU,WAAA,EAAa,QAAA,CAAS,WAA6B,CAAA,IAAK,KAAA;AAC1F,QAAA;AAAA,MACF,KAAK,KAAA;AACH,QAAA,SAAA,GAAY,WAAA,CAAY,QAAA,EAAU,QAAA,EAAU,QAAA,CAAS,WAA6B,CAAA,IAAK,KAAA;AACvF,QAAA;AAAA,MACF,KAAK,QAAA;AACH,QAAA,SAAA,GAAY,WAAA,CAAY,QAAA,EAAU,WAAA,EAAa,QAAA,CAAS,WAA6B,CAAA,IAAK,KAAA;AAC1F,QAAA;AAAA;AAIJ,IAAA,IAAI,aAAA,GAAgB,KAAA;AACpB,IAAA,IAAI,YAAA,GAAe,KAAA;AAEnB,IAAA,IAAI,kBAAkB,MAAA,EAAQ;AAC5B,MAAA,aAAA,GAAgB,YAAY,QAAA,EAAU,IAAA,EAAM,IAAA,EAAM,QAAA,CAAS,WAAkB,CAAA,IAAK,KAAA;AAClF,MAAA,YAAA,GAAe,YAAY,QAAA,EAAU,IAAA,EAAM,QAAA,EAAU,QAAA,CAAS,WAAkB,CAAA,IAAK,KAAA;AAAA,IACvF,CAAA,MAAA,IAAW,kBAAkB,SAAA,EAAW;AACtC,MAAA,aAAA,GAAgB,YAAY,QAAA,EAAU,OAAA,EAAS,IAAA,EAAM,QAAA,CAAS,WAAkB,CAAA,IAAK,KAAA;AACrF,MAAA,YAAA,GAAe,YAAY,QAAA,EAAU,OAAA,EAAS,QAAA,EAAU,QAAA,CAAS,WAAkB,CAAA,IAAK,KAAA;AAAA,IAC1F;AAGA,IAAA,MAAM,WAAA,GAAc,SAAA,IAAA,CAAc,aAAA,IAAiB,YAAA,KAAiB,mBAAA;AAGpE,IAAA,MAAM,kBAAkB,qBAAA,IAAyB,WAAA;AAEjD,IAAA,OAAO;AAAA,MACL,qBAAA;AAAA,MACA,aAAA;AAAA,MACA,YAAA;AAAA,MACA,WAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,CAAA,EAAG;AAAA,IACD,WAAA;AAAA,IACA,eAAA;AAAA,IACA,aAAA;AAAA,IACA,mBAAA;AAAA,IACA,WAAA;AAAA,IACA,4BAAA;AAAA,IACA,yBAAA;AAAA,IACA;AAAA,GACD,CAAA;AACH;;;AC3DO,IAAM,oBAAoB,MAAM;AACrC,EAAA,MAAM,gBAAgB,cAAA,CAAe,CAAC,KAAA,KAAU,KAAA,CAAM,OAAO,OAAO,CAAA;AACpE,EAAA,MAAM,WAAW,aAAA,KAAkB,QAAA;AACnC,EAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,YAAY,KAAK,CAAA;AAG7D,EAAA,MAAM,QAAA,GAAW,cAAA;AAAA,IAAe,CAAA,KAAA,KAC9B,QAAA,GAAW,KAAA,CAAM,cAAA,GAAiB,KAAA,CAAM;AAAA,GAC1C;AAGA,EAAA,MAAM,OAAA,GAAU,UAAU,OAAA,IAAW;AAAA,IACnC,MAAA,EAAA,WAAA;AAAA,IACA,QAAQ,EAAC;AAAA,IACT,UAAU;AAAC,GACb;AAEA,EAAA,MAAM,EAAE,uBAAA,EAAyB,oBAAA,EAAsB,uBAAA,KAA4B,iBAAA,EAAkB;AAErG,EAAA,MAAM,EAAE,WAAA,EAAY,GAAI,cAAA,EAAe;AAEvC,EAAA,MAAM,WAAW,cAAA,EAAe;AAE/B,EAAA,MAAM,WAAA,GAAcA,QAAQ,MAAM;AACjC,IAAA,OAAO,QAAA,GACL,uBAAA,GACA,KAAA,GACE,oBAAA,GACA,uBAAA;AAAA,EACN,GAAG,CAAC,QAAA,EAAU,OAAO,uBAAA,EAAyB,oBAAA,EAAsB,uBAAuB,CAAC,CAAA;AAG5F,EAAA,MAAM,EAAE,eAAA,EAAiB,kBAAA,EAAmB,GAAI,0BAAA,CAA2B;AAAA,IACzE,WAAA,EAAA,gBAAA;AAAA,IACA,eAAA,EAAiB,QAAA,GAAW,QAAA,GAAW,KAAA,GAAQ,KAAA,GAAQ,QAAA;AAAA,IACvD,aAAA,EAAe,SAAA;AAAA,IACf,mBAAA,EAAqB,YAAY,MAAA,GAAS;AAAA,GAC3C,CAAA;AAGD,EAAA,MAAM;AAAA,IACJ,aAAA;AAAA,IACA,UAAA;AAAA,IACA,eAAA;AAAA,IACA,gBAAA;AAAA,IACA;AAAA,GACF,GAAI,YAAY,EAAC;AAGjB,EAAA,MAAM,iBAAA,GAAoB,CAAC,GAAA,KAAoC;AAC7D,IAAA,QAAQ,GAAA;AAAK,MACX,KAAA,eAAA;AACE,QAAA,OAAO,aAAA;AAAA,MACT,KAAA,YAAA;AACE,QAAA,OAAO,UAAA;AAAA,MACT,KAAA,iBAAA;AACE,QAAA,OAAO,eAAA;AAAA,MACT,KAAA,kBAAA;AACE,QAAA,OAAO,gBAAA;AAAA,MACT,KAAA,aAAA;AACE,QAAA,OAAO,WAAA;AAAA,MACT;AACE,QAAA,OAAO,MAAA;AAAA;AACX,EACF,CAAA;AAGA,EAAA,MAAM,eAAA,GAAkB,CAAC,GAAA,KAAoC;AAC3D,IAAA,QAAQ,GAAA;AAAK,MACX,KAAA,YAAA;AACE,QAAA,OAAA,WAAA;AAAA,MACF,KAAA,eAAA;AAAA,MACA,KAAA,iBAAA;AAAA,MACA,KAAA,kBAAA;AAAA,MACA,KAAA,aAAA;AACE,QAAA,OAAO,IAAA;AAAA,MACT;AACE,QAAA,OAAO,IAAA;AAAA;AACX,EACF,CAAA;AAGA,EAAA,MAAM,cAAA,GAAiB5C,WAAAA,CAAY,CAAC,SAAA,EAAgC,UAAA,KAA2C;AAC7G,IAAA,IAAI,SAAA,KAAA,QAAA,eAA0C;AAC5C,MAAA,OAAO,OAAA,CAAQ,SAAS,UAA6B,CAAA;AAAA,IACvD;AAGA,IAAA,IAAI,SAAA,KAAA,WAAA,kBAA6C;AAC/C,MAAA,MAAM,aAAA,GAAgB,WAAA,CAAY,QAAA,CAAS,OAAA,EAAS,OAAA;AACpD,MAAA,IAAI,eAAe,IAAA,EAAM;AACvB,QAAA,MAAM,YAAA,GAAe,aAAA,CAAc,IAAA,CAAK,SAAkI,CAAA;AAC1K,QAAA,MAAM,WAAA,GAAc,eAAe,UAAkD,CAAA;AACrF,QAAA,IAAI,gBAAgB,MAAA,EAAW;AAC7B,UAAA,OAAO,WAAA;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,gBAAgB,UAAU,CAAA;AAAA,EACnC,CAAA,EAAG,CAAC,WAAA,CAAY,QAAA,CAAS,SAAS,OAAA,EAAS,OAAA,CAAQ,MAAM,CAAC,CAAA;AAE1D,EAAA,MAAM,uBAAA,GAA0BA,WAAAA,CAAY,CAAC,SAAA,KAAmC;AAC9E,IAAA,OAAO;AAAA,MACL,CAAA,eAAA,uBAAuC,cAAA,CAAe,SAAA,EAAA,eAAA,qBAA8C;AAAA,MACpG,CAAA,YAAA,oBAAoC,cAAA,CAAe,SAAA,EAAA,YAAA,kBAA2C;AAAA,MAC9F,CAAA,iBAAA,yBAAyC,cAAA,CAAe,SAAA,EAAA,iBAAA,uBAAgD;AAAA,MACxG,CAAA,kBAAA,0BAA0C,cAAA,CAAe,SAAA,EAAA,kBAAA,wBAAiD;AAAA,MAC1G,CAAA,aAAA,qBAAqC,cAAA,CAAe,SAAA,EAAA,aAAA;AAA4C,KAClG;AAAA,EACF,CAAA,EAAG,CAAC,cAAc,CAAC,CAAA;AASnB,EAAA,SAAS,yBAAyB,GAAA,EAAiC;AAEjE,IAAA,IAAI,CAAC,kBAAA,EAAoB;AACvB,MAAA,OAAO,kBAAkB,GAAG,CAAA;AAAA,IAC9B;AAEA,IAAA,IAAI,QAAQ,MAAA,KAAA,QAAA,eAAuC;AACjD,MAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,MAAA,GAAS,GAAsB,CAAA;AAC3D,MAAA,IAAI,gBAAgB,MAAA,EAAW;AAC7B,QAAA,OAAO,WAAA;AAAA,MACT;AACA,MAAA,OAAO,gBAAgB,GAAG,CAAA;AAAA,IAC5B;AAEA,IAAA,OAAO,cAAA,CAAe,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA;AAAA,EAC3C;AASA,EAAA,SAAS,qBAAqB,GAAA,EAAiC;AAC7D,IAAA,IAAI,CAAC,kBAAA,EAAoB;AACvB,MAAA,OAAO,gBAAgB,GAAG,CAAA;AAAA,IAC5B;AAEA,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,IAAI,OAAA,CAAQ,MAAA,KAAA,WAAA,oBACR,OAAA,CAAQ,MAAA,KAAA,QAAA,eAAuC;AACjD,QAAA,MAAM,aAAA,GAAgB,WAAA,CAAY,QAAA,EAAU,OAAA,EAAS,OAAA;AACrD,QAAA,IAAI,eAAe,IAAA,EAAM;AACzB,UAAA,MAAM,YAAA,GAAe,aAAA,CAAc,IAAA,CAAK,OAAA,CAAQ,MAA+H,CAAA;AAC7K,UAAA,MAAM,WAAA,GAAc,eAAe,GAA2C,CAAA;AAC9E,UAAA,IAAI,gBAAgB,MAAA,EAAW;AAC7B,YAAA,OAAO,WAAA;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,IAAA,OAAO,gBAAgB,GAAG,CAAA;AAAA,EAC5B;AAEA,EAAA,MAAM,gCAAA,GAAmCA,YAAY,wBAAA,EAA0B;AAAA,IAC7E,wBAAA;AAAA,IACA,kBAAA;AAAA,IACA,OAAA,CAAQ,MAAA;AAAA,IACR,OAAA,CAAQ,MAAA;AAAA,IACR,OAAA,CAAQ,QAAA;AAAA,IACR,WAAA,CAAY,UAAU,OAAA,EAAS,OAAA;AAAA,IAC/B,aAAA;AAAA,IACA,UAAA;AAAA,IACA,eAAA;AAAA,IACA,gBAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,MAAM,4BAAA,GAA+BA,YAAY,oBAAA,EAAsB;AAAA,IACrE,kBAAA;AAAA,IACA,oBAAA;AAAA,IACA,OAAA,CAAQ,MAAA;AAAA,IACR,WAAA,CAAY,UAAU,OAAA,EAAS;AAAA,GAChC,CAAA;AAED,EAAA,MAAM,kBAAA,GAAqBA,WAAAA,CAAY,CAAC,GAAA,KAAwC;AAC9E,IAAA,MAAM,cAAA,GAAiB,iCAAiC,GAAU,CAAA;AAClE,IAAA,OAAO,cAAA,KAAmB,QAAQ,cAAA,KAAmB,MAAA;AAAA,EACvD,CAAA,EAAG,CAAC,gCAAgC,CAAC,CAAA;AAIrC,EAAA,MAAM,sBAAA,GAAyBA,WAAAA,CAAY,CAAC,KAAA,KAAyB;AACnE,IAAA,MAAM,OAAA,GAAe,EAAE,KAAA,EAAM;AAC7B,IAAA,IAAI,kBAAA,IAAsB,QAAQ,MAAA,EAAQ;AACxC,MAAA,OAAA,CAAQ,SAAS,OAAA,CAAQ,MAAA;AAAA,IAC3B;AACA,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,QAAA,CAAS,sBAAA,CAAuB,OAAO,CAAC,CAAA;AAAA,IAC1C,CAAA,MAAO;AACL,MAAA,QAAA,CAAS,gBAAA,CAAiB,OAAO,CAAC,CAAA;AAAA,IACpC;AAAA,EACF,GAAG,CAAC,QAAA,EAAU,UAAU,kBAAA,EAAoB,OAAA,CAAQ,MAAM,CAAC,CAAA;AAE3D,EAAA,MAAM,mBAAA,GAAsBA,WAAAA,CAAY,CAAC,KAAA,KAA+B;AACtE,IAAA,MAAM,OAAA,GAAe,EAAE,KAAA,EAAM;AAC7B,IAAA,IAAI,kBAAA,IAAsB,QAAQ,MAAA,EAAQ;AACxC,MAAA,OAAA,CAAQ,SAAS,OAAA,CAAQ,MAAA;AAAA,IAC3B;AACA,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,QAAA,CAAS,mBAAA,CAAoB,OAAO,CAAC,CAAA;AAAA,IACvC,CAAA,MAAO;AACL,MAAA,QAAA,CAAS,aAAA,CAAc,OAAO,CAAC,CAAA;AAAA,IACjC;AAAA,EACF,GAAG,CAAC,QAAA,EAAU,UAAU,kBAAA,EAAoB,OAAA,CAAQ,MAAM,CAAC,CAAA;AAE3D,EAAA,MAAM,wBAAA,GAA2BA,WAAAA,CAAY,CAAC,KAAA,KAAyB;AACrE,IAAA,MAAM,OAAA,GAAe,EAAE,KAAA,EAAM;AAC7B,IAAA,IAAI,kBAAA,IAAsB,QAAQ,MAAA,EAAQ;AACxC,MAAA,OAAA,CAAQ,SAAS,OAAA,CAAQ,MAAA;AAAA,IAC3B;AACA,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,QAAA,CAAS,wBAAA,CAAyB,OAAO,CAAC,CAAA;AAAA,IAC5C,CAAA,MAAO;AACL,MAAA,QAAA,CAAS,kBAAA,CAAmB,OAAO,CAAC,CAAA;AAAA,IACtC;AAAA,EACF,GAAG,CAAC,QAAA,EAAU,UAAU,kBAAA,EAAoB,OAAA,CAAQ,MAAM,CAAC,CAAA;AAE3D,EAAA,MAAM,yBAAA,GAA4BA,WAAAA,CAAY,CAAC,KAAA,KAAyB;AACtE,IAAA,MAAM,OAAA,GAAe,EAAE,KAAA,EAAM;AAC7B,IAAA,IAAI,kBAAA,IAAsB,QAAQ,MAAA,EAAQ;AACxC,MAAA,OAAA,CAAQ,SAAS,OAAA,CAAQ,MAAA;AAAA,IAC3B;AACA,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,QAAA,CAAS,yBAAA,CAA0B,OAAO,CAAC,CAAA;AAAA,IAC7C,CAAA,MAAO;AACL,MAAA,QAAA,CAAS,mBAAA,CAAoB,OAAO,CAAC,CAAA;AAAA,IACvC;AAAA,EACF,GAAG,CAAC,QAAA,EAAU,UAAU,kBAAA,EAAoB,OAAA,CAAQ,MAAM,CAAC,CAAA;AAE3D,EAAA,MAAM,oBAAA,GAAuBA,WAAAA,CAAY,CAAC,KAAA,KAAyB;AACjE,IAAA,MAAM,OAAA,GAAe,EAAE,KAAA,EAAM;AAC7B,IAAA,IAAI,kBAAA,IAAsB,QAAQ,MAAA,EAAQ;AACxC,MAAA,OAAA,CAAQ,SAAS,OAAA,CAAQ,MAAA;AAAA,IAC3B;AACA,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,QAAA,CAAS,oBAAA,CAAqB,OAAO,CAAC,CAAA;AAAA,IACxC,CAAA,MAAO;AACL,MAAA,QAAA,CAAS,cAAA,CAAe,OAAO,CAAC,CAAA;AAAA,IAClC;AAAA,EACF,GAAG,CAAC,QAAA,EAAU,UAAU,kBAAA,EAAoB,OAAA,CAAQ,MAAM,CAAC,CAAA;AAE3D,EAAA,MAAM,wBAAA,GAA2BA,WAAAA,CAAY,CAAC,KAAA,KAAmB;AAC/D,IAAA,IAAI,sBAAsB,KAAA,EAAO;AAC/B,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,QAAA,CAAS,sBAAA,CAAuB;AAAA,UAC9B,MAAA,EAAA,WAAA;AAAA,UACA,QAAQ;AAAC,SACV,CAAC,CAAA;AACF,QAAA,QAAA,CAAS,wBAAA,CAAyB,KAAK,CAAC,CAAA;AAAA,MAC1C,CAAA,MAAO;AACL,QAAA,QAAA,CAAS,gBAAA,CAAiB;AAAA,UACxB,MAAA,EAAA,WAAA;AAAA,UACA,QAAQ;AAAC,SACV,CAAC,CAAA;AACF,QAAA,QAAA,CAAS,kBAAA,CAAmB,KAAK,CAAC,CAAA;AAAA,MACpC;AAAA,IACF;AAAA,EACF,CAAA,EAAG,CAAC,QAAA,EAAU,QAAA,EAAU,kBAAkB,CAAC,CAAA;AAE3C,EAAA,OAAO;AAAA,IACL,eAAe,OAAA,CAAQ,MAAA;AAAA,IACvB,eAAA,EAAiB,uBAAA;AAAA,IACjB,wBAAA,EAA0B,gCAAA;AAAA,IAC1B,oBAAA,EAAsB,4BAAA;AAAA,IACtB,UAAA,EAAY,kBAAA;AAAA,IACZ,gBAAA,EAAkB,sBAAA;AAAA,IAClB,aAAA,EAAe,mBAAA;AAAA,IACf,kBAAA,EAAoB,wBAAA;AAAA,IACpB,mBAAA,EAAqB,yBAAA;AAAA,IACrB,cAAA,EAAgB,oBAAA;AAAA,IAChB,kBAAA,EAAoB;AAAA,GACtB;AACF;;;ACjUO,IAAM,cAAA,GAAiB,CAC5B,WAAA,EACA,KAAA,EACA,MAAA,KACuB;AACvB,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,OAAA,EAAQ;AAEtB,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,OAAO,MAAA;AAAA,EACT;AAGA,EAAA,IAAI,WAAA,KAAA,MAAA,aAAiD;AACnD,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,IAAI,WAAA,KAAA,OAAA,cAAkD;AACpD,IAAA,QAAQ,MAAA;AAAQ,MACd,KAAK,SAAA;AACH,QAAA,MAAM,QAAA,GAAW,KAAA,CAAM,CAAC,CAAA,GAAI,GAAA;AAC5B,QAAA,MAAM,QAAA,GAAW,KAAA,CAAM,CAAC,CAAA,GAAI,GAAA;AAC5B,QAAA,MAAM,UAAA,GAAa,QAAA,KAAa,CAAA,GAAI,GAAA,GAAM,GAAG,QAAQ,CAAA,CAAA,CAAA;AACrD,QAAA,MAAM,UAAA,GAAa,QAAA,KAAa,CAAA,GAAI,GAAA,GAAM,GAAG,QAAQ,CAAA,CAAA,CAAA;AACrD,QAAA,OAAO,CAAA,EAAI,UAAW,CAAA,GAAA,EAAO,UAAW,CAAA,CAAA;AAAA,MAC1C,KAAK,YAAA;AACH,QAAA,MAAM,kBAAA,GAAqB,MAAM,CAAC,CAAA;AAClC,QAAA,MAAM,kBAAA,GAAqB,MAAM,CAAC,CAAA;AAClC,QAAA,MAAM,aAAA,GAAgB,kBAAA,KAAuB,CAAA,GAAI,GAAA,GAAM,GAAG,kBAAkB,CAAA,IAAA,CAAA;AAC5E,QAAA,MAAM,aAAA,GAAgB,kBAAA,KAAuB,CAAA,GAAI,GAAA,GAAM,GAAG,kBAAkB,CAAA,IAAA,CAAA;AAC5E,QAAA,OAAO,CAAA,EAAI,aAAc,CAAA,GAAA,EAAO,aAAc,CAAA,CAAA;AAAA,MAChD,KAAK,QAAA;AAAA,MACL;AACE,QAAA,OAAO,GAAI,KAAA,CAAM,CAAC,CAAE,CAAA,GAAA,EAAO,KAAA,CAAM,CAAC,CAAE,CAAA,CAAA;AAAA;AACxC,EACF;AAGA,EAAA,IAAI,OAAO,WAAA,KAAgB,QAAA,IAAY,KAAA,IAAS,WAAA,EAAa;AAC3D,IAAA,MAAM,qBAAA,GAAwB,CAAA,CAAE,WAAA,CAAY,GAAG,CAAA;AAC/C,IAAA,OAAO,qBAAA,KAA0B,WAAA,CAAY,GAAA,GAAM,qBAAA,GAAwB,WAAA,CAAY,QAAA;AAAA,EACzF;AAGA,EAAA,IAAI,OAAO,gBAAgB,QAAA,EAAU;AACnC,IAAA,OAAO,WAAA;AAAA,EACT;AAEA,EAAA,OAAO,MAAA;AACT,CAAA;AClCO,IAAM,qBAAA,GAAwB,CAAC,EAAE,UAAA,GAAa,MAAK,KAAiC;AACzF,EAAA,MAAM,EAAE,WAAA,EAAY,GAAI,cAAA,EAAe;AACvC,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,OAAA,EAAQ;AAEtB,EAAA,MAAM,wBAAA,GAA2B;AAAA,IAC/B,OAAA,EAAS,WAAA,CAAY,QAAA,CAAS,IAAA,CAAA,eAAA,qBAAiC,CAAE,OAAA;AAAA,IACjE,WAAA,EAAa,WAAA,CAAY,QAAA,CAAS,IAAA,CAAA,eAAA,qBAAiC,CAAE,WAAA;AAAA,IACrE,KAAA,EAAO,WAAA,CAAY,QAAA,CAAS,IAAA,CAAA,eAAA,qBAAiC,CAAE,KAAA;AAAA,IAC/D,IAAA,EAAM,WAAA,CAAY,QAAA,CAAS,IAAA,CAAA,eAAA,qBAAiC,CAAE;AAAA,GAChE;AAEA,EAAA,MAAM,kBAAkB,cAAA,CAAe,wBAAA,CAAyB,WAAA,EAAa,wBAAA,CAAyB,OAAO,SAAS,CAAA;AAEtH,EAAA,MAAM,EAAE,UAAA,EAAY,iBAAA,EAAkB,GAAI,YAAA,EAAa;AAEvD,EAAA,MAAM,EAAE,wBAAA,EAA0B,gBAAA,EAAA4D,iBAAAA,EAAkB,UAAA,KAAe,iBAAA,EAAkB;AAErF,EAAA,MAAM,gBAAgB,wBAAA,CAAA,eAAA,qBAA4D;AAElF,EAAA,MAAM,gBAAA,GAAmB5D,WAAAA,CAAY,OAAO,KAAA,KAAoC;AAC9E,IAAA,MAAM,iBAAA,CAAkB;AAAA,MACtB,eAAe,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,KAAA,CAAM,CAAC,CAAA,GAAI;AAAA,KAClD,CAAA;AAED,IAAA4D,iBAAAA,CAAiB,UAAA,CAAW,eAAe,CAAC,CAAA;AAAA,EAC9C,CAAA,EAAG,CAAC,iBAAA,EAAmB,UAAA,EAAYA,iBAAgB,CAAC,CAAA;AAEpD,EAAA,uBACEhG,GAAAA,CAAAC,QAAAA,EAAA,EACE,QAAA,EAAA,wBAAA,CAAyB,8DACvBD,GAAAA;AAAA,IAAC,mBAAA;AAAA,IAAA;AAAA,MACD,UAAA;AAAA,MACA,KAAA,EAAQ,EAAE,kCAAkC,CAAA;AAAA,MAC5C,WAAA,EAAc,eAAA;AAAA,MACd,YAAA,EAAe,MAAA;AAAA,MACf,OAAQ,aAAA,IAAiB,MAAA;AAAA,MACzB,QAAA,EAAW,OAAM,KAAA,KAAU,MAAM,iBAAiB,KAAe,CAAA;AAAA,MACjE,SAAU,UAAA,CAAA,eAAA,qBAA8C,GAAI,YAAW,MAAM,gBAAA,CAAiB,IAAI,CAAA,GAAI,MAAA;AAAA,MACtG,OAAQ,wBAAA,CAAyB,KAAA;AAAA,MACjC,MAAO,wBAAA,CAAyB,IAAA;AAAA,MAChC,QAAA,EAAU;AAAA,QACR,cAAA,EAAgB,EAAE,yBAAyB,CAAA;AAAA,QAC3C,cAAA,EAAgB,EAAE,yBAAyB;AAAA,OAC7C;AAAA,MACA,aAAA,EAAe,EAAE,KAAA,EAAO,SAAA,EAAU;AAAA,MAClC,eAAA,EAAkB,IAAA;AAAA,MAClB,yBAAA,EAA4B;AAAA;AAAA,sBAE5BA,GAAAA;AAAA,IAAC,cAAA;AAAA,IAAA;AAAA,MACD,UAAA;AAAA,MACA,cAAe,wBAAA,CAAyB,OAAA,KAAA,mBAAA;AAAA,MACxC,KAAA,EAAQ,EAAE,kCAAkC,CAAA;AAAA,MAC5C,WAAA,EAAc,eAAA;AAAA,MACd,YAAA,EAAe,MAAA;AAAA,MACf,OAAQ,aAAA,IAAiB,MAAA;AAAA,MACzB,QAAA,EAAW,OAAM,KAAA,KAAU,MAAM,iBAAiB,KAAe,CAAA;AAAA,MACjE,SAAU,UAAA,CAAA,eAAA,qBAA8C,GAAI,YAAW,MAAM,gBAAA,CAAiB,IAAI,CAAA,GAAI,MAAA;AAAA,MACtG,OAAQ,wBAAA,CAAyB,KAAA;AAAA,MACjC,MAAO,wBAAA,CAAyB,IAAA;AAAA,MAChC,aAAA,EAAgB,EAAE,KAAA,EAAO,SAAA;AAAU;AAAA,GACrC,EAEF,CAAA;AAEJ;ACzEO,IAAM,gBAAgB,MAAM;AACjC,EAAA,MAAM,EAAE,WAAA,EAAY,GAAI,cAAA,EAAe;AAEvC,EAAA,OAAOgF,QAAQ,OAAO;AAAA,IACpB,+BAAiC,IAAA;AAAA,IACjC,uBAA6B,WAAA,CAAY,QAAA,CAAS,IAAA,CAAA,YAAA,mBAAgC,IAAA,CAAA,OAAA,aAA8B;AAAA,IAChH,yBAA8B,WAAA,CAAY,QAAA,CAAS,IAAA,CAAA,YAAA,mBAAgC,IAAA,CAAA,QAAA,cAA+B;AAAA,IAClH,uBAA6B,WAAA,CAAY,QAAA,CAAS,IAAA,CAAA,YAAA,mBAAgC,IAAA,CAAA,OAAA;AAA8B,GAClH,CAAA,EAAI,CAAC,WAAA,CAAY,QAAA,CAAS,IAAI,CAAC,CAAA;AACjC;AChBA,IAAM,OAAA,GAAU,2BAAShF,GAAAA,CAAC,SAAI,KAAA,EAAM,4BAAA,EAA6B,MAAA,EAAO,MAAA,EAAO,OAAA,EAAQ,gBAAA,EAAiB,OAAM,MAAA,EAAO,IAAA,EAAK,WAAW,GAAG,KAAA,EAAO,0BAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,6NAAA,EAA8N,CAAA,EAAE,CAAA;AACvX,IAAO,YAAA,GAAQ,OAAA;ACDf,IAAM,eAAA,GAAkB,2BAASA,GAAAA,CAAC,SAAI,KAAA,EAAM,4BAAA,EAA6B,MAAA,EAAO,MAAA,EAAO,OAAA,EAAQ,gBAAA,EAAiB,OAAM,MAAA,EAAO,IAAA,EAAK,WAAW,GAAG,KAAA,EAAO,0BAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,2FAAA,EAA4F,CAAA,EAAE,CAAA;AAC7P,IAAO,qBAAA,GAAQ,eAAA;ACDf,IAAM,gBAAA,GAAmB,2BAASA,GAAAA,CAAC,SAAI,KAAA,EAAM,4BAAA,EAA6B,MAAA,EAAO,MAAA,EAAO,OAAA,EAAQ,gBAAA,EAAiB,OAAM,MAAA,EAAO,IAAA,EAAK,WAAW,GAAG,KAAA,EAAO,0BAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,sEAAA,EAAuE,CAAA,EAAE,CAAA;AACzO,IAAO,sBAAA,GAAQ,gBAAA;ACDf,IAAM,eAAA,GAAkB,2BAASA,GAAAA,CAAC,SAAI,KAAA,EAAM,4BAAA,EAA6B,MAAA,EAAO,MAAA,EAAO,OAAA,EAAQ,gBAAA,EAAiB,OAAM,MAAA,EAAO,IAAA,EAAK,WAAW,GAAG,KAAA,EAAO,0BAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,gDAAA,EAAiD,CAAA,EAAE,CAAA;AAClN,IAAO,qBAAA,GAAQ,eAAA;ACqBR,IAAM,kBAAA,GAAqB,CAAC,EAAE,UAAA,GAAa,MAAK,KAAiC;AACtF,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,OAAA,EAAQ;AACtB,EAAA,MAAM,EAAE,WAAA,EAAY,GAAI,cAAA,EAAe;AAEvC,EAAA,MAAM,OAAA,GAAU,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,OAAO,OAAO,CAAA;AAC5D,EAAA,MAAM,WAAW,OAAA,KAAY,QAAA;AAE7B,EAAA,MAAM,eAAA,GAAkB,cAAA,CAAe,CAAA,KAAA,KAAS,QAAA,GAAW,KAAA,CAAM,eAAe,eAAA,GAAkB,KAAA,CAAM,QAAA,CAAS,eAAe,CAAA,IAAK,IAAA;AAErI,EAAA,MAAM,EAAE,UAAA,EAAY,iBAAA,EAAkB,GAAI,YAAA,EAAa;AAEvD,EAAA,MAAM,EAAE,wBAAA,EAA0B,aAAA,EAAAiG,cAAAA,KAAkB,iBAAA,EAAkB;AAEtE,EAAA,MAAM,aAAa,wBAAA,CAAA,YAAA,kBAAyD;AAE5E,EAAA,MAAM,oBAAoB,aAAA,EAAc;AAGxC,EAAA,MAAM,KAAA,GAAQjB,QAAQ,MAAM;AAC1B,IAAA,MAAM,SAAA,GAAY;AAAA,MAChB;AAAA,QACE,EAAA,EAAA,OAAA;AAAA,QACA,IAAA,EAAM,qBAAA;AAAA,QACN,KAAA,EAAO,EAAE,qCAAqC,CAAA;AAAA,QAC9C,KAAA,EAAA,OAAA;AAAA,OACF;AAAA,MACA;AAAA,QACE,EAAA,EAAA,QAAA;AAAA,QACA,IAAA,EAAM,sBAAA;AAAA,QACN,KAAA,EAAO,EAAE,sCAAsC,CAAA;AAAA,QAC/C,KAAA,EAAA,QAAA;AAAA,OACF;AAAA,MACA;AAAA,QACE,EAAA,EAAA,OAAA;AAAA,QACA,IAAA,EAAM,qBAAA;AAAA,QACN,KAAA,EAAO,EAAE,qCAAqC,CAAA;AAAA,QAC9C,KAAA,EAAA,OAAA;AAAA;AACF,KACF;AAGA,IAAA,IAAI,WAAA,CAAY,QAAA,CAAS,IAAA,CAAA,YAAA,kBAA8B,CAAE,eAAe,KAAA,EAAO;AAC7E,MAAA,SAAA,CAAU,OAAA,CAAQ;AAAA,QAChB,EAAA,EAAA,WAAA;AAAA,QACA,IAAA,EAAM,YAAA;AAAA,QACN,KAAA,EAAO,EAAE,uCAAuC,CAAA;AAAA,QAChD,KAAA,EAAA,WAAA;AAAA,OACD,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,SAAA;AAAA,EACT,GAAG,CAAC,WAAA,CAAY,QAAA,CAAS,IAAA,EAAM,CAAC,CAAC,CAAA;AAEjC,EAAA,MAAM,gBAAA,GAAmB5C,WAAAA,CAAY,OAAO,KAAA,KAAkB;AAC5D,IAAA,MAAM,aAAA,GAAgB,KAAA,KAAA,WAAA,mBAClB,IAAA,GACA,iBAAA,CAAkB,KAAyC,CAAA;AAE/D,IAAA,MAAM,iBAAA,CAAkB;AAAA,MACtB,UAAA,EAAY;AAAA,KACb,CAAA;AAED,IAAA,MAAM,iBAAA,GAAoB,WAAW,YAAY,CAAA;AACjD,IAAA,MAAM,8BAAA,GAAiC,MAAA,CAAO,OAAA,CAAQ,iBAAiB,EAAE,IAAA,CAAK,CAAC,CAAC,GAAA,EAAK2D,MAAK,CAAA,KAAMA,MAAAA,KAAU,iBAAiB,IAAI,CAAC,CAAA;AAEhI,IAAAE,eAAc,8BAA8B,CAAA;AAAA,EAC9C,GAAG,CAAC,iBAAA,EAAmB,UAAA,EAAYA,cAAAA,EAAe,iBAAiB,CAAC,CAAA;AAEpE,EAAA,uBACEjG,GAAAA,CAAAC,QAAAA,EAAA,EACA,QAAA,kBAAAD,GAAAA;AAAA,IAAC,kBAAA;AAAA,IAAA;AAAA,MACC,UAAA;AAAA,MACA,KAAA,EAAQ,EAAE,qCAAqC,CAAA;AAAA,MAC/C,WAAA,EAAY,YAAA;AAAA,MACZ,KAAA,EAAQ,CAAC,QAAA,IAAY,eAAA,GAAA,WAAA,mBAAkD,UAAA;AAAA,MACvE,QAAA,EAAW,OAAO,GAAA,KAAgB,MAAM,iBAAiB,GAAG,CAAA;AAAA,MAC5D;AAAA;AAAA,GACF,EACA,CAAA;AAEJ;ACtFO,IAAM,uBAAA,GAA0B,CAAC,EAAE,UAAA,GAAa,MAAK,KAAiC;AAC3F,EAAA,MAAM,EAAE,WAAA,EAAY,GAAI,cAAA,EAAe;AACvC,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,OAAA,EAAQ;AAEtB,EAAA,MAAM,0BAAA,GAA6B;AAAA,IAC/B,OAAA,EAAS,WAAA,CAAY,QAAA,CAAS,IAAA,CAAA,iBAAA,uBAAmC,CAAE,OAAA;AAAA,IACnE,WAAA,EAAa,WAAA,CAAY,QAAA,CAAS,IAAA,CAAA,iBAAA,uBAAmC,CAAE,WAAA;AAAA,IACvE,KAAA,EAAO,WAAA,CAAY,QAAA,CAAS,IAAA,CAAA,iBAAA,uBAAmC,CAAE,KAAA;AAAA,IACjE,IAAA,EAAM,WAAA,CAAY,QAAA,CAAS,IAAA,CAAA,iBAAA,uBAAmC,CAAE;AAAA,GAClE;AAEF,EAAA,MAAM,kBAAkB,cAAA,CAAe,0BAAA,CAA2B,WAAA,EAAa,0BAAA,CAA2B,OAAO,YAAY,CAAA;AAE7H,EAAA,MAAM,EAAE,UAAA,EAAY,iBAAA,EAAkB,GAAI,YAAA,EAAa;AAEvD,EAAA,MAAM,EAAE,wBAAA,EAA0B,kBAAA,EAAAkG,mBAAAA,EAAoB,UAAA,KAAe,iBAAA,EAAkB;AAEvF,EAAA,MAAM,kBAAkB,wBAAA,CAAA,iBAAA,uBAA8D;AAEtF,EAAA,MAAM,gBAAA,GAAmB9D,WAAAA,CAAY,OAAO,KAAA,KAAoC;AAC9E,IAAA,MAAM,iBAAA,CAAkB;AAAA,MACtB,iBAAiB,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,KAAA,CAAM,CAAC,CAAA,GAAI;AAAA,KACpD,CAAA;AAED,IAAA8D,mBAAAA,CAAmB,UAAA,CAAW,iBAAiB,CAAC,CAAA;AAAA,EAClD,CAAA,EAAG,CAAC,iBAAA,EAAmB,UAAA,EAAYA,mBAAkB,CAAC,CAAA;AAEtD,EAAA,uBACElG,GAAAA,CAAAC,QAAAA,EAAA,EACE,QAAA,EAAA,0BAAA,CAA2B,8DACzBD,GAAAA;AAAA,IAAC,mBAAA;AAAA,IAAA;AAAA,MACD,UAAA;AAAA,MACA,KAAA,EAAQ,EAAE,oCAAoC,CAAA;AAAA,MAC9C,WAAA,EAAc,eAAA;AAAA,MACd,YAAA,EAAe,MAAA;AAAA,MACf,OAAQ,eAAA,IAAmB,MAAA;AAAA,MAC3B,QAAA,EAAW,OAAM,KAAA,KAAU,MAAM,iBAAiB,KAAK,CAAA;AAAA,MACvD,SAAU,UAAA,CAAA,iBAAA,uBAAgD,GAAI,YAAY,MAAM,gBAAA,CAAiB,IAAI,CAAA,GAAI,MAAA;AAAA,MACzG,OAAQ,0BAAA,CAA2B,KAAA;AAAA,MACnC,MAAO,0BAAA,CAA2B,IAAA;AAAA,MAClC,QAAA,EAAU;AAAA,QACR,cAAA,EAAgB,EAAE,yBAAyB,CAAA;AAAA,QAC3C,cAAA,EAAgB,EAAE,yBAAyB;AAAA,OAC7C;AAAA,MACA,aAAA,EAAe;AAAA,QACb,WAAA,EAAa,YAAA;AAAA,QACb,qBAAA,EAAuB,CAAA;AAAA,QACvB,qBAAA,EAAuB;AAAA,OACzB;AAAA,MACA,eAAA,EAAkB,IAAA;AAAA,MAClB,yBAAA,EAA4B;AAAA;AAAA,sBAE5BA,GAAAA;AAAA,IAAC,cAAA;AAAA,IAAA;AAAA,MACD,UAAA;AAAA,MACA,cAAe,0BAAA,CAA2B,OAAA,KAAA,mBAAA;AAAA,MAC1C,KAAA,EAAQ,EAAE,oCAAoC,CAAA;AAAA,MAC9C,WAAA,EAAc,eAAA;AAAA,MACd,YAAA,EAAe,MAAA;AAAA,MACf,OAAQ,eAAA,IAAmB,MAAA;AAAA,MAC3B,QAAA,EAAW,OAAM,KAAA,KAAU,MAAM,iBAAiB,KAAe,CAAA;AAAA,MACjE,SAAU,UAAA,CAAA,iBAAA,uBAAgD,GAAI,YAAY,MAAM,gBAAA,CAAiB,IAAI,CAAA,GAAI,MAAA;AAAA,MACzG,OAAQ,0BAAA,CAA2B,KAAA;AAAA,MACnC,MAAO,0BAAA,CAA2B,IAAA;AAAA,MAClC,aAAA,EAAe;AAAA,QACb,WAAA,EAAa,YAAA;AAAA,QACb,qBAAA,EAAuB,CAAA;AAAA,QACvB,qBAAA,EAAuB;AAAA;AACzB;AAAA,GACF,EAEF,CAAA;AAEJ;ACxEO,IAAM,wBAAA,GAA2B,CAAC,EAAE,UAAA,GAAa,MAAK,KAAiC;AAC5F,EAAA,MAAM,EAAE,WAAA,EAAY,GAAI,cAAA,EAAe;AACvC,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,OAAA,EAAQ;AAEtB,EAAA,MAAM,2BAAA,GAA8B;AAAA,IAClC,OAAA,EAAS,WAAA,CAAY,QAAA,CAAS,IAAA,CAAA,kBAAA,wBAAoC,CAAE,OAAA;AAAA,IACpE,WAAA,EAAa,WAAA,CAAY,QAAA,CAAS,IAAA,CAAA,kBAAA,wBAAoC,CAAE,WAAA;AAAA,IACxE,KAAA,EAAO,WAAA,CAAY,QAAA,CAAS,IAAA,CAAA,kBAAA,wBAAoC,CAAE,KAAA;AAAA,IAClE,IAAA,EAAM,WAAA,CAAY,QAAA,CAAS,IAAA,CAAA,kBAAA,wBAAoC,CAAE;AAAA,GACnE;AAEA,EAAA,MAAM,kBAAkB,cAAA,CAAe,2BAAA,CAA4B,WAAA,EAAa,2BAAA,CAA4B,OAAO,YAAY,CAAA;AAE/H,EAAA,MAAM,EAAE,UAAA,EAAY,iBAAA,EAAkB,GAAI,YAAA,EAAa;AAEvD,EAAA,MAAM,EAAE,wBAAA,EAA0B,mBAAA,EAAAmG,oBAAAA,EAAqB,UAAA,KAAe,iBAAA,EAAkB;AAExF,EAAA,MAAM,mBAAmB,wBAAA,CAAA,kBAAA,wBAA+D;AAExF,EAAA,MAAM,gBAAA,GAAmB/D,WAAAA,CAAY,OAAO,KAAA,KAAoC;AAC9E,IAAA,MAAM,iBAAA,CAAkB;AAAA,MACtB,kBAAkB,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,KAAA,CAAM,CAAC,CAAA,GAAI;AAAA,KACrD,CAAA;AAED,IAAA+D,oBAAAA,CAAoB,UAAA,CAAW,kBAAkB,CAAC,CAAA;AAAA,EACpD,CAAA,EAAG,CAAC,iBAAA,EAAmB,UAAA,EAAYA,oBAAmB,CAAC,CAAA;AAEvD,EAAA,uBACEnG,GAAAA,CAAAC,QAAAA,EAAA,EACE,QAAA,EAAA,2BAAA,CAA4B,8DAC1BD,GAAAA;AAAA,IAAC,mBAAA;AAAA,IAAA;AAAA,MACD,UAAA;AAAA,MACA,KAAA,EAAQ,EAAE,qCAAqC,CAAA;AAAA,MAC/C,WAAA,EAAc,eAAA;AAAA,MACd,YAAA,EAAe,MAAA;AAAA,MACf,OAAQ,gBAAA,IAAoB,MAAA;AAAA,MAC5B,QAAA,EAAW,OAAM,KAAA,KAAU,MAAM,iBAAiB,KAAK,CAAA;AAAA,MACvD,SAAU,UAAA,CAAA,kBAAA,wBAAiD,GAAI,YAAW,MAAM,gBAAA,CAAiB,IAAI,CAAA,GAAI,MAAA;AAAA,MACzG,OAAQ,2BAAA,CAA4B,KAAA;AAAA,MACpC,MAAO,2BAAA,CAA4B,IAAA;AAAA,MACnC,QAAA,EAAU;AAAA,QACR,cAAA,EAAgB,EAAE,yBAAyB,CAAA;AAAA,QAC3C,cAAA,EAAgB,EAAE,yBAAyB;AAAA,OAC7C;AAAA,MACA,aAAA,EAAe;AAAA,QACb,WAAA,EAAa,YAAA;AAAA,QACb,qBAAA,EAAuB,CAAA;AAAA,QACvB,qBAAA,EAAuB;AAAA,OACzB;AAAA,MACA,eAAA,EAAkB,IAAA;AAAA,MAClB,yBAAA,EAA4B;AAAA;AAAA,sBAE5BA,GAAAA;AAAA,IAAC,cAAA;AAAA,IAAA;AAAA,MACD,UAAA;AAAA,MACA,cAAe,2BAAA,CAA4B,OAAA,KAAA,mBAAA;AAAA,MAC3C,KAAA,EAAQ,EAAE,qCAAqC,CAAA;AAAA,MAC/C,WAAA,EAAc,eAAA;AAAA,MACd,YAAA,EAAe,MAAA;AAAA,MACf,OAAQ,gBAAA,IAAoB,MAAA;AAAA,MAC5B,QAAA,EAAW,OAAM,KAAA,KAAU,MAAM,iBAAiB,KAAe,CAAA;AAAA,MACjE,SAAU,UAAA,CAAA,kBAAA,wBAAiD,GAAI,YAAW,MAAM,gBAAA,CAAiB,IAAI,CAAA,GAAI,MAAA;AAAA,MACzG,OAAQ,2BAAA,CAA4B,KAAA;AAAA,MACpC,MAAO,2BAAA,CAA4B,IAAA;AAAA,MACnC,aAAA,EAAe;AAAA,QACb,WAAA,EAAa,YAAA;AAAA,QACb,qBAAA,EAAuB,CAAA;AAAA,QACvB,qBAAA,EAAuB;AAAA;AACzB;AAAA,GACF,EAEF,CAAA;AAEJ;ACxEO,IAAM,uBAAA,GAA0B,CAAC,EAAE,UAAA,GAAa,MAAK,KAAiC;AAC3F,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,OAAA,EAAQ;AACtB,EAAA,MAAM,eAAA,GAAkB,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,SAAS,eAAe,CAAA;AAE9E,EAAA,MAAM,EAAE,wBAAA,EAA0B,kBAAA,EAAAoG,mBAAAA,KAAuB,iBAAA,EAAkB;AAE3E,EAAA,MAAM,aAAa,wBAAA,CAAA,YAAA,kBAAyD;AAC5E,EAAA,MAAM,kBAAkB,wBAAA,CAAA,iBAAA,uBAA8D;AACtF,EAAA,MAAM,mBAAmB,wBAAA,CAAA,kBAAA,wBAA+D;AACxF,EAAA,MAAM,gBAAgB,wBAAA,CAAA,eAAA,qBAA4D;AAClF,EAAA,MAAM,cAAc,wBAAA,CAAA,aAAA,mBAA0D;AAE9E,EAAA,MAAM,oBAAoB,aAAA,EAAc;AAExC,EAAA,MAAM,EAAE,iBAAA,EAAkB,GAAI,YAAA,EAAa;AAE3C,EAAA,MAAM,gBAAA,GAAmBhE,WAAAA,CAAY,OAAO,UAAA,KAAwB;AAClE,IAAA,MAAM,SAAS,UAAA,GACf;AAAA,MACE,UAAA,EAAY,IAAA;AAAA,MACZ,eAAA,EAAiB,IAAA;AAAA,MACjB,gBAAA,EAAkB,IAAA;AAAA,MAClB,aAAA,EAAe,IAAA;AAAA,MACf,WAAA,EAAa;AAAA,KACf,GACA;AAAA,MACE,UAAA,EAAY,UAAA,KAAA,WAAA,mBACR,IAAA,GACA,iBAAA,CAAkB,UAA8C,CAAA;AAAA,MACpE,eAAA;AAAA,MACA,gBAAA;AAAA,MACA,aAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,MAAM,kBAAkB,MAAM,CAAA;AAE9B,IAAAgE,mBAAAA,CAAmB,UAAA,GAAa,IAAA,GAAO,KAAK,CAAA;AAAA,EAC9C,CAAA,EAAG,CAAC,iBAAA,EAAmBA,mBAAAA,EAAoB,UAAA,EAAY,iBAAiB,gBAAA,EAAkB,aAAA,EAAe,WAAA,EAAa,iBAAiB,CAAC,CAAA;AAExI,EAAA,uBACEpG,GAAAA,CAAAC,QAAAA,EAAA,EACA,QAAA,kBAAAD,GAAAA;AAAA,IAAC,cAAA;AAAA,IAAA;AAAA,MACC,UAAA;AAAA,MACA,KAAA,EAAQ,EAAE,0CAA0C,CAAA;AAAA,MACpD,QAAA,EAAW,OAAO,UAAA,KAAwB,MAAM,iBAAiB,UAAU,CAAA;AAAA,MAC3E,UAAA,EAAa;AAAA;AAAA,GACf,EACA,CAAA;AAEJ;ACjEA,IAAM,gBAAA,GAAmB,2BAASA,GAAAA,CAAC,SAAI,KAAA,EAAM,4BAAA,EAA6B,MAAA,EAAO,MAAA,EAAO,OAAA,EAAQ,gBAAA,EAAiB,OAAM,MAAA,EAAO,IAAA,EAAK,WAAW,GAAG,KAAA,EAAO,0BAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,iPAAA,EAAkP,CAAA,EAAE,CAAA;AACpZ,IAAO,qBAAA,GAAQ,gBAAA;ACDf,IAAM,OAAA,GAAU,2BAASA,GAAAA,CAAC,SAAI,KAAA,EAAM,4BAAA,EAA6B,MAAA,EAAO,MAAA,EAAO,OAAA,EAAQ,gBAAA,EAAiB,OAAM,MAAA,EAAO,IAAA,EAAK,WAAW,GAAG,KAAA,EAAO,0BAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,6LAAA,EAA8L,CAAA,EAAE,CAAA;AACvV,IAAO,YAAA,GAAQ,OAAA;;;ACIR,IAAM,8BAAA,GAAiC,CAAC,YAAA,KAAmD;AAChG,EAAA,MAAM,mBAAA,GAAsB;AAAA,IAAA,eAAA;AAAA,IAAA,YAAA;AAAA,IAAA,iBAAA;AAAA,IAAA,kBAAA;AAAA,IAAA,aAAA;AAAA,GAM5B;AAEA,EAAA,OAAO,oBAAoB,IAAA,CAAK,CAAA,GAAA,KAAO,YAAA,CAAa,QAAA,CAAS,GAAG,CAAC,CAAA;AACnE,CAAA;ACgBA,IAAM,OAAA,GAAU;AAAA,EACd,+BAAiC,YAAA;AAAA,EACjC,iCAAkC,qBAAA;AAAA,EAClC,yBAA8B,YAAA;AAAA,EAC9B,uBAA6B,qBAAA;AAAA,EAC7B,6BAAgC,sBAAA;AAAA,EAChC,uBAA6B;AAC/B,CAAA;AAEO,IAAM,sBAAA,GAAyB,CAAC,EAAE,UAAA,EAAW,KAAiC;AACnF,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,OAAA,EAAQ;AACtB,EAAA,MAAM,EAAE,uBAAA,EAAyB,oBAAA,EAAsB,uBAAA,EAAyB,2BAAA,KAAgC,iBAAA,EAAkB;AAElI,EAAA,MAAM,OAAA,GAAU,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,OAAO,OAAO,CAAA;AAC5D,EAAA,MAAM,WAAW,OAAA,KAAY,QAAA;AAC7B,EAAA,MAAM,OAAA,GAAU,eAAe,CAAA,KAAA,KAAS,QAAA,GAAW,MAAM,cAAA,CAAe,OAAA,GAAU,KAAA,CAAM,QAAA,CAAS,OAAO,CAAA;AACxG,EAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,YAAY,KAAK,CAAA;AAE7D,EAAA,MAAM,WAAW,cAAA,EAAe;AAEhC,EAAA,MAAM,EAAE,iBAAA,EAAkB,GAAI,YAAA,EAAa;AAE3C,EAAA,MAAM,oBAAoB,aAAA,EAAc;AAExC,EAAA,MAAM,EAAE,eAAA,EAAgB,GAAI,iBAAA,EAAkB;AAE9C,EAAA,MAAM,gBAAA,GAAmBoC,WAAAA,CAAY,OAAO,KAAA,KAAkB;AAC5D,IAAA,MAAM,UAAA,GAAa,KAAA;AAGnB,IAAA,MAAM,YAAA,GAAe,gBAAgB,UAAU,CAAA;AAG/C,IAAA,MAAM,WAAA,GAAc;AAAA,MAClB,CAAA,eAAA,uBAAuC,YAAA,GAAA,eAAA,qBAAkD,IAAK,IAAA;AAAA,MAC9F,CAAA,YAAA,oBAAoC,YAAA,GAAA,YAAA,kBAA+C,IAAK,IAAA;AAAA,MACxF,CAAA,iBAAA,yBAAyC,YAAA,GAAA,iBAAA,uBAAoD,IAAK,IAAA;AAAA,MAClG,CAAA,kBAAA,0BAA0C,YAAA,GAAA,kBAAA,wBAAqD,IAAK,IAAA;AAAA,MACpG,CAAA,aAAA,qBAAqC,YAAA,GAAA,aAAA,mBAAgD,IAAK;AAAA,KAC5F;AAGA,IAAA,MAAM,kBAAkB,WAAA,CAAA,YAAA,kBAA4C;AACpE,IAAA,MAAM,qBAAA,GAAwB,eAAA,IAAmB,eAAA,KAAA,WAAA,mBAC7C,iBAAA,CAAkB,eAAsC,CAAA,GACxD,IAAA;AAEJ,IAAA,MAAM,mBAAA,GAAsB;AAAA,MAC1B,CAAA,eAAA,uBAAuC,WAAA,CAAA,eAAA,qBAA+C;AAAA,MACtF,iCAAoC,qBAAA;AAAA,MACpC,CAAA,iBAAA,yBAAyC,WAAA,CAAA,iBAAA,uBAAiD;AAAA,MAC1F,CAAA,kBAAA,0BAA0C,WAAA,CAAA,kBAAA,wBAAkD;AAAA,MAC5F,CAAA,aAAA,qBAAqC,WAAA,CAAA,aAAA;AAA6C,KACpF;AAEA,IAAA,MAAM,kBAAkB,mBAAmB,CAAA;AAE3C,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,QAAA,CAAS,sBAAA,CAAuB;AAAA,QAC9B,MAAA,EAAQ,UAAA;AAAA,QACR,MAAA,EAAQ;AAAA,OACT,CAAC,CAAA;AAAA,IACJ,CAAA,MAAO;AACL,MAAA,QAAA,CAAS,gBAAA,CAAiB;AAAA,QACxB,MAAA,EAAQ,UAAA;AAAA,QACR,MAAA,EAAQ;AAAA,OACT,CAAC,CAAA;AAAA,IACJ;AAAA,EACF,GAAG,CAAC,QAAA,EAAU,UAAU,iBAAA,EAAmB,eAAA,EAAiB,iBAAiB,CAAC,CAAA;AAG9E,EAAA,MAAM,WAAA,GAAc4C,QAAQ,MAAM;AAChC,IAAA,MAAM,QAAA,GAAW,QAAA,GACb,uBAAA,GACA,KAAA,GACE,oBAAA,GACA,uBAAA;AACN,IAAA,MAAM,YAAA,GAAe,+BAA+B,EAAC;AAErD,IAAA,MAAM,uBAAA,GAA0B,+BAA+B,YAAY,CAAA;AAE3E,IAAA,IAAI,uBAAA,EAAyB;AAC3B,MAAA,OAAO,QAAA;AAAA,IACT,CAAA,MAAO;AAEL,MAAA,OAAO,QAAA,CAAS,MAAA,CAAO,CAAA,GAAA,KAAO,GAAA,KAAA,QAAA,cAAkC;AAAA,IAClE;AAAA,EACF,CAAA,EAAG,CAAC,QAAA,EAAU,KAAA,EAAO,sBAAsB,uBAAA,EAAyB,uBAAA,EAAyB,2BAA2B,CAAC,CAAA;AAGzH,EAAA,MAAM,KAAA,GAAQA,QAAQ,MAAM;AAC1B,IAAA,OAAO,WAAA,CAAY,GAAA,CAAI,CAAC,GAAA,MAA8B;AAAA,MACpD,EAAA,EAAI,GAAA;AAAA,MACJ,IAAA,EAAM,QAAQ,GAAG,CAAA;AAAA,MACjB,KAAA,EAAO,GAAA;AAAA,MACP,OAAO,CAAA,CAAE,CAAA,mCAAA,EAAuC,GAAA,KAAA,WAAA,mBAAwC,SAAA,GAAY,GAAI,CAAA,CAAE;AAAA,KAC5G,CAAE,CAAA;AAAA,EACJ,CAAA,EAAG,CAAC,WAAA,EAAa,CAAC,CAAC,CAAA;AAGnB,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,uBACEhF,GAAAA,CAAAC,QAAAA,EAAA,EACA,QAAA,kBAAAD,GAAAA;AAAA,IAAC,kBAAA;AAAA,IAAA;AAAA,MACC,UAAA;AAAA,MACA,KAAA,EAAQ,EAAE,0CAA0C,CAAA;AAAA,MACpD,WAAA,EAAY,YAAA;AAAA,MACZ,OAAQ,OAAA,EAAS,MAAA,IAAA,WAAA;AAAA,MACjB,QAAA,EAAW,OAAO,GAAA,KAAgB,MAAM,iBAAiB,GAA0B,CAAA;AAAA,MACnF;AAAA;AAAA,GACF,EACA,CAAA;AAEJ;ACnJA,IAAM,kBAAA,GAAqB,2BAASA,GAAAA,CAAC,SAAI,KAAA,EAAM,4BAAA,EAA6B,MAAA,EAAO,MAAA,EAAO,OAAA,EAAQ,gBAAA,EAAiB,OAAM,MAAA,EAAO,IAAA,EAAK,WAAW,GAAG,KAAA,EAAO,0BAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,kHAAA,EAAmH,CAAA,EAAE,CAAA;AACvR,IAAO,yBAAA,GAAQ,kBAAA;ACDf,IAAM,mBAAA,GAAsB,2BAASA,GAAAA,CAAC,SAAI,KAAA,EAAM,4BAAA,EAA6B,MAAA,EAAO,MAAA,EAAO,OAAA,EAAQ,gBAAA,EAAiB,OAAM,MAAA,EAAO,IAAA,EAAK,WAAW,GAAG,KAAA,EAAO,0BAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,0HAAA,EAA2H,CAAA,EAAE,CAAA;AAChS,IAAO,0BAAA,GAAQ,mBAAA;ACDf,IAAM,qBAAA,GAAwB,2BAASA,GAAAA,CAAC,SAAI,KAAA,EAAM,4BAAA,EAA6B,MAAA,EAAO,MAAA,EAAO,OAAA,EAAQ,gBAAA,EAAiB,OAAM,MAAA,EAAO,IAAA,EAAK,WAAW,GAAG,KAAA,EAAO,0BAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,kHAAA,EAAmH,CAAA,EAAE,CAAA;AAC1R,IAAO,4BAAA,GAAQ,qBAAA;ACoBR,IAAM,iBAAA,GAAoB,CAAC,EAAE,UAAA,GAAa,MAAK,KAAiC;AACrF,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,OAAA,EAAQ;AAEtB,EAAA,MAAM,OAAA,GAAU,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,OAAO,OAAO,CAAA;AAC5D,EAAA,MAAM,WAAW,OAAA,KAAY,QAAA;AAE7B,EAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,YAAY,KAAK,CAAA;AAC7D,EAAA,MAAM,SAAA,GAAY,eAAe,CAAA,KAAA,KAAS,QAAA,GAAW,MAAM,cAAA,CAAe,SAAA,GAAY,KAAA,CAAM,QAAA,CAAS,SAAS,CAAA,IAAA,WAAA;AAC9G,EAAA,MAAM,WAAW,cAAA,EAAe;AAEhC,EAAA,MAAM,EAAE,UAAA,EAAY,iBAAA,EAAkB,GAAI,YAAA,EAAa;AAEvD,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ;AAAA,MACE,EAAA,EAAA,WAAA;AAAA,MACA,IAAA,EAAM,YAAA;AAAA,MACN,KAAA,EAAO,EAAE,sCAAsC,CAAA;AAAA,MAC/C,KAAA,EAAA,WAAA;AAAA,KACF;AAAA,IACA;AAAA,MACE,EAAA,EAAA,OAAA;AAAA,MACA,IAAA,EAAM,QAAQ,0BAAA,GAAiB,yBAAA;AAAA,MAC/B,OAAO,KAAA,GAAQ,CAAA,CAAE,oCAAoC,CAAA,GAAI,EAAE,mCAAmC,CAAA;AAAA,MAC9F,KAAA,EAAA,OAAA;AAAA,KACF;AAAA,IACA;AAAA,MACE,EAAA,EAAA,SAAA;AAAA,MACA,IAAA,EAAM,4BAAA;AAAA,MACN,KAAA,EAAO,EAAE,sCAAsC,CAAA;AAAA,MAC/C,KAAA,EAAA,SAAA;AAAA;AACF,GACF;AAEA,EAAA,MAAM,gBAAA,GAAmBoC,WAAAA,CAAY,OAAO,KAAA,KAAkB;AAC5D,IAAA,MAAMiE,aAAkC,KAAA,KAAA,WAAA,mBACpC,IAAA,GACA,KAAA,KAAA,OAAA,eACE,aAAA,CAAc,QACd,aAAA,CAAc,OAAA;AAEpB,IAAA,MAAM,cAAA,GAAiB,WAAW,SAAS,CAAA;AAE3C,IAAA,MAAM,UAAUA,UAAAA,KAAc,IAAA,GAC1B,IAAA,GACC,cAAA,IAAkBA,eAAc,aAAA,CAAc,OAAA;AAEjD,IAAA,MAAM,iBAAA,CAAkB;AAAA,MACtB,SAAA,EAAWA,UAAAA;AAAA,MACX;AAAA,KACD,CAAA;AAED,IAAA,MAAM,gBAAA,GAAmB,WAAW,WAAW,CAAA;AAC/C,IAAA,MAAM,cAAA,GAAiB,qBAAqB,IAAA,GAAA,WAAA,mBAAsC,gBAAA;AAClF,IAAA,MAAM,gBAAA,GAAmB,WAAW,SAAS,CAAA;AAE7C,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,QAAA,CAAS,kBAAA,CAAmB,cAAc,CAAC,CAAA;AAC3C,MAAA,QAAA,CAAS,gBAAA,CAAiB,gBAAgB,CAAC,CAAA;AAAA,IAC7C,CAAA,MAAO;AACL,MAAA,QAAA,CAAS,YAAA,CAAa,cAAc,CAAC,CAAA;AACrC,MAAA,QAAA,CAAS,UAAA,CAAW,gBAAgB,CAAC,CAAA;AAAA,IACvC;AAAA,EACJ,GAAG,CAAC,QAAA,EAAU,UAAA,EAAY,iBAAA,EAAmB,QAAQ,CAAC,CAAA;AAEtD,EAAA,uBACErG,GAAAA,CAAAC,QAAAA,EAAA,EACA,QAAA,kBAAAD,GAAAA;AAAA,IAAC,kBAAA;AAAA,IAAA;AAAA,MACC,UAAA;AAAA,MACA,KAAA,EAAQ,EAAE,oCAAoC,CAAA;AAAA,MAC9C,WAAA,EAAY,YAAA;AAAA,MACZ,KAAA,EAAQ,SAAA;AAAA,MACR,QAAA,EAAW,OAAO,GAAA,KAAgB,MAAM,iBAAiB,GAAG,CAAA;AAAA,MAC5D;AAAA;AAAA,GACF,EACA,CAAA;AAEJ;AClFO,IAAM,qBAAA,GAAwB,CAAC,EAAE,UAAA,GAAa,MAAK,KAAiC;AACzF,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,OAAA,EAAQ;AAEtB,EAAA,MAAM,OAAA,GAAU,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,OAAO,OAAO,CAAA;AAC5D,EAAA,MAAM,WAAW,OAAA,KAAY,QAAA;AAE7B,EAAA,MAAM,iBAAA,GAAoB,cAAA,CAAe,CAAA,KAAA,KAAS,QAAA,GAAW,KAAA,CAAM,eAAe,iBAAA,GAAoB,KAAA,CAAM,QAAA,CAAS,iBAAiB,CAAA,IAAK,KAAA;AAC3I,EAAA,MAAM,WAAW,cAAA,EAAe;AAEhC,EAAA,MAAM,EAAE,UAAA,EAAY,iBAAA,EAAkB,GAAI,YAAA,EAAa;AAEvD,EAAA,MAAM,gBAAA,GAAmBoC,WAAAA,CAAY,OAAO,KAAA,KAAmB;AAC7D,IAAA,MAAM,iBAAA,CAAkB,EAAE,iBAAA,EAAmB,KAAA,EAAO,CAAA;AACpD,IAAA,MAAM,gBAAA,GAAmB,WAAW,mBAAmB,CAAA;AAEvD,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,QAAA,CAAS,0BAAA,CAA2B,gBAAgB,CAAC,CAAA;AAAA,IACvD,CAAA,MAAO;AACL,MAAA,QAAA,CAAS,oBAAA,CAAqB,gBAAgB,CAAC,CAAA;AAAA,IACjD;AAAA,EACF,GAAG,CAAC,QAAA,EAAU,iBAAA,EAAmB,UAAA,EAAY,QAAQ,CAAC,CAAA;AAEtD,EAAA,uBACEpC,GAAAA,CAAAC,QAAAA,EAAA,EACA,QAAA,kBAAAD,GAAAA;AAAA,IAAC,cAAA;AAAA,IAAA;AAAA,MACC,UAAA;AAAA,MACA,OAAA,EAAU,EAAE,4CAA4C,CAAA;AAAA,MACxD,KAAA,EAAQ,EAAE,4CAA4C,CAAA;AAAA,MACtD,QAAA,EAAW,OAAO,UAAA,KAAwB,MAAM,iBAAiB,UAAU,CAAA;AAAA,MAC3E,YAAa,iBAAA,IAAqB;AAAA;AAAA,GACpC,EACA,CAAA;AAEJ;AChDA,IAAM,QAAA,GAAW,2BAASA,GAAAA,CAAC,SAAI,KAAA,EAAM,4BAAA,EAA6B,MAAA,EAAO,MAAA,EAAO,OAAA,EAAQ,gBAAA,EAAiB,OAAM,MAAA,EAAO,IAAA,EAAK,WAAW,GAAG,KAAA,EAAO,0BAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,uDAAA,EAAwD,CAAA,EAAE,CAAA;AAClN,IAAO,aAAA,GAAQ,QAAA;ACyBR,IAAM,gBAAgB,MAAM;AACjC,EAAA,MAAM,EAAE,YAAA,EAAc,eAAA,EAAgB,GAAI,iBAAA,EAAkB;AAC5D,EAAA,MAAM,EAAE,WAAA,EAAY,GAAI,cAAA,EAAe;AACvC,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,OAAA,EAAQ;AAEtB,EAAA,MAAM,aAAA,GAAgBa,OAA8B,IAAI,CAAA;AACxD,EAAA,MAAM,oBAAA,GAAuBA,OAA8B,IAAI,CAAA;AAE/D,EAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,YAAY,KAAK,CAAA;AAC7D,EAAA,MAAM,SAAA,GAAY,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,OAAO,SAAS,CAAA;AAChE,EAAA,MAAM,KAAA,GAAQ,SAAA,KAAA,KAAA;AACd,EAAA,MAAM,UAAA,GAAa,QAAQ,YAAA,GAAe,eAAA;AAE1C,EAAA,MAAM,WAAA,GAAc,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,QAAQ,KAAK,CAAA;AAC/D,EAAA,MAAM,KAAA,GAAQ,KAAA,GAAQ,WAAA,CAAY,GAAA,GAAM,WAAA,CAAY,MAAA;AACpD,EAAA,MAAM,WAAA,GAAc,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,QAAQ,WAAW,CAAA;AAErE,EAAA,MAAM,UAAA,GAAaA,MAAAA;AAAA,IACjB,UAAA,CAAW,MAAA,CAAO,CAACyF,MAAAA,KAAiC;AAClD,MAAA,IAAIA,WAAU,MAAA,EAAQ;AACpB,QAAA,OAAO,WAAA,CAAY,OAAA,CAAQ,MAAA,CAAO,YAAA,KAAiB,MAAA,IACjD,MAAA,CAAO,MAAA,CAAO,WAAA,CAAY,OAAA,CAAQ,MAAA,CAAO,YAAY,CAAA,CAAE,KAAA;AAAA,UAAM,CAAAC,EAAAA,KAC3D,UAAA,CAAW,QAAA,CAASA,EAAC;AAAA,SACvB;AAAA,MACJ;AACA,MAAA,OAAO,IAAA;AAAA,IACT,CAAC;AAAA,GACH;AAEA,EAAA,MAAM,WAAW,cAAA,EAAe;AAMhC,EAAA,MAAM,EAAE,SAAA,EAAU,GAAI,iBAAA,CAAkB;AAAA,IACtC,YAAA,EAAc,oBAAA;AAAA,IACd,KAAA,EAAO,UAAA;AAAA,IACP,YAAA,EAAc,KAAA;AAAA,IACd,QAAA,EAAU,OAAO,GAAA,KAAQ,MAAM,iBAAiB,GAAmB,CAAA;AAAA,IACnE,KAAA;AAAA,IACA,QAAA,EAAU,MAAM,QAAA,CAAS,aAAA,CAAc;AAAA,MACrC,GAAA,EAAA,UAAA;AAAA,MACA,MAAA,EAAQ;AAAA,KACT,CAAC,CAAA;AAAA,IACF,OAAA,EAAS,CAAC,EAAA,KAAO;AACf,MAAA,MAAM,UAAU,oBAAA,CAAqB,OAAA,EAAS,aAAA,CAAc,CAAA,KAAA,EAAS,EAAG,CAAA,EAAA,CAAI,CAAA;AAC9E,MAAA,IAAI,OAAA,EAAU,OAAA,CAAwB,KAAA,EAAM;AAAA,IAC5C;AAAA,GACD,CAAA;AAED,EAAA,MAAM,EAAE,iBAAA,EAAkB,GAAI,gBAAA,EAAiB;AAE/C,EAAA,MAAM,gBAAA,GAAmBnE,WAAAA,CAAY,OAAO,KAAA,KAAiC;AAC3E,IAAA,MAAM,aAAa,gBAAA,CAA+B;AAAA,MAChD,KAAA,EAAO,KAAA;AAAA,MACP,SAAA,EAAW,WAAA,CAAY,OAAA,CAAQ,MAAA,CAAO,IAAA;AAAA,MACtC,YAAA,EAAc,WAAA,CAAY,OAAA,CAAQ,MAAA,CAAO,YAAA;AAAA,MACzC;AAAA,KACD,CAAA;AACD,IAAA,MAAM,kBAAkB,UAAU,CAAA;AAElC,IAAA,QAAA,CAAS,QAAA,CAAS;AAAA,MAChB,GAAA,EAAK,QAAQ,KAAA,GAAQ,QAAA;AAAA,MACrB;AAAA,KACD,CAAC,CAAA;AAAA,EACJ,CAAA,EAAG,CAAC,KAAA,EAAO,WAAA,CAAY,QAAQ,MAAA,CAAO,IAAA,EAAM,WAAA,CAAY,OAAA,CAAQ,MAAA,CAAO,YAAA,EAAc,iBAAA,EAAmB,QAAA,EAAU,WAAW,CAAC,CAAA;AAI9H,EAAA,MAAM,QAAA,GAAWA,WAAAA,CAAY,CAACmE,EAAAA,KAA6B;AAGzD,IAAA,IAAI,QAAA,GAAgB;AAAA,MAClB,SAAA,EAAW,YAAA;AAAA,MACX,KAAA,EAAO;AAAA,KACT;AAEA,IAAA,IAAIA,OAAM,MAAA,EAAQ;AAChB,MAAA,IAAI,WAAA,CAAY,OAAA,CAAQ,MAAA,CAAO,YAAA,KAAiB,MAAA,EAAW;AACzD,QAAA,QAAA,CAAS,UAAA,GAAa,QACpB,CAAA,wBAAA,EAA4B,WAAA,CAAY,QAAQ,MAAA,CAAO,IAAA,CAAK,WAAA,CAAY,OAAA,CAAQ,MAAA,CAAO,YAAA,CAAa,IAAI,CAAA,CAAE,UAAW,CAAA,MAAA,EAAU,WAAA,CAAY,OAAA,CAAQ,MAAA,CAAO,KAAK,WAAA,CAAY,OAAA,CAAQ,MAAA,CAAO,YAAA,CAAa,KAAK,CAAA,CAAE,UAAW,CAAA,MAAA,CAAA,GACzN,CAAA,wBAAA,EAA4B,YAAY,OAAA,CAAQ,MAAA,CAAO,KAAK,WAAA,CAAY,OAAA,CAAQ,MAAA,CAAO,YAAA,CAAa,KAAK,CAAA,CAAE,UAAW,CAAA,KAAA,EAAS,WAAA,CAAY,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,WAAA,CAAY,QAAQ,MAAA,CAAO,YAAA,CAAa,IAAI,CAAA,CAAE,UAAW,CAAA,KAAA,CAAA;AAC1N,QAAA,QAAA,CAAS,KAAA,GAAQ,SAAA;AACjB,QAAA,QAAA,CAAS,MAAA,GAAS,CAAA,UAAA,EAAc,WAAA,CAAY,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,WAAA,CAAY,OAAA,CAAQ,MAAA,CAAO,YAAA,CAAa,KAAK,CAAA,CAAE,MAAO,CAAA,CAAA;AAAA,MACxH,CAAA,MAAO;AACL,QAAA,QAAA,CAAS,OAAA,GAAU,MAAA;AAAA,MACrB;AAAA,IACF,CAAA,MAAO;AACL,MAAA,MAAM,QAAA,GAAWA,EAAAA;AACjB,MAAA,MAAMD,MAAAA,GAAQ,WAAA,CAAY,OAAA,CAAQ,MAAA,CAAO,KAAK,QAAQ,CAAA;AACtD,MAAA,QAAA,CAAS,aAAaA,MAAAA,CAAM,UAAA;AAC5B,MAAA,QAAA,CAAS,QAAQA,MAAAA,CAAM,IAAA;AACvB,MAAA,QAAA,CAAS,MAAA,GAAS,CAAA,UAAA,EAAaA,MAAAA,CAAM,MAAM,CAAA,CAAA;AAAA,IAC7C;AAEA,IAAA,OAAO,QAAA;AAAA,EACT,CAAA,EAAG,CAAC,WAAA,EAAa,KAAK,CAAC,CAAA;AAGvB,EAAAhE,UAAU,MAAM;AACd,IAAA,IAAI,UAAU,MAAA,IAAU,CAAC,WAAW,OAAA,CAAQ,QAAA,CAAS,KAAK,CAAA,EAAG;AAC3D,MAAA,gBAAA,CAAiB,UAAA,CAAW,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,IACxC;AAAA,EACF,CAAA,EAAG,CAAC,KAAA,EAAO,gBAAgB,CAAC,CAAA;AAE5B,EAAA,uBACEtC,GAAAA,CAAAC,QAAAA,EAAA,EACA,QAAA,kBAAAD,GAAAA;AAAA,IAAC,kBAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAM,aAAA;AAAA,MACN,UAAA,EAAa,IAAA;AAAA,MACb,KAAA,EAAQ,EAAE,iCAAiC,CAAA;AAAA,MAC3C,KAAA,EAAQ,KAAA;AAAA,MACR,QAAA,EAAW,OAAO,GAAA,KAAQ,MAAM,iBAAiB,GAAmB,CAAA;AAAA,MACpE,sBAAA,EAAyB,KAAA;AAAA,MAEzB,QAAA,kBAAAA,GAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,GAAA,EAAM,oBAAA;AAAA,UACN,SAAA,EAAYY,WAAAA,CAAW,mCAAA,CAAe,YAAA,EAAc,oCAAe,aAAa,CAAA;AAAA,UAE9E,qBAAW,OAAA,CAAQ,GAAA;AAAA,YAAI,CAAE,8BACzBZ,GAAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAYY,WAAAA;AAAA,kBACV,mCAAA,CAAe,KAAA;AAAA,kBACf,mCAAA,CAAe;AAAA,iBACjB;AAAA,gBACA,KAAA,EAAQ,SAAA;AAAA,gBACR,EAAA,EAAK,SAAA;AAAA,gBAEL,KAAA,EAAQ,SAAS,SAAS,CAAA;AAAA,gBAC1B,SAAA;AAAA,gBAEF,QAAA,kBAAAyB,KAAC,MAAA,EAAA,EACG,QAAA,EAAA;AAAA,kBAAA,CAAA,CAAE,6BAA8B,SAAU,CAAA,CAAA,EAAI,EAAE,YAAA,EAAc,WAAW,CAAA;AAAA,kBACzE,SAAA,KAAc,yBAASrC,GAAAA,CAAC,iBAAU,aAAA,EAAY,MAAA,EAAO,WAAU,OAAA,EAAQ;AAAA,iBAAA,EAC3E;AAAA,eAAA;AAAA,cAPQ;AAAA;AAQV;AACA;AAAA;AACF;AAAA,GACF,EACA,CAAA;AAEJ;ACxJO,IAAM,mBAAA,GAAsB,CAAC,EAAE,UAAA,GAAa,MAAK,KAAiC;AACvF,EAAA,MAAM,EAAE,WAAA,EAAY,GAAI,cAAA,EAAe;AACvC,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,OAAA,EAAQ;AAEtB,EAAA,MAAM,sBAAA,GAAyB;AAAA,IAC7B,OAAA,EAAS,WAAA,CAAY,QAAA,CAAS,IAAA,CAAA,aAAA,mBAA+B,CAAE,OAAA;AAAA,IAC/D,WAAA,EAAa,WAAA,CAAY,QAAA,CAAS,IAAA,CAAA,aAAA,mBAA+B,CAAE,WAAA;AAAA,IACnE,KAAA,EAAO,WAAA,CAAY,QAAA,CAAS,IAAA,CAAA,aAAA,mBAA+B,CAAE,KAAA;AAAA,IAC7D,IAAA,EAAM,WAAA,CAAY,QAAA,CAAS,IAAA,CAAA,aAAA,mBAA+B,CAAE;AAAA,GAC9D;AAEA,EAAA,MAAM,kBAAkB,cAAA,CAAe,sBAAA,CAAuB,WAAA,EAAa,sBAAA,CAAuB,OAAO,SAAS,CAAA;AAElH,EAAA,MAAM,EAAE,UAAA,EAAY,iBAAA,EAAkB,GAAI,YAAA,EAAa;AAEvD,EAAA,MAAM,EAAE,wBAAA,EAA0B,cAAA,EAAAwG,eAAAA,EAAgB,UAAA,KAAe,iBAAA,EAAkB;AAEnF,EAAA,MAAM,cAAc,wBAAA,CAAA,aAAA,mBAA0D;AAE9E,EAAA,MAAM,gBAAA,GAAmBpE,WAAAA,CAAY,OAAO,KAAA,KAAoC;AAC9E,IAAA,MAAM,iBAAA,CAAkB;AAAA,MACtB,aAAa,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,KAAA,CAAM,CAAC,CAAA,GAAI;AAAA,KAChD,CAAA;AAED,IAAAoE,eAAAA,CAAe,UAAA,CAAW,aAAa,CAAC,CAAA;AAAA,EAC1C,CAAA,EAAG,CAAC,iBAAA,EAAmB,UAAA,EAAYA,eAAc,CAAC,CAAA;AAElD,EAAA,uBACExG,GAAAA,CAAAC,QAAAA,EAAA,EACE,QAAA,EAAA,sBAAA,CAAuB,8DACrBD,GAAAA;AAAA,IAAC,mBAAA;AAAA,IAAA;AAAA,MACD,UAAA;AAAA,MACA,KAAA,EAAQ,EAAE,gCAAgC,CAAA;AAAA,MAC1C,WAAA,EAAc,eAAA;AAAA,MACd,YAAA,EAAe,MAAA;AAAA,MACf,OAAQ,WAAA,IAAe,MAAA;AAAA,MACvB,QAAA,EAAW,OAAM,KAAA,KAAU,MAAM,iBAAiB,KAAK,CAAA;AAAA,MACvD,SAAU,UAAA,CAAA,aAAA,mBAA4C,GAAI,YAAW,MAAM,gBAAA,CAAiB,IAAI,CAAA,GAAI,MAAA;AAAA,MACpG,OAAQ,sBAAA,CAAuB,KAAA;AAAA,MAC/B,MAAO,sBAAA,CAAuB,IAAA;AAAA,MAC9B,QAAA,EAAU;AAAA,QACR,cAAA,EAAgB,EAAE,yBAAyB,CAAA;AAAA,QAC3C,cAAA,EAAgB,EAAE,yBAAyB;AAAA,OAC7C;AAAA,MACA,aAAA,EAAe,EAAE,KAAA,EAAO,SAAA,EAAU;AAAA,MAClC,eAAA,EAAkB,IAAA;AAAA,MAClB,yBAAA,EAA4B;AAAA;AAAA,sBAE5BA,GAAAA;AAAA,IAAC,cAAA;AAAA,IAAA;AAAA,MACD,UAAA;AAAA,MACA,cAAe,sBAAA,CAAuB,OAAA,KAAA,mBAAA;AAAA,MACtC,KAAA,EAAQ,EAAE,gCAAgC,CAAA;AAAA,MAC1C,WAAA,EAAc,eAAA;AAAA,MACd,YAAA,EAAe,MAAA;AAAA,MACf,OAAQ,WAAA,IAAe,MAAA;AAAA,MACvB,QAAA,EAAW,OAAM,KAAA,KAAU,MAAM,iBAAiB,KAAe,CAAA;AAAA,MACjE,SAAU,UAAA,CAAA,aAAA,mBAA4C,GAAI,YAAW,MAAM,gBAAA,CAAiB,IAAI,CAAA,GAAI,MAAA;AAAA,MACpG,OAAQ,sBAAA,CAAuB,KAAA;AAAA,MAC/B,MAAO,sBAAA,CAAuB,IAAA;AAAA,MAC9B,aAAA,EAAe,EAAE,KAAA,EAAO,SAAA;AAAU;AAAA,GACpC,EAEF,CAAA;AAEJ;AChFA,IAAM,eAAA,GAAkB,2BAASA,GAAAA,CAAC,SAAI,KAAA,EAAM,4BAAA,EAA6B,MAAA,EAAO,MAAA,EAAO,OAAA,EAAQ,gBAAA,EAAiB,OAAM,MAAA,EAAO,IAAA,EAAK,WAAW,GAAG,KAAA,EAAO,0BAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,gHAAA,EAAiH,CAAA,EAAE,CAAA;AAClR,IAAO,qBAAA,GAAQ,eAAA;ACDf,IAAM,eAAA,GAAkB,2BAASA,GAAAA,CAAC,SAAI,KAAA,EAAM,4BAAA,EAA6B,MAAA,EAAO,MAAA,EAAO,OAAA,EAAQ,gBAAA,EAAiB,OAAM,MAAA,EAAO,IAAA,EAAK,WAAW,GAAG,KAAA,EAAO,0BAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,kJAAA,EAAmJ,CAAA,EAAE,CAAA;AACpT,IAAO,qBAAA,GAAQ,eAAA;ACDf,IAAM,UAAA,GAAa,2BAASA,GAAAA,CAAC,SAAI,KAAA,EAAM,4BAAA,EAA6B,MAAA,EAAO,MAAA,EAAO,OAAA,EAAQ,gBAAA,EAAiB,OAAM,MAAA,EAAO,IAAA,EAAK,WAAW,GAAG,KAAA,EAAO,0BAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,qRAAA,EAAsR,CAAA,EAAE,CAAA;AAClb,IAAO,gBAAA,GAAQ,UAAA;ACDf,IAAM,SAAA,GAAY,2BAASA,GAAAA,CAAC,SAAI,KAAA,EAAM,4BAAA,EAA6B,MAAA,EAAO,MAAA,EAAO,OAAA,EAAQ,gBAAA,EAAiB,OAAM,MAAA,EAAO,IAAA,EAAK,WAAW,GAAG,KAAA,EAAO,0BAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,+SAAA,EAAgT,CAAA,EAAE,CAAA;AAC3c,IAAO,eAAA,GAAQ,SAAA;ACqBR,IAAM,eAAe,MAAM;AAChC,EAAA,MAAM,EAAE,WAAA,EAAY,GAAI,cAAA,EAAe;AACvC,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,OAAA,EAAQ;AAEtB,EAAA,MAAM,gBAAgB,cAAA,CAAe,CAAC,KAAA,KAAU,KAAA,CAAM,OAAO,OAAO,CAAA;AACpE,EAAA,MAAM,QAAQ,cAAA,CAAe,CAAC,KAAA,KAAU,KAAA,CAAM,YAAY,KAAK,CAAA;AAC/D,EAAA,MAAM,WAAW,cAAA,CAAe,CAAC,UAAU,KAAA,CAAM,QAAA,CAAS,QAAQ,CAAA,IAAK,CAAA;AACvE,EAAA,MAAM,aAAa,cAAA,CAAe,CAAC,UAAU,KAAA,CAAM,cAAA,CAAe,IAAI,CAAA,IAAK,CAAA;AAC3E,EAAA,MAAM,YAAA,GAAe,aAAA,KAAkB,QAAA,GAAW,UAAA,GAAa,QAAA;AAE/D,EAAA,MAAM,WAAW,cAAA,EAAe;AAEhC,EAAA,MAAM;AAAA,IACJ,UAAA;AAAA,IACA,iBAAA;AAAA,IACA;AAAA,MACE,YAAA,EAAa;AAEjB,EAAA,MAAM,wBAAA,GAA2B,kBAAkB,QAAA,GAC/C,iBAAA,EAAmB,OACnB,KAAA,GACE,iBAAA,EAAmB,OACnB,iBAAA,EAAmB,QAAA;AAEzB,EAAA,MAAM,gBAAA,GAAmBoC,WAAAA,CAAY,OAAO,KAAA,KAA6B;AACvE,IAAA,IAAI,kBAAkB,QAAA,EAAU;AAC9B,MAAA,MAAM,iBAAA,CAAkB,EAAE,IAAA,EAAM,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,KAAA,CAAM,CAAC,CAAA,GAAI,KAAA,EAAO,CAAA;AACzE,MAAA,QAAA,CAAS,aAAA,CAAc,UAAA,CAAW,MAAM,CAAC,CAAC,CAAA;AAAA,IAC5C,CAAA,MAAO;AACL,MAAA,MAAM,iBAAA,CAAkB,EAAE,QAAA,EAAU,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,KAAA,CAAM,CAAC,CAAA,GAAI,KAAA,EAAO,CAAA;AAC7E,MAAA,QAAA,CAAS,WAAA,CAAY,UAAA,CAAW,UAAU,CAAC,CAAC,CAAA;AAAA,IAC9C;AAAA,EACF,GAAG,CAAC,aAAA,EAAe,iBAAA,EAAmB,UAAA,EAAY,QAAQ,CAAC,CAAA;AAE3D,EAAA,MAAM,iBAAA,GAAoB,CAAC,SAAA,EAA6B,cAAA,KAAmE;AACzH,IAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,MAAA,OAAO,SAAA;AAAA,IACT;AACA,IAAA,IAAI,SAAA,IAAa,2BAAA,CAA4B,SAAA,EAAW,cAAc,CAAA,EAAG;AACvE,MAAA,OAAO,SAAA;AAAA,IACT;AACA,IAAA,OAAO,cAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,2BAAA,GAA8B,CAAC,KAAA,EAAyB,cAAA,KAA8C;AAC1G,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,CAAC,GAAG,KAAA,CAAM,CAAC,CAAC,CAAA,IAAK,KAAK,GAAA,CAAI,cAAA,CAAe,CAAC,CAAA,EAAG,eAAe,CAAC,CAAC,CAAA,IAC7E,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,CAAC,CAAA,EAAG,MAAM,CAAC,CAAC,CAAA,IAAK,IAAA,CAAK,IAAI,cAAA,CAAe,CAAC,CAAA,EAAG,cAAA,CAAe,CAAC,CAAC,CAAA;AAAA,EACtF,CAAA;AAEA,EAAA,MAAM,eAAA,GAAkB;AAAA,IACtB,OAAA,EAAS,WAAA,CAAY,QAAA,CAAS,IAAA,CAAA,MAAA,YAAwB,CAAE,OAAA;AAAA,IACxD,WAAA,EAAa,WAAA,CAAY,QAAA,CAAS,IAAA,CAAA,MAAA,YAAwB,CAAE,WAAA;AAAA,IAC5D,KAAA,EAAO,wBAAA,EAA0B,cAAA,GAC7B,iBAAA,CAAkB,YAAY,QAAA,CAAS,IAAA,CAAA,MAAA,YAAwB,CAAE,KAAA,EAAO,yBAAyB,cAAc,CAAA,GAC/G,WAAA,CAAY,QAAA,CAAS,uBAAwB,CAAE,KAAA;AAAA,IACnD,IAAA,EAAM,WAAA,CAAY,QAAA,CAAS,IAAA,CAAA,MAAA,YAAwB,CAAE;AAAA,GACvD;AAEA,EAAA,MAAM,eAAA,GAAkB,cAAA,CAAe,eAAA,CAAgB,WAAA,EAAa,gBAAgB,KAAK,CAAA;AAEzF,EAAA,uBACEpC,GAAAA,CAAAC,QAAAA,EAAA,EACE,QAAA,EAAA,eAAA,CAAgB,8DACdD,GAAAA;AAAA,IAAC,mBAAA;AAAA,IAAA;AAAA,MACD,UAAA,EAAa,IAAA;AAAA,MACb,YAAA,EAAe,CAAA;AAAA,MACf,KAAA,EAAQ,YAAA;AAAA,MACR,QAAA,EAAW,OAAM,KAAA,KAAU,MAAM,iBAAiB,KAAK,CAAA;AAAA,MACvD,OAAQ,KAAA,GAAQ,CAAA,CAAE,yBAAyB,CAAA,GAAI,EAAE,6BAA6B,CAAA;AAAA,MAC9E,WAAA,EAAc,eAAA;AAAA,MACd,OAAQ,eAAA,CAAgB,KAAA;AAAA,MACxB,MAAO,eAAA,CAAgB,IAAA;AAAA,MACvB,QAAA,EAAU;AAAA,QACR,aAAA,EAAe,QAAQ,gBAAA,GAAU,qBAAA;AAAA,QACjC,cAAA,EAAgB,EAAE,yBAAyB,CAAA;AAAA,QAC3C,aAAA,EAAe,QAAQ,eAAA,GAAS,qBAAA;AAAA,QAChC,cAAA,EAAgB,EAAE,yBAAyB;AAAA,OAC7C;AAAA,MACA,aAAA,EAAe,EAAE,KAAA,EAAO,SAAA,EAAU;AAAA,MAClC,eAAA,EAAkB,IAAA;AAAA,MAClB,yBAAA,EAA4B;AAAA;AAAA,sBAE5BA,GAAAA;AAAA,IAAC,cAAA;AAAA,IAAA;AAAA,MACD,UAAA,EAAa,IAAA;AAAA,MACb,cAAe,eAAA,CAAgB,OAAA,KAAA,mBAAA;AAAA,MAC/B,YAAA,EAAe,CAAA;AAAA,MACf,KAAA,EAAQ,YAAA;AAAA,MACR,QAAA,EAAW,OAAM,KAAA,KAAU,MAAM,iBAAiB,KAAe,CAAA;AAAA,MACjE,OAAQ,KAAA,GAAQ,CAAA,CAAE,yBAAyB,CAAA,GAAI,EAAE,6BAA6B,CAAA;AAAA,MAC9E,WAAA,EAAc,eAAA;AAAA,MACd,OAAQ,eAAA,CAAgB,KAAA;AAAA,MACxB,MAAO,eAAA,CAAgB,IAAA;AAAA,MACvB,aAAA,EAAe,EAAE,KAAA,EAAO,SAAA;AAAU;AAAA,GACpC,EAEF,CAAA;AAEJ;;;AC1FO,IAAM,sBAAsB,MAAgB;AACjD,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,MAAA;AAAA,IACJ,IAAA,EAAM,iBAAA;AAAA,IACN,WAAA,EAAa,wDAAA;AAAA,IACb,OAAA,EAAS,OAAA;AAAA,IACT,UAAA,EAAY;AAAA,MACV,OAAA,EAAS;AAAA,QACP,iCAA4B;AAAA,UAC1B,OAAA,EAAS;AAAA,SACX;AAAA,QACA,yCAAgC;AAAA,UAC9B,OAAA,EAAS,6BAAA;AAAA,UACT,MAAA,EAAQ;AAAA,SACV;AAAA,QACA,6BAA0B;AAAA,UACxB,OAAA,EAAS,uBAAA;AAAA,UACT,MAAA,EAAQ;AAAA,SACV;AAAA,QACA,mBAAqB;AAAA,UACnB,OAAA,EAAS,kBAAA;AAAA,UACT,MAAA,EAAQ;AAAA;AACV,OACF;AAAA,MACA,QAAA,EAAU;AAAA,QACR,2BAA0B;AAAA,UACxB,IAAA,EAAM;AAAA,SACR;AAAA,QACA,iCAA6B;AAAA,UAC3B,IAAA,EAAM,kBAAA;AAAA,UACN,IAAA,EAAM;AAAA,SACR;AAAA,QACA,iCAA6B;AAAA,UAC3B,IAAA,EAAM,0BAAA;AAAA,UACN,IAAA,EAAM;AAAA,SACR;AAAA,QACA,2BAA0B;AAAA,UACxB,IAAA,EAAM,eAAA;AAAA,UACN,IAAA,EAAM;AAAA,SACR;AAAA,QACA,yBAAyB;AAAA,UACvB,IAAA,EAAM;AAAA,SACR;AAAA,QACA,uCAAgC;AAAA,UAC9B,IAAA,EAAM,qBAAA;AAAA,UACN,IAAA,EAAM;AAAA,SACR;AAAA,QACA,iCAA6B;AAAA,UAC3B,IAAA,EAAM,kBAAA;AAAA,UACN,IAAA,EAAM;AAAA,SACR;AAAA,QACA,2CAAkC;AAAA,UAChC,IAAA,EAAM,uBAAA;AAAA,UACN,IAAA,EAAM;AAAA,SACR;AAAA,QACA,6CAAmC;AAAA,UACjC,IAAA,EAAM,wBAAA;AAAA,UACN,IAAA,EAAM;AAAA,SACR;AAAA,QACA,2CAAkC;AAAA,UAChC,IAAA,EAAM,uBAAA;AAAA,UACN,IAAA,EAAM;AAAA,SACR;AAAA,QACA,qCAA+B;AAAA,UAC7B,IAAA,EAAM;AAAA,SACR;AAAA,QACA,yCAAiC;AAAA,UAC/B,IAAA,EAAM,sBAAA;AAAA,UACN,IAAA,EAAM;AAAA,SACR;AAAA,QACA,+BAA4B;AAAA,UAC1B,IAAA,EAAM,iBAAA;AAAA,UACN,IAAA,EAAM;AAAA,SACR;AAAA,QACA,+BAA4B;AAAA,UAC1B,IAAA,EAAM;AAAA,SACR;AAAA,QACA,uCAAgC;AAAA,UAC9B,IAAA,EAAM,qBAAA;AAAA,UACN,IAAA,EAAM;AAAA,SACR;AAAA,QACA,uBAAwB;AAAA,UACtB,IAAA,EAAM;AAAA,SACR;AAAA,QACA,mCAA8B;AAAA,UAC5B,IAAA,EAAM,mBAAA;AAAA,UACN,IAAA,EAAM;AAAA,SACR;AAAA,QACA,qBAAuB;AAAA,UACrB,IAAA,EAAM;AAAA;AACR;AACF;AACF,GACF;AACF;AC/GO,IAAM,8BAA8B,CAAC;AAAA,EAC1C,QAAA;AAAA,EACA,kBAAA,GAAqB;AACvB,CAAA,KAGM;AACJ,EAAA,MAAM,QAAQ,QAAA,EAAoB;AAElC,EAAA,MAAM,OAAA,GAAUgF,QAAQ,MAAM;AAC5B,IAAA,OAAO,IAAI,yBAAA,CAAuC,KAAA,EAAO,kBAAkB,CAAA;AAAA,EAC7E,CAAA,EAAG,CAAC,KAAA,EAAO,kBAAkB,CAAC,CAAA;AAE9B,EAAA,uBACEhF,GAAAA,CAAC,qBAAA,EAAA,EAAsB,OAAA,EACnB,QAAA,EACJ,CAAA;AAEJ;;;ACJO,IAAM,uBAAuB,MAAyB;AAE3D,EAAA,MAAM,WAAA,GAAc,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,OAAO,WAAW,CAAA;AACpE,EAAA,MAAM,YAAA,GAAe,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,OAAO,YAAY,CAAA;AACtE,EAAA,MAAM,gBAAA,GAAmB,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,OAAO,gBAAgB,CAAA;AAC9E,EAAA,MAAM,MAAA,GAAS,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,SAAS,MAAM,CAAA;AAC5D,EAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,YAAY,KAAK,CAAA;AAE7D,EAAA,MAAM,QAAA,GAAW,UAAU,CAAC,KAAA;AAG5B,EAAA,MAAM,YAAA,GAAe,WAAA,CAAY,WAAW,CAAA,IAAK,KAAA;AACjD,EAAA,MAAM,aAAA,GAAgB,WAAA,CAAY,YAAY,CAAA,IAAK,KAAA;AACnD,EAAA,MAAM,SAAA,GAAY,WAAA,CAAY,QAAQ,CAAA,IAAK,KAAA;AAC3C,EAAA,MAAM,gBAAA,GAAmB,WAAA,CAAY,gBAAgB,CAAA,IAAK,KAAA;AAG1D,EAAA,MAAM,aAAA,GAAgB,gBAAgB,CAAC,WAAA;AACvC,EAAA,MAAM,WAAA,GAAc,CAAC,YAAA,IAAgB,WAAA;AACrC,EAAA,MAAM,cAAA,GAAiB,iBAAiB,CAAC,YAAA;AACzC,EAAA,MAAM,YAAA,GAAe,CAAC,aAAA,IAAiB,YAAA;AACvC,EAAA,MAAM,UAAA,GAAa,aAAa,CAAC,QAAA;AACjC,EAAA,MAAM,QAAA,GAAW,CAAC,SAAA,IAAa,QAAA;AAC/B,EAAA,MAAM,kBAAA,GAAqB,oBAAoB,CAAC,gBAAA;AAChD,EAAA,MAAM,gBAAA,GAAmB,CAAC,gBAAA,IAAoB,gBAAA;AAE9C,EAAA,OAAO;AAAA;AAAA,IAEL,WAAA;AAAA,IACA,YAAA;AAAA,IACA,QAAA;AAAA,IACA,gBAAA;AAAA;AAAA,IAGA,YAAA;AAAA,IACA,aAAA;AAAA,IACA,SAAA;AAAA,IACA,gBAAA;AAAA;AAAA,IAGA,aAAA;AAAA,IACA,WAAA;AAAA,IACA,cAAA;AAAA,IACA,YAAA;AAAA,IACA,UAAA;AAAA,IACA,QAAA;AAAA,IACA,kBAAA;AAAA,IACA;AAAA,GACF;AACF;;;AC1EO,IAAM,oBAAA,GAAuB,CAAC,aAAA,KAA8B;AACjE,EAAA,OAAO,aAAA,EAAe,GAAA,CAAI,CAAC,OAAA,MAAa;AAAA,IACtC,MAAM,OAAA,CAAQ,IAAA;AAAA,IACd,MAAM,OAAA,CAAQ,IAAA;AAAA,IACd,SAAA,EAAW;AAAA,MACT,QAAA,EAAU,QAAQ,SAAA,CAAU,QAAA;AAAA,MAC5B,WAAA,EAAa,QAAQ,SAAA,CAAU,WAAA;AAAA,MAC/B,gBAAA,EAAkB,QAAQ,SAAA,CAAU;AAAA;AACtC,GACF,CAAE,CAAA;AACJ,CAAA;;;AC0CA,IAAM,aAAA,GAAgB,CAAC,QAAA,KAAsC;AAE3D,EAAA,MAAM,WAAW,QAAA,CAAS,QAAA;AAC1B,EAAA,IAAI,CAAC,UAAU,OAAO,QAAA;AAEtB,EAAA,MAAM,aAAa,QAAA,CAAS,UAAA;AAC5B,EAAA,IAAI,CAAC,YAAY,OAAO,QAAA;AAGxB,EAAA,MAAM,WAAW,KAAA,CAAM,OAAA,CAAQ,UAAU,CAAA,GAAI,UAAA,GAAa,CAAC,UAAU,CAAA;AAGrE,EAAA,IAAI,QAAA,CAAS,IAAA;AAAA,IAAK,CAAC,OAAA,KACjB,OAAA,KAAY,OAAA,CAAQ;AAAA,GACtB,EAAG;AACD,IAAA,OAAO,OAAA;AAAA,EACT;AAGA,EAAA,IAAI,QAAA,CAAS,IAAA;AAAA,IAAK,CAAC,OAAA,KACjB,OAAA,KAAY,OAAA,CAAQ;AAAA,GACtB,EAAG;AACD,IAAA,OAAO,MAAA;AAAA,EACT;AAGA,EAAA,OAAO,QAAA;AACT,CAAA;AAEO,IAAM,iBAAiB,CAAC;AAAA,EAC7B,GAAA;AAAA,EACA,UAAU,MAAM;AAAA,EAAC,CAAA;AAAA,EACjB,OAAA,EAAS;AACX,CAAA,KAAmD;AACjD,EAAA,MAAM,WAAW,cAAA,EAAe;AAChC,EAAA,MAAM,EAAE,mBAAA,EAAoB,GAAI,cAAA,EAAe;AAG/C,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIkD,SAAS,IAAI,CAAA;AAC/C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAgC,IAAI,CAAA;AAC9D,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAC5D,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAC5D,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAGpE,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,SAA6B,IAAI,CAAA;AACvE,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAA+B,IAAI,CAAA;AAGjE,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAS,KAAK,CAAA;AACxC,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAS,KAAK,CAAA;AACxC,EAAA,MAAM,CAAC,YAAA,EAAc,oBAAoB,CAAA,GAAIA,SAAS,EAAE,CAAA;AACxD,EAAA,MAAM,CAAC,0BAAA,EAA4B,kCAAkC,CAAA,GAAIA,SAAS,KAAK,CAAA;AAEvF,EAAA,MAAM,mBAAA,GAAsB,CAACuD,MAAAA,EAAgB,OAAA,KAAoB;AAC/D,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAI,OAAQ,CAAA,CAAA,CAAA,EAAKA,MAAK,CAAA;AACpC,IAAA,MAAM,cAAA,GAAiB,YAAA,CAAa,OAAA,CAAQA,MAAAA,EAAO,OAAO,CAAA;AAC1D,IAAA,QAAA,CAAS,cAAc,CAAA;AACvB,IAAA,YAAA,CAAa,KAAK,CAAA;AAAA,EACpB,CAAA;AAGA,EAAAnE,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,MAAM,kBAAkB,YAAA,CAAa,OAAA,CAAQ,IAAI,KAAA,CAAM,0BAA0B,GAAG,YAAY,CAAA;AAChG,MAAA,QAAA,CAAS,eAAe,CAAA;AACxB,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA;AAAA,IACF;AAEA,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,QAAA,CAAS,IAAI,CAAA;AAGb,IAAA,MAAM,UAAA,GAAa,mBAAmB,GAAG,CAAA;AAEzC,IAAA,MAAM,eAAe,IAAIoE,IAAAA,CAAK,EAAE,IAAA,EAAM,YAAY,CAAA;AAClD,IAAA,MAAM,OAAA,GAAU,aAAA,IAAiB,IAAI,WAAA,CAAY,MAAS,CAAA;AAE1D,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,GAAA,CAAI,YAAY,CAAA;AAGxC,MAAA,OAAA,CAAQ,IAAA,EAAK,CAAE,IAAA,CAAK,OAAO,IAAA,KAAS;AAClC,QAAA,IAAI;AACF,UAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA;AACtC,UAAA,WAAA,CAAY,YAAY,IAAI,CAAA;AAC5B,UAAA,IAAI,QAAA,EAAU;AACZ,YAAA,eAAA,CAAgB,CAAA,EAAI,QAAS,CAAA,iBAAA,CAAmB,CAAA;AAGhD,YAAA,MAAM,eAAA,GAAkB,aAAA,IAAiB,IAAI,WAAA,CAAY,QAAW,QAAQ,CAAA;AAG5E,YAAA,MAAM,eAAA,GAAkB,eAAA,CAAgB,GAAA,CAAI,YAAY,CAAA;AACxD,YAAA,MAAM,YAAA,GAAe,MAAM,eAAA,CAAgB,UAAA,EAAW;AAEtD,YAAA,WAAA,CAAY,YAAsB,CAAA;AAGlC,YAAA,MAAM,WAAA,GAAc,QAAA,CAAS,WAAA,CAAY,YAAY,CAAA;AACrD,YAAA,WAAA,CAAY,YAAY,QAAQ,CAAA;AAGhC,YAAA,MAAM,eAAA,GAAkB,cAAc,WAAW,CAAA;AACjD,YAAA,UAAA,CAAW,eAAe,CAAA;AAC1B,YAAA,QAAA,CAAS,gBAAA,CAAiB,eAAe,CAAC,CAAA;AAE1C,YAAA,MAAM,GAAA,GAAM,IAAI,WAAA,CAAY;AAAA,cAC1B,QAAA,EAAU,WAAA;AAAA,cACV,OAAA,EAAS;AAAA,aACV,CAAA;AAGD,YAAA,IAAI,oBAAoB,MAAA,EAAQ;AAC9B,cAAA,IAAI;AACF,gBAAA,MAAM,YAAA,GAAe,MAAM,GAAA,CAAI,qBAAA,EAAsB;AACrD,gBAAA,MAAM,aAAA,GAAgB,qBAAqB,YAAY,CAAA;AACvD,gBAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,CAAC,CAAA;AAAA,cAC1C,SAASD,MAAAA,EAAO;AACd,gBAAA,OAAA,CAAQ,KAAA,CAAM,8BAA8BA,MAAK,CAAA;AACjD,gBAAA,QAAA,CAAS,gBAAA,CAAiB,EAAE,CAAC,CAAA;AAAA,cAC/B;AAAA,YACF;AAEA,YAAA,cAAA,CAAe,GAAG,CAAA;AAClB,YAAA,YAAA,CAAa,KAAK,CAAA;AAAA,UACpB;AAAA,QACF,SAASA,MAAAA,EAAgB;AACvB,UAAA,mBAAA,CAAoBA,QAAO,wBAAwB,CAAA;AAAA,QACrD;AAAA,MACF,CAAC,CAAA;AAAA,IACH,SAASA,MAAAA,EAAgB;AACvB,MAAA,mBAAA,CAAoBA,QAAO,wBAAwB,CAAA;AAAA,IACrD;AAAA,EACF,CAAA,EAAG,CAAC,GAAA,EAAK,aAAA,EAAe,QAAQ,CAAC,CAAA;AAGjC,EAAAnE,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,WAAA,EAAa;AAGlB,IAAA,MAAM,GAAA,GAAM,WAAA,CAAY,QAAA,CAAS,2BAAA,KAAgC,kBAAA,CAAmB,GAAA;AACpF,IAAA,QAAA,CAAS,GAAG,CAAA;AACZ,IAAA,QAAA,CAAS,MAAA,CAAO,GAAG,CAAC,CAAA;AAGpB,IAAA,IAAI,YAAY,MAAA,EAAQ;AACtB,MAAA,MAAM,GAAA,GAAM,WAAA,CAAY,QAAA,CAAS,eAAA,KAAoB,MAAA,CAAO,KAAA;AAC5D,MAAA,QAAA,CAAS,GAAG,CAAA;AACZ,MAAA,QAAA,CAAS,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,IACtB;AAGA,IAAA,MAAM,YAAA,GAAe,mBAAA;AAAA,MACnB,WAAA,CAAY,QAAA,CAAS,SAAA,GAAY,CAAC,CAAA;AAAA,MAClC,YAAY,QAAA,CAAS;AAAA,KACvB;AACA,IAAA,oBAAA,CAAqB,YAAY,CAAA;AACjC,IAAA,QAAA,CAAS,eAAA,CAAgB,YAAY,CAAC,CAAA;AAGtC,IAAA,MAAM,uBAAA,GAA0B,WAAA,CAAY,QAAA,CAAS,aAAA,EAAe,OAAA,EAAS,IAAA;AAAA,MAC3E,CAAA,OAAA,KAAW,OAAA,IAAW,OAAA,CAAQ,KAAA,KAAU,QAAQ,wBAAA,CAAyB;AAAA,KAC3E,IAAK,KAAA;AACL,IAAA,kCAAA,CAAmC,uBAAuB,CAAA;AAC1D,IAAA,QAAA,CAAS,6BAAA,CAA8B,uBAAuB,CAAC,CAAA;AAG/D,IAAA,IAAI,OAAA,KAAY,UAAU,WAAA,EAAa;AACrC,MAAA,MAAM,iBAAiB,YAAY;AACjC,QAAA,IAAI;AACF,UAAA,MAAM,aAAA,GAAgB,MAAM,WAAA,CAAY,qBAAA,EAAsB;AAC9D,UAAA,MAAM,yBAAA,GAA4B,qBAAqB,aAAa,CAAA;AACpE,UAAA,QAAA,CAAS,gBAAA,CAAiB,yBAAyB,CAAC,CAAA;AAAA,QACtD,SAASmE,MAAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,8BAA8BA,MAAK,CAAA;AACjD,UAAA,QAAA,CAAS,gBAAA,CAAiB,EAAE,CAAC,CAAA;AAAA,QAC/B;AAAA,MACF,CAAA;AAEA,MAAA,cAAA,EAAe;AAAA,IACjB;AAAA,EACF,GAAG,CAAC,WAAA,EAAa,OAAA,EAAS,mBAAA,EAAqB,QAAQ,CAAC,CAAA;AAGxD,EAAAnE,UAAU,MAAM;AACd,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,IACf;AAAA,EACF,CAAA,EAAG,CAAC,KAAA,EAAO,OAAO,CAAC,CAAA;AAEnB,EAAA,OAAO;AAAA,IACL,SAAA;AAAA,IACA,KAAA;AAAA,IACA,WAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA,YAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACF;AACF;AC5PO,IAAM,kBAAA,GAAqB,CAAC,GAAA,EAAoB,aAAA,KAAoC;AACzF,EAAA,MAAM,gBAAA,GAAmB,gBAAgB,GAAG,CAAA;AAC5C,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIY,QAAAA;AAAA,IAAyB,MAC3D,aAAA,GAAiB,aAAA,CAAc,GAAA,MAAS,IAAA,GAAQ;AAAA,GAClD;AAEA,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,MAAM,GAAA,GAAM,CAAC,QAAA,KAA6B;AACxC,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,aAAA,CAAc,IAAI,QAAQ,CAAA;AAAA,MAC5B;AACA,MAAA,aAAA,CAAc,QAAQ,CAAA;AAAA,IACxB,CAAA;AAEA,IAAA,MAAM,MAAM,MAAM,UAAA;AAElB,IAAA,OAAO;AAAA,MACL,YAAA,EAAc,GAAA;AAAA,MACd,YAAA,EAAc,GAAA;AAAA,MACd,SAAA,EAAW;AAAA,KACb;AAAA,EACF;AAEA,EAAA,OAAO,gBAAA;AACT;;;AC/BA,IAAA,8BAAA,GAAA;AAAA,EAEC,OAAA,EAAAN,gCAAAA;AAAA,EAMA,IAAA,EAAA+D,6BAAAA;AAAA,EAMA,KAAA,EAAAC,8BAAAA;AAAA,EAMA,QAAA,EAAAC,iCAAAA;AAAA,EAKA,SAAA,EAAAC,kCAAAA;AAAA,EAOA,SAAA,EAAAC,kCAAAA;AAAA,EACA,MAAA,EAAAC,+BAAAA;AAAA,EAqFA,UAAA,EAAAC,mCAAAA;AAAA,EAUA,aAAA,EAAAC,sCAAAA;AAAA,EAWA,aAAA,EAAAC,sCAAAA;AAAA,EAaA,eAAA,EAAAC,wCAAAA;AAAA,EAcU,OAAA,EAAAC,gCAAAA;AAAA,EA0BV,MAAA,EAAAC;AAAA;AC1KM,IAAM,iBAAA,GAAoB,CAAC,KAAA,KAA2B;AAC3D,EAAA,MAAM,EAAE,WAAA,EAAY,GAAI,cAAA,EAAe;AACvC,EAAA,MAAM,YAAA,GAAe,WAAA,CAAY,OAAA,CAAQ,MAAA,CAAO,QAAA,CAAS,YAAA;AACzD,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIpE,QAAAA;AAAA,IACtB,KAAA,CAAM,YAAY,WAAA,CAAY,OAAA,CAAQ,KAAK,KAAA,CAAM,SAAkD,CAAA,CAAE,MAAA,IAAU,IAAA,GAAO;AAAA,GACxH;AAEA,EAAA,MAAM,UAAA,GAAa,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,QAAQ,IAAI,CAAA;AAC7D,EAAA,MAAM,OAAA,GAAU,WAAW,UAAU,CAAA;AACrC,EAAA,MAAM,mBAAA,GAAsB,WAAA,CAAY,KAAA,CAAM,SAAS,CAAA;AAEvD,EAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,cAAA,CAAe,KAAA,CAAM,SAAS,CAAA,IAAK,IAAA;AACjE,EAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,IAAS,YAAA;AAC7B,EAAA,MAAM,QAAA,GAAW,IAAA,EAAM,QAAA,IAAY,IAAA,CAAK,QAAA,GAAW,QAC/C,IAAA,CAAK,QAAA,GACL,YAAA,GAAe,KAAA,GACb,YAAA,GACA,KAAA;AACN,EAAA,MAAM,QAAA,GAAW,IAAA,EAAM,QAAA,IAAY,IAAA,CAAK,QAAA,GAAW,QAC/C,IAAA,CAAK,QAAA,GACL,YAAA,GAAe,KAAA,GACb,YAAA,GACA,KAAA;AAEN,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,OAAO,KAAA,CAAM,MAAA,IAAU,OAAA,CAAQ,MAAA,CAAO,MAAM,SAAS,CAAA;AAAA,EACvD,CAAA;AAEA,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,OAAO,KAAA,CAAM,SAAA;AAAA,EACf,CAAA;AAEA,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,OAAO,CAAC,EAAE,WAAA,EAAY,IAAK,mBAAA,IAAuB,CAAC,KAAA,CAAM,SAAA,CAAA;AAAA,EAC3D,CAAA;AAEA,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,OAAO,KAAA,CAAM,SAAA;AAAA,EACf,CAAA;AAEA,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,OAAO,aAAY,GAAI,IAAA,CAAK,KAAA,CAAM,KAAK,IAAI,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA,IAAK,KAAK,KAAA,CAAM,KAAK,IAAI,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA,GAAI,KAAA;AAAA,EAChH,CAAA;AAEA,EAAA,MAAM,mBAAmB,MAAM;AAC7B,IAAA,OAAO,MAAM,aAAA,IAAiB,KAAA;AAAA,EAChC,CAAA;AAEA,EAAA,MAAM,QAAA,GAAWd,YAAY,MAAM;AACjC,IAAA,OAAO,aAAA,GACD,IAAA,CAAK,KAAA,CAAO,aAAA,GAAgB,MAAA,CAAO,UAAA,GAAc,GAAG,CAAA,GACpD,IAAA,CAAK,KAAA,CAAO,KAAA,GAAQ,MAAA,CAAO,aAAc,GAAG,CAAA;AAAA,EACpD,CAAA,EAAG,CAAC,aAAA,EAAe,KAAK,CAAC,CAAA;AAEzB,EAAA,MAAM,WAAA,GAAcA,YAAY,MAAM;AACpC,IAAA,OAAO,IAAA,CAAK,KAAA,CAAO,QAAA,GAAW,MAAA,CAAO,aAAc,GAAG,CAAA;AAAA,EACxD,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAA,MAAM,WAAA,GAAcA,YAAY,MAAM;AACpC,IAAA,OAAO,IAAA,CAAK,KAAA,CAAO,QAAA,GAAW,MAAA,CAAO,aAAc,GAAG,CAAA;AAAA,EACxD,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAA,MAAM,iBAAA,GAAoBA,WAAAA,CAAY,CAAC,UAAA,KAAuB;AAC5D,IAAA,IAAI,UAAU,IAAA,CAAK,KAAA,CAAO,UAAA,GAAa,MAAA,CAAO,aAAc,GAAG,CAAA;AAE/D,IAAA,IAAI,UAAU,QAAA,EAAU;AACtB,MAAA,OAAA,GAAU,QAAA;AAAA,IACZ;AAEA,IAAA,IAAI,UAAU,QAAA,EAAU;AACtB,MAAA,OAAA,GAAU,QAAA;AAAA,IACZ;AAEA,IAAA,OAAO,OAAA;AAAA,EACT,CAAA,EAAG,CAAC,QAAA,EAAU,QAAQ,CAAC,CAAA;AAGvB,EAAAE,UAAU,MAAM;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,SAAA,GAAY,WAAA,CAAY,OAAA,CAAQ,IAAA,CAAK,MAAM,SAAkD,CAAA,CAAE,MAAA,IAAU,IAAA,GAAO,IAAI,CAAA;AAAA,EACpI,CAAA,EAAG,CAAC,KAAA,CAAM,SAAA,EAAW,WAAW,CAAC,CAAA;AAEjC,EAAA,OAAO;AAAA,IACL,UAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAA;AAAA,IACA,gBAAA;AAAA,IACA,QAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAA;AAAA,IACA;AAAA,GACF;AACF,CAAA;ACtFA,IAAM,aAAa,CAAC;AAAA,EAClB,IAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAA,KAKM;AACJ,EAAA,MAAM,QAAA,GAAW,GAAI,IAAK,CAAA,cAAA,CAAA;AAE1B,EAAA,MAAM,SAAA,GAAY,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,OAAO,SAAS,CAAA;AAEhE,EAAA,MAAM,aAAA,GAAgBF,YAAY,MAAM;AACtC,IAAA,IAAI,IAAA,KAAA,cAAA,cAA8B;AAChC,MAAA,OAAO,SAAA,KAAA,KAAA,aAAsC,2BAAA,CAAc,oBAAA,GAAuB,2BAAA,CAAc,qBAAA;AAAA,IAClG,WAAW,IAAA,KAAA,YAAA,YAA4B;AACrC,MAAA,OAAO,SAAA,KAAA,KAAA,aAAsC,2BAAA,CAAc,qBAAA,GAAwB,2BAAA,CAAc,oBAAA;AAAA,IACnG;AAAA,EACF,CAAA,EAAG,CAAC,IAAA,EAAM,SAAS,CAAC,CAAA;AAEpB,EAAA,uBACEpC,GAAAA,CAAAC,QAAAA,EAAA,EACA,QAAA,kBAAAD,GAAAA;AAAA,IAAC,iBAAA;AAAA,IAAA;AAAA,MACC,EAAA,EAAK,QAAA;AAAA,MACL,WAAY,2BAAA,CAAc,YAAA;AAAA,MAC1B,UAAW,CAAC,WAAA;AAAA,MACZ,QAAA,EAAW,cAAc,CAAA,GAAI,EAAA;AAAA,MAE3B,QAAA,EAAA,WAAA,IAAe,gBAAA,oBACfA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAYY,WAAAA,CAAW,2BAAA,CAAc,gBAAA,EAAkB,aAAA,EAAe,CAAA,EAAI;AAAA;AAAA,GAEnF,EACA,CAAA;AAEJ,CAAA;AAEA,IAAM,YAAY,CAAC;AAAA,EACjB,SAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAA,KASM;AACJ,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,OAAA,EAAQ;AAEtB,EAAA,MAAM,QAAA,GAAWC,OAA8B,IAAI,CAAA;AACnD,EAAA,MAAM,SAAA,GAAY,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,OAAO,SAAS,CAAA;AAChE,EAAA,MAAM,WAAW,cAAA,EAAe;AAEhC,EAAA,MAAM,aAAA,GAAgB,IAAA,KAAA,YAAA,cAA8B,SAAA,KAAA,KAAA,aAAsC,8BAAA,CAAa,YAAY,8BAAA,CAAa,QAAA;AAEhI,EAAA,MAAM,aAAA,GAAgBuB,YAAY,MAAM;AACtC,IAAA,IAAI,KAAA,GAAQ,EAAA;AACZ,IAAA,IAAI,mCAA8B,SAAA,KAAA,KAAA,YAAqC;AACrE,MAAA,KAAA,IAAS,EAAE,iCAAiC,CAAA;AAAA,IAC9C,CAAA,MAAO;AACL,MAAA,KAAA,IAAS,EAAE,gCAAgC,CAAA;AAAA,IAC7C;AAEA,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,IAAI,CAAC,WAAA,EAAa;AAChB,QAAA,KAAA,IAAS,CAAA,QAAA,EAAO,CAAA,CAAE,kCAAA,EAAoC,EAAE,MAAA,EAAQ,CAAA,CAAE,CAAA,OAAA,EAAW,SAAU,CAAA,QAAA,CAAU,CAAA,EAAG,CAAE,CAAA,CAAA;AAAA,MACxG,WAAW,WAAA,EAAa;AACtB,QAAA,KAAA,IAAS,CAAA,QAAA,EAAO,CAAA,CAAE,qCAAA,EAAuC,EAAE,MAAA,EAAQ,CAAA,CAAE,CAAA,OAAA,EAAW,SAAU,CAAA,QAAA,CAAU,CAAA,EAAG,CAAE,CAAA,CAAA;AAAA,MAC3G;AAAA,IACF,CAAA,MAAO;AACL,MAAA,KAAA,IAAS,CAAA,QAAA,EAAO,CAAA,CAAE,iCAAiC,CAAE,CAAA,CAAA;AAAA,IACvD;AAEA,IAAA,OAAO,KAAA;AAAA,EACT,CAAA,EAAG,CAAC,IAAA,EAAM,SAAA,EAAW,aAAa,WAAA,EAAa,SAAA,EAAW,CAAC,CAAC,CAAA;AAE5D,EAAA,MAAM,aAAA,GAAgBA,YAAY,MAAM;AACtC,IAAA,IAAI,SAAS,OAAA,EAAS;AACpB,MAAA,QAAA,CAAS,QAAQ,QAAA,EAAS;AAC1B,MAAA,QAAA,CAAS,iBAAA,CAAkB,IAAI,CAAC,CAAA;AAAA,IAClC;AAAA,EACF,CAAA,EAAG,CAAC,QAAA,EAAU,IAAI,CAAC,CAAA;AAEnB,EAAA,MAAM,WAAA,GAAcA,YAAY,MAAM;AACpC,IAAA,IAAI,SAAS,OAAA,EAAS;AACpB,MAAA,QAAA,CAAS,QAAQ,MAAA,EAAO;AACxB,MAAA,QAAA,CAAS,eAAA,CAAgB,IAAI,CAAC,CAAA;AAAA,IAChC;AAAA,EACF,CAAA,EAAG,CAAC,QAAA,EAAU,IAAI,CAAC,CAAA;AAEnB,EAAAE,UAAU,MAAM;AACd,IAAA,QAAA,CAAS,iBAAA,CAAkB,IAAI,CAAC,CAAA;AAEhC,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,mBAAA,CAAoB,IAAI,CAAC,CAAA;AAAA,IACpC,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,QAAA,EAAU,IAAI,CAAC,CAAA;AAEnB,EAAAA,UAAU,MAAM;AACd,IAAA,WAAA,IAAe,WAAA,GAAc,WAAA,EAAY,GAAI,aAAA,EAAc;AAAA,EAC7D,GAAG,CAAC,WAAA,EAAa,WAAA,EAAa,aAAA,EAAe,WAAW,CAAC,CAAA;AAEzD,EAAA,uBACED,IAAAA,CAAApC,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,IAAA,IAAA,KAAA,YAAA,8BACAD,GAAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAA,YAAA;AAAA,QACA,WAAA;AAAA,QACA,WAAA;AAAA,QACA;AAAA;AAAA,KACF;AAAA,oBAEFA,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,EAAA,EAAK,GAAI,IAAK,CAAA,MAAA,CAAA;AAAA,QACd,KAAA,EAAQ,kCAA6B,CAAA,GAAI,CAAA;AAAA,QACzC,WAAA,EAAc,IAAA;AAAA,QACd,aAAA,EAAgB,CAAA;AAAA,QAChB,GAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAc,WAAA,GAAc,KAAA,CAAM,KAAA,GAAQ,CAAA;AAAA,QAC1C,SAAU,KAAA,CAAM,QAAA;AAAA,QAChB,SAAU,KAAA,CAAM,QAAA;AAAA,QAChB,UAAA,EAAa,aAAA;AAAA,QACb,QAAA,EAAW,WAAA;AAAA,QACX,UAAW,CAAC,IAAA,KAAiB,IAAA,KAAS,CAAA,IAAK,SAAS,iBAAA,CAAkB;AAAA,UACpE,GAAA,EAAK,IAAA;AAAA,UACL,KAAA,EAAO,KAAA,CAAM,iBAAA,CAAkB,IAAI;AAAA,SACpC,CAAC,CAAA;AAAA,QACF,KAAA,EAAQ,WAAA;AAAA,QAER,QAAA,kBAAAA,GAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,EAAA,EAAK,IAAA;AAAA,YACL,cAAa,aAAA,EAAc;AAAA,YAC3B,SAAA,EAAYY,WAAAA,CAAW,2BAAA,CAAc,cAAA,EAAgB,aAAa;AAAA;AAAA;AACnE;AAAA,KACH;AAAA,IACE,uDACAZ,GAAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAA,cAAA;AAAA,QACA,WAAA;AAAA,QACA,WAAA;AAAA,QACA;AAAA;AAAA;AACF,GAAA,EAEJ,CAAA;AAEF,CAAA;AAEO,IAAM,yBAAyB,CAAC;AAAA,EACrC;AACF,CAAA,KAEM;AACJ,EAAA,MAAM,EAAE,WAAA,EAAY,GAAI,cAAA,EAAe;AACvC,EAAA,MAAM,eAAe,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,OAAA,CAAQ,gCAAyB,CAAA;AACpF,EAAA,MAAM,aAAa,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,OAAA,CAAQ,4BAAuB,CAAA;AAChF,EAAA,MAAM,UAAA,GAAa,kBAAkB,YAAY,CAAA;AACjD,EAAA,MAAM,QAAA,GAAW,kBAAkB,UAAU,CAAA;AAE7C,EAAA,MAAM,UAAA,GAAa,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,QAAQ,UAAU,CAAA;AAEnE,EAAA,IAAI,CAAC,WAAA,CAAY,OAAA,CAAQ,IAAA,EAAM;AAC7B,IAAA,uBACEA,GAAAA,CAAAC,QAAAA,EAAA,EACE,QAAA,EACF,CAAA;AAAA,EAEJ,CAAA,MAAO;AACL,IAAA,MAAMsH,cAAa,kBAAA,CAAmC;AAAA,MACpD,YAAA,EAAA,MAAA;AAAA,MACA,QAAA,EAAU,cAAA;AAAA,MACV,IAAA,EAAM,YAAY,OAAA,CAAQ,IAAA;AAAA,MAC1B,aAAA,EAAA,MAAA;AAAA,KACD,CAAA;AAED,IAAA,MAAM,UAAA,GAAa,UAAA,IAAcA,WAAAA,CAAW,UAAU,CAAA,IAAA,MAAA;AAEtD,IAAA,uBACEvH,IAAAC,QAAAA,EAAA,EACA,0BAAAoC,IAAAA,CAAC,UAAA,EAAA,EAAW,WAAU,YAAA,EAEjB,QAAA,EAAA;AAAA,MAAA,CAAA,UAAA,KAAA,MAAA,eAAsC,uDACpCrC,GAAAA;AAAA,QAAC,SAAA;AAAA,QAAA;AAAA,UACF,SAAA,EAAY,WAAW,UAAA,EAAW;AAAA,UAClC,IAAA,EAAA,cAAA;AAAA,UACA,KAAA,EAAO;AAAA,YACL,KAAA,EAAO,WAAW,QAAA,EAAS;AAAA,YAC3B,QAAA,EAAU,WAAW,WAAA,EAAY;AAAA,YACjC,QAAA,EAAU,WAAW,WAAA,EAAY;AAAA,YACjC,mBAAmB,UAAA,CAAW;AAAA,WAChC;AAAA,UACA,WAAA,EAAc,WAAW,WAAA,EAAY;AAAA,UACrC,WAAA,EAAc,WAAW,WAAA,EAAY;AAAA,UACrC,WAAA,EAAc,WAAW,WAAA,EAAY;AAAA,UACrC,WAAA,EAAc,WAAW,WAAA,EAAY;AAAA,UACrC,gBAAA,EAAmB,WAAW,gBAAA;AAAiB;AAAA,OACjD;AAAA,sBAGFA,GAAAA,CAAC,KAAA,EAAA,EAAM,IAAG,YAAA,EAAa,KAAA,EAAQ,GAC3B,QAAA,EACJ,CAAA;AAAA,MAAA,CAGG,UAAA,KAAA,MAAA,eAAsC,mDACpCA,GAAAA;AAAA,QAAC,SAAA;AAAA,QAAA;AAAA,UACF,SAAA,EAAY,SAAS,UAAA,EAAW;AAAA,UAChC,IAAA,EAAA,YAAA;AAAA,UACA,KAAA,EAAO;AAAA,YACL,KAAA,EAAO,SAAS,QAAA,EAAS;AAAA,YACzB,QAAA,EAAU,SAAS,WAAA,EAAY;AAAA,YAC/B,QAAA,EAAU,SAAS,WAAA,EAAY;AAAA,YAC/B,mBAAmB,QAAA,CAAS;AAAA,WAC9B;AAAA,UACA,WAAA,EAAc,SAAS,WAAA,EAAY;AAAA,UACnC,WAAA,EAAc,SAAS,WAAA,EAAY;AAAA,UACnC,WAAA,EAAc,SAAS,WAAA,EAAY;AAAA,UACnC,WAAA,EAAc,SAAS,WAAA,EAAY;AAAA,UACnC,gBAAA,EAAmB,SAAS,gBAAA;AAAiB;AAAA;AAC/C,KAAA,EAEJ,CAAA,EACF,CAAA;AAAA,EAEF;AACF;;;ACxQA,IAAA,iCAAA,GAAA;AAAA,EAAC,MAAA,EAAA0B,kCAAAA;AAAA,EAQA,eAAA,EAAA8F,2CAAAA;AAAA,EAoBA,cAAA,EAAAC;AAAA,CAAA;;;AC5BD,IAAA,4BAAA,GAAA;AAAA,EAAC,IAAA,EAAAC;AAAA,CAAA;ACqBM,IAAM,mBAAmB,CAAC;AAAA,EAC/B;AACF,CAAA,KAEM;AACJ,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,OAAA,EAAQ;AACtB,EAAA,MAAM,EAAE,WAAA,EAAY,GAAI,cAAA,EAAe;AACvC,EAAA,MAAM,SAAA,GAAY,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,OAAO,SAAS,CAAA;AAChE,EAAA,MAAM,KAAA,GAAQ,SAAA,KAAA,KAAA;AAEd,EAAA,MAAM,OAAA,GAAU,WAAA,CAAY,OAAA,CAAQ,MAAA,EAAQ,QAAA,EAAU,OAAA,IAAA,OAAA;AACtD,EAAA,MAAM,IAAA,GAAO,WAAA,CAAY,OAAA,CAAQ,MAAA,EAAQ,QAAA,EAAU,IAAA;AACnD,EAAA,MAAM,OAAA,GAAU,WAAA,CAAY,OAAA,CAAQ,MAAA,EAAQ,QAAA,EAAU,OAAA;AACtD,EAAA,MAAM,UAAA,GAAa,WAAA,CAAY,OAAA,CAAQ,MAAA,EAAQ,UAAU,UAAA,IAAc,WAAA;AACvE,EAAA,MAAM,iBAAA,GAAoB9G,YAAW,4BAAA,CAAe,IAAA,EAAM,eAAe,QAAA,GAAW,0BAAA,CAAe,aAAA,GAAgB,0BAAA,CAAe,gBAAgB,CAAA;AAElJ,EAAA,MAAM,SAAA,GAAY;AAAA,IAChB,cAAA,EAAgB;AAAA,MACd,KAAA,EAAO,WAAA,CAAY,OAAA,CAAQ,KAAA,CAAM,YAAA;AAAA,MACjC,UAAA,EAAY,WAAA,CAAY,OAAA,CAAQ,KAAA,CAAM;AAAA,KACxC;AAAA,IACA,OAAA,EAAS;AAAA,MACP,WAAW,0BAAA,CAAe;AAAA,KAC5B;AAAA,IACA,KAAA,EAAO,EAAE,oCAAoC;AAAA,GAC/C;AAEA,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAElB,EAAA,QAAQ,OAAA;AAAS,IACf,KAAA,OAAA;AACE,MAAA,uBACEZ,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EACH,QAAA,kBAAAA,GAAAA;AAAA,QAAC,WAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAY,iBAAA;AAAA,UACZ,IAAA;AAAA,UACA,SAAA,EAAY,QAAQ,OAAA,GAAU,MAAA;AAAA,UAC9B,YAAA,EAAa,EAAE,oCAAoC,CAAA;AAAA,UACnD;AAAA;AAAA,OACF,EACF,CAAA;AAAA,IAGJ,KAAA,MAAA;AACE,MAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EACH,QAAA,kBAAAA,GAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAY,iBAAA;AAAA,UACZ,IAAA;AAAA,UACA,YAAA,EAAa,EAAE,oCAAoC,CAAA;AAAA,UACnD;AAAA;AAAA,OACF,EACF,CAAA;AAAA,IAGJ,KAAA,SAAA;AACE,MAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EACH,QAAA,kBAAAA,GAAAA;AAAA,QAAC,SAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAY,iBAAA;AAAA,UACZ,IAAA;AAAA,UACA,YAAA,EAAa,EAAE,oCAAoC,CAAA;AAAA,UACnD;AAAA;AAAA,OACF,EACF,CAAA;AAAA,IAGJ;AACE,MAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AAErB,MAAA,IAAI,WAAA,GAA+B,IAAA;AAEnC,MAAA,QAAQ,QAAQ,IAAA;AAAM,QACpB,KAAK,KAAA;AACH,UAAA,WAAA,mBAAcA,IAAC,KAAA,EAAA,EAAI,GAAA,EAAM,QAAQ,GAAA,IAAO,EAAA,EAAK,GAAA,EAAM,OAAA,CAAQ,GAAA,EAAM,CAAA;AACjE,UAAA;AAAA,QAEF,KAAK,KAAA;AAEH,UAAA,MAAM,MAAA,GAAS,IAAI,SAAA,EAAU;AAC7B,UAAA,MAAM,GAAA,GAAM,MAAA,CAAO,eAAA,CAAgB,OAAA,CAAQ,SAAS,eAAe,CAAA;AACnE,UAAA,MAAM,aAAa,GAAA,CAAI,eAAA;AAGvB,UAAA,MAAM,aAAqC,EAAC;AAC5C,UAAA,KAAA,MAAW,EAAE,MAAM,KAAA,EAAM,IAAK,MAAM,IAAA,CAAK,UAAA,CAAW,UAAU,CAAA,EAAG;AAC/D,YAAA,UAAA,CAAW,IAAI,CAAA,GAAI,KAAA;AAAA,UACrB;AAGA,UAAA,WAAA,GAAcuC,OAAAA,CAAM,cAAc,KAAA,EAAO;AAAA,YACvC,GAAG,UAAA;AAAA,YACH,aAAA,EAAe,MAAA;AAAA,YACf,SAAA,EAAW,OAAA;AAAA,YACX,KAAA,EAAO,4BAAA;AAAA,YACP,uBAAA,EAAyB;AAAA,cACvB,QAAQ,UAAA,CAAW;AAAA;AACrB,WACD,CAAA;AACD,UAAA;AAAA;AAGJ,MAAA,uBACEvC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EACH,QAAA,kBAAAA,GAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAY,iBAAA;AAAA,UACZ,IAAA;AAAA,UACA,YAAA,EAAa,EAAE,oCAAoC,CAAA;AAAA,UACnD,SAAA;AAAA,UAEE,QAAA,EAAA;AAAA;AAAA,OACJ,EACF,CAAA;AAAA;AAGR,CAAA;AC1HO,IAAM,4BAA4B,CAAC;AAAA,EACxC;AACF,CAAA,KAEM;AACJ,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,OAAA,EAAQ;AAEtB,EAAA,MAAM,gBAAA,GAAmB,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,YAAY,gBAAgB,CAAA;AACnF,EAAA,MAAM,WAAA,GAAc,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,OAAO,WAAW,CAAA;AACpE,EAAA,MAAM,UAAA,GAAa,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,OAAO,UAAU,CAAA;AAClE,EAAA,MAAM,YAAA,GAAe,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,OAAO,YAAY,CAAA;AACtE,EAAA,MAAM,UAAA,GAAa,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,QAAQ,UAAU,CAAA;AAGnE,EAAA,MAAM,cAAA,GAAiBgF,QAAgD,OAAO;AAAA,IAC5E,QAAA,EAAA,OAAA;AAAA,IACA,kBAAA,EAAoB,IAAA;AAAA,IACpB,mBAAA,EAAqB;AAAA,GACvB,CAAA,EAAI,EAAE,CAAA;AAEN,EAAA,MAAM,cAAA,GAAiBA,QAAQ,MAAM;AACnC,IAAA,OAAO,kBAAA,CAA2D;AAAA,MAChE,YAAA,EAAc,YAAY,OAAA,IAAW,cAAA;AAAA,MACrC,QAAA,EAAU,mBAAA;AAAA,MACV,MAAM,UAAA,EAAY,WAAA;AAAA,MAClB,WAAA,EAAa;AAAA,KACd,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,UAAA,EAAY,cAAc,CAAC,CAAA;AAG/B,EAAA,MAAM,YAAA,GAAeA,QAAQ,MAAM;AACjC,IAAA,IAAI,CAAC,UAAA,EAAY,OAAO,UAAA,EAAY,OAAA,IAAW,cAAA;AAC/C,IAAA,OAAO,cAAA,CAAe,UAAU,CAAA,IAAK,UAAA,EAAY,OAAA,IAAW,cAAA;AAAA,EAC9D,GAAG,CAAC,UAAA,EAAY,gBAAgB,UAAA,EAAY,OAAA,EAAS,cAAc,CAAC,CAAA;AAEpE,EAAA,MAAM,EAAE,QAAA,EAAU,kBAAA,EAAoB,mBAAA,EAAoB,GAAI,YAAA;AAE9D,EAAA,MAAM,aAAA,GAAgBA,QAAQ,MAAM;AAClC,IAAA,IAAI,CAAC,QAAA,EAAU,OAAA,OAAA;AAGf,IAAA,IAAI,WAAA,IAAe,kBAAA,KAAuB,KAAA,IAAS,CAAC,UAAA,EAAY;AAC9D,MAAA,OAAA,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,WAAA,IAAe,YAAA,IAAgB,mBAAA,KAAwB,KAAA,IAAS,CAAC,UAAA,EAAY;AAC/E,MAAA,OAAA,MAAA;AAAA,IACF;AAEA,IAAA,OAAO,QAAA;AAAA,EACT,CAAA,EAAG,CAAC,QAAA,EAAU,WAAA,EAAa,oBAAoB,UAAA,EAAY,YAAA,EAAc,mBAAmB,CAAC,CAAA;AAE7F,EAAA,MAAM,WAAA,GAAcA,QAAQ,MAAM;AAChC,IAAA,IAAI,aAAA,KAAA,OAAA,cAA6C;AAC/C,MAAA,OAAO,kBAAkB,KAAA,IAAS,EAAA;AAAA,IACpC,WAAW,aAAA,KAAA,SAAA,gBAA+C;AACxD,MAAA,OAAO,gBAAA,EAAkB,WAAA,EAAa,cAAA,IAAkB,gBAAA,EAAkB,KAAA,IAAS,EAAA;AAAA,IACrF;AACA,IAAA,OAAO,EAAA;AAAA,EACT,CAAA,EAAG,CAAC,aAAA,EAAe,gBAAgB,CAAC,CAAA;AAEpC,EAAA,IAAI,CAAC,WAAA,IAAe,aAAA,KAAA,MAAA,aAA4C,OAAO,IAAA;AAEvE,EAAA,uBACEhF,GAAAA,CAAAC,QAAAA,EAAA,EACA,QAAA,kBAAAD,GAAAA;AAAA,IAAC,aAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAQ,WAAA;AAAA,MACR,YAAA,EAAa,EAAE,+BAA+B;AAAA;AAAA,GAChD,EACA,CAAA;AAEJ,CAAA;ACtDO,IAAM,uBAAuB,CAAC;AAAA,EACnC,UAAA;AAAA,EACA,YAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,KAKM;AACJ,EAAA,MAAM,SAAA,GAAYa,OAAuB,IAAI,CAAA;AAC7C,EAAA,MAAM,EAAE,WAAA,EAAY,GAAI,cAAA,EAAe;AACvC,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,OAAA,EAAQ;AACtB,EAAA,MAAM,EAAE,oBAAA,EAAqB,GAAI,UAAA,EAAW;AAE5C,EAAA,MAAM,UAAA,GAAa,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,QAAQ,IAAI,CAAA;AAC7D,EAAA,MAAM,WAAA,GAAc,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,QAAQ,QAAQ,CAAA;AAClE,EAAA,MAAM,QAAA,GAAW,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,SAAS,MAAM,CAAA;AAC9D,EAAA,MAAM,WAAA,GAAc,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,OAAO,WAAW,CAAA;AACpE,EAAA,MAAM,UAAA,GAAa,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,OAAO,UAAU,CAAA;AAClE,EAAA,MAAM,mBAAA,GAAsB,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,OAAO,mBAAmB,CAAA;AACpF,EAAA,MAAM,aAAA,GAAgB,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,YAAY,aAAa,CAAA;AAE7E,EAAA,MAAM,UAAU,UAAA,CAAW,EAAE,GAAG,UAAA,EAAY,GAAG,aAAa,CAAA;AAC5D,EAAA,MAAM,WAAW,cAAA,EAAe;AAEhC,EAAA,MAAM,EAAE,gBAAA,EAAiB,GAAI,cAAA,CAAe;AAAA,IAC1C,aAAA,GAAgB;AACd,MAAA,QAAA,CAAS,WAAA,CAAY,IAAI,CAAC,CAAA;AAAA,IAC5B,CAAA;AAAA,IACA,YAAA,GAAe;AACb,MAAA,IAAI,OAAA,CAAQ,iBAAgB,EAAG;AAC7B,QAAA,QAAA,CAAS,WAAA,CAAY,KAAK,CAAC,CAAA;AAAA,MAC7B;AAAA,IACF;AAAA,GACD,CAAA;AAED,EAAA,MAAM,WAAW,MAAM;AACrB,IAAA,IAAI,CAAC,mBAAA,IAAuB,OAAA,CAAQ,eAAA,EAAgB,EAAG;AACrD,MAAA,QAAA,CAAS,WAAA,CAAY,IAAI,CAAC,CAAA;AAAA,IAC5B;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,IAAI,CAAC,mBAAA,IAAuB,OAAA,CAAQ,eAAA,EAAgB,EAAG;AACrD,MAAA,QAAA,CAAS,WAAA,CAAY,KAAK,CAAC,CAAA;AAAA,IAC7B;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,eAAA,GAAkBuB,YAAY,MAAM;AACxC,IAAA,MAAM,eAA+C,EAAC;AAEtD,IAAA,IAAI,wBAAwB,MAAA,CAAO,IAAA,CAAK,oBAAoB,CAAA,CAAE,SAAS,CAAA,EAAG;AACxE,MAAA,UAAA,CAAW,OAAA,CAAQ,CAAC,GAAA,KAAQ;AAC1B,QAAA,IAAI,oBAAA,CAAqB,GAAG,CAAA,EAAG;AAC7B,UAAA,YAAA,CAAa,IAAA,CAAK;AAAA,YAChB,OAAA,EAAS,oBAAA,CAAqB,GAAG,CAAA,CAAE,OAAA;AAAA,YACnC,MAAA,EAAQ,oBAAA,CAAqB,GAAG,CAAA,CAAE,MAAA;AAAA,YAClC;AAAA,WACD,CAAA;AAAA,QACH,CAAA,MAAO;AACL,UAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,YAAA,EAAgB,GAAI,CAAA,gEAAA,CAAkE,CAAA;AAAA,QACrG;AAAA,MACF,CAAC,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,YAAA,CAAa,OAAO,CAAA,IAAA,KAAQ;AACjC,MAAA,IAAI,KAAK,GAAA,KAAA,gBAAA,uBAAsC;AAC7C,QAAA,OAAO,qBAAqB,aAAa,CAAA;AAAA,MAC3C;AACA,MAAA,IAAI,KAAK,GAAA,KAAA,YAAA,mBAAkC;AACzC,QAAA,OAAO,QAAA,CAAS,iBAAA,IAAqB,CAAC,QAAA,EAAS;AAAA,MACjD;AACA,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,UAAA,EAAY,oBAAA,EAAsB,aAAa,CAAC,CAAA;AAEpD,EAAAE,UAAU,MAAM;AAEd,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,MAAM,eAAe,QAAA,CAAS,aAAA;AAC9B,MAAA,IAAI,YAAA,IAAgB,SAAA,CAAU,OAAA,EAAS,QAAA,CAAS,YAAY,CAAA,EAAG;AAC7D,QAAC,aAA6B,IAAA,EAAK;AAAA,MACrC;AAAA,IACF;AAAA,EACF,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAEhB,EAAA,uBACED,IAAAA,CAAApC,QAAAA,EAAA,EACA,QAAA,EAAA;AAAA,oBAAAD,GAAAA;AAAA,MAAC,oBAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAYY,WAAAA,CAAW,8BAAA,CAAa,UAAA,EAAY,+BAAa,aAAa,CAAA;AAAA,QAC1E,QAAA,EAAW,MAAA,KAAA,YAAA,kBAAiC,WAAA,IAAe,CAAC,UAAA;AAAA,QAC5D,YAAA,EAAe,QAAA;AAAA,QACf,YAAA,EAAe;AAAA;AAAA,KACjB;AAAA,oBAEAyB,IAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAM,SAAA;AAAA,QACN,SAAA,EAAYzB,WAAAA,CAAW,8BAAA,CAAa,MAAA,EAAQ,kCAAmB,MAAM,CAAA;AAAA,QACrE,YAAA,EAAa,EAAE,yBAAyB,CAAA;AAAA,QACxC,YAAA,EAAe,QAAA;AAAA,QACf,YAAA,EAAe,WAAA;AAAA,QACb,GAAG,gBAAA;AAAA,QAEH,QAAA,EAAA;AAAA,UAAA,WAAA,CAAY,OAAA,CAAQ,QAAQ,QAAA,oBAAYZ,IAAC,gBAAA,EAAA,EAAiB,SAAA,EAAY,kCAAmB,eAAA,EAAkB,CAAA;AAAA,0BAE7GA,GAAAA,CAAC,yBAAA,EAAA,EAA0B,UAAA,EAAa,qBAAA,EAAwB,CAAA;AAAA,0BAEhEA,GAAAA;AAAA,YAAC,6BAAA;AAAA,YAAA;AAAA,cACC,EAAA,EAAG,4BAAA;AAAA,cACH,OAAQ,eAAA,EAAgB;AAAA,cACxB,KAAA,EAAO;AAAA,gBACL,GAAG,WAAA,CAAY,OAAA;AAAA,gBACf,YAAA,EAAc;AAAA,eAChB;AAAA,cACA,WAAY,iCAAA,CAAmB,cAAA;AAAA,cAC/B,YAAA,EAAa,EAAE,2BAA2B,CAAA;AAAA,cAC1C,qBAAA,EACG,CAAC,QAAA,IAAY,WAAA,CAAY,YAAY,MAAA,CAAO,eAAA,GACzC,6BAAmB,IAAA,GACnB;AAAA;AAAA;AAER;AAAA;AAAA;AACF,GAAA,EACA,CAAA;AAEJ;;;AC/JA,IAAA,qCAAA,GAAA;AAAA,EAAC,OAAA,EAAA4C,uCAAAA;AAAA,EAaA,QAAA,EAAA+E,wCAAAA;AAAA,EAKc,cAAA,EAAAC,8CAAAA;AAAA,EAKA,WAAA,EAAAC,2CAAAA;AAAA,EAKA,UAAA,EAAAC,0CAAAA;AAAA,EAiCG,KAAA,EAAAhF;AAAA,CAAA;;;AC7DlB,IAAA,sCAAA,GAAA;AAAA,EAAC,OAAA,EAAAF;AAAA,CAAA;ACoBM,IAAM,4BAA4B,CAAC;AAAA,EACxC,SAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA,KAIM;AACJ,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,OAAA,EAAQ;AAEtB,EAAA,MAAM,gBAAA,GAAmB,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,YAAY,gBAAgB,CAAA;AACnF,EAAA,MAAM,WAAA,GAAc,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,OAAO,WAAW,CAAA;AACpE,EAAA,MAAM,YAAA,GAAe,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,OAAO,YAAY,CAAA;AACtE,EAAA,MAAM,UAAA,GAAa,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,OAAO,UAAU,CAAA;AAClE,EAAA,MAAM,UAAA,GAAa,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,QAAQ,UAAU,CAAA;AAEnE,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIM,SAAS,EAAE,CAAA;AAEjD,EAAA,MAAM,cAAA,GAAiB8B,QAAQ,MAAM;AACnC,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,eAAA;AAAA,MACV,kBAAA,EAAoB,IAAA;AAAA,MACpB,mBAAA,EAAqB;AAAA,KACvB;AAAA,EACF,CAAA,EAAG,CAAC,eAAe,CAAC,CAAA;AAEpB,EAAA,MAAM,cAAA,GAAiBA,QAAQ,MAAM;AACnC,IAAA,OAAO,kBAAA,CAAmF;AAAA,MACxF,YAAA,EAAc,YAAY,OAAA,IAAW,cAAA;AAAA,MACrC,QAAA,EAAU,mBAAA;AAAA,MACV,MAAM,UAAA,EAAY,WAAA;AAAA,MAClB,WAAA,EAAa;AAAA,KACd,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,UAAA,EAAY,cAAc,CAAC,CAAA;AAG/B,EAAA,MAAM,YAAA,GAAeA,QAAQ,MAAM;AACjC,IAAA,IAAI,CAAC,UAAA,EAAY,OAAO,UAAA,EAAY,OAAA,IAAW,cAAA;AAC/C,IAAA,OAAO,cAAA,CAAe,UAAU,CAAA,IAAK,UAAA,EAAY,OAAA,IAAW,cAAA;AAAA,EAC9D,GAAG,CAAC,UAAA,EAAY,gBAAgB,UAAA,EAAY,OAAA,EAAS,cAAc,CAAC,CAAA;AAEpE,EAAA,MAAM,EAAE,QAAA,EAAU,kBAAA,EAAoB,mBAAA,EAAoB,GAAI,YAAA;AAG9D,EAAA,MAAM,aAAA,GAAgBA,QAAQ,MAAM;AAClC,IAAA,IAAI,CAAC,QAAA,EAAU,OAAO,cAAA,CAAe,QAAA;AAGrC,IAAA,IAAI,WAAA,IAAe,kBAAA,KAAuB,KAAA,IAAS,CAAC,UAAA,EAAY;AAC9D,MAAA,OAAA,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,WAAA,IAAe,YAAA,IAAgB,mBAAA,KAAwB,KAAA,IAAS,CAAC,UAAA,EAAY;AAC/E,MAAA,OAAA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,EAAG;AAC3B,MAAA,OAAO,gCAAA,CAAiC,QAAA,EAAU,gBAAA,EAAkB,WAAW,KAC7E,cAAA,CAAe,QAAA;AAAA,IACnB;AAEA,IAAA,OAAO,QAAA;AAAA,EACT,CAAA,EAAG,CAAC,QAAA,EAAU,gBAAA,EAAkB,WAAA,EAAa,cAAA,EAAgB,WAAA,EAAa,UAAA,EAAY,YAAA,EAAc,kBAAA,EAAoB,mBAAmB,CAAC,CAAA;AAG5I,EAAA1C,UAAU,MAAM;AACd,IAAA,IAAI,aAAA,KAAA,MAAA,eAA8C,CAAC,gBAAA,EAAkB,WAAA,EAAa;AAChF,MAAA,cAAA,CAAe,EAAE,CAAA;AACjB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM;AAAA,MACJ,mBAAmB,EAAC;AAAA,MACpB,cAAA;AAAA,MACA,mBAAA;AAAA,MACA,gBAAA;AAAA,MACA,cAAA;AAAA,MACA,aAAA;AAAA,MACA,UAAA;AAAA,MACA;AAAA,QACE,gBAAA,CAAiB,WAAA;AAErB,IAAA,IAAI,IAAA,GAAO,EAAA;AAGX,IAAA,MAAM,eAAA,GAAkB,CAAC,SAAA,KAAwB;AAC/C,MAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1B,QAAA,OAAO,SAAA,CAAU,KAAK,QAAG,CAAA;AAAA,MAC3B;AACA,MAAA,OAAO,SAAA,CAAU,CAAC,CAAA,EAAG,QAAA,EAAS,IAAK,EAAA;AAAA,IACrC,CAAA;AAEA,IAAA,QAAQ,aAAA;AAAe,MACrB,KAAA,WAAA;AACE,QAAA,IAAI,gBAAA,CAAiB,SAAS,CAAA,EAAG;AAC/B,UAAA,IAAA,GAAO,gBAAgB,gBAAgB,CAAA;AAAA,QACzC;AACA,QAAA;AAAA,MAEF,KAAA,kBAAA;AACE,QAAA,IAAI,gBAAA,CAAiB,MAAA,GAAS,CAAA,IAAK,cAAA,EAAgB;AACjD,UAAA,IAAA,GAAO,EAAE,iCAAA,EAAmC;AAAA,YAC1C,CAAA,EAAG,gBAAgB,gBAAgB,CAAA;AAAA,YACnC,CAAA,EAAG;AAAA,WACJ,CAAA;AAAA,QACH;AACA,QAAA;AAAA,MAEF,KAAA,yBAAA;AACE,QAAA,IAAI,gBAAA,CAAiB,MAAA,GAAS,CAAA,IAAK,cAAA,EAAgB;AACjD,UAAA,MAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAA,CAAO,gBAAA,IAAoB,KAAK,GAAG,CAAA;AAC3D,UAAA,IAAA,GAAO,EAAE,qCAAA,EAAuC;AAAA,YAC9C,CAAA,EAAG,gBAAgB,gBAAgB,CAAA;AAAA,YACnC,CAAA,EAAG,cAAA;AAAA,YACH,CAAA,EAAG,GAAI,UAAW,CAAA,CAAA;AAAA,WACnB,CAAA;AAAA,QACH;AACA,QAAA;AAAA,MAEF,KAAA,eAAA;AACE,QAAA,IAAI,kBAAkB,MAAA,EAAW;AAC/B,UAAA,IAAA,GAAO,EAAE,CAAA,qDAAA,CAAA,EAAyD;AAAA,YAChE,KAAA,EAAO;AAAA,WACR,CAAA;AAAA,QACH;AACA,QAAA;AAAA,MAEF,KAAA,oBAAA;AACE,QAAA,IAAI,qBAAqB,MAAA,EAAW;AAClC,UAAA,MAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,gBAAA,GAAmB,GAAG,CAAA;AACpD,UAAA,IAAA,GAAO,GAAI,UAAW,CAAA,CAAA,CAAA;AAAA,QACxB;AACA,QAAA;AAAA,MAEF,KAAA,qBAAA;AACE,QAAA,IAAI,wBAAwB,MAAA,EAAW;AACrC,UAAA,MAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,mBAAA,GAAsB,GAAG,CAAA;AACvD,UAAA,IAAA,GAAO,GAAI,UAAW,CAAA,CAAA,CAAA;AAAA,QACxB;AACA,QAAA;AAAA,MAEF,KAAA,uBAAA;AACE,QAAA,IAAI,wBAAwB,MAAA,EAAW;AACrC,UAAA,MAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,mBAAA,GAAsB,GAAG,CAAA;AACvD,UAAA,IAAA,GAAO,EAAE,iCAAA,EAAmC;AAAA,YAC1C,CAAA,EAAG,GAAI,UAAW,CAAA,CAAA,CAAA;AAAA,YAClB,CAAA,EAAG,cAAA,IAAkB,CAAA,CAAE,0CAA0C;AAAA,WAClE,CAAA;AAAA,QACH;AACA,QAAA;AAAA,MAEF,KAAA,mBAAA;AACE,QAAA,IAAI,YAAA,KAAiB,MAAA,IAAa,UAAA,KAAe,MAAA,EAAW;AAC1D,UAAA,IAAA,GAAO,EAAE,iCAAA,EAAmC;AAAA,YAC1C,CAAA,EAAG,YAAA;AAAA,YACH,CAAA,EAAG;AAAA,WACJ,CAAA;AAAA,QACH;AACA,QAAA;AAAA;AAGJ,IAAA,cAAA,CAAe,IAAI,CAAA;AAAA,EACrB,GAAG,CAAC,aAAA,EAAe,gBAAA,EAAkB,WAAA,EAAa,CAAC,CAAC,CAAA;AAEpD,EAAA,IAAI,CAAC,eAAe,aAAA,KAAA,MAAA,aAA4C;AAC9D,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,uBACEtC,GAAAA;AAAA,IAAC,aAAA;AAAA,IAAA;AAAA,MACC,EAAA,EAAG,qBAAA;AAAA,MACH,SAAA,EAAYY,WAAAA,CAAW,sCAAA,CAAkB,OAAA,EAAS,SAAS,CAAA;AAAA,MAC3D,YAAA,EAAa,EAAE,gCAAgC,CAAA;AAAA,MAE7C,QAAA,EAAA;AAAA;AAAA,GACJ;AAEJ,CAAA;AC/LO,IAAM,2BAA2B,CAAC;AAAA,EACvC,GAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG;AACL,CAAA,KAAyB;AACvB,EAAA,MAAM,iBAAA,GAAoBC,OAA0B,IAAI,CAAA;AACxD,EAAA,MAAM,aAAA,GAAgBA,OAA0B,IAAI,CAAA;AAEpD,EAAA,MAAM,gBAAA,GAAmB;AAAA,IACvB,GAAG,SAAA;AAAA,IACH,cAAA,EAAgB;AAAA,MACd,GAAG,SAAA,EAAW,cAAA;AAAA,MACd,GAAA,EAAK,iBAAA;AAAA,MACL,SAAA,EAAW,CAAC,CAAA,KAAqB;AAC/B,QAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AACtB,UAAA,iBAAA,CAAkB,SAAS,IAAA,EAAK;AAAA,QAClC;AAAA,MACF;AAAA,KACF;AAAA,IACA,UAAA,EAAY;AAAA,MACV,GAAG,SAAA,EAAW,UAAA;AAAA,MACd,GAAA,EAAK,aAAA;AAAA,MACL,SAAA,EAAW,CAAC,CAAA,KAAqB;AAC/B,QAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AACtB,UAAA,aAAA,CAAc,SAAS,IAAA,EAAK;AAAA,QAC9B;AAAA,MACF;AAAA;AACF,GACF;AAEA,EAAA,uBACEb,GAAAA;AAAA,IAAC,YAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,WAAY,qCAAA,CAAuB,OAAA;AAAA,MACnC,KAAA;AAAA,MACA,SAAA,EAAY,gBAAA;AAAA,MACV,GAAG,KAAA;AAAA,MAEH;AAAA;AAAA,GACJ;AAEJ,CAAA;AC3BO,IAAM,uBAAuB,CAAC;AAAA,EACnC,MAAA;AAAA,EACA,qBAAA;AAAA,EACA;AACF,CAAA,KAIM;AACJ,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,OAAA,EAAQ;AACtB,EAAA,MAAM,SAAA,GAAYa,OAAuB,IAAI,CAAA;AAC7C,EAAA,MAAM,aAAA,GAAgB,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,OAAO,OAAO,CAAA;AAClE,EAAA,MAAM,WAAA,GAAc,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,OAAO,WAAW,CAAA;AACpE,EAAA,MAAM,UAAA,GAAa,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,OAAO,UAAU,CAAA;AAClE,EAAA,MAAM,mBAAA,GAAsB,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,OAAO,mBAAmB,CAAA;AACpF,EAAA,MAAM,MAAA,GAAS,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,SAAS,MAAM,CAAA;AAC5D,EAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,YAAY,KAAK,CAAA;AAC7D,EAAA,MAAM,QAAA,GAAW,UAAU,CAAC,KAAA;AAC5B,EAAA,MAAM,UAAA,GAAa,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,QAAQ,UAAU,CAAA;AACnE,EAAA,MAAM,aAAA,GAAgB,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,QAAQ,oBAAoB,CAAA;AAChF,EAAA,MAAM,QAAA,GAAW,cAAA,CAAe,CAAA,KAAA,KAAS,KAAA,CAAM,YAAY,gBAAgB,CAAA;AAE3E,EAAA,MAAM,WAAW,cAAA,EAAe;AAEhC,EAAA,MAAM,EAAE,gBAAA,EAAiB,GAAIkH,cAAAA,CAAe;AAAA,IAC1C,aAAA,GAAgB;AACd,MAAA,QAAA,CAAS,WAAA,CAAY,IAAI,CAAC,CAAA;AAAA,IAC5B,CAAA;AAAA,IACA,YAAA,GAAe;AACb,MAAA,QAAA,CAAS,WAAA,CAAY,KAAK,CAAC,CAAA;AAAA,IAC7B;AAAA,GACD,CAAA;AAED,EAAA,MAAM,WAAW,MAAM;AACrB,IAAA,IAAI,CAAC,mBAAA,EAAqB;AACxB,MAAA,QAAA,CAAS,WAAA,CAAY,IAAI,CAAC,CAAA;AAAA,IAC5B;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,IAAI,CAAC,mBAAA,EAAqB;AACxB,MAAA,QAAA,CAAS,WAAA,CAAY,KAAK,CAAC,CAAA;AAAA,IAC7B;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,EAAE,eAAA,EAAiB,WAAA,EAAa,EAAA,KAAO,YAAA,EAAa;AAE1D,EAAA,MAAM,WAAA,GAAc3F,YAAY,MAAM;AACpC,IAAA,MAAM,KAAA,GAA4E;AAAA,MAChF,QAAA,EAAU,MAAA;AAAA,MACV,IAAA,EAAM;AAAA,KACR;AAEA,IAAA,MAAM,WAAW,eAAA,EAAgB;AACjC,IAAA,MAAM,OAAO,WAAA,EAAY;AAEzB,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,KAAA,CAAM,QAAA,GAAW;AAAA,QACf,MAAM,UAAA,KAAA,SAAA,kBAAwC,UAAA,KAAA,QAAA,gCAC5CC,IAAAA,CAAApC,UAAA,EACE,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC,UAAK,SAAA,EAAY,8BAAA,CAAa,QAAW,QAAA,EAAA,CAAA,CAAE,KAAA,GAAQ,6CAAA,GAAgD,gDAAgD,CAAA,EAAG,CAAA;AAAA,0BACvJA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAY,sCAAuB,KAAA,EAAU,QAAA,EAAA,QAAA,EAAU,YAAA,EAAc,KAAA,IAAS,SAAS,KAAA,IAAS,CAAA,CAAE,KAAA,GAAQ,yCAAA,GAA4C,4CAA4C,CAAA,EAAG;AAAA,SAAA,EAC7M,oBAEAA,GAAAA,CAAAC,QAAAA,EAAA,EACE,0BAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAY,qCAAA,CAAuB,OAAU,QAAA,EAAA,CAAA,CAAE,KAAA,GAAQ,yCAAA,GAA4C,4CAA4C,GAAG,CAAA,EAC1J,CAAA;AAAA,QAEF,SAAS,MAAM,EAAA,CAAG,QAAA,EAAU,CAAC,eAAe,MAAM;AAAA,QAAC,CAAC;AAAA,OACtD;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,KAAA,CAAM,IAAA,GAAO;AAAA,QACX,MAAM,UAAA,KAAA,SAAA,kBAAwC,UAAA,KAAA,QAAA,gCAC5CqC,IAAAA,CAAApC,UAAA,EACE,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC,UAAK,SAAA,EAAY,8BAAA,CAAa,QAAW,QAAA,EAAA,CAAA,CAAE,KAAA,GAAQ,yCAAA,GAA4C,4CAA4C,CAAA,EAAG,CAAA;AAAA,0BAC/IA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAY,sCAAuB,KAAA,EAAU,QAAA,EAAA,QAAA,EAAU,QAAA,EAAU,KAAA,IAAS,KAAK,KAAA,IAAS,CAAA,CAAE,KAAA,GAAQ,qCAAA,GAAwC,wCAAwC,CAAA,EAAG;AAAA,SAAA,EAC7L,oBAEAA,GAAAA,CAAAC,QAAAA,EAAA,EACE,0BAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAY,qCAAA,CAAuB,OAAU,QAAA,EAAA,CAAA,CAAE,KAAA,GAAQ,qCAAA,GAAwC,wCAAwC,GAAG,CAAA,EAClJ,CAAA;AAAA,QAEF,SAAS,MAAM,EAAA,CAAG,IAAA,EAAM,CAAC,eAAe,MAAM;AAAA,QAAC,CAAC;AAAA,OAClD;AAAA,IACF;AAEA,IAAA,OAAO,KAAA;AAAA,EACT,CAAA,EAAG,CAAC,EAAA,EAAI,eAAA,EAAiB,WAAA,EAAa,GAAG,QAAA,EAAU,UAAA,EAAY,aAAA,EAAe,KAAK,CAAC,CAAA;AAEpF,EAAAsC,UAAU,MAAM;AACd,IAAA,WAAA,EAAY;AAAA,EACd,CAAA,EAAG,CAAC,QAAA,EAAU,WAAW,CAAC,CAAA;AAE1B,EAAAA,UAAU,MAAM;AAEd,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,MAAM,eAAe,QAAA,CAAS,aAAA;AAC9B,MAAA,IAAI,YAAA,IAAgB,SAAA,CAAU,OAAA,EAAS,QAAA,CAAS,YAAY,CAAA,EAAG;AAC7D,QAAC,aAA6B,IAAA,EAAK;AAAA,MACrC;AAAA,IACF;AAAA,EACF,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAEhB,EAAA,uBACED,IAAAA,CAAApC,QAAAA,EAAA,EACA,QAAA,EAAA;AAAA,oBAAAD,GAAAA;AAAA,MAAC,oBAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAYY,WAAAA,CAAW,8BAAA,CAAa,UAAA,EAAY,+BAAa,aAAa,CAAA;AAAA,QAC1E,QAAA,EAAW,MAAA,KAAA,YAAA,kBAAiC,WAAA,IAAe,CAAC,UAAA;AAAA,QAC5D,YAAA,EAAe,QAAA;AAAA,QACf,YAAA,EAAe;AAAA;AAAA,KACjB;AAAA,oBAEAZ,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAM,SAAA;AAAA,QACN,WAAY,8BAAA,CAAa,SAAA;AAAA,QACzB,YAAA,EAAa,EAAE,yBAAyB,CAAA;AAAA,QACxC,YAAA,EAAe,QAAA;AAAA,QACf,YAAA,EAAe,WAAA;AAAA,QACb,GAAG,gBAAA;AAAA,QAEF,QAAA,EAAA,QAAA,IAAY,aAAA,KAAkB,QAAA,mBAC7BA,GAAAA;AAAA,UAAC,wBAAA;AAAA,UAAA;AAAA,YACC,YAAA,EAAa,EAAE,kCAAkC,CAAA;AAAA,YACjD,OAAQ,WAAA,EAAY;AAAA,YACpB,SAAA,EAAY;AAAA,cACV,QAAA,EAAU;AAAA,gBACR,WAAW,qCAAA,CAAuB;AAAA,eACpC;AAAA,cACA,cAAA,EAAgB;AAAA,gBACd,WAAW,qCAAA,CAAuB,cAAA;AAAA,gBAClC,mBAAA,EAAqB;AAAA,eACvB;AAAA,cACA,UAAA,EAAY;AAAA,gBACV,WAAW,qCAAA,CAAuB,UAAA;AAAA,gBAClC,mBAAA,EAAqB;AAAA;AACvB,aACF;AAAA,YAEA,QAAA,kBAAAA,GAAAA;AAAA,cAAC,yBAAA;AAAA,cAAA;AAAA,gBACC,WAAY,qCAAA,CAAuB,WAAA;AAAA,gBACnC,UAAA,EAAa,qBAAA;AAAA,gBACb,eAAA,EAAkB;AAAA;AAAA;AACpB;AAAA,4BAEFA,GAAAA;AAAA,UAAC,yBAAA;AAAA,UAAA;AAAA,YACC,UAAA,EAAa,qBAAA;AAAA,YACb,eAAA,EAAkB;AAAA;AAAA;AACpB;AAAA;AACN,GAAA,EACA,CAAA;AAEJ;;;ACjLO,IAAM,qBAAqB,MAAM;AACtC,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,IAAA,OAAO,EAAA;AAAA,EACT;AAEA,EAAA,MAAM,MAAA,GAAS,OAAO,QAAA,CAAS,MAAA;AAE/B,EAAA,OAAO,CAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA,YAAA,EAyBM,IAAI,GAAA,CAAI,4CAAA,EAA8C,MAAM,CAAA,CAAE,UAAW,CAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,YAAA,EAOzE,IAAI,GAAA,CAAI,4CAAA,EAA8C,MAAM,CAAA,CAAE,UAAW,CAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,YAAA,EAOzE,IAAI,GAAA,CAAI,mDAAA,EAAqD,MAAM,CAAA,CAAE,UAAW,CAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,YAAA,EAOhF,IAAI,GAAA,CAAI,mDAAA,EAAqD,MAAM,CAAA,CAAE,UAAW,CAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,YAAA,EAOhF,IAAI,GAAA,CAAI,iDAAA,EAAmD,MAAM,CAAA,CAAE,UAAW,CAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,YAAA,EAO9E,IAAI,GAAA,CAAI,iDAAA,EAAmD,MAAM,CAAA,CAAE,UAAW,CAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,YAAA,EAO9E,IAAI,GAAA,CAAI,uDAAA,EAAyD,MAAM,CAAA,CAAE,UAAW,CAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,YAAA,EAOpF,IAAI,GAAA,CAAI,uDAAA,EAAyD,MAAM,CAAA,CAAE,UAAW,CAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA,YAAA,EASpF,IAAI,GAAA,CAAI,gDAAA,EAAkD,MAAM,CAAA,CAAE,UAAW,CAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,YAAA,EAO7E,IAAI,GAAA,CAAI,gDAAA,EAAkD,MAAM,CAAA,CAAE,UAAW,CAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,YAAA,EAO7E,IAAI,GAAA,CAAI,uDAAA,EAAyD,MAAM,CAAA,CAAE,UAAW,CAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,YAAA,EAOpF,IAAI,GAAA,CAAI,uDAAA,EAAyD,MAAM,CAAA,CAAE,UAAW,CAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,YAAA,EAOpF,IAAI,GAAA,CAAI,qDAAA,EAAuD,MAAM,CAAA,CAAE,UAAW,CAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,YAAA,EAOlF,IAAI,GAAA,CAAI,qDAAA,EAAuD,MAAM,CAAA,CAAE,UAAW,CAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,YAAA,EAOlF,IAAI,GAAA,CAAI,2DAAA,EAA6D,MAAM,CAAA,CAAE,UAAW,CAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,YAAA,EAOxF,IAAI,GAAA,CAAI,2DAAA,EAA6D,MAAM,CAAA,CAAE,UAAW,CAAA;AAAA;AAAA;AAAA,CAAA,CAAA;AAIvG,CAAA;;;ACnIO,IAAM,QAAA,GAAW,CAAC,aAAA,KAAmD;AAC1E,EAAA,MAAM,sBAAsBa,MAAAA,CAGzB;AAAA,IACD,SAAS,EAAC;AAAA,IACV,QAAQ;AAAC,GACV,CAAA;AAED,EAAA,MAAM,iBAAA,GAAoBuB,WAAAA,CAAY,CAAC,QAAA,KAA4C;AACjF,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAI1C,IAAA,IAAI,YAAA,IAAgB,QAAA,IAAY,QAAA,CAAS,UAAA,EAAY;AACnD,MAAA,MAAA,CAAO,OAAA,CAAQ,SAAS,UAAU,CAAA,CAAE,QAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AAC5D,QAAA,IAAA,CAAK,YAAA,CAAa,KAAK,KAAe,CAAA;AAAA,MACxC,CAAC,CAAA;AAAA,IACH;AAEA,IAAA,IAAA,CAAK,MAAM,QAAA,CAAS,GAAA;AACpB,IAAA,IAAA,CAAK,KAAK,QAAA,CAAS,EAAA;AAEnB,IAAA,IAAI,SAAS,QAAA,EAAU;AACrB,MAAA,IAAA,CAAK,OAAO,QAAA,CAAS,GAAA;AAAA,IACvB,CAAA,MAAA,IAAW,MAAA,IAAU,QAAA,IAAY,QAAA,CAAS,IAAA,EAAM;AAC9C,MAAA,IAAA,CAAK,IAAA,GAAO,GAAA,CAAI,eAAA,CAAgB,QAAA,CAAS,IAAI,CAAA;AAAA,IAC/C;AAEA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,sBAAA,GAAyBA,YAAY,MAAM;AAC/C,IAAA,MAAM,EAAE,OAAA,EAAS,MAAA,EAAO,GAAI,mBAAA,CAAoB,OAAA;AAEhD,IAAA,CAAC,GAAG,OAAA,EAAS,GAAG,MAAM,CAAA,CAAE,QAAQ,CAAA,OAAA,KAAW;AACzC,MAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,QAAA,OAAA,CAAQ,UAAA,CAAW,YAAY,OAAO,CAAA;AAAA,MACxC;AAEA,MAAA,IAAI,mBAAmB,eAAA,IAAmB,OAAA,CAAQ,IAAA,CAAK,UAAA,CAAW,OAAO,CAAA,EAAG;AAC1E,QAAA,GAAA,CAAI,eAAA,CAAgB,QAAQ,IAAI,CAAA;AAAA,MAClC;AAAA,IACF,CAAC,CAAA;AAED,IAAA,mBAAA,CAAoB,OAAA,GAAU;AAAA,MAC5B,SAAS,EAAC;AAAA,MACV,QAAQ;AAAC,KACX;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,mBAAA,GAAsBA,WAAAA,CAAY,CAAC,SAAA,KAA8C;AACrF,IAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AAErC,IAAA,sBAAA,EAAuB;AAEvB,IAAA,IAAI,CAAC,SAAA,EAAW;AAEhB,IAAA,MAAM,EAAE,OAAA,EAAS,MAAA,EAAO,GAAI,SAAA;AAC5B,IAAA,MAAM,mBAAmB,mBAAA,CAAoB,OAAA;AAE7C,IAAA,OAAA,CAAQ,QAAQ,CAAA,QAAA,KAAY;AAC1B,MAAA,MAAM,OAAA,GAAU,kBAAkB,QAAQ,CAAA;AAC1C,MAAA,QAAA,CAAS,IAAA,CAAK,YAAA,CAAa,OAAA,EAAS,QAAA,CAAS,KAAK,UAAU,CAAA;AAC5D,MAAA,gBAAA,CAAiB,OAAA,CAAQ,KAAK,OAAO,CAAA;AAAA,IACvC,CAAC,CAAA;AAED,IAAA,MAAA,CAAO,QAAQ,CAAA,QAAA,KAAY;AACzB,MAAA,MAAM,OAAA,GAAU,kBAAkB,QAAQ,CAAA;AAC1C,MAAA,QAAA,CAAS,IAAA,CAAK,YAAY,OAAO,CAAA;AACjC,MAAA,gBAAA,CAAiB,MAAA,CAAO,KAAK,OAAO,CAAA;AAAA,IACtC,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,iBAAA,EAAmB,sBAAsB,CAAC,CAAA;AAE9C,EAAA,MAAM,kBAAA,GAAqBA,YAAY,MAAkD;AACvF,IAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,IAAA,MAAM,YAAY,QAAA,KAAa,SAAA;AAE/B,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,aAAa,kBAAA,EAAmB;AACtC,IAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,CAAC,UAAU,CAAA,EAAG,EAAE,IAAA,EAAM,UAAA,EAAY,CAAA;AAExD,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,MAAA;AAAA,MACJ,GAAA,EAAK,YAAA;AAAA,MACL;AAAA,KACF;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAAE,UAAU,MAAM;AACd,IAAA,mBAAA,CAAoB,iBAAiB,IAAI,CAAA;AAEzC,IAAA,OAAO,MAAM;AACX,MAAA,sBAAA,EAAuB;AAAA,IACzB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,aAAA,EAAe,mBAAA,EAAqB,sBAAsB,CAAC,CAAA;AAE/D,EAAA,OAAO;AAAA,IACL,mBAAA;AAAA,IACA,mBAAA,EAAqB,sBAAA;AAAA,IACrB;AAAA,GACF;AACF;;;AC9FA,IAAqB,cAArB,MAAiC;AAAA,EACd,SAAA,GAAY,CAAC,SAAS,CAAA;AAAA,EAC/B,UAAyB,EAAC;AAAA,EACjB,SAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EAEjB,WAAA,CAAY,KAAA,EAAuC,WAAA,EAAqD,SAAA,EAAuB;AAC7H,IAAA,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,CAAC,MAAA,KAAW;AACjC,MAAC,IAAA,CAAa,OAAO,MAAM,CAAA,GAAK,KAAa,IAAA,GAAO,MAAM,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAAA,IACvE,CAAC,CAAA;AACD,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,WAAA,GAAc,WAAA;AACnB,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,IAAA,CAAK,SAAA,GAAY,KAAK,iBAAA,EAAkB;AAAA,EAC1C;AAAA,EAEQ,mBAAA,GAA6C;AACnD,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,QAAA,EAAS,CAAE,OAAO,gBAAA,CAAiB,QAAA;AAAA,EACvD;AAAA,EAEQ,iBAAA,GAAoB;AAC1B,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,EAAa,OAAO,EAAC;AAE/B,IAAA,MAAM,eAA2B,EAAC;AAElC,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,QAAA,EAAS,CAAE,WAAA,CAAY,KAAA,GACnD,IAAA,CAAK,WAAA,CAAY,QAAA,GACjB,IAAA,CAAK,WAAA,CAAY,WAAA;AAErB,IAAA,KAAA,MAAW,aAAa,YAAA,EAAc;AACpC,MAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,SAAS,CAAA,CAAE,QAAA;AAExD,MAAA,IAAI,cAAA,EAAgB;AAClB,QAAA,MAAM,WAAA,GAAc,cAAc,cAAc,CAAA;AAEhD,QAAA,IAAI,aAAa,GAAA,EAAK;AACpB,UAAA,MAAA,CAAO,cAAA,CAAe,YAAA,EAAc,WAAA,CAAY,GAAA,EAAK;AAAA,YACnD,KAAA,EAAO;AAAA,cACL,SAAA;AAAA,cACA,WAAW,WAAA,CAAY;AAAA,aACzB;AAAA,YACA,QAAA,EAAU,KAAA;AAAA,YACV,UAAA,EAAY;AAAA,WACb,CAAA;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,YAAA;AAAA,EACT;AAAA,EAEA,OAAA,GAAU;AACR,IAAA,IAAA,CAAK,QAAQ,OAAA,CAAQ,CAAC,MAAM,IAAA,CAAK,SAAA,CAAU,CAAC,CAAC,CAAA;AAAA,EAC/C;AAAA,EAEA,UAAU,IAAA,EAAmB;AAC3B,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,CAAC,SAAA,KAAc;AACpC,MAAA,IAAA,CAAK,mBAAA;AAAA,QACH,SAAA;AAAA,QACC,IAAA,CAAa,OAAO,SAAS,CAAA;AAAA,QAC9B;AAAA,OACF;AAAA,IACF,CAAC,CAAA;AACD,IAAA,IAAA,CAAK,UAAU,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAC,CAAA,KAAM,MAAM,IAAI,CAAA;AAAA,EACtD;AAAA,EAEA,QAAQ,IAAA,EAAmB;AACzB,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS,IAAI,CAAA,EAAG;AACjC,IAAA,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,CAAC,SAAA,KAAc;AACpC,MAAA,IAAA,CAAK,iBAAiB,SAAA,EAAY,IAAA,CAAa,IAAA,GAAO,SAAS,GAAG,KAAK,CAAA;AAAA,IACzE,CAAC,CAAA;AACD,IAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,IAAI,CAAA;AAAA,EACxB;AAAA,EAEA,UAAU,CAAA,EAAkB;AAC1B,IAAA,MAAM,WAAA,GAAc,CAAC,oBAAA,CAAqB,QAAA,CAAS,aAAa,CAAA;AAEhE,IAAA,QAAO,EAAE,IAAA;AAAM,MACb,KAAK,OAAA;AACH,QAAA,WAAA,IAAe,IAAA,CAAK,SAAA,CAAU,aAAA,CAAc,CAAA,CAAE,QAAQ,CAAA;AACtD,QAAA;AAAA,MACF,KAAK,YAAA;AACH,QAAA,WAAA,IAAe,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,OAAO,CAAA;AAC5C,QAAA;AAAA,MACF,KAAK,WAAA;AACH,QAAA,WAAA,IAAe,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,MAAM,CAAA;AAC3C,QAAA;AAAA,MACF,KAAK,SAAA;AAAA,MACL,KAAK,QAAA;AACH,QAAA,WAAA,IAAe,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,IAAI,CAAA;AACzC,QAAA;AAAA,MACF,KAAK,WAAA;AAAA,MACL,KAAK,UAAA;AACH,QAAA,WAAA,IAAe,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,MAAM,CAAA;AAC3C,QAAA;AAAA,MACF,KAAK,MAAA;AACH,QAAA,WAAA,IAAe,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,MAAM,CAAA;AAC3C,QAAA;AAAA,MACF,KAAK,KAAA;AACH,QAAA,WAAA,IAAe,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,KAAK,CAAA;AAC1C,QAAA;AAAA,MACF;AACE,QAAA,IAAI,IAAA,CAAK,SAAA,CAAU,cAAA,CAAe,CAAA,CAAE,IAAI,CAAA,EAAG;AACzC,UAAA,MAAM,iBAAA,GAAoB,IAAA,CAAK,SAAA,CAAU,CAAA,CAAE,IAAI,CAAA;AAC/C,UAAA,MAAM,YAAA,GAAe,MAAA,CAAO,OAAA,CAAQ,iBAAA,CAAkB,SAAS,CAAA,CAAE,KAAA,CAAM,CAAE,CAAC,QAAA,EAAU,KAAK,CAAA,KAAO;AAC9F,YAAA,IAAI,aAAa,aAAA,EAAe;AAC9B,cAAA,OAAO,CAAA,CAAE,IAAA,CAAK,mBAAA,EAAqB,CAAA,KAAM,KAAA;AAAA,YAC3C,CAAA,MAAO;AACL,cAAA,OAAO,CAAA,CAAE,QAAyD,CAAA,KAAM,KAAA;AAAA,YAC1E;AAAA,UACF,CAAC,CAAA;AAED,UAAA,IAAI,YAAA,EAAc;AAChB,YAAA,CAAA,CAAE,cAAA,EAAe;AACjB,YAAA,IAAA,CAAK,SAAA,CAAU,YAAA,CAAa,iBAAA,CAAkB,SAAS,CAAA;AAAA,UACzD;AAAC,QACH;AACA,QAAA;AAAA;AACJ,EACF;AACF;ACtIA,IAAM,cAAA,GAAiB;AAAA,EACrB,8BAAsB,uBAAA;AAAA,EACtB,8BAAsB;AACxB,CAAA;AAEO,SAAS,oBAAoB,OAAA,EAAqC;AACvE,EAAA,MAAM;AAAA,IACJ,QAAA;AAAA,IACA,QAAA;AAAA,IACA,WAAA,GAAc,KAAA;AAAA,IACd,UAAA,GAAa,KAAA;AAAA,IACb,KAAA,GAAQ,KAAA;AAAA,IACR;AAAA,GACF,GAAI,OAAA;AAEJ,EAAA,OAAO1B,WAAAA;AAAA,IACL,8BAAA,CAAa,KAAA;AAAA,IACb,WAAW,sBAAA,GAAyB,qBAAA;AAAA,IACpC,WAAA,IAAe,yBAAA;AAAA,IACf,UAAA,IAAc,wBAAA;AAAA,IACd,QAAQ,mBAAA,GAAsB,sBAAA;AAAA,IAC9B,eAAe,QAAQ,CAAA;AAAA,IACvB,UAAA,GAAa,CAAA,cAAA,EAAkB,UAAA,CAAW,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,EAAY,GAAI,UAAA,CAAW,KAAA,CAAM,CAAC,CAAE,CAAA,CAAA,GAAK;AAAA,GAC/F;AACF","file":"chunk-H4J2VY7Z.mjs","sourcesContent":[":global(.thorium_web_layeredUI.thorium_web_isImmersive:not(.thorium_web_isHovering)) .hint {\n transform: translateY(calc(var(--th-icon-size, 24px) * 2.5));\n transition-property: transform;\n transition-duration: 200ms; \n transition-timing-function: ease-in-out;\n}\n\n:global(.thorium_web_layeredUI.thorium_web_isReflow.thorium_web_isScroll.thorium_web_isImmersive:not(.thorium_web_isHovering)) .hint {\n outline: 1px solid var(--th-theme-subdue);\n background-color: var(--th-theme-background);\n}\n\n.popover {\n background-color: var(--th-theme-background);\n color: var(--th-theme-text);\n padding: calc(var(--th-layout-spacing) / 2);\n border-radius: var(--th-layout-radius);\n border: 1px solid var(--th-theme-subdue);\n filter: drop-shadow(var(--th-theme-elevate));\n box-sizing: border-box;\n max-width: var(--th-layout-constraints-popover, 500px);\n width: max-content;\n}\n\n.menu {\n outline: none;\n}\n\n.menuItem {\n display: flex;\n align-items: center;\n gap: calc(var(--th-layout-spacing) / 2);\n padding: calc(var(--th-layout-spacing) / 2);\n border-radius: var(--th-layout-radius);\n outline: none;\n}\n\n.menuItem[data-hovered] {\n background-color: var(--th-theme-hover);\n}\n\n.menuItem[data-focus-visible] {\n outline: 2px solid var(--th-theme-focus);\n}\n\n.menuItem[data-disabled] {\n color: var(--th-theme-disable);\n}\n\n.menuItem > svg {\n width: calc(var(--th-icon-size, 24px) / 1.5);\n height: calc(var(--th-icon-size, 24px) / 1.5);\n fill: currentColor;\n}\n\n.menuItemLabel {\n font-size: 1rem;\n}\n\n.menuItemShortcut {\n font-family: monospace;\n font-weight: bold;\n color: var(--th-theme-subdue);\n padding: 5px;\n margin-inline-start: auto;\n border-radius: var(--th-layout-radius);\n border: 1px solid var(--th-theme-subdue);\n}","\"use client\";\n\nimport React from \"react\";\n\nimport { UnstableShortcut, UnstableShortcutRepresentation, buildShortcut, metaKeys } from \"@/core/Helpers/keyboardUtilities\";\n\nimport { Keyboard } from \"react-aria-components\";\n\nimport { usePreferences } from \"@/preferences/hooks/usePreferences\";\n\nimport { useAppSelector } from \"@/lib/hooks\";\n\nexport const UnstableStatefulShortcut = ({\n className,\n rawForm,\n representation,\n joiner\n}: UnstableShortcut) => {\n const { preferences } = usePreferences();\n const platformModifier = useAppSelector(state => state.reader.platformModifier);\n\n representation = representation ? representation : preferences.shortcuts.representation || UnstableShortcutRepresentation.symbol;\n joiner = joiner ? joiner : preferences.shortcuts.joiner || \" + \";\n\n const shortcutObj = buildShortcut(rawForm);\n\n if (shortcutObj) {\n let shortcutRepresentation = [];\n\n for (const prop in shortcutObj.modifiers) {\n if (shortcutObj.modifiers[prop]) {\n if (prop === \"platformKey\") {\n shortcutRepresentation.push(platformModifier[representation]);\n } else {\n const metaKey = metaKeys[prop];\n shortcutRepresentation.push(metaKey[representation as UnstableShortcutRepresentation]);\n }\n }\n }\n\n if (shortcutObj.char) {\n shortcutRepresentation.push(shortcutObj.char);\n }\n\n if (shortcutRepresentation.length > 0) {\n const displayShortcut = shortcutRepresentation.join(joiner);\n \n return (\n <Keyboard className={ className }>{ displayShortcut }</Keyboard>\n ) \n } else {\n return (\n <></>\n )\n }\n }\n\n return (\n <></>\n );\n}\n","\"use client\";\n\nimport React from \"react\";\n\nimport overflowMenuStyles from \"../assets/styles/thorium-web.overflow.module.css\";\n\nimport { Text } from \"react-aria-components\";\nimport { UnstableStatefulShortcut as StatefulShortcut } from \"./UnstableStatefulShortcut\";\n\nimport { ThMenuItem, ThMenuItemProps } from \"@/core/Components/Menu/ThMenuItem\";\n\nexport interface StatefulOverflowMenuItemProps extends Omit<ThMenuItemProps, \"shortcut\"> {\n shortcut?: string | null\n}\n\nexport const StatefulOverflowMenuItem = ({\n id,\n label,\n SVGIcon,\n shortcut = undefined,\n ...props\n}: StatefulOverflowMenuItemProps) => {\n const menuItemLabelId = `${id}-label`;\n \n return(\n <>\n <ThMenuItem \n id={ id } \n label={ label }\n className={ overflowMenuStyles.menuItem } \n aria-labelledby={ menuItemLabelId } \n { ...props }\n >\n { SVGIcon && <SVGIcon aria-hidden=\"true\" focusable=\"false\" /> }\n <Text \n className={ overflowMenuStyles.menuItemLabel } \n slot=\"label\"\n id={ menuItemLabelId }\n >\n { label }\n </Text>\n { shortcut && <StatefulShortcut\n className={ overflowMenuStyles.menuItemShortcut } \n rawForm={ shortcut } \n /> }\n </ThMenuItem>\n </>\n )\n}\n",".icon,\n.dockerButton,\n.closeButton,\n.backButton {\n box-sizing: border-box;\n padding: calc(var(--th-icon-size, 24px) * (1/4));\n text-align: center;\n border-radius: var(--th-layout-radius);\n line-height: 0;\n}\n\n.backButton {\n box-sizing: content-box;\n height: var(--th-icon-size, 24px);\n border: 2px solid transparent;\n display: flex;\n align-items: center;\n}\n\n.closeButton,\n.backButton {\n margin-inline-start: auto;\n}\n\n.icon svg,\n.dockerButton svg,\n.closeButton svg,\n.backButton svg {\n fill: var(--th-theme-text);\n width: var(--th-icon-size, 24px);\n height: var(--th-icon-size, 24px);\n}\n\n.icon[data-hovered],\n.dockerButton[data-hovered],\n.closeButton[data-hovered],\n.backButton[data-hovered] {\n background-color: var(--th-theme-hover);\n}\n\n.icon[data-focus-visible],\n.dockerButton[data-focus-visible],\n.closeButton[data-focus-visible],\n.backButton[data-focus-visible] {\n outline: 2px solid var(--th-theme-focus);\n}\n\n.backButton[data-disabled] {\n color: var(--th-theme-disable)\n}\n\n.icon[data-disabled] svg,\n.dockerButton[data-disabled] svg,\n.closeButton[data-disabled] svg,\n.backButton[data-disabled] svg {\n fill: var(--th-theme-disable);\n}\n\n.tooltip {\n background-color: var(--th-theme-text);\n color: var(--th-theme-background);\n padding: 5px;\n border-radius: var(--th-layout-radius);\n}\n\n/* Visibility + Immersive */\n\n.alwaysVisible {\n opacity: 1;\n}\n\n:global(.thorium_web_stackedUI.thorium_web_isImmersive:not(.thorium_web_isHovering)) .partiallyVisible {\n opacity: 0;\n}\n\n/* Utils to improve icons’ consistency */\n\n.iconCompSm {\n padding: calc(var(--th-icon-size, 24px) * (1/3));\n}\n\n.iconCompSm svg {\n width: calc(var(--th-icon-size, 24px) * (3/4));\n height: calc(var(--th-icon-size, 24px) * (3/4));\n stroke: var(--th-theme-text);\n}\n\n.iconCompLg {\n padding: calc(var(--th-icon-size, 24px) * (1/6));\n}\n\n.iconCompLg svg {\n width: calc(var(--th-icon-size, 24px) * (4/3));\n height: calc(var(--th-icon-size, 24px) * (4/3));\n}\n\n.iconApplyStroke svg {\n stroke: var(--th-theme-text);\n}","\"use client\";\n\nimport React, { useRef } from \"react\";\n\nimport { TooltipProps } from \"react-aria-components\";\nimport { ThCollapsibilityVisibility } from \"@/core/Components/Actions/hooks/useCollapsibility\";\n\nimport readerSharedUI from \"../../assets/styles/thorium-web.button.module.css\";\n\nimport { ThActionButton, ThActionButtonProps } from \"@/core/Components/Buttons/ThActionButton\";\n\nimport { usePreferences } from \"@/preferences/hooks/usePreferences\";\n\nimport { useAppDispatch, useAppSelector } from \"@/lib/hooks\";\nimport { setImmersive } from \"@/lib/readerReducer\";\n\nimport { isActiveElement, isKeyboardTriggered } from \"@/core/Helpers/focusUtilities\";\n\nimport classNames from \"classnames\";\n\nexport interface StatefulActionIconProps extends ThActionButtonProps {\n visibility?: ThCollapsibilityVisibility;\n placement?: TooltipProps[\"placement\"];\n tooltipLabel?: string;\n}\n\nexport const StatefulActionIcon = ({\n visibility,\n placement,\n tooltipLabel,\n children,\n ...props\n}: StatefulActionIconProps) => {\n const { preferences } = usePreferences();\n\n const triggerRef = useRef<HTMLButtonElement>(null);\n\n const dispatch = useAppDispatch();\n\n const handleClassNameFromState = () => {\n let className = \"\";\n \n switch(visibility) {\n case ThCollapsibilityVisibility.always:\n className = readerSharedUI.alwaysVisible;\n break;\n case ThCollapsibilityVisibility.partially:\n className = readerSharedUI.partiallyVisible;\n break;\n case ThCollapsibilityVisibility.overflow:\n default:\n break;\n }\n\n return className\n };\n\n const defaultOnPressFunc = () => {\n dispatch(setImmersive(false));\n };\n\n const handleImmersive = (event: React.FocusEvent) => {\n // Check whether the focus was triggered by keyboard…\n // We don’t have access to type/modality, unlike onPress\n if (isKeyboardTriggered(event.target)) {\n dispatch(setImmersive(false));\n }\n };\n\n const blurOnEsc = (event: React.KeyboardEvent) => {\n // TODO: handle Tooltip cos first time you press esc, it’s the tooltip that is closed.\n if (triggerRef.current && isActiveElement(triggerRef.current) && event.code === \"Escape\") {\n triggerRef.current.blur();\n }\n };\n\n return (\n <ThActionButton\n ref={ triggerRef }\n className={ classNames(readerSharedUI.icon, handleClassNameFromState(), props.className) } \n onPress={ props.onPress || defaultOnPressFunc }\n onKeyDown={ blurOnEsc } \n onFocus={ handleImmersive }\n compounds={ tooltipLabel ? {\n tooltipTrigger: {\n delay: preferences.theming.icon.tooltipDelay,\n closeDelay: preferences.theming.icon.tooltipDelay\n },\n tooltip: {\n className: readerSharedUI.tooltip,\n placement: placement,\n offset: preferences.theming.icon.tooltipOffset || 0\n },\n label: tooltipLabel\n } : undefined }\n { ...Object.fromEntries(Object.entries(props).filter(([key]) => key !== \"className\")) }\n >\n { children }\n </ThActionButton>\n )\n};","import * as React from \"react\";\nconst SvgFullscreen = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"inherit\" {...props}><path d=\"M120-120v-200h80v120h120v80H120Zm520 0v-80h120v-120h80v200H640ZM120-640v-200h200v80H200v120h-80Zm640 0v-120H640v-80h200v200h-80Z\" /></svg>;\nexport default SvgFullscreen;","import * as React from \"react\";\nconst SvgFullscreenExit = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"inherit\" {...props}><path d=\"M240-120v-120H120v-80h200v200h-80Zm400 0v-200h200v80H720v120h-80ZM120-640v-80h120v-120h80v200H120Zm520 0v-200h80v120h120v80H640Z\" /></svg>;\nexport default SvgFullscreenExit;","\"use client\";\n\nimport { useCallback } from \"react\";\n\nimport { ThActionsKeys } from \"@/preferences/models\";\nimport { StatefulActionTriggerProps } from \"../models/actions\";\nimport { ThActionsTriggerVariant } from \"@/core/Components/Actions/ThActionsBar\";\n\nimport readerSharedUI from \"../../assets/styles/thorium-web.button.module.css\";\n\nimport FullscreenCorners from \"./assets/icons/fullscreen.svg\";\nimport FullscreenExit from \"./assets/icons/fullscreen_exit.svg\";\n\nimport { StatefulOverflowMenuItem } from \"../Triggers/StatefulOverflowMenuItem\";\nimport { StatefulActionIcon } from \"../Triggers/StatefulActionIcon\";\n\nimport { usePreferences } from \"@/preferences/hooks/usePreferences\";\nimport { useFullscreen } from \"@/core/Hooks/useFullscreen\";\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { useAppDispatch } from \"@/lib/hooks\";\nimport { setFullscreen, setHovering } from \"@/lib/readerReducer\";\nimport { isIOSish } from \"@/core/Helpers/getPlatform\";\n\nexport const StatefulFullscreenTrigger = ({ variant }: StatefulActionTriggerProps) => {\n // Note: Not using React Aria ToggleButton here as fullscreen is quite\n // difficult to control in isolation due to collapsibility + shortcuts\n\n const { preferences } = usePreferences();\n const { t } = useI18n();\n\n const dispatch = useAppDispatch();\n const onChange = useCallback((isFullscreen: boolean) => {\n dispatch(setFullscreen(isFullscreen));\n }, [dispatch]);\n \n const fs = useFullscreen(onChange);\n\n const label = fs.isFullscreen ? t(\"reader.fullscreen.close\") : t(\"reader.fullscreen.trigger\");\n const Icon = fs.isFullscreen ? FullscreenExit : FullscreenCorners;\n\n const handlePress = () => {\n fs.handleFullscreen();\n // Has to be dispatched manually, otherwise stays true… \n dispatch(setHovering(false));\n // TODO: fix hover state on exit, if even possible w/o a lot of getting around…\n };\n\n // Per React doc/principles this isn’t common but FullScreen is quite an edge case cos’ of iPadOS…\n // And Actions is still a work in progress, with opportunities to rewrite/refactor\n // Note we don’t check window.matchMedia(\"(display-mode: standalone)\").matches as this is not a PWA yet\n // And more values here: https://web.dev/learn/pwa/detection\n if (!document.fullscreenEnabled || isIOSish()) return null;\n\n return(\n <>\n { (variant && variant === ThActionsTriggerVariant.menu) \n ? <StatefulOverflowMenuItem \n label={ label }\n SVGIcon={ Icon } \n shortcut={ preferences.actions.keys[ThActionsKeys.fullscreen].shortcut }\n onAction={ fs.handleFullscreen } \n id={ ThActionsKeys.fullscreen }\n />\n : <StatefulActionIcon \n className={ readerSharedUI.iconCompSm }\n visibility={ preferences.actions.keys[ThActionsKeys.fullscreen].visibility } \n aria-label={ label }\n placement=\"bottom\" \n tooltipLabel={ t(\"reader.fullscreen.tooltip\") } \n onPress={ handlePress } \n >\n <Icon aria-hidden=\"true\" focusable=\"false\" />\n </StatefulActionIcon>\n } \n </>\n )\n}","import * as React from \"react\";\nconst SvgMoreVert = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"inherit\" {...props}><path d=\"M480-160q-33 0-56.5-23.5T400-240q0-33 23.5-56.5T480-320q33 0 56.5 23.5T560-240q0 33-23.5 56.5T480-160Zm0-240q-33 0-56.5-23.5T400-480q0-33 23.5-56.5T480-560q33 0 56.5 23.5T560-480q0 33-23.5 56.5T480-400Zm0-240q-33 0-56.5-23.5T400-720q0-33 23.5-56.5T480-800q33 0 56.5 23.5T560-720q0 33-23.5 56.5T480-640Z\" /></svg>;\nexport default SvgMoreVert;","\"use client\";\n\nimport React, { ReactNode, RefObject } from \"react\";\n\nimport overflowMenuStyles from \"./assets/styles/thorium-web.overflow.module.css\";\n\nimport MenuIcon from \"./assets/icons/more_vert.svg\";\n\nimport { ThCollapsibilityVisibility } from \"@/core/Components/Actions/hooks/useCollapsibility\";\nimport { ThMenu } from \"@/core/Components/Menu/ThMenu\";\nimport { ThActionsKeys, ThDockingKeys } from \"@/preferences/models\";\nimport { StatefulActionIcon } from \"./Triggers/StatefulActionIcon\";\nimport { ThActionEntry } from \"@/core/Components/Actions/ThActionsBar\";\n\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { useAppDispatch } from \"@/lib/hooks\";\nimport { setOverflow } from \"@/lib/actionsReducer\";\n\nexport interface StatefulOverflowMenuProps {\n id: string;\n items: ThActionEntry<string | ThActionsKeys | ThDockingKeys>[];\n triggerRef: RefObject<HTMLElement | null>;\n className?: string;\n children?: ReactNode;\n}\n\nexport const StatefulOverflowMenu = ({ \n id,\n className, \n items,\n triggerRef\n}: StatefulOverflowMenuProps) => {\n const { t } = useI18n();\n const dispatch = useAppDispatch();\n\n const toggleMenuState = (value: boolean) => {\n dispatch(setOverflow({\n key: id,\n isOpen: value\n }));\n }\n\n if (items.length > 0) {\n return (\n <>\n <ThMenu \n id={ id }\n triggerRef={ triggerRef }\n selectionMode=\"none\" \n className={ overflowMenuStyles.menu }\n dependencies={ [\"Trigger\"] }\n items={ items }\n compounds={{\n menuTrigger: {\n onOpenChange: (val: boolean) => toggleMenuState(val)\n },\n popover: {\n placement: \"bottom\",\n className: overflowMenuStyles.popover\n },\n button: (\n <StatefulActionIcon\n className={ className ? className : overflowMenuStyles.button }\n aria-label={ t(\"reader.overflowMenu.active.trigger\") }\n placement=\"bottom\"\n tooltipLabel={ t(\"reader.overflowMenu.active.tooltip\") }\n visibility={ ThCollapsibilityVisibility.always }\n >\n <MenuIcon aria-hidden=\"true\" focusable=\"false\" />\n </StatefulActionIcon>\n ),\n }}\n />\n </>\n )\n }\n}","\"use client\";\n\nimport { useRef } from \"react\";\n\nimport { ThActionsKeys, ThDockingKeys } from \"@/preferences\";\n\nimport { ThActionEntry } from \"@/core/Components/Actions/ThActionsBar\";\nimport { ThCollapsibleActionsBar, ThCollapsibleActionsBarProps } from \"@/core/Components/Actions/ThCollapsibleActionsBar\";\nimport { StatefulOverflowMenu } from \"./StatefulOverflowMenu\";\n\nimport { useAppSelector } from \"@/lib/hooks\";\n\nexport interface StatefulCollapsibleActionsBarProps extends ThCollapsibleActionsBarProps {\n items: ThActionEntry<string | ThActionsKeys | ThDockingKeys>[];\n overflowMenuClassName?: string;\n}\n\nexport const StatefulCollapsibleActionsBar = ({\n id, \n items,\n overflowMenuClassName,\n ...props\n}: StatefulCollapsibleActionsBarProps) => {\n const ref = useRef<HTMLDivElement | null>(null);\n const breakpoint = useAppSelector(state => state.theming.breakpoint);\n\n return (\n <>\n <ThCollapsibleActionsBar \n ref={ ref }\n id={ id }\n items={ items }\n breakpoint={ breakpoint }\n compounds={{\n menu: (<StatefulOverflowMenu \n id={ id }\n triggerRef={ ref }\n className={ overflowMenuClassName } \n items={ [] }\n />) }}\n { ...props }\n />\n </>\n )\n}\n","import { createContext, useContext } from \"react\";\n\ninterface NavigatorContextValue {\n navigator: any;\n}\n\nconst NavigatorContext = createContext<NavigatorContextValue | null>(null);\n\ninterface NavigatorProviderProps {\n navigator: any;\n children: React.ReactNode;\n}\n\nexport const NavigatorProvider = ({ navigator, children }: NavigatorProviderProps) => {\n return (\n <NavigatorContext.Provider value={{ navigator }}>\n { children }\n </NavigatorContext.Provider>\n );\n}\n\nexport const useNavigatorContext = () => {\n const context = useContext(NavigatorContext);\n if (!context) {\n throw new Error(\"Navigator hooks must be used within NavigatorProvider\");\n }\n return context.navigator;\n}","import { useNavigatorContext } from \"../NavigatorProvider\";\n\n// Visual Navigator Hook (specific to visual navigators)\nexport const useVisualNavigator = () => {\n const navigator = useNavigatorContext();\n \n if (!navigator.goLink || !navigator.goForward) {\n throw new Error(\"Provided navigator does not support visual navigation\");\n }\n \n return navigator;\n}\n\nexport const useNavigator = () => {\n return useNavigatorContext();\n}","/* React Aria modal provides a visual viewport for mobile + keyboard: --visual-viewport-height \n which should explain why it’s being used here while not mentioned anywhere else in the codebase */\n\n.fullscreen {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 10;\n overflow-y: auto;\n scroll-padding-top: calc(var(--th-sheet-sticky-header, 80px) + var(--th-layout-spacing));\n scroll-padding-bottom: var(--th-layout-spacing);\n box-sizing: border-box;\n width: 100%;\n height: 100%;\n max-height: var(--visual-viewport-height, 100dvh);\n background-color: var(--th-theme-background);\n color: var(--th-theme-text);\n align-items: center;\n}\n\n.popover {\n overflow-y: auto;\n scroll-padding-top: calc(var(--th-sheet-sticky-header, 80px) + var(--th-layout-spacing));\n scroll-padding-bottom: var(--th-layout-spacing);\n box-sizing: border-box;\n width: calc(340px + (2 * var(--th-layout-spacing)));\n max-width: var(--th-layout-constraints-popover, 500px);\n max-height: 100%;\n max-height: var(--visual-viewport-height, 100dvh);\n padding: 0;\n background-color: var(--th-theme-background);\n color: var(--th-theme-text);\n border-radius: var(--th-layout-radius);\n border: 1px solid var(--th-theme-subdue);\n filter: drop-shadow(var(--th-theme-elevate));\n}\n\n/* React Modal Sheet handles scroll + sticky header so no need for scroll-padding here */\n.draggable {\n box-sizing: border-box;\n max-width: var(--th-layout-constraints-bottomSheet, 600px);\n left: max(calc((100% - var(--th-layout-constraints-bottomSheet, 600px)) / 2), 0px) !important;\n background-color: var(--th-theme-background) !important;\n color: var(--th-theme-text) !important;\n border: none;\n /* Animating drop-shadow pretty much kills performance, hence why we use a pseudo-element */\n filter: none !important;\n box-shadow: none !important;\n /* M3 = 28dp, see https://m3.material.io/components/bottom-sheets/overview */\n border-top-left-radius: 28px !important;\n border-top-right-radius: 28px !important;\n transition: border-radius 500ms;\n}\n\n.draggable::after {\n content: \"\";\n z-index: -1;\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n /* important for performance */\n transform: translateZ(0);\n box-shadow: var(--th-theme-elevate);\n border-top-left-radius: 28px;\n border-top-right-radius: 28px;\n}\n\n.draggableFullHeightDetent {\n height: calc(100% - env(safe-area-inset-top)) !important;\n}\n\n.draggableContentHeightDetent {\n max-height: calc(100% - env(safe-area-inset-top)) !important;\n}\n\n.draggable[data-full-height] {\n border-top-left-radius: 0 !important;\n border-top-right-radius: 0 !important;\n transition: border-radius 500ms;\n}\n\n.draggableBackdrop {\n /* So that React Aria can use it to dismiss the sheet as it’s set to none by React Modal Sheet. */\n pointer-events: auto !important;\n background-color: transparent !important;\n}\n\n.draggableScrim {\n background-color: var(--th-layout-defaults-scrim) !important;\n}\n\n.draggableContainer {\n padding: 0;\n background-color: var(--th-theme-background);\n color: var(--th-theme-text);\n}\n\n.draggableScroller {\n position: relative;\n scroll-padding-bottom: calc(var(--th-layout-spacing) * 4);\n}\n\n.dragIndicator {\n width: calc(var(--th-icon-size, 40px) * 1.5);\n position: absolute;\n top: 0;\n left: 50%;\n transform: translateX(-50%);\n}\n\n.dragIndicator[data-focus-visible] {\n border-radius: var(--th-layout-radius);\n outline: 2px solid var(--th-theme-focus);\n}\n\n.dragIndicator svg {\n fill: var(--th-theme-subdue);\n width: 100%;\n height: auto;\n}\n\n.docked {\n /* We need relative positioning so that RAC FocusScope scrolls properly on tabbing */\n position: relative;\n overflow-y: auto;\n scroll-padding-top: calc(var(--th-sheet-sticky-header, 80px) + var(--th-layout-spacing));\n scroll-padding-bottom: var(--th-layout-spacing);\n box-sizing: border-box;\n width: 100%;\n max-width: 100%;\n height: 100vh;\n height: 100dvh;\n background-color: var(--th-theme-background);\n color: var(--th-theme-text);\n}\n\n.dockedLeftBorder {\n border-right: 1px solid var(--th-theme-subdue);\n}\n\n.dockedRightBorder {\n border-left: 1px solid var(--th-theme-subdue);\n}\n\n.dialog {\n outline: none;\n}\n\n.header {\n display: flex;\n align-items: center;\n position: sticky;\n top: 0;\n left: 0;\n right: 0;\n z-index: 10;\n padding: calc(var(--th-layout-spacing) / 2) var(--th-layout-spacing);\n background-color: var(--th-theme-background);\n border-bottom: 1px solid var(--th-theme-subdue);\n}\n\n.draggableHeader {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n background-color: var(--th-theme-background);\n border-bottom: 1px solid var(--th-theme-subdue);\n padding: var(--th-layout-spacing) var(--th-layout-spacing) calc(var(--th-layout-spacing) / 2) var(--th-layout-spacing);\n /* Otherwise covers the modal’s */\n border-top-left-radius: 28px !important;\n border-top-right-radius: 28px !important;\n transition: border-radius 500ms;\n}\n\n.draggable[data-full-height] .draggableHeader {\n /* Otherwise covers the modal’s */\n border-top-left-radius: 0 !important;\n border-top-right-radius: 0 !important;\n transition: border-radius 500ms;\n}\n\n.heading {\n font-size: 1.25rem;\n line-height: 1;\n margin: 0;\n padding: 0;\n}\n\n.body {\n padding: var(--th-layout-spacing);\n}",".dockerWrapper {\n margin-inline-start: auto;\n margin-inline-end: calc(var(--th-icon-size, 24px) * (1 / 4) * -1); /* Optical alingment */\n display: flex;\n gap: 2px;\n padding-inline-start: var(--th-layout-spacing);\n}\n\n.docker {\n display: flex;\n gap: 2px;\n}\n\n.resizeHandle {\n position: relative;\n width: 0;\n}\n\n.resizeHandle:focus-visible {\n outline: 2px solid var(--th-theme-focus);\n}\n\n.resizeHandleGrab {\n position: absolute;\n z-index: 1000;\n top: 50%;\n transform: translateY(-50%);\n width: 5px;\n height: 50px;\n border-radius: 5px;\n background-color: var(--th-theme-subdue);\n}\n\n.resizeHandleGrabLeft {\n left: 0;\n}\n\n.resizeHandleGrabRight {\n left: -5px;\n}","import * as React from \"react\";\nconst SvgDockToRight = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"inherit\" {...props}><path d=\"M200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h560q33 0 56.5 23.5T840-760v560q0 33-23.5 56.5T760-120H200Zm120-80v-560H200v560h120Zm80 0h360v-560H400v560Zm-80 0H200h120Z\" /></svg>;\nexport default SvgDockToRight;","import * as React from \"react\";\nconst SvgDockToLeft = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"inherit\" {...props}><path d=\"M200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h560q33 0 56.5 23.5T840-760v560q0 33-23.5 56.5T760-120H200Zm440-80h120v-560H640v560Zm-80 0v-560H200v560h360Zm80 0h120-120Z\" /></svg>;\nexport default SvgDockToLeft;","\"use client\";\n\nimport { useCallback } from \"react\";\n\nimport readerSharedUI from \"../assets/styles/thorium-web.button.module.css\";\n\nimport { StatefulActionTriggerProps } from \"@/components/Actions/models/actions\";\nimport { ThActionsTriggerVariant } from \"@/core/Components/Actions/ThActionsBar\";\nimport { ThDockingKeys, ThLayoutDirection } from \"@/preferences/models\";\n\nimport DockToLeft from \"./assets/icons/dock_to_right.svg\";\nimport DocktoRight from \"./assets/icons/dock_to_left.svg\";\n\nimport { StatefulActionIcon } from \"../Actions/Triggers/StatefulActionIcon\";\nimport { StatefulOverflowMenuItem } from \"../Actions/Triggers/StatefulOverflowMenuItem\";\n\nimport { useActions } from \"@/core/Components/Actions/hooks/useActions\";\nimport { usePreferences } from \"@/preferences/hooks/usePreferences\";\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { useAppDispatch, useAppSelector } from \"@/lib/hooks\";\nimport { dockAction } from \"@/lib/actionsReducer\";\n\nexport const StatefulDockStart = ({ variant, associatedKey }: StatefulActionTriggerProps) => {\n const { preferences } = usePreferences();\n const { t } = useI18n();\n const direction = useAppSelector(state => state.reader.direction);\n const actionsMap = useAppSelector(state => state.actions.keys);\n const isRTL = direction === ThLayoutDirection.rtl;\n const translationKey = isRTL \n ? \"reader.app.docker.dockToRight\" \n : \"reader.app.docker.dockToLeft\";\n const localeKey = {\n trigger: t(`${ translationKey }.trigger`),\n tooltip: t(`${ translationKey }.tooltip`)\n };\n\n const actions = useActions(actionsMap);\n const isDisabled = actions.whichDocked(associatedKey) === ThDockingKeys.start;\n \n const dispatch = useAppDispatch();\n\n const handlePress = useCallback(() => {\n if (associatedKey) {\n dispatch(dockAction({\n key: associatedKey,\n dockingKey: ThDockingKeys.start\n }))\n }\n }, [dispatch, associatedKey]);\n \n return(\n <>\n { (variant && variant === ThActionsTriggerVariant.menu) \n ? <StatefulOverflowMenuItem \n label={ localeKey.trigger }\n SVGIcon={ isRTL ? DocktoRight : DockToLeft } \n shortcut={ preferences.docking.keys[ThDockingKeys.start].shortcut }\n onAction={ handlePress } \n id={ `${ ThDockingKeys.start }-${ associatedKey }` }\n isDisabled={ isDisabled }\n />\n : <StatefulActionIcon \n className={ readerSharedUI.dockerButton } \n aria-label={ localeKey.trigger }\n placement=\"bottom\" \n tooltipLabel={ localeKey.tooltip } \n onPress={ handlePress } \n isDisabled={ isDisabled }\n >\n { isRTL \n ? <DocktoRight aria-hidden=\"true\" focusable=\"false\" /> \n : <DockToLeft aria-hidden=\"true\" focusable=\"false\" /> \n }\n </StatefulActionIcon>\n }\n </>\n )\n}","\"use client\";\n\nimport { useCallback } from \"react\";\n\nimport readerSharedUI from \"../assets/styles/thorium-web.button.module.css\";\n\nimport { StatefulActionTriggerProps } from \"@/components/Actions/models/actions\";\nimport { ThActionsTriggerVariant } from \"@/core/Components/Actions/ThActionsBar\";\nimport { ThDockingKeys, ThLayoutDirection } from \"@/preferences/models\";\n\nimport DockToLeft from \"./assets/icons/dock_to_right.svg\";\nimport DocktoRight from \"./assets/icons/dock_to_left.svg\";\n\nimport { StatefulActionIcon } from \"../Actions/Triggers/StatefulActionIcon\";\nimport { StatefulOverflowMenuItem } from \"../Actions/Triggers/StatefulOverflowMenuItem\";\n\nimport { useActions } from \"@/core/Components/Actions/hooks/useActions\";\nimport { usePreferences } from \"@/preferences/hooks/usePreferences\";\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { useAppDispatch, useAppSelector } from \"@/lib/hooks\";\nimport { dockAction } from \"@/lib/actionsReducer\";\n\nexport const StatefulDockEnd = ({ variant, associatedKey }: StatefulActionTriggerProps) => {\n const { preferences } = usePreferences();\n const { t } = useI18n();\n const direction = useAppSelector(state => state.reader.direction);\n const actionsMap = useAppSelector(state => state.actions.keys);\n const isRTL = direction === ThLayoutDirection.rtl;\n const translationKey = isRTL \n ? \"reader.app.docker.dockToLeft\" \n : \"reader.app.docker.dockToRight\";\n const localeKey = {\n trigger: t(`${ translationKey }.trigger`),\n tooltip: t(`${ translationKey }.tooltip`)\n };\n\n const actions = useActions(actionsMap);\n const isDisabled = actions.whichDocked(associatedKey) === ThDockingKeys.end;\n\n const dispatch = useAppDispatch();\n \n const handlePress = useCallback(() => {\n if (associatedKey) {\n dispatch(dockAction({\n key: associatedKey,\n dockingKey: ThDockingKeys.end\n }))\n }\n }, [dispatch, associatedKey]);\n \n return(\n <>\n { (variant && variant === ThActionsTriggerVariant.menu) \n ? <StatefulOverflowMenuItem \n label={ localeKey.trigger }\n SVGIcon={ isRTL ? DockToLeft : DocktoRight } \n shortcut={ preferences.docking.keys[ThDockingKeys.end].shortcut }\n onAction={ handlePress } \n id={ `${ ThDockingKeys.end }-${ associatedKey }` }\n isDisabled={ isDisabled }\n />\n : <StatefulActionIcon \n className={ readerSharedUI.dockerButton } \n aria-label={ localeKey.trigger }\n placement=\"bottom\" \n tooltipLabel={ localeKey.tooltip } \n onPress={ handlePress } \n isDisabled={ isDisabled }\n >\n { isRTL \n ? <DocktoRight aria-hidden=\"true\" focusable=\"false\" /> \n : <DockToLeft aria-hidden=\"true\" focusable=\"false\" /> \n }\n </StatefulActionIcon>\n }\n </>\n )\n}","import * as React from \"react\";\nconst SvgStack = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"inherit\" {...props}><path d=\"M240-400v80h-80q-33 0-56.5-23.5T80-400v-400q0-33 23.5-56.5T160-880h400q33 0 56.5 23.5T640-800v80h-80v-80H160v400h80ZM400-80q-33 0-56.5-23.5T320-160v-400q0-33 23.5-56.5T400-640h400q33 0 56.5 23.5T880-560v400q0 33-23.5 56.5T800-80H400Zm0-80h400v-400H400v400Zm200-200Z\" /></svg>;\nexport default SvgStack;","\"use client\";\n\nimport { useCallback } from \"react\";\n\nimport readerSharedUI from \"../assets/styles/thorium-web.button.module.css\";\n\nimport { StatefulActionTriggerProps } from \"@/components/Actions/models/actions\";\nimport { ThActionsTriggerVariant } from \"@/core/Components/Actions/ThActionsBar\";\nimport { ThDockingKeys } from \"@/preferences/models\";\n\nimport Stack from \"./assets/icons/stack.svg\";\n\nimport { StatefulActionIcon } from \"../Actions/Triggers/StatefulActionIcon\";\nimport { StatefulOverflowMenuItem } from \"../Actions/Triggers/StatefulOverflowMenuItem\";\n\nimport { useActions } from \"@/core/Components/Actions/hooks/useActions\";\nimport { usePreferences } from \"@/preferences/hooks/usePreferences\";\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { useAppDispatch, useAppSelector } from \"@/lib/hooks\";\nimport { dockAction } from \"@/lib/actionsReducer\";\n\nexport const StatefulDockTransientPopover = ({ variant, associatedKey }: StatefulActionTriggerProps) => {\n const { preferences } = usePreferences();\n const { t } = useI18n();\n const actionsMap = useAppSelector(state => state.actions.keys);\n const actions = useActions(actionsMap);\n const isDisabled = !actions.isDocked(associatedKey) || actions.whichDocked(associatedKey) === ThDockingKeys.transient;\n \n const dispatch = useAppDispatch();\n\n const handlePress = useCallback(() => {\n if (associatedKey) {\n dispatch(dockAction({\n key: associatedKey,\n dockingKey: ThDockingKeys.transient\n }))\n }\n }, [dispatch, associatedKey]);\n \n return(\n <>\n { (variant && variant === ThActionsTriggerVariant.menu) \n ? <StatefulOverflowMenuItem \n label={ t(\"reader.app.docker.popover.trigger\") }\n SVGIcon={ Stack } \n shortcut={ preferences.docking.keys[ThDockingKeys.transient].shortcut }\n onAction={ handlePress } \n id={ `${ ThDockingKeys.transient }-${ associatedKey }` } \n isDisabled={ isDisabled }\n />\n : <StatefulActionIcon \n className={ readerSharedUI.dockerButton } \n aria-label={ t(\"reader.app.docker.popover.trigger\") }\n placement=\"bottom\" \n tooltipLabel={ t(\"reader.app.docker.popover.tooltip\") } \n onPress={ handlePress } \n isDisabled={ isDisabled }\n >\n <Stack aria-hidden=\"true\" focusable=\"false\" />\n </StatefulActionIcon>\n }\n </>\n )\n}","\"use client\";\n\nimport React, { useCallback } from \"react\";\n\nimport dockingStyles from \"./assets/styles/thorium-web.docking.module.css\";\nimport readerSharedUI from \"../assets/styles/thorium-web.button.module.css\";\n\nimport { ThDockingKeys } from \"@/preferences/models\";\n\nimport { Toolbar } from \"react-aria-components\";\n\nimport { ThCloseButton } from \"@/core/Components/Buttons/ThCloseButton\";\nimport { StatefulCollapsibleActionsBar } from \"../Actions/StatefulCollapsibleActionsBar\";\n\nimport { StatefulDockStart } from \"./StatefulDockStart\";\nimport { StatefulDockEnd } from \"./StatefulDockEnd\";\nimport { StatefulDockTransientPopover } from \"./StatefulDockTransientPopover\";\n\nimport { usePreferences } from \"@/preferences/hooks/usePreferences\";\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { ThActionEntry } from \"@/core/Components/Actions/ThActionsBar\";\nimport { ActionsStateKeys } from \"@/lib/actionsReducer\";\n\nconst dockingComponentsMap = {\n [ThDockingKeys.start]: {\n trigger: StatefulDockStart\n },\n [ThDockingKeys.end]: {\n trigger: StatefulDockEnd\n },\n [ThDockingKeys.transient]: {\n trigger: StatefulDockTransientPopover\n }\n}\n\nexport interface StatefulDockerProps {\n id: ActionsStateKeys;\n keys: ThDockingKeys[];\n ref: React.ForwardedRef<HTMLButtonElement>;\n onClose: () => void;\n}\n\nexport const StatefulDocker = ({\n id,\n keys,\n ref,\n onClose\n}: StatefulDockerProps) => {\n const { preferences } = usePreferences();\n const { t } = useI18n();\n \n const listActionItems = useCallback(() => {\n const actionsItems: ThActionEntry<ThDockingKeys>[] = [];\n\n keys.map((key) => {\n actionsItems.push({\n Trigger: dockingComponentsMap[key].trigger,\n key: key,\n associatedKey: id\n })\n });\n\n return actionsItems;\n }, [keys, id]);\n\n return(\n <>\n <Toolbar className={ dockingStyles.dockerWrapper }>\n <StatefulCollapsibleActionsBar \n id={ `${ id }-docker-overflowMenu` }\n items={ listActionItems() }\n className={ dockingStyles.docker } \n overflowMenuClassName={ readerSharedUI.dockerButton }\n prefs={ preferences.docking }\n aria-label={ t(\"reader.app.docker.wrapper\") }\n />\n\n <ThCloseButton \n ref={ ref }\n className={ readerSharedUI.dockerButton } \n aria-label={ t(\"common.actions.close\") } \n onPress={ onClose }\n compounds={ {\n tooltipTrigger: {\n delay: preferences.theming.icon.tooltipDelay,\n closeDelay: preferences.theming.icon.tooltipDelay\n },\n tooltip: {\n className: readerSharedUI.tooltip\n },\n label: t(\"common.actions.close\")\n }}\n />\n </Toolbar>\n </>\n )\n}\n\n","import { useEffect } from \"react\";\n\nimport { useNavigator } from \"@/core/Navigator\";\n\nimport { useAppSelector } from \"@/lib\";\n\n/** For some unknown reason, React Aria Components’ Popover and Modal Components\n * are breaking scroll on webkit based browsers in version 1.11.0. \n * It is all the more mind-boggling that the hook we are using for \n * the Bottom Sheet don’t seem to be affected by this issue – but it could be forcing\n * a reflow thanks to its animation. \n * \n * NOTE: This is treating the symptoms and is unsustainable in the long run. \n * We have to find the root cause of this issue and fix it, \n * especially as TS-Toolkit already resolves this bug\n * when the resources are loaded into the iframe directly as scroll. \n*/\nexport const useWebkitPatch = (isOpen: boolean) => {\n const profile = useAppSelector(state => state.reader.profile);\n const isWebPub = profile === \"webPub\";\n const scroll = useAppSelector(state => state.settings.scroll);\n const isFXL = useAppSelector(state => state.publication.isFXL);\n const isScroll = isWebPub || (scroll && !isFXL);\n\n const {\n getCframes\n } = useNavigator();\n\n useEffect(() => {\n if (isScroll && !isOpen) {\n // We have to force a reflow on the iframe container to fix the issue.\n // Using the infamous Recalc technique (adding a style element with *{}) \n // in the iframe contentDocument does not work.\n const container = document.getElementById(\"thorium-web-container\");\n if (!container) return;\n\n const currentHeight = container.offsetHeight;\n container.style.height = `${ currentHeight - 1 }px`;\n\n // Otherwise Safari will ignore the reflow.\n setTimeout(() => {\n container.style.height = \"\";\n\n // This is where it becomes unsustainable, because we have to \n // force a scroll on the iframe scrolling element so that Safari\n // even renders the content that is below the viewport…\n // We only have access to the iframe scrolling element\n // because we are on the same origin…\n const frame = getCframes()?.[0];\n if (!frame?.window?.document?.scrollingElement) return;\n\n const currentScrollTop = frame.window.document.scrollingElement.scrollTop;\n\n if (currentScrollTop > 1) {\n frame.window.document.scrollingElement.scrollTop = currentScrollTop - 1;\n } else {\n frame.window.document.scrollingElement.scrollTop = currentScrollTop + 1;\n }\n\n frame.window.document.scrollingElement.scrollTop = currentScrollTop;\n }, 0);\n }\n }, [isScroll, isOpen, getCframes]);\n};\n","\"use client\";\n\nimport React, { useRef, useEffect } from \"react\";\n\nimport { StatefulSheet } from \"./models/sheets\";\nimport { ThSheetHeaderVariant } from \"@/preferences/models\";\n\nimport sheetStyles from \"./assets/styles/thorium-web.sheets.module.css\";\nimport readerSharedUI from \"../assets/styles/thorium-web.button.module.css\";\n\nimport { PopoverProps } from \"react-aria-components\";\n\nimport { ThPopover } from \"@/core/Components/Containers/ThPopover\";\nimport { ThContainerHeader } from \"@/core/Components/Containers/ThContainerHeader\";\nimport { ThContainerBody } from \"@/core/Components/Containers/ThContainerBody\";\nimport { ThNavigationButton } from \"@/core/Components/Buttons/ThNavigationButton\";\nimport { StatefulDocker } from \"../Docking/StatefulDocker\";\n\nimport { useI18n } from \"@/i18n\";\nimport { useWebkitPatch } from \"./hooks/useWebkitPatch\";\n\nimport { useAppSelector } from \"@/lib/hooks\";\n\nimport classNames from \"classnames\";\nimport { prefixString } from \"@/core/Helpers/prefixString\";\n\nexport interface StatefulPopoverSheetProps extends StatefulSheet {\n placement?: PopoverProps[\"placement\"];\n}\n\nexport const StatefulPopoverSheet = ({ \n id,\n triggerRef,\n heading,\n headerVariant,\n className, \n isOpen,\n onOpenChange, \n onClosePress,\n placement,\n docker,\n children,\n resetFocus,\n focusWithinRef,\n focusSelector,\n scrollTopOnFocus,\n dismissEscapeKeyClose\n }: StatefulPopoverSheetProps) => {\n const { t } = useI18n()\n const direction = useAppSelector(state => state.reader.direction);\n const popoverRef = useRef<HTMLDivElement | null>(null);\n const popoverHeaderRef = useRef<HTMLDivElement | null>(null);\n const popoverBodyRef = useRef<HTMLDivElement | null>(null);\n const popoverCloseRef = useRef<HTMLButtonElement | null>(null);\n\n // Update the CSS variable when the popover is open and header ref is available\n useEffect(() => {\n if (isOpen && popoverRef.current && popoverHeaderRef.current) {\n popoverRef.current.style.setProperty(\n `--${ prefixString(\"sheet-sticky-header\") }`,\n `${ popoverHeaderRef.current.clientHeight }px`\n );\n }\n }, [isOpen]);\n\n // Warning: This is a temporary fix for a bug in React Aria Components.\n useWebkitPatch(!!isOpen);\n\n if (React.Children.toArray(children).length > 0) {\n return(\n <>\n <ThPopover \n ref={ popoverRef }\n triggerRef={ triggerRef }\n focusOptions={{\n withinRef: focusWithinRef ?? popoverBodyRef,\n trackedState: isOpen,\n fallbackRef: popoverCloseRef,\n withSelector: focusSelector,\n action: {\n type: \"focus\",\n options: {\n preventScroll: scrollTopOnFocus ? true : false,\n scrollContainerToTop: scrollTopOnFocus\n }\n },\n updateState: resetFocus\n }}\n placement={ placement || \"bottom\" }\n className={ classNames(sheetStyles.popover , className) }\n isOpen={ isOpen }\n onOpenChange={ onOpenChange } \n isKeyboardDismissDisabled={ dismissEscapeKeyClose }\n compounds={{\n dialog: {\n className: sheetStyles.dialog\n }\n }}\n >\n <ThContainerHeader \n ref={ popoverHeaderRef }\n className={ sheetStyles.header }\n label={ heading }\n compounds={{\n heading: {\n className: sheetStyles.heading\n }\n }}\n >\n { headerVariant === ThSheetHeaderVariant.previous \n ? <ThNavigationButton \n direction={ direction === \"ltr\" ? \"left\" : \"right\" }\n label={ t(\"reader.app.back.trigger\") }\n ref={ popoverCloseRef }\n className={ classNames(className, readerSharedUI.backButton) } \n aria-label={ t(\"reader.app.back.trigger\") }\n onPress={ onClosePress }\n />\n : <StatefulDocker \n id={ id }\n keys={ docker || [] }\n ref={ popoverCloseRef }\n onClose={ onClosePress }\n />\n }\n </ThContainerHeader>\n <ThContainerBody\n ref={ popoverBodyRef }\n className={ sheetStyles.body }\n >\n { children }\n </ThContainerBody>\n </ThPopover>\n </>\n ) \n }\n}","\"use client\";\n\nimport React, { CSSProperties, KeyboardEvent, useCallback, useMemo, useRef } from \"react\";\n\nimport { ThBottomSheetDetent, ThSheetHeaderVariant } from \"@/preferences\";\n\nimport { StatefulSheet } from \"./models/sheets\";\n\nimport sheetStyles from \"./assets/styles/thorium-web.sheets.module.css\";\nimport readerSharedUI from \"../assets/styles/thorium-web.button.module.css\";\n\nimport { SheetRef, SheetDetent } from \"react-modal-sheet\";\n\nimport { ThBottomSheet } from \"@/core/Components/Containers/ThBottomSheet\";\nimport { ThContainerHeader } from \"@/core/Components/Containers/ThContainerHeader\";\nimport { ThContainerBody } from \"@/core/Components/Containers/ThContainerBody\";\nimport { ThNavigationButton } from \"@/core/Components/Buttons/ThNavigationButton\";\nimport { ThCloseButton } from \"@/core/Components/Buttons/ThCloseButton\";\n\nimport { usePreferences } from \"@/preferences/hooks/usePreferences\";\nimport { useI18n } from \"@/i18n\";\n\nimport { useAppSelector } from \"@/lib/hooks\";\n\nimport classNames from \"classnames\";\nimport { prefixString } from \"@/core/Helpers/prefixString\";\n\nexport interface StatefulBottomSheetProps extends StatefulSheet {};\n\nexport interface ScrimPref {\n active: boolean;\n override?: string;\n}\n\nconst DEFAULT_SNAPPOINTS = {\n min: 0.3,\n peek: 0.5,\n max: 1\n}\n\nexport const StatefulBottomSheet = ({\n id,\n heading,\n headerVariant,\n className, \n isOpen,\n onOpenChange, \n onClosePress,\n children,\n resetFocus,\n focusWithinRef,\n focusSelector,\n scrollTopOnFocus,\n dismissEscapeKeyClose\n}: StatefulBottomSheetProps) => {\n const { preferences } = usePreferences();\n const { t } = useI18n()\n const direction = useAppSelector((state) => state.reader.direction);\n const prefersReducedMotion = useAppSelector(state => state.theming.prefersReducedMotion);\n\n const sheetRef = useRef<SheetRef | null>(null);\n const sheetContainerRef = useRef<HTMLDivElement | null>(null);\n const bottomSheetBodyRef = useRef<HTMLDivElement | null>(null);\n const bottomSheetCloseRef = useRef<HTMLButtonElement | null>(null);\n\n const detent = useRef<ThBottomSheetDetent>(\"full-height\");\n const isDraggable = useRef<boolean>(true);\n\n const snapArray = useMemo(() => {\n // Val is always checked in 0...1 range\n const getSecureVal = (val: number, ref: number) => {\n if (val > ref) {\n return val;\n } else {\n return ((1 - ref) / 2) + ref;\n }\n };\n\n // Since v5\n // Array needs min @ index and max @ index 2 when complete\n // If it doesn’t have a max, then peek is @ index 1.\n let snapArray: number[] = [0];\n\n const snapPref = preferences.actions.keys[id as keyof typeof preferences.actions.keys].snapped;\n if (snapPref) {\n // We must start with minHeight to see if it’s \n // constrained by a detent as it means\n // the bottom sheet is not draggable.\n // Hence why unshifting into the array instead of pushing\n if (snapPref.minHeight) {\n switch(snapPref.minHeight) {\n case \"content-height\":\n case \"full-height\":\n case 100:\n detent.current = snapPref.minHeight === 100 ? \"full-height\" : snapPref.minHeight;\n isDraggable.current = false;\n return [];\n default:\n const minVal = snapPref.minHeight / 100;\n // Protecting against pref > 100\n minVal > 0 && minVal < 1 \n ? snapArray.push(minVal) \n : snapArray.push(DEFAULT_SNAPPOINTS.min);\n break;\n }\n } else {\n // Fallback value\n snapArray.push(DEFAULT_SNAPPOINTS.min);\n }\n\n // From now on, check if value is greater than the previous one in array\n // If not, use DEFAULT_SNAPPOINTS fallback and check it as well\n // This is to protect from cases that don’t validate min < peek < max\n\n // If peekHeight is constrained by a detent\n // then there is no maxHeight\n if (snapPref.peekHeight) {\n switch(snapPref.peekHeight) {\n case \"content-height\":\n case \"full-height\":\n case 100:\n detent.current = snapPref.peekHeight === 100 ? \"full-height\" : snapPref.peekHeight;\n snapArray.push(1);\n return snapArray;\n default:\n const peekVal = snapPref.peekHeight / 100;\n const prevVal = snapArray[0];\n\n peekVal > 0 && peekVal < 1\n ? snapArray.push(getSecureVal(peekVal, prevVal)) \n : snapArray.push(getSecureVal(DEFAULT_SNAPPOINTS.peek, prevVal))\n break;\n }\n } else {\n // Fallback value\n snapArray.push(getSecureVal(DEFAULT_SNAPPOINTS.peek, snapArray[0]));\n }\n\n // If max-height is constrained by a content-height detent\n // then it means the bottom sheet can’t be fullscreen\n // Otherwise we can remove the top corners radii\n if (snapPref.maxHeight) {\n switch(snapPref.maxHeight) {\n case \"content-height\":\n case \"full-height\":\n case 100:\n detent.current = snapPref.maxHeight === 100 ? \"full-height\" : snapPref.maxHeight;\n snapArray.push(1);\n return snapArray;\n default:\n const maxVal = snapPref.maxHeight / 100;\n const prevVal = snapArray[0];\n\n maxVal > 0 && maxVal < 1 \n ? snapArray.push(getSecureVal(maxVal, prevVal)) \n : snapArray.push(getSecureVal(DEFAULT_SNAPPOINTS.max, prevVal));\n break;\n }\n } else {\n // Fallback value\n snapArray.push(getSecureVal(DEFAULT_SNAPPOINTS.max, snapArray[0]));\n }\n } else {\n // There is no pref set\n // Reminder: order of React Modal Sheet is descending so min, peek, max\n snapArray.push(DEFAULT_SNAPPOINTS.min, DEFAULT_SNAPPOINTS.peek, DEFAULT_SNAPPOINTS.max);\n }\n\n return snapArray;\n }, [id, preferences]);\n\n const snapIdx = useRef<number | null>(null);\n\n const onDragPressCallback = useCallback(() => {\n if (snapIdx.current !== null) {\n // In [0, min, peek, max] order, cycle to next index but skip index 0\n const nextIdx = snapIdx.current === snapArray.length - 1 ? 1 : snapIdx.current + 1;\n sheetRef.current?.snapTo(nextIdx);\n }\n }, [snapArray]);\n\n const onDragKeyCallback = useCallback((e: KeyboardEvent) => {\n if (snapIdx.current !== null) {\n switch(e.code) {\n case \"PageUp\":\n if (snapIdx.current === snapArray.length - 1) return;\n sheetRef.current?.snapTo(snapArray.length - 1);\n break;\n case \"ArrowUp\":\n if (snapIdx.current === snapArray.length - 1) return;\n sheetRef.current?.snapTo(snapIdx.current + 1);\n break;\n case \"PageDown\":\n onClosePress();\n break;\n case \"ArrowDown\":\n if (snapIdx.current === 1) {\n onClosePress();\n break;\n }\n sheetRef.current?.snapTo(snapIdx.current - 1)\n break;\n default:\n break;\n }\n }\n }, [snapArray, onClosePress]);\n\n const maxWidthPref = useMemo(() => {\n const maxWidth = preferences.actions.keys[id as keyof typeof preferences.actions.keys].snapped?.maxWidth;\n if (typeof maxWidth === \"undefined\") {\n return undefined;\n } else if (maxWidth === null) {\n return \"100%\";\n } else {\n return `${ maxWidth }px`;\n }\n }, [id, preferences]);\n\n const scrimPref = useMemo(() => {\n let scrimPref: ScrimPref = {\n active: false,\n override: undefined\n }\n const scrim = preferences.actions.keys[id as keyof typeof preferences.actions.keys].snapped?.scrim;\n if (scrim) {\n scrimPref.active = true;\n\n if (typeof scrim === \"string\") {\n scrimPref.override = scrim;\n }\n }\n\n return scrimPref;\n }, [id, preferences]);\n\n const detentClassName = useMemo(() => {\n let className = \"\";\n if (detent.current === \"content-height\") {\n className = sheetStyles.draggableContentHeightDetent;\n } else {\n className = sheetStyles.draggableFullHeightDetent;\n }\n return className;\n }, [detent]);\n\n const scrimClassName = useMemo(() => {\n return scrimPref.active ? sheetStyles.draggableScrim : \"\";\n }, [scrimPref]);\n\n const convertDetent = (detent: ThBottomSheetDetent): SheetDetent => {\n switch(detent) {\n case \"content-height\":\n return \"content\";\n case \"full-height\":\n return \"default\";\n default:\n return \"default\";\n }\n };\n\n if (React.Children.toArray(children).length > 0) {\n return(\n <>\n <ThBottomSheet\n id={ id }\n ref={ sheetRef }\n className={ sheetStyles.draggableRoot }\n isOpen={ isOpen }\n focusOptions={{\n withinRef: focusWithinRef ?? bottomSheetBodyRef,\n trackedState: isOpen,\n fallbackRef: bottomSheetCloseRef,\n withSelector: focusSelector,\n action: {\n type: \"focus\",\n options: {\n preventScroll: true, // Safari needs this otherwise focus() creates artifacts on open\n scrollContainerToTop: scrollTopOnFocus\n }\n },\n updateState: resetFocus\n }}\n onOpenChange={ onOpenChange }\n isKeyboardDismissDisabled={ dismissEscapeKeyClose }\n { ...(snapArray.length > 2 \n ? { \n snapPoints: snapArray, \n initialSnap: 2,\n detent: convertDetent(detent.current)\n } \n : {\n detent: convertDetent(detent.current)\n }) \n }\n onSnap={ (index) => { snapIdx.current = index }}\n prefersReducedMotion={ prefersReducedMotion }\n compounds={ {\n container: {\n className: classNames(sheetStyles.draggable, detentClassName),\n ref: sheetContainerRef,\n style: {\n maxWidth: maxWidthPref \n } as CSSProperties\n },\n dragIndicator: {\n className: sheetStyles.dragIndicator,\n onPress: onDragPressCallback,\n onKeyDown: onDragKeyCallback\n },\n content: {\n className: classNames(sheetStyles.draggableContent, className),\n disableDrag: true\n },\n scroller: {\n className: sheetStyles.draggableScroller\n },\n backdrop: {\n className: classNames(sheetStyles.draggableBackdrop, scrimClassName),\n style: { [`--${ prefixString(\"layout-defaults-scrim\") }`]: scrimPref.override }\n }\n } }\n >\n <ThContainerHeader\n label={ heading }\n className={ sheetStyles.draggableHeader }\n compounds={ {\n heading: {\n className: sheetStyles.heading\n }\n }}\n >\n { headerVariant === ThSheetHeaderVariant.previous \n ? <ThNavigationButton \n direction={ direction === \"ltr\" ? \"left\" : \"right\" }\n label={ t(\"reader.app.back.trigger\") }\n ref={ bottomSheetCloseRef }\n className={ classNames(className, readerSharedUI.backButton) } \n aria-label={ t(\"reader.app.back.trigger\") }\n onPress={ onClosePress }\n /> \n : <ThCloseButton\n ref={ bottomSheetCloseRef }\n className={ readerSharedUI.closeButton } \n aria-label={ t(\"common.actions.close\") } \n onPress={ onClosePress }\n />\n }\n </ThContainerHeader>\n <ThContainerBody \n ref={ bottomSheetBodyRef }\n className={ sheetStyles.body }\n >\n { children }\n </ThContainerBody>\n </ThBottomSheet>\n </>\n )\n }\n}","\"use client\";\n\nimport React, { useRef, useEffect } from \"react\";\n\nimport { StatefulSheet } from \"./models/sheets\";\nimport { ThSheetHeaderVariant } from \"@/preferences/models\";\n\nimport sheetStyles from \"./assets/styles/thorium-web.sheets.module.css\";\nimport readerSharedUI from \"../assets/styles/thorium-web.button.module.css\";\n\nimport { ThModal } from \"@/core/Components/Containers/ThModal\";\nimport { ThContainerHeader } from \"@/core/Components/Containers/ThContainerHeader\";\nimport { ThContainerBody } from \"@/core/Components/Containers/ThContainerBody\";\nimport { ThNavigationButton } from \"@/core/Components/Buttons/ThNavigationButton\";\nimport { ThCloseButton } from \"@/core/Components/Buttons/ThCloseButton\";\n\nimport { useI18n } from \"@/i18n\";\nimport { useWebkitPatch } from \"./hooks/useWebkitPatch\";\n\nimport { useAppSelector } from \"@/lib/hooks\";\n\nimport classNames from \"classnames\";\nimport { prefixString } from \"@/core/Helpers/prefixString\";\n\nexport interface StatefulFullScreenSheetProps extends StatefulSheet {};\n\nexport const StatefulFullScreenSheet = ({\n heading,\n headerVariant,\n className, \n isOpen,\n onOpenChange, \n onClosePress,\n children,\n resetFocus,\n focusWithinRef,\n focusSelector,\n scrollTopOnFocus,\n dismissEscapeKeyClose\n }: StatefulFullScreenSheetProps) => {\n const { t } = useI18n()\n const direction = useAppSelector(state => state.reader.direction);\n const fullScreenRef = useRef<HTMLDivElement | null>(null);\n const fullScreenHeaderRef = useRef<HTMLDivElement | null>(null);\n const fullScreenBodyRef = useRef<HTMLDivElement | null>(null);\n const fullScreenCloseRef = useRef<HTMLButtonElement | null>(null);\n\n // Update the CSS variable when the sheet is open and header ref is available\n useEffect(() => {\n if (isOpen && fullScreenRef.current && fullScreenHeaderRef.current) {\n fullScreenRef.current.style.setProperty(\n `--${ prefixString(\"sheet-sticky-header\") }`,\n `${ fullScreenHeaderRef.current.clientHeight }px`\n );\n }\n }, [isOpen]);\n\n // Warning: This is a temporary fix for a bug in React Aria Components.\n useWebkitPatch(!!isOpen);\n\n if (React.Children.toArray(children).length > 0) {\n return(\n <>\n <ThModal \n ref={ fullScreenRef }\n focusOptions={{\n withinRef: focusWithinRef ?? fullScreenBodyRef,\n trackedState: isOpen,\n fallbackRef: fullScreenCloseRef,\n withSelector: focusSelector,\n action: {\n type: \"focus\",\n options: {\n preventScroll: scrollTopOnFocus ? true : false,\n scrollContainerToTop: scrollTopOnFocus\n }\n },\n updateState: resetFocus\n }}\n compounds={{\n dialog: {\n className: sheetStyles.dialog\n }\n }}\n isOpen={ isOpen }\n onOpenChange={ onOpenChange }\n isDismissable={ true }\n className={ classNames(sheetStyles.fullscreen, className) }\n isKeyboardDismissDisabled={ dismissEscapeKeyClose }\n >\n <ThContainerHeader \n ref={ fullScreenHeaderRef }\n className={ sheetStyles.header }\n label={ heading }\n compounds={{\n heading: {\n className: sheetStyles.heading\n }\n }}\n >\n { headerVariant === ThSheetHeaderVariant.previous\n ? <ThNavigationButton\n direction={ direction === \"ltr\" ? \"left\" : \"right\" }\n label={ t(\"reader.app.back.trigger\") }\n ref={ fullScreenCloseRef }\n className={ classNames(className, readerSharedUI.backButton) } \n aria-label={ t(\"reader.app.back.trigger\") }\n onPress={ onClosePress }\n />\n : <ThCloseButton\n ref={ fullScreenCloseRef }\n className={ readerSharedUI.closeButton } \n aria-label={ t(\"common.actions.close\") } \n onPress={ onClosePress }\n />\n }\n </ThContainerHeader>\n <ThContainerBody \n ref={ fullScreenBodyRef }\n className={ sheetStyles.body }\n >\n { children }\n </ThContainerBody>\n </ThModal>\n </>\n )\n }\n}","\"use client\";\n\nimport React, { useCallback, useRef, useEffect } from \"react\";\n\nimport { StatefulSheet } from \"./models/sheets\";\nimport { ThDockingKeys, ThSheetHeaderVariant, ThLayoutDirection } from \"@/preferences/models\";\n\nimport sheetStyles from \"./assets/styles/thorium-web.sheets.module.css\";\nimport readerSharedUI from \"../assets/styles/thorium-web.button.module.css\";\n\nimport { ThDockedPanel } from \"@/core/Components/Containers/ThDockedPanel\";\nimport { ThContainerHeader } from \"@/core/Components/Containers/ThContainerHeader\";\nimport { ThContainerBody } from \"@/core/Components/Containers/ThContainerBody\";\nimport { StatefulDocker } from \"../Docking/StatefulDocker\";\nimport { ThNavigationButton } from \"@/core/Components/Buttons/ThNavigationButton\";\n\nimport { useI18n } from \"@/i18n\";\n\nimport { useAppSelector } from \"@/lib/hooks\";\n\nimport classNames from \"classnames\";\nimport { prefixString } from \"@/core/Helpers/prefixString\";\n\nexport interface StatefulDockedSheetProps extends StatefulSheet {\n flow: ThDockingKeys.start | ThDockingKeys.end | null;\n}\n\nexport const StatefulDockedSheet = ({ \n id,\n heading,\n headerVariant,\n className, \n isOpen,\n onClosePress,\n docker, \n flow,\n children,\n resetFocus,\n focusSelector,\n focusWithinRef,\n scrollTopOnFocus\n }: StatefulDockedSheetProps) => {\n const { t } = useI18n()\n const dockPortal = flow && document.getElementById(flow);\n const dockedSheetRef = useRef<HTMLDivElement | null>(null);\n const dockedSheetHeaderRef = useRef<HTMLDivElement | null>(null);\n const dockedSheetBodyRef = useRef<HTMLDivElement | null>(null);\n const dockedSheetCloseRef = useRef<HTMLButtonElement | null>(null);\n\n const direction = useAppSelector(state => state.reader.direction);\n\n // Update the CSS variable when the sheet is open and header ref is available\n useEffect(() => {\n if (isOpen && dockedSheetRef.current && dockedSheetHeaderRef.current) {\n dockedSheetRef.current.style.setProperty(\n `--${ prefixString(\"sheet-sticky-header\") }`,\n `${ dockedSheetHeaderRef.current.clientHeight }px`\n );\n }\n }, [isOpen]);\n\n const classFromFlow = useCallback(() => {\n if (flow === ThDockingKeys.start) {\n return direction === ThLayoutDirection.ltr ? sheetStyles.dockedLeftBorder : sheetStyles.dockedRightBorder;\n } else if (flow === ThDockingKeys.end) {\n return direction === ThLayoutDirection.ltr ? sheetStyles.dockedRightBorder : sheetStyles.dockedLeftBorder;\n }\n }, [flow, direction]);\n\n if (React.Children.toArray(children).length > 0) {\n return(\n <>\n <ThDockedPanel\n ref={ dockedSheetRef }\n isOpen={ isOpen }\n portal={ dockPortal }\n focusOptions={{\n withinRef: focusWithinRef ?? dockedSheetBodyRef,\n trackedState: isOpen,\n fallbackRef: dockedSheetCloseRef,\n withSelector: focusSelector,\n action: {\n type: \"scrollIntoView\",\n options: {\n behavior: \"instant\",\n block: \"center\",\n inline: \"nearest\"\n }\n },\n updateState: resetFocus\n }}\n className={ classNames(sheetStyles.docked, className, classFromFlow()) }\n >\n <ThContainerHeader \n ref={ dockedSheetHeaderRef }\n className={ sheetStyles.header }\n label={ heading }\n compounds={{\n heading: {\n className: sheetStyles.heading\n }\n }}\n >\n { headerVariant === ThSheetHeaderVariant.previous \n ? <ThNavigationButton\n direction={ direction === \"ltr\" ? \"left\" : \"right\" } \n label={ t(\"reader.app.back.trigger\") }\n ref={ dockedSheetCloseRef }\n className={ classNames(className, readerSharedUI.backButton) } \n aria-label={ t(\"reader.app.back.trigger\") }\n onPress={ onClosePress }\n /> \n : <StatefulDocker \n id={ id }\n keys={ docker || [] }\n ref={ dockedSheetCloseRef }\n onClose={ onClosePress }\n />\n } \n </ThContainerHeader>\n <ThContainerBody \n ref={ dockedSheetBodyRef }\n className={ sheetStyles.body }\n >\n { children }\n </ThContainerBody>\n </ThDockedPanel>\n </>\n )\n }\n}","\"use client\";\n\nimport { ReactNode } from \"react\";\n\nimport { ThDockingKeys, ThSheetTypes } from \"@/preferences/models\";\n\nimport { ThTypedComponentRenderer } from \"@/core/Components/Containers/ThTypedComponentRenderer\";\nimport { StatefulPopoverSheet, StatefulPopoverSheetProps } from \"./StatefulPopoverSheet\";\nimport { StatefulBottomSheet, StatefulBottomSheetProps } from \"./StatefulBottomSheet\";\nimport { StatefulFullScreenSheet, StatefulFullScreenSheetProps } from \"./StatefulFullScreenSheet\";\nimport { StatefulDockedSheet, StatefulDockedSheetProps } from \"./StatefulDockedSheet\";\n\nconst componentMap = {\n [ThSheetTypes.popover]: StatefulPopoverSheet,\n [ThSheetTypes.bottomSheet]: StatefulBottomSheet,\n [ThSheetTypes.fullscreen]: StatefulFullScreenSheet,\n [ThSheetTypes.dockedStart]: (props: StatefulDockedSheetProps) => <StatefulDockedSheet { ...props } flow={ ThDockingKeys.start } />,\n [ThSheetTypes.dockedEnd]: (props: StatefulDockedSheetProps) => <StatefulDockedSheet { ...props } flow={ ThDockingKeys.end } />\n};\n\nexport const StatefulSheetWrapper = ({\n sheetType,\n sheetProps,\n children\n}: {\n sheetType: ThSheetTypes,\n sheetProps: StatefulPopoverSheetProps | StatefulFullScreenSheetProps | StatefulDockedSheetProps | StatefulBottomSheetProps,\n children: ReactNode\n}) => {\n\n return (\n <ThTypedComponentRenderer\n type={ sheetType }\n componentMap={ componentMap }\n props={ sheetProps }\n >\n { children }\n </ThTypedComponentRenderer>\n );\n}","\"use client\";\n\nimport { useCallback, useEffect, useState } from \"react\";\n\nimport { BreakpointsMap } from \"@/core/Hooks/useBreakpoints\";\nimport { ThDockingTypes, ThDockingKeys, ThSheetTypes } from \"@/preferences/models\";\n\nimport { useAppDispatch, useAppSelector } from \"@/lib/hooks\";\nimport { makeBreakpointsMap } from \"@/core/Helpers/breakpointsMap\";\nimport { dockAction, setActionOpen } from \"@/lib/actionsReducer\";\n\nimport { usePrevious } from \"@/core/Hooks/usePrevious\";\nimport { useActions } from \"@/core/Components/Actions/hooks/useActions\";\nimport { usePreferences } from \"@/preferences/hooks/usePreferences\";\n\nlet dockingMap: Required<BreakpointsMap<ThDockingTypes>> | null = null;\n\nexport const useDocking = <T extends string>(key: T) => {\n const { preferences } = usePreferences();\n const breakpoint = useAppSelector(state => state.theming.breakpoint);\n const actionsMap = useAppSelector(state => state.actions.keys);\n const actionState = actionsMap[key];\n const dispatch = useAppDispatch();\n\n const actions = useActions(actionsMap);\n\n if (!dockingMap) {\n dockingMap = makeBreakpointsMap<ThDockingTypes>({\n defaultValue: ThDockingTypes.both, \n fromEnum: ThDockingTypes, \n pref: preferences.docking.dock, \n disabledValue: ThDockingTypes.none \n });\n }\n const currentDockConfig = breakpoint && dockingMap[breakpoint];\n \n // Use type assertion to tell TypeScript that the key is valid\n const dockablePref = (preferences.actions.keys[key as keyof typeof preferences.actions.keys])?.docked?.dockable || ThDockingTypes.none;\n \n const defaultSheet = (preferences.actions.keys[key as keyof typeof preferences.actions.keys])?.sheet?.defaultSheet || ThSheetTypes.popover;\n \n const sheetMap = makeBreakpointsMap<ThSheetTypes>({\n defaultValue: (preferences.actions.keys[key as keyof typeof preferences.actions.keys])?.sheet?.defaultSheet || ThSheetTypes.popover,\n fromEnum: ThSheetTypes,\n pref: (preferences.actions.keys[key as keyof typeof preferences.actions.keys])?.sheet?.breakpoints\n });\n const sheetPref = breakpoint && sheetMap[breakpoint] || defaultSheet;\n\n const [sheetType, setSheetType] = useState<ThSheetTypes>(defaultSheet);\n const previousSheetType = usePrevious(sheetType);\n\n // Checks whether the action can be docked: its pref should match the docking pref\n const canBeDocked = useCallback((slot: ThDockingTypes.start | ThDockingTypes.end) => {\n return (currentDockConfig === slot || currentDockConfig === ThDockingTypes.both) \n && (dockablePref === slot || dockablePref === ThDockingTypes.both);\n }, [currentDockConfig, dockablePref]);\n\n // Checks whether the sheet pref is of Dock type \n const isDockedSheetPref = useCallback((type?: ThSheetTypes.dockedStart | ThSheetTypes.dockedEnd) => {\n if (type) {\n return sheetPref === type;\n } else {\n return sheetPref === ThSheetTypes.dockedStart || sheetPref === ThSheetTypes.dockedEnd\n }\n }, [sheetPref]);\n \n // Builds the docker for the action based on all preferences\n const getDocker = useCallback((): ThDockingKeys[] => {\n // First let’s handle the cases where docker shouldn’t be used\n // The sheet is not dockable, per key.docked.dockable pref\n if (dockablePref === ThDockingTypes.none) return [];\n // There’s no docking slot available, per docking.dock pref\n if (currentDockConfig === ThDockingTypes.none) return [];\n // The sheet type is not compatible with docking\n if (sheetPref === ThSheetTypes.fullscreen || sheetPref === ThSheetTypes.bottomSheet) return [];\n\n // We can now build the docker from the display order\n let dockerKeys: ThDockingKeys[] = [];\n // In order for an action to be dockable, the dock slot has to exist\n // and the dockable preference of key.docked should match the values\n preferences.docking.displayOrder.forEach((dockingKey: ThDockingKeys) => {\n switch(dockingKey) {\n case ThDockingKeys.transient:\n // We already handled both cases for none \n dockerKeys.push(dockingKey);\n break;\n case ThDockingKeys.start:\n if (canBeDocked(ThDockingTypes.start)) {\n dockerKeys.push(dockingKey);\n }\n break;\n case ThDockingKeys.end:\n if (canBeDocked(ThDockingTypes.end)) {\n dockerKeys.push(dockingKey);\n }\n break;\n default:\n break;\n }\n });\n\n // If the action can only be transient, then it can’t be docked\n if (dockerKeys.length === 1 && dockerKeys[0] === ThDockingKeys.transient) return [];\n\n return dockerKeys;\n }, [preferences.docking.displayOrder, currentDockConfig, sheetPref, dockablePref, canBeDocked]);\n\n const getSheetType = useCallback(() => {\n // Protect against null breakpoint during initialization\n if (!breakpoint) {\n return sheetType;\n }\n \n // First check the dockable pref is none to return early\n if (dockablePref === ThDockingTypes.none) {\n // Sheet is of docked type, we return the default\n if (isDockedSheetPref()) {\n return defaultSheet;\n } else {\n // Sheet pref is not of docked type, we can return it\n return sheetPref;\n }\n };\n\n // We now need to check whether the user has docked the action themselves\n // ActionsReducer should has made sure there is no conflict to handle here \n // by updating states of actions on docking\n switch (actionState?.docking) {\n \n // if action.docking is transient we need to check the pref, \n // it can be docked and in that case we need to pick the default\n case ThDockingKeys.transient:\n if (isDockedSheetPref()) {\n return defaultSheet;\n } else {\n return sheetPref;\n }\n \n // If action.docking is set to start/end then we check the docking slot is available\n case ThDockingKeys.start:\n if (canBeDocked(ThDockingTypes.start)) {\n return ThSheetTypes.dockedStart;\n } else {\n // if the pref is not docked start, return the pref \n // else return the default\n if (!isDockedSheetPref(ThSheetTypes.dockedStart)) {\n return sheetPref;\n } else {\n return defaultSheet;\n }\n }\n\n case ThDockingKeys.end:\n if (canBeDocked(ThDockingTypes.end)) {\n return ThSheetTypes.dockedEnd;\n } else {\n // if the pref is not docked end, return the pref \n // else return the default\n if (!isDockedSheetPref(ThSheetTypes.dockedEnd)) {\n return sheetPref;\n } else {\n return defaultSheet;\n }\n }\n \n // If action.docking is null or undefined then we rely on pref \n // as it means the user did not pick another option\n case null:\n case undefined:\n // We have to check sheetPref is compatible with docking prefs\n if (isDockedSheetPref(ThSheetTypes.dockedStart)) {\n if (canBeDocked(ThDockingTypes.start)) {\n return ThSheetTypes.dockedStart;\n } else {\n return defaultSheet;\n }\n } else if (isDockedSheetPref(ThSheetTypes.dockedEnd)) {\n if (canBeDocked(ThDockingTypes.end)) {\n return ThSheetTypes.dockedEnd;\n } else {\n return defaultSheet;\n }\n } else {\n return sheetPref;\n }\n default:\n return defaultSheet;\n }\n }, [dockablePref, sheetPref, defaultSheet, actionState?.docking, canBeDocked, isDockedSheetPref, breakpoint, sheetType]);\n\n // When docking or breakpoints-related prefs change, get the correct sheet type\n useEffect(() => {\n setSheetType(getSheetType());\n }, [sheetPref, currentDockConfig, actionState?.docking, getSheetType]);\n\n // Dismiss/Close when sheetType has changed from docked to transient\n useEffect(() => {\n // This was not dismissed on breakpoint change, but by the user\n if (actionState?.docking === ThDockingKeys.transient) return;\n\n if (sheetType !== ThSheetTypes.dockedStart && sheetType !== ThSheetTypes.dockedEnd) {\n if (previousSheetType === ThSheetTypes.dockedStart || previousSheetType === ThSheetTypes.dockedEnd) {\n dispatch(setActionOpen({\n key: key,\n isOpen: false\n }));\n }\n }\n }, [dispatch, key, sheetType, previousSheetType, actionState?.docking]);\n\n // on mount, check whether we should update states for docked sheets from pref\n useEffect(() => {\n if (actionState?.isOpen == null) {\n if (sheetType === ThSheetTypes.dockedStart) {\n dispatch(dockAction({\n key: key,\n dockingKey: ThDockingKeys.start\n }));\n dispatch(setActionOpen({\n key: key,\n isOpen: true\n }));\n } else if (sheetType === ThSheetTypes.dockedEnd) {\n dispatch(dockAction({\n key: key,\n dockingKey: ThDockingKeys.end\n }));\n dispatch(setActionOpen({\n key: key,\n isOpen: true\n }));\n }\n }\n });\n\n // Edge case where the sheet has been opened/closed and\n // is of dockable type, but the dock panel is not populated\n // e.g. action was mounted as a different type of sheet (breakpoint),\n // and opened/closed. If the user resizes the window (another breakpoint) \n // but we don’t dispatch docking, then it can’t be displayed \n // since the docking slot has never been populated.\n useEffect(() => {\n // Action has been opened/closed by user\n // but it’s not been manually docked, \n // which means the pref is used but \n // has not be instantiated yet, and \n // couldn’t be on first mount because\n // a different type was used in prefs\n if (actionState?.isOpen != null && actionState?.docking == null) {\n if (sheetType === ThSheetTypes.dockedStart) {\n // Check if the action is docked in practice\n // if it isn’t dispatch docking of the action\n const dockingKey = actions.whichDocked(key);\n if (dockingKey !== ThDockingKeys.start) {\n dispatch(dockAction({\n key: key,\n dockingKey: ThDockingKeys.start\n }));\n }\n } else if (sheetType === ThSheetTypes.dockedEnd) {\n // Check if the action is docked in practice\n // if it isn’t dispatch docking of the action\n const dockingKey = actions.whichDocked(key);\n if (dockingKey !== ThDockingKeys.end) {\n dispatch(dockAction({\n key: key,\n dockingKey: ThDockingKeys.end\n }));\n }\n }\n }\n }, [dispatch, key, sheetType, actionState?.isOpen, actionState?.docking, actions]);\n\n return {\n getDocker,\n sheetType\n }\n}",".wrapper {}\n\n.form {\n display: flex;\n gap: calc(var(--th-layout-spacing) / 2);\n}\n\n.label {\n margin-block: 0 var(--th-layout-spacing);\n display: block;\n}\n\n.input {\n display: block;\n font-weight: bold;\n padding: calc(var(--th-icon-size, 24px) * (1/4)) calc(var(--th-layout-spacing) / 2);\n border-radius: var(--th-layout-radius);\n border: 2px solid var(--th-theme-subdue);\n}\n\n.button {\n box-sizing: content-box;\n border: 2px solid var(--th-theme-subdue);\n padding: calc(var(--th-icon-size, 24px) * (1/4)) calc(var(--th-icon-size, 24px) * (1/2));\n text-align: center;\n border-radius: var(--th-layout-radius);\n margin-inline-start: auto;\n align-self: flex-end;\n}\n\n.button[data-hovered] {\n background-color: var(--th-theme-hover);\n}\n\n.input[data-focus-visible],\n.button[data-focus-visible] {\n outline: 2px solid var(--th-theme-focus);\n}\n\n.numberField[data-disabled],\n.button[data-disabled] {\n color: var(--th-theme-disable);\n} ","\"use client\";\n\nexport const isPositionsListValid = (positionsList: any[] | null | undefined): boolean => {\n return !!(positionsList && positionsList.length > 0 && positionsList.some(item => item.locations?.position));\n};;\n","\"use client\";\n\nimport { FormEvent, useCallback, useEffect, useState } from \"react\";\n\nimport { ThActionsKeys } from \"@/preferences/models\";\nimport { StatefulActionContainerProps } from \"../models/actions\";\n\nimport jumpToPositionStyles from \"./assets/styles/thorium-web.jumpToPosition.module.css\";\n\nimport { StatefulSheetWrapper } from \"../../Sheets/StatefulSheetWrapper\";\nimport { ThForm } from \"@/core/Components/Form/ThForm\";\nimport { ThFormNumberField } from \"@/core/Components/Form/Fields/ThFormNumberField\";\n\nimport { useEpubNavigator } from \"@/core/Hooks/Epub/useEpubNavigator\";\nimport { useDocking } from \"../../Docking/hooks/useDocking\";\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { useAppDispatch, useAppSelector } from \"@/lib/hooks\";\nimport { setActionOpen } from \"@/lib/actionsReducer\";\nimport { setImmersive, setUserNavigated } from \"@/lib/readerReducer\";\n\nimport { isPositionsListValid } from \"./helpers/utils\";\n\nexport const StatefulJumpToPositionContainer = ({ \n triggerRef \n}: StatefulActionContainerProps) => {\n const { t } = useI18n();\n const actionState = useAppSelector(state => state.actions.keys[ThActionsKeys.jumpToPosition]);\n const positionsList = useAppSelector(state => state.publication.positionsList);\n\n const positionNumbers = useAppSelector(state => state.publication.unstableTimeline?.progression?.currentPositions);\n\n const reducedMotion = useAppSelector(state => state.theming.prefersReducedMotion);\n const dispatch = useAppDispatch();\n\n const docking = useDocking(ThActionsKeys.jumpToPosition);\n const sheetType = docking.sheetType;\n\n const { go } = useEpubNavigator();\n\n // Component has to handle updates locally since EpubNavigator updates positions, \n // so we use these as an intermediary\n const [position, setPosition] = useState(0);\n const [errorMessage, setErrorMessage] = useState<string>();\n\n // Position Numbers can be a range so we must check position is in range\n // And not only that the array simply includes the position\n const positionInRange = useCallback(() => {\n if (!positionNumbers) return false;\n return positionNumbers.length === 2\n ? position >= positionNumbers[0] && position <= positionNumbers[1]\n : position === positionNumbers[0];\n }, [position, positionNumbers]);\n\n // Update the label to use react-i18next interpolation\n const label = t(\"reader.jumpToPosition.label\", { positionStart: 1, positionEnd: positionsList.length });\n\n const setOpen = useCallback((value: boolean) => {\n dispatch(setActionOpen({\n key: ThActionsKeys.jumpToPosition,\n isOpen: value\n }));\n }, [dispatch]);\n\n // NumberField onChange won’t fire if the value has been typed\n // so we need to handle the input manually\n const handleInput = useCallback((e: FormEvent<HTMLInputElement>) => {\n const target = e.target as HTMLInputElement;\n setPosition(parseInt(target.value));\n }, []);\n\n // This is a form submit handler so we have to preventDefault\n // We have to use this otherwise any change will trigger a navigation\n const handleAction = useCallback((e: FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n\n if (!positionsList) return;\n\n setErrorMessage(undefined); // Clear previous errors\n\n const item = positionsList.find(item => item.locations.position === position);\n\n if (!item) {\n setErrorMessage(t(\"reader.jumpToPosition.error.notFound\"));\n return;\n }\n \n if (positionInRange()) return setOpen(false);\n\n const cb = () => {\n setOpen(false);\n dispatch(setImmersive(true));\n dispatch(setUserNavigated(true));\n };\n \n go(item, !reducedMotion, cb);\n }, [position, positionsList, reducedMotion, t, positionInRange, go, setOpen, dispatch]);\n\n // Since we are using an intermediary local state, we must keep track when positionNumbers changes\n useEffect(() => {\n positionNumbers && setPosition(positionNumbers[0]);\n }, [positionNumbers]);\n\n // In case there is no positions list or no valid positions we return\n if (!isPositionsListValid(positionsList)) return null;\n\n return (\n <>\n <StatefulSheetWrapper\n sheetType={sheetType}\n sheetProps={{\n id: ThActionsKeys.jumpToPosition,\n triggerRef: triggerRef,\n heading: t(\"reader.actions.goToPosition.descriptive\"),\n className: jumpToPositionStyles.wrapper,\n placement: \"bottom\",\n isOpen: actionState?.isOpen || false,\n onOpenChange: setOpen,\n onClosePress: () => setOpen(false),\n docker: docking.getDocker()\n }}\n >\n <ThForm\n label={ t(\"reader.jumpToPosition.go\") }\n className={ jumpToPositionStyles.form }\n onSubmit={ handleAction }\n compounds={{\n button: {\n className: jumpToPositionStyles.button,\n isDisabled: !position || positionInRange()\n }\n }}\n >\n <ThFormNumberField\n label={ label }\n name=\"jumpToPosition\"\n className={ jumpToPositionStyles.numberField }\n onChange={ setPosition }\n onInput={ handleInput }\n value={ position }\n minValue={ 1 }\n maxValue={ positionsList.length }\n step={ 1 }\n formatOptions={{ style: \"decimal\" }}\n isWheelDisabled={ true }\n errorMessage={ errorMessage }\n compounds={{\n label: {\n className: jumpToPositionStyles.label\n },\n input: {\n className: jumpToPositionStyles.input,\n inputMode: \"numeric\"\n }\n }}\n />\n </ThForm>\n </StatefulSheetWrapper>\n </>\n )\n}","import * as React from \"react\";\nconst SvgPinDrop = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"Inherit\" {...props}><path d=\"M480-301q99-80 149.5-154T680-594q0-90-56-148t-144-58q-88 0-144 58t-56 148q0 65 50.5 139T480-301Zm0 101Q339-304 269.5-402T200-594q0-125 78-205.5T480-880q124 0 202 80.5T760-594q0 94-69.5 192T480-200Zm0-320q33 0 56.5-23.5T560-600q0-33-23.5-56.5T480-680q-33 0-56.5 23.5T400-600q0 33 23.5 56.5T480-520ZM200-80v-80h560v80H200Zm280-520Z\" /></svg>;\nexport default SvgPinDrop;","\"use client\";\n\nimport { ThActionsKeys } from \"@/preferences/models\";\nimport { StatefulActionTriggerProps } from \"../models/actions\";\nimport { ThActionsTriggerVariant } from \"@/core/Components/Actions/ThActionsBar\";\n\nimport TargetIcon from \"./assets/icons/pin_drop.svg\";\n\nimport { StatefulActionIcon } from \"../Triggers/StatefulActionIcon\";\nimport { StatefulOverflowMenuItem } from \"../Triggers/StatefulOverflowMenuItem\";\n\nimport { usePreferences } from \"@/preferences/hooks/usePreferences\";\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { setActionOpen, useAppDispatch, useAppSelector } from \"@/lib\";\nimport { isPositionsListValid } from \"./helpers/utils\";\n\nexport const StatefulJumpToPositionTrigger = ({ variant }: StatefulActionTriggerProps) => {\n const { preferences } = usePreferences();\n const { t } = useI18n();\n const actionState = useAppSelector(state => state.actions.keys[ThActionsKeys.jumpToPosition]);\n const positionsList = useAppSelector(state => state.publication.positionsList);\n const dispatch = useAppDispatch();\n\n const setOpen = (value: boolean) => {\n dispatch(setActionOpen({ \n key: ThActionsKeys.jumpToPosition,\n isOpen: value \n }));\n }\n\n // In case there is no positions list or no valid positions we return\n if (!isPositionsListValid(positionsList)) return null;\n\n return(\n <>\n { (variant && variant === ThActionsTriggerVariant.menu) \n ? <StatefulOverflowMenuItem \n label={ t(\"reader.actions.goToPosition.descriptive\") }\n SVGIcon={ TargetIcon }\n shortcut={ preferences.actions.keys[ThActionsKeys.jumpToPosition].shortcut }\n id={ ThActionsKeys.jumpToPosition }\n onAction={ () => setOpen(!actionState?.isOpen) }\n />\n : <StatefulActionIcon\n visibility={ preferences.actions.keys[ThActionsKeys.jumpToPosition].visibility } \n aria-label={ t(\"reader.actions.goToPosition.descriptive\") }\n placement=\"bottom\" \n tooltipLabel={ t(\"reader.actions.goToPosition.compact\") }\n onPress={ () => setOpen(!actionState?.isOpen) }\n >\n <TargetIcon aria-hidden=\"true\" focusable=\"false\" />\n </StatefulActionIcon>\n }\n </>\n )\n}",".wrapper {}\n\n.group {\n margin: calc(var(--th-layout-spacing) * 2) 0; \n}\n\n.advancedGroup {\n position: relative;\n}\n\n.advancedIcon {\n position: absolute;\n inset-inline-end: 0;\n inset-block-start: 0;\n}\n\n.label {\n display: block;\n font-weight: bold;\n font-size: 1rem;\n margin: 0;\n}\n\n.groupLabel {\n padding-top: calc(var(--th-icon-size, 24px) * (1/3));\n}\n\n.radioWrapper,\n.groupWrapper {\n margin: var(--th-layout-spacing) 0;\n text-align: center;\n border-radius: var(--th-layout-radius);\n}\n\n.numberField .groupWrapper {\n margin-bottom: 0;\n}\n\n.radioWrapper {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(min(100%, 100px), 1fr));\n gap: calc(var(--th-layout-spacing) / 4);\n width: 100%; \n}\n\n.groupWrapper {\n display: flex;\n width: fit-content;\n gap: var(--th-layout-spacing) calc(var(--th-layout-spacing) / 2);\n}\n\n.advancedGroup .radioWrapper {\n margin-bottom: 0;\n}\n\n.groupWrapper[data-focus-within]:has(input[data-focus-visible]) {\n outline: 2px solid var(--th-theme-focus);\n}\n\n.numberFieldWrapper,\n.sliderWrapper {\n display: flex;\n align-items: flex-start;\n max-width: 100%;\n}\n\n.numberFieldWrapper .numberField,\n.sliderWrapper .slider {\n flex: 1 0 auto;\n}\n\n.group:first-of-type {\n margin-top: 0;\n}\n\n.group:last-of-type {\n margin-bottom: 0;\n}\n\n/* Reset button */\n\n.resetButton {\n margin-inline-start: auto;\n}\n\n/* Number field */\n\n.numberField .input {\n background-color: var(--th-theme-background);\n color: var(--th-theme-text);\n font-weight: bold;\n align-self: center;\n max-width: 20ch;\n}\n\n.groupWrapper[data-disabled] .input {\n color: var(--th-theme-disable)\n}\n\n.radio {\n padding: calc(var(--th-layout-spacing) / 2);\n border-radius: var(--th-layout-radius);\n box-sizing: border-box;\n border: 2px solid transparent;\n}\n\n.radio:not(.themeRadio) {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: calc(var(--th-layout-spacing) / 2);\n min-width: 0;\n width: 100%;\n}\n\n.radio:not(.themeRadio) > * {\n width: 100%;\n text-align: center;\n}\n\n/* Text truncation for non-theme radios */\n.radio:not(.themeRadio) span {\n display: -webkit-box;\n -webkit-line-clamp: 2;\n line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n text-overflow: ellipsis;\n line-height: 1.2em;\n max-height: 2.4em; /* 2 lines of text */\n width: 100%;\n box-sizing: border-box;\n white-space: normal;\n}\n\n.radio:not(.themeRadio)[data-selected] {\n border: 2px solid var(--th-theme-subdue);\n}\n\n.radio[data-disabled] {\n color: var(--th-theme-disable);\n}\n\n.radio[data-hovered] {\n background-color: var(--th-theme-hover);\n}\n\n.radio[data-focus-visible] {\n outline: 2px solid var(--th-theme-focus);\n}\n\n.radio svg {\n width: var(--th-icon-size, 32px);\n height: var(--th-icon-size, 32px);\n /* So that it’s the same color as text based on state */\n fill: currentColor;\n}\n\n.themesWrapper {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n grid-auto-flow: row;\n max-width: 100%;\n gap: calc(var(--th-layout-spacing) / 2);\n}\n\n.themeRadio {\n padding-block: calc(var(--th-layout-spacing) / 4);\n padding-inline: calc((var(--th-icon-size, 24px) * 5/6) + (var(--th-layout-spacing) / 4));\n position: relative;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.themeRadio svg {\n width: calc(var(--th-icon-size, 24px) * 5/6);\n height: calc(var(--th-icon-size, 24px) * 5/6);\n position: absolute;\n inset-inline-end: 5px;\n inset-block-end: 5px;\n /* So that it’s the same color as text w/o having to expose a custom prop globally */\n fill: currentColor;\n}\n\n.separator {\n border: none;\n border-top: 1px solid var(--th-theme-subdue);\n}\n\n/* Slider */\n\n.slider {\n display: grid;\n grid-template-areas: \"label output\"\n \"track track\";\n grid-template-columns: 1fr auto;\n gap: calc(var(--th-layout-spacing) / 2);\n color: var(--th-theme-text);\n flex-direction: column;\n max-width: min(calc(100% - (var(--th-layout-spacing) / 2)), 80%);\n}\n\n.sliderLabel {\n grid-area: label;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 100%;\n}\n\n.sliderOutput {\n grid-area: output;\n}\n\n.slider[data-disabled] .sliderLabel,\n.slider[data-disabled] .sliderOutput {\n color: var(--th-theme-disable);\n}\n\n.sliderTrack {\n grid-area: track;\n position: relative;\n height: 30px;\n width: auto;\n box-sizing: border-box;\n margin-inline: calc(var(--th-layout-spacing) / 2);\n}\n\n.sliderTrack::before {\n content: \"\";\n display: block;\n position: absolute;\n background: var(--th-theme-subdue);\n height: 3px;\n width: 100%;\n top: 50%;\n transform: translateY(-50%);\n}\n\n.sliderThumb {\n width: 1.25rem;\n height: 1.25rem;\n border-radius: 50%;\n background: var(--th-theme-text);\n border: 2px solid var(--th-theme-subdue);\n top: 50%;\n}\n\n.slider[data-disabled] .sliderThumb {\n background: var(--th-theme-disable);\n border: 2px solid var(--th-theme-disable);\n}\n\n.sliderThumb[data-dragging] {\n background: var(--th-theme-subdue);\n}\n\n.sliderThumb[data-focus-visible] {\n outline: 2px solid var(--th-theme-focus);\n border: 2px solid var(--th-theme-focus);\n}\n\n.sliderPlaceholder {\n color: var(--th-theme-subdue); \n}\n\n/* Slider with ticks */\n\n.sliderWithTicks .sliderTrack::before {\n background: \n /* Track line */\n linear-gradient(\n to right,\n var(--th-theme-subdue) 0%,\n var(--th-theme-subdue) 100%\n ) 0 50% / 100% 3px no-repeat,\n\n /* Ticks */\n repeating-linear-gradient(\n to right,\n var(--th-theme-text) 0%,\n var(--th-theme-text) 1px,\n transparent 1px,\n transparent calc((100% - 2px) / var(--th-slider-ticks, 10))\n ) 0 50% / 100% 15px no-repeat;\n height: 15px;\n transform: translateY(-50%);\n position: relative;\n}\n\n/* First and last tick */\n\n.sliderWithTicks .sliderTrack::after {\n content: \"\";\n background: \n /* First tick */\n linear-gradient(\n to right,\n var(--th-theme-subdue) 0%,\n var(--th-theme-subdue) 3px,\n transparent 3px,\n transparent 100%\n ) 0 50% / 100% 20px no-repeat,\n\n /* Last tick */\n linear-gradient(\n to left,\n var(--th-theme-subdue) 0%,\n var(--th-theme-subdue) 3px,\n transparent 3px,\n transparent 100%\n ) 100% 50% / 100% 20px no-repeat;\n position: absolute;\n top: 50%;\n left: 0;\n right: 0;\n height: 20px;\n transform: translateY(-50%);\n pointer-events: none;\n}\n\n/* Dropdown */\n\n.dropdown[data-disabled] {\n color: var(--th-theme-disable);\n}\n\n.dropdownButton {\n margin-top: var(--th-layout-spacing);\n position: relative;\n padding-block: calc(var(--th-layout-spacing) / 2);\n padding-inline: calc(var(--th-layout-spacing) / 2) calc(var(--th-icon-size, 24px) * 6/5);\n border-radius: var(--th-layout-radius);\n box-sizing: border-box;\n border: 1px solid var(--th-theme-subdue);\n max-width: 100%;\n}\n\n.dropdownButton[data-focus-visible] {\n outline: 2px solid var(--th-theme-focus);\n}\n\n.dropdownButton svg {\n width: calc(var(--th-icon-size, 24px) * 5/6);\n height: calc(var(--th-icon-size, 24px) * 5/6);\n position: absolute;\n inset-inline-end: calc(var(--th-layout-spacing) / 4);\n inset-block-start: calc(var(--th-layout-spacing) / 2);\n fill: currentColor;\n}\n\n.dropdownPopover {\n background-color: var(--th-theme-background);\n color: var(--th-theme-text);\n padding: calc(var(--th-layout-spacing) / 2);\n border-radius: var(--th-layout-radius);\n border: 1px solid var(--th-theme-subdue);\n filter: drop-shadow(var(--th-theme-elevate));\n box-sizing: border-box;\n width: max-content;\n overflow-y: auto;\n /* TMP: Needs to be higher than bottom sheet, which requires hack for Safari iOS */\n z-index: 1000000 !important;\n}\n\n.dropdownListbox {\n display: flex;\n flex-direction: column;\n gap: calc(var(--th-layout-spacing) / 2);\n}\n\n.dropdownListboxItem {\n padding: calc(var(--th-layout-spacing) / 4);\n}\n\n.dropdownListboxItem[data-selected] {\n color: var(--th-theme-subdue);\n}\n\n.dropdownListboxItem[data-focus-visible] {\n outline: 2px solid var(--th-theme-focus);\n}\n\n.dropdownListboxItem[data-disabled] {\n color: var(--th-theme-disable);\n}\n\n/* Switch */\n\n.switch {\n display: flex;\n align-items: center;\n gap: clamp(10px, calc(var(--th-layout-spacing) / 2), 20px);\n color: var(--th-theme-text);\n margin: var(--th-layout-spacing) 0;\n}\n\n.switchIndicator {\n width: 2rem;\n height: 1.143rem;\n border: 2px solid var(--th-theme-subdue);\n background: var(--th-theme-background);\n border-radius: 1.143rem;\n transition: all 200ms;\n flex-shrink: 0;\n}\n\n.switchIndicator::before {\n content: \"\";\n display: block;\n margin: 0.143rem;\n width: 0.857rem;\n height: 0.857rem;\n background: var(--th-theme-subdue);\n border-radius: 16px;\n transition: all 200ms;\n}\n\n.switch[data-selected] .switchIndicator::before {\n background: var(--th-theme-text);\n transform: translateX(100%);\n}\n\n:dir(rtl) .switch[data-selected] .switchIndicator::before {\n background: var(--th-theme-text);\n transform: translateX(-100%);\n}\n\n.switch[data-focus-visible] .switchIndicator {\n outline: 2px solid var(--th-theme-focus);\n}\n\n.switch[data-disabled] {\n color: var(--th-theme-disable);\n}\n\n.switch[data-disabled] .switchIndicator::before {\n background: var(--th-theme-disable) !important;\n}","\"use client\";\n\nimport readerSharedUI from \"../assets/styles/thorium-web.button.module.css\";\nimport settingsStyles from \"./assets/styles/thorium-web.reader.settings.module.css\";\n\nimport { WithRef } from \"@/core/Components/customTypes\";\n\nimport { ThSettingsGroupPref, ThSpacingSettingsKeys, ThTextSettingsKeys } from \"@/preferences\";\nimport { PressEvent } from \"react-aria\";\n\nimport { SettingComponent } from \"@/components/Plugins/PluginRegistry\";\n\nimport { ThSettingsWrapper } from \"@/core/Components/Settings/ThSettingsWrapper\";\nimport { Heading, HeadingProps } from \"react-aria-components\";\nimport { usePreferences } from \"@/preferences/hooks/usePreferences\";\n\nimport classNames from \"classnames\";\n\nexport interface StatefulGroupWrapperProps<T extends string = ThTextSettingsKeys | ThSpacingSettingsKeys> {\n label: string;\n moreLabel: string;\n moreTooltip: string;\n onPressMore: (e: PressEvent) => void;\n componentsMap: Record<string, SettingComponent>;\n prefs?: ThSettingsGroupPref<T>;\n defaultPrefs: {\n main: T[];\n subPanel: T[];\n };\n isDisabled?: boolean;\n compounds?: {\n /** \n * Custom heading. Can be either:\n * - A React element that will be rendered directly\n * - Props that will be spread onto the default Heading component\n */\n heading?: React.ReactElement<typeof Heading> | WithRef<HeadingProps, HTMLHeadingElement>;\n };\n}\n\nexport const StatefulGroupWrapper = <T extends string = ThTextSettingsKeys | ThSpacingSettingsKeys>({\n label,\n moreLabel,\n moreTooltip,\n onPressMore,\n componentsMap,\n prefs,\n defaultPrefs,\n isDisabled,\n compounds\n}: StatefulGroupWrapperProps<T>) => {\n const { preferences } = usePreferences();\n \n const main = prefs?.main || defaultPrefs.main;\n const displayOrder = prefs?.subPanel !== undefined \n ? prefs.subPanel \n : defaultPrefs.subPanel;\n\n const resolvedPrefs = {\n main: main,\n subPanel: displayOrder\n };\n \n return(\n <>\n <ThSettingsWrapper\n className={ classNames(settingsStyles.group, settingsStyles.advancedGroup) }\n label={ label }\n items={ componentsMap }\n prefs={ resolvedPrefs }\n compounds={{\n ...(compounds?.heading \n ? { heading: compounds.heading }\n : {\n heading: {\n className: classNames(settingsStyles.label, settingsStyles.groupLabel)\n }\n }),\n button: { \n className: classNames(readerSharedUI.icon, settingsStyles.advancedIcon), \n \"aria-label\": moreLabel, \n isDisabled: isDisabled, \n compounds: { \n tooltipTrigger: { \n delay: preferences.theming.icon.tooltipDelay, \n closeDelay: preferences.theming.icon.tooltipDelay \n }, \n tooltip: { \n className: readerSharedUI.tooltip, \n placement: \"top\",\n offset: preferences.theming.icon.tooltipOffset || 0\n },\n label: moreTooltip\n },\n onPress: onPressMore\n }\n }}\n />\n </>\n )\n}","import { ThSettingsEntry } from \"@/core/Components\";\nimport { StatefulActionsMapObject } from \"../Actions\";\n\nexport enum ThPluginType {\n ACTION = \"action\",\n SETTING = \"setting\",\n}\n\nexport type ActionComponent = StatefulActionsMapObject;\n\nexport interface SettingComponent extends ThSettingsEntry {\n type?: \"text\" | \"spacing\";\n props?: any;\n}\n\nexport interface ThPlugin {\n id: string;\n name: string;\n description?: string;\n version?: string;\n components: {\n actions?: Record<string, ActionComponent>;\n settings?: Record<string, SettingComponent>;\n };\n}\n\n// Store plugins in a module-level variable to ensure persistence\nconst pluginsStore: ThPlugin[] = [];\n\nclass PluginRegistryClass {\n register(plugin: ThPlugin): void {\n const existingPluginIndex = pluginsStore.findIndex(p => p.id === plugin.id);\n \n if (existingPluginIndex >= 0) {\n pluginsStore[existingPluginIndex] = plugin;\n } else {\n pluginsStore.push(plugin);\n }\n }\n \n unregister(pluginId: string): void {\n const filteredPlugins = pluginsStore.filter(plugin => plugin.id !== pluginId);\n \n // Clear the array and repopulate it\n pluginsStore.length = 0;\n pluginsStore.push(...filteredPlugins);\n }\n \n getPlugins(): ThPlugin[] {\n return [...pluginsStore];\n }\n \n getComponentMaps() { \n const actionsComponentsMap: Record<string, ActionComponent> = {} as Record<string, ActionComponent>;\n const settingsComponentsMap: Record<string, SettingComponent> = {} as Record<string, SettingComponent>;\n \n // Process plugins in reverse order so later plugins override earlier ones\n [...pluginsStore].reverse().forEach(plugin => { \n // Merge actions components\n if (plugin.components.actions) {\n Object.entries(plugin.components.actions).forEach(([key, component]) => {\n actionsComponentsMap[key as string] = component;\n });\n }\n \n // Merge settings components\n if (plugin.components.settings) {\n Object.entries(plugin.components.settings).forEach(([key, component]) => {\n settingsComponentsMap[key as string] = component;\n });\n }\n });\n \n return {\n actionsComponentsMap,\n settingsComponentsMap\n };\n }\n}\n\n// Export singleton instance\nexport const ThPluginRegistry = new PluginRegistryClass();","\"use client\";\n\nimport React, { createContext, useContext, useEffect, useState } from \"react\";\nimport { ThPluginRegistry, ActionComponent, SettingComponent } from \"./PluginRegistry\";\n\ninterface ThPluginContextType {\n actionsComponentsMap: Record<string, ActionComponent>;\n settingsComponentsMap: Record<string, SettingComponent>;\n textSettingsComponentsMap: Record<string, SettingComponent>;\n spacingSettingsComponentsMap: Record<string, SettingComponent>;\n registerPlugin: typeof ThPluginRegistry.register;\n unregisterPlugin: typeof ThPluginRegistry.unregister;\n}\n\nconst ThPluginContext = createContext<ThPluginContextType>({\n actionsComponentsMap: {} as Record<string, ActionComponent>,\n settingsComponentsMap: {} as Record<string, SettingComponent>,\n textSettingsComponentsMap: {} as Record<string, SettingComponent>,\n spacingSettingsComponentsMap: {} as Record<string, SettingComponent>,\n registerPlugin: ThPluginRegistry.register.bind(ThPluginRegistry),\n unregisterPlugin: ThPluginRegistry.unregister.bind(ThPluginRegistry)\n});\n\nexport const usePlugins = () => useContext(ThPluginContext);\n\nexport const ThPluginProvider = ({ children }: { children: React.ReactNode }) => {\n const [componentMaps, setComponentMaps] = useState<{\n actionsComponentsMap: Record<string, ActionComponent>;\n settingsComponentsMap: Record<string, SettingComponent>;\n textSettingsComponentsMap: Record<string, SettingComponent>;\n spacingSettingsComponentsMap: Record<string, SettingComponent>;\n }>(() => {\n // Force a fresh retrieval of component maps\n const maps = ThPluginRegistry.getComponentMaps();\n return {\n ...maps,\n textSettingsComponentsMap: getTypedSettingsComponents(maps.settingsComponentsMap, \"text\"),\n spacingSettingsComponentsMap: getTypedSettingsComponents(maps.settingsComponentsMap, \"spacing\")\n };\n });\n \n // Helper function to filter settings components by type\n function getTypedSettingsComponents(\n componentsMap: Record<string, SettingComponent>,\n type: \"text\" | \"spacing\"\n ): Record<string, SettingComponent> {\n return Object.entries(componentsMap)\n .filter(([_, component]) => component.type === type)\n .reduce((acc, [key, component]) => {\n acc[key] = component;\n return acc;\n }, {} as Record<string, SettingComponent>);\n }\n \n // Update component maps when plugins change\n useEffect(() => {\n const updateComponentMaps = () => {\n const maps = ThPluginRegistry.getComponentMaps();\n setComponentMaps({\n ...maps,\n textSettingsComponentsMap: getTypedSettingsComponents(maps.settingsComponentsMap, \"text\"),\n spacingSettingsComponentsMap: getTypedSettingsComponents(maps.settingsComponentsMap, \"spacing\")\n });\n };\n \n // Initial update to ensure we have the latest maps\n updateComponentMaps();\n }, []);\n \n // Wrapper for register that triggers an update\n const registerPlugin = (plugin: Parameters<typeof ThPluginRegistry.register>[0]) => {\n ThPluginRegistry.register(plugin);\n };\n \n // Wrapper for unregister that triggers an update\n const unregisterPlugin = (pluginId: string) => {\n ThPluginRegistry.unregister(pluginId);\n };\n \n // Provide the component maps and plugin management functions\n const value = {\n ...componentMaps,\n registerPlugin,\n unregisterPlugin\n };\n \n return (\n <ThPluginContext.Provider value={ value }>\n { children }\n </ThPluginContext.Provider>\n );\n};","\"use client\";\n\nimport { useCallback } from \"react\";\n\nimport { \n defaultSpacingSettingsMain, \n defaultSpacingSettingsSubpanel, \n ThSettingsContainerKeys, \n ThSpacingSettingsKeys \n} from \"@/preferences\";\n\nimport { StatefulGroupWrapper } from \"../StatefulGroupWrapper\";\n\nimport { usePreferences } from \"@/preferences/hooks/usePreferences\";\nimport { usePlugins } from \"../../Plugins/PluginProvider\";\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { useAppDispatch } from \"@/lib/hooks\";\nimport { setSettingsContainer } from \"@/lib/readerReducer\";\n\nexport const StatefulSpacingGroup = () => {\n const { preferences } = usePreferences();\n const { t } = useI18n();\n const { spacingSettingsComponentsMap } = usePlugins();\n\n const dispatch = useAppDispatch();\n \n const setSpacingContainer = useCallback(() => {\n dispatch(setSettingsContainer(ThSettingsContainerKeys.spacing));\n }, [dispatch]);\n\n return (\n <>\n <StatefulGroupWrapper<ThSpacingSettingsKeys> \n label={ t(\"reader.preferences.spacing.title\") }\n moreLabel={ t(\"reader.settings.spacing.advanced.trigger\") }\n moreTooltip={ t(\"reader.settings.spacing.advanced.tooltip\") }\n onPressMore={ setSpacingContainer }\n componentsMap={ spacingSettingsComponentsMap }\n prefs={ preferences.settings.spacing }\n defaultPrefs={ {\n main: defaultSpacingSettingsMain, \n subPanel: defaultSpacingSettingsSubpanel\n }}\n />\n </>\n );\n}\n\nexport const StatefulSpacingGroupContainer = () => {\n const { preferences } = usePreferences();\n\n const displayOrder = preferences.settings.spacing?.subPanel as ThSpacingSettingsKeys[] | null | undefined || defaultSpacingSettingsSubpanel;\n const { spacingSettingsComponentsMap } = usePlugins();\n\n return(\n <>\n { displayOrder.map((key: ThSpacingSettingsKeys) => {\n const match = spacingSettingsComponentsMap[key];\n if (!match) {\n console.warn(`Setting key \"${ key }\" not found in the plugin registry while present in preferences.`);\n return null;\n }\n return <match.Comp key={ key } standalone={ true } />;\n }) }\n </>\n )\n}","\"use client\";\n\nimport React, { useCallback } from \"react\";\n\nimport { \n defaultTextSettingsMain, \n defaultTextSettingsSubpanel, \n ThSettingsContainerKeys, \n ThTextSettingsKeys \n} from \"@/preferences\";\n\nimport { StatefulGroupWrapper } from \"../StatefulGroupWrapper\";\n\nimport { usePreferences } from \"@/preferences/hooks/usePreferences\";\nimport { usePlugins } from \"../../Plugins/PluginProvider\";\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { useAppDispatch } from \"@/lib/hooks\";\nimport { setSettingsContainer } from \"@/lib/readerReducer\";\n\nexport const StatefulTextGroup = () => {\n const { preferences } = usePreferences();\n const { t } = useI18n();\n const { textSettingsComponentsMap } = usePlugins();\n\n const dispatch = useAppDispatch();\n\n const setTextContainer = useCallback(() => {\n dispatch(setSettingsContainer(ThSettingsContainerKeys.text));\n }, [dispatch]);\n\n return(\n <>\n <StatefulGroupWrapper<ThTextSettingsKeys> \n label={ t(\"reader.preferences.text\") }\n moreLabel={ t(\"reader.settings.text.advanced.trigger\") }\n moreTooltip={ t(\"reader.settings.text.advanced.tooltip\") }\n onPressMore={ setTextContainer }\n componentsMap={ textSettingsComponentsMap }\n prefs={ preferences.settings.text }\n defaultPrefs={ {\n main: defaultTextSettingsMain, \n subPanel: defaultTextSettingsSubpanel\n }}\n />\n </>\n )\n}\n\nexport const StatefulTextGroupContainer = () => {\n const { preferences } = usePreferences();\n const displayOrder = preferences.settings.text?.subPanel as ThTextSettingsKeys[] | null | undefined || defaultTextSettingsSubpanel;\n const { textSettingsComponentsMap } = usePlugins();\n\n return(\n <>\n { displayOrder.map((key: ThTextSettingsKeys) => {\n const match = textSettingsComponentsMap[key];\n if (!match) {\n console.warn(`Action key \"${ key }\" not found in the plugin registry while present in preferences.`);\n return null;\n }\n return <match.Comp key={ key } standalone={ true } />;\n }) }\n </>\n )\n}","\"use client\";\n\nimport { useCallback, useEffect, useMemo } from \"react\";\n\nimport { \n defaultSpacingSettingsMain, \n defaultSpacingSettingsSubpanel, \n defaultTextSettingsMain, \n defaultTextSettingsSubpanel, \n usePreferenceKeys\n} from \"@/preferences\";\n\nimport { \n ThActionsKeys, \n ThSettingsContainerKeys, \n ThSheetHeaderVariant,\n ThTextSettingsKeys,\n ThSpacingSettingsKeys,\n ThSettingsKeys\n} from \"@/preferences/models\";\nimport { StatefulActionContainerProps } from \"../models/actions\";\n\nimport settingsStyles from \"../../Settings/assets/styles/thorium-web.reader.settings.module.css\";\n\nimport { StatefulSheetWrapper } from \"../../Sheets/StatefulSheetWrapper\";\n\nimport { StatefulSpacingGroupContainer } from \"../../Settings/Spacing/StatefulSpacingGroup\";\nimport { StatefulTextGroupContainer } from \"../../Settings/Text/StatefulTextGroup\";\n\nimport { usePreferences } from \"@/preferences/hooks/usePreferences\";\nimport { usePlugins } from \"@/components/Plugins/PluginProvider\";\nimport { useDocking } from \"../../Docking/hooks/useDocking\";\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { setHovering, setSettingsContainer } from \"@/lib/readerReducer\";\nimport { useAppDispatch, useAppSelector } from \"@/lib/hooks\";\nimport { setActionOpen } from \"@/lib/actionsReducer\";\n\nexport const StatefulSettingsContainer = ({ \n triggerRef\n}: StatefulActionContainerProps) => {\n const { \n fxlSettingsKeys, \n mainSpacingSettingsKeys,\n mainTextSettingsKeys,\n reflowSettingsKeys,\n subPanelSpacingSettingsKeys,\n subPanelTextSettingsKeys,\n webPubSettingsKeys\n } = usePreferenceKeys();\n const { preferences } = usePreferences();\n const { t } = useI18n();\n const { settingsComponentsMap } = usePlugins();\n const profile = useAppSelector(state => state.reader.profile);\n const isFXL = useAppSelector(state => state.publication.isFXL);\n const hasDisplayTransformability = useAppSelector(state => state.publication.hasDisplayTransformability);\n const contains = useAppSelector(state => state.reader.settingsContainer);\n const actionState = useAppSelector(state => state.actions.keys[ThActionsKeys.settings]);\n const dispatch = useAppDispatch();\n\n const settingItems = useMemo(() => {\n return profile === \"webPub\" \n ? webPubSettingsKeys \n : isFXL \n ? fxlSettingsKeys \n : reflowSettingsKeys\n }, [profile, isFXL, fxlSettingsKeys, reflowSettingsKeys, webPubSettingsKeys]);\n \n const docking = useDocking(ThActionsKeys.settings);\n const sheetType = docking.sheetType;\n\n const setOpen = (value: boolean) => { \n dispatch(setActionOpen({\n key: ThActionsKeys.settings,\n isOpen: value\n }));\n\n // hover false otherwise it tends to stay on close button press…\n if (!value) dispatch(setHovering(false));\n }\n\n const setInitial = useCallback(() => {\n dispatch(setSettingsContainer(ThSettingsContainerKeys.initial));\n }, [dispatch]);\n\n const isTextNested = useCallback((key: string) => {\n const textSettings = [\n mainTextSettingsKeys || defaultTextSettingsMain,\n subPanelTextSettingsKeys || defaultTextSettingsSubpanel,\n ].flat() as string[];\n \n return textSettings.includes(key);\n }, [mainTextSettingsKeys, subPanelTextSettingsKeys]);\n \n const isSpacingNested = useCallback((key: string) => {\n const spacingSettings = [\n mainSpacingSettingsKeys || defaultSpacingSettingsMain,\n subPanelSpacingSettingsKeys || defaultSpacingSettingsSubpanel,\n ].flat() as string[];\n \n return spacingSettings.includes(key);\n }, [mainSpacingSettingsKeys, subPanelSpacingSettingsKeys]);\n \n const isWebPubDisabled = useCallback((key: string) => {\n // Only apply to WebPub\n if (profile !== \"webPub\") {\n return false;\n }\n \n // Always allow zoom\n if (key === \"zoom\") {\n return false;\n }\n \n // For text and spacing settings (including group containers), respect hasDisplayTransformability\n if (Object.values(ThTextSettingsKeys).includes(key as ThTextSettingsKeys) ||\n Object.values(ThSpacingSettingsKeys).includes(key as ThSpacingSettingsKeys) ||\n key === ThSettingsKeys.textGroup ||\n key === ThSettingsKeys.spacingGroup) {\n return !hasDisplayTransformability;\n }\n \n // Filter out everything else for WebPub\n return true;\n }, [profile, hasDisplayTransformability]);\n\n const renderSettings = useCallback(() => {\n switch (contains) {\n case ThSettingsContainerKeys.text:\n return <StatefulTextGroupContainer />;\n \n case ThSettingsContainerKeys.spacing:\n return <StatefulSpacingGroupContainer />;\n\n case ThSettingsContainerKeys.initial:\n default:\n return (\n <>\n { settingItems.length > 0 && settingsComponentsMap \n ? settingItems\n .filter((key) => {\n // Keep existing filtering logic\n if (isTextNested(key) || isSpacingNested(key)) {\n return false;\n }\n \n if (isWebPubDisabled(key)) {\n return false;\n }\n \n return true;\n })\n .map((key) => {\n const match = settingsComponentsMap[key];\n if (!match) {\n console.warn(`Action key \"${ key }\" not found in the plugin registry while present in preferences.`);\n return null;\n }\n return <match.Comp key={ key } { ...match.props } />;\n })\n : <></>\n }\n </>\n );\n }\n }, [settingsComponentsMap, contains, settingItems, isTextNested, isSpacingNested, isWebPubDisabled]);\n\n const getHeading = useCallback(() => {\n switch (contains) {\n case ThSettingsContainerKeys.text:\n return t(\"reader.preferences.text\");\n\n case ThSettingsContainerKeys.spacing:\n return t(\"reader.preferences.spacing.title\");\n\n case ThSettingsContainerKeys.initial:\n default:\n return t(\"reader.preferences.title\");\n }\n }, [contains, t]);\n\n const getHeaderVariant = useCallback(() => {\n switch (contains) {\n case ThSettingsContainerKeys.text:\n return preferences.settings.text?.header || ThSheetHeaderVariant.close;\n\n case ThSettingsContainerKeys.spacing:\n return preferences.settings.spacing?.header || ThSheetHeaderVariant.close;\n\n case ThSettingsContainerKeys.initial:\n default:\n return ThSheetHeaderVariant.close;\n }\n }, [contains, preferences.settings.spacing, preferences.settings.text]);\n\n useEffect(() => {\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === \"Escape\" && contains !== ThSettingsContainerKeys.initial) {\n dispatch(setSettingsContainer(ThSettingsContainerKeys.initial));\n }\n };\n\n document.addEventListener(\"keydown\", handleEscape, true);\n\n return () => {\n document.removeEventListener(\"keydown\", handleEscape, true);\n };\n}, [contains, dispatch]);\n\n\n // Reset when closed\n useEffect(() => {\n if (!actionState?.isOpen) setInitial();\n }, [actionState?.isOpen, setInitial]);\n\n return(\n <>\n <StatefulSheetWrapper \n sheetType={ sheetType }\n sheetProps={ {\n id: ThActionsKeys.settings,\n triggerRef: triggerRef,\n heading: getHeading(),\n headerVariant: getHeaderVariant(),\n className: settingsStyles.wrapper,\n placement: \"bottom\", \n isOpen: actionState?.isOpen || false,\n onOpenChange: setOpen, \n onClosePress: () => { contains === ThSettingsContainerKeys.initial ? setOpen(false) : setInitial() },\n docker: docking.getDocker(),\n resetFocus: contains,\n scrollTopOnFocus: true,\n dismissEscapeKeyClose: contains !== ThSettingsContainerKeys.initial\n } }\n >\n { renderSettings() }\n </StatefulSheetWrapper>\n </>\n )\n}","import * as React from \"react\";\nconst SvgMatchCase = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"inherit\" {...props}><path d=\"m131-252 165-440h79l165 440h-76l-39-112H247l-40 112h-76Zm139-176h131l-64-182h-4l-63 182Zm395 186q-51 0-81-27.5T554-342q0-44 34.5-72.5T677-443q23 0 45 4t38 11v-12q0-29-20.5-47T685-505q-23 0-42 9.5T610-468l-47-35q24-29 54.5-43t68.5-14q69 0 103 32.5t34 97.5v178h-63v-37h-4q-14 23-38 35t-53 12Zm12-54q35 0 59.5-24t24.5-56q-14-8-33.5-12.5T689-393q-32 0-50 14t-18 37q0 20 16 33t40 13Z\" /></svg>;\nexport default SvgMatchCase;","\"use client\";\n\nimport TuneIcon from \"./assets/icons/match_case.svg\";\n\nimport { StatefulActionTriggerProps } from \"../models/actions\";\nimport { ThActionsKeys } from \"@/preferences/models\";\nimport { ThActionsTriggerVariant } from \"@/core/Components/Actions/ThActionsBar\";\n\nimport { StatefulActionIcon } from \"../Triggers/StatefulActionIcon\";\nimport { StatefulOverflowMenuItem } from \"../Triggers/StatefulOverflowMenuItem\";\n\nimport { usePreferences } from \"@/preferences/hooks/usePreferences\";\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { setHovering } from \"@/lib/readerReducer\";\nimport { useAppDispatch, useAppSelector } from \"@/lib/hooks\";\nimport { setActionOpen } from \"@/lib/actionsReducer\";\n\nexport const StatefulSettingsTrigger = ({ variant }: StatefulActionTriggerProps) => {\n const { preferences } = usePreferences();\n const { t } = useI18n();\n const actionState = useAppSelector(state => state.actions.keys[ThActionsKeys.settings]);\n const dispatch = useAppDispatch();\n\n const setOpen = (value: boolean) => { \n dispatch(setActionOpen({\n key: ThActionsKeys.settings,\n isOpen: value\n }));\n\n // hover false otherwise it tends to stay on close button press…\n if (!value) dispatch(setHovering(false));\n }\n\n return(\n <>\n { (variant && variant === ThActionsTriggerVariant.menu) \n ? <StatefulOverflowMenuItem \n label={ t(\"reader.preferences.title\") }\n SVGIcon={ TuneIcon }\n shortcut={ preferences.actions.keys[ThActionsKeys.settings].shortcut } \n id={ ThActionsKeys.settings }\n onAction={ () => setOpen(!actionState?.isOpen) }\n />\n : <StatefulActionIcon \n visibility={ preferences.actions.keys[ThActionsKeys.settings].visibility }\n aria-label={ t(\"reader.preferences.title\") }\n placement=\"bottom\" \n tooltipLabel={ t(\"reader.preferences.title\") } \n onPress={ () => setOpen(!actionState?.isOpen) }\n >\n <TuneIcon aria-hidden=\"true\" focusable=\"false\" />\n </StatefulActionIcon>\n }\n </>\n )\n}","/* Search */\n.wrapper {}\n\n.search {\n margin-bottom: var(--th-layout-spacing);\n display: grid;\n grid-template-areas: \"label label\"\n \"input button\";\n grid-template-columns: 1fr auto;\n align-items: center;\n width: 100%;\n}\n\n.searchLabel {\n grid-area: label;\n margin-bottom: calc(var(--th-layout-spacing) / 2);\n}\n\n.searchInput {\n grid-area: input;\n box-sizing: border-box;\n width: 100%;\n max-width: 100%;\n display: block;\n border-radius: var(--th-layout-radius);\n border: 2px solid var(--th-theme-subdue);\n padding: calc(var(--th-icon-size, 24px) * (1/4)) calc(var(--th-layout-spacing) / 2);\n}\n\n.searchInput::-webkit-search-cancel-button,\n.searchInput::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n.searchInput[data-focus-visible] {\n outline: 2px solid var(--th-theme-focus);\n}\n\n.searchIcon,\n.clearButton {\n grid-area: button;\n margin-inline-start: calc(var(--th-icon-size, 24px) * -1.25);\n height: 100%;\n display: flex;\n align-items: center;\n}\n\n.searchIcon svg {\n fill: var(--th-theme-subdue);\n width: var(--th-icon-size, 24px);\n height: var(--th-icon-size, 24px);\n}\n\n.clearButton svg {\n fill: var(--th-theme-text);\n width: var(--th-icon-size, 24px);\n height: var(--th-icon-size, 24px);\n}\n\n.searchIcon[hidden],\n.clearButton[data-disabled] {\n display: none;\n}\n\n.tree {\n background: var(--th-theme-background);\n color: var(--th-theme-text);\n outline: none;\n width: 100%;\n max-height: 100%;\n box-sizing: border-box;\n}\n\n/* React Aria is providing a --tree-item-level as items are not nested */\n.treeItem {\n display: flex;\n padding: calc(var(--th-layout-spacing) / 2);\n padding-inline-start: calc(((var(--tree-item-level) - 1) * var(--th-layout-spacing)) + (var(--th-layout-spacing) / 2));\n border-radius: var(--th-layout-radius);\n border: 2px solid transparent;\n box-sizing: border-box;\n}\n\n.tree:has(.treeItemButton) .treeItem {\n padding-inline-start: calc((var(--tree-item-level) * var(--th-layout-spacing)) + (var(--th-layout-spacing) / 2));\n}\n\n.tree .treeItem:has(.treeItemButton) {\n padding-inline-start: calc(((var(--tree-item-level) - 1) * var(--th-layout-spacing)));\n}\n\n.treeItemText {\n display: flex;\n flex: 1 1 auto;\n}\n\n.treeItemTextTitle {\n text-wrap: balance;\n}\n\n.treeItemTextPosition {\n margin-inline-start: auto;\n padding-inline-start: calc(var(--th-layout-spacing) / 2);\n color: var(--th-theme-subdue);\n font-variant-numeric: lining-nums tabular-nums;\n}\n\n.treeItemButton {\n align-self: flex-start;\n width: calc(var(--th-icon-size, 24px) * 5/6);\n height: calc(var(--th-icon-size, 24px) * 5/6);\n margin-inline-end: calc(var(--th-layout-spacing) / 2);\n flex-shrink: 0;\n}\n\n.treeItem[data-href] {\n cursor: pointer;\n}\n\n/* [data-hover] is only updated on tree items that can be expanded ATM… */\n.treeItem:hover {\n background-color: var(--th-theme-hover);\n}\n\n.treeItem[data-focus-visible] {\n outline: 2px solid var(--th-theme-focus);\n}\n\n.treeItem[data-disabled] {\n color: var(--th-theme-disable);\n}\n\n.treeItem[data-selected] {\n border: 2px solid var(--th-theme-subdue);\n}\n\n.treeItemButton svg {\n flex: none;\n rotate: 0deg;\n transition: rotate 200ms;\n width: 100%;\n height: 100%;\n fill: var(--th-theme-text);\n}\n\n.treeItem[data-expanded] .treeItemButton svg {\n rotate: 90deg;\n}\n\n.empty {\n max-width: 25ch;\n text-align: start;\n text-wrap: balance;\n}","import * as React from \"react\";\nconst SvgChevronRight = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"inherit\" {...props}><path d=\"M504-480 320-664l56-56 240 240-240 240-56-56 184-184Z\" /></svg>;\nexport default SvgChevronRight;","\"use client\";\n\nimport React, { CSSProperties, useCallback, useEffect, useRef, useState } from \"react\";\n\nimport { Link } from \"@readium/shared\";\nimport { ThActionsKeys, ThDockingKeys, ThSheetTypes, ThLayoutDirection } from \"@/preferences/models\";\nimport { StatefulActionContainerProps } from \"../models/actions\";\nimport { TocItem } from \"@/core/Hooks/useTimeline\";\n\nimport tocStyles from \"./assets/styles/thorium-web.toc.module.css\";\n\nimport Chevron from \"./assets/icons/chevron_right.svg\";\n\nimport { StatefulSheetWrapper } from \"../../Sheets/StatefulSheetWrapper\";\nimport { ThFormSearchField } from \"@/core/Components\";\nimport { Button, Collection, Key, Selection, useFilter } from \"react-aria-components\";\nimport {\n Tree,\n TreeItem,\n TreeItemContent\n} from \"react-aria-components\";\n\nimport { useNavigator } from \"@/core/Navigator\";\nimport { useDocking } from \"../../Docking/hooks/useDocking\";\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { useAppDispatch, useAppSelector } from \"@/lib/hooks\";\nimport { setActionOpen } from \"@/lib/actionsReducer\";\nimport { setTocEntry } from \"@/lib/publicationReducer\";\nimport { setImmersive, setUserNavigated } from \"@/lib/readerReducer\";\n\nimport { isActiveElement } from \"@/core/Helpers/focusUtilities\";\n\nexport const StatefulTocContainer = ({ triggerRef }: StatefulActionContainerProps) => {\n const { t } = useI18n();\n\n const treeRef = useRef<HTMLDivElement>(null);\n const [expandedKeys, setExpandedKeys] = useState<Set<Key>>(new Set());\n\n const unstableTimeline = useAppSelector(state => state.publication.unstableTimeline);\n const tocEntry = unstableTimeline?.toc?.currentEntry;\n const tocTree = unstableTimeline?.toc?.tree;\n\n const direction = useAppSelector(state => state.reader.direction);\n const isRTL = direction === ThLayoutDirection.rtl;\n\n const actionState = useAppSelector(state => state.actions.keys[ThActionsKeys.toc]);\n const dispatch = useAppDispatch();\n\n const { goLink } = useNavigator();\n\n const docking = useDocking(ThActionsKeys.toc);\n const sheetType = docking.sheetType;\n\n const { contains } = useFilter({ sensitivity: \"base\" });\n const [filterValue, setFilterValue] = React.useState(\"\");\n const searchInputRef = React.useRef<HTMLInputElement>(null);\n\n const filterTocTree = (items: TocItem[], filterValue: string): TocItem[] => {\n if (!filterValue) {\n return items;\n }\n\n const recursiveFilter = (items: TocItem[]): TocItem[] => {\n return items.reduce((acc: TocItem[], item: TocItem) => {\n if (item.title && contains(item.title, filterValue)) {\n acc.push({ ...item, children: undefined });\n }\n if (item.children) {\n acc.push(...recursiveFilter(item.children));\n }\n return acc;\n }, []);\n };\n\n const result = recursiveFilter(items);\n return result.map((item: TocItem, index: number) => ({ ...item, key: `${item.id}-${index}` }));\n };\n\n const displayedTocTree = filterTocTree(tocTree || [], filterValue);\n\n const setOpen = useCallback((value: boolean) => {\n if (!value) setFilterValue(\"\");\n\n dispatch(setActionOpen({ \n key: ThActionsKeys.toc,\n isOpen: value \n }));\n }, [dispatch, setFilterValue]);\n\n const handleAction = (keys: Selection) => {\n if (keys === \"all\" || !keys || keys.size === 0) return;\n\n const key = [...keys][0];\n \n const el = document.querySelector(`[data-key=${key}]`);\n const href = el?.getAttribute(\"data-href\");\n\n if (!href) return;\n\n const link: Link = new Link({ href: href });\n\n const cb = actionState?.isOpen && \n (sheetType === ThSheetTypes.dockedStart || sheetType === ThSheetTypes.dockedEnd)\n ? () => {\n dispatch(setTocEntry(key));\n dispatch(setImmersive(true));\n dispatch(setUserNavigated(true));\n } \n : () => {\n dispatch(setTocEntry(key));\n dispatch(setImmersive(true));\n dispatch(setUserNavigated(true));\n setOpen(false);\n }\n\n goLink(link, true, cb);\n };\n\n // Since React Aria components intercept keys and do not continue propagation\n // we have to handle the escape key in capture phase\n useEffect(() => {\n if (actionState?.isOpen && (!actionState?.docking || actionState?.docking === ThDockingKeys.transient)) { \n const handleEscape = (event: KeyboardEvent) => {\n if ((!isActiveElement(searchInputRef.current) && !filterValue) && event.key === \"Escape\" ) {\n setOpen(false);\n }\n };\n\n document.addEventListener(\"keydown\", handleEscape, true);\n\n return () => {\n document.removeEventListener(\"keydown\", handleEscape, true);\n };\n }\n }, [actionState, setOpen, filterValue]);\n\n // Update expanded keys when tocEntry changes\n useEffect(() => {\n if (tocEntry && tocTree) {\n setExpandedKeys(prevExpandedKeys => {\n // Start with the current expanded keys to preserve existing state\n const newExpandedKeys = new Set<Key>(prevExpandedKeys);\n let hasUpdates = false;\n \n // Helper function to find and expand parent items of the current entry\n const updateExpanded = (items: TocItem[]): boolean => {\n return items.some(item => {\n if (item.id === tocEntry) return true;\n if (item.children) {\n const hasChild = updateExpanded(item.children);\n if (hasChild && !newExpandedKeys.has(item.id)) {\n newExpandedKeys.add(item.id);\n hasUpdates = true;\n }\n return hasChild;\n }\n return false;\n });\n };\n \n // Only update state if we actually need to expand anything\n updateExpanded(tocTree);\n return hasUpdates ? newExpandedKeys : prevExpandedKeys;\n });\n }\n }, [tocEntry, tocTree]);\n\n return(\n <>\n <StatefulSheetWrapper \n sheetType={ sheetType }\n sheetProps={ {\n id: ThActionsKeys.toc,\n triggerRef: triggerRef, \n heading: t(\"reader.tableOfContents.title\"),\n className: tocStyles.wrapper,\n placement: \"bottom\",\n isOpen: actionState?.isOpen || false,\n onOpenChange: setOpen,\n onClosePress: () => setOpen(false),\n docker: docking.getDocker(),\n resetFocus: tocEntry,\n focusWithinRef: treeRef\n } }\n >\n { tocTree && tocTree.length > 0 \n ? (<>\n <ThFormSearchField\n aria-label={ t(\"common.actions.search\") }\n value={ filterValue }\n onChange={ setFilterValue }\n onClear={ () => setFilterValue(\"\") }\n className={ tocStyles.search }\n compounds={{\n label: {\n className: tocStyles.searchLabel\n },\n input: {\n ref: searchInputRef,\n className: tocStyles.searchInput,\n placeholder: t(\"common.actions.search\")\n },\n searchIcon: {\n className: tocStyles.searchIcon,\n hidden: !!filterValue\n },\n clearButton: {\n className: tocStyles.clearButton,\n isDisabled: !filterValue,\n \"aria-label\": t(\"common.actions.clear\")\n }\n }}\n />\n <Tree\n ref={ treeRef }\n aria-label={ t(\"reader.toc.entries\") }\n selectionMode=\"single\"\n items={ displayedTocTree }\n className={ tocStyles.tree }\n onSelectionChange={ handleAction }\n selectedKeys={ tocEntry ? [tocEntry] : [] }\n expandedKeys={ expandedKeys }\n onExpandedChange={ setExpandedKeys }\n >\n { function renderItem(item) {\n return (\n <TreeItem\n data-href={ item.href }\n className={ tocStyles.treeItem }\n textValue={ item.title || \"\" }\n >\n <TreeItemContent>\n {item.children && (\n <Button\n slot=\"chevron\"\n className={tocStyles.treeItemButton}\n style={{ transform: isRTL ? \"scaleX(-1)\" : \"none\" } as CSSProperties}\n >\n <Chevron aria-hidden=\"true\" focusable=\"false\" />\n </Button>\n )}\n <div className={ tocStyles.treeItemText }>\n <div className={ tocStyles.treeItemTextTitle }>{ item.title }</div>\n { item.position && <div className={ tocStyles.treeItemTextPosition }>{ item.position }</div> }\n </div>\n </TreeItemContent>\n <Collection items={ item.children }>\n { renderItem }\n </Collection>\n </TreeItem>\n );\n } }\n </Tree>\n </>) \n : <div className={ tocStyles.empty }>{ t(\"reader.tableOfContents.emptyState.description\") }</div>\n }\n </StatefulSheetWrapper>\n </>\n )\n}","import * as React from \"react\";\nconst SvgToc = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"inherit\" {...props}><path d=\"M120-280v-80h560v80H120Zm0-160v-80h560v80H120Zm0-160v-80h560v80H120Zm680 320q-17 0-28.5-11.5T760-320q0-17 11.5-28.5T800-360q17 0 28.5 11.5T840-320q0 17-11.5 28.5T800-280Zm0-160q-17 0-28.5-11.5T760-480q0-17 11.5-28.5T800-520q17 0 28.5 11.5T840-480q0 17-11.5 28.5T800-440Zm0-160q-17 0-28.5-11.5T760-640q0-17 11.5-28.5T800-680q17 0 28.5 11.5T840-640q0 17-11.5 28.5T800-600Z\" /></svg>;\nexport default SvgToc;","\"use client\";\n\nimport { ThActionsKeys } from \"@/preferences/models\";\n\nimport TocIcon from \"./assets/icons/toc.svg\";\n\nimport { StatefulActionTriggerProps } from \"../models/actions\";\nimport { ThActionsTriggerVariant } from \"@/core/Components/Actions/ThActionsBar\";\n\nimport { StatefulActionIcon } from \"../Triggers/StatefulActionIcon\";\nimport { StatefulOverflowMenuItem } from \"../Triggers/StatefulOverflowMenuItem\";\n\nimport { usePreferences } from \"@/preferences/hooks/usePreferences\";\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { useAppDispatch, useAppSelector } from \"@/lib/hooks\";\nimport { setActionOpen } from \"@/lib/actionsReducer\";\n\nexport const StatefulTocTrigger = ({ variant }: StatefulActionTriggerProps) => {\n const { preferences } = usePreferences();\n const { t } = useI18n();\n const actionState = useAppSelector(state => state.actions.keys[ThActionsKeys.toc]);\n const dispatch = useAppDispatch();\n\n const setOpen = (value: boolean) => {\n dispatch(setActionOpen({ \n key: ThActionsKeys.toc,\n isOpen: value \n }));\n }\n\n return(\n <>\n { (variant && variant === ThActionsTriggerVariant.menu) \n ? <StatefulOverflowMenuItem \n label={ t(\"reader.tableOfContents.title\") }\n SVGIcon={ TocIcon } \n shortcut={ preferences.actions.keys[ThActionsKeys.toc].shortcut }\n id={ ThActionsKeys.toc }\n onAction={ () => setOpen(!actionState?.isOpen) }\n />\n : <StatefulActionIcon \n visibility={ preferences.actions.keys[ThActionsKeys.toc].visibility }\n aria-label={ t(\"reader.tableOfContents.title\") } \n placement=\"bottom\"\n tooltipLabel={ t(\"reader.tableOfContents.title\") } \n onPress={ () => setOpen(!actionState?.isOpen) }\n >\n <TocIcon aria-hidden=\"true\" focusable=\"false\" />\n </StatefulActionIcon>\n }\n </>\n )\n}","\"use client\";\n\nimport { useEffect, useState } from \"react\";\n\nimport debounce from \"debounce\";\n\nexport const useGridTemplate = (ref: React.RefObject<HTMLDivElement | null>, type: \"columns\" | \"rows\" = \"columns\") => {\n const [visibleColumns, setVisibleColumns] = useState<number | null>(null);\n\n const updateVisibleColumns = () => {\n if (!ref.current) return;\n const computedStyle = window.getComputedStyle(ref.current);\n const columns = computedStyle.getPropertyValue(`grid-template-${ type }`);\n const columnCount = columns.replace(\"0px\", \"\").split(\" \").length;\n setVisibleColumns(columnCount);\n };\n\n const debouncedUpdateVisibleColumns = debounce(updateVisibleColumns, 100);\n\n useEffect(() => {\n updateVisibleColumns();\n\n const resizeObserver = new ResizeObserver(debouncedUpdateVisibleColumns);\n if (ref.current) {\n resizeObserver.observe(ref.current);\n }\n\n return () => {\n resizeObserver.disconnect();\n debouncedUpdateVisibleColumns.clear();\n };\n });\n\n return visibleColumns;\n};","\"use client\";\n\nimport React from \"react\";\n\nimport { useGridTemplate } from \"./useGridTemplate\";\n\nexport interface useGridNavigationProps {\n containerRef: React.RefObject<HTMLDivElement | null>,\n items: React.RefObject<any[]>,\n currentValue: any,\n onChange: (value: any) => void,\n isRTL?: boolean,\n onEscape?: () => void,\n onFocus?: (value: string) => void\n}\n\nexport const useGridNavigation = ({\n containerRef,\n items,\n currentValue,\n onChange,\n isRTL,\n onEscape,\n onFocus\n}: useGridNavigationProps) => {\n const visibleColumns = useGridTemplate(containerRef, \"columns\");\n\n const onKeyDown = React.useCallback((e: React.KeyboardEvent) => {\n const columns = visibleColumns || 1;\n if (columns <= 1 || !items.current?.length) return;\n\n // Handle both object items { value, label, icon } and primitive items\n const currentIdx = items.current.findIndex((val) => {\n if (typeof val === \"object\" && val !== null && \"value\" in val) {\n return val.value === currentValue;\n }\n return val === currentValue;\n });\n\n if (currentIdx === -1) return;\n\n let nextIdx: number | null = null;\n\n switch (e.code) {\n case \"ArrowUp\":\n e.preventDefault();\n nextIdx = currentIdx - columns;\n break;\n case \"ArrowDown\":\n e.preventDefault();\n nextIdx = currentIdx + columns;\n break;\n case \"ArrowLeft\":\n e.preventDefault();\n nextIdx = isRTL ? currentIdx + 1 : currentIdx - 1;\n break;\n case \"ArrowRight\":\n e.preventDefault();\n nextIdx = isRTL ? currentIdx - 1 : currentIdx + 1;\n break;\n case \"Escape\":\n if (onEscape) {\n e.preventDefault();\n onEscape();\n }\n return;\n default:\n return;\n }\n\n if (nextIdx !== null && nextIdx >= 0 && nextIdx < items.current.length) {\n const nextItem = items.current[nextIdx];\n\n // Extract value from object items or use primitive directly\n const nextValue = (typeof nextItem === \"object\" && nextItem !== null && \"value\" in nextItem)\n ? nextItem.value\n : nextItem;\n\n onChange(nextValue);\n\n if (onFocus) {\n onFocus(nextValue);\n }\n }\n }, [visibleColumns, items, currentValue, onChange, isRTL, onEscape, onFocus]);\n\n return { onKeyDown };\n};","\"use client\";\n\nimport { useCallback, useRef } from \"react\";\n\nimport settingsStyles from \"./assets/styles/thorium-web.reader.settings.module.css\";\n\nimport { ThActionsKeys, ThLayoutDirection, ThSettingsContainerKeys } from \"@/preferences/models\";\n\nimport { ThRadioGroup, ThRadioGroupProps } from \"@/core/Components/Settings/ThRadioGroup\";\n\nimport { useGridNavigation } from \"./hooks/useGridNavigation\";\n\nimport { useAppDispatch, useAppSelector } from \"@/lib/hooks\";\nimport { setActionOpen } from \"@/lib/actionsReducer\";\nimport { setSettingsContainer } from \"@/lib/readerReducer\";\n\nexport interface StatefulRadioGroupProps extends Omit<ThRadioGroupProps, \"classNames\"> {\n standalone?: boolean;\n useGraphicalNavigation?: boolean;\n onEscape?: () => void;\n}\n\nexport const StatefulRadioGroup = ({\n ref,\n standalone,\n useGraphicalNavigation = true,\n label,\n items,\n value,\n children,\n onChange,\n onEscape,\n ...props\n}: StatefulRadioGroupProps) => {\n const itemsRef = useRef(items || []);\n const wrapperRef = useRef<HTMLDivElement | null>(null);\n const direction = useAppSelector(state => state.reader.direction);\n const isRTL = direction === ThLayoutDirection.rtl;\n const settingsContainer = useAppSelector(state => state.reader.settingsContainer);\n \n const dispatch = useAppDispatch();\n\n // Default escape handler that adapts to context\n const onEscapeCallback = useCallback(() => {\n if (settingsContainer !== ThSettingsContainerKeys.initial) {\n // In subpanel - go back to initial view\n dispatch(setSettingsContainer(ThSettingsContainerKeys.initial));\n } else {\n // In main panel - close settings\n dispatch(setActionOpen({\n key: ThActionsKeys.settings,\n isOpen: false\n }));\n }\n }, [dispatch, settingsContainer]);\n\n // Default focus handler that focuses elements by value within the container only\n const onFocusCallback = useCallback((value: string) => {\n const element = wrapperRef.current?.querySelector(`[value=\"${ value }\"]`);\n if (element) (element as HTMLElement).focus();\n }, []);\n\n const { onKeyDown } = useGridNavigation({\n containerRef: wrapperRef,\n items: useGraphicalNavigation !== false ? itemsRef : { current: [] },\n currentValue: useGraphicalNavigation !== false ? value : null,\n onChange: onChange || (() => {}),\n isRTL,\n onEscape: onEscape || onEscapeCallback,\n onFocus: onFocusCallback\n });\n\nreturn (\n <>\n <ThRadioGroup \n ref={ ref }\n className={ standalone ? settingsStyles.group : \"\" }\n { ...props }\n { ...(standalone ? { label: label } : { \"aria-label\": label }) }\n value={ value }\n onChange={ onChange }\n items={ useGraphicalNavigation !== false ? items : [] }\n compounds={{\n wrapper: {\n className: settingsStyles.radioWrapper,\n ref: wrapperRef\n },\n label: {\n className: settingsStyles.label\n },\n radio: {\n className: settingsStyles.radio,\n onKeyDown: useGraphicalNavigation !== false ? onKeyDown : undefined\n }\n }}\n >\n { children }\n </ThRadioGroup>\n </>\n )\n};","import * as React from \"react\";\nconst SvgDocumentScanner = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"inherit\" {...props}><path d=\"M80-720v-200h200v80H160v120H80Zm720 0v-120H680v-80h200v200h-80ZM80-40v-200h80v120h120v80H80Zm600 0v-80h120v-120h80v200H680ZM280-240h400v-480H280v480Zm0 80q-33 0-56.5-23.5T200-240v-480q0-33 23.5-56.5T280-800h400q33 0 56.5 23.5T760-720v480q0 33-23.5 56.5T680-160H280Zm80-400h240v-80H360v80Zm0 120h240v-80H360v80Zm0 120h240v-80H360v80Zm-80 80v-480 480Z\" /></svg>;\nexport default SvgDocumentScanner;","import * as React from \"react\";\nconst SvgArticle = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"inherit\" {...props}><path d=\"M280-280h280v-80H280v80Zm0-160h400v-80H280v80Zm0-160h400v-80H280v80Zm-80 480q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h560q33 0 56.5 23.5T840-760v560q0 33-23.5 56.5T760-120H200Zm0-80h560v-560H200v560Zm0-560v560-560Z\" /></svg>;\nexport default SvgArticle;","import * as React from \"react\";\nconst SvgMenuBook = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"inherit\" {...props}><path d=\"M560-564v-68q33-14 67.5-21t72.5-7q26 0 51 4t49 10v64q-24-9-48.5-13.5T700-600q-38 0-73 9.5T560-564Zm0 220v-68q33-14 67.5-21t72.5-7q26 0 51 4t49 10v64q-24-9-48.5-13.5T700-380q-38 0-73 9t-67 27Zm0-110v-68q33-14 67.5-21t72.5-7q26 0 51 4t49 10v64q-24-9-48.5-13.5T700-490q-38 0-73 9.5T560-454ZM260-320q47 0 91.5 10.5T440-278v-394q-41-24-87-36t-93-12q-36 0-71.5 7T120-692v396q35-12 69.5-18t70.5-6Zm260 42q44-21 88.5-31.5T700-320q36 0 70.5 6t69.5 18v-396q-33-14-68.5-21t-71.5-7q-47 0-93 12t-87 36v394Zm-40 118q-48-38-104-59t-116-21q-42 0-82.5 11T100-198q-21 11-40.5-1T40-234v-482q0-11 5.5-21T62-752q46-24 96-36t102-12q58 0 113.5 15T480-740q51-30 106.5-45T700-800q52 0 102 12t96 36q11 5 16.5 15t5.5 21v482q0 23-19.5 35t-40.5 1q-37-20-77.5-31T700-240q-60 0-116 21t-104 59ZM280-494Z\" /></svg>;\nexport default SvgMenuBook;","\"use client\";\n\nimport React, { useCallback, useEffect, useMemo, useState } from \"react\";\n\nimport AutoLayoutIcon from \"./assets/icons/document_scanner.svg\";\nimport OneColIcon from \"./assets/icons/article.svg\";\nimport TwoColsIcon from \"./assets/icons/menu_book.svg\";\n\nimport { StatefulRadioGroup } from \"../../Settings/StatefulRadioGroup\";\n\nimport { useEpubNavigator } from \"@/core/Hooks/Epub/useEpubNavigator\";\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { useAppSelector, useAppDispatch } from \"@/lib/hooks\";\nimport { setColumnCount } from \"@/lib/settingsReducer\";\n\nimport debounce from \"debounce\";\n\nexport const StatefulColumns = () => {\n const { t } = useI18n();\n const scroll = useAppSelector(state => state.settings.scroll);\n const isFXL = useAppSelector(state => state.publication.isFXL);\n const isScroll = scroll && !isFXL;\n\n const columnCount = useAppSelector(state => state.settings.columnCount) || \"auto\";\n const [effectiveValue, setEffectiveValue] = useState(columnCount);\n\n const fontSize = useAppSelector(state => state.settings.fontSize);\n const fontFamily = useAppSelector(state => state.settings.fontFamily);\n const wordSpacing = useAppSelector(state => state.settings.wordSpacing);\n const letterSpacing = useAppSelector(state => state.settings.letterSpacing);\n const publisherStyles = useAppSelector(state => state.settings.publisherStyles);\n\n const layoutSettings = useMemo(() => {\n return {\n fontSize,\n fontFamily,\n wordSpacing,\n letterSpacing,\n publisherStyles\n };\n }, [fontSize, fontFamily, wordSpacing, letterSpacing, publisherStyles]);\n\n const dispatch = useAppDispatch();\n\n const { submitPreferences, getSetting } = useEpubNavigator();\n\n const items = useMemo(() => [\n {\n id: \"auto\",\n icon: AutoLayoutIcon,\n label: t(\"reader.preferences.columns.auto\"), \n value: \"auto\" \n },\n {\n id: \"1\",\n icon: OneColIcon,\n label: t(\"reader.preferences.columns.single.compact\"), \n value: \"1\" \n },\n {\n id: \"2\",\n icon: TwoColsIcon,\n label: t(\"reader.preferences.columns.dual.compact\"), \n value: \"2\",\n // This is subpar when the columnCount is 1 though because\n // it won't be disabled, but it's the best we can do with\n // the preferences API at the moment\n isDisabled: effectiveValue === \"1\" && columnCount === \"2\"\n }\n ], [t, effectiveValue, columnCount]);\n\n const updateEffectiveValue = useCallback((preference: string, setting: number | null) => {\n const derivedValue = preference === \"auto\" || setting === null ? \"auto\" : setting.toString();\n setEffectiveValue(derivedValue);\n }, []);\n\n const updatePreference = useCallback(async (value: string) => {\n const colCount = value === \"auto\" ? null : Number(value);\n await submitPreferences({ columnCount: colCount });\n updateEffectiveValue(value, getSetting(\"columnCount\"));\n dispatch(setColumnCount(value));\n }, [submitPreferences, getSetting, updateEffectiveValue, dispatch]);\n\n const debouncedUpdate = useCallback(() => {\n const update = () => updateEffectiveValue(columnCount, getSetting(\"columnCount\"));\n debounce(update, 50)();\n\n // layoutSettings is required as a dependency because it contains all the settings\n // that affect column layout (fontSize, fontFamily, wordSpacing, letterSpacing, publisherStyles)\n // and we need to recalculate the layout when any of these change.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [columnCount, layoutSettings, getSetting, updateEffectiveValue]);\n\n useEffect(() => {\n debouncedUpdate();\n\n window.addEventListener(\"resize\", debouncedUpdate);\n\n return () => {\n window.removeEventListener(\"resize\", debouncedUpdate);\n };\n }, [debouncedUpdate]);\n\n return (\n <>\n <StatefulRadioGroup \n standalone={ true }\n label={ t(\"reader.preferences.columns.title\") }\n orientation=\"horizontal\"\n value={ effectiveValue }\n onChange={ async (val: string) => await updatePreference(val) }\n isDisabled={ isScroll }\n items={ items }\n />\n </>\n );\n}","\"use client\";\n\nimport React from \"react\";\n\nimport settingsStyles from \"./assets/styles/thorium-web.reader.settings.module.css\";\n\nimport { ThDropdown, ThDropdownProps } from \"@/core/Components/Settings/ThDropdown/ThDropdown\";\n\nimport classNames from \"classnames\";\n\nexport interface StatefulDropdownProps extends Omit<ThDropdownProps, \"classNames\"> {\n standalone?: boolean;\n}\n\nexport const StatefulDropdown = ({\n standalone,\n label,\n className,\n compounds,\n ...props\n}: StatefulDropdownProps) => {\n\n return (\n <ThDropdown\n { ...props }\n { ...(standalone ? { label } : { \"aria-label\": label }) }\n className={ classNames(\n settingsStyles.dropdown,\n standalone && settingsStyles.group,\n className\n ) }\n compounds={{\n label: {\n className: settingsStyles.label,\n ...(compounds?.label || {})\n },\n ...(React.isValidElement(compounds?.button) \n ? { button: compounds.button }\n : {\n button: {\n className: settingsStyles.dropdownButton,\n ...(compounds?.button || {})\n }\n }),\n popover: {\n className: settingsStyles.dropdownPopover,\n placement: \"bottom\",\n ...(compounds?.popover || {})\n },\n ...(React.isValidElement(compounds?.listbox) \n ? { listbox: compounds.listbox }\n : {\n listbox: {\n className: settingsStyles.dropdownListbox,\n ...(compounds?.listbox || {})\n },\n listboxItem: {\n className: settingsStyles.dropdownListboxItem,\n ...(compounds?.listboxItem || {})\n }\n })\n }}\n />\n );\n};\n","\"use client\";\n\nimport { CSSProperties, Key, useCallback, useRef } from \"react\";\n\nimport { StatefulSettingsItemProps } from \"../models/settings\";\n\nimport settingsStyles from \"../assets/styles/thorium-web.reader.settings.module.css\";\n\nimport { StatefulDropdown } from \"../StatefulDropdown\";\nimport { ListBox, ListBoxItem } from \"react-aria-components\";\n\nimport { useNavigator } from \"@/core/Navigator\";\nimport { useI18n } from \"@/i18n/useI18n\";\nimport { usePreferences } from \"@/preferences/hooks/usePreferences\";\nimport { FontDefinition } from \"@/preferences/models\";\n\nimport { useAppDispatch, useAppSelector } from \"@/lib/hooks\";\nimport { setFontFamily } from \"@/lib/settingsReducer\";\nimport { setWebPubFontFamily } from \"@/lib/webPubSettingsReducer\";\n\nexport const StatefulFontFamily = ({ standalone = true }: StatefulSettingsItemProps & { publicationLanguage?: string }) => {\n const { getFontMetadata, getFontsList } = usePreferences();\n const { t } = useI18n();\n\n const getFontFamilyLabel = useCallback((font: FontDefinition): string => {\n // Handle i18n label if present\n if (font.label) {\n if (typeof font.label === \"string\") {\n return t(font.label, { defaultValue: font.label || font.name });\n } else if (typeof font.label === \"object\" && \"key\" in font.label) {\n return t(font.label.key, { \n defaultValue: font.label.fallback || font.name \n });\n }\n }\n\n // Fall back to the font's name\n return font.name;\n }, [t]);\n\n const profile = useAppSelector(state => state.reader.profile);\n const isWebPub = profile === \"webPub\";\n\n const fontLanguage = useAppSelector(state => state.publication.fontLanguage) || \"default\";\n\n // Get language-specific font preferences\n const fontPreferences = getFontsList({ language: fontLanguage });\n\n const fontFamily = useAppSelector(state => {\n const fontSettings = isWebPub ? state.webPubSettings.fontFamily : state.settings.fontFamily;\n return fontSettings[fontLanguage] ?? \"publisher\";\n });\n \n // Check if current font exists in available options, fallback to publisher if not\n const availableFontIds = new Set([\n \"publisher\",\n ...Object.keys(fontPreferences)\n ]);\n const currentFontFamily = availableFontIds.has(fontFamily) ? fontFamily : \"publisher\";\n\n const fontFamilyOptions = useRef([\n {\n id: \"publisher\",\n label: t(\"reader.preferences.fontFamily.publisher\"),\n value: null\n },\n ...Object.entries(fontPreferences).map(([id, font]) => {\n const metadata = getFontMetadata(id);\n return {\n id,\n label: getFontFamilyLabel(font),\n value: metadata.fontStack || metadata.fontFamily\n };\n })\n ]);\n\n const dispatch = useAppDispatch();\n\n const { getSetting, submitPreferences } = useNavigator();\n\n const updatePreference = useCallback(async (key: Key | null) => {\n if (!key || key === fontFamily) return;\n\n const selectedOption = fontFamilyOptions.current.find((option) => option.id === key) as {\n id: keyof ReturnType<typeof getFontsList> | \"publisher\";\n label: string;\n value: string | null;\n };\n \n if (selectedOption) {\n await submitPreferences({ fontFamily: selectedOption.value });\n \n const currentSetting = getSetting(\"fontFamily\");\n \n // Handle publisher font case (when currentSetting is null)\n if (currentSetting === null) {\n if (isWebPub) {\n dispatch(setWebPubFontFamily({ key: fontLanguage, value: \"publisher\" }));\n } else {\n dispatch(setFontFamily({ key: fontLanguage, value: \"publisher\" }));\n }\n return;\n }\n \n // Handle other font cases\n const entry = Object.entries(fontPreferences).find(([id]) => {\n const metadata = getFontMetadata(id);\n return metadata.fontStack === currentSetting || \n metadata.fontFamily === currentSetting;\n });\n \n if (entry) {\n const [selectedOptionId] = entry;\n if (isWebPub) {\n dispatch(setWebPubFontFamily({ key: fontLanguage, value: selectedOptionId }));\n } else {\n dispatch(setFontFamily({ key: fontLanguage, value: selectedOptionId }));\n }\n }\n }\n }, [isWebPub, fontLanguage, fontFamily, submitPreferences, getSetting, fontPreferences, getFontMetadata, dispatch]);\n\n return (\n <StatefulDropdown\n standalone={ standalone }\n label={ t(\"reader.preferences.fontFamily.title\") }\n selectedKey={ currentFontFamily }\n onSelectionChange={ async (key) => await updatePreference(key) }\n compounds={ {\n listbox: (\n <ListBox\n className={ settingsStyles.dropdownListbox }\n items={ fontFamilyOptions.current }\n >\n { (item) => (\n <ListBoxItem\n className={ settingsStyles.dropdownListboxItem }\n id={ item.id }\n key={ item.id }\n textValue={ item.value || undefined }\n style={{ fontFamily: item.value || undefined } as CSSProperties}\n >\n { item.label }\n </ListBoxItem>\n )}\n </ListBox>\n )\n }}\n />\n )\n}","import * as React from \"react\";\nconst SvgFormatBoldWght200 = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"inherit\" {...props}><path d=\"M315.08-230v-500H483q57.31 0 101.15 36.15Q628-657.69 628-599.77q0 38.69-20.31 67.73-20.31 29.04-50.31 42.58 36.54 10.23 62.04 42.92t25.5 78.85q0 64.38-48.07 101.04Q548.77-230 491-230H315.08Zm51-47.38h122.46q46.46 0 75.04-27.97 28.57-27.96 28.57-65.11 0-37.16-28.57-65.12-28.58-27.96-75.73-27.96H366.08v186.16Zm0-232.62h114.54q39.92 0 67.61-24.69 27.69-24.69 27.69-61.85 0-37.84-28.15-62.08-28.15-24.23-66.69-24.23h-115V-510Z\" /></svg>;\nexport default SvgFormatBoldWght200;","import * as React from \"react\";\nconst SvgFormatBoldWght500 = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"inherit\" {...props}><path d=\"M260.04-192.11v-576.02h240.61q68.11 0 123.71 42.03 55.6 42.03 55.6 113.99 0 48.13-21.81 77.43-21.8 29.29-45.39 42.48v.72q29.54 12.68 58.37 45.07t28.83 89.52q0 86.61-64.29 125.69-64.28 39.09-127.5 39.09H260.04Zm129.13-116.3h109.98q43.22 0 56.11-22.95 12.89-22.94 12.89-37.77 0-14.83-12.89-37.89-12.89-23.07-58.39-23.07h-107.7v121.68Zm0-234.22h99.46q31.09 0 46.92-16.88 15.84-16.88 15.84-38.6 0-24-17.36-39.36t-43.88-15.36H389.17v110.2Z\" /></svg>;\nexport default SvgFormatBoldWght500;","\"use client\";\n\nimport { useMemo, useCallback } from \"react\";\n\nimport { StatefulSettingsItemProps } from \"../models/settings\";\n\nimport DefaultIcon from \"./assets/icons/format_bold_wght200.svg\";\nimport BolderIcon from \"./assets/icons/format_bold_wght500.svg\";\n\nimport { StatefulRadioGroup } from \"@/components/Settings/StatefulRadioGroup\";\n\nimport { useNavigator } from \"@/core/Navigator\";\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { useAppDispatch, useAppSelector } from \"@/lib/hooks\";\nimport { setFontWeight } from \"@/lib/settingsReducer\";\nimport { setWebPubFontWeight } from \"@/lib/webPubSettingsReducer\";\n\ntype FontWeight = \"default\" | \"bolder\";\n\nexport const UnstableStatefulFontWeight = ({ standalone = true }: StatefulSettingsItemProps) => {\n const { t } = useI18n();\n\n const profile = useAppSelector(state => state.reader.profile);\n const isWebPub = profile === \"webPub\";\n \n const fontWeight = useAppSelector(state => isWebPub ? state.webPubSettings.fontWeight : state.settings.fontWeight) ?? 400;\n\n const dispatch = useAppDispatch();\n\n const { getSetting, submitPreferences } = useNavigator();\n\n const items = [\n {\n id: \"default\",\n icon: DefaultIcon,\n label: t(\"reader.preferences.fontWeight.normal\"), \n value: \"default\" \n },\n {\n id: \"bolder\",\n icon: BolderIcon,\n label: t(\"reader.preferences.fontWeight.bold\"), \n value: \"bolder\" \n }\n ];\n\n const derivedValue = useMemo(() => {\n if (fontWeight === 400) {\n return \"default\";\n } else if (fontWeight === 700) {\n return \"bolder\";\n }\n return \"default\";\n }, [fontWeight]);\n\n const updatePreference = useCallback(async (value: FontWeight) => {\n const fontWeightValue = value === \"default\" ? 400 : 700;\n await submitPreferences({ fontWeight: fontWeightValue });\n const effectiveSetting = getSetting(\"fontWeight\");\n\n if (isWebPub) {\n dispatch(setWebPubFontWeight(effectiveSetting));\n } else {\n dispatch(setFontWeight(effectiveSetting));\n }\n }, [isWebPub, submitPreferences, getSetting, dispatch]);\n\n return(\n <>\n <StatefulRadioGroup \n standalone={ standalone } \n label={ t(\"reader.preferences.fontWeight.title\") }\n orientation=\"horizontal\" \n value={ derivedValue } \n onChange={ async (val: string) => await updatePreference(val as FontWeight) }\n items={ items }\n /> \n </>\n )\n}","\"use client\";\n\nimport settingsStyles from \"./assets/styles/thorium-web.reader.settings.module.css\";\n\nimport { ThSwitch, ThSwitchProps } from \"@/core/Components/Settings/ThSwitch\";\n\nexport interface StatefulSwitchProps extends Omit<ThSwitchProps, \"classNames\"> {\n standalone?: boolean;\n}\n\nexport const StatefulSwitch = ({\n standalone,\n label,\n heading, \n ...props\n}: StatefulSwitchProps) => {\n return(\n <>\n <ThSwitch \n { ...props }\n { ...(standalone ? { heading: heading } : {}) }\n label={ label }\n className={ settingsStyles.switch }\n compounds={{\n wrapper: {\n className: settingsStyles.group\n },\n heading: {\n className: settingsStyles.label\n },\n indicator: {\n className: settingsStyles.switchIndicator\n }\n }}\n />\n </>\n )\n}","\"use client\";\n\nimport { useCallback } from \"react\";\n\nimport { StatefulSettingsItemProps } from \"../models/settings\";\nimport { ThTextAlignOptions } from \"@/preferences/models\";\n\nimport { StatefulSwitch } from \"../StatefulSwitch\";\n\nimport { useNavigator } from \"@/core/Navigator\";\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { useAppDispatch, useAppSelector } from \"@/lib/hooks\";\nimport { setHyphens } from \"@/lib/settingsReducer\";\nimport { setWebPubHyphens } from \"@/lib/webPubSettingsReducer\";\n\n// TMP Component that is not meant to be implemented AS-IS, for testing purposes\nexport const StatefulHyphens = ({ standalone = true }: StatefulSettingsItemProps) => {\n const { t } = useI18n();\n\n const profile = useAppSelector(state => state.reader.profile);\n const isWebPub = profile === \"webPub\";\n \n const hyphens = useAppSelector(state => isWebPub ? state.webPubSettings.hyphens : state.settings.hyphens) ?? false;\n const textAlign = useAppSelector(state => isWebPub ? state.webPubSettings.textAlign : state.settings.textAlign) ?? ThTextAlignOptions.publisher;\n\n const dispatch = useAppDispatch();\n \n const { getSetting, submitPreferences } = useNavigator();\n \n const updatePreference = useCallback(async (value: boolean) => {\n await submitPreferences({ hyphens: value });\n const effectiveSetting = getSetting(\"hyphens\");\n \n if (isWebPub) {\n dispatch(setWebPubHyphens(effectiveSetting));\n } else {\n dispatch(setHyphens(effectiveSetting));\n }\n }, [isWebPub, submitPreferences, getSetting, dispatch]);\n\n return(\n <>\n <StatefulSwitch \n standalone={ standalone }\n heading={ t(\"reader.preferences.hyphens.title\") }\n label={ t(\"reader.preferences.hyphens.label\") }\n onChange={ async (isSelected: boolean) => await updatePreference(isSelected) }\n isSelected={ hyphens ?? false }\n isDisabled={ textAlign === ThTextAlignOptions.publisher }\n />\n </>\n )\n}","import * as React from \"react\";\nconst SvgContract = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"inherit\" {...props}><path d=\"M240-80q-50 0-85-35t-35-85v-120h120v-560h600v680q0 50-35 85t-85 35H240Zm480-80q17 0 28.5-11.5T760-200v-600H320v480h360v120q0 17 11.5 28.5T720-160ZM360-600v-80h360v80H360Zm0 120v-80h360v80H360ZM240-160h360v-80H200v40q0 17 11.5 28.5T240-160Zm0 0h-40 400-360Z\" /></svg>;\nexport default SvgContract;","import * as React from \"react\";\nconst SvgDocs = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"inherit\" {...props}><path d=\"M320-440h320v-80H320v80Zm0 120h320v-80H320v80Zm0 120h200v-80H320v80ZM240-80q-33 0-56.5-23.5T160-160v-640q0-33 23.5-56.5T240-880h320l240 240v480q0 33-23.5 56.5T720-80H240Zm280-520v-200H240v640h480v-440H520ZM240-800v200-200 640-640Z\" /></svg>;\nexport default SvgDocs;","\"use client\";\n\nimport { useCallback } from \"react\";\n\nimport { ThLayoutOptions } from \"@/preferences/models\";\n\nimport ScrollableIcon from \"./assets/icons/contract.svg\";\nimport PaginatedIcon from \"./assets/icons/docs.svg\";\n\nimport { StatefulRadioGroup } from \"../../Settings/StatefulRadioGroup\";\n\nimport { useEpubNavigator } from \"@/core/Hooks/Epub/useEpubNavigator\";\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { useAppDispatch, useAppSelector } from \"@/lib/hooks\";\nimport { setScroll } from \"@/lib/settingsReducer\";\n\nexport const StatefulLayout = () => {\n const { t } = useI18n();\n const scroll = useAppSelector(state => state.settings.scroll);\n const isFXL = useAppSelector(state => state.publication.isFXL);\n const isScroll = scroll && !isFXL;\n\n const dispatch = useAppDispatch();\n\n const { getSetting, submitPreferences } = useEpubNavigator();\n\n const items = [\n {\n id: ThLayoutOptions.paginated,\n icon: PaginatedIcon,\n label: t(\"reader.preferences.layout.paginated\"),\n value: ThLayoutOptions.paginated\n },\n {\n id: ThLayoutOptions.scroll,\n icon: ScrollableIcon,\n label: t(\"reader.preferences.layout.scrolled\"),\n value: ThLayoutOptions.scroll\n }\n ];\n\n const updatePreference = useCallback(async (value: string) => { \n const derivedValue = value === ThLayoutOptions.scroll;\n await submitPreferences({ scroll: derivedValue });\n dispatch(setScroll(getSetting(\"scroll\")));\n }, [submitPreferences, getSetting, dispatch]);\n\n return (\n <>\n <StatefulRadioGroup\n standalone={ true }\n label={ t(\"reader.preferences.layout.title\") }\n orientation=\"horizontal\"\n value={ isScroll ? ThLayoutOptions.scroll : ThLayoutOptions.paginated }\n onChange={ async (val: string) => await updatePreference(val) }\n items={ items }\n />\n </>\n )\n}","\"use client\";\n\nimport readerSharedUI from \"../assets/styles/thorium-web.button.module.css\";\nimport settingsStyles from \"./assets/styles/thorium-web.reader.settings.module.css\";\n\nimport { ThNumberField, ThNumberFieldProps } from \"@/core/Components/Settings/ThNumberField\";\n\nimport { usePreferences } from \"@/preferences/hooks/usePreferences\";\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport classNames from \"classnames\";\n\nexport interface StatefulNumberFieldProps extends Omit<ThNumberFieldProps, \"classNames\"> {\n standalone?: boolean;\n resetLabel?: string;\n placeholder?: string;\n}\n\nexport const StatefulNumberField = ({\n standalone,\n label,\n placeholder,\n value,\n resetLabel,\n ...props\n}: StatefulNumberFieldProps) => {\n const { t } = useI18n();\n const { preferences } = usePreferences();\n\n return (\n <>\n <ThNumberField\n value={ value }\n { ...props }\n { ...(standalone ? { label: label } : { \"aria-label\": label }) }\n placeholder={ placeholder }\n className={ settingsStyles.numberField }\n compounds={{\n wrapper: {\n className: classNames(\n settingsStyles.numberFieldWrapper,\n standalone && settingsStyles.group\n )\n },\n group: {\n className: settingsStyles.groupWrapper\n },\n label: {\n className: settingsStyles.label\n },\n stepper: {\n className: readerSharedUI.icon\n },\n input: {\n className: settingsStyles.input,\n },\n reset: {\n className: classNames(readerSharedUI.icon, settingsStyles.resetButton),\n compounds: {\n tooltipTrigger: {\n delay: preferences.theming.arrow.tooltipDelay,\n closeDelay: preferences.theming.arrow.tooltipDelay\n },\n tooltip: {\n className: readerSharedUI.tooltip\n },\n label: resetLabel ?? t(\"common.actions.reset\")\n }\n }\n }}\n />\n </>\n );\n};","\"use client\";\n\nimport readerSharedUI from \"../assets/styles/thorium-web.button.module.css\";\nimport settingsStyles from \"./assets/styles/thorium-web.reader.settings.module.css\";\n\nimport { ThSlider, ThSliderProps } from \"@/core/Components/Settings/ThSlider\";\n\nimport { usePreferences } from \"@/preferences/hooks/usePreferences\";\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport classNames from \"classnames\";\n\nexport interface StatefulSliderProps extends Omit<ThSliderProps, \"classNames\"> {\n standalone?: boolean;\n placeholder?: string;\n resetLabel?: string;\n displayTicks?: boolean;\n}\n\nexport const StatefulSlider = ({\n standalone,\n label,\n placeholder,\n displayTicks = false,\n value,\n resetLabel,\n ...props\n}: StatefulSliderProps) => {\n const { t } = useI18n();\n const { preferences } = usePreferences();\n \n const style = {\n ...(displayTicks && props.range && props.step ? {\n \"--th-slider-ticks\": (() => {\n const [min, max] = [Math.min(...props.range), Math.max(...props.range)];\n const step = props.step || 1;\n const range = max - min;\n const totalIntervals = range / step;\n return Math.ceil(totalIntervals);\n })()\n } : {}),\n ...props.style\n };\n\n return (\n <>\n <ThSlider\n value={ value }\n { ...props }\n { ...(standalone ? { label: label } : {\"aria-label\": label}) }\n placeholder={ placeholder }\n className={ classNames(\n settingsStyles.slider,\n displayTicks && settingsStyles.sliderWithTicks\n ) }\n style={ style }\n compounds={{\n wrapper: {\n className: classNames(\n settingsStyles.sliderWrapper,\n standalone && settingsStyles.group\n )\n },\n label: {\n className: classNames(settingsStyles.label, settingsStyles.sliderLabel)\n },\n output: {\n className: settingsStyles.sliderOutput\n },\n placeholder: {\n className: settingsStyles.sliderPlaceholder\n },\n track: {\n className: settingsStyles.sliderTrack\n },\n thumb: {\n className: settingsStyles.sliderThumb\n },\n reset: {\n className: classNames(readerSharedUI.icon, settingsStyles.resetButton),\n compounds: {\n tooltipTrigger: {\n delay: preferences.theming.arrow.tooltipDelay,\n closeDelay: preferences.theming.arrow.tooltipDelay\n },\n tooltip: {\n className: readerSharedUI.tooltip\n },\n label: resetLabel ?? t(\"common.actions.reset\")\n }\n }\n }}\n />\n </>\n )\n}","import { useMemo } from \"react\";\nimport { usePlugins } from \"@/components/Plugins/PluginProvider\";\nimport { usePreferences } from \"@/preferences/hooks/usePreferences\";\nimport { ThSettingsKeys, ThTextSettingsKeys, ThSpacingSettingsKeys } from \"@/preferences/models\";\n\ninterface UseSettingsComponentStatusOptions {\n /** The settings key to check (e.g., ThSettingsKeys.spacingPresets) */\n settingsKey: ThSettingsKeys | ThTextSettingsKeys | ThSpacingSettingsKeys;\n /** The publication type to determine which order array to check */\n publicationType?: \"reflow\" | \"fxl\" | \"webpub\";\n /** Whether this is a text or spacing component to check the correct panels */\n componentType?: \"text\" | \"spacing\";\n /** Optional additional condition that must be true for the component to be considered displayed */\n additionalCondition?: boolean;\n}\n\ninterface SettingsComponentStatus {\n /** Whether the component is registered in the component map */\n isComponentRegistered: boolean;\n /** Whether the component is included in the main panel display order */\n isInMainPanel: boolean;\n /** Whether the component is included in the sub-panel display order */\n isInSubPanel: boolean;\n /** Whether the component is displayed (in either panel and meets additional conditions) */\n isDisplayed: boolean;\n /** Whether the component is currently being used (both registered AND displayed) */\n isComponentUsed: boolean;\n}\n\n/**\n * Generic hook to check if a settings component is registered and displayed.\n * This abstracts the common pattern of checking component registration and display order.\n * \n * @param options - Configuration options for the component status check\n * @returns Object containing various status flags for the component\n */\nexport function useSettingsComponentStatus(options: UseSettingsComponentStatusOptions): SettingsComponentStatus {\n const { settingsKey, publicationType, componentType, additionalCondition = true } = options;\n \n const { spacingSettingsComponentsMap, textSettingsComponentsMap, settingsComponentsMap } = usePlugins();\n const { preferences } = usePreferences();\n\n return useMemo(() => {\n // 1. Check if component is registered in any of the component maps\n const isComponentRegistered = !!(\n settingsComponentsMap?.[settingsKey] ||\n spacingSettingsComponentsMap?.[settingsKey] ||\n textSettingsComponentsMap?.[settingsKey]\n );\n\n // 2. Check if component is in the correct display order array based on publication type\n let isInOrder = false;\n switch (publicationType) {\n case \"reflow\":\n isInOrder = preferences.settings?.reflowOrder?.includes(settingsKey as ThSettingsKeys) || false;\n break;\n case \"fxl\":\n isInOrder = preferences.settings?.fxlOrder?.includes(settingsKey as ThSettingsKeys) || false;\n break;\n case \"webpub\":\n isInOrder = preferences.settings?.webPubOrder?.includes(settingsKey as ThSettingsKeys) || false;\n break;\n }\n \n // 3. Check if component is in the correct panels based on component type\n let isInMainPanel = false;\n let isInSubPanel = false;\n \n if (componentType === \"text\") {\n isInMainPanel = preferences.settings?.text?.main?.includes(settingsKey as any) || false;\n isInSubPanel = preferences.settings?.text?.subPanel?.includes(settingsKey as any) || false;\n } else if (componentType === \"spacing\") {\n isInMainPanel = preferences.settings?.spacing?.main?.includes(settingsKey as any) || false;\n isInSubPanel = preferences.settings?.spacing?.subPanel?.includes(settingsKey as any) || false;\n }\n \n // 4. Component is displayed if it's in order array and in any panel\n const isDisplayed = isInOrder || (isInMainPanel || isInSubPanel) && additionalCondition;\n\n // 5. Component is used if it's both registered AND displayed\n const isComponentUsed = isComponentRegistered && isDisplayed;\n\n return {\n isComponentRegistered,\n isInMainPanel,\n isInSubPanel,\n isDisplayed,\n isComponentUsed\n };\n }, [\n settingsKey,\n publicationType,\n componentType,\n additionalCondition,\n preferences,\n spacingSettingsComponentsMap,\n textSettingsComponentsMap,\n settingsComponentsMap\n ]);\n}\n","import { useCallback, useMemo } from \"react\";\n\nimport { \n ThSettingsKeys, \n ThSpacingSettingsKeys, \n ThSpacingPresetKeys, \n ThLineHeightOptions, \n} from \"@/preferences/models\";\n\nimport { usePreferences } from \"@/preferences/hooks/usePreferences\";\nimport { usePreferenceKeys } from \"@/preferences/hooks/usePreferenceKeys\";\nimport { useSettingsComponentStatus } from \"@/components/Settings/hooks/useSettingsComponentStatus\";\n\nimport { useAppSelector, useAppDispatch } from \"@/lib\";\nimport {\n SpacingStateKey,\n setLetterSpacing,\n setLineHeight,\n setParagraphIndent,\n setParagraphSpacing,\n setPublisherStyles,\n setSpacingPreset,\n setWordSpacing\n} from \"@/lib/settingsReducer\";\nimport {\n setWebPubLetterSpacing,\n setWebPubLineHeight,\n setWebPubParagraphIndent,\n setWebPubParagraphSpacing,\n setWebPubPublisherStyles,\n setWebPubSpacingPreset,\n setWebPubWordSpacing\n} from \"@/lib/webPubSettingsReducer\";\n\n/**\n * Hook to determine if preset system should be active\n * Only active when component is both registered AND displayed\n * This allows us to correctly handle overrides for presets,\n * and states for spacing components\n */\nexport const useSpacingPresets = () => {\n const readerProfile = useAppSelector((state) => state.reader.profile);\n const isWebPub = readerProfile === \"webPub\";\n const isFXL = useAppSelector(state => state.publication.isFXL);\n \n // Select the appropriate settings based on reader profile\n const settings = useAppSelector(state => \n isWebPub ? state.webPubSettings : state.settings\n );\n \n // Get spacing with fallback\n const spacing = settings?.spacing || { \n preset: ThSpacingPresetKeys.publisher, \n custom: {}, \n baseline: {} \n };\n\n const { reflowSpacingPresetKeys, fxlSpacingPresetKeys, webPubSpacingPresetKeys } = usePreferenceKeys();\n\n const { preferences } = usePreferences();\n\n const dispatch = useAppDispatch();\n\n const spacingKeys = useMemo(() => {\n return isWebPub \n ? webPubSpacingPresetKeys\n : isFXL \n ? fxlSpacingPresetKeys \n : reflowSpacingPresetKeys;\n }, [isWebPub, isFXL, webPubSpacingPresetKeys, fxlSpacingPresetKeys, reflowSpacingPresetKeys]);\n\n // Check if spacing presets component is being used\n const { isComponentUsed: shouldApplyPresets } = useSettingsComponentStatus({\n settingsKey: ThSettingsKeys.spacingPresets,\n publicationType: isWebPub ? \"webpub\" : isFXL ? \"fxl\" : \"reflow\",\n componentType: \"spacing\",\n additionalCondition: spacingKeys.length > 0\n });\n\n // Get current state values from the already selected settings\n const {\n letterSpacing,\n lineHeight,\n paragraphIndent,\n paragraphSpacing,\n wordSpacing\n } = settings || {};\n\n // Helper function to get base Redux state value for a setting key\n const getBaseReduxValue = (key: ThSpacingSettingsKeys): any => {\n switch (key) {\n case ThSpacingSettingsKeys.letterSpacing:\n return letterSpacing;\n case ThSpacingSettingsKeys.lineHeight:\n return lineHeight;\n case ThSpacingSettingsKeys.paragraphIndent:\n return paragraphIndent;\n case ThSpacingSettingsKeys.paragraphSpacing:\n return paragraphSpacing;\n case ThSpacingSettingsKeys.wordSpacing:\n return wordSpacing;\n default:\n return undefined;\n }\n };\n\n // Helper function to get default value for a setting key when no preset/custom value exists\n const getDefaultValue = (key: ThSpacingSettingsKeys): any => {\n switch (key) {\n case ThSpacingSettingsKeys.lineHeight:\n return ThLineHeightOptions.publisher;\n case ThSpacingSettingsKeys.letterSpacing:\n case ThSpacingSettingsKeys.paragraphIndent:\n case ThSpacingSettingsKeys.paragraphSpacing:\n case ThSpacingSettingsKeys.wordSpacing:\n return null;\n default:\n return null;\n }\n };\n\n // Helper function to get preset value for a setting key\n const getPresetValue = useCallback((presetKey: ThSpacingPresetKeys, settingKey: ThSpacingSettingsKeys): any => {\n if (presetKey === ThSpacingPresetKeys.custom) {\n return spacing.custom?.[settingKey as SpacingStateKey];\n }\n\n // Only try to get from config for presets that have defined values\n if (presetKey !== ThSpacingPresetKeys.publisher) {\n const spacingConfig = preferences.settings.spacing?.presets;\n if (spacingConfig?.keys) {\n const presetValues = spacingConfig.keys[presetKey as ThSpacingPresetKeys.tight | ThSpacingPresetKeys.balanced | ThSpacingPresetKeys.loose | ThSpacingPresetKeys.accessible];\n const presetValue = presetValues?.[settingKey as unknown as keyof typeof presetValues];\n if (presetValue !== undefined) {\n return presetValue;\n }\n }\n }\n\n return getDefaultValue(settingKey);\n }, [preferences.settings.spacing?.presets, spacing.custom]);\n\n const getPresetValuesCallback = useCallback((presetKey: ThSpacingPresetKeys) => {\n return {\n [ThSpacingSettingsKeys.letterSpacing]: getPresetValue(presetKey, ThSpacingSettingsKeys.letterSpacing),\n [ThSpacingSettingsKeys.lineHeight]: getPresetValue(presetKey, ThSpacingSettingsKeys.lineHeight),\n [ThSpacingSettingsKeys.paragraphIndent]: getPresetValue(presetKey, ThSpacingSettingsKeys.paragraphIndent),\n [ThSpacingSettingsKeys.paragraphSpacing]: getPresetValue(presetKey, ThSpacingSettingsKeys.paragraphSpacing),\n [ThSpacingSettingsKeys.wordSpacing]: getPresetValue(presetKey, ThSpacingSettingsKeys.wordSpacing),\n };\n }, [getPresetValue]);\n\n // Helper function to get effective spacing value with proper return types\n // Function overloads for proper typing\n function getEffectiveSpacingValue(key: ThSpacingSettingsKeys.letterSpacing): number | null;\n function getEffectiveSpacingValue(key: ThSpacingSettingsKeys.lineHeight): ThLineHeightOptions | null;\n function getEffectiveSpacingValue(key: ThSpacingSettingsKeys.paragraphIndent): number | null;\n function getEffectiveSpacingValue(key: ThSpacingSettingsKeys.paragraphSpacing): number | null;\n function getEffectiveSpacingValue(key: ThSpacingSettingsKeys.wordSpacing): number | null;\n function getEffectiveSpacingValue(key: ThSpacingSettingsKeys): any {\n // If preset system is not active, return Redux state directly\n if (!shouldApplyPresets) {\n return getBaseReduxValue(key);\n }\n\n if (spacing.preset === ThSpacingPresetKeys.custom) {\n const customValue = spacing.custom?.[key as SpacingStateKey];\n if (customValue !== undefined) {\n return customValue;\n }\n return getDefaultValue(key);\n }\n\n return getPresetValue(spacing.preset, key);\n };\n\n // Helper function to get reset spacing value (pure preset values, ignoring customizations)\n // Function overloads for proper typing\n function getSpacingResetValue(key: ThSpacingSettingsKeys.letterSpacing): number | null;\n function getSpacingResetValue(key: ThSpacingSettingsKeys.lineHeight): ThLineHeightOptions | null;\n function getSpacingResetValue(key: ThSpacingSettingsKeys.paragraphIndent): number | null;\n function getSpacingResetValue(key: ThSpacingSettingsKeys.paragraphSpacing): number | null;\n function getSpacingResetValue(key: ThSpacingSettingsKeys.wordSpacing): number | null;\n function getSpacingResetValue(key: ThSpacingSettingsKeys): any {\n if (!shouldApplyPresets) {\n return getDefaultValue(key);\n }\n\n if (spacing.preset) {\n if (spacing.preset !== ThSpacingPresetKeys.publisher && \n spacing.preset !== ThSpacingPresetKeys.custom) {\n const spacingConfig = preferences.settings?.spacing?.presets;\n if (spacingConfig?.keys) {\n const presetValues = spacingConfig.keys[spacing.preset as ThSpacingPresetKeys.tight | ThSpacingPresetKeys.balanced | ThSpacingPresetKeys.loose | ThSpacingPresetKeys.accessible];\n const presetValue = presetValues?.[key as unknown as keyof typeof presetValues];\n if (presetValue !== undefined) {\n return presetValue;\n }\n }\n }\n }\n\n // For publisher or custom preset or when no preset is selected, return the default value\n return getDefaultValue(key);\n }\n\n const getEffectiveSpacingValueCallback = useCallback(getEffectiveSpacingValue, [\n getEffectiveSpacingValue,\n shouldApplyPresets,\n spacing.preset,\n spacing.custom,\n spacing.baseline,\n preferences.settings?.spacing?.presets,\n letterSpacing,\n lineHeight,\n paragraphIndent,\n paragraphSpacing,\n wordSpacing\n ]);\n\n const getSpacingResetValueCallback = useCallback(getSpacingResetValue, [\n shouldApplyPresets,\n getSpacingResetValue,\n spacing.preset,\n preferences.settings?.spacing?.presets\n ]);\n\n const canBeResetCallback = useCallback((key: ThSpacingSettingsKeys): boolean => {\n const effectiveValue = getEffectiveSpacingValueCallback(key as any);\n return effectiveValue !== null && effectiveValue !== undefined;\n }, [getEffectiveSpacingValueCallback]);\n\n // Spacing actions (automatically handle preset logic)\n\n const setLetterSpacingAction = useCallback((value: number | null) => {\n const payload: any = { value };\n if (shouldApplyPresets && spacing.preset) {\n payload.preset = spacing.preset;\n }\n if (isWebPub) {\n dispatch(setWebPubLetterSpacing(payload));\n } else {\n dispatch(setLetterSpacing(payload));\n }\n }, [dispatch, isWebPub, shouldApplyPresets, spacing.preset]);\n\n const setLineHeightAction = useCallback((value: ThLineHeightOptions) => {\n const payload: any = { value };\n if (shouldApplyPresets && spacing.preset) {\n payload.preset = spacing.preset;\n }\n if (isWebPub) {\n dispatch(setWebPubLineHeight(payload));\n } else {\n dispatch(setLineHeight(payload));\n }\n }, [dispatch, isWebPub, shouldApplyPresets, spacing.preset]);\n\n const setParagraphIndentAction = useCallback((value: number | null) => {\n const payload: any = { value };\n if (shouldApplyPresets && spacing.preset) {\n payload.preset = spacing.preset;\n }\n if (isWebPub) {\n dispatch(setWebPubParagraphIndent(payload));\n } else {\n dispatch(setParagraphIndent(payload));\n }\n }, [dispatch, isWebPub, shouldApplyPresets, spacing.preset]);\n\n const setParagraphSpacingAction = useCallback((value: number | null) => {\n const payload: any = { value };\n if (shouldApplyPresets && spacing.preset) {\n payload.preset = spacing.preset;\n }\n if (isWebPub) {\n dispatch(setWebPubParagraphSpacing(payload));\n } else {\n dispatch(setParagraphSpacing(payload));\n }\n }, [dispatch, isWebPub, shouldApplyPresets, spacing.preset]);\n\n const setWordSpacingAction = useCallback((value: number | null) => {\n const payload: any = { value };\n if (shouldApplyPresets && spacing.preset) {\n payload.preset = spacing.preset;\n }\n if (isWebPub) {\n dispatch(setWebPubWordSpacing(payload));\n } else {\n dispatch(setWordSpacing(payload));\n }\n }, [dispatch, isWebPub, shouldApplyPresets, spacing.preset]);\n\n const setPublisherStylesAction = useCallback((value: boolean) => {\n if (shouldApplyPresets && value) {\n if (isWebPub) {\n dispatch(setWebPubSpacingPreset({ \n preset: ThSpacingPresetKeys.publisher, \n values: {} \n }));\n dispatch(setWebPubPublisherStyles(value));\n } else {\n dispatch(setSpacingPreset({ \n preset: ThSpacingPresetKeys.publisher, \n values: {} \n }));\n dispatch(setPublisherStyles(value));\n }\n }\n }, [dispatch, isWebPub, shouldApplyPresets]);\n\n return {\n currentPreset: spacing.preset,\n getPresetValues: getPresetValuesCallback,\n getEffectiveSpacingValue: getEffectiveSpacingValueCallback,\n getSpacingResetValue: getSpacingResetValueCallback,\n canBeReset: canBeResetCallback,\n setLetterSpacing: setLetterSpacingAction,\n setLineHeight: setLineHeightAction,\n setParagraphIndent: setParagraphIndentAction,\n setParagraphSpacing: setParagraphSpacingAction,\n setWordSpacing: setWordSpacingAction,\n setPublisherStyles: setPublisherStylesAction\n };\n};\n","import { ThSettingsRangePlaceholder } from \"@/preferences\";\n\nimport { useI18n } from \"@/i18n/useI18n\";\n\nexport const usePlaceholder = (\n placeholder: ThSettingsRangePlaceholder | string | { key: string; fallback?: string } | undefined,\n range: [number, number],\n format?: \"percent\" | \"number\" | \"multiplier\"\n): string | undefined => {\n const { t } = useI18n();\n\n if (!placeholder) {\n return undefined;\n }\n\n // Handle enum values\n if (placeholder === ThSettingsRangePlaceholder.none) {\n return undefined;\n }\n if (placeholder === ThSettingsRangePlaceholder.range) {\n switch (format) {\n case \"percent\":\n const minRange = range[0] * 100;\n const maxRange = range[1] * 100;\n const minPercent = minRange === 0 ? \"0\" : `${minRange}%`;\n const maxPercent = maxRange === 0 ? \"0\" : `${maxRange}%`;\n return `${ minPercent } - ${ maxPercent }`;\n case \"multiplier\":\n const minMultiplierRange = range[0];\n const maxMultiplierRange = range[1];\n const minMultiplier = minMultiplierRange === 0 ? \"0\" : `${minMultiplierRange}×`;\n const maxMultiplier = maxMultiplierRange === 0 ? \"0\" : `${maxMultiplierRange}×`;\n return `${ minMultiplier } - ${ maxMultiplier }`;\n case \"number\":\n default:\n return `${ range[0] } - ${ range[1] }`;\n }\n }\n\n // Handle i18n object\n if (typeof placeholder === \"object\" && \"key\" in placeholder) {\n const translatedPlaceholder = t(placeholder.key);\n return translatedPlaceholder !== placeholder.key ? translatedPlaceholder : placeholder.fallback;\n }\n\n // Handle string values (literal text, not translated)\n if (typeof placeholder === \"string\") {\n return placeholder;\n }\n\n return undefined;\n};","\"use client\";\n\nimport { useCallback } from \"react\";\n\nimport { ThSettingsKeys, ThSettingsRangeVariant, ThSpacingSettingsKeys } from \"@/preferences\";\n\nimport { StatefulSettingsItemProps } from \"../models/settings\";\n\nimport { StatefulNumberField } from \"../StatefulNumberField\";\nimport { StatefulSlider } from \"../StatefulSlider\";\n\nimport { usePreferences } from \"@/preferences/hooks/usePreferences\";\nimport { useNavigator } from \"@/core/Navigator\";\nimport { useI18n } from \"@/i18n/useI18n\";\nimport { useSpacingPresets } from \"./hooks/useSpacingPresets\";\nimport { usePlaceholder } from \"../hooks/usePlaceholder\";\n\nexport const StatefulLetterSpacing = ({ standalone = true }: StatefulSettingsItemProps) => {\n const { preferences } = usePreferences();\n const { t } = useI18n();\n\n const letterSpacingRangeConfig = {\n variant: preferences.settings.keys[ThSettingsKeys.letterSpacing].variant,\n placeholder: preferences.settings.keys[ThSettingsKeys.letterSpacing].placeholder,\n range: preferences.settings.keys[ThSettingsKeys.letterSpacing].range,\n step: preferences.settings.keys[ThSettingsKeys.letterSpacing].step\n };\n\n const placeholderText = usePlaceholder(letterSpacingRangeConfig.placeholder, letterSpacingRangeConfig.range, \"percent\");\n \n const { getSetting, submitPreferences } = useNavigator();\n\n const { getEffectiveSpacingValue, setLetterSpacing, canBeReset } = useSpacingPresets();\n\n const letterSpacing = getEffectiveSpacingValue(ThSpacingSettingsKeys.letterSpacing);\n\n const updatePreference = useCallback(async (value: number | number[] | null) => {\n await submitPreferences({\n letterSpacing: Array.isArray(value) ? value[0] : value\n });\n\n setLetterSpacing(getSetting(\"letterSpacing\"));\n }, [submitPreferences, getSetting, setLetterSpacing]);\n\n return (\n <>\n { letterSpacingRangeConfig.variant === ThSettingsRangeVariant.numberField \n ? <StatefulNumberField \n standalone={ standalone }\n label={ t(\"reader.preferences.letterSpacing\") }\n placeholder={ placeholderText }\n defaultValue={ undefined } \n value={ letterSpacing ?? undefined } \n onChange={ async(value) => await updatePreference(value as number) } \n onReset={ canBeReset(ThSpacingSettingsKeys.letterSpacing) ? async() => await updatePreference(null) : undefined }\n range={ letterSpacingRangeConfig.range }\n step={ letterSpacingRangeConfig.step }\n steppers={{\n decrementLabel: t(\"common.actions.decrease\"),\n incrementLabel: t(\"common.actions.increase\")\n }}\n formatOptions={{ style: \"percent\" }} \n isWheelDisabled={ true }\n isVirtualKeyboardDisabled={ true }\n />\n : <StatefulSlider\n standalone={ standalone }\n displayTicks={ letterSpacingRangeConfig.variant === ThSettingsRangeVariant.incrementedSlider }\n label={ t(\"reader.preferences.letterSpacing\") }\n placeholder={ placeholderText }\n defaultValue={ undefined } \n value={ letterSpacing ?? undefined } \n onChange={ async(value) => await updatePreference(value as number) } \n onReset={ canBeReset(ThSpacingSettingsKeys.letterSpacing) ? async() => await updatePreference(null) : undefined }\n range={ letterSpacingRangeConfig.range }\n step={ letterSpacingRangeConfig.step }\n formatOptions={ { style: \"percent\" } }\n />\n } \n </>\n )\n}","import { useMemo } from \"react\";\nimport { ThLineHeightOptions, ThSettingsKeys } from \"@/preferences/models\";\nimport { usePreferences } from \"@/preferences/hooks/usePreferences\";\n\n/**\n * Hook that returns a mapping of line height options to their actual numeric values\n * This eliminates code duplication across spacing components\n */\nexport const useLineHeight = () => {\n const { preferences } = usePreferences();\n\n return useMemo(() => ({\n [ThLineHeightOptions.publisher]: null,\n [ThLineHeightOptions.small]: preferences.settings.keys[ThSettingsKeys.lineHeight].keys[ThLineHeightOptions.small],\n [ThLineHeightOptions.medium]: preferences.settings.keys[ThSettingsKeys.lineHeight].keys[ThLineHeightOptions.medium],\n [ThLineHeightOptions.large]: preferences.settings.keys[ThSettingsKeys.lineHeight].keys[ThLineHeightOptions.large],\n }), [preferences.settings.keys]);\n};\n","import * as React from \"react\";\nconst SvgBook = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"inherit\" {...props}><path d=\"M240-80q-33 0-56.5-23.5T160-160v-640q0-33 23.5-56.5T240-880h480q33 0 56.5 23.5T800-800v640q0 33-23.5 56.5T720-80H240Zm0-80h480v-640h-80v280l-100-60-100 60v-280H240v640Zm0 0v-640 640Zm200-360 100-60 100 60-100-60-100 60Z\" /></svg>;\nexport default SvgBook;","import * as React from \"react\";\nconst SvgDensitySmall = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"Inherit\" {...props}><path d=\"M120-80v-80h720v80H120Zm0-240v-80h720v80H120Zm0-240v-80h720v80H120Zm0-240v-80h720v80H120Z\" /></svg>;\nexport default SvgDensitySmall;","import * as React from \"react\";\nconst SvgDensityMedium = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"Inherit\" {...props}><path d=\"M120-120v-80h720v80H120Zm0-320v-80h720v80H120Zm0-320v-80h720v80H120Z\" /></svg>;\nexport default SvgDensityMedium;","import * as React from \"react\";\nconst SvgDensityLarge = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"Inherit\" {...props}><path d=\"M120-120v-80h720v80H120Zm0-640v-80h720v80H120Z\" /></svg>;\nexport default SvgDensityLarge;","\"use client\";\n\nimport { useCallback, useMemo } from \"react\";\n\nimport { ThLineHeightOptions, ThSpacingSettingsKeys, ThSettingsKeys } from \"@/preferences\";\n\nimport { StatefulSettingsItemProps } from \"../models/settings\";\n\nimport BookIcon from \"../assets/icons/book.svg\";\nimport SmallIcon from \"./assets/icons/density_small.svg\";\nimport MediumIcon from \"./assets/icons/density_medium.svg\";\nimport LargeIcon from \"./assets/icons/density_large.svg\";\n\nimport { StatefulRadioGroup } from \"../StatefulRadioGroup\";\n\nimport { useNavigator } from \"@/core/Navigator\";\nimport { useI18n } from \"@/i18n/useI18n\";\nimport { usePreferences } from \"@/preferences/hooks/usePreferences\";\n\nimport { useAppSelector } from \"@/lib/hooks\";\nimport { useLineHeight } from \"./hooks/useLineHeight\";\nimport { useSpacingPresets } from \"./hooks/useSpacingPresets\";\n\nexport const StatefulLineHeight = ({ standalone = true }: StatefulSettingsItemProps) => {\n const { t } = useI18n();\n const { preferences } = usePreferences();\n\n const profile = useAppSelector(state => state.reader.profile);\n const isWebPub = profile === \"webPub\";\n\n const publisherStyles = useAppSelector(state => isWebPub ? state.webPubSettings.publisherStyles : state.settings.publisherStyles) ?? true;\n\n const { getSetting, submitPreferences } = useNavigator();\n\n const { getEffectiveSpacingValue, setLineHeight } = useSpacingPresets();\n\n const lineHeight = getEffectiveSpacingValue(ThSpacingSettingsKeys.lineHeight);\n\n const lineHeightOptions = useLineHeight();\n\n // Dynamically build items array based on allowUnset preference\n const items = useMemo(() => {\n const baseItems = [\n {\n id: ThLineHeightOptions.small,\n icon: SmallIcon,\n label: t(\"reader.preferences.lineHeight.small\"),\n value: ThLineHeightOptions.small\n },\n {\n id: ThLineHeightOptions.medium,\n icon: MediumIcon,\n label: t(\"reader.preferences.lineHeight.medium\"),\n value: ThLineHeightOptions.medium\n },\n {\n id: ThLineHeightOptions.large,\n icon: LargeIcon,\n label: t(\"reader.preferences.lineHeight.large\"),\n value: ThLineHeightOptions.large\n },\n ];\n\n // Only add publisher option if allowUnset is true\n if (preferences.settings.keys[ThSettingsKeys.lineHeight].allowUnset !== false) {\n baseItems.unshift({\n id: ThLineHeightOptions.publisher,\n icon: BookIcon,\n label: t(\"reader.preferences.lineHeight.default\"),\n value: ThLineHeightOptions.publisher\n });\n }\n\n return baseItems;\n }, [preferences.settings.keys, t]);\n\n const updatePreference = useCallback(async (value: string) => {\n const computedValue = value === ThLineHeightOptions.publisher\n ? null\n : lineHeightOptions[value as keyof typeof ThLineHeightOptions];\n\n await submitPreferences({\n lineHeight: computedValue\n });\n\n const currentLineHeight = getSetting(\"lineHeight\");\n const currentDisplayLineHeightOption = Object.entries(lineHeightOptions).find(([key, value]) => value === currentLineHeight)?.[0] as ThLineHeightOptions;\n\n setLineHeight(currentDisplayLineHeightOption);\n }, [submitPreferences, getSetting, setLineHeight, lineHeightOptions]);\n\n return (\n <>\n <StatefulRadioGroup\n standalone={ standalone }\n label={ t(\"reader.preferences.lineHeight.title\") }\n orientation=\"horizontal\"\n value={ !isWebPub && publisherStyles ? ThLineHeightOptions.publisher : lineHeight }\n onChange={ async (val: string) => await updatePreference(val) }\n items={ items }\n />\n </>\n );\n}","\"use client\";\n\nimport { useCallback } from \"react\";\n\nimport { ThSettingsKeys, ThSettingsRangeVariant, ThSpacingSettingsKeys } from \"@/preferences\";\n\nimport { StatefulSettingsItemProps } from \"../models/settings\";\n\nimport { StatefulNumberField } from \"../StatefulNumberField\";\nimport { StatefulSlider } from \"../StatefulSlider\";\n\nimport { usePreferences } from \"@/preferences/hooks/usePreferences\";\nimport { useNavigator } from \"@/core/Navigator\";\nimport { useI18n } from \"@/i18n/useI18n\";\nimport { useSpacingPresets } from \"./hooks/useSpacingPresets\";\nimport { usePlaceholder } from \"../hooks/usePlaceholder\";\n\nexport const StatefulParagraphIndent = ({ standalone = true }: StatefulSettingsItemProps) => {\n const { preferences } = usePreferences();\n const { t } = useI18n();\n \n const paragraphIndentRangeConfig = {\n variant: preferences.settings.keys[ThSettingsKeys.paragraphIndent].variant,\n placeholder: preferences.settings.keys[ThSettingsKeys.paragraphIndent].placeholder,\n range: preferences.settings.keys[ThSettingsKeys.paragraphIndent].range,\n step: preferences.settings.keys[ThSettingsKeys.paragraphIndent].step\n };\n\n const placeholderText = usePlaceholder(paragraphIndentRangeConfig.placeholder, paragraphIndentRangeConfig.range, \"multiplier\");\n \n const { getSetting, submitPreferences } = useNavigator();\n\n const { getEffectiveSpacingValue, setParagraphIndent, canBeReset } = useSpacingPresets();\n\n const paragraphIndent = getEffectiveSpacingValue(ThSpacingSettingsKeys.paragraphIndent);\n\n const updatePreference = useCallback(async (value: number | number[] | null) => {\n await submitPreferences({\n paragraphIndent: Array.isArray(value) ? value[0] : value\n });\n\n setParagraphIndent(getSetting(\"paragraphIndent\"));\n }, [submitPreferences, getSetting, setParagraphIndent]);\n\n return (\n <>\n { paragraphIndentRangeConfig.variant === ThSettingsRangeVariant.numberField \n ? <StatefulNumberField \n standalone={ standalone }\n label={ t(\"reader.preferences.paragraphIndent\") }\n placeholder={ placeholderText }\n defaultValue={ undefined } \n value={ paragraphIndent ?? undefined } \n onChange={ async(value) => await updatePreference(value) } \n onReset={ canBeReset(ThSpacingSettingsKeys.paragraphIndent) ? async () => await updatePreference(null) : undefined }\n range={ paragraphIndentRangeConfig.range }\n step={ paragraphIndentRangeConfig.step }\n steppers={{\n decrementLabel: t(\"common.actions.decrease\"),\n incrementLabel: t(\"common.actions.increase\")\n }}\n formatOptions={{\n signDisplay: \"exceptZero\",\n minimumFractionDigits: 0,\n maximumFractionDigits: 2\n }} \n isWheelDisabled={ true }\n isVirtualKeyboardDisabled={ true }\n />\n : <StatefulSlider\n standalone={ standalone }\n displayTicks={ paragraphIndentRangeConfig.variant === ThSettingsRangeVariant.incrementedSlider }\n label={ t(\"reader.preferences.paragraphIndent\") }\n placeholder={ placeholderText }\n defaultValue={ undefined } \n value={ paragraphIndent ?? undefined } \n onChange={ async(value) => await updatePreference(value as number) } \n onReset={ canBeReset(ThSpacingSettingsKeys.paragraphIndent) ? async () => await updatePreference(null) : undefined }\n range={ paragraphIndentRangeConfig.range }\n step={ paragraphIndentRangeConfig.step }\n formatOptions={{\n signDisplay: \"exceptZero\",\n minimumFractionDigits: 0,\n maximumFractionDigits: 2\n }}\n />\n } \n </>\n )\n}","\"use client\";\n\nimport { useCallback } from \"react\";\n\nimport { ThSettingsKeys, ThSettingsRangeVariant, ThSpacingSettingsKeys } from \"@/preferences\";\n\nimport { StatefulSettingsItemProps } from \"../models/settings\";\n\nimport { StatefulNumberField } from \"../StatefulNumberField\";\nimport { StatefulSlider } from \"../StatefulSlider\";\n\nimport { usePreferences } from \"@/preferences/hooks/usePreferences\";\nimport { useNavigator } from \"@/core/Navigator\";\nimport { useI18n } from \"@/i18n/useI18n\";\nimport { useSpacingPresets } from \"./hooks/useSpacingPresets\";\nimport { usePlaceholder } from \"../hooks/usePlaceholder\";\n\nexport const StatefulParagraphSpacing = ({ standalone = true }: StatefulSettingsItemProps) => {\n const { preferences } = usePreferences();\n const { t } = useI18n();\n\n const paragraphSpacingRangeConfig = {\n variant: preferences.settings.keys[ThSettingsKeys.paragraphSpacing].variant,\n placeholder: preferences.settings.keys[ThSettingsKeys.paragraphSpacing].placeholder,\n range: preferences.settings.keys[ThSettingsKeys.paragraphSpacing].range,\n step: preferences.settings.keys[ThSettingsKeys.paragraphSpacing].step\n };\n\n const placeholderText = usePlaceholder(paragraphSpacingRangeConfig.placeholder, paragraphSpacingRangeConfig.range, \"multiplier\");\n \n const { getSetting, submitPreferences } = useNavigator();\n\n const { getEffectiveSpacingValue, setParagraphSpacing, canBeReset } = useSpacingPresets();\n\n const paragraphSpacing = getEffectiveSpacingValue(ThSpacingSettingsKeys.paragraphSpacing);\n\n const updatePreference = useCallback(async (value: number | number[] | null) => {\n await submitPreferences({\n paragraphSpacing: Array.isArray(value) ? value[0] : value\n });\n\n setParagraphSpacing(getSetting(\"paragraphSpacing\"));\n }, [submitPreferences, getSetting, setParagraphSpacing]);\n\n return (\n <>\n { paragraphSpacingRangeConfig.variant === ThSettingsRangeVariant.numberField \n ? <StatefulNumberField \n standalone={ standalone }\n label={ t(\"reader.preferences.paragraphSpacing\") }\n placeholder={ placeholderText }\n defaultValue={ undefined } \n value={ paragraphSpacing ?? undefined } \n onChange={ async(value) => await updatePreference(value) } \n onReset={ canBeReset(ThSpacingSettingsKeys.paragraphSpacing) ? async() => await updatePreference(null) : undefined }\n range={ paragraphSpacingRangeConfig.range }\n step={ paragraphSpacingRangeConfig.step }\n steppers={{\n decrementLabel: t(\"common.actions.decrease\"),\n incrementLabel: t(\"common.actions.increase\")\n }}\n formatOptions={{\n signDisplay: \"exceptZero\",\n minimumFractionDigits: 0,\n maximumFractionDigits: 2\n }} \n isWheelDisabled={ true }\n isVirtualKeyboardDisabled={ true }\n />\n : <StatefulSlider\n standalone={ standalone }\n displayTicks={ paragraphSpacingRangeConfig.variant === ThSettingsRangeVariant.incrementedSlider }\n label={ t(\"reader.preferences.paragraphSpacing\") }\n placeholder={ placeholderText }\n defaultValue={ undefined } \n value={ paragraphSpacing ?? undefined } \n onChange={ async(value) => await updatePreference(value as number) } \n onReset={ canBeReset(ThSpacingSettingsKeys.paragraphSpacing) ? async() => await updatePreference(null) : undefined }\n range={ paragraphSpacingRangeConfig.range }\n step={ paragraphSpacingRangeConfig.step }\n formatOptions={{\n signDisplay: \"exceptZero\",\n minimumFractionDigits: 0,\n maximumFractionDigits: 2\n }}\n /> \n }\n </>\n )\n}","\"use client\";\n\nimport { useCallback } from \"react\";\n\nimport { ThLineHeightOptions, ThSpacingSettingsKeys } from \"@/preferences\";\n\nimport { StatefulSettingsItemProps } from \"./models/settings\";\n\nimport { StatefulSwitch } from \"./StatefulSwitch\";\n\nimport { useNavigator } from \"@/core/Navigator\";\nimport { useI18n } from \"@/i18n/useI18n\";\nimport { useSpacingPresets } from \"./Spacing/hooks/useSpacingPresets\";\nimport { useLineHeight } from \"./Spacing/hooks/useLineHeight\";\n\nimport { useAppSelector } from \"@/lib/hooks\";\n\nexport const StatefulPublisherStyles = ({ standalone = true }: StatefulSettingsItemProps) => {\n const { t } = useI18n();\n const publisherStyles = useAppSelector(state => state.settings.publisherStyles);\n\n const { getEffectiveSpacingValue, setPublisherStyles } = useSpacingPresets();\n\n const lineHeight = getEffectiveSpacingValue(ThSpacingSettingsKeys.lineHeight);\n const paragraphIndent = getEffectiveSpacingValue(ThSpacingSettingsKeys.paragraphIndent);\n const paragraphSpacing = getEffectiveSpacingValue(ThSpacingSettingsKeys.paragraphSpacing);\n const letterSpacing = getEffectiveSpacingValue(ThSpacingSettingsKeys.letterSpacing);\n const wordSpacing = getEffectiveSpacingValue(ThSpacingSettingsKeys.wordSpacing);\n\n const lineHeightOptions = useLineHeight();\n\n const { submitPreferences } = useNavigator();\n\n const updatePreference = useCallback(async (isSelected: boolean) => {\n const values = isSelected ? \n {\n lineHeight: null,\n paragraphIndent: null,\n paragraphSpacing: null,\n letterSpacing: null,\n wordSpacing: null\n } : \n {\n lineHeight: lineHeight === ThLineHeightOptions.publisher \n ? null \n : lineHeightOptions[lineHeight as keyof typeof ThLineHeightOptions],\n paragraphIndent: paragraphIndent,\n paragraphSpacing: paragraphSpacing,\n letterSpacing: letterSpacing,\n wordSpacing: wordSpacing\n };\n await submitPreferences(values);\n\n setPublisherStyles(isSelected ? true : false);\n }, [submitPreferences, setPublisherStyles, lineHeight, paragraphIndent, paragraphSpacing, letterSpacing, wordSpacing, lineHeightOptions]);\n\n return(\n <>\n <StatefulSwitch \n standalone={ standalone }\n label={ t(\"reader.preferences.publisherStyles.label\") }\n onChange={ async (isSelected: boolean) => await updatePreference(isSelected) }\n isSelected={ publisherStyles }\n />\n </>\n )\n}","import * as React from \"react\";\nconst SvgAccessibility = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"inherit\" {...props}><path d=\"M480-720q-33 0-56.5-23.5T400-800q0-33 23.5-56.5T480-880q33 0 56.5 23.5T560-800q0 33-23.5 56.5T480-720ZM360-80v-520q-60-5-122-15t-118-25l20-80q78 21 166 30.5t174 9.5q86 0 174-9.5T820-720l20 80q-56 15-118 25t-122 15v520h-80v-240h-80v240h-80Z\" /></svg>;\nexport default SvgAccessibility;","import * as React from \"react\";\nconst SvgTune = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"Inherit\" {...props}><path d=\"M440-120v-240h80v80h320v80H520v80h-80Zm-320-80v-80h240v80H120Zm160-160v-80H120v-80h160v-80h80v240h-80Zm160-80v-80h400v80H440Zm160-160v-240h80v80h160v80H680v80h-80Zm-480-80v-80h400v80H120Z\" /></svg>;\nexport default SvgTune;","import { ThSpacingSettingsKeys } from \"@/preferences/models\";\n\n/**\n * Check if spacing settings are available for customization\n * Returns true if subPanel contains at least one spacing setting (excluding spacingPresets and publisherStyles)\n */\nexport const hasCustomizableSpacingSettings = (subPanelKeys: ThSpacingSettingsKeys[]): boolean => {\n const spacingSettingsKeys = [\n ThSpacingSettingsKeys.letterSpacing,\n ThSpacingSettingsKeys.lineHeight,\n ThSpacingSettingsKeys.paragraphIndent,\n ThSpacingSettingsKeys.paragraphSpacing,\n ThSpacingSettingsKeys.wordSpacing\n ];\n\n return spacingSettingsKeys.some(key => subPanelKeys.includes(key));\n};\n","import { useCallback, useMemo } from \"react\";\n\nimport { \n ThSpacingPresetKeys,\n ThLineHeightOptions,\n ThSpacingSettingsKeys,\n} from \"@/preferences/models\";\n\nimport BookIcon from \"../assets/icons/book.svg\";\nimport SmallIcon from \"./assets/icons/density_small.svg\";\nimport MediumIcon from \"./assets/icons/density_medium.svg\";\nimport LargeIcon from \"./assets/icons/density_large.svg\";\nimport AccessibleIcon from \"./assets/icons/accessibility.svg\";\nimport TuneIcon from \"./assets/icons/tune.svg\";\n\nimport { StatefulSettingsItemProps } from \"@/components/Settings\";\n\nimport { StatefulRadioGroup } from \"../StatefulRadioGroup\";\n\nimport { useSpacingPresets } from \"./hooks/useSpacingPresets\";\n\nimport { useI18n } from \"@/i18n/useI18n\";\nimport { usePreferenceKeys } from \"@/preferences/hooks/usePreferenceKeys\";\nimport { useNavigator } from \"@/core/Navigator\";\nimport { useLineHeight } from \"./hooks/useLineHeight\";\n\nimport { useAppSelector, useAppDispatch } from \"@/lib\";\nimport { setSpacingPreset } from \"@/lib/settingsReducer\";\nimport { setWebPubSpacingPreset } from \"@/lib/webPubSettingsReducer\";\n\nimport { hasCustomizableSpacingSettings } from \"./helpers/spacingSettings\";\n\nconst iconMap = {\n [ThSpacingPresetKeys.publisher]: BookIcon,\n [ThSpacingPresetKeys.accessible]: AccessibleIcon,\n [ThSpacingPresetKeys.custom]: TuneIcon,\n [ThSpacingPresetKeys.tight]: SmallIcon,\n [ThSpacingPresetKeys.balanced]: MediumIcon,\n [ThSpacingPresetKeys.loose]: LargeIcon,\n};\n\nexport const StatefulSpacingPresets = ({ standalone }: StatefulSettingsItemProps) => {\n const { t } = useI18n();\n const { reflowSpacingPresetKeys, fxlSpacingPresetKeys, webPubSpacingPresetKeys, subPanelSpacingSettingsKeys } = usePreferenceKeys();\n\n const profile = useAppSelector(state => state.reader.profile);\n const isWebPub = profile === \"webPub\";\n const spacing = useAppSelector(state => isWebPub ? state.webPubSettings.spacing : state.settings.spacing);\n const isFXL = useAppSelector(state => state.publication.isFXL);\n\n const dispatch = useAppDispatch();\n\n const { submitPreferences } = useNavigator();\n\n const lineHeightOptions = useLineHeight();\n\n const { getPresetValues } = useSpacingPresets();\n\n const updatePreference = useCallback(async (value: string) => {\n const spacingKey = value as ThSpacingPresetKeys;\n \n // Get preset values directly from preferences config\n const presetValues = getPresetValues(spacingKey);\n \n // Raw values for Redux state (lineHeight stays as enum)\n const reduxValues = {\n [ThSpacingSettingsKeys.letterSpacing]: presetValues?.[ThSpacingSettingsKeys.letterSpacing] ?? null,\n [ThSpacingSettingsKeys.lineHeight]: presetValues?.[ThSpacingSettingsKeys.lineHeight] ?? null,\n [ThSpacingSettingsKeys.paragraphIndent]: presetValues?.[ThSpacingSettingsKeys.paragraphIndent] ?? null,\n [ThSpacingSettingsKeys.paragraphSpacing]: presetValues?.[ThSpacingSettingsKeys.paragraphSpacing] ?? null,\n [ThSpacingSettingsKeys.wordSpacing]: presetValues?.[ThSpacingSettingsKeys.wordSpacing] ?? null,\n };\n \n // Convert lineHeight for preferences API (enum to number)\n const lineHeightValue = reduxValues[ThSpacingSettingsKeys.lineHeight];\n const lineHeightValueNumber = lineHeightValue && lineHeightValue !== ThLineHeightOptions.publisher \n ? lineHeightOptions[lineHeightValue as ThLineHeightOptions] \n : null;\n \n const preferencesToSubmit = {\n [ThSpacingSettingsKeys.letterSpacing]: reduxValues[ThSpacingSettingsKeys.letterSpacing],\n [ThSpacingSettingsKeys.lineHeight]: lineHeightValueNumber,\n [ThSpacingSettingsKeys.paragraphIndent]: reduxValues[ThSpacingSettingsKeys.paragraphIndent],\n [ThSpacingSettingsKeys.paragraphSpacing]: reduxValues[ThSpacingSettingsKeys.paragraphSpacing],\n [ThSpacingSettingsKeys.wordSpacing]: reduxValues[ThSpacingSettingsKeys.wordSpacing],\n };\n \n await submitPreferences(preferencesToSubmit);\n \n if (isWebPub) {\n dispatch(setWebPubSpacingPreset({\n preset: spacingKey,\n values: reduxValues,\n }));\n } else {\n dispatch(setSpacingPreset({\n preset: spacingKey,\n values: reduxValues,\n }));\n }\n }, [isWebPub, dispatch, submitPreferences, getPresetValues, lineHeightOptions]);\n\n // Use appropriate spacing keys based on layout\n const spacingKeys = useMemo(() => {\n const baseKeys = isWebPub \n ? webPubSpacingPresetKeys \n : isFXL \n ? fxlSpacingPresetKeys \n : reflowSpacingPresetKeys;\n const subPanelKeys = subPanelSpacingSettingsKeys || [];\n\n const hasCustomizableSettings = hasCustomizableSpacingSettings(subPanelKeys);\n\n if (hasCustomizableSettings) {\n return baseKeys;\n } else {\n // Exclude \"custom\" if no spacing settings are available for customization\n return baseKeys.filter(key => key !== ThSpacingPresetKeys.custom);\n }\n }, [isWebPub, isFXL, fxlSpacingPresetKeys, reflowSpacingPresetKeys, webPubSpacingPresetKeys, subPanelSpacingSettingsKeys]);\n\n // Create dynamic items array based on spacing keys\n const items = useMemo(() => {\n return spacingKeys.map((key: ThSpacingPresetKeys) => ({\n id: key,\n icon: iconMap[key],\n value: key,\n label: t(`reader.preferences.spacing.presets.${ key === ThSpacingPresetKeys.publisher ? \"default\" : key }`)\n }));\n }, [spacingKeys, t]);\n\n // Return null if no items to display\n if (items.length === 0) {\n return null;\n }\n\n return (\n <>\n <StatefulRadioGroup\n standalone={ standalone }\n label={ t(\"reader.preferences.spacing.presets.title\") }\n orientation=\"horizontal\"\n value={ spacing?.preset || ThSpacingPresetKeys.publisher }\n onChange={ async (val: string) => await updatePreference(val as ThSpacingPresetKeys) }\n items={ items }\n />\n </>\n );\n}","import * as React from \"react\";\nconst SvgFormatAlignLeft = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"Inherit\" {...props}><path d=\"M120-120v-80h720v80H120Zm0-160v-80h480v80H120Zm0-160v-80h720v80H120Zm0-160v-80h480v80H120Zm0-160v-80h720v80H120Z\" /></svg>;\nexport default SvgFormatAlignLeft;","import * as React from \"react\";\nconst SvgFormatAlignRight = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"Inherit\" {...props}><path d=\"M120-760v-80h720v80H120Zm240 160v-80h480v80H360ZM120-440v-80h720v80H120Zm240 160v-80h480v80H360ZM120-120v-80h720v80H120Z\" /></svg>;\nexport default SvgFormatAlignRight;","import * as React from \"react\";\nconst SvgFormatAlignJustify = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"Inherit\" {...props}><path d=\"M120-120v-80h720v80H120Zm0-160v-80h720v80H120Zm0-160v-80h720v80H120Zm0-160v-80h720v80H120Zm0-160v-80h720v80H120Z\" /></svg>;\nexport default SvgFormatAlignJustify;","\"use client\";\n\nimport { useCallback } from \"react\";\n\nimport { ThTextAlignOptions } from \"@/preferences/models\";\nimport { StatefulSettingsItemProps } from \"../models/settings\";\nimport { TextAlignment } from \"@readium/navigator\";\n\nimport BookIcon from \"../assets/icons/book.svg\";\nimport LeftAlignIcon from \"./assets/icons/format_align_left.svg\";\nimport RightAlignIcon from \"./assets/icons/format_align_right.svg\";\nimport JustifyIcon from \"./assets/icons/format_align_justify.svg\";\n\nimport { StatefulRadioGroup } from \"../StatefulRadioGroup\";\n\nimport { useNavigator } from \"@/core/Navigator\";\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { useAppDispatch, useAppSelector } from \"@/lib/hooks\";\nimport { setTextAlign, setHyphens } from \"@/lib/settingsReducer\";\nimport { setWebPubHyphens, setWebPubTextAlign } from \"@/lib/webPubSettingsReducer\";\n\nexport const StatefulTextAlign = ({ standalone = true }: StatefulSettingsItemProps) => {\n const { t } = useI18n();\n\n const profile = useAppSelector(state => state.reader.profile);\n const isWebPub = profile === \"webPub\";\n \n const isRTL = useAppSelector(state => state.publication.isRTL);\n const textAlign = useAppSelector(state => isWebPub ? state.webPubSettings.textAlign : state.settings.textAlign) ?? ThTextAlignOptions.publisher;\n const dispatch = useAppDispatch();\n\n const { getSetting, submitPreferences } = useNavigator();\n\n const items = [\n {\n id: ThTextAlignOptions.publisher,\n icon: BookIcon,\n label: t(\"reader.preferences.textAlign.default\"), \n value: ThTextAlignOptions.publisher \n },\n {\n id: ThTextAlignOptions.start,\n icon: isRTL ? RightAlignIcon : LeftAlignIcon,\n label: isRTL ? t(\"reader.preferences.textAlign.right\") : t(\"reader.preferences.textAlign.left\"), \n value: ThTextAlignOptions.start \n },\n {\n id: ThTextAlignOptions.justify,\n icon: JustifyIcon,\n label: t(\"reader.preferences.textAlign.justify\"), \n value: ThTextAlignOptions.justify \n }\n ];\n\n const updatePreference = useCallback(async (value: string) => {\n const textAlign: TextAlignment | null = value === ThTextAlignOptions.publisher \n ? null \n : value === ThTextAlignOptions.start \n ? TextAlignment.start \n : TextAlignment.justify;\n \n const currentHyphens = getSetting(\"hyphens\") as boolean | undefined | null;\n \n const hyphens = textAlign === null \n ? null \n : (currentHyphens ?? textAlign === TextAlignment.justify);\n \n await submitPreferences({\n textAlign: textAlign,\n hyphens: hyphens\n });\n \n const textAlignSetting = getSetting(\"textAlign\") as TextAlignment | null;\n const textAlignValue = textAlignSetting === null ? ThTextAlignOptions.publisher : textAlignSetting as unknown as ThTextAlignOptions;\n const effectiveHyphens = getSetting(\"hyphens\");\n \n if (isWebPub) {\n dispatch(setWebPubTextAlign(textAlignValue));\n dispatch(setWebPubHyphens(effectiveHyphens));\n } else {\n dispatch(setTextAlign(textAlignValue));\n dispatch(setHyphens(effectiveHyphens));\n }\n }, [isWebPub, getSetting, submitPreferences, dispatch]);\n\n return (\n <>\n <StatefulRadioGroup \n standalone={ standalone } \n label={ t(\"reader.preferences.textAlign.title\") }\n orientation=\"horizontal\" \n value={ textAlign } \n onChange={ async (val: string) => await updatePreference(val) }\n items={ items }\n />\n </>\n );\n}","\"use client\";\n\nimport { useCallback } from \"react\";\n\nimport { StatefulSettingsItemProps } from \"../models/settings\";\n\nimport { StatefulSwitch } from \"../StatefulSwitch\";\n\nimport { useNavigator } from \"@/core/Navigator\";\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { useAppDispatch, useAppSelector } from \"@/lib/hooks\";\nimport { setTextNormalization } from \"@/lib/settingsReducer\";\nimport { setWebPubTextNormalization } from \"@/lib/webPubSettingsReducer\";\n\n// TMP Component that is not meant to be implemented AS-IS, for testing purposes\nexport const StatefulTextNormalize = ({ standalone = true }: StatefulSettingsItemProps) => {\n const { t } = useI18n();\n\n const profile = useAppSelector(state => state.reader.profile);\n const isWebPub = profile === \"webPub\";\n \n const textNormalization = useAppSelector(state => isWebPub ? state.webPubSettings.textNormalization : state.settings.textNormalization) ?? false;\n const dispatch = useAppDispatch();\n\n const { getSetting, submitPreferences } = useNavigator();\n\n const updatePreference = useCallback(async (value: boolean) => {\n await submitPreferences({ textNormalization: value });\n const effectiveSetting = getSetting(\"textNormalization\");\n\n if (isWebPub) {\n dispatch(setWebPubTextNormalization(effectiveSetting));\n } else {\n dispatch(setTextNormalization(effectiveSetting));\n }\n }, [isWebPub, submitPreferences, getSetting, dispatch]);\n\n return(\n <>\n <StatefulSwitch \n standalone={ standalone }\n heading={ t(\"reader.preferences.textNormalization.title\") }\n label={ t(\"reader.preferences.textNormalization.label\") }\n onChange={ async (isSelected: boolean) => await updatePreference(isSelected) }\n isSelected={ textNormalization ?? false }\n />\n </>\n )\n}","import * as React from \"react\";\nconst SvgCheck = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"inherit\" {...props}><path d=\"M382-240 154-468l57-57 171 171 367-367 57 57-424 424Z\" /></svg>;\nexport default SvgCheck;","\"use client\";\n\nimport { useCallback, useEffect, useRef } from \"react\";\n\nimport { ThemeKeyType, usePreferenceKeys } from \"@/preferences\";\n\nimport settingsStyles from \"../../Settings/assets/styles/thorium-web.reader.settings.module.css\";\n\nimport CheckIcon from \"./assets/icons/check.svg\";\n\nimport { ThActionsKeys, ThLayoutDirection } from \"@/preferences/models\";\n\nimport { StatefulRadioGroup } from \"../../Settings/StatefulRadioGroup\";\nimport { Radio } from \"react-aria-components\";\n\nimport { usePreferences } from \"@/preferences/hooks/usePreferences\";\nimport { useEpubNavigator } from \"@/core/Hooks/Epub/useEpubNavigator\";\nimport { useI18n } from \"@/i18n/useI18n\";\nimport { useGridNavigation } from \"@/components/Settings/hooks/useGridNavigation\";\n\nimport { useAppDispatch, useAppSelector } from \"@/lib/hooks\";\nimport { setActionOpen } from \"@/lib\";\nimport { setTheme } from \"@/lib/themeReducer\";\n\nimport classNames from \"classnames\";\nimport { buildThemeObject } from \"@/preferences/helpers/buildThemeObject\";\n\nexport const StatefulTheme = () => {\n const { fxlThemeKeys, reflowThemeKeys } = usePreferenceKeys();\n const { preferences } = usePreferences();\n const { t } = useI18n();\n\n const radioGroupRef = useRef<HTMLDivElement | null>(null);\n const radioGroupWrapperRef = useRef<HTMLDivElement | null>(null);\n\n const isFXL = useAppSelector(state => state.publication.isFXL);\n const direction = useAppSelector(state => state.reader.direction);\n const isRTL = direction === ThLayoutDirection.rtl;\n const themeArray = isFXL ? fxlThemeKeys : reflowThemeKeys;\n\n const themeObject = useAppSelector(state => state.theming.theme);\n const theme = isFXL ? themeObject.fxl : themeObject.reflow;\n const colorScheme = useAppSelector(state => state.theming.colorScheme);\n\n const themeItems = useRef<(ThemeKeyType | \"auto\")[]>(\n themeArray.filter((theme: ThemeKeyType | \"auto\") => {\n if (theme === \"auto\") {\n return preferences.theming.themes.systemThemes !== undefined && \n Object.values(preferences.theming.themes.systemThemes).every(t => \n themeArray.includes(t)\n );\n }\n return true;\n })\n );\n\n const dispatch = useAppDispatch();\n\n // Handling grid navigation through StatefulRadioGroup\n // would add a ton of complexity due to the extensive\n // logic for handling different types of children (render, node, etc.)\n // So we handle it here instead for the time being\n const { onKeyDown } = useGridNavigation({\n containerRef: radioGroupWrapperRef,\n items: themeItems,\n currentValue: theme,\n onChange: async (val) => await updatePreference(val as ThemeKeyType),\n isRTL,\n onEscape: () => dispatch(setActionOpen({ \n key: ThActionsKeys.settings,\n isOpen: false \n })),\n onFocus: (id) => {\n const element = radioGroupWrapperRef.current?.querySelector(`[id=\"${ id }\"]`);\n if (element) (element as HTMLElement).focus();\n }\n })\n\n const { submitPreferences } = useEpubNavigator();\n\n const updatePreference = useCallback(async (value: ThemeKeyType | \"auto\") => {\n const themeProps = buildThemeObject<typeof value>({\n theme: value,\n themeKeys: preferences.theming.themes.keys,\n systemThemes: preferences.theming.themes.systemThemes,\n colorScheme\n })\n await submitPreferences(themeProps);\n\n dispatch(setTheme({ \n key: isFXL ? \"fxl\" : \"reflow\", \n value: value\n }));\n }, [isFXL, preferences.theming.themes.keys, preferences.theming.themes.systemThemes, submitPreferences, dispatch, colorScheme]);\n\n // It’s easier to inline styles from preferences for these\n // than spamming the entire app with all custom properties right now\n const doStyles = useCallback((t: ThemeKeyType | \"auto\") => {\n // For some reason Typescript will just refuse to create dts files\n // for the packages if we set it to CSSProperties…\n let cssProps: any = {\n boxSizing: \"border-box\",\n color: \"#999999\"\n };\n\n if (t === \"auto\") {\n if (preferences.theming.themes.systemThemes !== undefined) {\n cssProps.background = isRTL \n ? `linear-gradient(148deg, ${ preferences.theming.themes.keys[preferences.theming.themes.systemThemes.dark].background } 48%, ${ preferences.theming.themes.keys[preferences.theming.themes.systemThemes.light].background } 100%)` \n : `linear-gradient(148deg, ${ preferences.theming.themes.keys[preferences.theming.themes.systemThemes.light].background } 0%, ${ preferences.theming.themes.keys[preferences.theming.themes.systemThemes.dark].background } 48%)`;\n cssProps.color = \"#ffffff\";\n cssProps.border = `1px solid ${ preferences.theming.themes.keys[preferences.theming.themes.systemThemes.light].subdue }`;\n } else {\n cssProps.display = \"none\";\n }\n } else {\n const themeKey = t as keyof typeof preferences.theming.themes.keys;\n const theme = preferences.theming.themes.keys[themeKey];\n cssProps.background = theme.background;\n cssProps.color = theme.text;\n cssProps.border = `1px solid ${theme.subdue}`;\n };\n \n return cssProps;\n }, [preferences, isRTL]);\n\n // Edge case where the value stored is auto, but the array doesn’t have it\n useEffect(() => {\n if (theme === \"auto\" && !themeItems.current.includes(theme)) {\n updatePreference(themeItems.current[0]);\n }\n }, [theme, updatePreference]);\n\n return (\n <>\n <StatefulRadioGroup\n ref={ radioGroupRef }\n standalone={ true }\n label={ t(\"reader.preferences.themes.title\") }\n value={ theme }\n onChange={ async (val) => await updatePreference(val as ThemeKeyType) }\n useGraphicalNavigation={ false }\n >\n <div \n ref={ radioGroupWrapperRef }\n className={ classNames(settingsStyles.radioWrapper, settingsStyles.themesWrapper) \n }>\n { themeItems.current.map(( themeItem ) => \n <Radio\n className={ classNames(\n settingsStyles.radio, \n settingsStyles.themeRadio\n ) }\n value={ themeItem }\n id={ themeItem }\n key={ themeItem }\n style={ doStyles(themeItem) }\n onKeyDown={ onKeyDown }\n >\n <span>\n { t(`reader.preferences.themes.${ themeItem }`, { defaultValue: themeItem }) }\n { themeItem === theme && <CheckIcon aria-hidden=\"true\" focusable=\"false\" /> }\n </span>\n </Radio>\n ) }\n </div>\n </StatefulRadioGroup>\n </>\n )\n}","\"use client\";\n\nimport { useCallback } from \"react\";\n\nimport { ThSettingsKeys, ThSettingsRangeVariant, ThSpacingSettingsKeys } from \"@/preferences\";\n\nimport { StatefulSettingsItemProps } from \"../models/settings\";\n\nimport { StatefulNumberField } from \"../StatefulNumberField\";\nimport { StatefulSlider } from \"../StatefulSlider\";\n\nimport { usePreferences } from \"@/preferences/hooks/usePreferences\";\nimport { useNavigator } from \"@/core/Navigator\";\nimport { useI18n } from \"@/i18n/useI18n\";\nimport { useSpacingPresets } from \"./hooks/useSpacingPresets\";\nimport { usePlaceholder } from \"../hooks/usePlaceholder\";\n\nexport const StatefulWordSpacing = ({ standalone = true }: StatefulSettingsItemProps) => {\n const { preferences } = usePreferences();\n const { t } = useI18n();\n\n const wordSpacingRangeConfig = {\n variant: preferences.settings.keys[ThSettingsKeys.wordSpacing].variant,\n placeholder: preferences.settings.keys[ThSettingsKeys.wordSpacing].placeholder,\n range: preferences.settings.keys[ThSettingsKeys.wordSpacing].range,\n step: preferences.settings.keys[ThSettingsKeys.wordSpacing].step\n };\n\n const placeholderText = usePlaceholder(wordSpacingRangeConfig.placeholder, wordSpacingRangeConfig.range, \"percent\");\n \n const { getSetting, submitPreferences } = useNavigator();\n\n const { getEffectiveSpacingValue, setWordSpacing, canBeReset } = useSpacingPresets();\n\n const wordSpacing = getEffectiveSpacingValue(ThSpacingSettingsKeys.wordSpacing);\n \n const updatePreference = useCallback(async (value: number | number[] | null) => {\n await submitPreferences({\n wordSpacing: Array.isArray(value) ? value[0] : value\n });\n \n setWordSpacing(getSetting(\"wordSpacing\"));\n }, [submitPreferences, getSetting, setWordSpacing]);\n\n return (\n <>\n { wordSpacingRangeConfig.variant === ThSettingsRangeVariant.numberField \n ? <StatefulNumberField \n standalone={ standalone }\n label={ t(\"reader.preferences.wordSpacing\") }\n placeholder={ placeholderText }\n defaultValue={ undefined } \n value={ wordSpacing ?? undefined } \n onChange={ async(value) => await updatePreference(value) } \n onReset={ canBeReset(ThSpacingSettingsKeys.wordSpacing) ? async() => await updatePreference(null) : undefined }\n range={ wordSpacingRangeConfig.range }\n step={ wordSpacingRangeConfig.step }\n steppers={{\n decrementLabel: t(\"common.actions.decrease\"),\n incrementLabel: t(\"common.actions.increase\")\n }}\n formatOptions={{ style: \"percent\" }} \n isWheelDisabled={ true }\n isVirtualKeyboardDisabled={ true }\n />\n : <StatefulSlider\n standalone={ standalone }\n displayTicks={ wordSpacingRangeConfig.variant === ThSettingsRangeVariant.incrementedSlider }\n label={ t(\"reader.preferences.wordSpacing\") }\n placeholder={ placeholderText }\n defaultValue={ undefined } \n value={ wordSpacing ?? undefined } \n onChange={ async(value) => await updatePreference(value as number) } \n onReset={ canBeReset(ThSpacingSettingsKeys.wordSpacing) ? async() => await updatePreference(null) : undefined }\n range={ wordSpacingRangeConfig.range }\n step={ wordSpacingRangeConfig.step }\n formatOptions={{ style: \"percent\" }}\n /> \n }\n </>\n )\n}","import * as React from \"react\";\nconst SvgTextDecrease = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"Inherit\" {...props}><path d=\"m40-200 210-560h100l210 560h-96l-51-143H187l-51 143H40Zm176-224h168l-82-232h-4l-82 232Zm384-16v-80h320v80H600Z\" /></svg>;\nexport default SvgTextDecrease;","import * as React from \"react\";\nconst SvgTextIncrease = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"Inherit\" {...props}><path d=\"m40-200 210-560h100l210 560h-96l-51-143H187l-51 143H40Zm176-224h168l-82-232h-4l-82 232Zm504 104v-120H600v-80h120v-120h80v120h120v80H800v120h-80Z\" /></svg>;\nexport default SvgTextIncrease;","import * as React from \"react\";\nconst SvgZoomOut = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"Inherit\" {...props}><path d=\"M784-120 532-372q-30 24-69 38t-83 14q-109 0-184.5-75.5T120-580q0-109 75.5-184.5T380-840q109 0 184.5 75.5T640-580q0 44-14 83t-38 69l252 252-56 56ZM380-400q75 0 127.5-52.5T560-580q0-75-52.5-127.5T380-760q-75 0-127.5 52.5T200-580q0 75 52.5 127.5T380-400ZM280-540v-80h200v80H280Z\" /></svg>;\nexport default SvgZoomOut;","import * as React from \"react\";\nconst SvgZoomIn = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"Inherit\" {...props}><path d=\"M784-120 532-372q-30 24-69 38t-83 14q-109 0-184.5-75.5T120-580q0-109 75.5-184.5T380-840q109 0 184.5 75.5T640-580q0 44-14 83t-38 69l252 252-56 56ZM380-400q75 0 127.5-52.5T560-580q0-75-52.5-127.5T380-760q-75 0-127.5 52.5T200-580q0 75 52.5 127.5T380-400Zm-40-60v-80h-80v-80h80v-80h80v80h80v80h-80v80h-80Z\" /></svg>;\nexport default SvgZoomIn;","\"use client\";\n\nimport React, { useCallback } from \"react\";\n\nimport { ThSettingsKeys, ThSettingsRangeVariant } from \"@/preferences\";\n\nimport Decrease from \"./assets/icons/text_decrease.svg\";\nimport Increase from \"./assets/icons/text_increase.svg\";\nimport ZoomOut from \"./assets/icons/zoom_out.svg\";\nimport ZoomIn from \"./assets/icons/zoom_in.svg\";\n\nimport { StatefulSlider } from \"./StatefulSlider\";\nimport { StatefulNumberField } from \"./StatefulNumberField\";\n\nimport { usePreferences } from \"@/preferences/hooks/usePreferences\";\nimport { useNavigator } from \"@/core/Navigator/hooks\";\nimport { useI18n } from \"@/i18n/useI18n\";\nimport { usePlaceholder } from \"./hooks/usePlaceholder\";\n\nimport { useAppDispatch, useAppSelector } from \"@/lib/hooks\";\nimport { setFontSize } from \"@/lib/settingsReducer\";\nimport { setWebPubZoom } from \"@/lib/webPubSettingsReducer\";\n\nexport const StatefulZoom = () => {\n const { preferences } = usePreferences();\n const { t } = useI18n();\n\n const readerProfile = useAppSelector((state) => state.reader.profile);\n const isFXL = useAppSelector((state) => state.publication.isFXL);\n const fontSize = useAppSelector((state) => state.settings.fontSize) || 1;\n const webPubZoom = useAppSelector((state) => state.webPubSettings.zoom) || 1;\n const derivedState = readerProfile === \"webPub\" ? webPubZoom : fontSize;\n \n const dispatch = useAppDispatch();\n \n const { \n getSetting, \n submitPreferences,\n preferencesEditor \n } = useNavigator();\n\n const preferenceEditorProperty = readerProfile === \"webPub\" \n ? preferencesEditor?.zoom \n : isFXL \n ? preferencesEditor?.zoom \n : preferencesEditor?.fontSize;\n\n const updatePreference = useCallback(async (value: number | number[]) => {\n if (readerProfile === \"webPub\") {\n await submitPreferences({ zoom: Array.isArray(value) ? value[0] : value });\n dispatch(setWebPubZoom(getSetting(\"zoom\")));\n } else {\n await submitPreferences({ fontSize: Array.isArray(value) ? value[0] : value });\n dispatch(setFontSize(getSetting(\"fontSize\")));\n }\n }, [readerProfile, submitPreferences, getSetting, dispatch]);\n\n const getEffectiveRange = (preferred: [number, number], supportedRange: [number, number] | undefined): [number, number] => {\n if (!supportedRange) {\n return preferred\n }\n if (preferred && isRangeWithinSupportedRange(preferred, supportedRange)) {\n return preferred;\n }\n return supportedRange;\n }\n \n const isRangeWithinSupportedRange = (range: [number, number], supportedRange: [number, number]): boolean => {\n return Math.min(range[0], range[1]) >= Math.min(supportedRange[0], supportedRange[1]) &&\n Math.max(range[0], range[1]) <= Math.max(supportedRange[0], supportedRange[1]);\n }\n\n const zoomRangeConfig = {\n variant: preferences.settings.keys[ThSettingsKeys.zoom].variant,\n placeholder: preferences.settings.keys[ThSettingsKeys.zoom].placeholder,\n range: preferenceEditorProperty?.supportedRange\n ? getEffectiveRange(preferences.settings.keys[ThSettingsKeys.zoom].range, preferenceEditorProperty.supportedRange)\n : preferences.settings.keys[ThSettingsKeys.zoom].range,\n step: preferences.settings.keys[ThSettingsKeys.zoom].step\n }\n\n const placeholderText = usePlaceholder(zoomRangeConfig.placeholder, zoomRangeConfig.range);\n\n return (\n <>\n { zoomRangeConfig.variant === ThSettingsRangeVariant.numberField \n ? <StatefulNumberField\n standalone={ true }\n defaultValue={ 1 } \n value={ derivedState } \n onChange={ async(value) => await updatePreference(value) } \n label={ isFXL ? t(\"reader.preferences.zoom\") : t(\"reader.preferences.fontSize\") }\n placeholder={ placeholderText }\n range={ zoomRangeConfig.range }\n step={ zoomRangeConfig.step }\n steppers={{\n decrementIcon: isFXL ? ZoomOut : Decrease,\n decrementLabel: t(\"common.actions.decrease\"),\n incrementIcon: isFXL ? ZoomIn : Increase,\n incrementLabel: t(\"common.actions.increase\")\n }}\n formatOptions={{ style: \"percent\" }} \n isWheelDisabled={ true }\n isVirtualKeyboardDisabled={ true }\n />\n : <StatefulSlider\n standalone={ true }\n displayTicks={ zoomRangeConfig.variant === ThSettingsRangeVariant.incrementedSlider }\n defaultValue={ 1 } \n value={ derivedState } \n onChange={ async(value) => await updatePreference(value as number) } \n label={ isFXL ? t(\"reader.preferences.zoom\") : t(\"reader.preferences.fontSize\") }\n placeholder={ placeholderText }\n range={ zoomRangeConfig.range }\n step={ zoomRangeConfig.step }\n formatOptions={{ style: \"percent\" }} \n />\n } \n </>\n );\n};","import { ThPlugin } from \"../PluginRegistry\";\nimport { ThActionsKeys, ThSettingsKeys } from \"@/preferences/models\";\n\nimport { StatefulFullscreenTrigger } from \"../../Actions/Fullscreen/StatefulFullscreenTrigger\";\nimport { StatefulJumpToPositionTrigger } from \"../../Actions/JumpToPosition/StatefulJumpToPositionTrigger\";\nimport { StatefulJumpToPositionContainer } from \"../../Actions/JumpToPosition/StatefulJumpToPositionContainer\";\nimport { StatefulSettingsTrigger } from \"../../Actions/Settings/StatefulSettingsTrigger\";\nimport { StatefulSettingsContainer } from \"../../Actions/Settings/StatefulSettingsContainer\";\nimport { StatefulTocTrigger } from \"../../Actions/Toc/StatefulTocTrigger\";\nimport { StatefulTocContainer } from \"../../Actions/Toc/StatefulTocContainer\";\n\nimport { StatefulColumns } from \"../../Epub/Settings/StatefulColumns\";\nimport { StatefulFontFamily } from \"../../Settings/Text/StatefulFontFamily\";\nimport { UnstableStatefulFontWeight } from \"../../Settings/Text/StatefulFontWeight\";\nimport { StatefulHyphens } from \"../../Settings/Text/StatefulHyphens\";\nimport { StatefulLayout } from \"../../Epub/Settings/StatefulLayout\";\nimport { StatefulLetterSpacing } from \"../../Settings/Spacing/StatefulLetterSpacing\";\nimport { StatefulLineHeight } from \"../../Settings/Spacing/StatefulLineHeight\";\nimport { StatefulParagraphIndent } from \"../../Settings/Spacing/StatefulParagraphIndent\";\nimport { StatefulParagraphSpacing } from \"../../Settings/Spacing/StatefulParagraphSpacing\";\nimport { StatefulPublisherStyles } from \"../../Settings/StatefulPublisherStyles\";\nimport { StatefulSpacingGroup } from \"../../Settings/Spacing/StatefulSpacingGroup\";\nimport { StatefulSpacingPresets } from \"../../Settings/Spacing/StatefulSpacingPresets\";\nimport { StatefulTextAlign } from \"../../Settings/Text/StatefulTextAlign\";\nimport { StatefulTextGroup } from \"../../Settings/Text/StatefulTextGroup\";\nimport { StatefulTextNormalize } from \"../../Settings/Text/StatefulTextNormalize\";\nimport { StatefulTheme } from \"../../Epub/Settings/StatefulTheme\";\nimport { StatefulWordSpacing } from \"../../Settings/Spacing/StatefulWordSpacing\";\nimport { StatefulZoom } from \"../../Settings/StatefulZoom\";\n\nexport const createDefaultPlugin = (): ThPlugin => {\n return {\n id: \"core\",\n name: \"Core Components\",\n description: \"Default components for Thorium Web Epub StatefulReader\",\n version: \"1.2.0\",\n components: {\n actions: {\n [ThActionsKeys.fullscreen]: {\n Trigger: StatefulFullscreenTrigger\n },\n [ThActionsKeys.jumpToPosition]: {\n Trigger: StatefulJumpToPositionTrigger,\n Target: StatefulJumpToPositionContainer\n },\n [ThActionsKeys.settings]: {\n Trigger: StatefulSettingsTrigger,\n Target: StatefulSettingsContainer\n },\n [ThActionsKeys.toc]: {\n Trigger: StatefulTocTrigger,\n Target: StatefulTocContainer\n }\n },\n settings: {\n [ThSettingsKeys.columns]: {\n Comp: StatefulColumns\n },\n [ThSettingsKeys.fontFamily]: {\n Comp: StatefulFontFamily,\n type: \"text\"\n },\n [ThSettingsKeys.fontWeight]: {\n Comp: UnstableStatefulFontWeight,\n type: \"text\"\n },\n [ThSettingsKeys.hyphens]: {\n Comp: StatefulHyphens,\n type: \"text\"\n },\n [ThSettingsKeys.layout]: {\n Comp: StatefulLayout\n },\n [ThSettingsKeys.letterSpacing]: {\n Comp: StatefulLetterSpacing,\n type: \"spacing\"\n },\n [ThSettingsKeys.lineHeight]: {\n Comp: StatefulLineHeight,\n type: \"spacing\"\n },\n [ThSettingsKeys.paragraphIndent]: {\n Comp: StatefulParagraphIndent,\n type: \"spacing\"\n },\n [ThSettingsKeys.paragraphSpacing]: {\n Comp: StatefulParagraphSpacing,\n type: \"spacing\"\n },\n [ThSettingsKeys.publisherStyles]: {\n Comp: StatefulPublisherStyles,\n type: \"spacing\"\n },\n [ThSettingsKeys.spacingGroup]: {\n Comp: StatefulSpacingGroup,\n },\n [ThSettingsKeys.spacingPresets]: {\n Comp: StatefulSpacingPresets,\n type: \"spacing\"\n },\n [ThSettingsKeys.textAlign]: {\n Comp: StatefulTextAlign,\n type: \"text\"\n },\n [ThSettingsKeys.textGroup]: {\n Comp: StatefulTextGroup\n },\n [ThSettingsKeys.textNormalize]: {\n Comp: StatefulTextNormalize,\n type: \"text\"\n },\n [ThSettingsKeys.theme]: {\n Comp: StatefulTheme\n },\n [ThSettingsKeys.wordSpacing]: {\n Comp: StatefulWordSpacing,\n type: \"spacing\"\n },\n [ThSettingsKeys.zoom]: {\n Comp: StatefulZoom\n }\n }\n }\n };\n};","\"use client\";\n\nimport { ReactNode, useMemo } from \"react\";\nimport { useStore } from \"react-redux\";\n\nimport { DefaultKeys, ThPreferences } from \"@/preferences/preferences\";\nimport { defaultPreferences } from \"@/preferences/defaultPreferences\";\n\nimport { ThPreferencesProvider } from \"@/preferences/ThPreferencesProvider\";\nimport { ThReduxPreferencesAdapter } from \"@/lib/ThReduxPreferencesAdapter\";\n\nimport { RootState } from \"@/lib/store\";\n\nexport const StatefulPreferencesProvider = ({ \n children,\n initialPreferences = defaultPreferences as ThPreferences<DefaultKeys>\n}: { \n children: ReactNode;\n initialPreferences?: ThPreferences<DefaultKeys>;\n}) => {\n const store = useStore<RootState>();\n \n const adapter = useMemo(() => {\n return new ThReduxPreferencesAdapter<DefaultKeys>(store, initialPreferences);\n }, [store, initialPreferences]);\n \n return (\n <ThPreferencesProvider adapter={ adapter }>\n { children }\n </ThPreferencesProvider>\n );\n}\n","import { useAppSelector } from \"@/lib/hooks\";\nimport { usePrevious } from \"@/core/Hooks/usePrevious\";\n\nexport interface ReaderTransitions {\n // Current states\n isImmersive: boolean;\n isFullscreen: boolean;\n isScroll: boolean;\n hasUserNavigated: boolean;\n \n // Previous states\n wasImmersive: boolean;\n wasFullscreen: boolean;\n wasScroll: boolean;\n wasUserNavigated: boolean;\n \n // State transitions\n fromImmersive: boolean;\n toImmersive: boolean;\n fromFullscreen: boolean;\n toFullscreen: boolean;\n fromScroll: boolean;\n toScroll: boolean;\n fromUserNavigation: boolean;\n toUserNavigation: boolean;\n}\n\nexport const useReaderTransitions = (): ReaderTransitions => {\n // Current states\n const isImmersive = useAppSelector(state => state.reader.isImmersive);\n const isFullscreen = useAppSelector(state => state.reader.isFullscreen);\n const hasUserNavigated = useAppSelector(state => state.reader.hasUserNavigated);\n const scroll = useAppSelector(state => state.settings.scroll);\n const isFXL = useAppSelector(state => state.publication.isFXL);\n \n const isScroll = scroll && !isFXL;\n \n // Previous states\n const wasImmersive = usePrevious(isImmersive) ?? false;\n const wasFullscreen = usePrevious(isFullscreen) ?? false;\n const wasScroll = usePrevious(isScroll) ?? false;\n const wasUserNavigated = usePrevious(hasUserNavigated) ?? false;\n\n // State transitions\n const fromImmersive = wasImmersive && !isImmersive;\n const toImmersive = !wasImmersive && isImmersive;\n const fromFullscreen = wasFullscreen && !isFullscreen;\n const toFullscreen = !wasFullscreen && isFullscreen;\n const fromScroll = wasScroll && !isScroll;\n const toScroll = !wasScroll && isScroll;\n const fromUserNavigation = wasUserNavigated && !hasUserNavigated;\n const toUserNavigation = !wasUserNavigated && hasUserNavigated;\n\n return {\n // Current states\n isImmersive,\n isFullscreen,\n isScroll,\n hasUserNavigated,\n \n // Previous states\n wasImmersive,\n wasFullscreen,\n wasScroll,\n wasUserNavigated,\n \n // State transitions\n fromImmersive,\n toImmersive,\n fromFullscreen,\n toFullscreen,\n fromScroll,\n toScroll,\n fromUserNavigation,\n toUserNavigation\n };\n};\n","import { Locator } from \"@readium/shared\";\n\nexport const deserializePositions = (positionsList?: Locator[]) => {\n return positionsList?.map((locator) => ({\n href: locator.href,\n type: locator.type,\n locations: {\n position: locator.locations.position,\n progression: locator.locations.progression,\n totalProgression: locator.locations.totalProgression\n },\n }));\n};","\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport { Link } from \"@readium/shared\";\nimport { \n Manifest, \n Publication, \n Fetcher, \n HttpFetcher, \n Layout, \n ReadingProgression,\n Feature,\n Profile\n} from \"@readium/shared\";\nimport { useAppDispatch } from \"@/lib/hooks\";\nimport { \n setRTL, \n setFXL, \n setPositionsList,\n setHasDisplayTransformability,\n setFontLanguage\n} from \"@/lib/publicationReducer\";\nimport { setReaderProfile, ReaderProfile } from \"@/lib/readerReducer\";\nimport { usePreferences } from \"@/preferences/hooks/usePreferences\";\nimport { deserializePositions } from \"@/helpers/deserializePositions\";\nimport { ErrorHandler, ProcessedError } from \"@/helpers/errorHandler\";\n\nexport interface UsePublicationOptions {\n url: string;\n onError?: (error: ProcessedError) => void;\n fetcher?: Fetcher;\n}\n\nexport interface UsePublicationReturn {\n // Loading states\n isLoading: boolean;\n error: ProcessedError | null;\n \n // Publication data\n publication: Publication | null;\n manifest: object | null;\n selfLink: string | null;\n localDataKey: string | null;\n \n // Profile detection\n profile: ReaderProfile | null;\n \n // Publication metadata\n isRTL: boolean;\n isFXL: boolean;\n fontLanguage: string;\n hasDisplayTransformability: boolean;\n}\n\nconst detectProfile = (manifest: Manifest): ReaderProfile => {\n // Check conformsTo in manifest metadata to determine profile\n const metadata = manifest.metadata;\n if (!metadata) return \"webPub\"; // Default to webPub when no metadata\n \n const conformsTo = metadata.conformsTo;\n if (!conformsTo) return \"webPub\"; // Default to webPub when no conformsTo\n \n // Handle both string and array formats\n const profiles = Array.isArray(conformsTo) ? conformsTo : [conformsTo];\n \n // Check for audiobook profile first\n if (profiles.some((profile: Profile) => \n profile === Profile.AUDIOBOOK\n )) {\n return \"audio\";\n }\n \n // Check for epub profile\n if (profiles.some((profile: Profile) => \n profile === Profile.EPUB\n )) {\n return \"epub\";\n }\n \n // Default to webPub for any other profile or no specific profile\n return \"webPub\";\n};\n\nexport const usePublication = ({ \n url, \n onError = () => {},\n fetcher: customFetcher\n}: UsePublicationOptions): UsePublicationReturn => {\n const dispatch = useAppDispatch();\n const { resolveFontLanguage } = usePreferences();\n \n // Basic states\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<ProcessedError | null>(null);\n const [manifest, setManifest] = useState<object | null>(null);\n const [selfLink, setSelfLink] = useState<string | null>(null);\n const [localDataKey, setLocalDataKey] = useState<string | null>(null);\n \n // Publication states\n const [publication, setPublication] = useState<Publication | null>(null);\n const [profile, setProfile] = useState<ReaderProfile | null>(null);\n \n // Metadata states\n const [isRTL, setIsRTL] = useState(false);\n const [isFXL, setIsFXL] = useState(false);\n const [fontLanguage, setFontLanguageState] = useState(\"\");\n const [hasDisplayTransformability, setHasDisplayTransformabilityState] = useState(false);\n\n const handleManifestError = (error: unknown, context: string) => {\n console.error(`${ context }:`, error);\n const processedError = ErrorHandler.process(error, context);\n setError(processedError);\n setIsLoading(false);\n };\n\n // Basic URL validation and loading\n useEffect(() => {\n if (!url) {\n const validationError = ErrorHandler.process(new Error('Manifest URL is required'), 'Validation');\n setError(validationError);\n setIsLoading(false);\n return;\n }\n\n setIsLoading(true);\n setError(null);\n \n // Decode URL if needed\n const decodedUrl = decodeURIComponent(url);\n \n const manifestLink = new Link({ href: decodedUrl });\n const fetcher = customFetcher || new HttpFetcher(undefined);\n\n try {\n const fetched = fetcher.get(manifestLink);\n \n // Get self-link first\n fetched.link().then(async (link) => {\n try {\n const selfHref = link.toURL(decodedUrl);\n setSelfLink(selfHref || null);\n if (selfHref) {\n setLocalDataKey(`${ selfHref }-current-location`);\n \n // Create fetcher with selfHref for proper URL resolution\n const manifestFetcher = customFetcher || new HttpFetcher(undefined, selfHref);\n \n // Fetch manifest with proper fetcher\n const manifestFetched = manifestFetcher.get(manifestLink);\n const manifestData = await manifestFetched.readAsJSON();\n \n setManifest(manifestData as object);\n \n // Create publication\n const manifestObj = Manifest.deserialize(manifestData)!;\n manifestObj.setSelfLink(selfHref);\n\n // Detect profile from parsed manifest\n const detectedProfile = detectProfile(manifestObj);\n setProfile(detectedProfile);\n dispatch(setReaderProfile(detectedProfile));\n\n const pub = new Publication({\n manifest: manifestObj,\n fetcher: manifestFetcher\n });\n \n // For EPUB, fetch positions before mounting reader\n if (detectedProfile === \"epub\") {\n try {\n const rawPositions = await pub.positionsFromManifest();\n const positionsList = deserializePositions(rawPositions);\n dispatch(setPositionsList(positionsList));\n } catch (error) {\n console.error(\"Failed to fetch positions:\", error);\n dispatch(setPositionsList([]));\n }\n }\n \n setPublication(pub);\n setIsLoading(false);\n }\n } catch (error: unknown) {\n handleManifestError(error, \"Error loading manifest\");\n }\n });\n } catch (error: unknown) {\n handleManifestError(error, \"Error loading manifest\");\n }\n }, [url, customFetcher, dispatch]);\n\n // Process publication metadata when publication is ready\n useEffect(() => {\n if (!publication) return;\n\n // RTL detection\n const rtl = publication.metadata.effectiveReadingProgression === ReadingProgression.rtl;\n setIsRTL(rtl);\n dispatch(setRTL(rtl));\n\n // FXL detection (only relevant for epub)\n if (profile === \"epub\") {\n const fxl = publication.metadata.effectiveLayout === Layout.fixed;\n setIsFXL(fxl);\n dispatch(setFXL(fxl));\n }\n\n // Font language resolution\n const resolvedLang = resolveFontLanguage(\n publication.metadata.languages?.[0], \n publication.metadata.effectiveReadingProgression\n );\n setFontLanguageState(resolvedLang);\n dispatch(setFontLanguage(resolvedLang));\n \n // Display transformability\n const displayTransformability = publication.metadata.accessibility?.feature?.some(\n feature => feature && feature.value === Feature.DISPLAY_TRANSFORMABILITY.value\n ) || false;\n setHasDisplayTransformabilityState(displayTransformability);\n dispatch(setHasDisplayTransformability(displayTransformability));\n\n // Positions list (only for epub)\n if (profile === \"epub\" && publication) {\n const fetchPositions = async () => {\n try {\n const positionsList = await publication.positionsFromManifest();\n const deserializedPositionsList = deserializePositions(positionsList);\n dispatch(setPositionsList(deserializedPositionsList));\n } catch (error) {\n console.error(\"Failed to fetch positions:\", error);\n dispatch(setPositionsList([]));\n }\n };\n\n fetchPositions();\n }\n }, [publication, profile, resolveFontLanguage, dispatch]);\n\n // Call onError callback when error changes\n useEffect(() => {\n if (error) {\n onError(error);\n }\n }, [error, onError]);\n\n return {\n isLoading,\n error,\n publication,\n manifest,\n selfLink,\n localDataKey,\n profile,\n isRTL,\n isFXL,\n fontLanguage,\n hasDisplayTransformability\n };\n};\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { Locator } from \"@readium/shared\";\nimport { PositionStorage } from \"@/components/Reader/StatefulReaderWrapper\";\nimport { useLocalStorage } from \"../core/Hooks/useLocalStorage\";\n\nexport const usePositionStorage = (key: string | null, customStorage?: PositionStorage) => {\n const localStorageData = useLocalStorage(key);\n const [customData, setCustomData] = useState<Locator | null>(() => \n customStorage ? (customStorage.get() || null) : null\n );\n \n if (customStorage) {\n const set = (newValue: Locator | null) => {\n if (newValue) {\n customStorage.set(newValue);\n }\n setCustomData(newValue);\n };\n \n const get = () => customData;\n \n return {\n setLocalData: set,\n getLocalData: get,\n localData: customData\n };\n }\n \n return localStorageData;\n};\n","/* For some classNames we need global, as they impact other modules */\n\n.wrapper {\n height: 100%;\n width: 100%;\n margin: 0;\n}\n\n.main {\n width: 100%;\n height: 100%;\n margin: 0;\n}\n\n.shell {\n width: 100%;\n height: 100%;\n margin: 0;\n}\n\n.leftDock {\n height: 100vh;\n height: 100dvh;\n}\n\n.rightDock {\n height: 100vh;\n height: 100dvh;\n}\n\n/* Top and bottom bars */\n\n.bottomBar,\n.topBar {\n box-sizing: border-box;\n gap: 2px;\n touch-action: manipulation;\n background-color: var(--th-theme-background);\n}\n\n.bottomBar {\n display: flex;\n justify-content: center;\n align-items: center;\n}\n\n/* Stacked UI */\n\n.main :global(.thorium_web_stackedUI) {\n position: relative;\n display: flex;\n flex-direction: column;\n flex: 1 1 0;\n height: 100vh;\n height: 100dvh;\n max-height: 100%;\n background-color: var(--th-theme-background);\n}\n\n:global(.thorium_web_stackedUI) .topBar,\n:global(.thorium_web_stackedUI) .bottomBar {\n flex: 0 0 calc(var(--th-icon-size, 24px) * 2.5);\n height: calc(var(--th-icon-size, 24px) * 2.5);\n}\n\n:global(.thorium_web_stackedUI.thorium_web_isImmersive:not(.thorium_web_isHovering)) .topBar,\n:global(.thorium_web_stackedUI.thorium_web_isImmersive:not(.thorium_web_isHovering)) .bottomBar {\n opacity: var(--th-theme-immerse);\n}\n\n/* Layered UI */\n\n.main :global(.thorium_web_layeredUI) {\n position: relative;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n height: 100vh;\n height: 100dvh;\n max-height: 100%;\n background-color: var(--th-theme-background);\n}\n\n:global(.thorium_web_layeredUI) .topBar,\n:global(.thorium_web_layeredUI) .bottomBar {\n position: absolute;\n left: 0;\n right: 0;\n height: calc(var(--th-icon-size, 24px) * 2.5);\n z-index: 2;\n box-shadow: var(--th-theme-elevate);\n overflow: hidden;\n transition-property: transform, box-shadow;\n transition-duration: 200ms;\n transition-timing-function: ease-in-out;\n transform: translateY(0);\n}\n\n:global(.thorium_web_layeredUI) .topBar {\n top: 0;\n}\n\n:global(.thorium_web_layeredUI) .bottomBar {\n bottom: 0;\n}\n\n:global(.thorium_web_layeredUI.thorium_web_isImmersive:not(.thorium_web_isHovering)) .topBar {\n transform: translateY(calc(var(--th-icon-size, 24px) * -2.5));\n box-shadow: none;\n overflow: unset;\n}\n\n:global(.thorium_web_layeredUI.thorium_web_isImmersive:not(.thorium_web_isHovering)) .bottomBar {\n transform: translateY(calc(var(--th-icon-size, 24px) * 2.5));\n box-shadow: none;\n}\n\n.barOverlay {\n position: absolute;\n left: 0;\n right: 0;\n height: calc(var(--th-icon-size, 24px) * 2.5);\n pointer-events: auto;\n opacity: 0;\n z-index: 1000;\n}\n\n.headerOverlay {\n position: absolute;\n left: 0;\n right: 0;\n height: calc(var(--th-icon-size, 24px) * 2.5);\n pointer-events: auto;\n opacity: 0;\n z-index: 1000;\n top: 0;\n}\n\n.footerOverlay {\n position: absolute;\n left: 0;\n right: 0;\n height: calc(var(--th-icon-size, 24px) * 2.5);\n pointer-events: auto;\n opacity: 0;\n z-index: 1000;\n bottom: 0;\n}\n\n/* iFrame + its container */\n\n.iframeContainer {\n contain: content;\n width: 100%;\n height: 100%;\n margin: 0 auto;\n}\n\n.iframeContainer :global(.readium-navigator-iframe) {\n width: 100%;\n height: 100%;\n border-width: 0;\n}\n\n/* FXL: Loading spinner for resources */\n@keyframes loading {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n}\n\n.iframeContainer :global(div:has(> .readium-navigator-iframe.blank))::after {\n content: \"\";\n position: absolute;\n top: 50%;\n left: 50%;\n margin-top: -30px;\n margin-left: -30px;\n width: 50px;\n height: 50px;\n border-radius: 50px;\n border: 5px solid grey;\n border-top-color: black;\n animation: loading 2s linear infinite;\n}\n\n/* Utils */\n\n.srOnly {\n clip: rect(0 0 0 0);\n clip-path: inset(50%);\n height: 1px;\n overflow: hidden;\n position: absolute;\n white-space: nowrap;\n width: 1px;\n}","\"use client\";\n\nimport { useCallback, useEffect, useState } from \"react\";\n\nimport { ThActionsDockedPref } from \"@/preferences\";\n\nimport { DockStateObject } from \"@/lib/actionsReducer\";\n\nimport { useActions } from \"@/core/Components/Actions/hooks/useActions\";\nimport { usePrevious } from \"@/core/Hooks/usePrevious\";\nimport { usePreferences } from \"@/preferences/hooks/usePreferences\";\n\nimport { useAppSelector } from \"@/lib/hooks\";\n\n// TODO: Responsive.\n// When resizing the window, all widths should be recalculated.\n// There is no guarantee that the panel group is the same size as the window,\n// so we have to rewrite this hook to observe the panel group, and push the new\n// widths to the StatefulDockingWrapper so that it can update panels.\n// Note that the StatefulDockingWrapper cannot pass PanelGroup as a ref, \n// it requires using a utility method: getPanelGroupElement(id)\n// See https://github.com/bvaughn/react-resizable-panels/tree/main/packages/react-resizable-panels#can-a-attach-a-ref-to-the-dom-elements\nexport const useResizablePanel = (panel: DockStateObject) => {\n const { preferences } = usePreferences();\n const defaultWidth = preferences.theming.layout.defaults.dockingWidth;\n const [pref, setPref] = useState<ThActionsDockedPref | null>(\n panel.actionKey ? preferences.actions.keys[panel.actionKey as keyof typeof preferences.actions.keys].docked || null : null\n );\n\n const actionsMap = useAppSelector(state => state.actions.keys);\n const actions = useActions(actionsMap);\n const previouslyCollapsed = usePrevious(panel.collapsed);\n\n const previousWidth = actions.getDockedWidth(panel.actionKey) || null;\n const width = pref?.width || defaultWidth;\n const minWidth = pref?.minWidth && pref.minWidth < width \n ? pref.minWidth \n : defaultWidth < width \n ? defaultWidth\n : width;\n const maxWidth = pref?.maxWidth && pref.maxWidth > width \n ? pref.maxWidth \n : defaultWidth > width\n ? defaultWidth\n : width;\n\n const isPopulated = () => {\n return panel.active && actions.isOpen(panel.actionKey);\n };\n\n const isCollapsed = () => {\n return panel.collapsed;\n }\n\n const forceExpand = () => {\n return !!(isPopulated() && previouslyCollapsed && !panel.collapsed);\n }\n\n const currentKey = () => {\n return panel.actionKey;\n };\n\n const isResizable = () => {\n return isPopulated() ? Math.round(width) > Math.round(minWidth) && Math.round(width) < Math.round(maxWidth) : false;\n };\n\n const hasDragIndicator = () => {\n return pref?.dragIndicator || false;\n };\n\n const getWidth = useCallback(() => {\n return previousWidth \n ? Math.round((previousWidth / window.innerWidth) * 100) \n : Math.round((width / window.innerWidth) * 100);\n }, [previousWidth, width]);\n\n const getMinWidth = useCallback(() => {\n return Math.round((minWidth / window.innerWidth) * 100);\n }, [minWidth]);\n\n const getMaxWidth = useCallback(() => {\n return Math.round((maxWidth / window.innerWidth) * 100);\n }, [maxWidth]);\n\n const getCurrentPxWidth = useCallback((percentage: number) => {\n let current = Math.round((percentage * window.innerWidth) / 100);\n \n if (current < minWidth) {\n current = minWidth;\n }\n \n if (current > maxWidth) {\n current = maxWidth;\n }\n \n return current;\n }, [minWidth, maxWidth]);\n\n // When the docked action changes, we need to update its preferences \n useEffect(() => {\n setPref(panel.actionKey ? preferences.actions.keys[panel.actionKey as keyof typeof preferences.actions.keys].docked || null : null);\n }, [panel.actionKey, preferences]);\n\n return {\n currentKey, \n isPopulated, \n isCollapsed, \n forceExpand, \n isResizable,\n hasDragIndicator, \n getWidth,\n getMinWidth,\n getMaxWidth,\n getCurrentPxWidth\n }\n}","\"use client\";\n\nimport { ReactNode, useCallback, useEffect, useRef } from \"react\";\n\nimport readerStyles from \"../assets/styles/thorium-web.reader.app.module.css\";\nimport dockingStyles from \"./assets/styles/thorium-web.docking.module.css\";\n\nimport { ImperativePanelHandle, Panel, PanelGroup, PanelResizeHandle } from \"react-resizable-panels\";\n\nimport { ThDockingTypes, ThDockingKeys, ThLayoutDirection } from \"@/preferences/models\";\nimport { ActionsStateKeys } from \"@/lib/actionsReducer\";\n\nimport { usePreferences } from \"@/preferences/hooks/usePreferences\";\nimport { useResizablePanel } from \"./hooks/useResizablePanel\";\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { useAppDispatch, useAppSelector } from \"@/lib/hooks\";\nimport { activateDockPanel, collapseDockPanel, deactivateDockPanel, expandDockPanel, setDockPanelWidth } from \"@/lib/actionsReducer\";\n\nimport { makeBreakpointsMap } from \"@/core/Helpers/breakpointsMap\";\nimport classNames from \"classnames\";\n\nexport interface DockPanelSizes {\n width: number;\n minWidth: number;\n maxWidth: number;\n getCurrentPxWidth: (percentage: number) => number;\n}\n\nconst DockHandle = ({\n flow,\n isResizable,\n isPopulated, \n hasDragIndicator\n}: { \n flow: ThDockingKeys.start | ThDockingKeys.end;\n isResizable: boolean;\n isPopulated: boolean;\n hasDragIndicator?: boolean;\n}) => {\n const handleID = `${ flow }-resize-handle`;\n\n const direction = useAppSelector(state => state.reader.direction);\n\n const classFromFlow = useCallback(() => {\n if (flow === ThDockingKeys.start) {\n return direction === ThLayoutDirection.ltr ? dockingStyles.resizeHandleGrabLeft : dockingStyles.resizeHandleGrabRight;\n } else if (flow === ThDockingKeys.end) {\n return direction === ThLayoutDirection.ltr ? dockingStyles.resizeHandleGrabRight : dockingStyles.resizeHandleGrabLeft;\n }\n }, [flow, direction]);\n\n return(\n <>\n <PanelResizeHandle \n id={ handleID } \n className={ dockingStyles.resizeHandle }\n disabled={ !isResizable }\n tabIndex={ isPopulated ? 0 : -1 }\n >\n { isResizable && hasDragIndicator && \n <div className={ classNames(dockingStyles.resizeHandleGrab, classFromFlow()) }></div> \n }\n </PanelResizeHandle>\n </>\n )\n};\n\nconst DockPanel = ({\n actionKey,\n flow,\n sizes,\n isResizable,\n isPopulated,\n isCollapsed,\n forceExpand,\n hasDragIndicator \n}: {\n actionKey: ActionsStateKeys | null;\n flow: ThDockingKeys.start | ThDockingKeys.end;\n sizes: DockPanelSizes;\n isResizable: boolean;\n isPopulated: boolean;\n isCollapsed: boolean;\n forceExpand: boolean;\n hasDragIndicator?: boolean;\n}) => {\n const { t } = useI18n();\n\n const panelRef = useRef<ImperativePanelHandle>(null);\n const direction = useAppSelector(state => state.reader.direction);\n const dispatch = useAppDispatch();\n\n const dockClassName = flow === ThDockingKeys.end && direction === ThLayoutDirection.ltr ? readerStyles.rightDock : readerStyles.leftDock;\n\n const makeDockLabel = useCallback(() => { \n let label = \"\";\n if (flow === ThDockingKeys.end && direction === ThLayoutDirection.ltr) {\n label += t(\"reader.app.docking.dockingRight\");\n } else {\n label += t(\"reader.app.docking.dockingLeft\")\n }\n\n if (actionKey) {\n if (!isPopulated) {\n label += ` – ${ t(\"reader.app.docking.dockingClosed\", { action: t(`reader.${ actionKey }.heading`) }) }`;\n } else if (isCollapsed) {\n label += ` – ${ t(\"reader.app.docking.dockingCollapsed\", { action: t(`reader.${ actionKey }.heading`) }) }`;\n }\n } else {\n label += ` – ${ t(\"reader.app.docking.dockingEmpty\") }`;\n }\n\n return label;\n }, [flow, direction, isPopulated, isCollapsed, actionKey, t]);\n\n const collapsePanel = useCallback(() => {\n if (panelRef.current) {\n panelRef.current.collapse();\n dispatch(collapseDockPanel(flow));\n }\n }, [dispatch, flow]);\n\n const expandPanel = useCallback(() => {\n if (panelRef.current) {\n panelRef.current.expand();\n dispatch(expandDockPanel(flow));\n }\n }, [dispatch, flow]);\n\n useEffect(() => {\n dispatch(activateDockPanel(flow));\n\n return () => {\n dispatch(deactivateDockPanel(flow));\n }\n }, [dispatch, flow]);\n\n useEffect(() => {\n isPopulated || forceExpand ? expandPanel() : collapsePanel();\n }, [isPopulated, forceExpand, collapsePanel, expandPanel]);\n\n return(\n <>\n { flow === ThDockingKeys.end &&\n <DockHandle \n flow={ ThDockingKeys.end } \n isResizable={ isResizable } \n isPopulated={ isPopulated }\n hasDragIndicator={ hasDragIndicator } \n /> \n } \n <Panel \n id={ `${ flow }-panel` } \n order={ flow === ThDockingKeys.end ? 3 : 1 } \n collapsible={ true }\n collapsedSize={ 0 }\n ref={ panelRef }\n defaultSize={ isPopulated ? sizes.width : 0 } \n minSize={ sizes.minWidth } \n maxSize={ sizes.maxWidth }\n onCollapse={ collapsePanel }\n onExpand={ expandPanel }\n onResize={ (size: number) => size !== 0 && dispatch(setDockPanelWidth({\n key: flow,\n width: sizes.getCurrentPxWidth(size)\n }))}\n inert={ isCollapsed } \n >\n <div \n id={ flow } \n aria-label={ makeDockLabel() }\n className={ classNames(dockingStyles.panelContainer, dockClassName) }\n ></div>\n </Panel>\n { flow === ThDockingKeys.start && \n <DockHandle \n flow={ ThDockingKeys.start } \n isResizable={ isResizable } \n isPopulated={ isPopulated } \n hasDragIndicator={ hasDragIndicator } \n /> \n } \n </>\n );\n};\n\nexport const StatefulDockingWrapper = ({ \n children\n}: { \n children: ReactNode; \n}) => {\n const { preferences } = usePreferences();\n const dockingStart = useAppSelector(state => state.actions.dock[ThDockingKeys.start]);\n const dockingEnd = useAppSelector(state => state.actions.dock[ThDockingKeys.end])\n const startPanel = useResizablePanel(dockingStart);\n const endPanel = useResizablePanel(dockingEnd);\n\n const breakpoint = useAppSelector(state => state.theming.breakpoint);\n\n if (!preferences.docking.dock) {\n return(\n <>\n { children }\n </>\n )\n } else {\n const dockingMap = makeBreakpointsMap<ThDockingTypes>({\n defaultValue: ThDockingTypes.both, \n fromEnum: ThDockingTypes, \n pref: preferences.docking.dock, \n disabledValue: ThDockingTypes.none\n });\n\n const dockConfig = breakpoint && dockingMap[breakpoint] || ThDockingTypes.both;\n\n return (\n <>\n <PanelGroup direction=\"horizontal\">\n { \n (dockConfig === ThDockingTypes.both || dockConfig === ThDockingTypes.start) \n && <DockPanel \n actionKey={ startPanel.currentKey() }\n flow={ ThDockingKeys.start } \n sizes={{\n width: startPanel.getWidth(),\n minWidth: startPanel.getMinWidth(),\n maxWidth: startPanel.getMaxWidth(),\n getCurrentPxWidth: startPanel.getCurrentPxWidth\n }} \n isResizable={ startPanel.isResizable() }\n isPopulated={ startPanel.isPopulated() }\n isCollapsed={ startPanel.isCollapsed() } \n forceExpand={ startPanel.forceExpand() }\n hasDragIndicator={ startPanel.hasDragIndicator() }\n />\n }\n \n <Panel id=\"main-panel\" order={ 2 }>\n { children }\n </Panel>\n \n { \n (dockConfig === ThDockingTypes.both || dockConfig === ThDockingTypes.end)\n && <DockPanel \n actionKey={ endPanel.currentKey() }\n flow={ ThDockingKeys.end } \n sizes={{\n width: endPanel.getWidth(),\n minWidth: endPanel.getMinWidth(),\n maxWidth: endPanel.getMaxWidth(),\n getCurrentPxWidth: endPanel.getCurrentPxWidth\n }} \n isResizable={ endPanel.isResizable() }\n isPopulated={ endPanel.isPopulated() }\n isCollapsed={ endPanel.isCollapsed() } \n forceExpand={ endPanel.forceExpand() }\n hasDragIndicator={ endPanel.hasDragIndicator() }\n />\n }\n </PanelGroup>\n </>\n )\n }\n}",".header {\n box-sizing: border-box;\n display: grid;\n grid-template-areas: \"header-start header-center header-end\";\n grid-template-columns: 1fr 3fr 1fr;\n padding: 0.25rem 0.5rem 0;\n}\n\n.backlinkWrapper {\n grid-area: header-start;\n justify-self: start;\n align-self: center;\n}\n\n.header h1 {\n font-size: 1rem;\n color: var(--th-theme-text);\n font-weight: normal;\n grid-area: header-center;\n justify-self: center;\n align-self: center;\n max-width: 100%;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis; \n transition: opacity 200ms ease-in-out;\n}\n\n.actionsWrapper {\n grid-area: header-end;\n justify-self: end;\n display: flex;\n align-items: center;\n gap: 2px;\n}",".link {\n display: block;\n box-sizing: content-box;\n padding: calc(var(--th-icon-size, 24px) * (1/4));\n text-align: start;\n border-radius: var(--th-layout-radius);\n max-width: 100%;\n height: var(--th-icon-size, 24px);\n}\n\n.link svg {\n fill: var(--th-theme-text);\n max-width: 100%;\n height: 100%;\n}\n\n.link img {\n max-width: 100%;\n height: 100%;\n}\n\n.link[data-hovered] {\n background-color: var(--th-theme-hover);\n}\n\n.link[data-focus-visible] {\n outline: 2px solid var(--th-theme-focus);\n}\n\n.link[data-disabled] {\n color: var(--th-theme-disable)\n}\n\n.link[data-disabled] svg {\n fill: var(--th-theme-disable);\n}","\"use client\";\n\nimport React from \"react\";\n\nimport backLinkStyles from \"./assets/styles/thorium-web.backlink.module.css\";\nimport readerSharedUI from \"./assets/styles/thorium-web.button.module.css\";\n\nimport { ThBackLinkVariant, ThLayoutDirection } from \"@/preferences/models\";\n\nimport { ThBackArrow } from \"@/core/Components/Links\";\nimport { ThHome } from \"@/core/Components/Links\";\nimport { ThLibrary } from \"@/core/Components/Links\";\nimport { ThLink } from \"@/core/Components/Links\";\n\nimport { useI18n } from \"@/i18n\";\nimport { usePreferences } from \"@/preferences/hooks/usePreferences\";\n\nimport { useAppSelector } from \"@/lib/hooks\";\n\nimport classNames from \"classnames\";\n\nexport const StatefulBackLink = ({ \n className \n}: { \n className?: string \n}) => {\n const { t } = useI18n();\n const { preferences } = usePreferences();\n const direction = useAppSelector(state => state.reader.direction);\n const isRTL = direction === ThLayoutDirection.rtl;\n \n const variant = preferences.theming.header?.backLink?.variant || ThBackLinkVariant.arrow;\n const href = preferences.theming.header?.backLink?.href;\n const content = preferences.theming.header?.backLink?.content;\n const visibility = preferences.theming.header?.backLink?.visibility || \"partially\";\n const backLinkClassName = classNames(backLinkStyles.link, visibility === \"always\" ? readerSharedUI.alwaysVisible : readerSharedUI.partiallyVisible);\n\n const compounds = {\n tooltipTrigger: {\n delay: preferences.theming.arrow.tooltipDelay,\n closeDelay: preferences.theming.arrow.tooltipDelay\n },\n tooltip: {\n className: readerSharedUI.tooltip\n },\n label: t(\"reader.app.header.backLink.tooltip\")\n };\n\n if (!href) return null;\n\n switch (variant) {\n case ThBackLinkVariant.arrow:\n return (\n <div className={ className }>\n <ThBackArrow \n className={ backLinkClassName } \n href={ href } \n direction={ isRTL ? \"right\" : \"left\" }\n aria-label={ t(\"reader.app.header.backLink.trigger\") }\n compounds={ compounds }\n />\n </div>\n );\n\n case ThBackLinkVariant.home:\n return (\n <div className={ className }>\n <ThHome \n className={ backLinkClassName } \n href={ href } \n aria-label={ t(\"reader.app.header.backLink.trigger\") }\n compounds={ compounds }\n />\n </div>\n );\n\n case ThBackLinkVariant.library:\n return (\n <div className={ className }>\n <ThLibrary \n className={ backLinkClassName } \n href={ href } \n aria-label={ t(\"reader.app.header.backLink.trigger\") }\n compounds={ compounds }\n />\n </div>\n );\n\n default:\n if (!content) return null;\n \n let contentNode: React.ReactNode = null;\n \n switch (content.type) {\n case \"img\":\n contentNode = <img alt={ content.alt ?? \"\" } src={ content.src } />;\n break;\n \n case \"svg\":\n // Parse the SVG string\n const parser = new DOMParser();\n const doc = parser.parseFromString(content.content, \"image/svg+xml\");\n const svgElement = doc.documentElement;\n \n // Extract all attributes\n const attributes: Record<string, string> = {};\n for (const { name, value } of Array.from(svgElement.attributes)) {\n attributes[name] = value;\n }\n \n // Create the SVG element with all its original attributes\n contentNode = React.createElement(\"svg\", {\n ...attributes,\n \"aria-hidden\": \"true\",\n focusable: \"false\",\n xmlns: \"http://www.w3.org/2000/svg\",\n dangerouslySetInnerHTML: { \n __html: svgElement.innerHTML \n }\n });\n break;\n }\n \n return (\n <div className={ className }>\n <ThLink \n className={ backLinkClassName } \n href={ href } \n aria-label={ t(\"reader.app.header.backLink.trigger\") }\n compounds={ compounds }\n >\n { contentNode }\n </ThLink>\n </div>\n );\n }\n}","\"use client\";\n\nimport { useMemo } from \"react\";\n\nimport { ThRunningHeadFormat } from \"@/preferences/models\";\nimport { ThFormatPref, ThFormatPrefValue } from \"@/preferences\";\n\nimport { ThRunningHead } from \"@/core/Components\";\n\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { useAppSelector } from \"@/lib/hooks\";\nimport { makeBreakpointsMap } from \"@/core/Helpers/breakpointsMap\";\n\nexport const StatefulReaderRunningHead = ({ \n formatPref\n}: {\n formatPref?: ThFormatPref<ThRunningHeadFormat>;\n}) => {\n const { t } = useI18n();\n \n const unstableTimeline = useAppSelector(state => state.publication.unstableTimeline);\n const isImmersive = useAppSelector(state => state.reader.isImmersive);\n const isHovering = useAppSelector(state => state.reader.isHovering);\n const isFullscreen = useAppSelector(state => state.reader.isFullscreen);\n const breakpoint = useAppSelector(state => state.theming.breakpoint);\n\n // Get the fallback format based on isFXL\n const fallbackFormat = useMemo<ThFormatPrefValue<ThRunningHeadFormat>>(() => ({\n variants: ThRunningHeadFormat.title,\n displayInImmersive: true,\n displayInFullscreen: true\n }), []);\n\n const breakpointsMap = useMemo(() => {\n return makeBreakpointsMap<ThFormatPrefValue<ThRunningHeadFormat>>({\n defaultValue: formatPref?.default || fallbackFormat,\n fromEnum: ThRunningHeadFormat,\n pref: formatPref?.breakpoints,\n validateKey: \"variants\"\n });\n }, [formatPref, fallbackFormat]);\n \n // Get current preferences with proper fallback\n const currentPrefs = useMemo(() => {\n if (!breakpoint) return formatPref?.default || fallbackFormat;\n return breakpointsMap[breakpoint] || formatPref?.default || fallbackFormat;\n }, [breakpoint, breakpointsMap, formatPref?.default, fallbackFormat]);\n\n const { variants, displayInImmersive, displayInFullscreen } = currentPrefs;\n\n const displayFormat = useMemo(() => {\n if (!variants) return ThRunningHeadFormat.title;\n \n // Check if we should hide in immersive mode\n if (isImmersive && displayInImmersive === false && !isHovering) {\n return ThRunningHeadFormat.none;\n }\n \n // Check if we should hide in fullscreen mode\n if (isImmersive && isFullscreen && displayInFullscreen === false && !isHovering) {\n return ThRunningHeadFormat.none;\n }\n \n return variants;\n }, [variants, isImmersive, displayInImmersive, isHovering, isFullscreen, displayInFullscreen]);\n\n const runningHead = useMemo(() => {\n if (displayFormat === ThRunningHeadFormat.title) {\n return unstableTimeline?.title || \"\";\n } else if (displayFormat === ThRunningHeadFormat.chapter) {\n return unstableTimeline?.progression?.currentChapter || unstableTimeline?.title || \"\";\n }\n return \"\";\n }, [displayFormat, unstableTimeline]);\n\n if (!runningHead || displayFormat === ThRunningHeadFormat.none) return null;\n \n return (\n <>\n <ThRunningHead \n label={ runningHead } \n aria-label={ t(\"reader.app.header.runningHead\") }\n />\n </>\n );\n}","\"use client\";\n\nimport React, { useCallback, useEffect, useRef } from \"react\";\n\nimport { ActionKeyType } from \"@/preferences\";\nimport { ThLayoutUI, ThRunningHeadFormat, ThActionsKeys } from \"@/preferences/models\";\nimport { ThFormatPref } from \"@/preferences\";\n\nimport readerStyles from \"./assets/styles/thorium-web.reader.app.module.css\";\nimport readerHeaderStyles from \"./assets/styles/thorium-web.reader.header.module.css\";\nimport overflowMenuStyles from \"./Actions/assets/styles/thorium-web.overflow.module.css\";\n\nimport { ThActionEntry } from \"@/core/Components/Actions/ThActionsBar\";\nimport { ThHeader } from \"@/core/Components/Reader/ThHeader\";\nimport { StatefulBackLink } from \"./StatefulBackLink\";\nimport { StatefulReaderRunningHead } from \"./StatefulReaderRunningHead\";\nimport { ThInteractiveOverlay } from \"../core/Components/Reader/ThInteractiveOverlay\";\nimport { StatefulCollapsibleActionsBar } from \"./Actions/StatefulCollapsibleActionsBar\";\n\nimport { useI18n } from \"@/i18n/useI18n\";\nimport { usePlugins } from \"./Plugins/PluginProvider\";\nimport { usePreferences } from \"@/preferences/hooks\";\nimport { useActions } from \"@/core/Components\";\nimport { useFocusWithin } from \"react-aria\";\n\nimport { setHovering } from \"@/lib/readerReducer\";\nimport { useAppDispatch, useAppSelector } from \"@/lib/hooks\";\n\nimport classNames from \"classnames\";\nimport { isPositionsListValid } from \"./Actions/JumpToPosition/helpers/utils\";\nimport { isIOSish } from \"@/core/Helpers/getPlatform\";\n\nexport const StatefulReaderHeader = ({\n actionKeys,\n actionsOrder, \n layout,\n runningHeadFormatPref\n}: {\n actionKeys: ActionKeyType[];\n actionsOrder: ActionKeyType[];\n layout: ThLayoutUI;\n runningHeadFormatPref?: ThFormatPref<ThRunningHeadFormat>;\n}) => {\n const headerRef = useRef<HTMLDivElement>(null);\n const { preferences } = usePreferences();\n const { t } = useI18n();\n const { actionsComponentsMap } = usePlugins();\n \n const actionsMap = useAppSelector(state => state.actions.keys);\n const overflowMap = useAppSelector(state => state.actions.overflow);\n const isScroll = useAppSelector(state => state.settings.scroll);\n const isImmersive = useAppSelector(state => state.reader.isImmersive);\n const isHovering = useAppSelector(state => state.reader.isHovering);\n const hasScrollAffordance = useAppSelector(state => state.reader.hasScrollAffordance);\n const positionsList = useAppSelector(state => state.publication.positionsList);\n\n const actions = useActions({ ...actionsMap, ...overflowMap });\n const dispatch = useAppDispatch();\n\n const { focusWithinProps } = useFocusWithin({\n onFocusWithin() {\n dispatch(setHovering(true));\n },\n onBlurWithin() { \n if (actions.everyOpenDocked()) {\n dispatch(setHovering(false));\n }\n }\n });\n\n const setHover = () => {\n if (!hasScrollAffordance && actions.everyOpenDocked()) {\n dispatch(setHovering(true));\n }\n };\n\n const removeHover = () => {\n if (!hasScrollAffordance && actions.everyOpenDocked()) {\n dispatch(setHovering(false));\n }\n };\n\n const listActionItems = useCallback(() => {\n const actionsItems: ThActionEntry<ActionKeyType>[] = [];\n\n if (actionsComponentsMap && Object.keys(actionsComponentsMap).length > 0) {\n actionKeys.forEach((key) => { \n if (actionsComponentsMap[key]) {\n actionsItems.push({\n Trigger: actionsComponentsMap[key].Trigger,\n Target: actionsComponentsMap[key].Target,\n key: key\n });\n } else {\n console.warn(`Action key \"${ key }\" not found in the plugin registry while present in preferences.`);\n }\n });\n }\n \n return actionsItems.filter(item => {\n if (item.key === ThActionsKeys.jumpToPosition) {\n return isPositionsListValid(positionsList);\n }\n if (item.key === ThActionsKeys.fullscreen) {\n return document.fullscreenEnabled && !isIOSish();\n }\n return true;\n });\n }, [actionKeys, actionsComponentsMap, positionsList]);\n\n useEffect(() => {\n // Blur any focused element when entering immersive mode\n if (isImmersive) {\n const focusElement = document.activeElement;\n if (focusElement && headerRef.current?.contains(focusElement)) {\n (focusElement as HTMLElement).blur();\n }\n }\n }, [isImmersive]);\n\n return (\n <>\n <ThInteractiveOverlay \n className={ classNames(readerStyles.barOverlay, readerStyles.headerOverlay) }\n isActive={ layout === ThLayoutUI.layered && isImmersive && !isHovering }\n onMouseEnter={ setHover }\n onMouseLeave={ removeHover }\n />\n\n <ThHeader \n ref={ headerRef }\n className={ classNames(readerStyles.topBar, readerHeaderStyles.header) } \n aria-label={ t(\"reader.app.header.label\") } \n onMouseEnter={ setHover } \n onMouseLeave={ removeHover }\n { ...focusWithinProps }\n >\n { preferences.theming.header?.backLink && <StatefulBackLink className={ readerHeaderStyles.backlinkWrapper } /> }\n \n <StatefulReaderRunningHead formatPref={ runningHeadFormatPref } />\n \n <StatefulCollapsibleActionsBar \n id=\"reader-header-overflowMenu\" \n items={ listActionItems() }\n prefs={{ \n ...preferences.actions, \n displayOrder: actionsOrder \n }}\n className={ readerHeaderStyles.actionsWrapper } \n aria-label={ t(\"reader.app.header.actions\") } \n overflowMenuClassName={ \n (!isScroll || preferences.affordances.scroll.hintInImmersive) \n ? overflowMenuStyles.hint \n : undefined \n }\n />\n </ThHeader>\n </>\n );\n}",".wrapper {\n box-sizing: border-box;\n display: grid;\n gap: calc(var(--th-layout-spacing) / 2);\n grid-template-areas: \"pagination-start pagination-center pagination-end\";\n grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);\n background-color: var(--th-theme-background);\n color: var(--th-theme-text);\n align-items: center;\n width: 100%;\n max-width: var(--th-layout-constraints-pagination, 100%);\n}\n\n.listItem {\n box-sizing: border-box;\n list-style: none;\n}\n\n.listItem:has(.previousButton) {\n grid-area: pagination-start;\n justify-self: start;\n}\n\n.listItem:has(.progression) {\n grid-area: pagination-center;\n justify-self: center;\n}\n\n.listItem:has(.nextButton) {\n grid-area: pagination-end;\n justify-self: end;\n}\n\n.listItem button {\n box-sizing: border-box;\n padding: calc(var(--th-icon-size, 24px) * (1/4)) calc(var(--th-layout-spacing) / 2);\n gap: calc(var(--th-layout-spacing) / 2);\n max-height: calc(var(--th-icon-size, 24px) * 2);\n max-width: 100%;\n border-radius: var(--th-layout-radius);\n display: flex;\n align-items: center;\n}\n\n.nextButton {\n margin-inline-start: auto;\n text-align: end;\n}\n\n.listItem button[data-hovered] {\n background-color: var(--th-theme-hover);\n}\n\n.listItem button[data-focus-visible] {\n outline: 2px solid var(--th-theme-focus);\n}\n\n.listItem button[data-disabled] {\n color: var(--th-theme-disable);\n}\n\n.listItem button .label {\n display: -webkit-box;\n -webkit-box-orient: vertical;\n overflow: hidden;\n white-space: normal;\n -webkit-line-clamp: 1;\n line-clamp: 1;\n}\n\n.listItem button svg {\n flex: none;\n width: var(--th-icon-size, 24px);\n height: var(--th-icon-size, 24px);\n fill: var(--th-theme-text);\n}",".wrapper {\n color: var(--th-theme-text);\n font-variant-numeric: lining-nums tabular-nums;\n text-align: center;\n}","\"use client\";\n\nimport React, { useEffect, useState, useMemo } from \"react\";\n\nimport progressionStyles from \"./assets/styles/thorium-web.reader.progression.module.css\";\n\nimport { ThProgressionFormat } from \"@/preferences/models\";\nimport { ThFormatPref, ThFormatPrefValue } from \"@/preferences\";\n\nimport { ThProgression } from \"@/core/Components/Reader/ThProgression\";\n\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { useAppSelector } from \"@/lib/hooks\";\n\nimport { makeBreakpointsMap } from \"@/core/Helpers/breakpointsMap\";\nimport { getBestMatchingProgressionFormat } from \"@/core/Helpers/progressionFormat\";\n\nimport classNames from \"classnames\";\n\nexport const StatefulReaderProgression = ({ \n className,\n formatPref,\n fallbackVariant\n}: { \n className?: string,\n formatPref?: ThFormatPref<ThProgressionFormat | ThProgressionFormat[]>,\n fallbackVariant: ThProgressionFormat | Array<ThProgressionFormat>\n}) => {\n const { t } = useI18n();\n \n const unstableTimeline = useAppSelector(state => state.publication.unstableTimeline);\n const isImmersive = useAppSelector(state => state.reader.isImmersive);\n const isFullscreen = useAppSelector(state => state.reader.isFullscreen);\n const isHovering = useAppSelector(state => state.reader.isHovering);\n const breakpoint = useAppSelector(state => state.theming.breakpoint);\n\n const [displayText, setDisplayText] = useState(\"\");\n \n const fallbackFormat = useMemo(() => {\n return {\n variants: fallbackVariant,\n displayInImmersive: true,\n displayInFullscreen: true\n };\n }, [fallbackVariant]);\n \n const breakpointsMap = useMemo(() => {\n return makeBreakpointsMap<ThFormatPrefValue<ThProgressionFormat | ThProgressionFormat[]>>({\n defaultValue: formatPref?.default || fallbackFormat,\n fromEnum: ThProgressionFormat,\n pref: formatPref?.breakpoints,\n validateKey: \"variants\"\n });\n }, [formatPref, fallbackFormat]);\n \n // Get current preferences with proper fallback\n const currentPrefs = useMemo(() => {\n if (!breakpoint) return formatPref?.default || fallbackFormat;\n return breakpointsMap[breakpoint] || formatPref?.default || fallbackFormat;\n }, [breakpoint, breakpointsMap, formatPref?.default, fallbackFormat]);\n\n const { variants, displayInImmersive, displayInFullscreen } = currentPrefs;\n \n // Get the display format, handling both single format and array of formats\n const displayFormat = useMemo(() => {\n if (!variants) return fallbackFormat.variants;\n \n // Check if we should hide in immersive mode\n if (isImmersive && displayInImmersive === false && !isHovering) {\n return ThProgressionFormat.none;\n }\n \n // Check if we should hide in fullscreen mode\n if (isImmersive && isFullscreen && displayInFullscreen === false && !isHovering) {\n return ThProgressionFormat.none;\n }\n \n if (Array.isArray(variants)) {\n return getBestMatchingProgressionFormat(variants, unstableTimeline?.progression) || \n fallbackFormat.variants;\n }\n \n return variants;\n }, [variants, unstableTimeline?.progression, fallbackFormat, isImmersive, isHovering, isFullscreen, displayInImmersive, displayInFullscreen]);\n\n // Update display text based on current position and timeline\n useEffect(() => {\n if (displayFormat === ThProgressionFormat.none || !unstableTimeline?.progression) {\n setDisplayText(\"\");\n return;\n }\n\n const { \n currentPositions = [],\n totalPositions,\n relativeProgression,\n totalProgression,\n currentChapter,\n positionsLeft,\n totalItems,\n currentIndex\n } = unstableTimeline.progression;\n \n let text = \"\";\n \n // Format positions for display (handle array of two positions with a dash)\n const formatPositions = (positions: number[]) => {\n if (positions.length === 2) {\n return positions.join(\"–\");\n }\n return positions[0]?.toString() || \"\";\n };\n \n switch (displayFormat) {\n case ThProgressionFormat.positions:\n if (currentPositions.length > 0) {\n text = formatPositions(currentPositions);\n }\n break;\n \n case ThProgressionFormat.positionsOfTotal:\n if (currentPositions.length > 0 && totalPositions) {\n text = t(\"reader.progression.xOfY.compact\", { \n x: formatPositions(currentPositions),\n y: totalPositions\n });\n }\n break;\n\n case ThProgressionFormat.positionsPercentOfTotal:\n if (currentPositions.length > 0 && totalPositions) {\n const percentage = Math.round((totalProgression || 0) * 100);\n text = t(\"reader.progression.xOfY.descriptive\", { \n x: formatPositions(currentPositions),\n y: totalPositions,\n z: `${ percentage }%`\n });\n }\n break;\n \n case ThProgressionFormat.positionsLeft:\n if (positionsLeft !== undefined) {\n text = t(`reader.progression.positionsLeftInChapter.descriptive`, { \n count: positionsLeft\n });\n }\n break;\n \n case ThProgressionFormat.overallProgression:\n if (totalProgression !== undefined) {\n const percentage = Math.round(totalProgression * 100);\n text = `${ percentage }%`;\n }\n break;\n \n case ThProgressionFormat.resourceProgression:\n if (relativeProgression !== undefined) {\n const percentage = Math.round(relativeProgression * 100);\n text = `${ percentage }%`;\n }\n break;\n \n case ThProgressionFormat.progressionOfResource:\n if (relativeProgression !== undefined) {\n const percentage = Math.round(relativeProgression * 100);\n text = t(\"reader.progression.xOfY.compact\", {\n x: `${ percentage }%`,\n y: currentChapter || t(\"reader.app.progression.referenceFallback\")\n });\n }\n break;\n\n case ThProgressionFormat.readingOrderIndex:\n if (currentIndex !== undefined && totalItems !== undefined) {\n text = t(\"reader.progression.xOfY.compact\", {\n x: currentIndex,\n y: totalItems\n });\n }\n break;\n }\n \n setDisplayText(text);\n }, [displayFormat, unstableTimeline?.progression, t]);\n\n if (!displayText || displayFormat === ThProgressionFormat.none) {\n return null;\n }\n\n return (\n <ThProgression \n id=\"current-progression\" \n className={ classNames(progressionStyles.wrapper, className) }\n aria-label={ t(\"reader.app.progression.wrapper\") }\n >\n { displayText }\n </ThProgression>\n );\n};","\"use client\";\n\nimport { useRef, KeyboardEvent } from \"react\";\n\nimport { ThPagination, ThPaginationProps } from \"@/core/Components/Reader/ThPagination\";\n\nimport readerPaginationStyles from \"./assets/styles/thorium-web.reader.pagination.module.css\";\n \nexport const StatefulReaderPagination = ({\n ref,\n links,\n compounds,\n children,\n ...props\n}: ThPaginationProps) => {\n const previousButtonRef = useRef<HTMLButtonElement>(null);\n const nextButtonRef = useRef<HTMLButtonElement>(null);\n\n const updatedCompounds = {\n ...compounds,\n previousButton: {\n ...compounds?.previousButton,\n ref: previousButtonRef,\n onKeyDown: (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n previousButtonRef.current?.blur();\n }\n }\n },\n nextButton: {\n ...compounds?.nextButton,\n ref: nextButtonRef,\n onKeyDown: (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n nextButtonRef.current?.blur();\n }\n }\n }\n };\n\n return (\n <ThPagination \n ref={ ref } \n className={ readerPaginationStyles.wrapper }\n links={ links } \n compounds={ updatedCompounds } \n { ...props }\n >\n { children }\n </ThPagination>\n )\n}","\"use client\";\n\nimport React, { useCallback, useEffect, useRef } from \"react\";\n\nimport readerStyles from \"./assets/styles/thorium-web.reader.app.module.css\";\nimport readerPaginationStyles from \"./assets/styles/thorium-web.reader.pagination.module.css\";\n\nimport { ThBreakpoints, ThLayoutUI, ThFormatPref, ThProgressionFormat } from \"@/preferences/models\";\n\nimport { ThFooter } from \"@/core/Components/Reader/ThFooter\";\nimport { StatefulReaderProgression } from \"./StatefulReaderProgression\";\nimport { ThInteractiveOverlay } from \"../core/Components/Reader/ThInteractiveOverlay\";\nimport { StatefulReaderPagination } from \"./StatefulReaderPagination\";\nimport { ThPaginationLinkProps } from \"@/core/Components/Reader/ThPagination\";\n\nimport { useNavigator } from \"@/core/Navigator\";\nimport { useFocusWithin } from \"react-aria\";\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { setHovering } from \"@/lib/readerReducer\";\nimport { useAppDispatch, useAppSelector } from \"@/lib/hooks\";\n\nimport classNames from \"classnames\";\n\nexport const StatefulReaderFooter = ({\n layout,\n progressionFormatPref,\n progressionFormatFallback\n}: {\n layout: ThLayoutUI;\n progressionFormatPref?: ThFormatPref<ThProgressionFormat | ThProgressionFormat[]>;\n progressionFormatFallback: ThProgressionFormat | ThProgressionFormat[];\n}) => {\n const { t } = useI18n();\n const footerRef = useRef<HTMLDivElement>(null);\n const readerProfile = useAppSelector(state => state.reader.profile);\n const isImmersive = useAppSelector(state => state.reader.isImmersive);\n const isHovering = useAppSelector(state => state.reader.isHovering);\n const hasScrollAffordance = useAppSelector(state => state.reader.hasScrollAffordance);\n const scroll = useAppSelector(state => state.settings.scroll);\n const isFXL = useAppSelector(state => state.publication.isFXL);\n const isScroll = scroll && !isFXL;\n const breakpoint = useAppSelector(state => state.theming.breakpoint);\n const reducedMotion = useAppSelector(state => state.theming.prefersReducedMotion);\n const timeline = useAppSelector(state => state.publication.unstableTimeline);\n\n const dispatch = useAppDispatch();\n\n const { focusWithinProps } = useFocusWithin({\n onFocusWithin() {\n dispatch(setHovering(true));\n },\n onBlurWithin() {\n dispatch(setHovering(false));\n }\n });\n\n const setHover = () => {\n if (!hasScrollAffordance) {\n dispatch(setHovering(true));\n }\n };\n\n const removeHover = () => {\n if (!hasScrollAffordance) {\n dispatch(setHovering(false));\n }\n };\n\n const { previousLocator, nextLocator, go } = useNavigator();\n\n const updateLinks = useCallback(() => {\n const links: { previous?: ThPaginationLinkProps; next?: ThPaginationLinkProps } = {\n previous: undefined,\n next: undefined\n };\n\n const previous = previousLocator();\n const next = nextLocator();\n\n if (previous) {\n links.previous = {\n node: breakpoint !== ThBreakpoints.compact && breakpoint !== ThBreakpoints.medium ? (\n <>\n <span className={ readerStyles.srOnly }>{ t(isFXL ? \"reader.actions.goToPreviousPage.descriptive\" : \"reader.actions.goToPreviousChapter.descriptive\") }</span>\n <span className={ readerPaginationStyles.label }>{ timeline?.previousItem?.title || previous.title || t(isFXL ? \"reader.actions.goToPreviousPage.compact\" : \"reader.actions.goToPreviousChapter.compact\") }</span>\n </>\n ) : (\n <>\n <span className={ readerPaginationStyles.label }>{ t(isFXL ? \"reader.actions.goToPreviousPage.compact\" : \"reader.actions.goToPreviousChapter.compact\") }</span>\n </>\n ),\n onPress: () => go(previous, !reducedMotion, () => {})\n }\n }\n\n if (next) {\n links.next = {\n node: breakpoint !== ThBreakpoints.compact && breakpoint !== ThBreakpoints.medium ? (\n <>\n <span className={ readerStyles.srOnly }>{ t(isFXL ? \"reader.actions.goToNextPage.descriptive\" : \"reader.actions.goToNextChapter.descriptive\") }</span>\n <span className={ readerPaginationStyles.label }>{ timeline?.nextItem?.title || next.title || t(isFXL ? \"reader.actions.goToNextPage.compact\" : \"reader.actions.goToNextChapter.compact\") }</span>\n </>\n ) : ( \n <>\n <span className={ readerPaginationStyles.label }>{ t(isFXL ? \"reader.actions.goToNextPage.compact\" : \"reader.actions.goToNextChapter.compact\") }</span>\n </>\n ),\n onPress: () => go(next, !reducedMotion, () => {})\n }\n }\n\n return links;\n }, [go, previousLocator, nextLocator, t, timeline, breakpoint, reducedMotion, isFXL]);\n\n useEffect(() => {\n updateLinks();\n }, [timeline, updateLinks]);\n\n useEffect(() => {\n // Blur any focused element when entering immersive mode\n if (isImmersive) {\n const focusElement = document.activeElement;\n if (focusElement && footerRef.current?.contains(focusElement)) {\n (focusElement as HTMLElement).blur();\n }\n }\n }, [isImmersive]);\n\n return(\n <>\n <ThInteractiveOverlay \n className={ classNames(readerStyles.barOverlay, readerStyles.footerOverlay) }\n isActive={ layout === ThLayoutUI.layered && isImmersive && !isHovering }\n onMouseEnter={ setHover }\n onMouseLeave={ removeHover }\n />\n \n <ThFooter \n ref={ footerRef }\n className={ readerStyles.bottomBar }\n aria-label={ t(\"reader.app.footer.label\") } \n onMouseEnter={ setHover } \n onMouseLeave={ removeHover }\n { ...focusWithinProps }\n >\n { (isScroll || readerProfile === \"webPub\")\n ? <StatefulReaderPagination \n aria-label={ t(\"reader.navigation.scroll.wrapper\") }\n links={ updateLinks() } \n compounds={ {\n listItem: {\n className: readerPaginationStyles.listItem\n },\n previousButton: {\n className: readerPaginationStyles.previousButton,\n preventFocusOnPress: true\n },\n nextButton: {\n className: readerPaginationStyles.nextButton,\n preventFocusOnPress: true\n }\n } } \n >\n <StatefulReaderProgression \n className={ readerPaginationStyles.progression } \n formatPref={ progressionFormatPref }\n fallbackVariant={ progressionFormatFallback }\n />\n </StatefulReaderPagination> \n : <StatefulReaderProgression \n formatPref={ progressionFormatPref }\n fallbackVariant={ progressionFormatFallback }\n /> }\n </ThFooter>\n </>\n )\n}","export const getAndroidPatchCss = () => {\n if (typeof window === \"undefined\") {\n return \"\";\n }\n \n const origin = window.location.origin;\n \n return `/* Readium CSS\n Android Fonts Patch module\n\n A stylesheet aligning Android generic serif and sans-serif fonts on other platforms\n\n Repo: https://github.com/readium/css */\n\n/* Android resolves sans-serif to Roboto, and serif to Droid Serif \n This created issues for FXL EPUBs relying on Times (New Roman),\n Helvetica or Arial while not embedding the font files in the package.\n\n See https://github.com/readium/css/issues/149\n\n Unfortunately it is no possible to target generic family using @font-face,\n we have to target specific font-family names e.g. Times, Arial, etc.\n\n This stylesheet/patch should be loaded only for this case i.e.\n a Fixed-Layout EPUB with text but no embedded font on an Android device.\n The logic for checking these conditions are up to implementers.\n*/\n\n/* Serif (Times + Times New Roman) */\n\n@font-face {\n font-family: Times;\n src: url(\"${ new URL(\"/fonts/AndroidPatch/serif/NimbusRoman.woff\", origin).toString() }\") format(\"woff\");\n font-weight: normal;\n font-style: normal;\n}\n\n@font-face {\n font-family: \"Times New Roman\";\n src: url(\"${ new URL(\"/fonts/AndroidPatch/serif/NimbusRoman.woff\", origin).toString() }\") format(\"woff\");\n font-weight: normal;\n font-style: normal;\n}\n\n@font-face {\n font-family: Times;\n src: url(\"${ new URL(\"/fonts/AndroidPatch/serif/NimbusRoman-Italic.woff\", origin).toString() }\") format(\"woff\");\n font-weight: normal;\n font-style: italic;\n}\n\n@font-face {\n font-family: \"Times New Roman\";\n src: url(\"${ new URL(\"/fonts/AndroidPatch/serif/NimbusRoman-Italic.woff\", origin).toString() }\") format(\"woff\");\n font-weight: normal;\n font-style: italic;\n}\n\n@font-face {\n font-family: Times;\n src: url(\"${ new URL(\"/fonts/AndroidPatch/serif/NimbusRoman-Bold.woff\", origin).toString() }\") format(\"woff\");\n font-weight: bold;\n font-style: normal;\n}\n\n@font-face {\n font-family: \"Times New Roman\";\n src: url(\"${ new URL(\"/fonts/AndroidPatch/serif/NimbusRoman-Bold.woff\", origin).toString() }\") format(\"woff\");\n font-weight: bold;\n font-style: normal;\n}\n\n@font-face {\n font-family: Times;\n src: url(\"${ new URL(\"/fonts/AndroidPatch/serif/NimbusRoman-BoldItalic.woff\", origin).toString() }\") format(\"woff\");\n font-weight: bold;\n font-style: italic;\n}\n\n@font-face {\n font-family: \"Times New Roman\";\n src: url(\"${ new URL(\"/fonts/AndroidPatch/serif/NimbusRoman-BoldItalic.woff\", origin).toString() }\") format(\"woff\");\n font-weight: bold;\n font-style: italic;\n}\n\n/* Sans-serif (Helvetica + Arial) */\n\n@font-face {\n font-family: Helvetica;\n src: url(\"${ new URL(\"/fonts/AndroidPatch/sans-serif/NimbusSans.woff\", origin).toString() }\") format(\"woff\");\n font-weight: normal;\n font-style: normal;\n}\n\n@font-face {\n font-family: Arial;\n src: url(\"${ new URL(\"/fonts/AndroidPatch/sans-serif/NimbusSans.woff\", origin).toString() }\") format(\"woff\");\n font-weight: normal;\n font-style: normal;\n}\n\n@font-face {\n font-family: Helvetica;\n src: url(\"${ new URL(\"/fonts/AndroidPatch/sans-serif/NimbusSans-Italic.woff\", origin).toString() }\") format(\"woff\");\n font-weight: normal;\n font-style: italic;\n}\n\n@font-face {\n font-family: Arial;\n src: url(\"${ new URL(\"/fonts/AndroidPatch/sans-serif/NimbusSans-Italic.woff\", origin).toString() }\") format(\"woff\");\n font-weight: normal;\n font-style: italic;\n}\n\n@font-face {\n font-family: Helvetica;\n src: url(\"${ new URL(\"/fonts/AndroidPatch/sans-serif/NimbusSans-Bold.woff\", origin).toString() }\") format(\"woff\");\n font-weight: bold;\n font-style: normal;\n}\n\n@font-face {\n font-family: Arial;\n src: url(\"${ new URL(\"/fonts/AndroidPatch/sans-serif/NimbusSans-Bold.woff\", origin).toString() }\") format(\"woff\");\n font-weight: bold;\n font-style: normal;\n}\n\n@font-face {\n font-family: Helvetica;\n src: url(\"${ new URL(\"/fonts/AndroidPatch/sans-serif/NimbusSans-BoldItalic.woff\", origin).toString() }\") format(\"woff\");\n font-weight: bold;\n font-style: italic;\n}\n\n@font-face {\n font-family: Arial;\n src: url(\"${ new URL(\"/fonts/AndroidPatch/sans-serif/NimbusSans-BoldItalic.woff\", origin).toString() }\") format(\"woff\");\n font-weight: bold;\n font-style: italic;\n}`;\n};\n","\"use client\";\n\nimport { useCallback, useEffect, useRef } from \"react\";\n\nimport { InjectableFontResources } from \"@/preferences/services/fonts\";\nimport { ILinkInjectable, IUrlInjectable, IBlobInjectable } from \"@readium/navigator\";\n\nimport { getPlatform } from \"@/core/Helpers/getPlatform\";\nimport { getAndroidPatchCss } from \"./androidPatchCss\";\n\ntype FontResource = (ILinkInjectable & IUrlInjectable) | (ILinkInjectable & IBlobInjectable);\n\nexport const useFonts = (fontResources?: InjectableFontResources | null) => {\n const injectedElementsRef = useRef<{\n prepend: HTMLElement[];\n append: HTMLElement[];\n }>({\n prepend: [],\n append: []\n });\n\n const createLinkElement = useCallback((resource: FontResource): HTMLLinkElement => {\n const link = document.createElement(\"link\");\n \n // Set all custom attributes first to make sure they are\n // overridden by the core attributes\n if (\"attributes\" in resource && resource.attributes) {\n Object.entries(resource.attributes).forEach(([key, value]) => {\n link.setAttribute(key, value as string);\n });\n }\n \n link.rel = resource.rel;\n link.as = resource.as;\n \n if (\"url\" in resource) {\n link.href = resource.url;\n } else if (\"blob\" in resource && resource.blob) {\n link.href = URL.createObjectURL(resource.blob);\n }\n \n return link;\n }, []);\n\n const removeInjectedElements = useCallback(() => {\n const { prepend, append } = injectedElementsRef.current;\n \n [...prepend, ...append].forEach(element => {\n if (element.parentNode) {\n element.parentNode.removeChild(element);\n }\n // Revoke blob URLs to prevent memory leaks\n if (element instanceof HTMLLinkElement && element.href.startsWith(\"blob:\")) {\n URL.revokeObjectURL(element.href);\n }\n });\n \n injectedElementsRef.current = {\n prepend: [],\n append: []\n };\n }, []);\n\n const injectFontResources = useCallback((resources: InjectableFontResources | null) => {\n if (typeof document === \"undefined\") return;\n \n removeInjectedElements();\n \n if (!resources) return;\n \n const { prepend, append } = resources;\n const injectedElements = injectedElementsRef.current;\n \n prepend.forEach(resource => {\n const element = createLinkElement(resource);\n document.head.insertBefore(element, document.head.firstChild);\n injectedElements.prepend.push(element);\n });\n \n append.forEach(resource => {\n const element = createLinkElement(resource);\n document.head.appendChild(element);\n injectedElements.append.push(element);\n });\n }, [createLinkElement, removeInjectedElements]);\n\n const getAndroidFXLPatch = useCallback((): (ILinkInjectable & IBlobInjectable) | null => {\n const platform = getPlatform();\n const isAndroid = platform === \"android\";\n \n if (!isAndroid) {\n return null;\n }\n \n const cssContent = getAndroidPatchCss();\n const blob = new Blob([cssContent], { type: \"text/css\" });\n \n return {\n as: \"link\",\n rel: \"stylesheet\",\n blob\n };\n }, []);\n\n useEffect(() => {\n injectFontResources(fontResources || null);\n \n return () => {\n removeInjectedElements();\n };\n }, [fontResources, injectFontResources, removeInjectedElements]);\n\n return {\n injectFontResources,\n removeFontResources: removeInjectedElements,\n getAndroidFXLPatch\n };\n};","// Peripherals based on XBReader\nimport { ThActionsPref, DefaultKeys } from \"@/preferences\";\n\nimport { ThActionsKeys } from \"@/preferences/models\";\n\nimport { buildShortcut, UnstablePShortcut } from \"@/core/Helpers/keyboardUtilities\";\nimport { isInteractiveElement } from \"@/core/Helpers/focusUtilities\";\n\nimport { useAppStore } from \"@/lib/hooks\";\n\nexport interface PCallbacks {\n moveTo: (direction: \"left\" | \"right\" | \"up\" | \"down\" | \"home\" | \"end\") => void;\n goProgression: (shiftKey?: boolean) => void;\n toggleAction: (action: ThActionsKeys) => void;\n}\n\nexport interface PShortcuts {\n [key: string]: {\n actionKey: ThActionsKeys;\n modifiers: UnstablePShortcut[\"modifiers\"];\n }\n}\n\nexport default class Peripherals {\n private readonly observers = [\"keydown\"];\n private targets: EventTarget[] = [];\n private readonly callbacks: PCallbacks;\n private readonly store: ReturnType<typeof useAppStore>;\n private readonly actionsPref: ThActionsPref<DefaultKeys> | undefined;\n private readonly shortcuts: PShortcuts;\n\n constructor(store: ReturnType<typeof useAppStore>, actionsPref: ThActionsPref<DefaultKeys> | undefined, callbacks: PCallbacks) {\n this.observers.forEach((method) => {\n (this as any)[\"on\" + method] = (this as any)[\"on\" + method].bind(this);\n });\n this.store = store;\n this.actionsPref = actionsPref;\n this.callbacks = callbacks;\n this.shortcuts = this.retrieveShortcuts();\n }\n\n private getPlatformModifier(): \"ctrlKey\" | \"metaKey\" {\n return this.store.getState().reader.platformModifier.modifier;\n }\n\n private retrieveShortcuts() {\n if (!this.actionsPref) return {};\n\n const shortcutsObj: PShortcuts = {};\n\n const displayOrder = this.store.getState().publication.isFXL\n ? this.actionsPref.fxlOrder\n : this.actionsPref.reflowOrder;\n\n for (const actionKey of displayOrder) {\n const shortcutString = this.actionsPref.keys[actionKey].shortcut;\n \n if (shortcutString) {\n const shortcutObj = buildShortcut(shortcutString);\n\n if (shortcutObj?.key) {\n Object.defineProperty(shortcutsObj, shortcutObj.key, {\n value: {\n actionKey: actionKey,\n modifiers: shortcutObj.modifiers\n },\n writable: false,\n enumerable: true\n });\n }\n }\n };\n \n return shortcutsObj;\n }\n\n destroy() {\n this.targets.forEach((t) => this.unobserve(t));\n }\n\n unobserve(item: EventTarget) {\n if (!item) return;\n this.observers.forEach((EventName) => {\n item.removeEventListener(\n EventName,\n (this as any)[\"on\" + EventName],\n false\n );\n });\n this.targets = this.targets.filter((t) => t !== item);\n }\n\n observe(item: EventTarget) {\n if (!item) return;\n if (this.targets.includes(item)) return;\n this.observers.forEach((EventName) => {\n item.addEventListener(EventName, (this as any)[\"on\" + EventName], false);\n });\n this.targets.push(item);\n }\n\n onkeydown(e: KeyboardEvent) {\n const focusIsSafe = !isInteractiveElement(document.activeElement);\n \n switch(e.code) {\n case \"Space\":\n focusIsSafe && this.callbacks.goProgression(e.shiftKey);\n break;\n case \"ArrowRight\":\n focusIsSafe && this.callbacks.moveTo(\"right\");\n break;\n case \"ArrowLeft\":\n focusIsSafe && this.callbacks.moveTo(\"left\");\n break;\n case \"ArrowUp\":\n case \"PageUp\":\n focusIsSafe && this.callbacks.moveTo(\"up\");\n break;\n case \"ArrowDown\":\n case \"PageDown\":\n focusIsSafe && this.callbacks.moveTo(\"down\");\n break;\n case \"Home\":\n focusIsSafe && this.callbacks.moveTo(\"home\");\n break;\n case \"End\":\n focusIsSafe && this.callbacks.moveTo(\"end\");\n break;\n default:\n if (this.shortcuts.hasOwnProperty(e.code)) {\n const customShortcutObj = this.shortcuts[e.code];\n const sendCallback = Object.entries(customShortcutObj.modifiers).every(( [modifier, value] ) => {\n if (modifier === \"platformKey\") {\n return e[this.getPlatformModifier()] === value;\n } else {\n return e[modifier as \"altKey\" | \"ctrlKey\" | \"metaKey\" | \"shiftKey\"] === value;\n }\n })\n \n if (sendCallback) {\n e.preventDefault();\n this.callbacks.toggleAction(customShortcutObj.actionKey)\n };\n }\n break;\n }\n }\n}","import { ThLayoutUI } from \"@/preferences\";\nimport readerStyles from \"../assets/styles/thorium-web.reader.app.module.css\";\nimport classNames from \"classnames\";\n\ninterface ReaderStyleOptions {\n layoutUI: ThLayoutUI;\n isScroll: boolean;\n isImmersive?: boolean;\n isHovering?: boolean;\n isFXL?: boolean;\n breakpoint?: string;\n}\n\nconst LAYOUT_CLASSES = {\n [ThLayoutUI.stacked]: \"thorium_web_stackedUI\",\n [ThLayoutUI.layered]: \"thorium_web_layeredUI\",\n} as const;\n\nexport function getReaderClassNames(options: ReaderStyleOptions): string {\n const {\n layoutUI,\n isScroll,\n isImmersive = false,\n isHovering = false,\n isFXL = false,\n breakpoint,\n } = options;\n\n return classNames(\n readerStyles.shell,\n isScroll ? \"thorium_web_isScroll\" : \"thorium_web_isPaged\",\n isImmersive && \"thorium_web_isImmersive\",\n isHovering && \"thorium_web_isHovering\",\n isFXL ? \"thorium_web_isFXL\" : \"thorium_web_isReflow\",\n LAYOUT_CLASSES[layoutUI],\n breakpoint ? `thorium_web_is${ breakpoint.charAt(0).toUpperCase() + breakpoint.slice(1) }` : undefined\n );\n}"]}
|