@somecat/epub-reader 0.1.3 → 0.1.4

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/react.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/styles/epub-reader.cssText.ts","../src/styles/ensureStyle.ts","../src/core/reader.ts","../src/core/icons.ts","../src/react/components/SvgIcon.tsx","../src/react/components/DesktopToolbar.tsx","../src/react/components/DesktopBottomBar.tsx","../src/react/components/TocTree.tsx","../src/react/components/TocDrawer.tsx","../src/react/components/SearchResultList.tsx","../src/react/components/SearchDrawer.tsx","../src/react/components/MobileUI.tsx","../src/react/EBookReader.tsx","../src/react/index.ts"],"names":["jsx","jsxs","EBookReader","useRef","useState","useMemo","Fragment"],"mappings":";;;;;AAAO,IAAM,iBAAA,GAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,CAAA;;;ACEjC,IAAM,gBAAA,GAAmB,2BAAA;AAElB,IAAM,wBAAwB,MAAM;AACzC,EAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACrC,EAAA,IAAI,QAAA,CAAS,cAAA,CAAe,gBAAgB,CAAA,EAAG;AAE/C,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAC5C,EAAA,KAAA,CAAM,EAAA,GAAK,gBAAA;AACX,EAAA,KAAA,CAAM,WAAA,GAAc,iBAAA;AAEnB,EAAA,CAAC,QAAA,CAAS,IAAA,IAAQ,QAAA,CAAS,eAAA,EAAiB,OAAO,KAAK,CAAA;AAC3D,CAAA;ACSA,IAAM,aAAA,GAAgB,CAAC,QAAA,EAAkB,MAAA,EAAiB,QAAA,KAAsB;AAAA;AAAA;AAAA,gBAAA,EAG9D,MAAA,GAAS,SAAS,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA,SAAA,EAIhC,MAAA,GAAS,YAAY,OAAO,CAAA;AAAA,aAAA,EACxB,QAAQ,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAAA,EAOZ,MAAA,GAAS,YAAY,SAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,EAMrC,MAAA,GAAS,2CAA2C,EAAE;AAAA;AAAA,EAExD,YAAY,EAAE;AAAA,CAAA;AAGT,SAAS,iBAAA,CAAkB,SAAA,EAAwB,OAAA,GAA8B,EAAC,EAAsB;AAC7G,EAAA,IAAI,CAAC,SAAA,EAAW,MAAM,IAAI,MAAM,uBAAuB,CAAA;AACvD,EAAA,IAAI,CAAC,eAAe,GAAA,CAAI,cAAc,GAAG,MAAM,IAAI,MAAM,6BAA6B,CAAA;AAEtF,EAAA,MAAM;AAAA,IACJ,UAAU,eAAA,GAAkB,KAAA;AAAA,IAC5B,UAAU,eAAA,GAAkB,GAAA;AAAA,IAC5B,eAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA,UAAA;AAAA,IACA,KAAA;AAAA,IACA,gBAAA;AAAA,IACA;AAAA,GACF,GAAI,OAAA;AAEJ,EAAA,IAAI,SAAA,GAAY,KAAA;AAChB,EAAA,IAAI,MAAiB,EAAC;AACtB,EAAA,IAAI,QAAA,GAAW,eAAA;AACf,EAAA,IAAI,QAAA,GAAW,eAAA;AACf,EAAA,IAAI,WAAA,GAAc,CAAA;AAElB,EAAA,SAAA,CAAU,SAAA,GAAY,EAAA;AAEtB,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,cAAc,CAAA;AACpD,EAAA,MAAA,CAAO,MAAM,OAAA,GAAU,OAAA;AACvB,EAAA,MAAA,CAAO,MAAM,KAAA,GAAQ,MAAA;AACrB,EAAA,MAAA,CAAO,MAAM,MAAA,GAAS,MAAA;AACtB,EAAA,MAAA,CAAO,YAAA,CAAa,UAAU,IAAI,CAAA;AAClC,EAAA,MAAA,CAAO,YAAA,CAAa,OAAO,MAAM,CAAA;AAEjC,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,IAAI,SAAA,EAAW;AACf,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,EAAU,SAAA,EAAW;AACjC,IAAA,MAAA,CAAO,SAAS,SAAA,CAAU,aAAA,CAAc,QAAA,EAAU,QAAA,EAAU,eAAe,CAAC,CAAA;AAC5E,IAAA,qBAAA,CAAsB,MAAM;AAC1B,MAAA,UAAA,CAAW,MAAM;AACf,QAAA,IAAI,SAAA,EAAW;AACf,QAAA,MAAA,CAAO,UAAU,MAAA,IAAS;AAC1B,QAAA,MAAA,CAAO,UAAU,MAAA,IAAS;AAAA,MAC5B,GAAG,EAAE,CAAA;AAAA,IACP,CAAC,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,MAAM,UAAA,GAAa,CAAC,CAAA,KAAa;AAC/B,IAAA,WAAA,EAAY;AACZ,IAAA,MAAM,SAAU,CAAA,CAAkB,MAAA;AAClC,IAAA,IAAI,MAAA,EAAQ,GAAA,EAAK,aAAA,GAAgB,MAAA,CAAO,GAAG,CAAA;AAAA,EAC7C,CAAA;AAEA,EAAA,MAAM,cAAA,GAAiB,CAAC,CAAA,KAAa;AACnC,IAAA,MAAM,SAAU,CAAA,CAAkB,MAAA;AAClC,IAAA,UAAA,GAAa,MAAM,CAAA;AAAA,EACrB,CAAA;AAEA,EAAA,MAAA,CAAO,gBAAA,CAAiB,QAAQ,UAA2B,CAAA;AAC3D,EAAA,MAAA,CAAO,gBAAA,CAAiB,YAAY,cAA+B,CAAA;AAEnE,EAAA,SAAA,CAAU,YAAY,MAAM,CAAA;AAE5B,EAAA,MAAM,MAAA,GAA4B;AAAA,IAChC,MAAM,KAAK,IAAA,EAAM;AACf,MAAA,IAAI,SAAA,EAAW;AACf,MAAA,IAAI,CAAC,IAAA,EAAM;AAEX,MAAA,IAAI;AACF,QAAA,MAAA,CAAO,WAAA,IAAc;AACrB,QAAA,WAAA,EAAA;AAEA,QAAA,MAAM,MAAA,CAAO,OAAO,IAAI,CAAA;AAExB,QAAA,MAAM,OAAA,GAAU,MAAA,CAAO,IAAA,EAAM,GAAA,IAAO,EAAC;AACrC,QAAA,GAAA,GAAM,OAAA;AACN,QAAA,KAAA,GAAQ,GAAG,CAAA;AAEX,QAAA,MAAM,MAAA,CAAO,IAAA,GAAO,EAAE,aAAA,EAAe,MAAM,CAAA;AAC3C,QAAA,WAAA,EAAY;AAAA,MACd,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,GAAU,KAAK,CAAA;AACf,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF,CAAA;AAAA,IACA,OAAA,GAAU;AACR,MAAA,IAAI,SAAA,EAAW;AACf,MAAA,SAAA,GAAY,IAAA;AACZ,MAAA,WAAA,EAAA;AACA,MAAA,MAAA,CAAO,mBAAA,CAAoB,QAAQ,UAAU,CAAA;AAC7C,MAAA,MAAA,CAAO,mBAAA,CAAoB,YAAY,cAA+B,CAAA;AACtE,MAAA,SAAA,CAAU,SAAA,GAAY,EAAA;AAAA,IACxB,CAAA;AAAA,IACA,QAAA,GAAW;AACT,MAAA,MAAA,CAAO,MAAA,IAAS;AAAA,IAClB,CAAA;AAAA,IACA,QAAA,GAAW;AACT,MAAA,MAAA,CAAO,OAAA,IAAU;AAAA,IACnB,CAAA;AAAA,IACA,WAAA,GAAc;AACZ,MAAA,MAAA,CAAO,UAAU,WAAA,IAAc;AAAA,IACjC,CAAA;AAAA,IACA,WAAA,GAAc;AACZ,MAAA,MAAA,CAAO,UAAU,WAAA,IAAc;AAAA,IACjC,CAAA;AAAA,IACA,KAAK,MAAA,EAAQ;AACX,MAAA,IAAI,CAAC,MAAA,EAAQ;AACb,MAAA,MAAA,CAAO,OAAO,MAAM,CAAA;AAAA,IACtB,CAAA;AAAA,IACA,aAAa,QAAA,EAAU;AACrB,MAAA,MAAM,IAAA,GAAO,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,QAAQ,CAAC,CAAA;AAC9C,MAAA,MAAA,CAAO,eAAe,IAAI,CAAA;AAAA,IAC5B,CAAA;AAAA,IACA,YAAY,YAAA,EAAc;AACxB,MAAA,QAAA,GAAW,YAAA;AACX,MAAA,WAAA,EAAY;AAAA,IACd,CAAA;AAAA,IACA,YAAY,YAAA,EAAc;AACxB,MAAA,MAAM,IAAA,GAAO,KAAK,GAAA,CAAI,GAAA,EAAK,KAAK,GAAA,CAAI,EAAA,EAAI,YAAY,CAAC,CAAA;AACrD,MAAA,QAAA,GAAW,IAAA;AACX,MAAA,WAAA,EAAY;AAAA,IACd,CAAA;AAAA,IACA,MAAM,MAAA,CAAO,KAAA,EAAO,IAAA,GAAsB,EAAC,EAAG;AAC5C,MAAA,MAAM,UAAA,GAAa,MAAM,IAAA,EAAK;AAC9B,MAAA,IAAI,CAAC,UAAA,EAAY;AACf,QAAA,MAAA,CAAO,WAAA,IAAc;AACrB,QAAA,OAAO,EAAC;AAAA,MACV;AAEA,MAAA,MAAM,QAAQ,EAAE,WAAA;AAChB,MAAA,MAAM,UAA0B,EAAC;AAEjC,MAAA,IAAI;AACF,QAAA,WAAA,MAAiB,IAAA,IAAQ,OAAO,MAAA,GAAS;AAAA,UACvC,KAAA,EAAO,UAAA;AAAA,UACP,SAAA,EAAW,OAAA,CAAQ,IAAA,CAAK,SAAS,CAAA;AAAA,UACjC,eAAA,EAAiB,OAAA,CAAQ,IAAA,CAAK,UAAU,CAAA;AAAA,UACxC,eAAA,EAAiB,OAAA,CAAQ,IAAA,CAAK,eAAe;AAAA,SAC9C,CAAA,IAAK,EAAC,EAAG;AACR,UAAA,IAAI,SAAA,IAAa,KAAA,KAAU,WAAA,EAAa,OAAO,OAAA;AAE/C,UAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,YAAA,gBAAA,GAAmB,EAAE,IAAA,EAAM,IAAA,EAAM,QAAA,EAAU,GAAG,CAAA;AAC9C,YAAA;AAAA,UACF;AAEA,UAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,IAAA,IAAQ,cAAe,IAAA,EAAc;AACnE,YAAA,MAAM,WAAY,IAAA,CAAa,QAAA;AAC/B,YAAA,IAAI,OAAO,QAAA,KAAa,QAAA,EAAU,gBAAA,GAAmB,EAAE,UAAU,CAAA;AACjE,YAAA;AAAA,UACF;AAEA,UAAA,MAAM,OAAA,GAAU,IAAA;AAChB,UAAA,IAAI,OAAA,EAAS,UAAU,MAAA,EAAQ;AAC7B,YAAA,KAAA,MAAW,GAAA,IAAO,QAAQ,QAAA,EAAU;AAClC,cAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,gBACX,OAAO,OAAA,CAAQ,KAAA;AAAA,gBACf,KAAK,GAAA,EAAK,GAAA;AAAA,gBACV,SAAS,GAAA,EAAK,OAAA;AAAA,gBACd,OAAO,GAAA,EAAK;AAAA,eACb,CAAA;AAAA,YACH;AAAA,UACF,CAAA,MAAA,IAAW,SAAS,GAAA,EAAK;AACvB,YAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,cACX,KAAK,OAAA,CAAQ,GAAA;AAAA,cACb,SAAS,OAAA,CAAQ,OAAA;AAAA,cACjB,OAAO,OAAA,CAAQ;AAAA,aAChB,CAAA;AAAA,UACH;AAAA,QACF;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,GAAU,KAAK,CAAA;AACf,QAAA,MAAM,KAAA;AAAA,MACR;AAEA,MAAA,OAAO,OAAA;AAAA,IACT,CAAA;AAAA,IACA,YAAA,GAAe;AACb,MAAA,WAAA,EAAA;AAAA,IACF,CAAA;AAAA,IACA,WAAA,GAAc;AACZ,MAAA,MAAA,CAAO,WAAA,IAAc;AAAA,IACvB,CAAA;AAAA,IACA,MAAA,GAAS;AACP,MAAA,OAAO,GAAA;AAAA,IACT;AAAA,GACF;AAEA,EAAA,OAAA,GAAU,MAAM,CAAA;AAChB,EAAA,OAAO,MAAA;AACT;;;AC3OO,IAAM,KAAA,GAAgC;AAAA,EAC3C,IAAA,EAAM,2HAAA;AAAA,EACN,MAAA,EAAQ,0JAAA;AAAA,EACR,cAAA,EAAgB,mHAAA;AAAA,EAChB,eAAA,EAAiB,iHAAA;AAAA,EACjB,eAAA,EAAiB,kIAAA;AAAA,EACjB,gBAAA,EAAkB,+HAAA;AAAA,EAClB,GAAA,EAAK,oQAAA;AAAA,EACL,IAAA,EAAM,mJAAA;AAAA,EACN,IAAA,EAAM,oHAAA;AAAA,EACN,KAAA,EAAO,4GAAA;AAAA,EACP,CAAA,EAAG,wHAAA;AAAA,EACH,IAAA,EAAM,8HAAA;AAAA,EACN,OAAA,EAAS;AACX,CAAA;ACJO,IAAM,OAAA,GAAU,CAAC,EAAE,IAAA,EAAM,OAAO,EAAA,EAAI,KAAA,GAAQ,cAAA,EAAgB,SAAA,EAAU,KAAoB;AAC/F,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,IAAI,CAAA,IAAK,EAAA;AAEhC,EAAA,MAAM,KAAA,GAAQ,QAAQ,MAAM;AAC1B,IAAA,MAAM,UAAU,OAAO,IAAA,KAAS,QAAA,GAAW,CAAA,EAAG,IAAI,CAAA,EAAA,CAAA,GAAO,IAAA;AACzD,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,OAAA;AAAA,MACP,MAAA,EAAQ,OAAA;AAAA,MACR,KAAA;AAAA,MACA,QAAA,EAAU,OAAA;AAAA,MACV,OAAA,EAAS,cAAA;AAAA,MACT,aAAA,EAAe;AAAA,KACjB;AAAA,EACF,CAAA,EAAG,CAAC,IAAA,EAAM,KAAK,CAAC,CAAA;AAEhB,EAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAEtB,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAM,4BAAA;AAAA,MACN,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MACL,KAAA;AAAA,MACA,SAAA;AAAA,MACA,uBAAA,EAAyB,EAAE,MAAA,EAAQ,QAAA;AAAS;AAAA,GAC9C;AAEJ,CAAA;ACnBO,IAAM,iBAAiB,CAAC;AAAA,EAC7B,WAAA;AAAA,EACA,cAAA;AAAA,EACA,aAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAA;AAAA,EACA,QAAA;AAAA,EACA,gBAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,KAA2B;AACzB,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EACb,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,oBAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,GAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,WAAU,kBAAA,EAAmB,OAAA,EAAS,WAAA,EAAa,KAAA,EAAM,gBAC7E,QAAA,kBAAAA,GAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAK,QAAO,CAAA,EACvB,CAAA;AAAA,sBACAA,GAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,WAAU,kBAAA,EAAmB,OAAA,EAAS,cAAA,EAAgB,KAAA,EAAM,gBAChF,QAAA,kBAAAA,GAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAK,UAAS,CAAA,EACzB,CAAA;AAAA,sBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EAAuB,CAAA;AAAA,sBACtCA,GAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,WAAU,kBAAA,EAAmB,OAAA,EAAS,aAAA,EAAe,KAAA,EAAM,sBAC/E,QAAA,kBAAAA,GAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAK,iBAAgB,CAAA,EAChC,CAAA;AAAA,sBACAA,GAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,WAAU,kBAAA,EAAmB,OAAA,EAAS,UAAA,EAAY,KAAA,EAAM,sBAC5E,QAAA,kBAAAA,GAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAK,gBAAe,CAAA,EAC/B,CAAA;AAAA,sBACAA,GAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,WAAU,kBAAA,EAAmB,OAAA,EAAS,UAAA,EAAY,KAAA,EAAM,sBAC5E,QAAA,kBAAAA,GAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAK,iBAAgB,CAAA,EAChC,CAAA;AAAA,sBACAA,GAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,WAAU,kBAAA,EAAmB,OAAA,EAAS,aAAA,EAAe,KAAA,EAAM,sBAC/E,QAAA,kBAAAA,GAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAK,kBAAiB,CAAA,EACjC;AAAA,KAAA,EACF,CAAA;AAAA,oBAEA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,IAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,SAAA,EAAU,oBAAmB,OAAA,EAAS,gBAAA,EAAkB,KAAA,EAAM,cAAA,EAClF,0BAAAA,GAAAA,CAAC,OAAA,EAAA,EAAQ,MAAM,QAAA,GAAW,KAAA,GAAQ,QAAQ,CAAA,EAC5C,CAAA;AAAA,sBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EAAuB,CAAA;AAAA,sBACtCA,IAAC,QAAA,EAAA,EAAO,IAAA,EAAK,UAAS,SAAA,EAAU,kBAAA,EAAmB,SAAS,MAAM,gBAAA,CAAiB,WAAW,EAAE,CAAA,EAAG,OAAM,0BAAA,EACvG,QAAA,kBAAAA,IAAC,OAAA,EAAA,EAAQ,IAAA,EAAK,QAAO,CAAA,EACvB,CAAA;AAAA,sBACA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mBAAA,EAAqB,QAAA,EAAA;AAAA,QAAA,QAAA;AAAA,QAAS;AAAA,OAAA,EAAC,CAAA;AAAA,sBAC9CA,IAAC,QAAA,EAAA,EAAO,IAAA,EAAK,UAAS,SAAA,EAAU,kBAAA,EAAmB,SAAS,MAAM,gBAAA,CAAiB,WAAW,EAAE,CAAA,EAAG,OAAM,0BAAA,EACvG,QAAA,kBAAAA,IAAC,OAAA,EAAA,EAAQ,IAAA,EAAK,SAAQ,CAAA,EACxB;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ,CAAA;ACvDO,IAAM,mBAAmB,CAAC;AAAA,EAC/B,MAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,gBAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,KAA6B;AAC3B,EAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qBAAA,EACb,QAAA,EAAA,MAAA,KAAW,OAAA,GAAU,SAAA,IAAa,cAAA,GAAO,MAAA,KAAW,SAAA,GAAY,gCAAA,GAAU,cAAA,EAC7E,CAAA;AAAA,MACC,+BAAeA,GAAAA,CAAC,UAAK,SAAA,EAAU,sBAAA,EAAwB,wBAAa,CAAA,GAAU;AAAA,KAAA,EACjF,CAAA;AAAA,oBACAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,GAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,oBAAA;AAAA,UACV,IAAA,EAAK,OAAA;AAAA,UACL,GAAA,EAAK,CAAA;AAAA,UACL,GAAA,EAAK,GAAA;AAAA,UACL,IAAA,EAAM,CAAA;AAAA,UACN,KAAA,EAAO,gBAAA;AAAA,UACP,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,YAAA,WAAA,EAAY;AACZ,YAAA,YAAA,CAAa,MAAA,CAAO,CAAA,CAAE,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,UACrC,CAAA;AAAA,UACA,WAAA,EAAa,CAAC,CAAA,KAAM;AAClB,YAAA,MAAM,CAAA,GAAI,MAAA,CAAQ,CAAA,CAAE,MAAA,CAA4B,KAAK,CAAA;AACrD,YAAA,SAAA,CAAU,CAAC,CAAA;AAAA,UACb,CAAA;AAAA,UACA,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,YAAA,IAAI,CAAA,CAAE,QAAQ,OAAA,EAAS;AACvB,YAAA,MAAM,CAAA,GAAI,MAAA,CAAQ,CAAA,CAAE,MAAA,CAA4B,KAAK,CAAA;AACrD,YAAA,YAAA,CAAa,CAAC,CAAA;AAAA,UAChB;AAAA;AAAA,OACF;AAAA,sBACAC,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sBAAA,EAAwB,QAAA,EAAA;AAAA,QAAA,gBAAA;AAAA,QAAiB;AAAA,OAAA,EAAC;AAAA,KAAA,EAC5D;AAAA,GAAA,EACF,CAAA;AAEJ,CAAA;AC/CO,IAAM,OAAA,GAAU,CAAC,EAAE,KAAA,EAAO,UAAS,KAAoB;AAC5D,EAAA,uBACED,IAAC,IAAA,EAAA,EAAG,SAAA,EAAU,yBACX,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,EAAM,GAAA,KAAQ;AACxB,IAAA,MAAM,GAAA,GAAM,KAAK,IAAA,IAAQ,CAAA,EAAG,KAAK,KAAA,IAAS,MAAM,IAAI,GAAG,CAAA,CAAA;AACvD,IAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,IAAA,CAAK,QAAA,EAAU,MAAM,CAAA;AACjD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,IAAS,IAAA,CAAK,IAAA,IAAQ,oBAAA;AAEzC,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,uBACEA,IAAC,IAAA,EAAA,EAAa,SAAA,EAAU,yBACtB,QAAA,kBAAAA,GAAAA,CAAC,YAAO,IAAA,EAAK,QAAA,EAAS,WAAU,sBAAA,EAAuB,OAAA,EAAS,MAAM,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA,EACrF,QAAA,EAAA,KAAA,EACH,KAHO,GAIT,CAAA;AAAA,IAEJ;AAEA,IAAA,uBACEA,IAAC,IAAA,EAAA,EAAa,SAAA,EAAU,yBACtB,QAAA,kBAAAC,IAAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAU,0BAAA,EACjB,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAU,0BAAA,EAA4B,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,sBACrDA,IAAC,OAAA,EAAA,EAAQ,KAAA,EAAO,KAAK,QAAA,IAAY,IAAI,QAAA,EAAoB;AAAA,KAAA,EAC3D,KAJO,GAKT,CAAA;AAAA,EAEJ,CAAC,CAAA,EACH,CAAA;AAEJ,CAAA;AC1BO,IAAM,YAAY,CAAC,EAAE,QAAQ,OAAA,EAAS,GAAA,EAAK,UAAS,KAAsB;AAC/E,EAAA,uBACEC,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAW,CAAA,oBAAA,EAAuB,MAAA,GAAS,SAAA,GAAY,EAAE,CAAA,CAAA,EAAI,aAAA,EAAa,CAAC,MAAA,EAChF,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EAA4B,QAAA,EAAA,cAAA,EAAE,CAAA;AAAA,sBAC7CA,GAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,UAAS,SAAA,EAAU,kBAAA,EAAmB,OAAA,EAAS,OAAA,EAC1D,QAAA,kBAAAA,GAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAK,KAAI,CAAA,EACpB;AAAA,KAAA,EACF,CAAA;AAAA,oBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,0BAAA,EACZ,QAAA,EAAA,GAAA,CAAI,yBACHA,GAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,GAAA;AAAA,QACP,QAAA,EAAU,CAAC,IAAA,KAAS;AAClB,UAAA,QAAA,CAAS,IAAI,CAAA;AACb,UAAA,OAAA,EAAQ;AAAA,QACV;AAAA;AAAA,wBAGFA,GAAAA,CAAC,SAAI,SAAA,EAAU,oBAAA,EAAqB,4CAAK,CAAA,EAE7C;AAAA,GAAA,EACF,CAAA;AAEJ,CAAA;AC5BO,IAAM,gBAAA,GAAmB,CAAC,EAAE,OAAA,EAAS,UAAS,KAA6B;AAChF,EAAA,uBACEA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,4BACX,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,EAAG,wBACfA,GAAAA,CAAC,IAAA,EAAA,EAAuC,SAAA,EAAU,4BAChD,QAAA,kBAAAC,IAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,SAAA,EAAU,yBAAA;AAAA,MACV,SAAS,MAAM;AACb,QAAA,IAAI,CAAA,CAAE,GAAA,EAAK,QAAA,CAAS,CAAA,CAAE,GAAG,CAAA;AAAA,MAC3B,CAAA;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,CAAA,CAAE,KAAA,mBAAQD,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,2BAAA,EAA6B,QAAA,EAAA,CAAA,CAAE,OAAM,CAAA,GAAS,IAAA;AAAA,wBACxEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAAA,EACZ,QAAA,EAAA,OAAO,CAAA,CAAE,OAAA,KAAY,QAAA,GAClB,CAAA,CAAE,OAAA,GACF,CAAA,EAAG,CAAA,CAAE,SAAS,GAAA,IAAO,EAAE,CAAA,EAAG,CAAA,CAAE,OAAA,EAAS,KAAA,IAAS,EAAE,CAAA,EAAG,CAAA,CAAE,OAAA,EAAS,IAAA,IAAQ,EAAE,CAAA,CAAA,EAC9E;AAAA;AAAA;AAAA,GACF,EAAA,EAdO,GAAG,CAAA,CAAE,GAAA,IAAO,QAAQ,CAAA,CAAA,EAAI,GAAG,CAAA,CAepC,CACD,CAAA,EACH,CAAA;AAEJ,CAAA;ACdO,IAAM,eAAe,CAAC;AAAA,EAC3B,MAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,aAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA;AACF,CAAA,KAAyB;AACvB,EAAA,uBACEC,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAW,CAAA,0BAAA,EAA6B,MAAA,GAAS,SAAA,GAAY,EAAE,CAAA,CAAA,EAAI,aAAA,EAAa,CAAC,MAAA,EACtF,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EAA4B,QAAA,EAAA,cAAA,EAAE,CAAA;AAAA,sBAC7CA,GAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,UAAS,SAAA,EAAU,kBAAA,EAAmB,OAAA,EAAS,OAAA,EAC1D,QAAA,kBAAAA,GAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAK,KAAI,CAAA,EACpB;AAAA,KAAA,EACF,CAAA;AAAA,oBACAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EACb,QAAA,EAAA;AAAA,wBAAAD,GAAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,oBAAA;AAAA,YACV,WAAA,EAAY,gCAAA;AAAA,YACZ,OAAO,MAAA,CAAO,KAAA;AAAA,YACd,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,cAAA,MAAM,CAAA,GAAI,EAAE,MAAA,CAAO,KAAA;AACnB,cAAA,aAAA,CAAc,CAAC,CAAA;AACf,cAAA,IAAI,CAAC,CAAA,CAAE,IAAA,EAAK,WAAY,EAAE,CAAA;AAAA,YAC5B,CAAA;AAAA,YACA,UAAU,MAAA,KAAW,OAAA;AAAA,YACrB,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,cAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,EAAS,QAAA,CAAS,OAAO,KAAK,CAAA;AAAA,YAC9C;AAAA;AAAA,SACF;AAAA,wBACAA,IAAC,QAAA,EAAA,EAAO,IAAA,EAAK,UAAS,SAAA,EAAU,kBAAA,EAAmB,SAAS,MAAM,QAAA,CAAS,OAAO,KAAK,CAAA,EAAG,UAAU,MAAA,KAAW,OAAA,EAC7G,0BAAAA,GAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAK,QAAA,EAAS,CAAA,EACzB;AAAA,OAAA,EACF,CAAA;AAAA,sBAEAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,oBAAA,EACf,QAAA,EAAA;AAAA,0BAAAD,GAAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,UAAA;AAAA,cACL,OAAA,EAAS,OAAA,CAAQ,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA;AAAA,cACzC,QAAA,EAAU,CAAC,CAAA,KAAM,cAAA,CAAe,EAAE,SAAA,EAAW,CAAA,CAAE,MAAA,CAAO,OAAA,EAAS;AAAA;AAAA,WACjE;AAAA,UAAE;AAAA,SAAA,EAEJ,CAAA;AAAA,wBACAC,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,oBAAA,EACf,QAAA,EAAA;AAAA,0BAAAD,GAAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,UAAA;AAAA,cACL,OAAA,EAAS,OAAA,CAAQ,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA;AAAA,cAC1C,QAAA,EAAU,CAAC,CAAA,KAAM,cAAA,CAAe,EAAE,UAAA,EAAY,CAAA,CAAE,MAAA,CAAO,OAAA,EAAS;AAAA;AAAA,WAClE;AAAA,UAAE;AAAA,SAAA,EAEJ,CAAA;AAAA,wBACAC,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,oBAAA,EACf,QAAA,EAAA;AAAA,0BAAAD,GAAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,UAAA;AAAA,cACL,OAAA,EAAS,OAAA,CAAQ,MAAA,CAAO,OAAA,CAAQ,eAAe,CAAA;AAAA,cAC/C,QAAA,EAAU,CAAC,CAAA,KAAM,cAAA,CAAe,EAAE,eAAA,EAAiB,CAAA,CAAE,MAAA,CAAO,OAAA,EAAS;AAAA;AAAA,WACvE;AAAA,UAAE;AAAA,SAAA,EAEJ;AAAA,OAAA,EACF,CAAA;AAAA,sBAEAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mBAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,KAAC,MAAA,EAAA,EAAK,QAAA,EAAA;AAAA,UAAA,eAAA;AAAA,UAAI,MAAA,CAAO,eAAA;AAAA,UAAgB;AAAA,SAAA,EAAC,CAAA;AAAA,QACjC,OAAO,SAAA,mBAAYD,GAAAA,CAAC,MAAA,EAAA,EAAK,sCAAI,CAAA,GAAU,IAAA;AAAA,QACvC,MAAA,CAAO,SAAA,mBACNA,GAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,SAAA,EAAU,mBAAA,EAAoB,OAAA,EAAS,cAAA,EAAgB,QAAA,EAAA,cAAA,EAE7E,CAAA,GACE;AAAA,OAAA,EACN,CAAA;AAAA,MAEC,MAAA,CAAO,QAAQ,MAAA,mBACdA,IAAC,gBAAA,EAAA,EAAiB,OAAA,EAAS,MAAA,CAAO,OAAA,EAAS,QAAA,EAAU,cAAA,EAAgB,oBAErEA,GAAAA,CAAC,SAAI,SAAA,EAAU,oBAAA,EAAsB,iBAAO,KAAA,CAAM,IAAA,EAAK,GAAI,gCAAA,GAAU,sCAAA,EAAS;AAAA,KAAA,EAElF;AAAA,GAAA,EACF,CAAA;AAEJ,CAAA;AC3DO,IAAM,WAAW,CAAC;AAAA,EACvB,UAAA;AAAA,EACA,WAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA;AAAA,EACA,GAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,gBAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA,mBAAA;AAAA,EACA,oBAAA;AAAA,EACA,cAAA;AAAA,EACA,oBAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,gBAAA;AAAA,EACA;AACF,CAAA,KAAqB;AACnB,EAAA,MAAM,WAAA,GAAc,WAAA,KAAgB,MAAA,GAAS,cAAA,GAAO,gBAAgB,QAAA,GAAW,cAAA,GAAO,WAAA,KAAgB,UAAA,GAAa,iBAAO,WAAA,KAAgB,OAAA,GAAU,cAAA,GAAO,WAAA,KAAgB,SAAS,cAAA,GAAO,EAAA;AAE3L,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAgD,IAAI,CAAA;AAClF,EAAA,MAAM,QAAA,GAAW,OAAsB,IAAI,CAAA;AAE3C,EAAA,MAAM,gBAAA,GAAmB,CAAC,CAAA,EAAqB,IAAA,KAAiB;AAC9D,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,aAAA,CAAc,qBAAA,EAAsB;AAEnD,IAAA,QAAA,CAAS,OAAA,GAAU,MAAA,CAAO,UAAA,CAAW,MAAM;AACzC,MAAA,UAAA,CAAW;AAAA,QACT,IAAA;AAAA,QACA,IAAA,EAAM,IAAA,CAAK,IAAA,GAAO,IAAA,CAAK,KAAA,GAAQ;AAAA,OAChC,CAAA;AAAA,IACH,GAAG,GAAG,CAAA;AAAA,EACR,CAAA;AAEA,EAAA,MAAM,iBAAiB,MAAM;AAC3B,IAAA,IAAI,SAAS,OAAA,EAAS;AACpB,MAAA,YAAA,CAAa,SAAS,OAAO,CAAA;AAC7B,MAAA,QAAA,CAAS,OAAA,GAAU,IAAA;AAAA,IACrB;AACA,IAAA,UAAA,CAAW,IAAI,CAAA;AAAA,EACjB,CAAA;AAEA,EAAA,uBACEC,KAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAA,KAAC,KAAA,EAAA,EAAI,SAAA,EAAW,qBAAqB,UAAA,GAAa,YAAA,GAAe,EAAE,CAAA,CAAA,EAChE,QAAA,EAAA;AAAA,MAAA,OAAA,oBACCD,GAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,sBAAA;AAAA,UACV,KAAA,EAAO;AAAA,YACL,QAAA,EAAU,OAAA;AAAA,YACV,MAAA,EAAQ,MAAA;AAAA;AAAA,YACR,MAAM,OAAA,CAAQ,IAAA;AAAA,YACd,SAAA,EAAW,kBAAA;AAAA,YACX,UAAA,EAAY,iBAAA;AAAA,YACZ,KAAA,EAAO,MAAA;AAAA,YACP,OAAA,EAAS,SAAA;AAAA,YACT,YAAA,EAAc,KAAA;AAAA,YACd,QAAA,EAAU,MAAA;AAAA,YACV,aAAA,EAAe,MAAA;AAAA,YACf,MAAA,EAAQ,GAAA;AAAA,YACR,UAAA,EAAY;AAAA,WACd;AAAA,UAEC,QAAA,EAAA,OAAA,CAAQ;AAAA;AAAA,OACX;AAAA,sBAEFA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,SAAA,EAAU,kBAAA;AAAA,UACV,OAAA,EAAS,MAAM,aAAA,CAAc,MAAM,CAAA;AAAA,UACnC,gBAAc,WAAA,KAAgB,MAAA;AAAA,UAC9B,YAAA,EAAc,CAAC,CAAA,KAAM,gBAAA,CAAiB,GAAG,cAAI,CAAA;AAAA,UAC7C,UAAA,EAAY,cAAA;AAAA,UACZ,aAAA,EAAe,cAAA;AAAA,UACf,KAAA,EAAM,cAAA;AAAA,UAEN,QAAA,kBAAAA,GAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAK,MAAA,EAAO;AAAA;AAAA,OACvB;AAAA,sBACAA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,SAAA,EAAU,kBAAA;AAAA,UACV,OAAA,EAAS,MAAM,aAAA,CAAc,QAAQ,CAAA;AAAA,UACrC,gBAAc,WAAA,KAAgB,QAAA;AAAA,UAC9B,YAAA,EAAc,CAAC,CAAA,KAAM,gBAAA,CAAiB,GAAG,cAAI,CAAA;AAAA,UAC7C,UAAA,EAAY,cAAA;AAAA,UACZ,aAAA,EAAe,cAAA;AAAA,UACf,KAAA,EAAM,cAAA;AAAA,UAEN,QAAA,kBAAAA,GAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAK,QAAA,EAAS;AAAA;AAAA,OACzB;AAAA,sBACAA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,SAAA,EAAU,kBAAA;AAAA,UACV,OAAA,EAAS,MAAM,aAAA,CAAc,UAAU,CAAA;AAAA,UACvC,gBAAc,WAAA,KAAgB,UAAA;AAAA,UAC9B,YAAA,EAAc,CAAC,CAAA,KAAM,gBAAA,CAAiB,GAAG,cAAI,CAAA;AAAA,UAC7C,UAAA,EAAY,cAAA;AAAA,UACZ,aAAA,EAAe,cAAA;AAAA,UACf,KAAA,EAAM,cAAA;AAAA,UAEN,QAAA,kBAAAA,GAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAK,SAAA,EAAU;AAAA;AAAA,OAC1B;AAAA,sBACAA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,SAAA,EAAU,kBAAA;AAAA,UACV,OAAA,EAAS,MAAM,aAAA,CAAc,OAAO,CAAA;AAAA,UACpC,gBAAc,WAAA,KAAgB,OAAA;AAAA,UAC9B,YAAA,EAAc,CAAC,CAAA,KAAM,gBAAA,CAAiB,GAAG,cAAI,CAAA;AAAA,UAC7C,UAAA,EAAY,cAAA;AAAA,UACZ,aAAA,EAAe,cAAA;AAAA,UACf,KAAA,EAAM,cAAA;AAAA,UAEN,QAAA,kBAAAA,GAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAK,KAAA,EAAM;AAAA;AAAA,OACtB;AAAA,sBACAA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,SAAA,EAAU,kBAAA;AAAA,UACV,OAAA,EAAS,MAAM,aAAA,CAAc,MAAM,CAAA;AAAA,UACnC,gBAAc,WAAA,KAAgB,MAAA;AAAA,UAC9B,YAAA,EAAc,CAAC,CAAA,KAAM,gBAAA,CAAiB,GAAG,cAAI,CAAA;AAAA,UAC7C,UAAA,EAAY,cAAA;AAAA,UACZ,aAAA,EAAe,cAAA;AAAA,UACf,KAAA,EAAM,cAAA;AAAA,UAEN,QAAA,kBAAAA,GAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAK,MAAA,EAAO;AAAA;AAAA;AACvB,KAAA,EACF,CAAA;AAAA,IAEC,WAAA,mBAAcA,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,uBAAA,EAAwB,OAAA,EAAS,cAAc,CAAA,GAAK,IAAA;AAAA,oBAElFC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,oBAAA,EAAuB,WAAA,GAAc,SAAA,GAAY,EAAE,CAAA,CAAA,EAAI,aAAA,EAAa,CAAC,WAAA,EACnF,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EACb,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EAA6B,QAAA,EAAA,WAAA,EAAY,CAAA;AAAA,wBACxDA,GAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,UAAS,SAAA,EAAU,kBAAA,EAAmB,OAAA,EAAS,YAAA,EAC1D,QAAA,kBAAAA,GAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAK,KAAI,CAAA,EACpB;AAAA,OAAA,EACF,CAAA;AAAA,sBACAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BAAA,EACZ,QAAA,EAAA;AAAA,QAAA,WAAA,KAAgB,MAAA,GACf,GAAA,CAAI,MAAA,mBACFD,GAAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO,GAAA;AAAA,YACP,QAAA,EAAU,CAAC,IAAA,KAAS;AAClB,cAAA,WAAA,CAAY,IAAI,CAAA;AAChB,cAAA,YAAA,EAAa;AAAA,YACf;AAAA;AAAA,4BAGFA,GAAAA,CAAC,SAAI,SAAA,EAAU,oBAAA,EAAqB,4CAAK,CAAA,GAEzC,IAAA;AAAA,QAEH,WAAA,KAAgB,QAAA,mBACfC,IAAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,0BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EACb,QAAA,EAAA;AAAA,4BAAAD,GAAAA;AAAA,cAAC,OAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAU,oBAAA;AAAA,gBACV,WAAA,EAAY,gCAAA;AAAA,gBACZ,OAAO,MAAA,CAAO,KAAA;AAAA,gBACd,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,kBAAA,MAAM,CAAA,GAAI,EAAE,MAAA,CAAO,KAAA;AACnB,kBAAA,mBAAA,CAAoB,CAAC,CAAA;AACrB,kBAAA,IAAI,CAAC,CAAA,CAAE,IAAA,EAAK,WAAY,EAAE,CAAA;AAAA,gBAC5B,CAAA;AAAA,gBACA,UAAU,MAAA,KAAW,OAAA;AAAA,gBACrB,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,kBAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,EAAS,QAAA,CAAS,OAAO,KAAK,CAAA;AAAA,gBAC9C;AAAA;AAAA,aACF;AAAA,4BACAA,GAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,WAAU,kBAAA,EAAmB,OAAA,EAAS,MAAM,QAAA,CAAS,OAAO,KAAK,CAAA,EAAG,QAAA,EAAU,MAAA,KAAW,SAAS,QAAA,EAAA,cAAA,EAExH;AAAA,WAAA,EACF,CAAA;AAAA,0BAEAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EACb,QAAA,EAAA;AAAA,4BAAAA,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,oBAAA,EACf,QAAA,EAAA;AAAA,8BAAAD,GAAAA;AAAA,gBAAC,OAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAK,UAAA;AAAA,kBACL,OAAA,EAAS,OAAA,CAAQ,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA;AAAA,kBACzC,QAAA,EAAU,CAAC,CAAA,KAAM,oBAAA,CAAqB,EAAE,SAAA,EAAW,CAAA,CAAE,MAAA,CAAO,OAAA,EAAS;AAAA;AAAA,eACvE;AAAA,cAAE;AAAA,aAAA,EAEJ,CAAA;AAAA,4BACAC,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,oBAAA,EACf,QAAA,EAAA;AAAA,8BAAAD,GAAAA;AAAA,gBAAC,OAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAK,UAAA;AAAA,kBACL,OAAA,EAAS,OAAA,CAAQ,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA;AAAA,kBAC1C,QAAA,EAAU,CAAC,CAAA,KAAM,oBAAA,CAAqB,EAAE,UAAA,EAAY,CAAA,CAAE,MAAA,CAAO,OAAA,EAAS;AAAA;AAAA,eACxE;AAAA,cAAE;AAAA,aAAA,EAEJ,CAAA;AAAA,4BACAC,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,oBAAA,EACf,QAAA,EAAA;AAAA,8BAAAD,GAAAA;AAAA,gBAAC,OAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAK,UAAA;AAAA,kBACL,OAAA,EAAS,OAAA,CAAQ,MAAA,CAAO,OAAA,CAAQ,eAAe,CAAA;AAAA,kBAC/C,QAAA,EAAU,CAAC,CAAA,KAAM,oBAAA,CAAqB,EAAE,eAAA,EAAiB,CAAA,CAAE,MAAA,CAAO,OAAA,EAAS;AAAA;AAAA,eAC7E;AAAA,cAAE;AAAA,aAAA,EAEJ;AAAA,WAAA,EACF,CAAA;AAAA,0BAEAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mBAAA,EACb,QAAA,EAAA;AAAA,4BAAAA,KAAC,MAAA,EAAA,EAAK,QAAA,EAAA;AAAA,cAAA,eAAA;AAAA,cAAI,MAAA,CAAO,eAAA;AAAA,cAAgB;AAAA,aAAA,EAAC,CAAA;AAAA,YACjC,OAAO,SAAA,mBAAYD,GAAAA,CAAC,MAAA,EAAA,EAAK,sCAAI,CAAA,GAAU,IAAA;AAAA,YACvC,MAAA,CAAO,SAAA,mBACNA,GAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,SAAA,EAAU,mBAAA,EAAoB,OAAA,EAAS,cAAA,EAAgB,QAAA,EAAA,cAAA,EAE7E,CAAA,GACE;AAAA,WAAA,EACN,CAAA;AAAA,UAEC,MAAA,CAAO,QAAQ,MAAA,mBACdA,IAAC,gBAAA,EAAA,EAAiB,OAAA,EAAS,MAAA,CAAO,OAAA,EAAS,QAAA,EAAU,oBAAA,EAAsB,oBAE3EA,GAAAA,CAAC,SAAI,SAAA,EAAU,oBAAA,EAAsB,iBAAO,KAAA,CAAM,IAAA,EAAK,GAAI,gCAAA,GAAU,sCAAA,EAAS;AAAA,SAAA,EAElF,CAAA,GACE,IAAA;AAAA,QAEH,WAAA,KAAgB,UAAA,mBACfC,IAAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,0BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mBAAA,EACb,QAAA,EAAA;AAAA,4BAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qBAAA,EACb,QAAA,EAAA,MAAA,KAAW,OAAA,GAAU,SAAA,IAAa,cAAA,GAAO,MAAA,KAAW,SAAA,GAAY,gCAAA,GAAU,cAAA,EAC7E,CAAA;AAAA,YACC,YAAA,mBAAeA,GAAAA,CAAC,MAAA,EAAA,EAAM,wBAAa,CAAA,GAAU;AAAA,WAAA,EAChD,CAAA;AAAA,0BACAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACb,QAAA,EAAA;AAAA,4BAAAD,GAAAA;AAAA,cAAC,OAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAU,oBAAA;AAAA,gBACV,IAAA,EAAK,OAAA;AAAA,gBACL,GAAA,EAAK,CAAA;AAAA,gBACL,GAAA,EAAK,GAAA;AAAA,gBACL,IAAA,EAAM,CAAA;AAAA,gBACN,KAAA,EAAO,gBAAA;AAAA,gBACP,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,kBAAA,WAAA,EAAY;AACZ,kBAAA,YAAA,CAAa,MAAA,CAAO,CAAA,CAAE,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,gBACrC,CAAA;AAAA,gBACA,WAAA,EAAa,CAAC,CAAA,KAAM;AAClB,kBAAA,MAAM,CAAA,GAAI,MAAA,CAAQ,CAAA,CAAE,MAAA,CAA4B,KAAK,CAAA;AACrD,kBAAA,SAAA,CAAU,CAAC,CAAA;AAAA,gBACb,CAAA;AAAA,gBACA,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,kBAAA,IAAI,CAAA,CAAE,QAAQ,OAAA,EAAS;AACvB,kBAAA,MAAM,CAAA,GAAI,MAAA,CAAQ,CAAA,CAAE,MAAA,CAA4B,KAAK,CAAA;AACrD,kBAAA,YAAA,CAAa,CAAC,CAAA;AAAA,gBAChB;AAAA;AAAA,aACF;AAAA,4BACAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gCAAA,EAAkC,QAAA,EAAA;AAAA,cAAA,gBAAA;AAAA,cAAiB;AAAA,aAAA,EAAC;AAAA,WAAA,EACrE;AAAA,SAAA,EACF,CAAA,GACE,IAAA;AAAA,QAEH,gBAAgB,OAAA,mBACfD,IAAC,QAAA,EAAA,EAAO,IAAA,EAAK,UAAS,SAAA,EAAU,kBAAA,EAAmB,OAAA,EAAS,MAAM,iBAAiB,CAAC,QAAQ,GACzF,QAAA,EAAA,QAAA,GAAW,gCAAA,GAAU,kCACxB,CAAA,GACE,IAAA;AAAA,QAEH,gBAAgB,MAAA,mBACfC,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,oBAAA,EACb,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,SAAA,EAAU,kBAAA,EAAmB,OAAA,EAAS,MAAM,gBAAA,CAAiB,QAAA,GAAW,EAAE,CAAA,EAAG,QAAA,EAAA,IAAA,EAEnG,CAAA;AAAA,0BACAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mBAAA,EAAqB,QAAA,EAAA;AAAA,YAAA,QAAA;AAAA,YAAS;AAAA,WAAA,EAAC,CAAA;AAAA,0BAC9CD,GAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,SAAA,EAAU,kBAAA,EAAmB,OAAA,EAAS,MAAM,gBAAA,CAAiB,QAAA,GAAW,EAAE,GAAG,QAAA,EAAA,IAAA,EAEnG;AAAA,SAAA,EACF,CAAA,GACE;AAAA,OAAA,EACN;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ,CAAA;AC9TA,IAAM,gBAAA,GAAmB,GAAA;AACzB,IAAM,cAAA,GAAiB,IAAA;AAEvB,IAAM,KAAA,GAAQ,CAAC,CAAA,EAAW,GAAA,EAAa,GAAA,KAAgB,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,CAAC,CAAC,CAAA;AAErF,IAAM,cAAA,GAAiB,IAAI,KAAA,KAAqC,KAAA,CAAM,OAAO,OAAO,CAAA,CAAE,KAAK,GAAG,CAAA;AAE9F,IAAM,iCAAA,GAAoC,CAAC,kBAAA,KAAsC;AAC/E,EAAA,IAAI,CAAC,oBAAoB,OAAO,IAAA;AAChC,EAAA,MAAM,SAAA,GAAY,kBAAA,CAAmB,KAAA,CAAM,kCAAkC,CAAA;AAC7E,EAAA,IAAI,SAAA,GAAY,CAAC,CAAA,EAAG;AAClB,IAAA,IAAI;AACF,MAAA,OAAO,mBAAmB,SAAA,CAAU,CAAC,EAAE,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAC,CAAA;AAAA,IAC9D,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,SAAA,CAAU,CAAC,CAAA,CAAE,OAAA,CAAQ,UAAU,EAAE,CAAA;AAAA,IAC1C;AAAA,EACF;AAEA,EAAA,MAAM,KAAA,GAAQ,kBAAA,CAAmB,KAAA,CAAM,yCAAyC,CAAA;AAChF,EAAA,OAAO,KAAA,GAAQ,CAAC,CAAA,IAAK,KAAA,GAAQ,CAAC,CAAA,IAAK,IAAA;AACrC,CAAA;AAEA,IAAM,qBAAA,GAAwB,CAAC,IAAA,KAAiB;AAC9C,EAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,EAAA,IAAI,CAAC,SAAS,OAAO,WAAA;AACrB,EAAA,IAAI,QAAQ,WAAA,EAAY,CAAE,QAAA,CAAS,OAAO,GAAG,OAAO,OAAA;AACpD,EAAA,IAAI,CAAC,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA,EAAG,OAAO,GAAG,OAAO,CAAA,KAAA,CAAA;AAC7C,EAAA,OAAO,OAAA;AACT,CAAA;AAEA,IAAM,kBAAA,GAAqB,CAAC,GAAA,KAAgB;AAC1C,EAAA,IAAI;AACF,IAAA,MAAM,IAAI,IAAI,GAAA,CAAI,GAAA,EAAK,MAAA,CAAO,SAAS,IAAI,CAAA;AAC3C,IAAA,MAAM,IAAA,GAAO,EAAE,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,GAAA,EAAI;AACvD,IAAA,OAAO,IAAA,GAAO,kBAAA,CAAmB,IAAI,CAAA,GAAI,IAAA;AAAA,EAC3C,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF,CAAA;AAEA,IAAM,kBAAA,GAAqB,OAAO,GAAA,EAAa,MAAA,KAAwB;AACrE,EAAA,MAAM,MAAM,MAAM,KAAA,CAAM,GAAA,EAAK,EAAE,QAAQ,CAAA;AACvC,EAAA,IAAI,CAAC,IAAI,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAAS,GAAA,CAAI,MAAM,CAAA,CAAA,CAAG,CAAA;AACnD,EAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAE5B,EAAA,MAAM,aAAa,iCAAA,CAAkC,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,qBAAqB,CAAC,CAAA;AAC3F,EAAA,MAAM,OAAA,GAAU,mBAAmB,GAAG,CAAA;AACtC,EAAA,MAAM,QAAA,GAAW,qBAAA,CAAsB,UAAA,IAAc,OAAA,IAAW,WAAW,CAAA;AAC3E,EAAA,MAAM,IAAA,GAAO,KAAK,IAAA,IAAQ,sBAAA;AAE1B,EAAA,OAAO,IAAI,KAAK,CAAC,IAAI,GAAG,QAAA,EAAU,EAAE,MAAM,CAAA;AAC5C,CAAA;AAUO,IAAM,WAAA,GAAc,UAAA,CAA0D,SAASE,YAAAA,CAC5F;AAAA,EACE,IAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,eAAA,GAAkB,GAAA;AAAA,EAClB,QAAA,EAAU,kBAAA;AAAA,EACV,gBAAA;AAAA,EACA,eAAA,GAAkB,KAAA;AAAA,EAClB,QAAA,EAAU,kBAAA;AAAA,EACV,gBAAA;AAAA,EACA,iBAAA,GAAoB,IAAA;AAAA,EACpB,uBAAuB,EAAE,SAAA,EAAW,OAAO,UAAA,EAAY,KAAA,EAAO,iBAAiB,KAAA,EAAM;AAAA,EACrF,OAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EACA,GAAA,EACA;AACA,EAAA,MAAM,OAAA,GAAUC,OAA8B,IAAI,CAAA;AAClD,EAAA,MAAM,aAAA,GAAgBA,OAA8B,IAAI,CAAA;AACxD,EAAA,MAAM,SAAA,GAAYA,OAAoD,IAAI,CAAA;AAE1E,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIC,SAAiD,MAAM,CAAA;AACnF,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAAiB,EAAE,CAAA;AACrD,EAAA,MAAM,CAAC,GAAA,EAAK,MAAM,CAAA,GAAIA,QAAAA,CAAoB,EAAE,CAAA;AAC5C,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,SAAS,KAAK,CAAA;AAClD,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,SAA8B,IAAI,CAAA;AAC1E,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,SAAS,CAAC,CAAA;AAEhD,EAAA,MAAM,CAAC,oBAAA,EAAsB,uBAAuB,CAAA,GAAIA,SAAS,eAAe,CAAA;AAChF,EAAA,MAAM,CAAC,oBAAA,EAAsB,uBAAuB,CAAA,GAAIA,SAAS,eAAe,CAAA;AAEhF,EAAA,MAAM,WAAW,kBAAA,IAAsB,oBAAA;AACvC,EAAA,MAAM,WAAW,kBAAA,IAAsB,oBAAA;AAEvC,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,QAAAA,CAAsB;AAAA,IAChD,KAAA,EAAO,EAAA;AAAA,IACP,OAAA,EAAS,oBAAA;AAAA,IACT,eAAA,EAAiB,CAAA;AAAA,IACjB,SAAA,EAAW,KAAA;AAAA,IACX,SAAS;AAAC,GACX,CAAA;AAED,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,SAAwC,SAAS,CAAA;AAC7E,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAIA,SAAS,KAAK,CAAA;AAC9D,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,SAA6B,IAAI,CAAA;AACvE,EAAA,MAAM,SAAA,GAAYD,OAAO,MAAM,CAAA;AAC/B,EAAA,MAAM,YAAA,GAAeA,MAAAA,iBAAO,IAAI,OAAA,EAAmB,CAAA;AACnD,EAAA,MAAM,UAAA,GAAaA,MAAAA,CAAO,EAAE,MAAA,EAAQ,GAAG,MAAA,EAAQ,CAAA,EAAG,OAAA,EAAS,CAAA,EAAG,UAAU,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,WAAA,EAAa,OAAO,CAAA;AAEjH,EAAA,MAAM,UAAA,GAAaE,OAAAA,CAAQ,MAAM,IAAA,CAAK,KAAA,CAAA,CAAO,YAAA,EAAc,QAAA,IAAY,CAAA,IAAK,GAAG,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAChG,EAAA,MAAM,gBAAA,GAAmB,YAAY,WAAA,GAAc,UAAA;AACnD,EAAA,MAAM,YAAA,GAAe,YAAA,EAAc,OAAA,EAAS,KAAA,IAAS,EAAA;AAGrD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,KAAK,OAAA,CAAQ,OAAA;AACnB,IAAA,IAAI,CAAC,EAAA,EAAI;AACT,IAAA,MAAM,EAAA,GAAK,IAAI,cAAA,CAAe,CAAC,OAAA,KAAY;AACzC,MAAA,MAAM,CAAA,GAAI,QAAQ,CAAC,CAAA,EAAG,aAAa,KAAA,IAAS,EAAA,CAAG,uBAAsB,CAAE,KAAA;AACvE,MAAA,MAAM,OAAO,CAAA,IAAK,gBAAA,GAAmB,QAAA,GAAW,CAAA,IAAK,iBAAiB,MAAA,GAAS,SAAA;AAC/E,MAAA,SAAA,CAAU,CAAC,IAAA,KAAU,IAAA,KAAS,IAAA,GAAO,OAAO,IAAK,CAAA;AAAA,IACnD,CAAC,CAAA;AACD,IAAA,EAAA,CAAG,QAAQ,EAAE,CAAA;AACb,IAAA,OAAO,MAAM,GAAG,UAAA,EAAW;AAAA,EAC7B,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,WAAW,QAAA,EAAU;AACzB,IAAA,cAAA,CAAe,IAAI,CAAA;AACnB,IAAA,mBAAA,CAAoB,KAAK,CAAA;AAAA,EAC3B,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,SAAA,CAAU,OAAA,GAAU,MAAA;AAAA,EACtB,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAA,MAAM,mBAAmB,WAAA,CAAY,MAAM,eAAe,IAAI,CAAA,EAAG,EAAE,CAAA;AAEnE,EAAA,MAAM,iBAAA,GAAoB,WAAA,CAAY,CAAC,KAAA,KAAuB;AAC5D,IAAA,mBAAA,CAAoB,IAAI,CAAA;AACxB,IAAA,cAAA,CAAe,CAAC,IAAA,KAAU,IAAA,KAAS,KAAA,GAAQ,OAAO,KAAM,CAAA;AAAA,EAC1D,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,aAAA,GAAgB,WAAA,CAAY,CAAC,CAAA,KAAoB;AACrD,IAAA,IAAI,SAAA,CAAU,YAAY,QAAA,EAAU;AACpC,IAAA,MAAM,IAAI,CAAA,CAAE,MAAA;AACZ,IAAA,IAAI,CAAC,CAAA,EAAG;AACR,IAAA,IAAI,EAAE,OAAA,CAAQ,oBAAoB,KAAK,CAAA,CAAE,OAAA,CAAQ,sBAAsB,CAAA,EAAG;AAC1E,IAAA,IAAI,CAAA,CAAE,OAAA,CAAQ,+EAA+E,CAAA,EAAG;AAChG,IAAA,UAAA,CAAW,QAAQ,QAAA,GAAW,IAAA;AAC9B,IAAA,UAAA,CAAW,QAAQ,KAAA,GAAQ,KAAA;AAC3B,IAAA,UAAA,CAAW,QAAQ,WAAA,GAAc,KAAA;AACjC,IAAA,UAAA,CAAW,OAAA,CAAQ,UAAU,CAAA,CAAE,SAAA;AAC/B,IAAA,UAAA,CAAW,OAAA,CAAQ,SAAS,CAAA,CAAE,OAAA;AAC9B,IAAA,UAAA,CAAW,OAAA,CAAQ,SAAS,CAAA,CAAE,OAAA;AAAA,EAChC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,aAAA,GAAgB,WAAA,CAAY,CAAC,CAAA,KAAoB;AACrD,IAAA,IAAI,CAAC,UAAA,CAAW,OAAA,CAAQ,QAAA,EAAU;AAClC,IAAA,MAAM,EAAA,GAAK,CAAA,CAAE,OAAA,GAAU,UAAA,CAAW,OAAA,CAAQ,MAAA;AAC1C,IAAA,MAAM,EAAA,GAAK,CAAA,CAAE,OAAA,GAAU,UAAA,CAAW,OAAA,CAAQ,MAAA;AAE1C,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,GAAI,CAAA,IAAK,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,GAAI,CAAA,EAAG,UAAA,CAAW,OAAA,CAAQ,KAAA,GAAQ,IAAA;AACrE,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,GAAI,CAAA,EAAG;AAEtB,IAAA,IAAI,KAAK,GAAA,CAAI,EAAE,IAAI,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,EAAG;AAC/B,MAAA,IAAI,KAAK,GAAA,CAAI,EAAE,KAAK,CAAA,EAAG,UAAA,CAAW,QAAQ,QAAA,GAAW,KAAA;AACrD,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,MAAM,GAAA,EAAK;AACb,MAAA,UAAA,CAAW,QAAQ,WAAA,GAAc,IAAA;AACjC,MAAA,UAAA,CAAW,QAAQ,QAAA,GAAW,KAAA;AAC9B,MAAA,mBAAA,CAAoB,IAAI,CAAA;AACxB,MAAA;AAAA,IACF;AACA,IAAA,IAAI,MAAM,EAAA,EAAI;AACZ,MAAA,UAAA,CAAW,QAAQ,WAAA,GAAc,IAAA;AACjC,MAAA,UAAA,CAAW,QAAQ,QAAA,GAAW,KAAA;AAC9B,MAAA,mBAAA,CAAoB,KAAK,CAAA;AACzB,MAAA,cAAA,CAAe,IAAI,CAAA;AAAA,IACrB;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,YAAA,GAAe,WAAA,CAAY,CAAC,CAAA,KAAoB;AACpD,IAAA,IAAI,SAAA,CAAU,YAAY,QAAA,EAAU;AAClC,MAAA,UAAA,CAAW,QAAQ,QAAA,GAAW,KAAA;AAC9B,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,UAAA,CAAW,QAAQ,WAAA,EAAa;AAClC,MAAA,UAAA,CAAW,QAAQ,QAAA,GAAW,KAAA;AAC9B,MAAA,UAAA,CAAW,QAAQ,KAAA,GAAQ,KAAA;AAC3B,MAAA,UAAA,CAAW,QAAQ,WAAA,GAAc,KAAA;AACjC,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,UAAA,CAAW,OAAA,CAAQ,QAAA,EAAU;AAChC,MAAA,UAAA,CAAW,QAAQ,KAAA,GAAQ,KAAA;AAC3B,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,EAAA,GAAK,CAAA,CAAE,OAAA,GAAU,UAAA,CAAW,OAAA,CAAQ,MAAA;AAC1C,IAAA,MAAM,EAAA,GAAK,CAAA,CAAE,OAAA,GAAU,UAAA,CAAW,OAAA,CAAQ,MAAA;AAC1C,IAAA,MAAM,EAAA,GAAK,CAAA,CAAE,SAAA,GAAY,UAAA,CAAW,OAAA,CAAQ,OAAA;AAC5C,IAAA,MAAM,KAAA,GAAQ,CAAC,UAAA,CAAW,OAAA,CAAQ,KAAA,IAAS,IAAA,CAAK,KAAA,CAAM,EAAA,EAAI,EAAE,CAAA,IAAK,EAAA,IAAM,EAAA,IAAM,GAAA;AAE7E,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,mBAAA,CAAoB,CAAC,IAAA,KAAS;AAC5B,QAAA,MAAM,OAAO,CAAC,IAAA;AACd,QAAA,IAAI,CAAC,IAAA,EAAM,cAAA,CAAe,IAAI,CAAA;AAC9B,QAAA,OAAO,IAAA;AAAA,MACT,CAAC,CAAA;AAAA,IACH;AAEA,IAAA,UAAA,CAAW,QAAQ,QAAA,GAAW,KAAA;AAC9B,IAAA,UAAA,CAAW,QAAQ,KAAA,GAAQ,KAAA;AAAA,EAC7B,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,OAAO,OAAA,CAAQ,OAAA;AACrB,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,IAAA,CAAK,gBAAA,CAAiB,eAAe,aAAa,CAAA;AAClD,IAAA,IAAA,CAAK,gBAAA,CAAiB,eAAe,aAAa,CAAA;AAClD,IAAA,IAAA,CAAK,gBAAA,CAAiB,aAAa,YAAY,CAAA;AAC/C,IAAA,IAAA,CAAK,gBAAA,CAAiB,iBAAiB,YAAY,CAAA;AAEnD,IAAA,OAAO,MAAM;AACX,MAAA,IAAA,CAAK,mBAAA,CAAoB,eAAe,aAAa,CAAA;AACrD,MAAA,IAAA,CAAK,mBAAA,CAAoB,eAAe,aAAa,CAAA;AACrD,MAAA,IAAA,CAAK,mBAAA,CAAoB,aAAa,YAAY,CAAA;AAClD,MAAA,IAAA,CAAK,mBAAA,CAAoB,iBAAiB,YAAY,CAAA;AAAA,IACxD,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,aAAA,EAAe,aAAA,EAAe,YAAY,CAAC,CAAA;AAE/C,EAAA,MAAM,mBAAA,GAAsB,WAAA;AAAA,IAC1B,CAAC,IAAA,KAAkB;AACjB,MAAA,IAAI,kBAAA,IAAsB,IAAA,EAAM,uBAAA,CAAwB,IAAI,CAAA;AAC5D,MAAA,gBAAA,GAAmB,IAAI,CAAA;AACvB,MAAA,SAAA,CAAU,OAAA,EAAS,YAAY,IAAI,CAAA;AAAA,IACrC,CAAA;AAAA,IACA,CAAC,oBAAoB,gBAAgB;AAAA,GACvC;AAEA,EAAA,MAAM,mBAAA,GAAsB,WAAA;AAAA,IAC1B,CAAC,IAAA,KAAiB;AAChB,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,EAAM,EAAA,EAAI,GAAG,CAAA;AAChC,MAAA,IAAI,kBAAA,IAAsB,IAAA,EAAM,uBAAA,CAAwB,IAAI,CAAA;AAC5D,MAAA,gBAAA,GAAmB,IAAI,CAAA;AACvB,MAAA,SAAA,CAAU,OAAA,EAAS,YAAY,IAAI,CAAA;AAAA,IACrC,CAAA;AAAA,IACA,CAAC,oBAAoB,gBAAgB;AAAA,GACvC;AAEA,EAAA,MAAM,YAAA,GAAe,YAAY,MAAM;AACrC,IAAA,UAAA,CAAW,KAAK,CAAA;AAChB,IAAA,aAAA,CAAc,KAAK,CAAA;AAAA,EACrB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,WAAA,GAAc,YAAY,MAAM;AACpC,IAAA,SAAA,CAAU,SAAS,CAAA;AACnB,IAAA,YAAA,CAAa,EAAE,CAAA;AACf,IAAA,MAAA,CAAO,EAAE,CAAA;AACT,IAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,IAAA,YAAA,CAAa,KAAK,CAAA;AAClB,IAAA,cAAA,CAAe,CAAC,CAAA;AAChB,IAAA,SAAA,CAAU,CAAC,IAAA,MAAU,EAAE,GAAG,IAAA,EAAM,OAAA,EAAS,EAAC,EAAG,eAAA,EAAiB,CAAA,EAAG,SAAA,EAAW,KAAA,EAAM,CAAE,CAAA;AAAA,EACtF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,cAAA,GAAiB,WAAA;AAAA,IACrB,OAAO,QAAA,KAAmB;AACxB,MAAA,MAAM,SAAS,SAAA,CAAU,OAAA;AACzB,MAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,MAAA,WAAA,EAAY;AAEZ,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,CAAO,KAAK,QAAQ,CAAA;AAC1B,QAAA,SAAA,CAAU,OAAO,CAAA;AAAA,MACnB,SAAS,CAAA,EAAQ;AACf,QAAA,SAAA,CAAU,OAAO,CAAA;AACjB,QAAA,YAAA,CAAa,GAAG,OAAA,GAAU,MAAA,CAAO,CAAA,CAAE,OAAO,IAAI,0BAAM,CAAA;AACpD,QAAA,OAAA,GAAU,CAAC,CAAA;AAAA,MACb;AAAA,IACF,CAAA;AAAA,IACA,CAAC,SAAS,WAAW;AAAA,GACvB;AAEA,EAAA,MAAM,SAAA,GAAY,WAAA;AAAA,IAChB,OAAO,KAAA,KAAkB;AACvB,MAAA,MAAM,SAAS,SAAA,CAAU,OAAA;AACzB,MAAA,MAAM,UAAA,GAAa,MAAM,IAAA,EAAK;AAE9B,MAAA,SAAA,CAAU,CAAC,IAAA,MAAU;AAAA,QACnB,GAAG,IAAA;AAAA,QACH,KAAA;AAAA,QACA,OAAA,EAAS,UAAA,GAAa,IAAA,CAAK,OAAA,GAAU,EAAC;AAAA,QACtC,eAAA,EAAiB,CAAA;AAAA,QACjB,SAAA,EAAW,QAAQ,UAAU;AAAA,OAC/B,CAAE,CAAA;AAEF,MAAA,IAAI,CAAC,MAAA,IAAU,CAAC,UAAA,EAAY;AAC1B,QAAA,MAAA,EAAQ,WAAA,EAAY;AACpB,QAAA;AAAA,MACF;AAEA,MAAA,MAAA,CAAO,YAAA,EAAa;AACpB,MAAA,IAAI;AACF,QAAA,MAAM,UAAU,MAAM,MAAA,CAAO,MAAA,CAAO,UAAA,EAAY,OAAO,OAAO,CAAA;AAC9D,QAAA,SAAA,CAAU,CAAC,IAAA,MAAU,EAAE,GAAG,IAAA,EAAM,SAAS,SAAA,EAAW,KAAA,EAAO,eAAA,EAAiB,GAAA,EAAI,CAAE,CAAA;AAAA,MACpF,SAAS,CAAA,EAAG;AACV,QAAA,SAAA,CAAU,CAAC,IAAA,MAAU,EAAE,GAAG,IAAA,EAAM,SAAA,EAAW,OAAM,CAAE,CAAA;AACnD,QAAA,OAAA,GAAU,CAAC,CAAA;AAAA,MACb;AAAA,IACF,CAAA;AAAA,IACA,CAAC,OAAA,EAAS,MAAA,CAAO,OAAO;AAAA,GAC1B;AAGA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,OAAO,aAAA,CAAc,OAAA;AAC3B,IAAA,IAAI,CAAC,IAAA,EAAM;AAEX,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,kBAAkB,IAAA,EAAM;AAAA,QACrC,QAAA;AAAA,QACA,QAAA;AAAA,QACA,OAAA,EAAS,CAAC,CAAA,KAAM,OAAA,GAAU,CAAC,CAAA;AAAA,QAC3B,OAAA,EAAS,CAAC,CAAA,KAAM,OAAA,GAAU,CAAC,CAAA;AAAA,QAC3B,UAAA,EAAY,CAAC,IAAA,KAAS;AACpB,UAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,UAAA,UAAA,GAAa,IAAI,CAAA;AAAA,QACnB,CAAA;AAAA,QACA,KAAA,EAAO,CAAC,KAAA,KAAU,MAAA,CAAO,KAAK,CAAA;AAAA,QAC9B,gBAAA,EAAkB,CAAC,IAAA,KAAS;AAC1B,UAAA,MAAM,IAAI,IAAA,CAAK,QAAA;AACf,UAAA,IAAI,OAAO,CAAA,KAAM,QAAA,EAAU,SAAA,CAAU,CAAC,IAAA,MAAU,EAAE,GAAG,IAAA,EAAM,iBAAiB,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,GAAG,GAAE,CAAE,CAAA;AAAA,QACpG,CAAA;AAAA,QACA,aAAA,EAAe,CAAC,GAAA,KAAQ;AACtB,UAAA,IAAI,YAAA,CAAa,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA,EAAG;AACnC,UAAA,YAAA,CAAa,OAAA,CAAQ,IAAI,GAAG,CAAA;AAC5B,UAAA,GAAA,CAAI,gBAAA,CAAiB,eAAe,aAAa,CAAA;AACjD,UAAA,GAAA,CAAI,gBAAA,CAAiB,eAAe,aAAa,CAAA;AACjD,UAAA,GAAA,CAAI,gBAAA,CAAiB,aAAa,YAAY,CAAA;AAC9C,UAAA,GAAA,CAAI,gBAAA,CAAiB,iBAAiB,YAAY,CAAA;AAAA,QACpD;AAAA,OACD,CAAA;AACD,MAAA,SAAA,CAAU,OAAA,GAAU,MAAA;AACpB,MAAA,SAAA,CAAU,OAAO,CAAA;AAAA,IACnB,SAAS,CAAA,EAAQ;AACf,MAAA,SAAA,CAAU,OAAO,CAAA;AACjB,MAAA,YAAA,CAAa,GAAG,OAAA,GAAU,MAAA,CAAO,CAAA,CAAE,OAAO,IAAI,gCAAO,CAAA;AACrD,MAAA,OAAA,GAAU,CAAC,CAAA;AACX,MAAA;AAAA,IACF;AAEA,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,CAAU,SAAS,OAAA,EAAQ;AAC3B,MAAA,SAAA,CAAU,OAAA,GAAU,IAAA;AAAA,IACtB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,UAAA,EAAY,OAAO,CAAC,CAAA;AAEjC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,KAAK,eAAe,IAAI,CAAA;AACxB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAU,SAAS,IAAA,EAAK;AAC9B,IAAA,IAAI,CAAC,OAAA,EAAS;AAEd,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,WAAA,EAAY;AACZ,IAAA,KAAA,CAAM,YAAY;AAChB,MAAA,IAAI;AACF,QAAA,MAAM,UAAA,GAAa,MAAM,kBAAA,CAAmB,OAAA,EAAS,WAAW,MAAM,CAAA;AACtE,QAAA,MAAM,eAAe,UAAU,CAAA;AAAA,MACjC,SAAS,CAAA,EAAQ;AACf,QAAA,IAAI,CAAA,EAAG,SAAS,YAAA,EAAc;AAC9B,QAAA,SAAA,CAAU,OAAO,CAAA;AACjB,QAAA,YAAA,CAAa,GAAG,OAAA,GAAU,MAAA,CAAO,CAAA,CAAE,OAAO,IAAI,0BAAM,CAAA;AACpD,QAAA,OAAA,GAAU,CAAC,CAAA;AAAA,MACb;AAAA,IACF,CAAA,GAAG;AAEH,IAAA,OAAO,MAAM,WAAW,KAAA,EAAM;AAAA,EAChC,GAAG,CAAC,IAAA,EAAM,SAAS,cAAA,EAAgB,OAAA,EAAS,WAAW,CAAC,CAAA;AAExD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,SAAA,CAAU,OAAA,EAAS,YAAY,QAAQ,CAAA;AAAA,EACzC,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,SAAA,CAAU,OAAA,EAAS,YAAY,QAAQ,CAAA;AAAA,EACzC,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAGb,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,iBAAA,EAAmB;AACxB,IAAA,MAAM,OAAO,OAAA,CAAQ,OAAA;AACrB,IAAA,IAAI,CAAC,IAAA,EAAM;AAEX,IAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAAqB;AAC1C,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,WAAA,EAAa,SAAA,CAAU,SAAS,QAAA,EAAS;AACvD,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,YAAA,EAAc,SAAA,CAAU,SAAS,QAAA,EAAS;AACxD,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,QAAA,EAAU,YAAA,EAAa;AAAA,IACvC,CAAA;AAEA,IAAA,IAAA,CAAK,gBAAA,CAAiB,WAAW,aAAa,CAAA;AAC9C,IAAA,OAAO,MAAM;AACX,MAAA,IAAA,CAAK,mBAAA,CAAoB,WAAW,aAAa,CAAA;AAAA,IACnD,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,YAAA,EAAc,iBAAiB,CAAC,CAAA;AAEpC,EAAA,mBAAA;AAAA,IACE,GAAA;AAAA,IACA,OAAO;AAAA,MACL,QAAA,EAAU,MAAM,SAAA,CAAU,OAAA,EAAS,QAAA,EAAS;AAAA,MAC5C,QAAA,EAAU,MAAM,SAAA,CAAU,OAAA,EAAS,QAAA,EAAS;AAAA,MAC5C,WAAA,EAAa,MAAM,SAAA,CAAU,OAAA,EAAS,WAAA,EAAY;AAAA,MAClD,WAAA,EAAa,MAAM,SAAA,CAAU,OAAA,EAAS,WAAA,EAAY;AAAA,MAClD,MAAM,CAAC,MAAA,KAAW,SAAA,CAAU,OAAA,EAAS,KAAK,MAAM,CAAA;AAAA,MAChD,cAAc,CAAC,IAAA,KAAS,SAAA,CAAU,OAAA,EAAS,aAAa,IAAI,CAAA;AAAA,MAC5D,MAAA,EAAQ,CAAC,CAAA,EAAG,CAAA,KAAO,UAAU,OAAA,GAAU,SAAA,CAAU,OAAA,CAAQ,MAAA,CAAO,GAAG,CAAC,CAAA,GAAI,OAAA,CAAQ,OAAA,CAAQ,EAAE,CAAA;AAAA,MAC1F,YAAA,EAAc,MAAM,SAAA,CAAU,OAAA,EAAS,YAAA,EAAa;AAAA,MACpD,WAAA,EAAa,MAAM,SAAA,CAAU,OAAA,EAAS,WAAA;AAAY,KACpD,CAAA;AAAA,IACA;AAAC,GACH;AAGA,EAAA,MAAM,kBAAkB,WAAA,CAAY,MAAM,aAAa,IAAI,CAAA,EAAG,EAAE,CAAA;AAChE,EAAA,MAAM,gBAAA,GAAmB,YAAY,CAAC,CAAA,KAAc,eAAe,CAAC,CAAA,EAAG,EAAE,CAAA;AACzE,EAAA,MAAM,aAAA,GAAgB,WAAA,CAAY,CAAC,CAAA,KAAc;AAC/C,IAAA,YAAA,CAAa,KAAK,CAAA;AAClB,IAAA,SAAA,CAAU,OAAA,EAAS,YAAA,CAAa,CAAA,GAAI,GAAG,CAAA;AAAA,EACzC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,eAAA,GAAkB,WAAA,CAAY,CAAC,IAAA,KAAkB;AACrD,IAAA,IAAI,IAAA,EAAM,SAAA,CAAU,OAAA,EAAS,IAAA,CAAK,IAAI,CAAA;AAAA,EACxC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,wBAAA,GAA2B,WAAA,CAAY,CAAC,GAAA,KAAgB;AAC5D,IAAA,IAAI,GAAA,EAAK,SAAA,CAAU,OAAA,EAAS,IAAA,CAAK,GAAG,CAAA;AAAA,EACtC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,uBACEJ,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,OAAA;AAAA,MACL,SAAA,EAAW,cAAA,CAAe,aAAA,EAAe,SAAS,CAAA;AAAA,MAClD,KAAA;AAAA,MACA,YAAA,EAAY,WAAW,MAAA,GAAS,OAAA;AAAA,MAChC,aAAA,EAAa,MAAA;AAAA,MACb,QAAA,EAAU,CAAA;AAAA,MAEV,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EAAsB,KAAK,aAAA,EAAe,CAAA;AAAA,QAExD,MAAA,KAAW,2BACVA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,UAAA,EAAY,gBAAA;AAAA,YACZ,WAAA,EAAa,WAAA;AAAA,YACb,aAAA,EAAe,iBAAA;AAAA,YACf,YAAA,EAAc,gBAAA;AAAA,YACd,GAAA;AAAA,YACA,MAAA;AAAA,YACA,MAAA;AAAA,YACA,SAAA;AAAA,YACA,YAAA;AAAA,YACA,gBAAA;AAAA,YACA,QAAA;AAAA,YACA,QAAA;AAAA,YACA,WAAA,EAAa,eAAA;AAAA,YACb,QAAA,EAAU,CAAC,CAAA,KAAM,KAAK,UAAU,CAAC,CAAA;AAAA,YACjC,mBAAA,EAAqB,CAAC,CAAA,KAAM,SAAA,CAAU,CAAC,IAAA,MAAU,EAAE,GAAG,IAAA,EAAM,KAAA,EAAO,CAAA,EAAE,CAAE,CAAA;AAAA,YACvE,sBAAsB,CAAC,GAAA,KAAQ,SAAA,CAAU,CAAC,UAAU,EAAE,GAAG,IAAA,EAAM,OAAA,EAAS,EAAE,GAAG,IAAA,CAAK,SAAS,GAAG,GAAA,IAAM,CAAE,CAAA;AAAA,YACtG,cAAA,EAAgB,MAAM,SAAA,CAAU,OAAA,EAAS,YAAA,EAAa;AAAA,YACtD,oBAAA,EAAsB,wBAAA;AAAA,YACtB,WAAA,EAAa,eAAA;AAAA,YACb,YAAA,EAAc,gBAAA;AAAA,YACd,SAAA,EAAW,aAAA;AAAA,YACX,YAAA,EAAc,aAAA;AAAA,YACd,gBAAA,EAAkB,mBAAA;AAAA,YAClB,gBAAA,EAAkB;AAAA;AAAA,SACpB,mBAEAC,IAAAA,CAAAK,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,0BAAAN,GAAAA;AAAA,YAAC,cAAA;AAAA,YAAA;AAAA,cACC,WAAA,EAAa,MAAM,UAAA,CAAW,IAAI,CAAA;AAAA,cAClC,cAAA,EAAgB,MAAM,aAAA,CAAc,IAAI,CAAA;AAAA,cACxC,aAAA,EAAe,MAAM,SAAA,CAAU,OAAA,EAAS,WAAA,EAAY;AAAA,cACpD,UAAA,EAAY,MAAM,SAAA,CAAU,OAAA,EAAS,QAAA,EAAS;AAAA,cAC9C,UAAA,EAAY,MAAM,SAAA,CAAU,OAAA,EAAS,QAAA,EAAS;AAAA,cAC9C,aAAA,EAAe,MAAM,SAAA,CAAU,OAAA,EAAS,WAAA,EAAY;AAAA,cACpD,QAAA;AAAA,cACA,gBAAA,EAAkB,MAAM,mBAAA,CAAoB,CAAC,QAAQ,CAAA;AAAA,cACrD,QAAA;AAAA,cACA,gBAAA,EAAkB;AAAA;AAAA,WACpB;AAAA,UAAA,CAEE,OAAA,IAAW,+BAAeA,GAAAA,CAAC,SAAI,SAAA,EAAU,sBAAA,EAAuB,SAAS,YAAA,EAAc,CAAA;AAAA,0BAEzFA,GAAAA;AAAA,YAAC,SAAA;AAAA,YAAA;AAAA,cACC,MAAA,EAAQ,OAAA;AAAA,cACR,OAAA,EAAS,MAAM,UAAA,CAAW,KAAK,CAAA;AAAA,cAC/B,GAAA;AAAA,cACA,QAAA,EAAU;AAAA;AAAA,WACZ;AAAA,0BAEAA,GAAAA;AAAA,YAAC,YAAA;AAAA,YAAA;AAAA,cACC,MAAA,EAAQ,UAAA;AAAA,cACR,OAAA,EAAS,MAAM,aAAA,CAAc,KAAK,CAAA;AAAA,cAClC,MAAA;AAAA,cACA,MAAA;AAAA,cACA,QAAA,EAAU,CAAC,CAAA,KAAM,KAAK,UAAU,CAAC,CAAA;AAAA,cACjC,aAAA,EAAe,CAAC,CAAA,KAAM,SAAA,CAAU,CAAC,IAAA,MAAU,EAAE,GAAG,IAAA,EAAM,KAAA,EAAO,CAAA,EAAE,CAAE,CAAA;AAAA,cACjE,gBAAgB,CAAC,GAAA,KAAQ,SAAA,CAAU,CAAC,UAAU,EAAE,GAAG,IAAA,EAAM,OAAA,EAAS,EAAE,GAAG,IAAA,CAAK,SAAS,GAAG,GAAA,IAAM,CAAE,CAAA;AAAA,cAChG,cAAA,EAAgB,MAAM,SAAA,CAAU,OAAA,EAAS,YAAA,EAAa;AAAA,cACtD,cAAA,EAAgB;AAAA;AAAA,WAClB;AAAA,0BAEAA,GAAAA;AAAA,YAAC,gBAAA;AAAA,YAAA;AAAA,cACC,MAAA;AAAA,cACA,SAAA;AAAA,cACA,YAAA;AAAA,cACA,gBAAA;AAAA,cACA,WAAA,EAAa,eAAA;AAAA,cACb,YAAA,EAAc,gBAAA;AAAA,cACd,SAAA,EAAW,aAAA;AAAA,cACX,YAAA,EAAc;AAAA;AAAA;AAChB,SAAA,EACF;AAAA;AAAA;AAAA,GAEJ;AAEJ,CAAC;;;ACriBD,qBAAA,EAAsB","file":"react.js","sourcesContent":["export const epubReaderCssText = `\n:root {\n --epub-reader-panel-bg: #ffffff;\n --epub-reader-panel-fg: #1f2937;\n --epub-reader-border: rgba(0, 0, 0, 0.12);\n --epub-reader-accent: #2563eb;\n --epub-reader-shadow: 0 10px 30px rgba(0, 0, 0, 0.2);\n --epub-reader-radius: 10px;\n --epub-reader-bottom-bar-height: 40px;\n}\n\n.epub-reader-icon {\n display: inline-block;\n vertical-align: middle;\n}\n\n.epub-reader[data-theme='dark'] {\n --epub-reader-panel-bg: #141414;\n --epub-reader-panel-fg: #e5e7eb;\n --epub-reader-border: rgba(255, 255, 255, 0.14);\n --epub-reader-accent: #60a5fa;\n --epub-reader-shadow: 0 10px 30px rgba(0, 0, 0, 0.5);\n}\n\n.epub-reader {\n position: relative;\n width: 100%;\n height: 100%;\n outline: none;\n overflow: hidden;\n}\n\n.epub-reader__viewer {\n width: 100%;\n height: calc(100% - var(--epub-reader-bottom-bar-height));\n background: var(--epub-reader-panel-bg);\n transition: background-color 0.2s ease;\n}\n\n.epub-reader__toolbar {\n position: absolute;\n top: 16px;\n right: 16px;\n z-index: 10;\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.epub-reader[data-layout='wide'] .epub-reader__toolbar {\n top: 50%;\n transform: translateY(-50%);\n}\n\n.epub-reader__panel {\n width: 88px;\n padding: 8px;\n border: 1px solid var(--epub-reader-border);\n border-radius: var(--epub-reader-radius);\n background: color-mix(in srgb, var(--epub-reader-panel-bg) 92%, transparent);\n color: var(--epub-reader-panel-fg);\n box-shadow: var(--epub-reader-shadow);\n backdrop-filter: blur(10px);\n display: flex;\n flex-direction: column;\n gap: 6px;\n align-items: stretch;\n}\n\n.epub-reader__btn {\n appearance: none;\n border: 1px solid var(--epub-reader-border);\n background: transparent;\n color: inherit;\n padding: 6px 8px;\n border-radius: 8px;\n font-size: 12px;\n line-height: 1;\n cursor: pointer;\n user-select: none;\n}\n\n.epub-reader__btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.epub-reader__btn:hover:not(:disabled) {\n border-color: color-mix(in srgb, var(--epub-reader-accent) 60%, var(--epub-reader-border));\n}\n\n.epub-reader__divider {\n height: 1px;\n background: var(--epub-reader-border);\n margin: 2px 0;\n}\n\n.epub-reader__font {\n text-align: center;\n font-size: 12px;\n font-weight: 700;\n color: var(--epub-reader-accent);\n padding: 2px 0;\n}\n\n.epub-reader__overlay {\n position: absolute;\n inset: 0;\n background: rgba(0, 0, 0, 0.35);\n z-index: 20;\n}\n\n.epub-reader__drawer {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 320px;\n background: var(--epub-reader-panel-bg);\n color: var(--epub-reader-panel-fg);\n border-right: 1px solid var(--epub-reader-border);\n transform: translateX(-100%);\n transition: transform 0.2s ease;\n z-index: 30;\n display: flex;\n flex-direction: column;\n}\n\n.epub-reader__drawer.right {\n left: auto;\n right: 0;\n border-right: none;\n border-left: 1px solid var(--epub-reader-border);\n transform: translateX(100%);\n}\n\n.epub-reader__drawer.is-open {\n transform: translateX(0);\n}\n\n.epub-reader__drawer-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n padding: 12px;\n border-bottom: 1px solid var(--epub-reader-border);\n}\n\n.epub-reader__drawer-title {\n font-size: 14px;\n font-weight: 700;\n}\n\n.epub-reader__drawer-body {\n padding: 12px;\n overflow: auto;\n flex: 1;\n}\n\n.epub-reader__empty {\n padding: 20px 8px;\n opacity: 0.7;\n text-align: center;\n font-size: 12px;\n}\n\n.epub-reader__toc-list {\n list-style: none;\n padding: 0;\n margin: 0;\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.epub-reader__toc-item {\n margin: 0;\n}\n\n.epub-reader__toc-btn {\n width: 100%;\n text-align: left;\n padding: 8px 10px;\n border-radius: 8px;\n border: 1px solid var(--epub-reader-border);\n background: transparent;\n color: inherit;\n cursor: pointer;\n}\n\n.epub-reader__toc-btn:hover {\n border-color: color-mix(in srgb, var(--epub-reader-accent) 60%, var(--epub-reader-border));\n}\n\n.epub-reader__toc-details {\n border-radius: 8px;\n}\n\n.epub-reader__toc-summary {\n padding: 8px 10px;\n border-radius: 8px;\n cursor: pointer;\n border: 1px solid var(--epub-reader-border);\n user-select: none;\n}\n\n.epub-reader__toc-details[open] > .epub-reader__toc-summary {\n border-color: color-mix(in srgb, var(--epub-reader-accent) 60%, var(--epub-reader-border));\n}\n\n.epub-reader__toc-details > .epub-reader__toc-list {\n padding-left: 12px;\n margin-top: 6px;\n}\n\n.epub-reader__field {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.epub-reader__input {\n width: 100%;\n padding: 8px 10px;\n border-radius: 8px;\n border: 1px solid var(--epub-reader-border);\n background: transparent;\n color: inherit;\n outline: none;\n}\n\n.epub-reader__checks {\n display: flex;\n flex-wrap: wrap;\n gap: 10px;\n margin: 10px 0;\n font-size: 12px;\n}\n\n.epub-reader__check {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n user-select: none;\n}\n\n.epub-reader__meta {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n font-size: 12px;\n opacity: 0.9;\n margin: 6px 0 10px;\n}\n\n.epub-reader__link {\n appearance: none;\n border: none;\n background: transparent;\n color: var(--epub-reader-accent);\n cursor: pointer;\n padding: 0;\n}\n\n.epub-reader__search-list {\n list-style: none;\n padding: 0;\n margin: 0;\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.epub-reader__search-item {\n margin: 0;\n}\n\n.epub-reader__search-btn {\n width: 100%;\n text-align: left;\n padding: 10px;\n border-radius: 10px;\n border: 1px solid var(--epub-reader-border);\n background: transparent;\n color: inherit;\n cursor: pointer;\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.epub-reader__search-btn:hover {\n border-color: color-mix(in srgb, var(--epub-reader-accent) 60%, var(--epub-reader-border));\n}\n\n.epub-reader__search-label {\n font-size: 12px;\n opacity: 0.7;\n}\n\n.epub-reader__search-excerpt {\n font-size: 12px;\n line-height: 1.4;\n word-break: break-word;\n}\n\n.epub-reader__bottom {\n position: absolute;\n left: 0;\n right: 0;\n bottom: 0;\n height: var(--epub-reader-bottom-bar-height);\n border-top: 1px solid var(--epub-reader-border);\n background: color-mix(in srgb, var(--epub-reader-panel-bg) 92%, transparent);\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 10px;\n padding: 0 12px;\n z-index: 10;\n backdrop-filter: blur(10px);\n}\n\n.epub-reader__bottom-left {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n}\n\n.epub-reader__status {\n font-size: 12px;\n opacity: 0.8;\n white-space: nowrap;\n}\n\n.epub-reader__section {\n font-size: 12px;\n font-weight: 600;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 280px;\n}\n\n.epub-reader__bottom-right {\n display: flex;\n align-items: center;\n gap: 10px;\n min-width: 260px;\n}\n\n.epub-reader__range {\n width: 260px;\n}\n\n.epub-reader__percent {\n font-size: 12px;\n font-variant-numeric: tabular-nums;\n min-width: 42px;\n text-align: right;\n}\n\n.epub-reader[data-layout='mobile'] .epub-reader__viewer {\n height: 100%;\n touch-action: pan-x;\n}\n\n.epub-reader[data-layout='mobile'] .epub-reader__toolbar,\n.epub-reader[data-layout='mobile'] .epub-reader__bottom,\n.epub-reader[data-layout='mobile'] .epub-reader__drawer,\n.epub-reader[data-layout='mobile'] .epub-reader__overlay {\n display: none;\n}\n\n.epub-reader__mbar {\n position: absolute;\n left: 10px;\n right: 10px;\n bottom: 0;\n z-index: 15;\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px;\n border: 1px solid var(--epub-reader-border);\n border-radius: calc(var(--epub-reader-radius) + 6px);\n background: color-mix(in srgb, var(--epub-reader-panel-bg) 92%, transparent);\n color: var(--epub-reader-panel-fg);\n box-shadow: var(--epub-reader-shadow);\n backdrop-filter: blur(10px);\n transform: translateY(calc(100% + 10px));\n transition: transform 0.2s ease;\n}\n\n.epub-reader__mbar.is-visible {\n transform: translateY(-4px);\n}\n\n.epub-reader__mbar .epub-reader__btn {\n flex: 1 1 0;\n text-align: center;\n padding: 10px 8px;\n font-size: 13px;\n}\n\n.epub-reader__moverlay {\n position: absolute;\n inset: 0;\n background: rgba(0, 0, 0, 0.35);\n z-index: 20;\n}\n\n.epub-reader__msheet {\n position: absolute;\n left: 0;\n right: 0;\n bottom: 0;\n height: 60%;\n max-height: calc(100% - 70px);\n background: var(--epub-reader-panel-bg);\n color: var(--epub-reader-panel-fg);\n border-top: 1px solid var(--epub-reader-border);\n border-top-left-radius: calc(var(--epub-reader-radius) + 10px);\n border-top-right-radius: calc(var(--epub-reader-radius) + 10px);\n transform: translateY(100%);\n transition: transform 0.25s ease;\n z-index: 30;\n display: flex;\n flex-direction: column;\n pointer-events: none;\n}\n\n.epub-reader__msheet.is-open {\n transform: translateY(0);\n pointer-events: auto;\n}\n\n.epub-reader__msheet-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n padding: 12px 12px 10px;\n border-bottom: 1px solid var(--epub-reader-border);\n}\n\n.epub-reader__msheet-title {\n font-size: 14px;\n font-weight: 800;\n}\n\n.epub-reader__msheet-body {\n padding: 12px;\n overflow: auto;\n flex: 1;\n}\n\n.epub-reader__mprogress {\n display: flex;\n flex-direction: column;\n gap: 10px;\n margin-top: 10px;\n}\n\n.epub-reader__mprogress .epub-reader__range {\n width: 100%;\n}\n\n.epub-reader__mprogress-percent {\n text-align: center;\n font-weight: 800;\n color: var(--epub-reader-accent);\n}\n\n.epub-reader__mfont {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 12px;\n}\n\n`\n","import { epubReaderCssText } from './epub-reader.cssText.js'\n\nconst STYLE_ELEMENT_ID = 'somecat-epub-reader-style'\n\nexport const ensureEpubReaderStyle = () => {\n if (typeof document === 'undefined') return\n if (document.getElementById(STYLE_ELEMENT_ID)) return\n\n const style = document.createElement('style')\n style.id = STYLE_ELEMENT_ID\n style.textContent = epubReaderCssText\n\n ;(document.head ?? document.documentElement).append(style)\n}\n\n","import 'foliate-js/view.js'\r\nimport type { EBookReaderHandle, EBookReaderOptions, ProgressInfo, SearchOptions, SearchResult, TocItem } from './types.js'\r\n\r\ntype FoliateViewElement = HTMLElement & {\r\n book?: { toc?: TocItem[] }\r\n renderer?: {\r\n prevSection?: () => void\r\n nextSection?: () => void\r\n setStyles?: (css: string) => void\r\n render?: () => void\r\n expand?: () => void\r\n }\r\n open?: (file: File) => Promise<void>\r\n init?: (options?: unknown) => Promise<void>\r\n goLeft?: () => void\r\n goRight?: () => void\r\n goTo?: (target: string) => Promise<void> | void\r\n goToFraction?: (fraction: number) => Promise<void> | void\r\n search?: (options: unknown) => AsyncIterable<unknown>\r\n clearSearch?: () => void\r\n}\r\n\r\nconst getContentCSS = (fontSize: number, isDark: boolean, extraCSS?: string) => `\r\n@namespace epub \"http://www.idpf.org/2007/ops\";\r\nhtml {\r\n color-scheme: ${isDark ? 'dark' : 'light'} !important;\r\n}\r\nbody {\r\n background-color: transparent !important;\r\n color: ${isDark ? '#e0e0e0' : 'black'} !important;\r\n font-size: ${fontSize}% !important;\r\n}\r\np {\r\n line-height: 1.6;\r\n margin-bottom: 1em;\r\n}\r\na {\r\n color: ${isDark ? '#64b5f6' : '#2563eb'} !important;\r\n}\r\nimg {\r\n max-width: 100%;\r\n height: auto;\r\n object-fit: contain;\r\n ${isDark ? 'filter: brightness(0.8) contrast(1.2);' : ''}\r\n}\r\n${extraCSS ?? ''}\r\n`\r\n\r\nexport function createEBookReader(container: HTMLElement, options: EBookReaderOptions = {}): EBookReaderHandle {\r\n if (!container) throw new Error('container is required')\r\n if (!customElements.get('foliate-view')) throw new Error('foliate-view is not defined')\r\n\r\n const {\r\n darkMode: initialDarkMode = false,\r\n fontSize: initialFontSize = 100,\r\n extraContentCSS,\r\n onReady,\r\n onError,\r\n onProgress,\r\n onToc,\r\n onSearchProgress,\r\n onContentLoad,\r\n } = options\r\n\r\n let destroyed = false\r\n let toc: TocItem[] = []\r\n let fontSize = initialFontSize\r\n let darkMode = initialDarkMode\r\n let searchToken = 0\r\n\r\n container.innerHTML = ''\r\n\r\n const viewer = document.createElement('foliate-view') as FoliateViewElement\r\n viewer.style.display = 'block'\r\n viewer.style.width = '100%'\r\n viewer.style.height = '100%'\r\n viewer.setAttribute('margin', '48')\r\n viewer.setAttribute('gap', '0.07')\r\n\r\n const applyStyles = () => {\r\n if (destroyed) return\r\n if (!viewer.renderer?.setStyles) return\r\n viewer.renderer.setStyles(getContentCSS(fontSize, darkMode, extraContentCSS))\r\n requestAnimationFrame(() => {\r\n setTimeout(() => {\r\n if (destroyed) return\r\n viewer.renderer?.render?.()\r\n viewer.renderer?.expand?.()\r\n }, 50)\r\n })\r\n }\r\n\r\n const handleLoad = (e: Event) => {\r\n applyStyles()\r\n const detail = (e as CustomEvent).detail as { doc?: Document } | undefined\r\n if (detail?.doc) onContentLoad?.(detail.doc)\r\n }\r\n\r\n const handleRelocate = (e: Event) => {\r\n const detail = (e as CustomEvent).detail as ProgressInfo\r\n onProgress?.(detail)\r\n }\r\n\r\n viewer.addEventListener('load', handleLoad as EventListener)\r\n viewer.addEventListener('relocate', handleRelocate as EventListener)\r\n\r\n container.appendChild(viewer)\r\n\r\n const handle: EBookReaderHandle = {\r\n async open(file) {\r\n if (destroyed) return\r\n if (!file) return\r\n\r\n try {\r\n viewer.clearSearch?.()\r\n searchToken++\r\n\r\n await viewer.open?.(file)\r\n\r\n const nextToc = viewer.book?.toc ?? []\r\n toc = nextToc\r\n onToc?.(toc)\r\n\r\n await viewer.init?.({ showTextStart: true })\r\n applyStyles()\r\n } catch (error) {\r\n onError?.(error)\r\n throw error\r\n }\r\n },\r\n destroy() {\r\n if (destroyed) return\r\n destroyed = true\r\n searchToken++\r\n viewer.removeEventListener('load', handleLoad)\r\n viewer.removeEventListener('relocate', handleRelocate as EventListener)\r\n container.innerHTML = ''\r\n },\r\n prevPage() {\r\n viewer.goLeft?.()\r\n },\r\n nextPage() {\r\n viewer.goRight?.()\r\n },\r\n prevSection() {\r\n viewer.renderer?.prevSection?.()\r\n },\r\n nextSection() {\r\n viewer.renderer?.nextSection?.()\r\n },\r\n goTo(target) {\r\n if (!target) return\r\n viewer.goTo?.(target)\r\n },\r\n goToFraction(fraction) {\r\n const safe = Math.min(1, Math.max(0, fraction))\r\n viewer.goToFraction?.(safe)\r\n },\r\n setDarkMode(nextDarkMode) {\r\n darkMode = nextDarkMode\r\n applyStyles()\r\n },\r\n setFontSize(nextFontSize) {\r\n const safe = Math.min(300, Math.max(50, nextFontSize))\r\n fontSize = safe\r\n applyStyles()\r\n },\r\n async search(query, opts: SearchOptions = {}) {\r\n const normalized = query.trim()\r\n if (!normalized) {\r\n viewer.clearSearch?.()\r\n return []\r\n }\r\n\r\n const token = ++searchToken\r\n const results: SearchResult[] = []\r\n\r\n try {\r\n for await (const item of viewer.search?.({\r\n query: normalized,\r\n matchCase: Boolean(opts.matchCase),\r\n matchWholeWords: Boolean(opts.wholeWords),\r\n matchDiacritics: Boolean(opts.matchDiacritics),\r\n }) ?? []) {\r\n if (destroyed || token !== searchToken) return results\r\n\r\n if (item === 'done') {\r\n onSearchProgress?.({ done: true, progress: 1 })\r\n break\r\n }\r\n\r\n if (typeof item === 'object' && item && 'progress' in (item as any)) {\r\n const progress = (item as any).progress\r\n if (typeof progress === 'number') onSearchProgress?.({ progress })\r\n continue\r\n }\r\n\r\n const anyItem = item as any\r\n if (anyItem?.subitems?.length) {\r\n for (const sub of anyItem.subitems) {\r\n results.push({\r\n label: anyItem.label,\r\n cfi: sub?.cfi,\r\n excerpt: sub?.excerpt,\r\n title: sub?.title,\r\n })\r\n }\r\n } else if (anyItem?.cfi) {\r\n results.push({\r\n cfi: anyItem.cfi,\r\n excerpt: anyItem.excerpt,\r\n title: anyItem.title,\r\n })\r\n }\r\n }\r\n } catch (error) {\r\n onError?.(error)\r\n throw error\r\n }\r\n\r\n return results\r\n },\r\n cancelSearch() {\r\n searchToken++\r\n },\r\n clearSearch() {\r\n viewer.clearSearch?.()\r\n },\r\n getToc() {\r\n return toc\r\n },\r\n }\r\n\r\n onReady?.(handle)\r\n return handle\r\n}\r\n","export const icons: Record<string, string> = {\n list: '<path d=\"M3 12h18M3 6h18M3 18h18\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>',\n search: '<path d=\"M11 19a8 8 0 1 0 0-16 8 8 0 0 0 0 16zM21 21l-4.35-4.35\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>',\n 'chevron-left': '<path d=\"M15 18l-6-6 6-6\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>',\n 'chevron-right': '<path d=\"M9 18l6-6-6-6\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>',\n 'chevrons-left': '<path d=\"M11 17l-5-5 5-5M18 17l-5-5 5-5\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>',\n 'chevrons-right': '<path d=\"M13 17l5-5-5-5M6 17l5-5-5-5\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>',\n sun: '<circle cx=\"12\" cy=\"12\" r=\"5\" stroke=\"currentColor\" stroke-width=\"2\"/><path d=\"M12 1v2M12 21v2M4.22 4.22l1.42 1.42M18.36 18.36l1.42 1.42M1 12h2M21 12h2M4.22 19.78l1.42-1.42M18.36 5.64l1.42-1.42\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"/>',\n moon: '<path d=\"M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>',\n plus: '<path d=\"M12 5v14M5 12h14\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>',\n minus: '<path d=\"M5 12h14\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>',\n x: '<path d=\"M18 6L6 18M6 6l12 12\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>',\n type: '<path d=\"M4 7V4h16v3M9 20h6M12 4v16\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>',\n sliders: '<path d=\"M4 21v-7M4 10V3M12 21v-9M12 8V3M20 21v-5M20 12V3M1 14h6M9 8h6M17 16h6\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>'\n}\n","import { useMemo } from 'react'\nimport { icons } from '../../core/icons'\n\nexport type SvgIconProps = {\n name: string\n size?: number | string\n color?: string\n className?: string\n}\n\nexport const SvgIcon = ({ name, size = 24, color = 'currentColor', className }: SvgIconProps) => {\n const iconPath = icons[name] || ''\n\n const style = useMemo(() => {\n const sizeVal = typeof size === 'number' ? `${size}px` : size\n return {\n width: sizeVal,\n height: sizeVal,\n color: color,\n minWidth: sizeVal,\n display: 'inline-block',\n verticalAlign: 'middle',\n }\n }, [size, color])\n\n if (!iconPath) return null\n\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n style={style}\n className={className}\n dangerouslySetInnerHTML={{ __html: iconPath }}\n />\n )\n}\n","import { SvgIcon } from './SvgIcon'\r\n\r\ntype DesktopToolbarProps = {\r\n onToggleToc: () => void\r\n onToggleSearch: () => void\r\n onPrevSection: () => void\r\n onPrevPage: () => void\r\n onNextPage: () => void\r\n onNextSection: () => void\r\n darkMode: boolean\r\n onToggleDarkMode: () => void\r\n fontSize: number\r\n onFontSizeChange: (size: number) => void\r\n}\r\n\r\n/**\r\n * 桌面端工具栏组件\r\n */\r\nexport const DesktopToolbar = ({\r\n onToggleToc,\r\n onToggleSearch,\r\n onPrevSection,\r\n onPrevPage,\r\n onNextPage,\r\n onNextSection,\r\n darkMode,\r\n onToggleDarkMode,\r\n fontSize,\r\n onFontSizeChange,\r\n}: DesktopToolbarProps) => {\r\n return (\r\n <div className=\"epub-reader__toolbar\">\r\n <div className=\"epub-reader__panel\">\r\n <button type=\"button\" className=\"epub-reader__btn\" onClick={onToggleToc} title=\"目录\">\r\n <SvgIcon name=\"list\" />\r\n </button>\r\n <button type=\"button\" className=\"epub-reader__btn\" onClick={onToggleSearch} title=\"搜索\">\r\n <SvgIcon name=\"search\" />\r\n </button>\r\n <div className=\"epub-reader__divider\" />\r\n <button type=\"button\" className=\"epub-reader__btn\" onClick={onPrevSection} title=\"上一章\">\r\n <SvgIcon name=\"chevrons-left\" />\r\n </button>\r\n <button type=\"button\" className=\"epub-reader__btn\" onClick={onPrevPage} title=\"上一页\">\r\n <SvgIcon name=\"chevron-left\" />\r\n </button>\r\n <button type=\"button\" className=\"epub-reader__btn\" onClick={onNextPage} title=\"下一页\">\r\n <SvgIcon name=\"chevron-right\" />\r\n </button>\r\n <button type=\"button\" className=\"epub-reader__btn\" onClick={onNextSection} title=\"下一章\">\r\n <SvgIcon name=\"chevrons-right\" />\r\n </button>\r\n </div>\r\n\r\n <div className=\"epub-reader__panel\">\r\n <button type=\"button\" className=\"epub-reader__btn\" onClick={onToggleDarkMode} title=\"主题\">\r\n <SvgIcon name={darkMode ? 'sun' : 'moon'} />\r\n </button>\r\n <div className=\"epub-reader__divider\" />\r\n <button type=\"button\" className=\"epub-reader__btn\" onClick={() => onFontSizeChange(fontSize + 10)} title=\"增大字号\">\r\n <SvgIcon name=\"plus\" />\r\n </button>\r\n <div className=\"epub-reader__font\">{fontSize}%</div>\r\n <button type=\"button\" className=\"epub-reader__btn\" onClick={() => onFontSizeChange(fontSize - 10)} title=\"减小字号\">\r\n <SvgIcon name=\"minus\" />\r\n </button>\r\n </div>\r\n </div>\r\n )\r\n}\r\n","type DesktopBottomBarProps = {\n status: 'idle' | 'ready' | 'opening' | 'error'\n errorText: string\n sectionLabel: string\n displayedPercent: number\n onSeekStart: () => void\n onSeekChange: (val: number) => void\n onSeekEnd: (val: number) => void\n onSeekCommit: (val: number) => void\n}\n\n/**\n * 桌面端底部栏组件 (进度条)\n */\nexport const DesktopBottomBar = ({\n status,\n errorText,\n sectionLabel,\n displayedPercent,\n onSeekStart,\n onSeekChange,\n onSeekEnd,\n onSeekCommit,\n}: DesktopBottomBarProps) => {\n return (\n <div className=\"epub-reader__bottom\">\n <div className=\"epub-reader__bottom-left\">\n <span className=\"epub-reader__status\">\n {status === 'error' ? errorText || '错误' : status === 'opening' ? '正在打开…' : '就绪'}\n </span>\n {sectionLabel ? <span className=\"epub-reader__section\">{sectionLabel}</span> : null}\n </div>\n <div className=\"epub-reader__bottom-right\">\n <input\n className=\"epub-reader__range\"\n type=\"range\"\n min={0}\n max={100}\n step={1}\n value={displayedPercent}\n onChange={(e) => {\n onSeekStart()\n onSeekChange(Number(e.target.value))\n }}\n onPointerUp={(e) => {\n const v = Number((e.target as HTMLInputElement).value)\n onSeekEnd(v)\n }}\n onKeyUp={(e) => {\n if (e.key !== 'Enter') return\n const v = Number((e.target as HTMLInputElement).value)\n onSeekCommit(v)\n }}\n />\n <span className=\"epub-reader__percent\">{displayedPercent}%</span>\n </div>\n </div>\n )\n}\n","import type { TocItem } from '../../core/types.js'\r\n\r\ntype TocTreeProps = {\r\n items: TocItem[]\r\n onSelect: (href?: string) => void\r\n}\r\n\r\n/**\r\n * 目录树组件\r\n * 递归渲染目录项\r\n */\r\nexport const TocTree = ({ items, onSelect }: TocTreeProps) => {\r\n return (\r\n <ul className=\"epub-reader__toc-list\">\r\n {items.map((item, idx) => {\r\n const key = item.href || `${item.label ?? 'item'}-${idx}`\r\n const hasChildren = Boolean(item.subitems?.length)\r\n const label = item.label || item.href || '未命名'\r\n\r\n if (!hasChildren) {\r\n return (\r\n <li key={key} className=\"epub-reader__toc-item\">\r\n <button type=\"button\" className=\"epub-reader__toc-btn\" onClick={() => onSelect(item.href)}>\r\n {label}\r\n </button>\r\n </li>\r\n )\r\n }\r\n\r\n return (\r\n <li key={key} className=\"epub-reader__toc-item\">\r\n <details className=\"epub-reader__toc-details\">\r\n <summary className=\"epub-reader__toc-summary\">{label}</summary>\r\n <TocTree items={item.subitems ?? []} onSelect={onSelect} />\r\n </details>\r\n </li>\r\n )\r\n })}\r\n </ul>\r\n )\r\n}\r\n","import type { TocItem } from '../../core/types.js'\nimport { TocTree } from './TocTree'\nimport { SvgIcon } from './SvgIcon'\n\ntype TocDrawerProps = {\n isOpen: boolean\n onClose: () => void\n toc: TocItem[]\n onSelect: (href?: string) => void\n}\n\n/**\n * 目录侧边栏组件\n */\nexport const TocDrawer = ({ isOpen, onClose, toc, onSelect }: TocDrawerProps) => {\n return (\n <aside className={`epub-reader__drawer ${isOpen ? 'is-open' : ''}`} aria-hidden={!isOpen}>\n <div className=\"epub-reader__drawer-header\">\n <div className=\"epub-reader__drawer-title\">目录</div>\n <button type=\"button\" className=\"epub-reader__btn\" onClick={onClose}>\n <SvgIcon name=\"x\" />\n </button>\n </div>\n <div className=\"epub-reader__drawer-body\">\n {toc.length ? (\n <TocTree\n items={toc}\n onSelect={(href) => {\n onSelect(href)\n onClose()\n }}\n />\n ) : (\n <div className=\"epub-reader__empty\">未找到目录</div>\n )}\n </div>\n </aside>\n )\n}\n","import type { SearchResult } from '../../core/types.js'\n\ntype SearchResultListProps = {\n results: SearchResult[]\n onSelect: (cfi: string) => void\n}\n\n/**\n * 搜索结果列表组件\n */\nexport const SearchResultList = ({ results, onSelect }: SearchResultListProps) => {\n return (\n <ul className=\"epub-reader__search-list\">\n {results.map((r, idx) => (\n <li key={`${r.cfi ?? 'no-cfi'}-${idx}`} className=\"epub-reader__search-item\">\n <button\n type=\"button\"\n className=\"epub-reader__search-btn\"\n onClick={() => {\n if (r.cfi) onSelect(r.cfi)\n }}\n >\n {r.label ? <div className=\"epub-reader__search-label\">{r.label}</div> : null}\n <div className=\"epub-reader__search-excerpt\">\n {typeof r.excerpt === 'string'\n ? r.excerpt\n : `${r.excerpt?.pre ?? ''}${r.excerpt?.match ?? ''}${r.excerpt?.post ?? ''}`}\n </div>\n </button>\n </li>\n ))}\n </ul>\n )\n}\n","import type { SearchState } from '../types.js'\nimport { SearchResultList } from './SearchResultList'\nimport { SvgIcon } from './SvgIcon'\n\ntype SearchDrawerProps = {\n isOpen: boolean\n onClose: () => void\n status: 'idle' | 'ready' | 'opening' | 'error'\n search: SearchState\n onSearch: (query: string) => void\n onQueryChange: (query: string) => void\n onOptionChange: (opt: Partial<SearchState['options']>) => void\n onCancelSearch: () => void\n onResultSelect: (cfi: string) => void\n}\n\n/**\n * 搜索侧边栏组件\n */\nexport const SearchDrawer = ({\n isOpen,\n onClose,\n status,\n search,\n onSearch,\n onQueryChange,\n onOptionChange,\n onCancelSearch,\n onResultSelect,\n}: SearchDrawerProps) => {\n return (\n <aside className={`epub-reader__drawer right ${isOpen ? 'is-open' : ''}`} aria-hidden={!isOpen}>\n <div className=\"epub-reader__drawer-header\">\n <div className=\"epub-reader__drawer-title\">搜索</div>\n <button type=\"button\" className=\"epub-reader__btn\" onClick={onClose}>\n <SvgIcon name=\"x\" />\n </button>\n </div>\n <div className=\"epub-reader__drawer-body\">\n <div className=\"epub-reader__field\">\n <input\n className=\"epub-reader__input\"\n placeholder=\"输入关键词\"\n value={search.query}\n onChange={(e) => {\n const v = e.target.value\n onQueryChange(v)\n if (!v.trim()) onSearch('')\n }}\n disabled={status !== 'ready'}\n onKeyDown={(e) => {\n if (e.key === 'Enter') onSearch(search.query)\n }}\n />\n <button type=\"button\" className=\"epub-reader__btn\" onClick={() => onSearch(search.query)} disabled={status !== 'ready'}>\n <SvgIcon name=\"search\" />\n </button>\n </div>\n\n <div className=\"epub-reader__checks\">\n <label className=\"epub-reader__check\">\n <input\n type=\"checkbox\"\n checked={Boolean(search.options.matchCase)}\n onChange={(e) => onOptionChange({ matchCase: e.target.checked })}\n />\n 区分大小写\n </label>\n <label className=\"epub-reader__check\">\n <input\n type=\"checkbox\"\n checked={Boolean(search.options.wholeWords)}\n onChange={(e) => onOptionChange({ wholeWords: e.target.checked })}\n />\n 全词匹配\n </label>\n <label className=\"epub-reader__check\">\n <input\n type=\"checkbox\"\n checked={Boolean(search.options.matchDiacritics)}\n onChange={(e) => onOptionChange({ matchDiacritics: e.target.checked })}\n />\n 区分变音\n </label>\n </div>\n\n <div className=\"epub-reader__meta\">\n <span>进度 {search.progressPercent}%</span>\n {search.searching ? <span>搜索中…</span> : null}\n {search.searching ? (\n <button type=\"button\" className=\"epub-reader__link\" onClick={onCancelSearch}>\n 取消\n </button>\n ) : null}\n </div>\n\n {search.results.length ? (\n <SearchResultList results={search.results} onSelect={onResultSelect} />\n ) : (\n <div className=\"epub-reader__empty\">{search.query.trim() ? '无匹配结果' : '请输入关键词'}</div>\n )}\n </div>\n </aside>\n )\n}\n","import { useState, useRef } from 'react'\r\nimport type { TocItem } from '../../core/types.js'\r\nimport type { MobilePanel, SearchState } from '../types.js'\r\nimport { TocTree } from './TocTree'\r\nimport { SearchResultList } from './SearchResultList'\r\nimport { SvgIcon } from './SvgIcon'\r\n\r\ntype MobileUIProps = {\r\n barVisible: boolean\r\n activePanel: MobilePanel | null\r\n onTogglePanel: (panel: MobilePanel) => void\r\n onClosePanel: () => void\r\n \r\n // Data props\r\n toc: TocItem[]\r\n search: SearchState\r\n status: 'idle' | 'ready' | 'opening' | 'error'\r\n errorText: string\r\n sectionLabel: string\r\n displayedPercent: number\r\n darkMode: boolean\r\n fontSize: number\r\n \r\n // Actions\r\n onTocSelect: (href?: string) => void\r\n \r\n onSearch: (query: string) => void\r\n onSearchQueryChange: (query: string) => void\r\n onSearchOptionChange: (opt: Partial<SearchState['options']>) => void\r\n onCancelSearch: () => void\r\n onSearchResultSelect: (cfi: string) => void\r\n \r\n onSeekStart: () => void\r\n onSeekChange: (val: number) => void\r\n onSeekEnd: (val: number) => void\r\n onSeekCommit: (val: number) => void\r\n \r\n onToggleDarkMode: (val: boolean) => void\r\n onFontSizeChange: (val: number) => void\r\n}\r\n\r\n/**\r\n * 移动端 UI 组件\r\n * 包含底部导航栏和弹出面板\r\n */\r\nexport const MobileUI = ({\r\n barVisible,\r\n activePanel,\r\n onTogglePanel,\r\n onClosePanel,\r\n toc,\r\n search,\r\n status,\r\n errorText,\r\n sectionLabel,\r\n displayedPercent,\r\n darkMode,\r\n fontSize,\r\n onTocSelect,\r\n onSearch,\r\n onSearchQueryChange,\r\n onSearchOptionChange,\r\n onCancelSearch,\r\n onSearchResultSelect,\r\n onSeekStart,\r\n onSeekChange,\r\n onSeekEnd,\r\n onSeekCommit,\r\n onToggleDarkMode,\r\n onFontSizeChange,\r\n}: MobileUIProps) => {\r\n const mobileTitle = activePanel === 'menu' ? '目录' : activePanel === 'search' ? '搜索' : activePanel === 'progress' ? '进度' : activePanel === 'theme' ? '明暗' : activePanel === 'font' ? '字号' : ''\r\n\r\n const [tooltip, setTooltip] = useState<{ text: string, left: number } | null>(null)\r\n const timerRef = useRef<number | null>(null)\r\n\r\n const handleTouchStart = (e: React.TouchEvent, text: string) => {\r\n const rect = e.currentTarget.getBoundingClientRect()\r\n // 长按 500ms 后显示提示\r\n timerRef.current = window.setTimeout(() => {\r\n setTooltip({\r\n text,\r\n left: rect.left + rect.width / 2\r\n })\r\n }, 500)\r\n }\r\n\r\n const handleTouchEnd = () => {\r\n if (timerRef.current) {\r\n clearTimeout(timerRef.current)\r\n timerRef.current = null\r\n }\r\n setTooltip(null)\r\n }\r\n\r\n return (\r\n <>\r\n <div className={`epub-reader__mbar ${barVisible ? 'is-visible' : ''}`}>\r\n {tooltip && (\r\n <div \r\n className=\"epub-reader__tooltip\" \r\n style={{ \r\n position: 'fixed', \r\n bottom: '60px', // 位于工具栏上方\r\n left: tooltip.left,\r\n transform: 'translateX(-50%)',\r\n background: 'rgba(0,0,0,0.8)',\r\n color: '#fff',\r\n padding: '4px 8px',\r\n borderRadius: '4px',\r\n fontSize: '12px',\r\n pointerEvents: 'none',\r\n zIndex: 1000,\r\n whiteSpace: 'nowrap'\r\n }}\r\n >\r\n {tooltip.text}\r\n </div>\r\n )}\r\n <button \r\n type=\"button\" \r\n className=\"epub-reader__btn\" \r\n onClick={() => onTogglePanel('menu')} \r\n aria-pressed={activePanel === 'menu'}\r\n onTouchStart={(e) => handleTouchStart(e, '目录')}\r\n onTouchEnd={handleTouchEnd}\r\n onTouchCancel={handleTouchEnd}\r\n title=\"目录\"\r\n >\r\n <SvgIcon name=\"list\" />\r\n </button>\r\n <button \r\n type=\"button\" \r\n className=\"epub-reader__btn\" \r\n onClick={() => onTogglePanel('search')} \r\n aria-pressed={activePanel === 'search'}\r\n onTouchStart={(e) => handleTouchStart(e, '搜索')}\r\n onTouchEnd={handleTouchEnd}\r\n onTouchCancel={handleTouchEnd}\r\n title=\"搜索\"\r\n >\r\n <SvgIcon name=\"search\" />\r\n </button>\r\n <button \r\n type=\"button\" \r\n className=\"epub-reader__btn\" \r\n onClick={() => onTogglePanel('progress')} \r\n aria-pressed={activePanel === 'progress'}\r\n onTouchStart={(e) => handleTouchStart(e, '进度')}\r\n onTouchEnd={handleTouchEnd}\r\n onTouchCancel={handleTouchEnd}\r\n title=\"进度\"\r\n >\r\n <SvgIcon name=\"sliders\" />\r\n </button>\r\n <button \r\n type=\"button\" \r\n className=\"epub-reader__btn\" \r\n onClick={() => onTogglePanel('theme')} \r\n aria-pressed={activePanel === 'theme'}\r\n onTouchStart={(e) => handleTouchStart(e, '明暗')}\r\n onTouchEnd={handleTouchEnd}\r\n onTouchCancel={handleTouchEnd}\r\n title=\"明暗\"\r\n >\r\n <SvgIcon name=\"sun\" />\r\n </button>\r\n <button \r\n type=\"button\" \r\n className=\"epub-reader__btn\" \r\n onClick={() => onTogglePanel('font')} \r\n aria-pressed={activePanel === 'font'}\r\n onTouchStart={(e) => handleTouchStart(e, '字号')}\r\n onTouchEnd={handleTouchEnd}\r\n onTouchCancel={handleTouchEnd}\r\n title=\"字号\"\r\n >\r\n <SvgIcon name=\"type\" />\r\n </button>\r\n </div>\r\n\r\n {activePanel ? <div className=\"epub-reader__moverlay\" onClick={onClosePanel} /> : null}\r\n\r\n <div className={`epub-reader__msheet ${activePanel ? 'is-open' : ''}`} aria-hidden={!activePanel}>\r\n <div className=\"epub-reader__msheet-header\">\r\n <div className=\"epub-reader__msheet-title\">{mobileTitle}</div>\r\n <button type=\"button\" className=\"epub-reader__btn\" onClick={onClosePanel}>\r\n <SvgIcon name=\"x\" />\r\n </button>\r\n </div>\r\n <div className=\"epub-reader__msheet-body\">\r\n {activePanel === 'menu' ? (\r\n toc.length ? (\r\n <TocTree\r\n items={toc}\r\n onSelect={(href) => {\r\n onTocSelect(href)\r\n onClosePanel()\r\n }}\r\n />\r\n ) : (\r\n <div className=\"epub-reader__empty\">未找到目录</div>\r\n )\r\n ) : null}\r\n\r\n {activePanel === 'search' ? (\r\n <>\r\n <div className=\"epub-reader__field\">\r\n <input\r\n className=\"epub-reader__input\"\r\n placeholder=\"输入关键词\"\r\n value={search.query}\r\n onChange={(e) => {\r\n const v = e.target.value\r\n onSearchQueryChange(v)\r\n if (!v.trim()) onSearch('')\r\n }}\r\n disabled={status !== 'ready'}\r\n onKeyDown={(e) => {\r\n if (e.key === 'Enter') onSearch(search.query)\r\n }}\r\n />\r\n <button type=\"button\" className=\"epub-reader__btn\" onClick={() => onSearch(search.query)} disabled={status !== 'ready'}>\r\n 搜索\r\n </button>\r\n </div>\r\n\r\n <div className=\"epub-reader__checks\">\r\n <label className=\"epub-reader__check\">\r\n <input\r\n type=\"checkbox\"\r\n checked={Boolean(search.options.matchCase)}\r\n onChange={(e) => onSearchOptionChange({ matchCase: e.target.checked })}\r\n />\r\n 区分大小写\r\n </label>\r\n <label className=\"epub-reader__check\">\r\n <input\r\n type=\"checkbox\"\r\n checked={Boolean(search.options.wholeWords)}\r\n onChange={(e) => onSearchOptionChange({ wholeWords: e.target.checked })}\r\n />\r\n 全词匹配\r\n </label>\r\n <label className=\"epub-reader__check\">\r\n <input\r\n type=\"checkbox\"\r\n checked={Boolean(search.options.matchDiacritics)}\r\n onChange={(e) => onSearchOptionChange({ matchDiacritics: e.target.checked })}\r\n />\r\n 区分变音\r\n </label>\r\n </div>\r\n\r\n <div className=\"epub-reader__meta\">\r\n <span>进度 {search.progressPercent}%</span>\r\n {search.searching ? <span>搜索中…</span> : null}\r\n {search.searching ? (\r\n <button type=\"button\" className=\"epub-reader__link\" onClick={onCancelSearch}>\r\n 取消\r\n </button>\r\n ) : null}\r\n </div>\r\n\r\n {search.results.length ? (\r\n <SearchResultList results={search.results} onSelect={onSearchResultSelect} />\r\n ) : (\r\n <div className=\"epub-reader__empty\">{search.query.trim() ? '无匹配结果' : '请输入关键词'}</div>\r\n )}\r\n </>\r\n ) : null}\r\n\r\n {activePanel === 'progress' ? (\r\n <>\r\n <div className=\"epub-reader__meta\">\r\n <span className=\"epub-reader__status\">\r\n {status === 'error' ? errorText || '错误' : status === 'opening' ? '正在打开…' : '就绪'}\r\n </span>\r\n {sectionLabel ? <span>{sectionLabel}</span> : null}\r\n </div>\r\n <div className=\"epub-reader__mprogress\">\r\n <input\r\n className=\"epub-reader__range\"\r\n type=\"range\"\r\n min={0}\r\n max={100}\r\n step={1}\r\n value={displayedPercent}\r\n onChange={(e) => {\r\n onSeekStart()\r\n onSeekChange(Number(e.target.value))\r\n }}\r\n onPointerUp={(e) => {\r\n const v = Number((e.target as HTMLInputElement).value)\r\n onSeekEnd(v)\r\n }}\r\n onKeyUp={(e) => {\r\n if (e.key !== 'Enter') return\r\n const v = Number((e.target as HTMLInputElement).value)\r\n onSeekCommit(v)\r\n }}\r\n />\r\n <div className=\"epub-reader__mprogress-percent\">{displayedPercent}%</div>\r\n </div>\r\n </>\r\n ) : null}\r\n\r\n {activePanel === 'theme' ? (\r\n <button type=\"button\" className=\"epub-reader__btn\" onClick={() => onToggleDarkMode(!darkMode)}>\r\n {darkMode ? '切换到亮色' : '切换到暗黑'}\r\n </button>\r\n ) : null}\r\n\r\n {activePanel === 'font' ? (\r\n <div className=\"epub-reader__mfont\">\r\n <button type=\"button\" className=\"epub-reader__btn\" onClick={() => onFontSizeChange(fontSize - 10)}>\r\n A-\r\n </button>\r\n <div className=\"epub-reader__font\">{fontSize}%</div>\r\n <button type=\"button\" className=\"epub-reader__btn\" onClick={() => onFontSizeChange(fontSize + 10)}>\r\n A+\r\n </button>\r\n </div>\r\n ) : null}\r\n </div>\r\n </div>\r\n </>\r\n )\r\n}\r\n","import { forwardRef, useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react'\r\nimport { createEBookReader } from '../core/reader.js'\r\nimport type { ProgressInfo, TocItem } from '../core/types.js'\r\nimport type { EBookReaderReactHandle, EBookReaderReactProps, SearchState, MobilePanel } from './types.js'\r\nimport { DesktopToolbar } from './components/DesktopToolbar'\r\nimport { DesktopBottomBar } from './components/DesktopBottomBar'\r\nimport { TocDrawer } from './components/TocDrawer'\r\nimport { SearchDrawer } from './components/SearchDrawer'\r\nimport { MobileUI } from './components/MobileUI'\r\n\r\nconst MOBILE_MAX_WIDTH = 768\r\nconst WIDE_MIN_WIDTH = 1024\r\n\r\nconst clamp = (n: number, min: number, max: number) => Math.min(max, Math.max(min, n))\r\n\r\nconst mergeClassName = (...parts: Array<string | undefined>) => parts.filter(Boolean).join(' ')\r\n\nconst getFileNameFromContentDisposition = (contentDisposition: string | null) => {\n if (!contentDisposition) return null\n const starMatch = contentDisposition.match(/filename\\*\\s*=\\s*UTF-8''([^;]+)/i)\n if (starMatch?.[1]) {\n try {\n return decodeURIComponent(starMatch[1].replace(/^\"|\"$/g, ''))\n } catch {\n return starMatch[1].replace(/^\"|\"$/g, '')\n }\n }\n\n const match = contentDisposition.match(/filename\\s*=\\s*(?:\"([^\"]+)\"|([^;\\s]+))/i)\n return match?.[1] ?? match?.[2] ?? null\n}\n\nconst normalizeEpubFileName = (name: string) => {\n const trimmed = name.trim()\n if (!trimmed) return 'book.epub'\n if (trimmed.toLowerCase().endsWith('.epub')) return trimmed\n if (!trimmed.includes('.')) return `${trimmed}.epub`\n return trimmed\n}\n\nconst getFileNameFromUrl = (url: string) => {\n try {\n const u = new URL(url, window.location.href)\n const last = u.pathname.split('/').filter(Boolean).pop()\n return last ? decodeURIComponent(last) : null\n } catch {\n return null\n }\n}\n\nconst downloadEpubAsFile = async (url: string, signal: AbortSignal) => {\n const res = await fetch(url, { signal })\n if (!res.ok) throw new Error(`下载失败 (${res.status})`)\n const blob = await res.blob()\n\n const headerName = getFileNameFromContentDisposition(res.headers.get('content-disposition'))\n const urlName = getFileNameFromUrl(url)\n const fileName = normalizeEpubFileName(headerName ?? urlName ?? 'book.epub')\n const type = blob.type || 'application/epub+zip'\n\n return new File([blob], fileName, { type })\n}\n\r\n/**\r\n * EBookReader 组件\r\n *\r\n * 核心阅读器组件,负责:\r\n * 1. 管理核心 Reader 实例 (createEBookReader)\r\n * 2. 管理 UI 状态 (布局、弹窗、搜索状态等)\r\n * 3. 分发事件和数据给子组件 (Desktop/Mobile)\r\n */\r\nexport const EBookReader = forwardRef<EBookReaderReactHandle, EBookReaderReactProps>(function EBookReader(\r\n {\r\n file,\r\n fileUrl,\n className,\r\n style,\r\n defaultFontSize = 100,\r\n fontSize: controlledFontSize,\r\n onFontSizeChange,\r\n defaultDarkMode = false,\r\n darkMode: controlledDarkMode,\r\n onDarkModeChange,\r\n enableKeyboardNav = true,\r\n defaultSearchOptions = { matchCase: false, wholeWords: false, matchDiacritics: false },\r\n onReady,\r\n onError,\r\n onProgress,\r\n },\r\n ref,\r\n) {\r\n const rootRef = useRef<HTMLDivElement | null>(null)\r\n const viewerHostRef = useRef<HTMLDivElement | null>(null)\r\n const readerRef = useRef<ReturnType<typeof createEBookReader> | null>(null)\r\n\r\n const [status, setStatus] = useState<'idle' | 'ready' | 'opening' | 'error'>('idle')\r\n const [errorText, setErrorText] = useState<string>('')\r\n const [toc, setToc] = useState<TocItem[]>([])\r\n const [tocOpen, setTocOpen] = useState(false)\r\n const [searchOpen, setSearchOpen] = useState(false)\r\n const [progressInfo, setProgressInfo] = useState<ProgressInfo | null>(null)\r\n const [isSeeking, setIsSeeking] = useState(false)\r\n const [seekPercent, setSeekPercent] = useState(0)\r\n\r\n const [uncontrolledFontSize, setUncontrolledFontSize] = useState(defaultFontSize)\r\n const [uncontrolledDarkMode, setUncontrolledDarkMode] = useState(defaultDarkMode)\r\n\r\n const fontSize = controlledFontSize ?? uncontrolledFontSize\r\n const darkMode = controlledDarkMode ?? uncontrolledDarkMode\r\n\r\n const [search, setSearch] = useState<SearchState>({\r\n query: '',\r\n options: defaultSearchOptions,\r\n progressPercent: 0,\r\n searching: false,\r\n results: [],\r\n })\r\n\r\n const [layout, setLayout] = useState<'mobile' | 'default' | 'wide'>('default')\r\n const [mobileBarVisible, setMobileBarVisible] = useState(false)\r\n const [mobilePanel, setMobilePanel] = useState<MobilePanel | null>(null)\r\n const layoutRef = useRef(layout)\r\n const boundDocsRef = useRef(new WeakSet<Document>())\r\n const gestureRef = useRef({ startX: 0, startY: 0, startAt: 0, tracking: false, moved: false, actionTaken: false })\r\n\r\n const percentage = useMemo(() => Math.round((progressInfo?.fraction ?? 0) * 100), [progressInfo])\r\n const displayedPercent = isSeeking ? seekPercent : percentage\r\n const sectionLabel = progressInfo?.tocItem?.label ?? ''\r\n\r\n // 监听容器大小变化,切换布局模式\r\n useEffect(() => {\r\n const el = rootRef.current\r\n if (!el) return\r\n const ro = new ResizeObserver((entries) => {\r\n const w = entries[0]?.contentRect?.width ?? el.getBoundingClientRect().width\r\n const next = w <= MOBILE_MAX_WIDTH ? 'mobile' : w >= WIDE_MIN_WIDTH ? 'wide' : 'default'\r\n setLayout((prev) => (prev === next ? prev : next))\r\n })\r\n ro.observe(el)\r\n return () => ro.disconnect()\r\n }, [])\r\n\r\n // 布局切换时重置移动端面板状态\r\n useEffect(() => {\r\n if (layout === 'mobile') return\r\n setMobilePanel(null)\r\n setMobileBarVisible(false)\r\n }, [layout])\r\n\r\n useEffect(() => {\r\n layoutRef.current = layout\r\n }, [layout])\r\n\r\n const closeMobileSheet = useCallback(() => setMobilePanel(null), [])\r\n\r\n const toggleMobilePanel = useCallback((panel: MobilePanel) => {\r\n setMobileBarVisible(true)\r\n setMobilePanel((prev) => (prev === panel ? null : panel))\r\n }, [])\r\n\r\n const onPointerDown = useCallback((e: PointerEvent) => {\r\n if (layoutRef.current !== 'mobile') return\r\n const t = e.target as HTMLElement | null\r\n if (!t) return\r\n if (t.closest('.epub-reader__mbar') || t.closest('.epub-reader__msheet')) return\r\n if (t.closest('a,button,input,textarea,select,label,[role=\"button\"],[contenteditable=\"true\"]')) return\r\n gestureRef.current.tracking = true\r\n gestureRef.current.moved = false\r\n gestureRef.current.actionTaken = false\r\n gestureRef.current.startAt = e.timeStamp\r\n gestureRef.current.startX = e.screenX\r\n gestureRef.current.startY = e.screenY\r\n }, [])\r\n\r\n const onPointerMove = useCallback((e: PointerEvent) => {\r\n if (!gestureRef.current.tracking) return\r\n const dx = e.screenX - gestureRef.current.startX\r\n const dy = e.screenY - gestureRef.current.startY\r\n\r\n if (Math.abs(dx) > 8 || Math.abs(dy) > 8) gestureRef.current.moved = true\r\n if (Math.abs(dy) < 8) return\r\n\r\n if (Math.abs(dy) < Math.abs(dx)) {\r\n if (Math.abs(dx) >= 8) gestureRef.current.tracking = false\r\n return\r\n }\r\n\r\n if (dy <= -24) {\r\n gestureRef.current.actionTaken = true\r\n gestureRef.current.tracking = false\r\n setMobileBarVisible(true)\r\n return\r\n }\r\n if (dy >= 24) {\r\n gestureRef.current.actionTaken = true\r\n gestureRef.current.tracking = false\r\n setMobileBarVisible(false)\r\n setMobilePanel(null)\r\n }\r\n }, [])\r\n\r\n const onPointerEnd = useCallback((e: PointerEvent) => {\r\n if (layoutRef.current !== 'mobile') {\r\n gestureRef.current.tracking = false\r\n return\r\n }\r\n\r\n if (gestureRef.current.actionTaken) {\r\n gestureRef.current.tracking = false\r\n gestureRef.current.moved = false\r\n gestureRef.current.actionTaken = false\r\n return\r\n }\r\n\r\n if (!gestureRef.current.tracking) {\r\n gestureRef.current.moved = false\r\n return\r\n }\r\n\r\n const dx = e.screenX - gestureRef.current.startX\r\n const dy = e.screenY - gestureRef.current.startY\r\n const dt = e.timeStamp - gestureRef.current.startAt\r\n const isTap = !gestureRef.current.moved && Math.hypot(dx, dy) <= 10 && dt <= 300\r\n\r\n if (isTap) {\r\n setMobileBarVisible((prev) => {\r\n const next = !prev\r\n if (!next) setMobilePanel(null)\r\n return next\r\n })\r\n }\r\n\r\n gestureRef.current.tracking = false\r\n gestureRef.current.moved = false\r\n }, [])\r\n\r\n useEffect(() => {\r\n const root = rootRef.current\r\n if (!root) return\r\n root.addEventListener('pointerdown', onPointerDown)\r\n root.addEventListener('pointermove', onPointerMove)\r\n root.addEventListener('pointerup', onPointerEnd)\r\n root.addEventListener('pointercancel', onPointerEnd)\r\n\r\n return () => {\r\n root.removeEventListener('pointerdown', onPointerDown)\r\n root.removeEventListener('pointermove', onPointerMove)\r\n root.removeEventListener('pointerup', onPointerEnd)\r\n root.removeEventListener('pointercancel', onPointerEnd)\r\n }\r\n }, [onPointerDown, onPointerMove, onPointerEnd])\r\n\r\n const setDarkModeInternal = useCallback(\r\n (next: boolean) => {\r\n if (controlledDarkMode == null) setUncontrolledDarkMode(next)\r\n onDarkModeChange?.(next)\r\n readerRef.current?.setDarkMode(next)\r\n },\r\n [controlledDarkMode, onDarkModeChange],\r\n )\r\n\r\n const setFontSizeInternal = useCallback(\r\n (next: number) => {\r\n const safe = clamp(next, 50, 300)\r\n if (controlledFontSize == null) setUncontrolledFontSize(safe)\r\n onFontSizeChange?.(safe)\r\n readerRef.current?.setFontSize(safe)\r\n },\r\n [controlledFontSize, onFontSizeChange],\r\n )\r\n\r\n const closeDrawers = useCallback(() => {\r\n setTocOpen(false)\r\n setSearchOpen(false)\r\n }, [])\r\n\n const prepareOpen = useCallback(() => {\n setStatus('opening')\n setErrorText('')\n setToc([])\n setProgressInfo(null)\n setIsSeeking(false)\n setSeekPercent(0)\n setSearch((prev) => ({ ...prev, results: [], progressPercent: 0, searching: false }))\n }, [])\n\r\n const handleOpenFile = useCallback(\r\n async (nextFile: File) => {\r\n const reader = readerRef.current\r\n if (!reader) return\r\n\n prepareOpen()\n\r\n try {\r\n await reader.open(nextFile)\r\n setStatus('ready')\r\n } catch (e: any) {\r\n setStatus('error')\r\n setErrorText(e?.message ? String(e.message) : '打开失败')\r\n onError?.(e)\r\n }\r\n },\r\n [onError, prepareOpen],\n )\r\n\r\n const runSearch = useCallback(\r\n async (query: string) => {\r\n const reader = readerRef.current\r\n const normalized = query.trim()\r\n\r\n setSearch((prev) => ({\r\n ...prev,\r\n query,\r\n results: normalized ? prev.results : [],\r\n progressPercent: 0,\r\n searching: Boolean(normalized),\r\n }))\r\n\r\n if (!reader || !normalized) {\r\n reader?.clearSearch()\r\n return\r\n }\r\n\r\n reader.cancelSearch()\r\n try {\r\n const results = await reader.search(normalized, search.options)\r\n setSearch((prev) => ({ ...prev, results, searching: false, progressPercent: 100 }))\r\n } catch (e) {\r\n setSearch((prev) => ({ ...prev, searching: false }))\r\n onError?.(e)\r\n }\r\n },\r\n [onError, search.options],\r\n )\r\n\r\n // 初始化阅读器 Core\r\n useEffect(() => {\r\n const host = viewerHostRef.current\r\n if (!host) return\r\n\r\n try {\r\n const reader = createEBookReader(host, {\r\n darkMode,\r\n fontSize,\r\n onReady: (h) => onReady?.(h),\r\n onError: (e) => onError?.(e),\r\n onProgress: (info) => {\r\n setProgressInfo(info)\r\n onProgress?.(info)\r\n },\r\n onToc: (items) => setToc(items),\r\n onSearchProgress: (info) => {\r\n const p = info.progress\r\n if (typeof p === 'number') setSearch((prev) => ({ ...prev, progressPercent: Math.round(p * 100) }))\r\n },\r\n onContentLoad: (doc) => {\r\n if (boundDocsRef.current.has(doc)) return\r\n boundDocsRef.current.add(doc)\r\n doc.addEventListener('pointerdown', onPointerDown)\r\n doc.addEventListener('pointermove', onPointerMove)\r\n doc.addEventListener('pointerup', onPointerEnd)\r\n doc.addEventListener('pointercancel', onPointerEnd)\r\n },\r\n })\r\n readerRef.current = reader\r\n setStatus('ready')\r\n } catch (e: any) {\r\n setStatus('error')\r\n setErrorText(e?.message ? String(e.message) : '初始化失败')\r\n onError?.(e)\r\n return\r\n }\r\n\r\n return () => {\r\n readerRef.current?.destroy()\r\n readerRef.current = null\r\n }\r\n }, [onError, onProgress, onReady])\r\n\r\n useEffect(() => {\r\n if (file) {\n void handleOpenFile(file)\n return\n }\n\n const nextUrl = fileUrl?.trim()\n if (!nextUrl) return\n\n const controller = new AbortController()\n prepareOpen()\n void (async () => {\n try {\n const downloaded = await downloadEpubAsFile(nextUrl, controller.signal)\n await handleOpenFile(downloaded)\n } catch (e: any) {\n if (e?.name === 'AbortError') return\n setStatus('error')\n setErrorText(e?.message ? String(e.message) : '下载失败')\n onError?.(e)\n }\n })()\n\n return () => controller.abort()\n }, [file, fileUrl, handleOpenFile, onError, prepareOpen])\n\r\n useEffect(() => {\r\n readerRef.current?.setDarkMode(darkMode)\r\n }, [darkMode])\r\n\r\n useEffect(() => {\r\n readerRef.current?.setFontSize(fontSize)\r\n }, [fontSize])\r\n\r\n // 键盘导航\r\n useEffect(() => {\r\n if (!enableKeyboardNav) return\r\n const root = rootRef.current\r\n if (!root) return\r\n\r\n const handleKeyDown = (e: KeyboardEvent) => {\r\n if (e.key === 'ArrowLeft') readerRef.current?.prevPage()\r\n if (e.key === 'ArrowRight') readerRef.current?.nextPage()\r\n if (e.key === 'Escape') closeDrawers()\r\n }\r\n\r\n root.addEventListener('keydown', handleKeyDown)\r\n return () => {\r\n root.removeEventListener('keydown', handleKeyDown)\r\n }\r\n }, [closeDrawers, enableKeyboardNav])\r\n\r\n useImperativeHandle(\r\n ref,\r\n () => ({\r\n prevPage: () => readerRef.current?.prevPage(),\r\n nextPage: () => readerRef.current?.nextPage(),\r\n prevSection: () => readerRef.current?.prevSection(),\r\n nextSection: () => readerRef.current?.nextSection(),\r\n goTo: (target) => readerRef.current?.goTo(target),\r\n goToFraction: (frac) => readerRef.current?.goToFraction(frac),\r\n search: (q, o) => (readerRef.current ? readerRef.current.search(q, o) : Promise.resolve([])),\r\n cancelSearch: () => readerRef.current?.cancelSearch(),\r\n clearSearch: () => readerRef.current?.clearSearch(),\r\n }),\r\n [],\r\n )\r\n\r\n // 子组件回调 Helpers\r\n const handleSeekStart = useCallback(() => setIsSeeking(true), [])\r\n const handleSeekChange = useCallback((v: number) => setSeekPercent(v), [])\r\n const handleSeekEnd = useCallback((v: number) => {\r\n setIsSeeking(false)\r\n readerRef.current?.goToFraction(v / 100)\r\n }, [])\r\n\r\n const handleTocSelect = useCallback((href?: string) => {\r\n if (href) readerRef.current?.goTo(href)\r\n }, [])\r\n\r\n const handleSearchResultSelect = useCallback((cfi: string) => {\r\n if (cfi) readerRef.current?.goTo(cfi)\r\n }, [])\r\n\r\n return (\r\n <div\r\n ref={rootRef}\r\n className={mergeClassName('epub-reader', className)}\r\n style={style}\r\n data-theme={darkMode ? 'dark' : 'light'}\r\n data-layout={layout}\r\n tabIndex={0}\r\n >\r\n <div className=\"epub-reader__viewer\" ref={viewerHostRef} />\r\n\r\n {layout === 'mobile' ? (\r\n <MobileUI\r\n barVisible={mobileBarVisible}\r\n activePanel={mobilePanel}\r\n onTogglePanel={toggleMobilePanel}\r\n onClosePanel={closeMobileSheet}\r\n toc={toc}\r\n search={search}\r\n status={status}\r\n errorText={errorText}\r\n sectionLabel={sectionLabel}\r\n displayedPercent={displayedPercent}\r\n darkMode={darkMode}\r\n fontSize={fontSize}\r\n onTocSelect={handleTocSelect}\r\n onSearch={(q) => void runSearch(q)}\r\n onSearchQueryChange={(v) => setSearch((prev) => ({ ...prev, query: v }))}\r\n onSearchOptionChange={(opt) => setSearch((prev) => ({ ...prev, options: { ...prev.options, ...opt } }))}\r\n onCancelSearch={() => readerRef.current?.cancelSearch()}\r\n onSearchResultSelect={handleSearchResultSelect}\r\n onSeekStart={handleSeekStart}\r\n onSeekChange={handleSeekChange}\r\n onSeekEnd={handleSeekEnd}\r\n onSeekCommit={handleSeekEnd}\r\n onToggleDarkMode={setDarkModeInternal}\r\n onFontSizeChange={setFontSizeInternal}\r\n />\r\n ) : (\r\n <>\r\n <DesktopToolbar\r\n onToggleToc={() => setTocOpen(true)}\r\n onToggleSearch={() => setSearchOpen(true)}\r\n onPrevSection={() => readerRef.current?.prevSection()}\r\n onPrevPage={() => readerRef.current?.prevPage()}\r\n onNextPage={() => readerRef.current?.nextPage()}\r\n onNextSection={() => readerRef.current?.nextSection()}\r\n darkMode={darkMode}\r\n onToggleDarkMode={() => setDarkModeInternal(!darkMode)}\r\n fontSize={fontSize}\r\n onFontSizeChange={setFontSizeInternal}\r\n />\r\n\r\n {(tocOpen || searchOpen) && <div className=\"epub-reader__overlay\" onClick={closeDrawers} />}\r\n\r\n <TocDrawer\r\n isOpen={tocOpen}\r\n onClose={() => setTocOpen(false)}\r\n toc={toc}\r\n onSelect={handleTocSelect}\r\n />\r\n\r\n <SearchDrawer\r\n isOpen={searchOpen}\r\n onClose={() => setSearchOpen(false)}\r\n status={status}\r\n search={search}\r\n onSearch={(q) => void runSearch(q)}\r\n onQueryChange={(v) => setSearch((prev) => ({ ...prev, query: v }))}\r\n onOptionChange={(opt) => setSearch((prev) => ({ ...prev, options: { ...prev.options, ...opt } }))}\r\n onCancelSearch={() => readerRef.current?.cancelSearch()}\r\n onResultSelect={handleSearchResultSelect}\r\n />\r\n\r\n <DesktopBottomBar\r\n status={status}\r\n errorText={errorText}\r\n sectionLabel={sectionLabel}\r\n displayedPercent={displayedPercent}\r\n onSeekStart={handleSeekStart}\r\n onSeekChange={handleSeekChange}\r\n onSeekEnd={handleSeekEnd}\r\n onSeekCommit={handleSeekEnd}\r\n />\r\n </>\r\n )}\r\n </div>\r\n )\r\n})\r\n","import { ensureEpubReaderStyle } from '../styles/ensureStyle.js'\n\nensureEpubReaderStyle()\n\nexport type { EBookReaderReactHandle, EBookReaderReactProps } from './types.js'\nexport { EBookReader } from './EBookReader.js'\n"]}
1
+ {"version":3,"sources":["../src/core/reader.ts","../src/core/icons.ts","../src/react/components/SvgIcon.tsx","../src/react/components/DesktopToolbar.tsx","../src/react/components/DesktopBottomBar.tsx","../src/react/components/TocTree.tsx","../src/react/components/TocDrawer.tsx","../src/react/components/SearchResultList.tsx","../src/react/components/SearchDrawer.tsx","../src/react/components/MobileUI.tsx","../src/react/EBookReader.tsx"],"names":["jsx","jsxs","EBookReader","useRef","useState","useMemo","useEffect","Fragment"],"mappings":";;;;;AAsBA,IAAM,aAAA,GAAgB,CAAC,QAAA,EAAkB,MAAA,EAAiB,QAAA,KAAsB;AAAA;AAAA;AAAA,gBAAA,EAG9D,MAAA,GAAS,SAAS,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA,SAAA,EAIhC,MAAA,GAAS,YAAY,OAAO,CAAA;AAAA,aAAA,EACxB,QAAQ,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAAA,EAOZ,MAAA,GAAS,YAAY,SAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,EAMrC,MAAA,GAAS,2CAA2C,EAAE;AAAA;AAAA,EAExD,YAAY,EAAE;AAAA,CAAA;AAGT,SAAS,iBAAA,CAAkB,SAAA,EAAwB,OAAA,GAA8B,EAAC,EAAsB;AAC7G,EAAA,IAAI,CAAC,SAAA,EAAW,MAAM,IAAI,MAAM,uBAAuB,CAAA;AACvD,EAAA,IAAI,CAAC,eAAe,GAAA,CAAI,cAAc,GAAG,MAAM,IAAI,MAAM,6BAA6B,CAAA;AAEtF,EAAA,MAAM;AAAA,IACJ,UAAU,eAAA,GAAkB,KAAA;AAAA,IAC5B,UAAU,eAAA,GAAkB,GAAA;AAAA,IAC5B,eAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA,UAAA;AAAA,IACA,KAAA;AAAA,IACA,gBAAA;AAAA,IACA;AAAA,GACF,GAAI,OAAA;AAEJ,EAAA,IAAI,SAAA,GAAY,KAAA;AAChB,EAAA,IAAI,MAAiB,EAAC;AACtB,EAAA,IAAI,QAAA,GAAW,eAAA;AACf,EAAA,IAAI,QAAA,GAAW,eAAA;AACf,EAAA,IAAI,WAAA,GAAc,CAAA;AAElB,EAAA,SAAA,CAAU,SAAA,GAAY,EAAA;AAEtB,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,cAAc,CAAA;AACpD,EAAA,MAAA,CAAO,MAAM,OAAA,GAAU,OAAA;AACvB,EAAA,MAAA,CAAO,MAAM,KAAA,GAAQ,MAAA;AACrB,EAAA,MAAA,CAAO,MAAM,MAAA,GAAS,MAAA;AACtB,EAAA,MAAA,CAAO,YAAA,CAAa,UAAU,IAAI,CAAA;AAClC,EAAA,MAAA,CAAO,YAAA,CAAa,OAAO,MAAM,CAAA;AAEjC,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,IAAI,SAAA,EAAW;AACf,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,EAAU,SAAA,EAAW;AACjC,IAAA,MAAA,CAAO,SAAS,SAAA,CAAU,aAAA,CAAc,QAAA,EAAU,QAAA,EAAU,eAAe,CAAC,CAAA;AAC5E,IAAA,qBAAA,CAAsB,MAAM;AAC1B,MAAA,UAAA,CAAW,MAAM;AACf,QAAA,IAAI,SAAA,EAAW;AACf,QAAA,MAAA,CAAO,UAAU,MAAA,IAAS;AAC1B,QAAA,MAAA,CAAO,UAAU,MAAA,IAAS;AAAA,MAC5B,GAAG,EAAE,CAAA;AAAA,IACP,CAAC,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,MAAM,UAAA,GAAa,CAAC,CAAA,KAAa;AAC/B,IAAA,WAAA,EAAY;AACZ,IAAA,MAAM,SAAU,CAAA,CAAkB,MAAA;AAClC,IAAA,IAAI,MAAA,EAAQ,GAAA,EAAK,aAAA,GAAgB,MAAA,CAAO,GAAG,CAAA;AAAA,EAC7C,CAAA;AAEA,EAAA,MAAM,cAAA,GAAiB,CAAC,CAAA,KAAa;AACnC,IAAA,MAAM,SAAU,CAAA,CAAkB,MAAA;AAClC,IAAA,UAAA,GAAa,MAAM,CAAA;AAAA,EACrB,CAAA;AAEA,EAAA,MAAA,CAAO,gBAAA,CAAiB,QAAQ,UAA2B,CAAA;AAC3D,EAAA,MAAA,CAAO,gBAAA,CAAiB,YAAY,cAA+B,CAAA;AAEnE,EAAA,SAAA,CAAU,YAAY,MAAM,CAAA;AAE5B,EAAA,MAAM,MAAA,GAA4B;AAAA,IAChC,MAAM,KAAK,IAAA,EAAM;AACf,MAAA,IAAI,SAAA,EAAW;AACf,MAAA,IAAI,CAAC,IAAA,EAAM;AAEX,MAAA,IAAI;AACF,QAAA,MAAA,CAAO,WAAA,IAAc;AACrB,QAAA,WAAA,EAAA;AAEA,QAAA,MAAM,MAAA,CAAO,OAAO,IAAI,CAAA;AAExB,QAAA,MAAM,OAAA,GAAU,MAAA,CAAO,IAAA,EAAM,GAAA,IAAO,EAAC;AACrC,QAAA,GAAA,GAAM,OAAA;AACN,QAAA,KAAA,GAAQ,GAAG,CAAA;AAEX,QAAA,MAAM,MAAA,CAAO,IAAA,GAAO,EAAE,aAAA,EAAe,MAAM,CAAA;AAC3C,QAAA,WAAA,EAAY;AAAA,MACd,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,GAAU,KAAK,CAAA;AACf,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF,CAAA;AAAA,IACA,OAAA,GAAU;AACR,MAAA,IAAI,SAAA,EAAW;AACf,MAAA,SAAA,GAAY,IAAA;AACZ,MAAA,WAAA,EAAA;AACA,MAAA,MAAA,CAAO,mBAAA,CAAoB,QAAQ,UAAU,CAAA;AAC7C,MAAA,MAAA,CAAO,mBAAA,CAAoB,YAAY,cAA+B,CAAA;AACtE,MAAA,SAAA,CAAU,SAAA,GAAY,EAAA;AAAA,IACxB,CAAA;AAAA,IACA,QAAA,GAAW;AACT,MAAA,MAAA,CAAO,MAAA,IAAS;AAAA,IAClB,CAAA;AAAA,IACA,QAAA,GAAW;AACT,MAAA,MAAA,CAAO,OAAA,IAAU;AAAA,IACnB,CAAA;AAAA,IACA,WAAA,GAAc;AACZ,MAAA,MAAA,CAAO,UAAU,WAAA,IAAc;AAAA,IACjC,CAAA;AAAA,IACA,WAAA,GAAc;AACZ,MAAA,MAAA,CAAO,UAAU,WAAA,IAAc;AAAA,IACjC,CAAA;AAAA,IACA,KAAK,MAAA,EAAQ;AACX,MAAA,IAAI,CAAC,MAAA,EAAQ;AACb,MAAA,MAAA,CAAO,OAAO,MAAM,CAAA;AAAA,IACtB,CAAA;AAAA,IACA,aAAa,QAAA,EAAU;AACrB,MAAA,MAAM,IAAA,GAAO,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,QAAQ,CAAC,CAAA;AAC9C,MAAA,MAAA,CAAO,eAAe,IAAI,CAAA;AAAA,IAC5B,CAAA;AAAA,IACA,YAAY,YAAA,EAAc;AACxB,MAAA,QAAA,GAAW,YAAA;AACX,MAAA,WAAA,EAAY;AAAA,IACd,CAAA;AAAA,IACA,YAAY,YAAA,EAAc;AACxB,MAAA,MAAM,IAAA,GAAO,KAAK,GAAA,CAAI,GAAA,EAAK,KAAK,GAAA,CAAI,EAAA,EAAI,YAAY,CAAC,CAAA;AACrD,MAAA,QAAA,GAAW,IAAA;AACX,MAAA,WAAA,EAAY;AAAA,IACd,CAAA;AAAA,IACA,MAAM,MAAA,CAAO,KAAA,EAAO,IAAA,GAAsB,EAAC,EAAG;AAC5C,MAAA,MAAM,UAAA,GAAa,MAAM,IAAA,EAAK;AAC9B,MAAA,IAAI,CAAC,UAAA,EAAY;AACf,QAAA,MAAA,CAAO,WAAA,IAAc;AACrB,QAAA,OAAO,EAAC;AAAA,MACV;AAEA,MAAA,MAAM,QAAQ,EAAE,WAAA;AAChB,MAAA,MAAM,UAA0B,EAAC;AAEjC,MAAA,IAAI;AACF,QAAA,WAAA,MAAiB,IAAA,IAAQ,OAAO,MAAA,GAAS;AAAA,UACvC,KAAA,EAAO,UAAA;AAAA,UACP,SAAA,EAAW,OAAA,CAAQ,IAAA,CAAK,SAAS,CAAA;AAAA,UACjC,eAAA,EAAiB,OAAA,CAAQ,IAAA,CAAK,UAAU,CAAA;AAAA,UACxC,eAAA,EAAiB,OAAA,CAAQ,IAAA,CAAK,eAAe;AAAA,SAC9C,CAAA,IAAK,EAAC,EAAG;AACR,UAAA,IAAI,SAAA,IAAa,KAAA,KAAU,WAAA,EAAa,OAAO,OAAA;AAE/C,UAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,YAAA,gBAAA,GAAmB,EAAE,IAAA,EAAM,IAAA,EAAM,QAAA,EAAU,GAAG,CAAA;AAC9C,YAAA;AAAA,UACF;AAEA,UAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,IAAA,IAAQ,cAAe,IAAA,EAAc;AACnE,YAAA,MAAM,WAAY,IAAA,CAAa,QAAA;AAC/B,YAAA,IAAI,OAAO,QAAA,KAAa,QAAA,EAAU,gBAAA,GAAmB,EAAE,UAAU,CAAA;AACjE,YAAA;AAAA,UACF;AAEA,UAAA,MAAM,OAAA,GAAU,IAAA;AAChB,UAAA,IAAI,OAAA,EAAS,UAAU,MAAA,EAAQ;AAC7B,YAAA,KAAA,MAAW,GAAA,IAAO,QAAQ,QAAA,EAAU;AAClC,cAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,gBACX,OAAO,OAAA,CAAQ,KAAA;AAAA,gBACf,KAAK,GAAA,EAAK,GAAA;AAAA,gBACV,SAAS,GAAA,EAAK,OAAA;AAAA,gBACd,OAAO,GAAA,EAAK;AAAA,eACb,CAAA;AAAA,YACH;AAAA,UACF,CAAA,MAAA,IAAW,SAAS,GAAA,EAAK;AACvB,YAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,cACX,KAAK,OAAA,CAAQ,GAAA;AAAA,cACb,SAAS,OAAA,CAAQ,OAAA;AAAA,cACjB,OAAO,OAAA,CAAQ;AAAA,aAChB,CAAA;AAAA,UACH;AAAA,QACF;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,GAAU,KAAK,CAAA;AACf,QAAA,MAAM,KAAA;AAAA,MACR;AAEA,MAAA,OAAO,OAAA;AAAA,IACT,CAAA;AAAA,IACA,YAAA,GAAe;AACb,MAAA,WAAA,EAAA;AAAA,IACF,CAAA;AAAA,IACA,WAAA,GAAc;AACZ,MAAA,MAAA,CAAO,WAAA,IAAc;AAAA,IACvB,CAAA;AAAA,IACA,MAAA,GAAS;AACP,MAAA,OAAO,GAAA;AAAA,IACT;AAAA,GACF;AAEA,EAAA,OAAA,GAAU,MAAM,CAAA;AAChB,EAAA,OAAO,MAAA;AACT;;;AC3OO,IAAM,KAAA,GAAgC;AAAA,EAC3C,IAAA,EAAM,2HAAA;AAAA,EACN,MAAA,EAAQ,0JAAA;AAAA,EACR,cAAA,EAAgB,mHAAA;AAAA,EAChB,eAAA,EAAiB,iHAAA;AAAA,EACjB,eAAA,EAAiB,kIAAA;AAAA,EACjB,gBAAA,EAAkB,+HAAA;AAAA,EAClB,GAAA,EAAK,oQAAA;AAAA,EACL,IAAA,EAAM,mJAAA;AAAA,EACN,IAAA,EAAM,oHAAA;AAAA,EACN,KAAA,EAAO,4GAAA;AAAA,EACP,CAAA,EAAG,wHAAA;AAAA,EACH,IAAA,EAAM,8HAAA;AAAA,EACN,OAAA,EAAS,yKAAA;AAAA,EACT,QAAA,EAAU;AACZ,CAAA;ACLO,IAAM,OAAA,GAAU,CAAC,EAAE,IAAA,EAAM,OAAO,EAAA,EAAI,KAAA,GAAQ,cAAA,EAAgB,SAAA,EAAU,KAAoB;AAC/F,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,IAAI,CAAA,IAAK,EAAA;AAEhC,EAAA,MAAM,KAAA,GAAQ,QAAQ,MAAM;AAC1B,IAAA,MAAM,UAAU,OAAO,IAAA,KAAS,QAAA,GAAW,CAAA,EAAG,IAAI,CAAA,EAAA,CAAA,GAAO,IAAA;AACzD,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,OAAA;AAAA,MACP,MAAA,EAAQ,OAAA;AAAA,MACR,KAAA;AAAA,MACA,QAAA,EAAU,OAAA;AAAA,MACV,OAAA,EAAS,cAAA;AAAA,MACT,aAAA,EAAe;AAAA,KACjB;AAAA,EACF,CAAA,EAAG,CAAC,IAAA,EAAM,KAAK,CAAC,CAAA;AAEhB,EAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAEtB,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAM,4BAAA;AAAA,MACN,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MACL,KAAA;AAAA,MACA,SAAA;AAAA,MACA,uBAAA,EAAyB,EAAE,MAAA,EAAQ,QAAA;AAAS;AAAA,GAC9C;AAEJ,CAAA;ACnBO,IAAM,iBAAiB,CAAC;AAAA,EAC7B,WAAA;AAAA,EACA,cAAA;AAAA,EACA,aAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAA;AAAA,EACA,QAAA;AAAA,EACA,gBAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,KAA2B;AACzB,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EACb,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,oBAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,GAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,WAAU,kBAAA,EAAmB,OAAA,EAAS,WAAA,EAAa,KAAA,EAAM,gBAC7E,QAAA,kBAAAA,GAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAK,QAAO,CAAA,EACvB,CAAA;AAAA,sBACAA,GAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,WAAU,kBAAA,EAAmB,OAAA,EAAS,cAAA,EAAgB,KAAA,EAAM,gBAChF,QAAA,kBAAAA,GAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAK,UAAS,CAAA,EACzB,CAAA;AAAA,sBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EAAuB,CAAA;AAAA,sBACtCA,GAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,WAAU,kBAAA,EAAmB,OAAA,EAAS,aAAA,EAAe,KAAA,EAAM,sBAC/E,QAAA,kBAAAA,GAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAK,iBAAgB,CAAA,EAChC,CAAA;AAAA,sBACAA,GAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,WAAU,kBAAA,EAAmB,OAAA,EAAS,UAAA,EAAY,KAAA,EAAM,sBAC5E,QAAA,kBAAAA,GAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAK,gBAAe,CAAA,EAC/B,CAAA;AAAA,sBACAA,GAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,WAAU,kBAAA,EAAmB,OAAA,EAAS,UAAA,EAAY,KAAA,EAAM,sBAC5E,QAAA,kBAAAA,GAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAK,iBAAgB,CAAA,EAChC,CAAA;AAAA,sBACAA,GAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,WAAU,kBAAA,EAAmB,OAAA,EAAS,aAAA,EAAe,KAAA,EAAM,sBAC/E,QAAA,kBAAAA,GAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAK,kBAAiB,CAAA,EACjC;AAAA,KAAA,EACF,CAAA;AAAA,oBAEA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,IAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,SAAA,EAAU,oBAAmB,OAAA,EAAS,gBAAA,EAAkB,KAAA,EAAM,cAAA,EAClF,0BAAAA,GAAAA,CAAC,OAAA,EAAA,EAAQ,MAAM,QAAA,GAAW,KAAA,GAAQ,QAAQ,CAAA,EAC5C,CAAA;AAAA,sBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EAAuB,CAAA;AAAA,sBACtCA,IAAC,QAAA,EAAA,EAAO,IAAA,EAAK,UAAS,SAAA,EAAU,kBAAA,EAAmB,SAAS,MAAM,gBAAA,CAAiB,WAAW,EAAE,CAAA,EAAG,OAAM,0BAAA,EACvG,QAAA,kBAAAA,IAAC,OAAA,EAAA,EAAQ,IAAA,EAAK,QAAO,CAAA,EACvB,CAAA;AAAA,sBACA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mBAAA,EAAqB,QAAA,EAAA;AAAA,QAAA,QAAA;AAAA,QAAS;AAAA,OAAA,EAAC,CAAA;AAAA,sBAC9CA,IAAC,QAAA,EAAA,EAAO,IAAA,EAAK,UAAS,SAAA,EAAU,kBAAA,EAAmB,SAAS,MAAM,gBAAA,CAAiB,WAAW,EAAE,CAAA,EAAG,OAAM,0BAAA,EACvG,QAAA,kBAAAA,IAAC,OAAA,EAAA,EAAQ,IAAA,EAAK,SAAQ,CAAA,EACxB;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ,CAAA;ACvDO,IAAM,mBAAmB,CAAC;AAAA,EAC/B,MAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,gBAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,KAA6B;AAC3B,EAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qBAAA,EACb,QAAA,EAAA,MAAA,KAAW,OAAA,GAAU,SAAA,IAAa,cAAA,GAAO,MAAA,KAAW,SAAA,GAAY,gCAAA,GAAU,EAAA,EAC7E,CAAA;AAAA,MACC,+BAAeA,GAAAA,CAAC,UAAK,SAAA,EAAU,sBAAA,EAAwB,wBAAa,CAAA,GAAU;AAAA,KAAA,EACjF,CAAA;AAAA,oBACAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,GAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,oBAAA;AAAA,UACV,IAAA,EAAK,OAAA;AAAA,UACL,GAAA,EAAK,CAAA;AAAA,UACL,GAAA,EAAK,GAAA;AAAA,UACL,IAAA,EAAM,CAAA;AAAA,UACN,KAAA,EAAO,gBAAA;AAAA,UACP,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,YAAA,WAAA,EAAY;AACZ,YAAA,YAAA,CAAa,MAAA,CAAO,CAAA,CAAE,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,UACrC,CAAA;AAAA,UACA,WAAA,EAAa,CAAC,CAAA,KAAM;AAClB,YAAA,MAAM,CAAA,GAAI,MAAA,CAAQ,CAAA,CAAE,MAAA,CAA4B,KAAK,CAAA;AACrD,YAAA,SAAA,CAAU,CAAC,CAAA;AAAA,UACb,CAAA;AAAA,UACA,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,YAAA,IAAI,CAAA,CAAE,QAAQ,OAAA,EAAS;AACvB,YAAA,MAAM,CAAA,GAAI,MAAA,CAAQ,CAAA,CAAE,MAAA,CAA4B,KAAK,CAAA;AACrD,YAAA,YAAA,CAAa,CAAC,CAAA;AAAA,UAChB;AAAA;AAAA,OACF;AAAA,sBACAC,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sBAAA,EAAwB,QAAA,EAAA;AAAA,QAAA,gBAAA;AAAA,QAAiB;AAAA,OAAA,EAAC;AAAA,KAAA,EAC5D;AAAA,GAAA,EACF,CAAA;AAEJ,CAAA;AC/CO,IAAM,OAAA,GAAU,CAAC,EAAE,KAAA,EAAO,UAAS,KAAoB;AAC5D,EAAA,uBACED,IAAC,IAAA,EAAA,EAAG,SAAA,EAAU,yBACX,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,EAAM,GAAA,KAAQ;AACxB,IAAA,MAAM,GAAA,GAAM,KAAK,IAAA,IAAQ,CAAA,EAAG,KAAK,KAAA,IAAS,MAAM,IAAI,GAAG,CAAA,CAAA;AACvD,IAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,IAAA,CAAK,QAAA,EAAU,MAAM,CAAA;AACjD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,IAAS,IAAA,CAAK,IAAA,IAAQ,oBAAA;AAEzC,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,uBACEA,IAAC,IAAA,EAAA,EAAa,SAAA,EAAU,yBACtB,QAAA,kBAAAA,GAAAA,CAAC,YAAO,IAAA,EAAK,QAAA,EAAS,WAAU,sBAAA,EAAuB,OAAA,EAAS,MAAM,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA,EACrF,QAAA,EAAA,KAAA,EACH,KAHO,GAIT,CAAA;AAAA,IAEJ;AAEA,IAAA,uBACEA,IAAC,IAAA,EAAA,EAAa,SAAA,EAAU,yBACtB,QAAA,kBAAAC,IAAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAU,0BAAA,EACjB,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAU,0BAAA,EAA4B,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,sBACrDA,IAAC,OAAA,EAAA,EAAQ,KAAA,EAAO,KAAK,QAAA,IAAY,IAAI,QAAA,EAAoB;AAAA,KAAA,EAC3D,KAJO,GAKT,CAAA;AAAA,EAEJ,CAAC,CAAA,EACH,CAAA;AAEJ,CAAA;AC1BO,IAAM,YAAY,CAAC,EAAE,QAAQ,OAAA,EAAS,GAAA,EAAK,UAAS,KAAsB;AAC/E,EAAA,uBACEC,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAW,CAAA,oBAAA,EAAuB,MAAA,GAAS,SAAA,GAAY,EAAE,CAAA,CAAA,EAAI,aAAA,EAAa,CAAC,MAAA,EAChF,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EAA4B,QAAA,EAAA,cAAA,EAAE,CAAA;AAAA,sBAC7CA,GAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,UAAS,SAAA,EAAU,kBAAA,EAAmB,OAAA,EAAS,OAAA,EAC1D,QAAA,kBAAAA,GAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAK,KAAI,CAAA,EACpB;AAAA,KAAA,EACF,CAAA;AAAA,oBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,0BAAA,EACZ,QAAA,EAAA,GAAA,CAAI,yBACHA,GAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,GAAA;AAAA,QACP,QAAA,EAAU,CAAC,IAAA,KAAS;AAClB,UAAA,QAAA,CAAS,IAAI,CAAA;AACb,UAAA,OAAA,EAAQ;AAAA,QACV;AAAA;AAAA,wBAGFA,GAAAA,CAAC,SAAI,SAAA,EAAU,oBAAA,EAAqB,4CAAK,CAAA,EAE7C;AAAA,GAAA,EACF,CAAA;AAEJ,CAAA;AC5BO,IAAM,gBAAA,GAAmB,CAAC,EAAE,OAAA,EAAS,UAAS,KAA6B;AAChF,EAAA,uBACEA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,4BACX,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,EAAG,wBACfA,GAAAA,CAAC,IAAA,EAAA,EAAuC,SAAA,EAAU,4BAChD,QAAA,kBAAAC,IAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,SAAA,EAAU,yBAAA;AAAA,MACV,SAAS,MAAM;AACb,QAAA,IAAI,CAAA,CAAE,GAAA,EAAK,QAAA,CAAS,CAAA,CAAE,GAAG,CAAA;AAAA,MAC3B,CAAA;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,CAAA,CAAE,KAAA,mBAAQD,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,2BAAA,EAA6B,QAAA,EAAA,CAAA,CAAE,OAAM,CAAA,GAAS,IAAA;AAAA,wBACxEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAAA,EACZ,QAAA,EAAA,OAAO,CAAA,CAAE,OAAA,KAAY,QAAA,GAClB,CAAA,CAAE,OAAA,GACF,CAAA,EAAG,CAAA,CAAE,SAAS,GAAA,IAAO,EAAE,CAAA,EAAG,CAAA,CAAE,OAAA,EAAS,KAAA,IAAS,EAAE,CAAA,EAAG,CAAA,CAAE,OAAA,EAAS,IAAA,IAAQ,EAAE,CAAA,CAAA,EAC9E;AAAA;AAAA;AAAA,GACF,EAAA,EAdO,GAAG,CAAA,CAAE,GAAA,IAAO,QAAQ,CAAA,CAAA,EAAI,GAAG,CAAA,CAepC,CACD,CAAA,EACH,CAAA;AAEJ,CAAA;ACdO,IAAM,eAAe,CAAC;AAAA,EAC3B,MAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,aAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA;AACF,CAAA,KAAyB;AACvB,EAAA,uBACEC,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAW,CAAA,0BAAA,EAA6B,MAAA,GAAS,SAAA,GAAY,EAAE,CAAA,CAAA,EAAI,aAAA,EAAa,CAAC,MAAA,EACtF,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EAA4B,QAAA,EAAA,cAAA,EAAE,CAAA;AAAA,sBAC7CA,GAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,UAAS,SAAA,EAAU,kBAAA,EAAmB,OAAA,EAAS,OAAA,EAC1D,QAAA,kBAAAA,GAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAK,KAAI,CAAA,EACpB;AAAA,KAAA,EACF,CAAA;AAAA,oBACAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EACb,QAAA,EAAA;AAAA,wBAAAD,GAAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,oBAAA;AAAA,YACV,WAAA,EAAY,gCAAA;AAAA,YACZ,OAAO,MAAA,CAAO,KAAA;AAAA,YACd,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,cAAA,MAAM,CAAA,GAAI,EAAE,MAAA,CAAO,KAAA;AACnB,cAAA,aAAA,CAAc,CAAC,CAAA;AACf,cAAA,IAAI,CAAC,CAAA,CAAE,IAAA,EAAK,WAAY,EAAE,CAAA;AAAA,YAC5B,CAAA;AAAA,YACA,UAAU,MAAA,KAAW,OAAA;AAAA,YACrB,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,cAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,EAAS,QAAA,CAAS,OAAO,KAAK,CAAA;AAAA,YAC9C;AAAA;AAAA,SACF;AAAA,wBACAA,IAAC,QAAA,EAAA,EAAO,IAAA,EAAK,UAAS,SAAA,EAAU,kBAAA,EAAmB,SAAS,MAAM,QAAA,CAAS,OAAO,KAAK,CAAA,EAAG,UAAU,MAAA,KAAW,OAAA,EAC7G,0BAAAA,GAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAK,QAAA,EAAS,CAAA,EACzB;AAAA,OAAA,EACF,CAAA;AAAA,sBAEAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,oBAAA,EACf,QAAA,EAAA;AAAA,0BAAAD,GAAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,UAAA;AAAA,cACL,OAAA,EAAS,OAAA,CAAQ,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA;AAAA,cACzC,QAAA,EAAU,CAAC,CAAA,KAAM,cAAA,CAAe,EAAE,SAAA,EAAW,CAAA,CAAE,MAAA,CAAO,OAAA,EAAS;AAAA;AAAA,WACjE;AAAA,UAAE;AAAA,SAAA,EAEJ,CAAA;AAAA,wBACAC,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,oBAAA,EACf,QAAA,EAAA;AAAA,0BAAAD,GAAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,UAAA;AAAA,cACL,OAAA,EAAS,OAAA,CAAQ,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA;AAAA,cAC1C,QAAA,EAAU,CAAC,CAAA,KAAM,cAAA,CAAe,EAAE,UAAA,EAAY,CAAA,CAAE,MAAA,CAAO,OAAA,EAAS;AAAA;AAAA,WAClE;AAAA,UAAE;AAAA,SAAA,EAEJ,CAAA;AAAA,wBACAC,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,oBAAA,EACf,QAAA,EAAA;AAAA,0BAAAD,GAAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,UAAA;AAAA,cACL,OAAA,EAAS,OAAA,CAAQ,MAAA,CAAO,OAAA,CAAQ,eAAe,CAAA;AAAA,cAC/C,QAAA,EAAU,CAAC,CAAA,KAAM,cAAA,CAAe,EAAE,eAAA,EAAiB,CAAA,CAAE,MAAA,CAAO,OAAA,EAAS;AAAA;AAAA,WACvE;AAAA,UAAE;AAAA,SAAA,EAEJ;AAAA,OAAA,EACF,CAAA;AAAA,sBAEAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mBAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,KAAC,MAAA,EAAA,EAAK,QAAA,EAAA;AAAA,UAAA,eAAA;AAAA,UAAI,MAAA,CAAO,eAAA;AAAA,UAAgB;AAAA,SAAA,EAAC,CAAA;AAAA,QACjC,OAAO,SAAA,mBAAYD,GAAAA,CAAC,MAAA,EAAA,EAAK,sCAAI,CAAA,GAAU,IAAA;AAAA,QACvC,MAAA,CAAO,SAAA,mBACNA,GAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,SAAA,EAAU,mBAAA,EAAoB,OAAA,EAAS,cAAA,EAAgB,QAAA,EAAA,cAAA,EAE7E,CAAA,GACE;AAAA,OAAA,EACN,CAAA;AAAA,MAEC,MAAA,CAAO,QAAQ,MAAA,mBACdA,IAAC,gBAAA,EAAA,EAAiB,OAAA,EAAS,MAAA,CAAO,OAAA,EAAS,QAAA,EAAU,cAAA,EAAgB,oBAErEA,GAAAA,CAAC,SAAI,SAAA,EAAU,oBAAA,EAAsB,iBAAO,KAAA,CAAM,IAAA,EAAK,GAAI,gCAAA,GAAU,sCAAA,EAAS;AAAA,KAAA,EAElF;AAAA,GAAA,EACF,CAAA;AAEJ,CAAA;AC1DO,IAAM,WAAW,CAAC;AAAA,EACvB,UAAA;AAAA,EACA,WAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,GAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,gBAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA,mBAAA;AAAA,EACA,oBAAA;AAAA,EACA,cAAA;AAAA,EACA,oBAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,gBAAA;AAAA,EACA;AACF,CAAA,KAAqB;AACnB,EAAA,MAAM,WAAA,GAAc,WAAA,KAAgB,MAAA,GAAS,cAAA,GAAO,WAAA,KAAgB,QAAA,GAAW,cAAA,GAAO,WAAA,KAAgB,UAAA,GAAa,cAAA,GAAO,WAAA,KAAgB,UAAA,GAAa,cAAA,GAAO,EAAA;AAE9J,EAAA,MAAM,iBAAA,GAAoB,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,IAAA,CAAK,KAAA,CAAM,QAAA,GAAW,CAAC,CAAC,CAAC,CAAA;AAC7E,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAI,SAAS,iBAAiB,CAAA;AACxE,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAI,SAAS,KAAK,CAAA;AAC1D,EAAA,MAAM,eAAA,GAAkB,OAAsB,IAAI,CAAA;AAClD,EAAA,MAAM,cAAA,GAAiB,OAAO,iBAAiB,CAAA;AAC/C,EAAA,MAAM,iBAAA,GAAoB,OAA8B,IAAI,CAAA;AAC5D,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAI,SAAS,CAAC,CAAA;AACxD,EAAA,MAAM,aAAA,GAAgB,EAAA;AACtB,EAAA,MAAM,OAAA,GAAU,EAAA;AAChB,EAAA,MAAM,OAAA,GAAU,EAAA;AAEhB,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,kBAAA,CAAmB,iBAAiB,CAAA;AACpC,IAAA,cAAA,CAAe,OAAA,GAAU,iBAAA;AAAA,EAC3B,CAAA,EAAG,CAAC,iBAAiB,CAAC,CAAA;AAEtB,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,gBAAgB,OAAA,EAAS;AAC3B,QAAA,YAAA,CAAa,gBAAgB,OAAO,CAAA;AACpC,QAAA,eAAA,CAAgB,OAAA,GAAU,IAAA;AAAA,MAC5B;AAAA,IACF,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,gBAAgB,UAAA,EAAY;AAChC,IAAA,MAAM,KAAK,iBAAA,CAAkB,OAAA;AAC7B,IAAA,IAAI,CAAC,EAAA,EAAI;AACT,IAAA,MAAM,SAAS,MAAM,kBAAA,CAAmB,EAAA,CAAG,qBAAA,GAAwB,KAAK,CAAA;AACxE,IAAA,MAAA,EAAO;AACP,IAAA,MAAM,EAAA,GAAK,IAAI,cAAA,CAAe,MAAM,QAAQ,CAAA;AAC5C,IAAA,EAAA,CAAG,QAAQ,EAAE,CAAA;AACb,IAAA,OAAO,MAAM,GAAG,UAAA,EAAW;AAAA,EAC7B,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAEhB,EAAA,MAAM,mBAAA,GAAA,CAAwB,eAAA,GAAkB,OAAA,KAAY,OAAA,GAAU,OAAA,CAAA,GAAY,GAAA;AAClF,EAAA,MAAM,iBAAiB,MAAM;AAC3B,IAAA,IAAI,CAAC,iBAAiB,OAAO,CAAA;AAC7B,IAAA,MAAM,OAAA,GAAA,CAAW,eAAA,GAAkB,OAAA,KAAY,OAAA,GAAU,OAAA,CAAA;AACzD,IAAA,MAAM,OAAO,aAAA,GAAgB,CAAA;AAC7B,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,eAAA,GAAkB,IAAA,EAAM,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,IAAA,GAAO,OAAA,IAAW,eAAA,GAAkB,aAAA,CAAc,CAAC,CAAA;AAAA,EAC5G,CAAA,GAAG;AAEH,EAAA,MAAM,gBAAgB,MAAM;AAC1B,IAAA,IAAI,gBAAgB,OAAA,EAAS;AAC3B,MAAA,YAAA,CAAa,gBAAgB,OAAO,CAAA;AACpC,MAAA,eAAA,CAAgB,OAAA,GAAU,IAAA;AAAA,IAC5B;AACA,IAAA,gBAAA,CAAiB,cAAA,CAAe,UAAU,CAAC,CAAA;AAAA,EAC7C,CAAA;AAEA,EAAA,MAAM,gBAAA,GAAmB,CAAC,IAAA,KAAiB;AACzC,IAAA,cAAA,CAAe,OAAA,GAAU,IAAA;AACzB,IAAA,IAAI,eAAA,CAAgB,OAAA,EAAS,YAAA,CAAa,eAAA,CAAgB,OAAO,CAAA;AACjE,IAAA,eAAA,CAAgB,OAAA,GAAU,MAAA,CAAO,UAAA,CAAW,MAAM;AAChD,MAAA,eAAA,CAAgB,OAAA,GAAU,IAAA;AAC1B,MAAA,gBAAA,CAAiB,cAAA,CAAe,UAAU,CAAC,CAAA;AAAA,IAC7C,GAAG,EAAE,CAAA;AAAA,EACP,CAAA;AAEA,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAgD,IAAI,CAAA;AAClF,EAAA,MAAM,QAAA,GAAW,OAAsB,IAAI,CAAA;AAC3C,EAAA,MAAM,eAAA,GAAkB,OAAO,KAAK,CAAA;AAEpC,EAAA,MAAM,mBAAmB,MAAM;AAC7B,IAAA,eAAA,CAAgB,OAAA,GAAU,IAAA;AAC1B,IAAA,MAAA,CAAO,WAAW,MAAM;AACtB,MAAA,eAAA,CAAgB,OAAA,GAAU,KAAA;AAAA,IAC5B,GAAG,GAAG,CAAA;AAAA,EACR,CAAA;AAEA,EAAA,MAAM,iBAAiB,MAAM;AAC3B,IAAA,YAAA,EAAa;AACb,IAAA,cAAA,EAAe;AACf,IAAA,MAAM,KAAK,QAAA,CAAS,aAAA;AACpB,IAAA,IAAI,EAAA,IAAM,EAAA,YAAc,WAAA,EAAa,EAAA,CAAG,IAAA,EAAK;AAAA,EAC/C,CAAA;AAEA,EAAA,MAAM,eAAA,GAAkB,CAAC,KAAA,KAAuB;AAC9C,IAAA,IAAI,gBAAgB,OAAA,EAAS;AAC7B,IAAA,aAAA,CAAc,KAAK,CAAA;AAAA,EACrB,CAAA;AAEA,EAAA,MAAM,gBAAA,GAAmB,CAAC,CAAA,EAAqB,IAAA,KAAiB;AAC9D,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,aAAA,CAAc,qBAAA,EAAsB;AAEnD,IAAA,QAAA,CAAS,OAAA,GAAU,MAAA,CAAO,UAAA,CAAW,MAAM;AACzC,MAAA,UAAA,CAAW;AAAA,QACT,IAAA;AAAA,QACA,IAAA,EAAM,IAAA,CAAK,IAAA,GAAO,IAAA,CAAK,KAAA,GAAQ;AAAA,OAChC,CAAA;AAAA,IACH,GAAG,GAAG,CAAA;AAAA,EACR,CAAA;AAEA,EAAA,MAAM,iBAAiB,MAAM;AAC3B,IAAA,IAAI,SAAS,OAAA,EAAS;AACpB,MAAA,YAAA,CAAa,SAAS,OAAO,CAAA;AAC7B,MAAA,QAAA,CAAS,OAAA,GAAU,IAAA;AAAA,IACrB;AACA,IAAA,UAAA,CAAW,IAAI,CAAA;AAAA,EACjB,CAAA;AAEA,EAAA,MAAM,QAAA,GAAW,OAAuB,IAAI,CAAA;AAC5C,EAAA,MAAM,OAAA,GAAU,OAAO,EAAE,MAAA,EAAQ,GAAG,QAAA,EAAU,CAAA,EAAG,UAAA,EAAY,KAAA,EAAO,CAAA;AAEpE,EAAA,MAAM,sBAAA,GAAyB,CAAC,CAAA,KAAwB;AACtD,IAAA,cAAA,EAAe;AACf,IAAA,OAAA,CAAQ,OAAA,CAAQ,MAAA,GAAS,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,CAAE,OAAA;AACtC,IAAA,OAAA,CAAQ,QAAQ,UAAA,GAAa,IAAA;AAC7B,IAAA,IAAI,SAAS,OAAA,EAAS;AACpB,MAAA,QAAA,CAAS,OAAA,CAAQ,MAAM,UAAA,GAAa,MAAA;AAAA,IACtC;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,qBAAA,GAAwB,CAAC,CAAA,KAAwB;AACrD,IAAA,IAAI,CAAC,OAAA,CAAQ,OAAA,CAAQ,UAAA,EAAY;AACjC,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,MAAM,SAAS,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,CAAE,OAAA,GAAU,QAAQ,OAAA,CAAQ,MAAA;AACtD,IAAA,IAAI,MAAA,GAAS,CAAA,IAAK,QAAA,CAAS,OAAA,EAAS;AAElC,MAAA,QAAA,CAAS,OAAA,CAAQ,KAAA,CAAM,SAAA,GAAY,CAAA,WAAA,EAAc,MAAM,CAAA,GAAA,CAAA;AACvD,MAAA,OAAA,CAAQ,QAAQ,QAAA,GAAW,MAAA;AAAA,IAC7B;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,uBAAuB,MAAM;AACjC,IAAA,IAAI,CAAC,OAAA,CAAQ,OAAA,CAAQ,UAAA,EAAY;AACjC,IAAA,OAAA,CAAQ,QAAQ,UAAA,GAAa,KAAA;AAE7B,IAAA,IAAI,SAAS,OAAA,EAAS;AACpB,MAAA,QAAA,CAAS,OAAA,CAAQ,MAAM,UAAA,GAAa,EAAA;AAGpC,MAAA,IAAI,OAAA,CAAQ,OAAA,CAAQ,QAAA,GAAW,EAAA,EAAI;AACjC,QAAA,gBAAA,EAAiB;AACjB,QAAA,cAAA,EAAe;AAKf,QAAA,UAAA,CAAW,MAAM;AACf,UAAA,IAAI,QAAA,CAAS,OAAA,EAAS,QAAA,CAAS,OAAA,CAAQ,MAAM,SAAA,GAAY,EAAA;AAAA,QAC3D,GAAG,GAAG,CAAA;AAAA,MACR,CAAA,MAAO;AAEL,QAAA,QAAA,CAAS,OAAA,CAAQ,MAAM,SAAA,GAAY,EAAA;AAAA,MACrC;AAAA,IACF;AACA,IAAA,OAAA,CAAQ,QAAQ,QAAA,GAAW,CAAA;AAAA,EAC7B,CAAA;AAEA,EAAA,uBACEC,KAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAA,KAAC,KAAA,EAAA,EAAI,SAAA,EAAW,qBAAqB,UAAA,GAAa,YAAA,GAAe,EAAE,CAAA,CAAA,EAChE,QAAA,EAAA;AAAA,MAAA,OAAA,oBACCD,GAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,sBAAA;AAAA,UACV,KAAA,EAAO;AAAA,YACL,QAAA,EAAU,OAAA;AAAA,YACV,MAAA,EAAQ,MAAA;AAAA;AAAA,YACR,MAAM,OAAA,CAAQ,IAAA;AAAA,YACd,SAAA,EAAW,kBAAA;AAAA,YACX,UAAA,EAAY,iBAAA;AAAA,YACZ,KAAA,EAAO,MAAA;AAAA,YACP,OAAA,EAAS,SAAA;AAAA,YACT,YAAA,EAAc,KAAA;AAAA,YACd,QAAA,EAAU,MAAA;AAAA,YACV,aAAA,EAAe,MAAA;AAAA,YACf,MAAA,EAAQ,GAAA;AAAA,YACR,UAAA,EAAY;AAAA,WACd;AAAA,UAEC,QAAA,EAAA,OAAA,CAAQ;AAAA;AAAA,OACX;AAAA,sBAEFC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACb,QAAA,EAAA;AAAA,wBAAAD,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,SAAA,EAAU,kBAAA;AAAA,YACV,OAAA,EAAS,MAAM,eAAA,CAAgB,MAAM,CAAA;AAAA,YACrC,gBAAc,WAAA,KAAgB,MAAA;AAAA,YAC9B,YAAA,EAAc,CAAC,CAAA,KAAM,gBAAA,CAAiB,GAAG,cAAI,CAAA;AAAA,YAC7C,UAAA,EAAY,cAAA;AAAA,YACZ,aAAA,EAAe,cAAA;AAAA,YACf,KAAA,EAAM,cAAA;AAAA,YAEN,QAAA,kBAAAA,GAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAK,MAAA,EAAO;AAAA;AAAA,SACvB;AAAA,wBACAA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,SAAA,EAAU,kBAAA;AAAA,YACV,OAAA,EAAS,MAAM,eAAA,CAAgB,QAAQ,CAAA;AAAA,YACvC,gBAAc,WAAA,KAAgB,QAAA;AAAA,YAC9B,YAAA,EAAc,CAAC,CAAA,KAAM,gBAAA,CAAiB,GAAG,cAAI,CAAA;AAAA,YAC7C,UAAA,EAAY,cAAA;AAAA,YACZ,aAAA,EAAe,cAAA;AAAA,YACf,KAAA,EAAM,cAAA;AAAA,YAEN,QAAA,kBAAAA,GAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAK,QAAA,EAAS;AAAA;AAAA,SACzB;AAAA,wBACAA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,SAAA,EAAU,kBAAA;AAAA,YACV,OAAA,EAAS,MAAM,eAAA,CAAgB,UAAU,CAAA;AAAA,YACzC,gBAAc,WAAA,KAAgB,UAAA;AAAA,YAC9B,YAAA,EAAc,CAAC,CAAA,KAAM,gBAAA,CAAiB,GAAG,cAAI,CAAA;AAAA,YAC7C,UAAA,EAAY,cAAA;AAAA,YACZ,aAAA,EAAe,cAAA;AAAA,YACf,KAAA,EAAM,cAAA;AAAA,YAEN,QAAA,kBAAAA,GAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAK,SAAA,EAAU;AAAA;AAAA,SAC1B;AAAA,wBACAA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,SAAA,EAAU,kBAAA;AAAA,YACV,OAAA,EAAS,MAAM,eAAA,CAAgB,UAAU,CAAA;AAAA,YACzC,gBAAc,WAAA,KAAgB,UAAA;AAAA,YAC9B,YAAA,EAAc,CAAC,CAAA,KAAM,gBAAA,CAAiB,GAAG,cAAI,CAAA;AAAA,YAC7C,UAAA,EAAY,cAAA;AAAA,YACZ,aAAA,EAAe,cAAA;AAAA,YACf,KAAA,EAAM,cAAA;AAAA,YAEN,QAAA,kBAAAA,GAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAK,UAAA,EAAW;AAAA;AAAA;AAC3B,OAAA,EACF,CAAA;AAAA,MAEC,+BAAeA,GAAAA,CAAC,SAAI,SAAA,EAAU,yBAAA,EAA2B,wBAAa,CAAA,GAAS;AAAA,KAAA,EAClF,CAAA;AAAA,IAEC,WAAA,mBAAcA,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,uBAAA,EAAwB,OAAA,EAAS,gBAAgB,CAAA,GAAK,IAAA;AAAA,oBAEpFC,IAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,QAAA;AAAA,QACL,SAAA,EAAW,CAAA,oBAAA,EAAuB,WAAA,GAAc,SAAA,GAAY,EAAE,CAAA,CAAA;AAAA,QAC9D,eAAa,CAAC,WAAA;AAAA,QAEd,QAAA,EAAA;AAAA,0BAAAA,IAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,4BAAA;AAAA,cACV,YAAA,EAAc,sBAAA;AAAA,cACd,WAAA,EAAa,qBAAA;AAAA,cACb,UAAA,EAAY,oBAAA;AAAA,cAEZ,QAAA,EAAA;AAAA,gCAAAD,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EAA6B,QAAA,EAAA,WAAA,EAAY,CAAA;AAAA,gCACxDA,GAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,UAAS,SAAA,EAAU,kBAAA,EAAmB,OAAA,EAAS,cAAA,EAC1D,QAAA,kBAAAA,GAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAK,KAAI,CAAA,EACpB;AAAA;AAAA;AAAA,WACF;AAAA,0BACAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BAAA,EACZ,QAAA,EAAA;AAAA,YAAA,WAAA,KAAgB,MAAA,GACf,GAAA,CAAI,MAAA,mBACFD,GAAAA;AAAA,cAAC,OAAA;AAAA,cAAA;AAAA,gBACC,KAAA,EAAO,GAAA;AAAA,gBACP,QAAA,EAAU,CAAC,IAAA,KAAS;AAClB,kBAAA,WAAA,CAAY,IAAI,CAAA;AAChB,kBAAA,cAAA,EAAe;AAAA,gBACjB;AAAA;AAAA,gCAGFA,GAAAA,CAAC,SAAI,SAAA,EAAU,oBAAA,EAAqB,4CAAK,CAAA,GAEzC,IAAA;AAAA,YAEH,WAAA,KAAgB,QAAA,mBACfC,IAAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,8BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EACb,QAAA,EAAA;AAAA,gCAAAD,GAAAA;AAAA,kBAAC,OAAA;AAAA,kBAAA;AAAA,oBACC,SAAA,EAAU,oBAAA;AAAA,oBACV,WAAA,EAAY,gCAAA;AAAA,oBACZ,OAAO,MAAA,CAAO,KAAA;AAAA,oBACd,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,sBAAA,MAAM,CAAA,GAAI,EAAE,MAAA,CAAO,KAAA;AACnB,sBAAA,mBAAA,CAAoB,CAAC,CAAA;AACrB,sBAAA,IAAI,CAAC,CAAA,CAAE,IAAA,EAAK,WAAY,EAAE,CAAA;AAAA,oBAC5B,CAAA;AAAA,oBACA,UAAU,MAAA,KAAW,OAAA;AAAA,oBACrB,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,sBAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,EAAS,QAAA,CAAS,OAAO,KAAK,CAAA;AAAA,oBAC9C;AAAA;AAAA,iBACF;AAAA,gCACAA,GAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,WAAU,kBAAA,EAAmB,OAAA,EAAS,MAAM,QAAA,CAAS,OAAO,KAAK,CAAA,EAAG,QAAA,EAAU,MAAA,KAAW,SAAS,QAAA,EAAA,cAAA,EAExH;AAAA,eAAA,EACF,CAAA;AAAA,8BAEAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EACb,QAAA,EAAA;AAAA,gCAAAA,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,oBAAA,EACf,QAAA,EAAA;AAAA,kCAAAD,GAAAA;AAAA,oBAAC,OAAA;AAAA,oBAAA;AAAA,sBACC,IAAA,EAAK,UAAA;AAAA,sBACL,OAAA,EAAS,OAAA,CAAQ,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA;AAAA,sBACzC,QAAA,EAAU,CAAC,CAAA,KAAM,oBAAA,CAAqB,EAAE,SAAA,EAAW,CAAA,CAAE,MAAA,CAAO,OAAA,EAAS;AAAA;AAAA,mBACvE;AAAA,kBAAE;AAAA,iBAAA,EAEJ,CAAA;AAAA,gCACAC,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,oBAAA,EACf,QAAA,EAAA;AAAA,kCAAAD,GAAAA;AAAA,oBAAC,OAAA;AAAA,oBAAA;AAAA,sBACC,IAAA,EAAK,UAAA;AAAA,sBACL,OAAA,EAAS,OAAA,CAAQ,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA;AAAA,sBAC1C,QAAA,EAAU,CAAC,CAAA,KAAM,oBAAA,CAAqB,EAAE,UAAA,EAAY,CAAA,CAAE,MAAA,CAAO,OAAA,EAAS;AAAA;AAAA,mBACxE;AAAA,kBAAE;AAAA,iBAAA,EAEJ,CAAA;AAAA,gCACAC,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,oBAAA,EACf,QAAA,EAAA;AAAA,kCAAAD,GAAAA;AAAA,oBAAC,OAAA;AAAA,oBAAA;AAAA,sBACC,IAAA,EAAK,UAAA;AAAA,sBACL,OAAA,EAAS,OAAA,CAAQ,MAAA,CAAO,OAAA,CAAQ,eAAe,CAAA;AAAA,sBAC/C,QAAA,EAAU,CAAC,CAAA,KAAM,oBAAA,CAAqB,EAAE,eAAA,EAAiB,CAAA,CAAE,MAAA,CAAO,OAAA,EAAS;AAAA;AAAA,mBAC7E;AAAA,kBAAE;AAAA,iBAAA,EAEJ;AAAA,eAAA,EACF,CAAA;AAAA,8BAEAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mBAAA,EACb,QAAA,EAAA;AAAA,gCAAAA,KAAC,MAAA,EAAA,EAAK,QAAA,EAAA;AAAA,kBAAA,eAAA;AAAA,kBAAI,MAAA,CAAO,eAAA;AAAA,kBAAgB;AAAA,iBAAA,EAAC,CAAA;AAAA,gBACjC,OAAO,SAAA,mBAAYD,GAAAA,CAAC,MAAA,EAAA,EAAK,sCAAI,CAAA,GAAU,IAAA;AAAA,gBACvC,MAAA,CAAO,SAAA,mBACNA,GAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,SAAA,EAAU,mBAAA,EAAoB,OAAA,EAAS,cAAA,EAAgB,QAAA,EAAA,cAAA,EAE7E,CAAA,GACE;AAAA,eAAA,EACN,CAAA;AAAA,cAEC,MAAA,CAAO,QAAQ,MAAA,mBACdA,IAAC,gBAAA,EAAA,EAAiB,OAAA,EAAS,MAAA,CAAO,OAAA,EAAS,QAAA,EAAU,oBAAA,EAAsB,oBAE3EA,GAAAA,CAAC,SAAI,SAAA,EAAU,oBAAA,EAAsB,iBAAO,KAAA,CAAM,IAAA,EAAK,GAAI,gCAAA,GAAU,sCAAA,EAAS;AAAA,aAAA,EAElF,CAAA,GACE,IAAA;AAAA,YAEH,WAAA,KAAgB,UAAA,mBACfC,IAAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,8BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mBAAA,EACb,QAAA,EAAA;AAAA,gCAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qBAAA,EACb,QAAA,EAAA,MAAA,KAAW,OAAA,GAAU,SAAA,IAAa,cAAA,GAAO,MAAA,KAAW,SAAA,GAAY,gCAAA,GAAU,EAAA,EAC7E,CAAA;AAAA,gBACC,YAAA,mBAAeA,GAAAA,CAAC,MAAA,EAAA,EAAM,wBAAa,CAAA,GAAU;AAAA,eAAA,EAChD,CAAA;AAAA,8BACAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACb,QAAA,EAAA;AAAA,gCAAAD,GAAAA;AAAA,kBAAC,OAAA;AAAA,kBAAA;AAAA,oBACC,SAAA,EAAU,oBAAA;AAAA,oBACV,IAAA,EAAK,OAAA;AAAA,oBACL,GAAA,EAAK,CAAA;AAAA,oBACL,GAAA,EAAK,GAAA;AAAA,oBACL,IAAA,EAAM,CAAA;AAAA,oBACN,KAAA,EAAO,gBAAA;AAAA,oBACP,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,sBAAA,WAAA,EAAY;AACZ,sBAAA,YAAA,CAAa,MAAA,CAAO,CAAA,CAAE,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,oBACrC,CAAA;AAAA,oBACA,WAAA,EAAa,CAAC,CAAA,KAAM;AAClB,sBAAA,MAAM,CAAA,GAAI,MAAA,CAAQ,CAAA,CAAE,MAAA,CAA4B,KAAK,CAAA;AACrD,sBAAA,SAAA,CAAU,CAAC,CAAA;AAAA,oBACb,CAAA;AAAA,oBACA,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,sBAAA,IAAI,CAAA,CAAE,QAAQ,OAAA,EAAS;AACvB,sBAAA,MAAM,CAAA,GAAI,MAAA,CAAQ,CAAA,CAAE,MAAA,CAA4B,KAAK,CAAA;AACrD,sBAAA,YAAA,CAAa,CAAC,CAAA;AAAA,oBAChB;AAAA;AAAA,iBACF;AAAA,gCACAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gCAAA,EAAkC,QAAA,EAAA;AAAA,kBAAA,gBAAA;AAAA,kBAAiB;AAAA,iBAAA,EAAC;AAAA,eAAA,EACrE;AAAA,aAAA,EACF,CAAA,GACE,IAAA;AAAA,YAEH,gBAAgB,UAAA,mBACfA,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,wBAAA,EACb,QAAA,EAAA;AAAA,8BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BAAA,EACb,QAAA,EAAA;AAAA,gCAAAD,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BAAA,EAAgC,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,gCAChDC,IAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,iBAAA,EAAmB,WAAW,CAAA,0BAAA,EAA6B,cAAA,GAAiB,aAAA,GAAgB,EAAE,CAAA,CAAA,EACtG,QAAA,EAAA;AAAA,kCAAAD,GAAAA;AAAA,oBAAC,OAAA;AAAA,oBAAA;AAAA,sBACC,SAAA,EAAU,oBAAA;AAAA,sBACV,IAAA,EAAK,OAAA;AAAA,sBACL,GAAA,EAAK,OAAA;AAAA,sBACL,GAAA,EAAK,OAAA;AAAA,sBACL,IAAA,EAAM,CAAA;AAAA,sBACN,KAAA,EAAO,eAAA;AAAA,sBACP,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,wBAAA,MAAM,IAAA,GAAO,MAAA,CAAO,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA;AAClC,wBAAA,kBAAA,CAAmB,IAAI,CAAA;AACvB,wBAAA,gBAAA,CAAiB,IAAI,CAAA;AAAA,sBACvB,CAAA;AAAA,sBACA,aAAA,EAAe,MAAM,iBAAA,CAAkB,IAAI,CAAA;AAAA,sBAC3C,aAAa,MAAM;AACjB,wBAAA,iBAAA,CAAkB,KAAK,CAAA;AACvB,wBAAA,aAAA,EAAc;AAAA,sBAChB,CAAA;AAAA,sBACA,iBAAiB,MAAM;AACrB,wBAAA,iBAAA,CAAkB,KAAK,CAAA;AACvB,wBAAA,aAAA,EAAc;AAAA,sBAChB,CAAA;AAAA,sBACA,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,wBAAA,IAAI,CAAA,CAAE,QAAQ,OAAA,EAAS;AACvB,wBAAA,aAAA,EAAc;AAAA,sBAChB,CAAA;AAAA,sBACA,KAAA,EAAO;AAAA,wBACL,UAAA,EAAY,CAAA,0FAAA,EAA6F,mBAAmB,CAAA,kCAAA,EAAqC,mBAAmB,CAAA,uCAAA;AAAA,uBACtL;AAAA,sBACA,YAAA,EAAW;AAAA;AAAA,mBACb;AAAA,kCACAA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAA2B,KAAA,EAAO,EAAE,MAAM,CAAA,EAAG,aAAa,MAAM,KAAA,EAAO,CAAA,EAAG,aAAa,CAAA,EAAA,CAAA,EAAM,MAAA,EAAQ,GAAG,aAAa,CAAA,EAAA,CAAA,IACjI,QAAA,EAAA,eAAA,EACH;AAAA,iBAAA,EACF,CAAA;AAAA,gCACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BAA8B,QAAA,EAAA,GAAA,EAAC;AAAA,eAAA,EAChD,CAAA;AAAA,8BAEAA,GAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAK,QAAA;AAAA,kBACL,SAAA,EAAU,kBAAA;AAAA,kBACV,OAAA,EAAS,MAAM,gBAAA,CAAiB,CAAC,QAAQ,CAAA;AAAA,kBACzC,cAAA,EAAc,QAAA;AAAA,kBACd,YAAA,EAAY,WAAW,sFAAA,GAAmB,sFAAA;AAAA,kBAC1C,KAAA,EAAO,WAAW,gCAAA,GAAU,gCAAA;AAAA,kBAE5B,0BAAAA,GAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAM,QAAA,GAAW,QAAQ,MAAA,EAAQ;AAAA;AAAA;AAC5C,aAAA,EACF,CAAA,GACE;AAAA,WAAA,EACN;AAAA;AAAA;AAAA;AACF,GAAA,EACF,CAAA;AAEJ,CAAA;ACxeA,IAAM,gBAAA,GAAmB,GAAA;AACzB,IAAM,cAAA,GAAiB,IAAA;AAEvB,IAAM,KAAA,GAAQ,CAAC,CAAA,EAAW,GAAA,EAAa,GAAA,KAAgB,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,CAAC,CAAC,CAAA;AAErF,IAAM,cAAA,GAAiB,IAAI,KAAA,KAAqC,KAAA,CAAM,OAAO,OAAO,CAAA,CAAE,KAAK,GAAG,CAAA;AAE9F,IAAM,iCAAA,GAAoC,CAAC,kBAAA,KAAsC;AAC/E,EAAA,IAAI,CAAC,oBAAoB,OAAO,IAAA;AAChC,EAAA,MAAM,SAAA,GAAY,kBAAA,CAAmB,KAAA,CAAM,kCAAkC,CAAA;AAC7E,EAAA,IAAI,SAAA,GAAY,CAAC,CAAA,EAAG;AAClB,IAAA,IAAI;AACF,MAAA,OAAO,mBAAmB,SAAA,CAAU,CAAC,EAAE,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAC,CAAA;AAAA,IAC9D,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,SAAA,CAAU,CAAC,CAAA,CAAE,OAAA,CAAQ,UAAU,EAAE,CAAA;AAAA,IAC1C;AAAA,EACF;AAEA,EAAA,MAAM,KAAA,GAAQ,kBAAA,CAAmB,KAAA,CAAM,yCAAyC,CAAA;AAChF,EAAA,OAAO,KAAA,GAAQ,CAAC,CAAA,IAAK,KAAA,GAAQ,CAAC,CAAA,IAAK,IAAA;AACrC,CAAA;AAEA,IAAM,qBAAA,GAAwB,CAAC,IAAA,KAAiB;AAC9C,EAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,EAAA,IAAI,CAAC,SAAS,OAAO,WAAA;AACrB,EAAA,IAAI,QAAQ,WAAA,EAAY,CAAE,QAAA,CAAS,OAAO,GAAG,OAAO,OAAA;AACpD,EAAA,IAAI,CAAC,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA,EAAG,OAAO,GAAG,OAAO,CAAA,KAAA,CAAA;AAC7C,EAAA,OAAO,OAAA;AACT,CAAA;AAEA,IAAM,kBAAA,GAAqB,CAAC,GAAA,KAAgB;AAC1C,EAAA,IAAI;AACF,IAAA,MAAM,IAAI,IAAI,GAAA,CAAI,GAAA,EAAK,MAAA,CAAO,SAAS,IAAI,CAAA;AAC3C,IAAA,MAAM,IAAA,GAAO,EAAE,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,GAAA,EAAI;AACvD,IAAA,OAAO,IAAA,GAAO,kBAAA,CAAmB,IAAI,CAAA,GAAI,IAAA;AAAA,EAC3C,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF,CAAA;AAEA,IAAM,kBAAA,GAAqB,OAAO,GAAA,EAAa,MAAA,KAAwB;AACrE,EAAA,MAAM,MAAM,MAAM,KAAA,CAAM,GAAA,EAAK,EAAE,QAAQ,CAAA;AACvC,EAAA,IAAI,CAAC,IAAI,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAAS,GAAA,CAAI,MAAM,CAAA,CAAA,CAAG,CAAA;AACnD,EAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAE5B,EAAA,MAAM,aAAa,iCAAA,CAAkC,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,qBAAqB,CAAC,CAAA;AAC3F,EAAA,MAAM,OAAA,GAAU,mBAAmB,GAAG,CAAA;AACtC,EAAA,MAAM,QAAA,GAAW,qBAAA,CAAsB,UAAA,IAAc,OAAA,IAAW,WAAW,CAAA;AAC3E,EAAA,MAAM,IAAA,GAAO,KAAK,IAAA,IAAQ,sBAAA;AAE1B,EAAA,OAAO,IAAI,KAAK,CAAC,IAAI,GAAG,QAAA,EAAU,EAAE,MAAM,CAAA;AAC5C,CAAA;AAUO,IAAM,WAAA,GAAc,UAAA,CAA0D,SAASE,YAAAA,CAC5F;AAAA,EACE,IAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,kBAAA;AAAA,EACA,eAAA,GAAkB,GAAA;AAAA,EAClB,QAAA,EAAU,kBAAA;AAAA,EACV,gBAAA;AAAA,EACA,eAAA,GAAkB,KAAA;AAAA,EAClB,QAAA,EAAU,kBAAA;AAAA,EACV,gBAAA;AAAA,EACA,iBAAA,GAAoB,IAAA;AAAA,EACpB,uBAAuB,EAAE,SAAA,EAAW,OAAO,UAAA,EAAY,KAAA,EAAO,iBAAiB,KAAA,EAAM;AAAA,EACrF,OAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EACA,GAAA,EACA;AACA,EAAA,MAAM,OAAA,GAAUC,OAA8B,IAAI,CAAA;AAClD,EAAA,MAAM,aAAA,GAAgBA,OAA8B,IAAI,CAAA;AACxD,EAAA,MAAM,SAAA,GAAYA,OAAoD,IAAI,CAAA;AAE1E,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIC,SAAiD,MAAM,CAAA;AACnF,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAAiB,EAAE,CAAA;AACrD,EAAA,MAAM,CAAC,GAAA,EAAK,MAAM,CAAA,GAAIA,QAAAA,CAAoB,EAAE,CAAA;AAC5C,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,SAAS,KAAK,CAAA;AAClD,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,SAA8B,IAAI,CAAA;AAC1E,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,SAAS,CAAC,CAAA;AAChD,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIA,SAAqC,IAAI,CAAA;AAEvF,EAAA,MAAM,CAAC,oBAAA,EAAsB,uBAAuB,CAAA,GAAIA,SAAS,eAAe,CAAA;AAChF,EAAA,MAAM,CAAC,oBAAA,EAAsB,uBAAuB,CAAA,GAAIA,SAAS,eAAe,CAAA;AAEhF,EAAA,MAAM,WAAW,kBAAA,IAAsB,oBAAA;AACvC,EAAA,MAAM,WAAW,kBAAA,IAAsB,oBAAA;AAEvC,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,QAAAA,CAAsB;AAAA,IAChD,KAAA,EAAO,EAAA;AAAA,IACP,OAAA,EAAS,oBAAA;AAAA,IACT,eAAA,EAAiB,CAAA;AAAA,IACjB,SAAA,EAAW,KAAA;AAAA,IACX,SAAS;AAAC,GACX,CAAA;AAED,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,SAAwC,SAAS,CAAA;AAC7E,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAIA,SAAS,KAAK,CAAA;AAC9D,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,SAA6B,IAAI,CAAA;AACvE,EAAA,MAAM,SAAA,GAAYD,OAAO,MAAM,CAAA;AAC/B,EAAA,MAAM,YAAA,GAAeA,MAAAA,iBAAO,IAAI,OAAA,EAAmB,CAAA;AACnD,EAAA,MAAM,UAAA,GAAaA,MAAAA,CAAO,EAAE,MAAA,EAAQ,GAAG,MAAA,EAAQ,CAAA,EAAG,OAAA,EAAS,CAAA,EAAG,UAAU,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,WAAA,EAAa,OAAO,CAAA;AACjH,EAAA,MAAM,aAAA,GAAgBA,OAAO,KAAK,CAAA;AAElC,EAAA,MAAM,UAAA,GAAaE,OAAAA,CAAQ,MAAM,IAAA,CAAK,KAAA,CAAA,CAAO,YAAA,EAAc,QAAA,IAAY,CAAA,IAAK,GAAG,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAChG,EAAA,MAAM,gBAAA,GAAmB,YAAY,WAAA,GAAc,UAAA;AACnD,EAAA,MAAM,YAAA,GAAe,YAAA,EAAc,OAAA,EAAS,KAAA,IAAS,EAAA;AAGrD,EAAAC,UAAU,MAAM;AACd,IAAA,MAAM,KAAK,OAAA,CAAQ,OAAA;AACnB,IAAA,IAAI,CAAC,EAAA,EAAI;AACT,IAAA,MAAM,EAAA,GAAK,IAAI,cAAA,CAAe,CAAC,OAAA,KAAY;AACzC,MAAA,MAAM,CAAA,GAAI,QAAQ,CAAC,CAAA,EAAG,aAAa,KAAA,IAAS,EAAA,CAAG,uBAAsB,CAAE,KAAA;AACvE,MAAA,MAAM,OAAO,CAAA,IAAK,gBAAA,GAAmB,QAAA,GAAW,CAAA,IAAK,iBAAiB,MAAA,GAAS,SAAA;AAC/E,MAAA,SAAA,CAAU,CAAC,IAAA,KAAU,IAAA,KAAS,IAAA,GAAO,OAAO,IAAK,CAAA;AAAA,IACnD,CAAC,CAAA;AACD,IAAA,EAAA,CAAG,QAAQ,EAAE,CAAA;AACb,IAAA,OAAO,MAAM,GAAG,UAAA,EAAW;AAAA,EAC7B,CAAA,EAAG,EAAE,CAAA;AAGL,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,WAAW,QAAA,EAAU;AACzB,IAAA,cAAA,CAAe,IAAI,CAAA;AACnB,IAAA,mBAAA,CAAoB,KAAK,CAAA;AAAA,EAC3B,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAAA,UAAU,MAAM;AACd,IAAA,SAAA,CAAU,OAAA,GAAU,MAAA;AAAA,EACtB,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAA,MAAM,mBAAmB,WAAA,CAAY,MAAM,eAAe,IAAI,CAAA,EAAG,EAAE,CAAA;AAEnE,EAAA,MAAM,iBAAA,GAAoB,WAAA,CAAY,CAAC,KAAA,KAAuB;AAC5D,IAAA,mBAAA,CAAoB,IAAI,CAAA;AACxB,IAAA,cAAA,CAAe,CAAC,IAAA,KAAU,IAAA,KAAS,KAAA,GAAQ,OAAO,KAAM,CAAA;AAAA,EAC1D,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,aAAA,GAAgB,WAAA,CAAY,CAAC,CAAA,KAAoB;AACrD,IAAA,IAAI,SAAA,CAAU,YAAY,QAAA,EAAU;AACpC,IAAA,MAAM,IAAI,CAAA,CAAE,MAAA;AACZ,IAAA,IAAI,CAAC,CAAA,EAAG;AACR,IAAA,IAAI,EAAE,OAAA,CAAQ,oBAAoB,KAAK,CAAA,CAAE,OAAA,CAAQ,sBAAsB,CAAA,EAAG;AAC1E,IAAA,IAAI,CAAA,CAAE,OAAA,CAAQ,+EAA+E,CAAA,EAAG;AAChG,IAAA,UAAA,CAAW,QAAQ,QAAA,GAAW,IAAA;AAC9B,IAAA,UAAA,CAAW,QAAQ,KAAA,GAAQ,KAAA;AAC3B,IAAA,UAAA,CAAW,QAAQ,WAAA,GAAc,KAAA;AACjC,IAAA,UAAA,CAAW,OAAA,CAAQ,UAAU,CAAA,CAAE,SAAA;AAC/B,IAAA,UAAA,CAAW,OAAA,CAAQ,SAAS,CAAA,CAAE,OAAA;AAC9B,IAAA,UAAA,CAAW,OAAA,CAAQ,SAAS,CAAA,CAAE,OAAA;AAAA,EAChC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,aAAA,GAAgB,WAAA,CAAY,CAAC,CAAA,KAAoB;AACrD,IAAA,IAAI,CAAC,UAAA,CAAW,OAAA,CAAQ,QAAA,EAAU;AAClC,IAAA,MAAM,EAAA,GAAK,CAAA,CAAE,OAAA,GAAU,UAAA,CAAW,OAAA,CAAQ,MAAA;AAC1C,IAAA,MAAM,EAAA,GAAK,CAAA,CAAE,OAAA,GAAU,UAAA,CAAW,OAAA,CAAQ,MAAA;AAE1C,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,GAAI,CAAA,IAAK,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,GAAI,CAAA,EAAG,UAAA,CAAW,OAAA,CAAQ,KAAA,GAAQ,IAAA;AACrE,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,GAAI,CAAA,EAAG;AAEtB,IAAA,IAAI,KAAK,GAAA,CAAI,EAAE,IAAI,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,EAAG;AAC/B,MAAA,IAAI,KAAK,GAAA,CAAI,EAAE,KAAK,CAAA,EAAG,UAAA,CAAW,QAAQ,QAAA,GAAW,KAAA;AACrD,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,MAAM,GAAA,EAAK;AACb,MAAA,UAAA,CAAW,QAAQ,WAAA,GAAc,IAAA;AACjC,MAAA,UAAA,CAAW,QAAQ,QAAA,GAAW,KAAA;AAC9B,MAAA,mBAAA,CAAoB,IAAI,CAAA;AACxB,MAAA;AAAA,IACF;AACA,IAAA,IAAI,MAAM,EAAA,EAAI;AACZ,MAAA,UAAA,CAAW,QAAQ,WAAA,GAAc,IAAA;AACjC,MAAA,UAAA,CAAW,QAAQ,QAAA,GAAW,KAAA;AAC9B,MAAA,mBAAA,CAAoB,KAAK,CAAA;AACzB,MAAA,cAAA,CAAe,IAAI,CAAA;AAAA,IACrB;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,YAAA,GAAe,WAAA,CAAY,CAAC,CAAA,KAAoB;AACpD,IAAA,IAAI,SAAA,CAAU,YAAY,QAAA,EAAU;AAClC,MAAA,UAAA,CAAW,QAAQ,QAAA,GAAW,KAAA;AAC9B,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,UAAA,CAAW,QAAQ,WAAA,EAAa;AAClC,MAAA,UAAA,CAAW,QAAQ,QAAA,GAAW,KAAA;AAC9B,MAAA,UAAA,CAAW,QAAQ,KAAA,GAAQ,KAAA;AAC3B,MAAA,UAAA,CAAW,QAAQ,WAAA,GAAc,KAAA;AACjC,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,UAAA,CAAW,OAAA,CAAQ,QAAA,EAAU;AAChC,MAAA,UAAA,CAAW,QAAQ,KAAA,GAAQ,KAAA;AAC3B,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,EAAA,GAAK,CAAA,CAAE,OAAA,GAAU,UAAA,CAAW,OAAA,CAAQ,MAAA;AAC1C,IAAA,MAAM,EAAA,GAAK,CAAA,CAAE,OAAA,GAAU,UAAA,CAAW,OAAA,CAAQ,MAAA;AAC1C,IAAA,MAAM,EAAA,GAAK,CAAA,CAAE,SAAA,GAAY,UAAA,CAAW,OAAA,CAAQ,OAAA;AAC5C,IAAA,MAAM,KAAA,GAAQ,CAAC,UAAA,CAAW,OAAA,CAAQ,KAAA,IAAS,IAAA,CAAK,KAAA,CAAM,EAAA,EAAI,EAAE,CAAA,IAAK,EAAA,IAAM,EAAA,IAAM,GAAA;AAE7E,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,mBAAA,CAAoB,CAAC,IAAA,KAAS;AAC5B,QAAA,MAAM,OAAO,CAAC,IAAA;AACd,QAAA,IAAI,CAAC,IAAA,EAAM,cAAA,CAAe,IAAI,CAAA;AAC9B,QAAA,OAAO,IAAA;AAAA,MACT,CAAC,CAAA;AAAA,IACH;AAEA,IAAA,UAAA,CAAW,QAAQ,QAAA,GAAW,KAAA;AAC9B,IAAA,UAAA,CAAW,QAAQ,KAAA,GAAQ,KAAA;AAAA,EAC7B,CAAA,EAAG,EAAE,CAAA;AAEL,EAAAA,UAAU,MAAM;AACd,IAAA,MAAM,OAAO,OAAA,CAAQ,OAAA;AACrB,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,IAAA,CAAK,gBAAA,CAAiB,eAAe,aAAa,CAAA;AAClD,IAAA,IAAA,CAAK,gBAAA,CAAiB,eAAe,aAAa,CAAA;AAClD,IAAA,IAAA,CAAK,gBAAA,CAAiB,aAAa,YAAY,CAAA;AAC/C,IAAA,IAAA,CAAK,gBAAA,CAAiB,iBAAiB,YAAY,CAAA;AAEnD,IAAA,OAAO,MAAM;AACX,MAAA,IAAA,CAAK,mBAAA,CAAoB,eAAe,aAAa,CAAA;AACrD,MAAA,IAAA,CAAK,mBAAA,CAAoB,eAAe,aAAa,CAAA;AACrD,MAAA,IAAA,CAAK,mBAAA,CAAoB,aAAa,YAAY,CAAA;AAClD,MAAA,IAAA,CAAK,mBAAA,CAAoB,iBAAiB,YAAY,CAAA;AAAA,IACxD,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,aAAA,EAAe,aAAA,EAAe,YAAY,CAAC,CAAA;AAE/C,EAAA,MAAM,mBAAA,GAAsB,WAAA;AAAA,IAC1B,CAAC,IAAA,KAAkB;AACjB,MAAA,IAAI,kBAAA,IAAsB,IAAA,EAAM,uBAAA,CAAwB,IAAI,CAAA;AAC5D,MAAA,gBAAA,GAAmB,IAAI,CAAA;AACvB,MAAA,SAAA,CAAU,OAAA,EAAS,YAAY,IAAI,CAAA;AAAA,IACrC,CAAA;AAAA,IACA,CAAC,oBAAoB,gBAAgB;AAAA,GACvC;AAEA,EAAA,MAAM,mBAAA,GAAsB,WAAA;AAAA,IAC1B,CAAC,IAAA,KAAiB;AAChB,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,EAAM,EAAA,EAAI,GAAG,CAAA;AAChC,MAAA,IAAI,kBAAA,IAAsB,IAAA,EAAM,uBAAA,CAAwB,IAAI,CAAA;AAC5D,MAAA,gBAAA,GAAmB,IAAI,CAAA;AACvB,MAAA,SAAA,CAAU,OAAA,EAAS,YAAY,IAAI,CAAA;AAAA,IACrC,CAAA;AAAA,IACA,CAAC,oBAAoB,gBAAgB;AAAA,GACvC;AAEA,EAAA,MAAM,YAAA,GAAe,YAAY,MAAM;AACrC,IAAA,UAAA,CAAW,KAAK,CAAA;AAChB,IAAA,aAAA,CAAc,KAAK,CAAA;AAAA,EACrB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,WAAA,GAAc,YAAY,MAAM;AACpC,IAAA,SAAA,CAAU,SAAS,CAAA;AACnB,IAAA,YAAA,CAAa,EAAE,CAAA;AACf,IAAA,MAAA,CAAO,EAAE,CAAA;AACT,IAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,IAAA,YAAA,CAAa,KAAK,CAAA;AAClB,IAAA,cAAA,CAAe,CAAC,CAAA;AAChB,IAAA,SAAA,CAAU,CAAC,IAAA,MAAU,EAAE,GAAG,IAAA,EAAM,OAAA,EAAS,EAAC,EAAG,eAAA,EAAiB,CAAA,EAAG,SAAA,EAAW,KAAA,EAAM,CAAE,CAAA;AAAA,EACtF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,cAAA,GAAiB,WAAA;AAAA,IACrB,OAAO,QAAA,KAAmB;AACxB,MAAA,MAAM,SAAS,SAAA,CAAU,OAAA;AACzB,MAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,MAAA,WAAA,EAAY;AAEZ,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,CAAO,KAAK,QAAQ,CAAA;AAC1B,QAAA,SAAA,CAAU,OAAO,CAAA;AAAA,MACnB,SAAS,CAAA,EAAQ;AACf,QAAA,SAAA,CAAU,OAAO,CAAA;AACjB,QAAA,YAAA,CAAa,GAAG,OAAA,GAAU,MAAA,CAAO,CAAA,CAAE,OAAO,IAAI,0BAAM,CAAA;AACpD,QAAA,OAAA,GAAU,CAAC,CAAA;AAAA,MACb;AAAA,IACF,CAAA;AAAA,IACA,CAAC,SAAS,WAAW;AAAA,GACvB;AAEA,EAAA,MAAM,SAAA,GAAY,WAAA;AAAA,IAChB,OAAO,KAAA,KAAkB;AACvB,MAAA,MAAM,SAAS,SAAA,CAAU,OAAA;AACzB,MAAA,MAAM,UAAA,GAAa,MAAM,IAAA,EAAK;AAE9B,MAAA,SAAA,CAAU,CAAC,IAAA,MAAU;AAAA,QACnB,GAAG,IAAA;AAAA,QACH,KAAA;AAAA,QACA,OAAA,EAAS,UAAA,GAAa,IAAA,CAAK,OAAA,GAAU,EAAC;AAAA,QACtC,eAAA,EAAiB,CAAA;AAAA,QACjB,SAAA,EAAW,QAAQ,UAAU;AAAA,OAC/B,CAAE,CAAA;AAEF,MAAA,IAAI,CAAC,MAAA,IAAU,CAAC,UAAA,EAAY;AAC1B,QAAA,MAAA,EAAQ,WAAA,EAAY;AACpB,QAAA;AAAA,MACF;AAEA,MAAA,MAAA,CAAO,YAAA,EAAa;AACpB,MAAA,IAAI;AACF,QAAA,MAAM,UAAU,MAAM,MAAA,CAAO,MAAA,CAAO,UAAA,EAAY,OAAO,OAAO,CAAA;AAC9D,QAAA,SAAA,CAAU,CAAC,IAAA,MAAU,EAAE,GAAG,IAAA,EAAM,SAAS,SAAA,EAAW,KAAA,EAAO,eAAA,EAAiB,GAAA,EAAI,CAAE,CAAA;AAAA,MACpF,SAAS,CAAA,EAAG;AACV,QAAA,SAAA,CAAU,CAAC,IAAA,MAAU,EAAE,GAAG,IAAA,EAAM,SAAA,EAAW,OAAM,CAAE,CAAA;AACnD,QAAA,OAAA,GAAU,CAAC,CAAA;AAAA,MACb;AAAA,IACF,CAAA;AAAA,IACA,CAAC,OAAA,EAAS,MAAA,CAAO,OAAO;AAAA,GAC1B;AAGA,EAAAA,UAAU,MAAM;AACd,IAAA,MAAM,OAAO,aAAA,CAAc,OAAA;AAC3B,IAAA,IAAI,CAAC,IAAA,EAAM;AAEX,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,kBAAkB,IAAA,EAAM;AAAA,QACrC,QAAA;AAAA,QACA,QAAA;AAAA,QACA,OAAA,EAAS,CAAC,CAAA,KAAM,OAAA,GAAU,CAAC,CAAA;AAAA,QAC3B,OAAA,EAAS,CAAC,CAAA,KAAM,OAAA,GAAU,CAAC,CAAA;AAAA,QAC3B,UAAA,EAAY,CAAC,IAAA,KAAS;AACpB,UAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,UAAA,IAAI,CAAC,cAAc,OAAA,EAAS;AAC1B,YAAA,YAAA,CAAa,KAAK,CAAA;AAAA,UACpB;AACA,UAAA,UAAA,GAAa,IAAI,CAAA;AAAA,QACnB,CAAA;AAAA,QACA,KAAA,EAAO,CAAC,KAAA,KAAU,MAAA,CAAO,KAAK,CAAA;AAAA,QAC9B,gBAAA,EAAkB,CAAC,IAAA,KAAS;AAC1B,UAAA,MAAM,IAAI,IAAA,CAAK,QAAA;AACf,UAAA,IAAI,OAAO,CAAA,KAAM,QAAA,EAAU,SAAA,CAAU,CAAC,IAAA,MAAU,EAAE,GAAG,IAAA,EAAM,iBAAiB,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,GAAG,GAAE,CAAE,CAAA;AAAA,QACpG,CAAA;AAAA,QACA,aAAA,EAAe,CAAC,GAAA,KAAQ;AACtB,UAAA,IAAI,YAAA,CAAa,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA,EAAG;AACnC,UAAA,YAAA,CAAa,OAAA,CAAQ,IAAI,GAAG,CAAA;AAC5B,UAAA,GAAA,CAAI,gBAAA,CAAiB,eAAe,aAAa,CAAA;AACjD,UAAA,GAAA,CAAI,gBAAA,CAAiB,eAAe,aAAa,CAAA;AACjD,UAAA,GAAA,CAAI,gBAAA,CAAiB,aAAa,YAAY,CAAA;AAC9C,UAAA,GAAA,CAAI,gBAAA,CAAiB,iBAAiB,YAAY,CAAA;AAAA,QACpD;AAAA,OACD,CAAA;AACD,MAAA,SAAA,CAAU,OAAA,GAAU,MAAA;AACpB,MAAA,SAAA,CAAU,OAAO,CAAA;AAAA,IACnB,SAAS,CAAA,EAAQ;AACf,MAAA,SAAA,CAAU,OAAO,CAAA;AACjB,MAAA,YAAA,CAAa,GAAG,OAAA,GAAU,MAAA,CAAO,CAAA,CAAE,OAAO,IAAI,gCAAO,CAAA;AACrD,MAAA,OAAA,GAAU,CAAC,CAAA;AACX,MAAA;AAAA,IACF;AAEA,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,CAAU,SAAS,OAAA,EAAQ;AAC3B,MAAA,SAAA,CAAU,OAAA,GAAU,IAAA;AAAA,IACtB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,UAAA,EAAY,OAAO,CAAC,CAAA;AAEjC,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,KAAK,eAAe,IAAI,CAAA;AACxB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAU,SAAS,IAAA,EAAK;AAC9B,IAAA,IAAI,CAAC,OAAA,EAAS;AAEd,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,WAAA,EAAY;AACZ,IAAA,kBAAA,CAAmB,UAAU,CAAA;AAC7B,IAAA,IAAI,MAAA,GAAS,IAAA;AACb,IAAA,KAAA,CAAM,YAAY;AAChB,MAAA,IAAI;AACF,QAAA,MAAM,UAAA,GAAa,MAAM,kBAAA,CAAmB,OAAA,EAAS,WAAW,MAAM,CAAA;AACtE,QAAA,IAAI,CAAC,MAAA,EAAQ;AACb,QAAA,kBAAA,CAAmB,MAAM,CAAA;AACzB,QAAA,MAAM,eAAe,UAAU,CAAA;AAAA,MACjC,SAAS,CAAA,EAAQ;AACf,QAAA,IAAI,CAAA,EAAG,SAAS,YAAA,EAAc;AAC9B,QAAA,SAAA,CAAU,OAAO,CAAA;AACjB,QAAA,YAAA,CAAa,GAAG,OAAA,GAAU,MAAA,CAAO,CAAA,CAAE,OAAO,IAAI,0BAAM,CAAA;AACpD,QAAA,OAAA,GAAU,CAAC,CAAA;AAAA,MACb,CAAA,SAAE;AACA,QAAA,IAAI,MAAA,qBAA2B,IAAI,CAAA;AAAA,MACrC;AAAA,IACF,CAAA,GAAG;AAEH,IAAA,OAAO,MAAM;AACX,MAAA,MAAA,GAAS,KAAA;AACT,MAAA,kBAAA,CAAmB,IAAI,CAAA;AACvB,MAAA,UAAA,CAAW,KAAA,EAAM;AAAA,IACnB,CAAA;AAAA,EACF,GAAG,CAAC,IAAA,EAAM,SAAS,cAAA,EAAgB,OAAA,EAAS,WAAW,CAAC,CAAA;AAExD,EAAAA,UAAU,MAAM;AACd,IAAA,SAAA,CAAU,OAAA,EAAS,YAAY,QAAQ,CAAA;AAAA,EACzC,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAAA,UAAU,MAAM;AACd,IAAA,SAAA,CAAU,OAAA,EAAS,YAAY,QAAQ,CAAA;AAAA,EACzC,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAGb,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,iBAAA,EAAmB;AACxB,IAAA,MAAM,OAAO,OAAA,CAAQ,OAAA;AACrB,IAAA,IAAI,CAAC,IAAA,EAAM;AAEX,IAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAAqB;AAC1C,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,WAAA,EAAa,SAAA,CAAU,SAAS,QAAA,EAAS;AACvD,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,YAAA,EAAc,SAAA,CAAU,SAAS,QAAA,EAAS;AACxD,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,QAAA,EAAU,YAAA,EAAa;AAAA,IACvC,CAAA;AAEA,IAAA,IAAA,CAAK,gBAAA,CAAiB,WAAW,aAAa,CAAA;AAC9C,IAAA,OAAO,MAAM;AACX,MAAA,IAAA,CAAK,mBAAA,CAAoB,WAAW,aAAa,CAAA;AAAA,IACnD,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,YAAA,EAAc,iBAAiB,CAAC,CAAA;AAEpC,EAAA,mBAAA;AAAA,IACE,GAAA;AAAA,IACA,OAAO;AAAA,MACL,QAAA,EAAU,MAAM,SAAA,CAAU,OAAA,EAAS,QAAA,EAAS;AAAA,MAC5C,QAAA,EAAU,MAAM,SAAA,CAAU,OAAA,EAAS,QAAA,EAAS;AAAA,MAC5C,WAAA,EAAa,MAAM,SAAA,CAAU,OAAA,EAAS,WAAA,EAAY;AAAA,MAClD,WAAA,EAAa,MAAM,SAAA,CAAU,OAAA,EAAS,WAAA,EAAY;AAAA,MAClD,MAAM,CAAC,MAAA,KAAW,SAAA,CAAU,OAAA,EAAS,KAAK,MAAM,CAAA;AAAA,MAChD,cAAc,CAAC,IAAA,KAAS,SAAA,CAAU,OAAA,EAAS,aAAa,IAAI,CAAA;AAAA,MAC5D,MAAA,EAAQ,CAAC,CAAA,EAAG,CAAA,KAAO,UAAU,OAAA,GAAU,SAAA,CAAU,OAAA,CAAQ,MAAA,CAAO,GAAG,CAAC,CAAA,GAAI,OAAA,CAAQ,OAAA,CAAQ,EAAE,CAAA;AAAA,MAC1F,YAAA,EAAc,MAAM,SAAA,CAAU,OAAA,EAAS,YAAA,EAAa;AAAA,MACpD,WAAA,EAAa,MAAM,SAAA,CAAU,OAAA,EAAS,WAAA;AAAY,KACpD,CAAA;AAAA,IACA;AAAC,GACH;AAGA,EAAA,MAAM,eAAA,GAAkB,YAAY,MAAM;AACxC,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,aAAA,CAAc,OAAA,GAAU,IAAA;AAAA,EAC1B,CAAA,EAAG,EAAE,CAAA;AACL,EAAA,MAAM,gBAAA,GAAmB,YAAY,CAAC,CAAA,KAAc,eAAe,CAAC,CAAA,EAAG,EAAE,CAAA;AACzE,EAAA,MAAM,aAAA,GAAgB,WAAA,CAAY,CAAC,CAAA,KAAc;AAC/C,IAAA,aAAA,CAAc,OAAA,GAAU,KAAA;AACxB,IAAA,SAAA,CAAU,OAAA,EAAS,YAAA,CAAa,CAAA,GAAI,GAAG,CAAA;AAAA,EACzC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,eAAA,GAAkB,WAAA,CAAY,CAAC,IAAA,KAAkB;AACrD,IAAA,IAAI,IAAA,EAAM,SAAA,CAAU,OAAA,EAAS,IAAA,CAAK,IAAI,CAAA;AAAA,EACxC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,wBAAA,GAA2B,WAAA,CAAY,CAAC,GAAA,KAAgB;AAC5D,IAAA,IAAI,GAAA,EAAK,SAAA,CAAU,OAAA,EAAS,IAAA,CAAK,GAAG,CAAA;AAAA,EACtC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,uBACEL,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,OAAA;AAAA,MACL,SAAA,EAAW,cAAA,CAAe,aAAA,EAAe,SAAS,CAAA;AAAA,MAClD,KAAA;AAAA,MACA,YAAA,EAAY,WAAW,MAAA,GAAS,OAAA;AAAA,MAChC,aAAA,EAAa,MAAA;AAAA,MACb,QAAA,EAAU,CAAA;AAAA,MACV,aAAW,eAAA,IAAmB,IAAA;AAAA,MAE9B,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EAAsB,KAAK,aAAA,EAAe,CAAA;AAAA,QAExD,eAAA,mBACCC,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,sBAAA,EAAuB,IAAA,EAAK,QAAA,EAAS,WAAA,EAAU,QAAA,EAC5D,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EAAuB,eAAY,MAAA,EAAO,CAAA;AAAA,0BACzDA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAA6B,QAAA,EAAA,eAAA,KAAoB,UAAA,GAAa,6BAAS,0BAAA,EAAO;AAAA,SAAA,EAC/F,CAAA,GACE,IAAA;AAAA,QAEH,MAAA,KAAW,2BACVA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,UAAA,EAAY,gBAAA;AAAA,YACZ,WAAA,EAAa,WAAA;AAAA,YACb,aAAA,EAAe,iBAAA;AAAA,YACf,YAAA,EAAc,gBAAA;AAAA,YACd,YAAA,EAAc,kBAAA;AAAA,YACd,GAAA;AAAA,YACA,MAAA;AAAA,YACA,MAAA;AAAA,YACA,SAAA;AAAA,YACA,YAAA;AAAA,YACA,gBAAA;AAAA,YACA,QAAA;AAAA,YACA,QAAA;AAAA,YACA,WAAA,EAAa,eAAA;AAAA,YACb,QAAA,EAAU,CAAC,CAAA,KAAM,KAAK,UAAU,CAAC,CAAA;AAAA,YACjC,mBAAA,EAAqB,CAAC,CAAA,KAAM,SAAA,CAAU,CAAC,IAAA,MAAU,EAAE,GAAG,IAAA,EAAM,KAAA,EAAO,CAAA,EAAE,CAAE,CAAA;AAAA,YACvE,sBAAsB,CAAC,GAAA,KAAQ,SAAA,CAAU,CAAC,UAAU,EAAE,GAAG,IAAA,EAAM,OAAA,EAAS,EAAE,GAAG,IAAA,CAAK,SAAS,GAAG,GAAA,IAAM,CAAE,CAAA;AAAA,YACtG,cAAA,EAAgB,MAAM,SAAA,CAAU,OAAA,EAAS,YAAA,EAAa;AAAA,YACtD,oBAAA,EAAsB,wBAAA;AAAA,YACtB,WAAA,EAAa,eAAA;AAAA,YACb,YAAA,EAAc,gBAAA;AAAA,YACd,SAAA,EAAW,aAAA;AAAA,YACX,YAAA,EAAc,aAAA;AAAA,YACd,gBAAA,EAAkB,mBAAA;AAAA,YAClB,gBAAA,EAAkB;AAAA;AAAA,SACpB,mBAEAC,IAAAA,CAAAM,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,0BAAAP,GAAAA;AAAA,YAAC,cAAA;AAAA,YAAA;AAAA,cACC,WAAA,EAAa,MAAM,UAAA,CAAW,IAAI,CAAA;AAAA,cAClC,cAAA,EAAgB,MAAM,aAAA,CAAc,IAAI,CAAA;AAAA,cACxC,aAAA,EAAe,MAAM,SAAA,CAAU,OAAA,EAAS,WAAA,EAAY;AAAA,cACpD,UAAA,EAAY,MAAM,SAAA,CAAU,OAAA,EAAS,QAAA,EAAS;AAAA,cAC9C,UAAA,EAAY,MAAM,SAAA,CAAU,OAAA,EAAS,QAAA,EAAS;AAAA,cAC9C,aAAA,EAAe,MAAM,SAAA,CAAU,OAAA,EAAS,WAAA,EAAY;AAAA,cACpD,QAAA;AAAA,cACA,gBAAA,EAAkB,MAAM,mBAAA,CAAoB,CAAC,QAAQ,CAAA;AAAA,cACrD,QAAA;AAAA,cACA,gBAAA,EAAkB;AAAA;AAAA,WACpB;AAAA,UAAA,CAEE,OAAA,IAAW,+BAAeA,GAAAA,CAAC,SAAI,SAAA,EAAU,sBAAA,EAAuB,SAAS,YAAA,EAAc,CAAA;AAAA,0BAEzFA,GAAAA;AAAA,YAAC,SAAA;AAAA,YAAA;AAAA,cACC,MAAA,EAAQ,OAAA;AAAA,cACR,OAAA,EAAS,MAAM,UAAA,CAAW,KAAK,CAAA;AAAA,cAC/B,GAAA;AAAA,cACA,QAAA,EAAU;AAAA;AAAA,WACZ;AAAA,0BAEAA,GAAAA;AAAA,YAAC,YAAA;AAAA,YAAA;AAAA,cACC,MAAA,EAAQ,UAAA;AAAA,cACR,OAAA,EAAS,MAAM,aAAA,CAAc,KAAK,CAAA;AAAA,cAClC,MAAA;AAAA,cACA,MAAA;AAAA,cACA,QAAA,EAAU,CAAC,CAAA,KAAM,KAAK,UAAU,CAAC,CAAA;AAAA,cACjC,aAAA,EAAe,CAAC,CAAA,KAAM,SAAA,CAAU,CAAC,IAAA,MAAU,EAAE,GAAG,IAAA,EAAM,KAAA,EAAO,CAAA,EAAE,CAAE,CAAA;AAAA,cACjE,gBAAgB,CAAC,GAAA,KAAQ,SAAA,CAAU,CAAC,UAAU,EAAE,GAAG,IAAA,EAAM,OAAA,EAAS,EAAE,GAAG,IAAA,CAAK,SAAS,GAAG,GAAA,IAAM,CAAE,CAAA;AAAA,cAChG,cAAA,EAAgB,MAAM,SAAA,CAAU,OAAA,EAAS,YAAA,EAAa;AAAA,cACtD,cAAA,EAAgB;AAAA;AAAA,WAClB;AAAA,0BAEAA,GAAAA;AAAA,YAAC,gBAAA;AAAA,YAAA;AAAA,cACC,MAAA;AAAA,cACA,SAAA;AAAA,cACA,YAAA;AAAA,cACA,gBAAA;AAAA,cACA,WAAA,EAAa,eAAA;AAAA,cACb,YAAA,EAAc,gBAAA;AAAA,cACd,SAAA,EAAW,aAAA;AAAA,cACX,YAAA,EAAc;AAAA;AAAA;AAChB,SAAA,EACF;AAAA;AAAA;AAAA,GAEJ;AAEJ,CAAC","file":"react.js","sourcesContent":["import 'foliate-js/view.js'\r\nimport type { EBookReaderHandle, EBookReaderOptions, ProgressInfo, SearchOptions, SearchResult, TocItem } from './types.js'\r\n\r\ntype FoliateViewElement = HTMLElement & {\r\n book?: { toc?: TocItem[] }\r\n renderer?: {\r\n prevSection?: () => void\r\n nextSection?: () => void\r\n setStyles?: (css: string) => void\r\n render?: () => void\r\n expand?: () => void\r\n }\r\n open?: (file: File) => Promise<void>\r\n init?: (options?: unknown) => Promise<void>\r\n goLeft?: () => void\r\n goRight?: () => void\r\n goTo?: (target: string) => Promise<void> | void\r\n goToFraction?: (fraction: number) => Promise<void> | void\r\n search?: (options: unknown) => AsyncIterable<unknown>\r\n clearSearch?: () => void\r\n}\r\n\r\nconst getContentCSS = (fontSize: number, isDark: boolean, extraCSS?: string) => `\r\n@namespace epub \"http://www.idpf.org/2007/ops\";\r\nhtml {\r\n color-scheme: ${isDark ? 'dark' : 'light'} !important;\r\n}\r\nbody {\r\n background-color: transparent !important;\r\n color: ${isDark ? '#e0e0e0' : 'black'} !important;\r\n font-size: ${fontSize}% !important;\r\n}\r\np {\r\n line-height: 1.6;\r\n margin-bottom: 1em;\r\n}\r\na {\r\n color: ${isDark ? '#64b5f6' : '#2563eb'} !important;\r\n}\r\nimg {\r\n max-width: 100%;\r\n height: auto;\r\n object-fit: contain;\r\n ${isDark ? 'filter: brightness(0.8) contrast(1.2);' : ''}\r\n}\r\n${extraCSS ?? ''}\r\n`\r\n\r\nexport function createEBookReader(container: HTMLElement, options: EBookReaderOptions = {}): EBookReaderHandle {\r\n if (!container) throw new Error('container is required')\r\n if (!customElements.get('foliate-view')) throw new Error('foliate-view is not defined')\r\n\r\n const {\r\n darkMode: initialDarkMode = false,\r\n fontSize: initialFontSize = 100,\r\n extraContentCSS,\r\n onReady,\r\n onError,\r\n onProgress,\r\n onToc,\r\n onSearchProgress,\r\n onContentLoad,\r\n } = options\r\n\r\n let destroyed = false\r\n let toc: TocItem[] = []\r\n let fontSize = initialFontSize\r\n let darkMode = initialDarkMode\r\n let searchToken = 0\r\n\r\n container.innerHTML = ''\r\n\r\n const viewer = document.createElement('foliate-view') as FoliateViewElement\r\n viewer.style.display = 'block'\r\n viewer.style.width = '100%'\r\n viewer.style.height = '100%'\r\n viewer.setAttribute('margin', '48')\r\n viewer.setAttribute('gap', '0.07')\r\n\r\n const applyStyles = () => {\r\n if (destroyed) return\r\n if (!viewer.renderer?.setStyles) return\r\n viewer.renderer.setStyles(getContentCSS(fontSize, darkMode, extraContentCSS))\r\n requestAnimationFrame(() => {\r\n setTimeout(() => {\r\n if (destroyed) return\r\n viewer.renderer?.render?.()\r\n viewer.renderer?.expand?.()\r\n }, 50)\r\n })\r\n }\r\n\r\n const handleLoad = (e: Event) => {\r\n applyStyles()\r\n const detail = (e as CustomEvent).detail as { doc?: Document } | undefined\r\n if (detail?.doc) onContentLoad?.(detail.doc)\r\n }\r\n\r\n const handleRelocate = (e: Event) => {\r\n const detail = (e as CustomEvent).detail as ProgressInfo\r\n onProgress?.(detail)\r\n }\r\n\r\n viewer.addEventListener('load', handleLoad as EventListener)\r\n viewer.addEventListener('relocate', handleRelocate as EventListener)\r\n\r\n container.appendChild(viewer)\r\n\r\n const handle: EBookReaderHandle = {\r\n async open(file) {\r\n if (destroyed) return\r\n if (!file) return\r\n\r\n try {\r\n viewer.clearSearch?.()\r\n searchToken++\r\n\r\n await viewer.open?.(file)\r\n\r\n const nextToc = viewer.book?.toc ?? []\r\n toc = nextToc\r\n onToc?.(toc)\r\n\r\n await viewer.init?.({ showTextStart: true })\r\n applyStyles()\r\n } catch (error) {\r\n onError?.(error)\r\n throw error\r\n }\r\n },\r\n destroy() {\r\n if (destroyed) return\r\n destroyed = true\r\n searchToken++\r\n viewer.removeEventListener('load', handleLoad)\r\n viewer.removeEventListener('relocate', handleRelocate as EventListener)\r\n container.innerHTML = ''\r\n },\r\n prevPage() {\r\n viewer.goLeft?.()\r\n },\r\n nextPage() {\r\n viewer.goRight?.()\r\n },\r\n prevSection() {\r\n viewer.renderer?.prevSection?.()\r\n },\r\n nextSection() {\r\n viewer.renderer?.nextSection?.()\r\n },\r\n goTo(target) {\r\n if (!target) return\r\n viewer.goTo?.(target)\r\n },\r\n goToFraction(fraction) {\r\n const safe = Math.min(1, Math.max(0, fraction))\r\n viewer.goToFraction?.(safe)\r\n },\r\n setDarkMode(nextDarkMode) {\r\n darkMode = nextDarkMode\r\n applyStyles()\r\n },\r\n setFontSize(nextFontSize) {\r\n const safe = Math.min(300, Math.max(50, nextFontSize))\r\n fontSize = safe\r\n applyStyles()\r\n },\r\n async search(query, opts: SearchOptions = {}) {\r\n const normalized = query.trim()\r\n if (!normalized) {\r\n viewer.clearSearch?.()\r\n return []\r\n }\r\n\r\n const token = ++searchToken\r\n const results: SearchResult[] = []\r\n\r\n try {\r\n for await (const item of viewer.search?.({\r\n query: normalized,\r\n matchCase: Boolean(opts.matchCase),\r\n matchWholeWords: Boolean(opts.wholeWords),\r\n matchDiacritics: Boolean(opts.matchDiacritics),\r\n }) ?? []) {\r\n if (destroyed || token !== searchToken) return results\r\n\r\n if (item === 'done') {\r\n onSearchProgress?.({ done: true, progress: 1 })\r\n break\r\n }\r\n\r\n if (typeof item === 'object' && item && 'progress' in (item as any)) {\r\n const progress = (item as any).progress\r\n if (typeof progress === 'number') onSearchProgress?.({ progress })\r\n continue\r\n }\r\n\r\n const anyItem = item as any\r\n if (anyItem?.subitems?.length) {\r\n for (const sub of anyItem.subitems) {\r\n results.push({\r\n label: anyItem.label,\r\n cfi: sub?.cfi,\r\n excerpt: sub?.excerpt,\r\n title: sub?.title,\r\n })\r\n }\r\n } else if (anyItem?.cfi) {\r\n results.push({\r\n cfi: anyItem.cfi,\r\n excerpt: anyItem.excerpt,\r\n title: anyItem.title,\r\n })\r\n }\r\n }\r\n } catch (error) {\r\n onError?.(error)\r\n throw error\r\n }\r\n\r\n return results\r\n },\r\n cancelSearch() {\r\n searchToken++\r\n },\r\n clearSearch() {\r\n viewer.clearSearch?.()\r\n },\r\n getToc() {\r\n return toc\r\n },\r\n }\r\n\r\n onReady?.(handle)\r\n return handle\r\n}\r\n","export const icons: Record<string, string> = {\n list: '<path d=\"M3 12h18M3 6h18M3 18h18\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>',\n search: '<path d=\"M11 19a8 8 0 1 0 0-16 8 8 0 0 0 0 16zM21 21l-4.35-4.35\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>',\n 'chevron-left': '<path d=\"M15 18l-6-6 6-6\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>',\n 'chevron-right': '<path d=\"M9 18l6-6-6-6\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>',\n 'chevrons-left': '<path d=\"M11 17l-5-5 5-5M18 17l-5-5 5-5\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>',\n 'chevrons-right': '<path d=\"M13 17l5-5-5-5M6 17l5-5-5-5\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>',\n sun: '<circle cx=\"12\" cy=\"12\" r=\"5\" stroke=\"currentColor\" stroke-width=\"2\"/><path d=\"M12 1v2M12 21v2M4.22 4.22l1.42 1.42M18.36 18.36l1.42 1.42M1 12h2M21 12h2M4.22 19.78l1.42-1.42M18.36 5.64l1.42-1.42\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"/>',\n moon: '<path d=\"M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>',\n plus: '<path d=\"M12 5v14M5 12h14\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>',\n minus: '<path d=\"M5 12h14\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>',\n x: '<path d=\"M18 6L6 18M6 6l12 12\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>',\n type: '<path d=\"M4 7V4h16v3M9 20h6M12 4v16\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>',\n sliders: '<path d=\"M4 21v-7M4 10V3M12 21v-9M12 8V3M20 21v-5M20 12V3M1 14h6M9 8h6M17 16h6\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>',\n settings: '<path fill=\"currentColor\" fill-rule=\"evenodd\" d=\"M12.563 3.2h-1.126l-.645 2.578l-.647.2a6.3 6.3 0 0 0-1.091.452l-.599.317l-2.28-1.368l-.796.797l1.368 2.28l-.317.598a6.3 6.3 0 0 0-.453 1.091l-.199.647l-2.578.645v1.126l2.578.645l.2.647q.173.568.452 1.091l.317.599l-1.368 2.28l.797.796l2.28-1.368l.598.317q.523.278 1.091.453l.647.199l.645 2.578h1.126l.645-2.578l.647-.2a6.3 6.3 0 0 0 1.091-.452l.599-.317l2.28 1.368l.796-.797l-1.368-2.28l.317-.598q.278-.523.453-1.091l.199-.647l2.578-.645v-1.126l-2.578-.645l-.2-.647a6.3 6.3 0 0 0-.452-1.091l-.317-.599l1.368-2.28l-.797-.796l-2.28 1.368l-.598-.317a6.3 6.3 0 0 0-1.091-.453l-.647-.199zm2.945 2.17l1.833-1.1a1 1 0 0 1 1.221.15l1.018 1.018a1 1 0 0 1 .15 1.221l-1.1 1.833q.33.62.54 1.3l2.073.519a1 1 0 0 1 .757.97v1.438a1 1 0 0 1-.757.97l-2.073.519q-.21.68-.54 1.3l1.1 1.833a1 1 0 0 1-.15 1.221l-1.018 1.018a1 1 0 0 1-1.221.15l-1.833-1.1q-.62.33-1.3.54l-.519 2.073a1 1 0 0 1-.97.757h-1.438a1 1 0 0 1-.97-.757l-.519-2.073a7.5 7.5 0 0 1-1.3-.54l-1.833 1.1a1 1 0 0 1-1.221-.15L4.42 18.562a1 1 0 0 1-.15-1.221l1.1-1.833a7.5 7.5 0 0 1-.54-1.3l-2.073-.519A1 1 0 0 1 2 12.72v-1.438a1 1 0 0 1 .757-.97l2.073-.519q.21-.68.54-1.3L4.27 6.66a1 1 0 0 1 .15-1.221L5.438 4.42a1 1 0 0 1 1.221-.15l1.833 1.1q.62-.33 1.3-.54l.519-2.073A1 1 0 0 1 11.28 2h1.438a1 1 0 0 1 .97.757l.519 2.073q.68.21 1.3.54zM12 14.8a2.8 2.8 0 1 0 0-5.6a2.8 2.8 0 0 0 0 5.6m0 1.2a4 4 0 1 1 0-8a4 4 0 0 1 0 8\"/>'\n}\n","import { useMemo } from 'react'\nimport { icons } from '../../core/icons'\n\nexport type SvgIconProps = {\n name: string\n size?: number | string\n color?: string\n className?: string\n}\n\nexport const SvgIcon = ({ name, size = 24, color = 'currentColor', className }: SvgIconProps) => {\n const iconPath = icons[name] || ''\n\n const style = useMemo(() => {\n const sizeVal = typeof size === 'number' ? `${size}px` : size\n return {\n width: sizeVal,\n height: sizeVal,\n color: color,\n minWidth: sizeVal,\n display: 'inline-block',\n verticalAlign: 'middle',\n }\n }, [size, color])\n\n if (!iconPath) return null\n\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n style={style}\n className={className}\n dangerouslySetInnerHTML={{ __html: iconPath }}\n />\n )\n}\n","import { SvgIcon } from './SvgIcon'\r\n\r\ntype DesktopToolbarProps = {\r\n onToggleToc: () => void\r\n onToggleSearch: () => void\r\n onPrevSection: () => void\r\n onPrevPage: () => void\r\n onNextPage: () => void\r\n onNextSection: () => void\r\n darkMode: boolean\r\n onToggleDarkMode: () => void\r\n fontSize: number\r\n onFontSizeChange: (size: number) => void\r\n}\r\n\r\n/**\r\n * 桌面端工具栏组件\r\n */\r\nexport const DesktopToolbar = ({\r\n onToggleToc,\r\n onToggleSearch,\r\n onPrevSection,\r\n onPrevPage,\r\n onNextPage,\r\n onNextSection,\r\n darkMode,\r\n onToggleDarkMode,\r\n fontSize,\r\n onFontSizeChange,\r\n}: DesktopToolbarProps) => {\r\n return (\r\n <div className=\"epub-reader__toolbar\">\r\n <div className=\"epub-reader__panel\">\r\n <button type=\"button\" className=\"epub-reader__btn\" onClick={onToggleToc} title=\"目录\">\r\n <SvgIcon name=\"list\" />\r\n </button>\r\n <button type=\"button\" className=\"epub-reader__btn\" onClick={onToggleSearch} title=\"搜索\">\r\n <SvgIcon name=\"search\" />\r\n </button>\r\n <div className=\"epub-reader__divider\" />\r\n <button type=\"button\" className=\"epub-reader__btn\" onClick={onPrevSection} title=\"上一章\">\r\n <SvgIcon name=\"chevrons-left\" />\r\n </button>\r\n <button type=\"button\" className=\"epub-reader__btn\" onClick={onPrevPage} title=\"上一页\">\r\n <SvgIcon name=\"chevron-left\" />\r\n </button>\r\n <button type=\"button\" className=\"epub-reader__btn\" onClick={onNextPage} title=\"下一页\">\r\n <SvgIcon name=\"chevron-right\" />\r\n </button>\r\n <button type=\"button\" className=\"epub-reader__btn\" onClick={onNextSection} title=\"下一章\">\r\n <SvgIcon name=\"chevrons-right\" />\r\n </button>\r\n </div>\r\n\r\n <div className=\"epub-reader__panel\">\r\n <button type=\"button\" className=\"epub-reader__btn\" onClick={onToggleDarkMode} title=\"主题\">\r\n <SvgIcon name={darkMode ? 'sun' : 'moon'} />\r\n </button>\r\n <div className=\"epub-reader__divider\" />\r\n <button type=\"button\" className=\"epub-reader__btn\" onClick={() => onFontSizeChange(fontSize + 10)} title=\"增大字号\">\r\n <SvgIcon name=\"plus\" />\r\n </button>\r\n <div className=\"epub-reader__font\">{fontSize}%</div>\r\n <button type=\"button\" className=\"epub-reader__btn\" onClick={() => onFontSizeChange(fontSize - 10)} title=\"减小字号\">\r\n <SvgIcon name=\"minus\" />\r\n </button>\r\n </div>\r\n </div>\r\n )\r\n}\r\n","type DesktopBottomBarProps = {\n status: 'idle' | 'ready' | 'opening' | 'error'\n errorText: string\n sectionLabel: string\n displayedPercent: number\n onSeekStart: () => void\n onSeekChange: (val: number) => void\n onSeekEnd: (val: number) => void\n onSeekCommit: (val: number) => void\n}\n\n/**\n * 桌面端底部栏组件 (进度条)\n */\nexport const DesktopBottomBar = ({\n status,\n errorText,\n sectionLabel,\n displayedPercent,\n onSeekStart,\n onSeekChange,\n onSeekEnd,\n onSeekCommit,\n}: DesktopBottomBarProps) => {\n return (\n <div className=\"epub-reader__bottom\">\n <div className=\"epub-reader__bottom-left\">\n <span className=\"epub-reader__status\">\n {status === 'error' ? errorText || '错误' : status === 'opening' ? '正在打开…' : ''}\n </span>\n {sectionLabel ? <span className=\"epub-reader__section\">{sectionLabel}</span> : null}\n </div>\n <div className=\"epub-reader__bottom-right\">\n <input\n className=\"epub-reader__range\"\n type=\"range\"\n min={0}\n max={100}\n step={1}\n value={displayedPercent}\n onChange={(e) => {\n onSeekStart()\n onSeekChange(Number(e.target.value))\n }}\n onPointerUp={(e) => {\n const v = Number((e.target as HTMLInputElement).value)\n onSeekEnd(v)\n }}\n onKeyUp={(e) => {\n if (e.key !== 'Enter') return\n const v = Number((e.target as HTMLInputElement).value)\n onSeekCommit(v)\n }}\n />\n <span className=\"epub-reader__percent\">{displayedPercent}%</span>\n </div>\n </div>\n )\n}\n","import type { TocItem } from '../../core/types.js'\r\n\r\ntype TocTreeProps = {\r\n items: TocItem[]\r\n onSelect: (href?: string) => void\r\n}\r\n\r\n/**\r\n * 目录树组件\r\n * 递归渲染目录项\r\n */\r\nexport const TocTree = ({ items, onSelect }: TocTreeProps) => {\r\n return (\r\n <ul className=\"epub-reader__toc-list\">\r\n {items.map((item, idx) => {\r\n const key = item.href || `${item.label ?? 'item'}-${idx}`\r\n const hasChildren = Boolean(item.subitems?.length)\r\n const label = item.label || item.href || '未命名'\r\n\r\n if (!hasChildren) {\r\n return (\r\n <li key={key} className=\"epub-reader__toc-item\">\r\n <button type=\"button\" className=\"epub-reader__toc-btn\" onClick={() => onSelect(item.href)}>\r\n {label}\r\n </button>\r\n </li>\r\n )\r\n }\r\n\r\n return (\r\n <li key={key} className=\"epub-reader__toc-item\">\r\n <details className=\"epub-reader__toc-details\">\r\n <summary className=\"epub-reader__toc-summary\">{label}</summary>\r\n <TocTree items={item.subitems ?? []} onSelect={onSelect} />\r\n </details>\r\n </li>\r\n )\r\n })}\r\n </ul>\r\n )\r\n}\r\n","import type { TocItem } from '../../core/types.js'\nimport { TocTree } from './TocTree'\nimport { SvgIcon } from './SvgIcon'\n\ntype TocDrawerProps = {\n isOpen: boolean\n onClose: () => void\n toc: TocItem[]\n onSelect: (href?: string) => void\n}\n\n/**\n * 目录侧边栏组件\n */\nexport const TocDrawer = ({ isOpen, onClose, toc, onSelect }: TocDrawerProps) => {\n return (\n <aside className={`epub-reader__drawer ${isOpen ? 'is-open' : ''}`} aria-hidden={!isOpen}>\n <div className=\"epub-reader__drawer-header\">\n <div className=\"epub-reader__drawer-title\">目录</div>\n <button type=\"button\" className=\"epub-reader__btn\" onClick={onClose}>\n <SvgIcon name=\"x\" />\n </button>\n </div>\n <div className=\"epub-reader__drawer-body\">\n {toc.length ? (\n <TocTree\n items={toc}\n onSelect={(href) => {\n onSelect(href)\n onClose()\n }}\n />\n ) : (\n <div className=\"epub-reader__empty\">未找到目录</div>\n )}\n </div>\n </aside>\n )\n}\n","import type { SearchResult } from '../../core/types.js'\n\ntype SearchResultListProps = {\n results: SearchResult[]\n onSelect: (cfi: string) => void\n}\n\n/**\n * 搜索结果列表组件\n */\nexport const SearchResultList = ({ results, onSelect }: SearchResultListProps) => {\n return (\n <ul className=\"epub-reader__search-list\">\n {results.map((r, idx) => (\n <li key={`${r.cfi ?? 'no-cfi'}-${idx}`} className=\"epub-reader__search-item\">\n <button\n type=\"button\"\n className=\"epub-reader__search-btn\"\n onClick={() => {\n if (r.cfi) onSelect(r.cfi)\n }}\n >\n {r.label ? <div className=\"epub-reader__search-label\">{r.label}</div> : null}\n <div className=\"epub-reader__search-excerpt\">\n {typeof r.excerpt === 'string'\n ? r.excerpt\n : `${r.excerpt?.pre ?? ''}${r.excerpt?.match ?? ''}${r.excerpt?.post ?? ''}`}\n </div>\n </button>\n </li>\n ))}\n </ul>\n )\n}\n","import type { SearchState } from '../types.js'\nimport { SearchResultList } from './SearchResultList'\nimport { SvgIcon } from './SvgIcon'\n\ntype SearchDrawerProps = {\n isOpen: boolean\n onClose: () => void\n status: 'idle' | 'ready' | 'opening' | 'error'\n search: SearchState\n onSearch: (query: string) => void\n onQueryChange: (query: string) => void\n onOptionChange: (opt: Partial<SearchState['options']>) => void\n onCancelSearch: () => void\n onResultSelect: (cfi: string) => void\n}\n\n/**\n * 搜索侧边栏组件\n */\nexport const SearchDrawer = ({\n isOpen,\n onClose,\n status,\n search,\n onSearch,\n onQueryChange,\n onOptionChange,\n onCancelSearch,\n onResultSelect,\n}: SearchDrawerProps) => {\n return (\n <aside className={`epub-reader__drawer right ${isOpen ? 'is-open' : ''}`} aria-hidden={!isOpen}>\n <div className=\"epub-reader__drawer-header\">\n <div className=\"epub-reader__drawer-title\">搜索</div>\n <button type=\"button\" className=\"epub-reader__btn\" onClick={onClose}>\n <SvgIcon name=\"x\" />\n </button>\n </div>\n <div className=\"epub-reader__drawer-body\">\n <div className=\"epub-reader__field\">\n <input\n className=\"epub-reader__input\"\n placeholder=\"输入关键词\"\n value={search.query}\n onChange={(e) => {\n const v = e.target.value\n onQueryChange(v)\n if (!v.trim()) onSearch('')\n }}\n disabled={status !== 'ready'}\n onKeyDown={(e) => {\n if (e.key === 'Enter') onSearch(search.query)\n }}\n />\n <button type=\"button\" className=\"epub-reader__btn\" onClick={() => onSearch(search.query)} disabled={status !== 'ready'}>\n <SvgIcon name=\"search\" />\n </button>\n </div>\n\n <div className=\"epub-reader__checks\">\n <label className=\"epub-reader__check\">\n <input\n type=\"checkbox\"\n checked={Boolean(search.options.matchCase)}\n onChange={(e) => onOptionChange({ matchCase: e.target.checked })}\n />\n 区分大小写\n </label>\n <label className=\"epub-reader__check\">\n <input\n type=\"checkbox\"\n checked={Boolean(search.options.wholeWords)}\n onChange={(e) => onOptionChange({ wholeWords: e.target.checked })}\n />\n 全词匹配\n </label>\n <label className=\"epub-reader__check\">\n <input\n type=\"checkbox\"\n checked={Boolean(search.options.matchDiacritics)}\n onChange={(e) => onOptionChange({ matchDiacritics: e.target.checked })}\n />\n 区分变音\n </label>\n </div>\n\n <div className=\"epub-reader__meta\">\n <span>进度 {search.progressPercent}%</span>\n {search.searching ? <span>搜索中…</span> : null}\n {search.searching ? (\n <button type=\"button\" className=\"epub-reader__link\" onClick={onCancelSearch}>\n 取消\n </button>\n ) : null}\n </div>\n\n {search.results.length ? (\n <SearchResultList results={search.results} onSelect={onResultSelect} />\n ) : (\n <div className=\"epub-reader__empty\">{search.query.trim() ? '无匹配结果' : '请输入关键词'}</div>\n )}\n </div>\n </aside>\n )\n}\n","import { useEffect, useState, useRef } from 'react'\r\nimport type { TocItem } from '../../core/types.js'\r\nimport type { MobilePanel, SearchState } from '../types.js'\r\nimport { TocTree } from './TocTree'\r\nimport { SearchResultList } from './SearchResultList'\r\nimport { SvgIcon } from './SvgIcon'\r\n\r\ntype MobileUIProps = {\r\n barVisible: boolean\r\n activePanel: MobilePanel | null\r\n onTogglePanel: (panel: MobilePanel) => void\r\n onClosePanel: () => void\r\n toolbarRight?: React.ReactNode\r\n \r\n // Data props\r\n toc: TocItem[]\r\n search: SearchState\r\n status: 'idle' | 'ready' | 'opening' | 'error'\r\n errorText: string\r\n sectionLabel: string\r\n displayedPercent: number\r\n darkMode: boolean\r\n fontSize: number\r\n \r\n // Actions\r\n onTocSelect: (href?: string) => void\r\n \r\n onSearch: (query: string) => void\r\n onSearchQueryChange: (query: string) => void\r\n onSearchOptionChange: (opt: Partial<SearchState['options']>) => void\r\n onCancelSearch: () => void\r\n onSearchResultSelect: (cfi: string) => void\r\n \r\n onSeekStart: () => void\r\n onSeekChange: (val: number) => void\r\n onSeekEnd: (val: number) => void\r\n onSeekCommit: (val: number) => void\r\n \r\n onToggleDarkMode: (val: boolean) => void\r\n onFontSizeChange: (val: number) => void\r\n}\r\n\r\n/**\r\n * 移动端 UI 组件\r\n * 包含底部导航栏和弹出面板\r\n */\r\nexport const MobileUI = ({\r\n barVisible,\r\n activePanel,\r\n onTogglePanel,\r\n onClosePanel,\r\n toolbarRight,\r\n toc,\r\n search,\r\n status,\r\n errorText,\r\n sectionLabel,\r\n displayedPercent,\r\n darkMode,\r\n fontSize,\r\n onTocSelect,\r\n onSearch,\r\n onSearchQueryChange,\r\n onSearchOptionChange,\r\n onCancelSearch,\r\n onSearchResultSelect,\r\n onSeekStart,\r\n onSeekChange,\r\n onSeekEnd,\r\n onSeekCommit,\r\n onToggleDarkMode,\r\n onFontSizeChange,\r\n}: MobileUIProps) => {\r\n const mobileTitle = activePanel === 'menu' ? '目录' : activePanel === 'search' ? '搜索' : activePanel === 'progress' ? '进度' : activePanel === 'settings' ? '设置' : ''\r\n\r\n const displayedFontSize = Math.min(40, Math.max(10, Math.round(fontSize / 5)))\r\n const [fontSliderValue, setFontSliderValue] = useState(displayedFontSize)\r\n const [isFontDragging, setIsFontDragging] = useState(false)\r\n const fontDebounceRef = useRef<number | null>(null)\r\n const fontPendingRef = useRef(displayedFontSize)\r\n const fontSliderWrapRef = useRef<HTMLDivElement | null>(null)\r\n const [fontSliderWidth, setFontSliderWidth] = useState(0)\r\n const fontThumbSize = 34\r\n const fontMin = 10\r\n const fontMax = 40\r\n\r\n useEffect(() => {\r\n setFontSliderValue(displayedFontSize)\r\n fontPendingRef.current = displayedFontSize\r\n }, [displayedFontSize])\r\n\r\n useEffect(() => {\r\n return () => {\r\n if (fontDebounceRef.current) {\r\n clearTimeout(fontDebounceRef.current)\r\n fontDebounceRef.current = null\r\n }\r\n }\r\n }, [])\r\n\r\n useEffect(() => {\r\n if (activePanel !== 'settings') return\r\n const el = fontSliderWrapRef.current\r\n if (!el) return\r\n const update = () => setFontSliderWidth(el.getBoundingClientRect().width)\r\n update()\r\n const ro = new ResizeObserver(() => update())\r\n ro.observe(el)\r\n return () => ro.disconnect()\r\n }, [activePanel])\r\n\r\n const fontProgressPercent = ((fontSliderValue - fontMin) / (fontMax - fontMin)) * 100\r\n const fontThumbLeft = (() => {\r\n if (!fontSliderWidth) return 0\r\n const percent = (fontSliderValue - fontMin) / (fontMax - fontMin)\r\n const half = fontThumbSize / 2\r\n return Math.min(fontSliderWidth - half, Math.max(half, half + percent * (fontSliderWidth - fontThumbSize)))\r\n })()\r\n\r\n const flushFontSize = () => {\r\n if (fontDebounceRef.current) {\r\n clearTimeout(fontDebounceRef.current)\r\n fontDebounceRef.current = null\r\n }\r\n onFontSizeChange(fontPendingRef.current * 5)\r\n }\r\n\r\n const scheduleFontSize = (next: number) => {\r\n fontPendingRef.current = next\r\n if (fontDebounceRef.current) clearTimeout(fontDebounceRef.current)\r\n fontDebounceRef.current = window.setTimeout(() => {\r\n fontDebounceRef.current = null\r\n onFontSizeChange(fontPendingRef.current * 5)\r\n }, 80)\r\n }\r\n\r\n const [tooltip, setTooltip] = useState<{ text: string, left: number } | null>(null)\r\n const timerRef = useRef<number | null>(null)\r\n const ignoreToggleRef = useRef(false)\r\n\r\n const markIgnoreToggle = () => {\r\n ignoreToggleRef.current = true\r\n window.setTimeout(() => {\r\n ignoreToggleRef.current = false\r\n }, 350)\r\n }\r\n\r\n const closePanelSafe = () => {\r\n onClosePanel()\r\n handleTouchEnd()\r\n const el = document.activeElement\r\n if (el && el instanceof HTMLElement) el.blur()\r\n }\r\n\r\n const togglePanelSafe = (panel: MobilePanel) => {\r\n if (ignoreToggleRef.current) return\r\n onTogglePanel(panel)\r\n }\r\n\r\n const handleTouchStart = (e: React.TouchEvent, text: string) => {\r\n const rect = e.currentTarget.getBoundingClientRect()\r\n // 长按 500ms 后显示提示\r\n timerRef.current = window.setTimeout(() => {\r\n setTooltip({\r\n text,\r\n left: rect.left + rect.width / 2\r\n })\r\n }, 500)\r\n }\r\n\r\n const handleTouchEnd = () => {\r\n if (timerRef.current) {\r\n clearTimeout(timerRef.current)\r\n timerRef.current = null\r\n }\r\n setTooltip(null)\r\n }\r\n\r\n const sheetRef = useRef<HTMLDivElement>(null)\r\n const dragRef = useRef({ startY: 0, currentY: 0, isDragging: false })\r\n\r\n const handleHeaderTouchStart = (e: React.TouchEvent) => {\r\n handleTouchEnd()\r\n dragRef.current.startY = e.touches[0].clientY\r\n dragRef.current.isDragging = true\r\n if (sheetRef.current) {\r\n sheetRef.current.style.transition = 'none'\r\n }\r\n }\r\n\r\n const handleHeaderTouchMove = (e: React.TouchEvent) => {\r\n if (!dragRef.current.isDragging) return\r\n e.preventDefault()\r\n const deltaY = e.touches[0].clientY - dragRef.current.startY\r\n if (deltaY > 0 && sheetRef.current) {\r\n // 允许跟随手指下滑\r\n sheetRef.current.style.transform = `translateY(${deltaY}px)`\r\n dragRef.current.currentY = deltaY\r\n }\r\n }\r\n\r\n const handleHeaderTouchEnd = () => {\r\n if (!dragRef.current.isDragging) return\r\n dragRef.current.isDragging = false\r\n \r\n if (sheetRef.current) {\r\n sheetRef.current.style.transition = '' // 恢复 CSS 中的 transition\r\n \r\n // 如果下滑距离超过 80px,则关闭\r\n if (dragRef.current.currentY > 80) {\r\n markIgnoreToggle()\r\n closePanelSafe()\r\n // 稍微延迟清空 transform,避免闪烁,等待 CSS 类移除动画接管(或者直接依赖 is-open 类移除)\r\n // 这里 onClosePanel 会导致 activePanel 变 null,React 重新渲染,is-open 类移除\r\n // 下次打开时,activePanel 变为非 null,is-open 类添加,且 style 为空(重新渲染重置)\r\n // 但为了保险,手动重置一下 style,防止重新挂载前的动画问题\r\n setTimeout(() => {\r\n if (sheetRef.current) sheetRef.current.style.transform = ''\r\n }, 300)\r\n } else {\r\n // 回弹\r\n sheetRef.current.style.transform = ''\r\n }\r\n }\r\n dragRef.current.currentY = 0\r\n }\r\n\r\n return (\r\n <>\r\n <div className={`epub-reader__mbar ${barVisible ? 'is-visible' : ''}`}>\r\n {tooltip && (\r\n <div \r\n className=\"epub-reader__tooltip\" \r\n style={{ \r\n position: 'fixed', \r\n bottom: '60px', // 位于工具栏上方\r\n left: tooltip.left,\r\n transform: 'translateX(-50%)',\r\n background: 'rgba(0,0,0,0.8)',\r\n color: '#fff',\r\n padding: '4px 8px',\r\n borderRadius: '4px',\r\n fontSize: '12px',\r\n pointerEvents: 'none',\r\n zIndex: 1000,\r\n whiteSpace: 'nowrap'\r\n }}\r\n >\r\n {tooltip.text}\r\n </div>\r\n )}\r\n <div className=\"epub-reader__mbar-left\">\r\n <button \r\n type=\"button\" \r\n className=\"epub-reader__btn\" \r\n onClick={() => togglePanelSafe('menu')} \r\n aria-pressed={activePanel === 'menu'}\r\n onTouchStart={(e) => handleTouchStart(e, '目录')}\r\n onTouchEnd={handleTouchEnd}\r\n onTouchCancel={handleTouchEnd}\r\n title=\"目录\"\r\n >\r\n <SvgIcon name=\"list\" />\r\n </button>\r\n <button \r\n type=\"button\" \r\n className=\"epub-reader__btn\" \r\n onClick={() => togglePanelSafe('search')} \r\n aria-pressed={activePanel === 'search'}\r\n onTouchStart={(e) => handleTouchStart(e, '搜索')}\r\n onTouchEnd={handleTouchEnd}\r\n onTouchCancel={handleTouchEnd}\r\n title=\"搜索\"\r\n >\r\n <SvgIcon name=\"search\" />\r\n </button>\r\n <button \r\n type=\"button\" \r\n className=\"epub-reader__btn\" \r\n onClick={() => togglePanelSafe('progress')} \r\n aria-pressed={activePanel === 'progress'}\r\n onTouchStart={(e) => handleTouchStart(e, '进度')}\r\n onTouchEnd={handleTouchEnd}\r\n onTouchCancel={handleTouchEnd}\r\n title=\"进度\"\r\n >\r\n <SvgIcon name=\"sliders\" />\r\n </button>\r\n <button \r\n type=\"button\" \r\n className=\"epub-reader__btn\" \r\n onClick={() => togglePanelSafe('settings')} \r\n aria-pressed={activePanel === 'settings'}\r\n onTouchStart={(e) => handleTouchStart(e, '设置')}\r\n onTouchEnd={handleTouchEnd}\r\n onTouchCancel={handleTouchEnd}\r\n title=\"设置\"\r\n >\r\n <SvgIcon name=\"settings\" />\r\n </button>\r\n </div>\r\n\r\n {toolbarRight ? <div className=\"epub-reader__mbar-right\">{toolbarRight}</div> : null}\r\n </div>\r\n\r\n {activePanel ? <div className=\"epub-reader__moverlay\" onClick={closePanelSafe} /> : null}\r\n\r\n <div \r\n ref={sheetRef}\r\n className={`epub-reader__msheet ${activePanel ? 'is-open' : ''}`} \r\n aria-hidden={!activePanel}\r\n >\r\n <div \r\n className=\"epub-reader__msheet-header\"\r\n onTouchStart={handleHeaderTouchStart}\r\n onTouchMove={handleHeaderTouchMove}\r\n onTouchEnd={handleHeaderTouchEnd}\r\n >\r\n <div className=\"epub-reader__msheet-title\">{mobileTitle}</div>\r\n <button type=\"button\" className=\"epub-reader__btn\" onClick={closePanelSafe}>\r\n <SvgIcon name=\"x\" />\r\n </button>\r\n </div>\r\n <div className=\"epub-reader__msheet-body\">\r\n {activePanel === 'menu' ? (\r\n toc.length ? (\r\n <TocTree\r\n items={toc}\r\n onSelect={(href) => {\r\n onTocSelect(href)\r\n closePanelSafe()\r\n }}\r\n />\r\n ) : (\r\n <div className=\"epub-reader__empty\">未找到目录</div>\r\n )\r\n ) : null}\r\n\r\n {activePanel === 'search' ? (\r\n <>\r\n <div className=\"epub-reader__field\">\r\n <input\r\n className=\"epub-reader__input\"\r\n placeholder=\"输入关键词\"\r\n value={search.query}\r\n onChange={(e) => {\r\n const v = e.target.value\r\n onSearchQueryChange(v)\r\n if (!v.trim()) onSearch('')\r\n }}\r\n disabled={status !== 'ready'}\r\n onKeyDown={(e) => {\r\n if (e.key === 'Enter') onSearch(search.query)\r\n }}\r\n />\r\n <button type=\"button\" className=\"epub-reader__btn\" onClick={() => onSearch(search.query)} disabled={status !== 'ready'}>\r\n 搜索\r\n </button>\r\n </div>\r\n\r\n <div className=\"epub-reader__checks\">\r\n <label className=\"epub-reader__check\">\r\n <input\r\n type=\"checkbox\"\r\n checked={Boolean(search.options.matchCase)}\r\n onChange={(e) => onSearchOptionChange({ matchCase: e.target.checked })}\r\n />\r\n 区分大小写\r\n </label>\r\n <label className=\"epub-reader__check\">\r\n <input\r\n type=\"checkbox\"\r\n checked={Boolean(search.options.wholeWords)}\r\n onChange={(e) => onSearchOptionChange({ wholeWords: e.target.checked })}\r\n />\r\n 全词匹配\r\n </label>\r\n <label className=\"epub-reader__check\">\r\n <input\r\n type=\"checkbox\"\r\n checked={Boolean(search.options.matchDiacritics)}\r\n onChange={(e) => onSearchOptionChange({ matchDiacritics: e.target.checked })}\r\n />\r\n 区分变音\r\n </label>\r\n </div>\r\n\r\n <div className=\"epub-reader__meta\">\r\n <span>进度 {search.progressPercent}%</span>\r\n {search.searching ? <span>搜索中…</span> : null}\r\n {search.searching ? (\r\n <button type=\"button\" className=\"epub-reader__link\" onClick={onCancelSearch}>\r\n 取消\r\n </button>\r\n ) : null}\r\n </div>\r\n\r\n {search.results.length ? (\r\n <SearchResultList results={search.results} onSelect={onSearchResultSelect} />\r\n ) : (\r\n <div className=\"epub-reader__empty\">{search.query.trim() ? '无匹配结果' : '请输入关键词'}</div>\r\n )}\r\n </>\r\n ) : null}\r\n\r\n {activePanel === 'progress' ? (\r\n <>\r\n <div className=\"epub-reader__meta\">\r\n <span className=\"epub-reader__status\">\r\n {status === 'error' ? errorText || '错误' : status === 'opening' ? '正在打开…' : ''}\r\n </span>\r\n {sectionLabel ? <span>{sectionLabel}</span> : null}\r\n </div>\r\n <div className=\"epub-reader__mprogress\">\r\n <input\r\n className=\"epub-reader__range\"\r\n type=\"range\"\r\n min={0}\r\n max={100}\r\n step={1}\r\n value={displayedPercent}\r\n onChange={(e) => {\r\n onSeekStart()\r\n onSeekChange(Number(e.target.value))\r\n }}\r\n onPointerUp={(e) => {\r\n const v = Number((e.target as HTMLInputElement).value)\r\n onSeekEnd(v)\r\n }}\r\n onKeyUp={(e) => {\r\n if (e.key !== 'Enter') return\r\n const v = Number((e.target as HTMLInputElement).value)\r\n onSeekCommit(v)\r\n }}\r\n />\r\n <div className=\"epub-reader__mprogress-percent\">{displayedPercent}%</div>\r\n </div>\r\n </>\r\n ) : null}\r\n\r\n {activePanel === 'settings' ? (\r\n <div className=\"epub-reader__msettings\">\r\n <div className=\"epub-reader__mfont-range\">\r\n <div className=\"epub-reader__mfont-a is-small\">A</div>\r\n <div ref={fontSliderWrapRef} className={`epub-reader__mfont-slider ${isFontDragging ? 'is-dragging' : ''}`}>\r\n <input\r\n className=\"epub-reader__range\"\r\n type=\"range\"\r\n min={fontMin}\r\n max={fontMax}\r\n step={1}\r\n value={fontSliderValue}\r\n onChange={(e) => {\r\n const next = Number(e.target.value)\r\n setFontSliderValue(next)\r\n scheduleFontSize(next)\r\n }}\r\n onPointerDown={() => setIsFontDragging(true)}\r\n onPointerUp={() => {\r\n setIsFontDragging(false)\r\n flushFontSize()\r\n }}\r\n onPointerCancel={() => {\r\n setIsFontDragging(false)\r\n flushFontSize()\r\n }}\r\n onKeyUp={(e) => {\r\n if (e.key !== 'Enter') return\r\n flushFontSize()\r\n }}\r\n style={{\r\n background: `linear-gradient(to right, var(--epub-reader-range-fill) 0%, var(--epub-reader-range-fill) ${fontProgressPercent}%, var(--epub-reader-range-track) ${fontProgressPercent}%, var(--epub-reader-range-track) 100%)`,\r\n }}\r\n aria-label=\"字号\"\r\n />\r\n <div className=\"epub-reader__mfont-thumb\" style={{ left: `${fontThumbLeft}px`, width: `${fontThumbSize}px`, height: `${fontThumbSize}px` }}>\r\n {fontSliderValue}\r\n </div>\r\n </div>\r\n <div className=\"epub-reader__mfont-a is-big\">A</div>\r\n </div>\r\n\r\n <button\r\n type=\"button\"\r\n className=\"epub-reader__btn\"\r\n onClick={() => onToggleDarkMode(!darkMode)}\r\n aria-pressed={darkMode}\r\n aria-label={darkMode ? '暗黑模式:开,点击切换到亮色' : '暗黑模式:关,点击切换到暗黑'}\r\n title={darkMode ? '切换到亮色' : '切换到暗黑'}\r\n >\r\n <SvgIcon name={darkMode ? 'sun' : 'moon'} />\r\n </button>\r\n </div>\r\n ) : null}\r\n </div>\r\n </div>\r\n </>\r\n )\r\n}\r\n","import { forwardRef, useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react'\r\nimport { createEBookReader } from '../core/reader.js'\r\nimport type { ProgressInfo, TocItem } from '../core/types.js'\r\nimport type { EBookReaderReactHandle, EBookReaderReactProps, SearchState, MobilePanel } from './types.js'\r\nimport { DesktopToolbar } from './components/DesktopToolbar'\r\nimport { DesktopBottomBar } from './components/DesktopBottomBar'\r\nimport { TocDrawer } from './components/TocDrawer'\r\nimport { SearchDrawer } from './components/SearchDrawer'\r\nimport { MobileUI } from './components/MobileUI'\r\n\r\nconst MOBILE_MAX_WIDTH = 768\r\nconst WIDE_MIN_WIDTH = 1024\r\n\r\nconst clamp = (n: number, min: number, max: number) => Math.min(max, Math.max(min, n))\r\n\r\nconst mergeClassName = (...parts: Array<string | undefined>) => parts.filter(Boolean).join(' ')\r\n\r\nconst getFileNameFromContentDisposition = (contentDisposition: string | null) => {\r\n if (!contentDisposition) return null\r\n const starMatch = contentDisposition.match(/filename\\*\\s*=\\s*UTF-8''([^;]+)/i)\r\n if (starMatch?.[1]) {\r\n try {\r\n return decodeURIComponent(starMatch[1].replace(/^\"|\"$/g, ''))\r\n } catch {\r\n return starMatch[1].replace(/^\"|\"$/g, '')\r\n }\r\n }\r\n\r\n const match = contentDisposition.match(/filename\\s*=\\s*(?:\"([^\"]+)\"|([^;\\s]+))/i)\r\n return match?.[1] ?? match?.[2] ?? null\r\n}\r\n\r\nconst normalizeEpubFileName = (name: string) => {\r\n const trimmed = name.trim()\r\n if (!trimmed) return 'book.epub'\r\n if (trimmed.toLowerCase().endsWith('.epub')) return trimmed\r\n if (!trimmed.includes('.')) return `${trimmed}.epub`\r\n return trimmed\r\n}\r\n\r\nconst getFileNameFromUrl = (url: string) => {\r\n try {\r\n const u = new URL(url, window.location.href)\r\n const last = u.pathname.split('/').filter(Boolean).pop()\r\n return last ? decodeURIComponent(last) : null\r\n } catch {\r\n return null\r\n }\r\n}\r\n\r\nconst downloadEpubAsFile = async (url: string, signal: AbortSignal) => {\r\n const res = await fetch(url, { signal })\r\n if (!res.ok) throw new Error(`下载失败 (${res.status})`)\r\n const blob = await res.blob()\r\n\r\n const headerName = getFileNameFromContentDisposition(res.headers.get('content-disposition'))\r\n const urlName = getFileNameFromUrl(url)\r\n const fileName = normalizeEpubFileName(headerName ?? urlName ?? 'book.epub')\r\n const type = blob.type || 'application/epub+zip'\r\n\r\n return new File([blob], fileName, { type })\r\n}\r\n\r\n/**\r\n * EBookReader 组件\r\n *\r\n * 核心阅读器组件,负责:\r\n * 1. 管理核心 Reader 实例 (createEBookReader)\r\n * 2. 管理 UI 状态 (布局、弹窗、搜索状态等)\r\n * 3. 分发事件和数据给子组件 (Desktop/Mobile)\r\n */\r\nexport const EBookReader = forwardRef<EBookReaderReactHandle, EBookReaderReactProps>(function EBookReader(\r\n {\r\n file,\r\n fileUrl,\r\n className,\r\n style,\r\n mobileToolbarRight,\r\n defaultFontSize = 100,\r\n fontSize: controlledFontSize,\r\n onFontSizeChange,\r\n defaultDarkMode = false,\r\n darkMode: controlledDarkMode,\r\n onDarkModeChange,\r\n enableKeyboardNav = true,\r\n defaultSearchOptions = { matchCase: false, wholeWords: false, matchDiacritics: false },\r\n onReady,\r\n onError,\r\n onProgress,\r\n },\r\n ref,\r\n) {\r\n const rootRef = useRef<HTMLDivElement | null>(null)\r\n const viewerHostRef = useRef<HTMLDivElement | null>(null)\r\n const readerRef = useRef<ReturnType<typeof createEBookReader> | null>(null)\r\n\r\n const [status, setStatus] = useState<'idle' | 'ready' | 'opening' | 'error'>('idle')\r\n const [errorText, setErrorText] = useState<string>('')\r\n const [toc, setToc] = useState<TocItem[]>([])\r\n const [tocOpen, setTocOpen] = useState(false)\r\n const [searchOpen, setSearchOpen] = useState(false)\r\n const [progressInfo, setProgressInfo] = useState<ProgressInfo | null>(null)\r\n const [isSeeking, setIsSeeking] = useState(false)\r\n const [seekPercent, setSeekPercent] = useState(0)\r\n const [downloadLoading, setDownloadLoading] = useState<null | 'download' | 'open'>(null)\r\n\r\n const [uncontrolledFontSize, setUncontrolledFontSize] = useState(defaultFontSize)\r\n const [uncontrolledDarkMode, setUncontrolledDarkMode] = useState(defaultDarkMode)\r\n\r\n const fontSize = controlledFontSize ?? uncontrolledFontSize\r\n const darkMode = controlledDarkMode ?? uncontrolledDarkMode\r\n\r\n const [search, setSearch] = useState<SearchState>({\r\n query: '',\r\n options: defaultSearchOptions,\r\n progressPercent: 0,\r\n searching: false,\r\n results: [],\r\n })\r\n\r\n const [layout, setLayout] = useState<'mobile' | 'default' | 'wide'>('default')\r\n const [mobileBarVisible, setMobileBarVisible] = useState(false)\r\n const [mobilePanel, setMobilePanel] = useState<MobilePanel | null>(null)\r\n const layoutRef = useRef(layout)\r\n const boundDocsRef = useRef(new WeakSet<Document>())\r\n const gestureRef = useRef({ startX: 0, startY: 0, startAt: 0, tracking: false, moved: false, actionTaken: false })\r\n const isDraggingRef = useRef(false)\r\n\r\n const percentage = useMemo(() => Math.round((progressInfo?.fraction ?? 0) * 100), [progressInfo])\r\n const displayedPercent = isSeeking ? seekPercent : percentage\r\n const sectionLabel = progressInfo?.tocItem?.label ?? ''\r\n\r\n // 监听容器大小变化,切换布局模式\r\n useEffect(() => {\r\n const el = rootRef.current\r\n if (!el) return\r\n const ro = new ResizeObserver((entries) => {\r\n const w = entries[0]?.contentRect?.width ?? el.getBoundingClientRect().width\r\n const next = w <= MOBILE_MAX_WIDTH ? 'mobile' : w >= WIDE_MIN_WIDTH ? 'wide' : 'default'\r\n setLayout((prev) => (prev === next ? prev : next))\r\n })\r\n ro.observe(el)\r\n return () => ro.disconnect()\r\n }, [])\r\n\r\n // 布局切换时重置移动端面板状态\r\n useEffect(() => {\r\n if (layout === 'mobile') return\r\n setMobilePanel(null)\r\n setMobileBarVisible(false)\r\n }, [layout])\r\n\r\n useEffect(() => {\r\n layoutRef.current = layout\r\n }, [layout])\r\n\r\n const closeMobileSheet = useCallback(() => setMobilePanel(null), [])\r\n\r\n const toggleMobilePanel = useCallback((panel: MobilePanel) => {\r\n setMobileBarVisible(true)\r\n setMobilePanel((prev) => (prev === panel ? null : panel))\r\n }, [])\r\n\r\n const onPointerDown = useCallback((e: PointerEvent) => {\r\n if (layoutRef.current !== 'mobile') return\r\n const t = e.target as HTMLElement | null\r\n if (!t) return\r\n if (t.closest('.epub-reader__mbar') || t.closest('.epub-reader__msheet')) return\r\n if (t.closest('a,button,input,textarea,select,label,[role=\"button\"],[contenteditable=\"true\"]')) return\r\n gestureRef.current.tracking = true\r\n gestureRef.current.moved = false\r\n gestureRef.current.actionTaken = false\r\n gestureRef.current.startAt = e.timeStamp\r\n gestureRef.current.startX = e.screenX\r\n gestureRef.current.startY = e.screenY\r\n }, [])\r\n\r\n const onPointerMove = useCallback((e: PointerEvent) => {\r\n if (!gestureRef.current.tracking) return\r\n const dx = e.screenX - gestureRef.current.startX\r\n const dy = e.screenY - gestureRef.current.startY\r\n\r\n if (Math.abs(dx) > 8 || Math.abs(dy) > 8) gestureRef.current.moved = true\r\n if (Math.abs(dy) < 8) return\r\n\r\n if (Math.abs(dy) < Math.abs(dx)) {\r\n if (Math.abs(dx) >= 8) gestureRef.current.tracking = false\r\n return\r\n }\r\n\r\n if (dy <= -24) {\r\n gestureRef.current.actionTaken = true\r\n gestureRef.current.tracking = false\r\n setMobileBarVisible(true)\r\n return\r\n }\r\n if (dy >= 24) {\r\n gestureRef.current.actionTaken = true\r\n gestureRef.current.tracking = false\r\n setMobileBarVisible(false)\r\n setMobilePanel(null)\r\n }\r\n }, [])\r\n\r\n const onPointerEnd = useCallback((e: PointerEvent) => {\r\n if (layoutRef.current !== 'mobile') {\r\n gestureRef.current.tracking = false\r\n return\r\n }\r\n\r\n if (gestureRef.current.actionTaken) {\r\n gestureRef.current.tracking = false\r\n gestureRef.current.moved = false\r\n gestureRef.current.actionTaken = false\r\n return\r\n }\r\n\r\n if (!gestureRef.current.tracking) {\r\n gestureRef.current.moved = false\r\n return\r\n }\r\n\r\n const dx = e.screenX - gestureRef.current.startX\r\n const dy = e.screenY - gestureRef.current.startY\r\n const dt = e.timeStamp - gestureRef.current.startAt\r\n const isTap = !gestureRef.current.moved && Math.hypot(dx, dy) <= 10 && dt <= 300\r\n\r\n if (isTap) {\r\n setMobileBarVisible((prev) => {\r\n const next = !prev\r\n if (!next) setMobilePanel(null)\r\n return next\r\n })\r\n }\r\n\r\n gestureRef.current.tracking = false\r\n gestureRef.current.moved = false\r\n }, [])\r\n\r\n useEffect(() => {\r\n const root = rootRef.current\r\n if (!root) return\r\n root.addEventListener('pointerdown', onPointerDown)\r\n root.addEventListener('pointermove', onPointerMove)\r\n root.addEventListener('pointerup', onPointerEnd)\r\n root.addEventListener('pointercancel', onPointerEnd)\r\n\r\n return () => {\r\n root.removeEventListener('pointerdown', onPointerDown)\r\n root.removeEventListener('pointermove', onPointerMove)\r\n root.removeEventListener('pointerup', onPointerEnd)\r\n root.removeEventListener('pointercancel', onPointerEnd)\r\n }\r\n }, [onPointerDown, onPointerMove, onPointerEnd])\r\n\r\n const setDarkModeInternal = useCallback(\r\n (next: boolean) => {\r\n if (controlledDarkMode == null) setUncontrolledDarkMode(next)\r\n onDarkModeChange?.(next)\r\n readerRef.current?.setDarkMode(next)\r\n },\r\n [controlledDarkMode, onDarkModeChange],\r\n )\r\n\r\n const setFontSizeInternal = useCallback(\r\n (next: number) => {\r\n const safe = clamp(next, 50, 300)\r\n if (controlledFontSize == null) setUncontrolledFontSize(safe)\r\n onFontSizeChange?.(safe)\r\n readerRef.current?.setFontSize(safe)\r\n },\r\n [controlledFontSize, onFontSizeChange],\r\n )\r\n\r\n const closeDrawers = useCallback(() => {\r\n setTocOpen(false)\r\n setSearchOpen(false)\r\n }, [])\r\n\r\n const prepareOpen = useCallback(() => {\r\n setStatus('opening')\r\n setErrorText('')\r\n setToc([])\r\n setProgressInfo(null)\r\n setIsSeeking(false)\r\n setSeekPercent(0)\r\n setSearch((prev) => ({ ...prev, results: [], progressPercent: 0, searching: false }))\r\n }, [])\r\n\r\n const handleOpenFile = useCallback(\r\n async (nextFile: File) => {\r\n const reader = readerRef.current\r\n if (!reader) return\r\n\r\n prepareOpen()\r\n\r\n try {\r\n await reader.open(nextFile)\r\n setStatus('ready')\r\n } catch (e: any) {\r\n setStatus('error')\r\n setErrorText(e?.message ? String(e.message) : '打开失败')\r\n onError?.(e)\r\n }\r\n },\r\n [onError, prepareOpen],\r\n )\r\n\r\n const runSearch = useCallback(\r\n async (query: string) => {\r\n const reader = readerRef.current\r\n const normalized = query.trim()\r\n\r\n setSearch((prev) => ({\r\n ...prev,\r\n query,\r\n results: normalized ? prev.results : [],\r\n progressPercent: 0,\r\n searching: Boolean(normalized),\r\n }))\r\n\r\n if (!reader || !normalized) {\r\n reader?.clearSearch()\r\n return\r\n }\r\n\r\n reader.cancelSearch()\r\n try {\r\n const results = await reader.search(normalized, search.options)\r\n setSearch((prev) => ({ ...prev, results, searching: false, progressPercent: 100 }))\r\n } catch (e) {\r\n setSearch((prev) => ({ ...prev, searching: false }))\r\n onError?.(e)\r\n }\r\n },\r\n [onError, search.options],\r\n )\r\n\r\n // 初始化阅读器 Core\r\n useEffect(() => {\r\n const host = viewerHostRef.current\r\n if (!host) return\r\n\r\n try {\r\n const reader = createEBookReader(host, {\r\n darkMode,\r\n fontSize,\r\n onReady: (h) => onReady?.(h),\r\n onError: (e) => onError?.(e),\r\n onProgress: (info) => {\r\n setProgressInfo(info)\r\n if (!isDraggingRef.current) {\r\n setIsSeeking(false)\r\n }\r\n onProgress?.(info)\r\n },\r\n onToc: (items) => setToc(items),\r\n onSearchProgress: (info) => {\r\n const p = info.progress\r\n if (typeof p === 'number') setSearch((prev) => ({ ...prev, progressPercent: Math.round(p * 100) }))\r\n },\r\n onContentLoad: (doc) => {\r\n if (boundDocsRef.current.has(doc)) return\r\n boundDocsRef.current.add(doc)\r\n doc.addEventListener('pointerdown', onPointerDown)\r\n doc.addEventListener('pointermove', onPointerMove)\r\n doc.addEventListener('pointerup', onPointerEnd)\r\n doc.addEventListener('pointercancel', onPointerEnd)\r\n },\r\n })\r\n readerRef.current = reader\r\n setStatus('ready')\r\n } catch (e: any) {\r\n setStatus('error')\r\n setErrorText(e?.message ? String(e.message) : '初始化失败')\r\n onError?.(e)\r\n return\r\n }\r\n\r\n return () => {\r\n readerRef.current?.destroy()\r\n readerRef.current = null\r\n }\r\n }, [onError, onProgress, onReady])\r\n\r\n useEffect(() => {\r\n if (file) {\r\n void handleOpenFile(file)\r\n return\r\n }\r\n\r\n const nextUrl = fileUrl?.trim()\r\n if (!nextUrl) return\r\n\r\n const controller = new AbortController()\r\n prepareOpen()\r\n setDownloadLoading('download')\r\n let active = true\r\n void (async () => {\r\n try {\r\n const downloaded = await downloadEpubAsFile(nextUrl, controller.signal)\r\n if (!active) return\r\n setDownloadLoading('open')\r\n await handleOpenFile(downloaded)\r\n } catch (e: any) {\r\n if (e?.name === 'AbortError') return\r\n setStatus('error')\r\n setErrorText(e?.message ? String(e.message) : '下载失败')\r\n onError?.(e)\r\n } finally {\r\n if (active) setDownloadLoading(null)\r\n }\r\n })()\r\n\r\n return () => {\r\n active = false\r\n setDownloadLoading(null)\r\n controller.abort()\r\n }\r\n }, [file, fileUrl, handleOpenFile, onError, prepareOpen])\r\n\r\n useEffect(() => {\r\n readerRef.current?.setDarkMode(darkMode)\r\n }, [darkMode])\r\n\r\n useEffect(() => {\r\n readerRef.current?.setFontSize(fontSize)\r\n }, [fontSize])\r\n\r\n // 键盘导航\r\n useEffect(() => {\r\n if (!enableKeyboardNav) return\r\n const root = rootRef.current\r\n if (!root) return\r\n\r\n const handleKeyDown = (e: KeyboardEvent) => {\r\n if (e.key === 'ArrowLeft') readerRef.current?.prevPage()\r\n if (e.key === 'ArrowRight') readerRef.current?.nextPage()\r\n if (e.key === 'Escape') closeDrawers()\r\n }\r\n\r\n root.addEventListener('keydown', handleKeyDown)\r\n return () => {\r\n root.removeEventListener('keydown', handleKeyDown)\r\n }\r\n }, [closeDrawers, enableKeyboardNav])\r\n\r\n useImperativeHandle(\r\n ref,\r\n () => ({\r\n prevPage: () => readerRef.current?.prevPage(),\r\n nextPage: () => readerRef.current?.nextPage(),\r\n prevSection: () => readerRef.current?.prevSection(),\r\n nextSection: () => readerRef.current?.nextSection(),\r\n goTo: (target) => readerRef.current?.goTo(target),\r\n goToFraction: (frac) => readerRef.current?.goToFraction(frac),\r\n search: (q, o) => (readerRef.current ? readerRef.current.search(q, o) : Promise.resolve([])),\r\n cancelSearch: () => readerRef.current?.cancelSearch(),\r\n clearSearch: () => readerRef.current?.clearSearch(),\r\n }),\r\n [],\r\n )\r\n\r\n // 子组件回调 Helpers\r\n const handleSeekStart = useCallback(() => {\r\n setIsSeeking(true)\r\n isDraggingRef.current = true\r\n }, [])\r\n const handleSeekChange = useCallback((v: number) => setSeekPercent(v), [])\r\n const handleSeekEnd = useCallback((v: number) => {\r\n isDraggingRef.current = false\r\n readerRef.current?.goToFraction(v / 100)\r\n }, [])\r\n\r\n const handleTocSelect = useCallback((href?: string) => {\r\n if (href) readerRef.current?.goTo(href)\r\n }, [])\r\n\r\n const handleSearchResultSelect = useCallback((cfi: string) => {\r\n if (cfi) readerRef.current?.goTo(cfi)\r\n }, [])\r\n\r\n return (\r\n <div\r\n ref={rootRef}\r\n className={mergeClassName('epub-reader', className)}\r\n style={style}\r\n data-theme={darkMode ? 'dark' : 'light'}\r\n data-layout={layout}\r\n tabIndex={0}\r\n aria-busy={downloadLoading != null}\r\n >\r\n <div className=\"epub-reader__viewer\" ref={viewerHostRef} />\r\n\r\n {downloadLoading ? (\r\n <div className=\"epub-reader__loading\" role=\"status\" aria-live=\"polite\">\r\n <div className=\"epub-reader__spinner\" aria-hidden=\"true\" />\r\n <div className=\"epub-reader__loading-text\">{downloadLoading === 'download' ? '加载中…' : '渲染中…'}</div>\r\n </div>\r\n ) : null}\r\n\r\n {layout === 'mobile' ? (\r\n <MobileUI\r\n barVisible={mobileBarVisible}\r\n activePanel={mobilePanel}\r\n onTogglePanel={toggleMobilePanel}\r\n onClosePanel={closeMobileSheet}\r\n toolbarRight={mobileToolbarRight}\r\n toc={toc}\r\n search={search}\r\n status={status}\r\n errorText={errorText}\r\n sectionLabel={sectionLabel}\r\n displayedPercent={displayedPercent}\r\n darkMode={darkMode}\r\n fontSize={fontSize}\r\n onTocSelect={handleTocSelect}\r\n onSearch={(q) => void runSearch(q)}\r\n onSearchQueryChange={(v) => setSearch((prev) => ({ ...prev, query: v }))}\r\n onSearchOptionChange={(opt) => setSearch((prev) => ({ ...prev, options: { ...prev.options, ...opt } }))}\r\n onCancelSearch={() => readerRef.current?.cancelSearch()}\r\n onSearchResultSelect={handleSearchResultSelect}\r\n onSeekStart={handleSeekStart}\r\n onSeekChange={handleSeekChange}\r\n onSeekEnd={handleSeekEnd}\r\n onSeekCommit={handleSeekEnd}\r\n onToggleDarkMode={setDarkModeInternal}\r\n onFontSizeChange={setFontSizeInternal}\r\n />\r\n ) : (\r\n <>\r\n <DesktopToolbar\r\n onToggleToc={() => setTocOpen(true)}\r\n onToggleSearch={() => setSearchOpen(true)}\r\n onPrevSection={() => readerRef.current?.prevSection()}\r\n onPrevPage={() => readerRef.current?.prevPage()}\r\n onNextPage={() => readerRef.current?.nextPage()}\r\n onNextSection={() => readerRef.current?.nextSection()}\r\n darkMode={darkMode}\r\n onToggleDarkMode={() => setDarkModeInternal(!darkMode)}\r\n fontSize={fontSize}\r\n onFontSizeChange={setFontSizeInternal}\r\n />\r\n\r\n {(tocOpen || searchOpen) && <div className=\"epub-reader__overlay\" onClick={closeDrawers} />}\r\n\r\n <TocDrawer\r\n isOpen={tocOpen}\r\n onClose={() => setTocOpen(false)}\r\n toc={toc}\r\n onSelect={handleTocSelect}\r\n />\r\n\r\n <SearchDrawer\r\n isOpen={searchOpen}\r\n onClose={() => setSearchOpen(false)}\r\n status={status}\r\n search={search}\r\n onSearch={(q) => void runSearch(q)}\r\n onQueryChange={(v) => setSearch((prev) => ({ ...prev, query: v }))}\r\n onOptionChange={(opt) => setSearch((prev) => ({ ...prev, options: { ...prev.options, ...opt } }))}\r\n onCancelSearch={() => readerRef.current?.cancelSearch()}\r\n onResultSelect={handleSearchResultSelect}\r\n />\r\n\r\n <DesktopBottomBar\r\n status={status}\r\n errorText={errorText}\r\n sectionLabel={sectionLabel}\r\n displayedPercent={displayedPercent}\r\n onSeekStart={handleSeekStart}\r\n onSeekChange={handleSeekChange}\r\n onSeekEnd={handleSeekEnd}\r\n onSeekCommit={handleSeekEnd}\r\n />\r\n </>\r\n )}\r\n </div>\r\n )\r\n})\r\n"]}