@fayz-ai/storefront 0.12.0 → 0.12.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/stores/session.store.ts","../src/data/auth.ts","../src/lib/format.ts","../src/data/product-options.ts","../src/stores/delivery.store.ts","../src/stores/cart.store.ts","../src/data/facets.ts","../src/data/loaders.ts","../src/blocks/sections.ts","../src/document/config.ts","../src/lib/motion.tsx","../src/app/router.ts","../src/lib/testids.ts","../src/components/SmoothImage.tsx","../src/components/marketing/HeroSection.tsx","../src/stores/catalog.store.ts","../src/app/static-render.ts","../src/blocks/page-data.tsx","../src/components/collection/CategoryShowcase.tsx","../src/hooks/use-enquiry.ts","../src/hooks/use-storefront-actions.ts","../src/components/Price.tsx","../src/components/PaymentTerms.tsx","../src/extend/component-selectors.ts","../src/blocks/page-blocks.ts","../src/app/hydration.ts","../src/views/StorefrontPage.tsx","../src/extend/slots.tsx","../src/extend/extension-points.ts","../src/components/product/ProductCard.tsx","../src/extend/component-override.ts","../src/components/product/ProductRail.tsx","../src/components/marketing/MediaCarousel.tsx","../src/components/product/ProductSlider.tsx","../src/components/collection/ProductGrid.tsx","../src/hooks/use-categories.ts","../src/components/collection/FiltersPanel.tsx","../src/hooks/use-storefront-head.ts","../src/views/CatalogPage.tsx","../src/hooks/use-product.ts","../src/lib/seo.ts","../src/components/cart/QuantityInput.tsx","../src/components/product/ProductOptionSelector.tsx","../src/components/product/ProductSpecs.tsx","../src/components/product/ProductReviews.tsx","../src/hooks/use-products.ts","../src/components/product/ProductEnquiryForm.tsx","../src/components/product/ProductGallery.tsx","../src/components/product/RelatedProducts.tsx","../src/components/checkout/DeliveryEstimator.tsx","../src/views/ProductDetailPage.tsx","../src/components/marketing/FormBlock.tsx","../src/components/marketing/EntityList.tsx","../src/components/marketing/EditorialSections.tsx","../src/components/marketing/ConversionSections.tsx","../src/components/marketing/CollectionSections.tsx","../src/components/marketing/MiscSections.tsx","../src/components/layout/PageBodyBlocks.tsx","../src/blocks/registry.tsx","../src/document/store-policy.tsx","../src/lib/theme.ts","../src/components/layout/SearchOverlay.tsx","../src/components/layout/StorefrontHeader.tsx","../src/components/layout/StorefrontFooter.tsx","../src/hooks/use-discount-validator.ts","../src/stores/toast.store.ts","../src/components/cart/CartDrawer.tsx","../src/views/ContentPage.tsx","../src/app/serving.ts","../src/data/local-orders.ts","../src/lib/errors.ts","../src/workflows/checkout.ts","../src/components/account/SignInModal.tsx","../src/components/checkout/CheckoutSteps.tsx","../src/components/Skeleton.tsx","../src/components/checkout/CheckoutPayment.tsx","../src/components/order/SuccessMark.tsx","../src/views/CheckoutPage.tsx","../src/data/order-status.ts","../src/components/order/OrderTrackingTimeline.tsx","../src/components/account/section.ts","../src/components/account/CustomerAccountShell.tsx","../src/views/OrderConfirmationPage.tsx","../src/hooks/use-my-orders.ts","../src/views/MyPurchasesPage.tsx","../src/data/shipping-items.ts","../src/views/NotFoundPage.tsx","../src/views/PolicyPage.tsx","../src/components/layout/StorefrontErrorBoundary.tsx","../src/components/layout/Toaster.tsx","../src/app/createStorefrontApp.tsx","../src/document/sections.ts","../src/extend/component-contracts.ts","../src/document/validate.ts","../src/document/round-trip.ts"],"names":["create","persist","getShopProvider","s","createContext","useContext","useEffect","React","jsx","active","useState","useRef","initial","entry","jsxs","compact","getBlockMeta","useMemo","repairBlockTree","renderBlocks","registered","Fragment","ChevronLeft","ChevronRight","current","Truck","f","field","resolveEntityDeclaration","Icon","getLucideIcon","X","Mail","Search","ShoppingBag","toast","formatPostalCode","LABELS","Check","useCallback","validateDiscount","normalizePostalCode","lookupPostalCode","Lock","CreditCard","ShieldCheck","User","Package","MapPin","LogOut","QrCode","defaultRouterAdapter","isLoaderParamRef","isLoaderPropRef","checkBlockConstraints"],"mappings":";;;;;;;;;;;;;;;AAeO,IAAM,kBAAkB,MAAA,EAAqB;AAAA,EAClD,OAAA;AAAA,IACE,CAAC,GAAA,MAAS;AAAA,MACR,UAAA,EAAY,IAAA;AAAA,MACZ,KAAA,EAAO,IAAA;AAAA,MACP,IAAA,EAAM,IAAA;AAAA,MACN,UAAA,EAAY,CAAC,EAAE,UAAA,EAAY,OAAO,IAAA,EAAK,KACrC,GAAA,CAAI,EAAE,UAAA,EAAY,KAAA,EAAO,IAAA,EAAM,IAAA,IAAQ,MAAM,CAAA;AAAA,MAC/C,OAAA,EAAS,MAAM,GAAA,CAAI,EAAE,UAAA,EAAY,MAAM,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM;AAAA,KAClE,CAAA;AAAA,IACA,EAAE,MAAM,4BAAA;AAA6B;AAEzC;ACFO,IAAM,8BAAA,GAAN,cAA6C,KAAA,CAAM;AAAA,EAGxD,YAAY,KAAA,EAAe;AACzB,IAAA,KAAA,CAAM,yDAAyD,CAAA;AAC/D,IAAA,IAAA,CAAK,IAAA,GAAO,gCAAA;AACZ,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACf;AACF;AASA,IAAI,QAAA,GAA+B,IAAA;AAEnC,SAAS,cAAc,KAAA,EAAsC;AAC3D,EAAA,OAAO,OAAA;AAAA,IACL,KAAA,IACE,OAAO,KAAA,KAAU,QAAA,IACjB,gBAAgB,KAAA,IAChB,QAAA,IAAY,SACZ,SAAA,IAAa;AAAA,GACjB;AACF;AAEA,SAAS,oBACP,UAAA,EACsB;AACtB,EAAA,IAAI,CAAC,UAAA,EAAY,OAAO,EAAC;AACzB,EAAA,IAAI,OAAO,eAAe,QAAA,IAAY,aAAA,CAAc,UAAU,CAAA,EAAG,OAAO,EAAE,OAAA,EAAS,UAAA,EAAW;AAC9F,EAAA,OAAO,UAAA;AACT;AAEO,SAAS,kBAAA,CACd,YACA,QAAA,EACa;AACb,EAAA,MAAM,MAAA,GAAS,oBAAoB,UAAU,CAAA;AAC7C,EAAA,OAAO,iBAAA,CAAkB;AAAA,IACvB,UAAU,MAAA,CAAO,QAAA,IAAY,OAAO,OAAA,KAAY,QAAA,EAAU,cAAc,UAAA,GAAa,MAAA,CAAA;AAAA,IACrF,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,QAAQ,MAAA,CAAO,MAAA;AAAA,IACf,WAAA,EAAa,KAAA;AAAA,IACb,QAAA,EAAU;AAAA,MACR,GAAA,EAAK,MAAA,CAAO,QAAA,EAAU,GAAA,IAAO,QAAA,EAAU,WAAA;AAAA,MACvC,OAAA,EAAS,MAAA,CAAO,QAAA,EAAU,OAAA,IAAW,QAAA,EAAU,eAAA;AAAA,MAC/C,MAAA,EAAQ,OAAO,QAAA,EAAU,MAAA;AAAA,MACzB,WAAA,EAAa,OAAO,QAAA,EAAU,WAAA;AAAA,MAC9B,gBAAA,EAAkB,OAAO,QAAA,EAAU;AAAA;AACrC,GACD,CAAA,CAAE,OAAA;AACL;AAOA,IAAI,YAAA,GAA8B,IAAA;AAIlC,IAAI,YAAA,GAAe,KAAA;AAGnB,eAAe,gBAAgB,OAAA,EAAqC;AAClE,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,MAAM,OAAA,CAAQ,UAAA,EAAW;AAC1C,IAAA,YAAA,GAAe,QAAA,EAAU,QAAQ,WAAA,IAAe,IAAA;AAAA,EAClD,CAAA,CAAA,MAAQ;AACN,IAAA,YAAA,GAAe,IAAA;AAAA,EACjB;AACF;AAGO,SAAS,iBAAiB,OAAA,EAA4B;AAC3D,EAAA,QAAA,GAAW,OAAA;AAIX,EAAA,0BAAA,CAA2B,MAAM,YAAY,CAAA;AAE7C,EAAA,OAAA,CACG,UAAA,EAAW,CACX,IAAA,CAAK,CAAC,QAAA,KAAa;AAClB,IAAA,YAAA,GAAe,QAAA,EAAU,QAAQ,WAAA,IAAe,IAAA;AAChD,IAAA,IAAI,CAAC,QAAA,EAAU;AACf,IAAA,YAAA,GAAe,IAAA;AACf,IAAA,MAAM,KAAA,GAAQ,gBAAgB,QAAA,EAAS;AAEvC,IAAA,IAAI,KAAA,CAAM,KAAA,KAAU,QAAA,CAAS,IAAA,CAAK,KAAA,EAAO;AACvC,MAAA,KAAK,YAAA,CAAa,SAAS,IAAI,CAAA;AAAA,IACjC;AAAA,EACF,CAAC,CAAA,CACA,KAAA,CAAM,MAAM;AAAA,EAAC,CAAC,CAAA;AAEjB,EAAA,OAAA,CAAQ,iBAAA,CAAkB,CAAC,IAAA,KAAS;AAClC,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,YAAA,GAAe,IAAA;AAOf,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,YAAA,GAAe,KAAA;AACf,QAAA,eAAA,CAAgB,QAAA,GAAW,OAAA,EAAQ;AAAA,MACrC;AACA,MAAA;AAAA,IACF;AACA,IAAA,YAAA,GAAe,IAAA;AAGf,IAAA,KAAK,gBAAgB,OAAO,CAAA;AAAA,EAC9B,CAAC,CAAA;AACH;AAEO,SAAS,sBAAA,GAAsC;AACpD,EAAA,IAAI,CAAC,QAAA,EAAU,QAAA,GAAW,qBAAA,EAAsB;AAChD,EAAA,OAAO,QAAA;AACT;AAGA,eAAe,mBAAA,CAAoB,OAAe,IAAA,EAAc;AAC9D,EAAA,MAAM,WAAW,eAAA,EAAgB;AAGjC,EAAA,IAAI,QAAA,CAAS,iBAAiB,OAAO,QAAA,CAAS,gBAAgB,EAAE,KAAA,EAAO,MAAM,CAAA;AAC7E,EAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CAAS,aAAA,CAAc,EAAE,MAAA,EAAQ,KAAA,EAAO,KAAA,EAAO,EAAA,EAAI,CAAA;AACzE,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAA,CAAO,EAAE,KAAA,IAAS,EAAA,EAAI,WAAA,EAAY,KAAM,KAAK,CAAA;AAC5E,EAAA,IAAI,UAAU,OAAO,QAAA;AACrB,EAAA,MAAM,KAAA,GAAQ,KAAK,IAAA,EAAK,CAAE,MAAM,KAAK,CAAA,CAAE,OAAO,OAAO,CAAA;AACrD,EAAA,OAAO,SAAS,cAAA,CAAe;AAAA,IAC7B,SAAA,EAAW,MAAM,CAAC,CAAA,IAAK,MAAM,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,SAAA;AAAA,IAC9C,UAAU,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA,CAAE,KAAK,GAAG,CAAA;AAAA,IACjC;AAAA,GACD,CAAA;AACH;AAGA,eAAe,YAAA,CAAa,MAAgB,QAAA,EAAoD;AAC9F,EAAA,MAAM,SAAS,IAAA,CAAK,KAAA,IAAS,EAAA,EAAI,IAAA,GAAO,WAAA,EAAY;AACpD,EAAA,MAAM,IAAA,GAAO,QAAA,IAAY,IAAA,CAAK,QAAA,IAAY,EAAA;AAC1C,EAAA,MAAM,QAAA,GAAW,MAAM,mBAAA,CAAoB,KAAA,EAAO,IAAI,CAAA;AACtD,EAAA,eAAA,CAAgB,QAAA,GAAW,UAAA,CAAW;AAAA,IACpC,YAAY,QAAA,CAAS,EAAA;AAAA,IACrB,KAAA;AAAA,IACA,IAAA,EAAM,QAAQ,CAAA,EAAG,QAAA,CAAS,SAAS,CAAA,CAAA,EAAI,QAAA,CAAS,QAAQ,CAAA,CAAA,CAAG,IAAA;AAAK,GACjE,CAAA;AACD,EAAA,OAAO,EAAE,UAAA,EAAY,QAAA,CAAS,EAAA,EAAG;AACnC;AAaA,eAAsB,wBAAA,CACpB,OACA,IAAA,EACiC;AACjC,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,IAAA,EAAK,CAAE,WAAA,EAAY;AAC5C,EAAA,IAAI,MAAM,QAAA,EAAU;AAClB,IAAA,MAAM,UAAU,sBAAA,EAAuB;AACvC,IAAA,MAAM,UAAU,MAAM,OAAA,CAAQ,MAAA,CAAO,UAAA,EAAY,KAAK,QAAQ,CAAA;AAI9D,IAAA,YAAA,GAAe,QAAQ,WAAA,IAAe,IAAA;AACtC,IAAA,YAAA,GAAe,IAAA;AACf,IAAA,OAAO,YAAA,CAAa,OAAA,CAAQ,IAAA,CAAK,KAAA,GAAQ,QAAQ,IAAA,GAAO,EAAE,GAAG,OAAA,CAAQ,IAAA,EAAM,KAAA,EAAO,UAAA,EAAW,EAAG,KAAK,IAAI,CAAA;AAAA,EAC3G;AAIA,EAAA,OAAO,YAAA,CAAa,EAAU,OAAO,UAAA,EAAW,EAAe,MAAM,IAAI,CAAA;AAC3E;AAGO,SAAS,aAAA,CAAc,OAAe,IAAA,EAAgD;AAC3F,EAAA,OAAO,wBAAA,CAAyB,KAAA,EAAO,EAAE,IAAA,EAAM,CAAA;AACjD;AAGA,eAAsB,cAAA,CACpB,KAAA,EACA,QAAA,EACA,IAAA,EACiC;AACjC,EAAA,MAAM,UAAU,sBAAA,EAAuB;AACvC,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,IAAA,EAAK,CAAE,WAAA,EAAY;AAC5C,EAAA,MAAM,UAAU,MAAM,OAAA,CAAQ,MAAA,CAAO,UAAA,EAAY,UAAU,IAAI,CAAA;AAI/D,EAAA,IAAI,CAAC,OAAA,CAAQ,WAAA,EAAa,MAAM,IAAI,+BAA+B,UAAU,CAAA;AAC7E,EAAA,YAAA,GAAe,OAAA,CAAQ,WAAA;AACvB,EAAA,YAAA,GAAe,IAAA;AACf,EAAA,OAAO,YAAA,CAAa,OAAA,CAAQ,IAAA,CAAK,KAAA,GAAQ,OAAA,CAAQ,IAAA,GAAO,EAAE,GAAG,OAAA,CAAQ,IAAA,EAAM,KAAA,EAAO,UAAA,IAAc,IAAI,CAAA;AACtG;AAEA,eAAsB,eAAA,GAAiC;AACrD,EAAA,IAAI;AACF,IAAA,MAAM,sBAAA,GAAyB,OAAA,EAAQ;AAAA,EACzC,CAAA,SAAE;AACA,IAAA,YAAA,GAAe,IAAA;AACf,IAAA,YAAA,GAAe,KAAA;AACf,IAAA,eAAA,CAAgB,QAAA,GAAW,OAAA,EAAQ;AAAA,EACrC;AACF;;;ACrPO,SAAS,WAAA,CAAY,KAAA,EAAe,QAAA,GAAW,KAAA,EAAO,SAAS,OAAA,EAAiB;AACrF,EAAA,OAAO,IAAI,IAAA,CAAK,YAAA,CAAa,MAAA,EAAQ,EAAE,KAAA,EAAO,UAAA,EAAY,QAAA,EAAU,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA;AACpF;AAEO,SAAS,WAAW,KAAA,EAAuB;AAChD,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,GAAG,CAAA,GAAI,GAAA;AACnC;;;ACIA,SAAS,YAAY,KAAA,EAA0B;AAC7C,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,SAAU,EAAC;AACnC,EAAA,OAAO,MAAM,IAAA,CAAK,IAAI,GAAA,CAAI,KAAA,CAAM,OAAO,CAAC,IAAA,KAAyB,OAAO,IAAA,KAAS,YAAY,IAAA,CAAK,IAAA,GAAO,MAAA,GAAS,CAAC,CAAC,CAAC,CAAA;AACvH;AAEA,SAAS,iBAAiB,KAAA,EAA2C;AACnE,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,UAAU,OAAO,IAAA;AAChD,EAAA,MAAM,MAAA,GAAS,KAAA;AACf,EAAA,MAAM,EAAA,GAAK,OAAO,MAAA,CAAO,EAAA,KAAO,QAAA,GAAW,MAAA,CAAO,EAAA,GAAK,OAAO,MAAA,CAAO,IAAA,KAAS,QAAA,GAAW,MAAA,CAAO,IAAA,GAAO,IAAA;AACvG,EAAA,MAAM,KAAA,GAAQ,OAAO,MAAA,CAAO,KAAA,KAAU,QAAA,GAAW,MAAA,CAAO,KAAA,GAAQ,OAAO,MAAA,CAAO,IAAA,KAAS,QAAA,GAAW,MAAA,CAAO,IAAA,GAAO,EAAA;AAChH,EAAA,MAAM,MAAA,GAAS,WAAA,CAAY,MAAA,CAAO,MAAM,CAAA;AACxC,EAAA,IAAI,CAAC,EAAA,IAAM,CAAC,SAAS,MAAA,CAAO,MAAA,KAAW,GAAG,OAAO,IAAA;AACjD,EAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,MAAA,EAAO;AAC7B;AAIA,IAAM,qBAAA,uBAA4B,GAAA,EAAY;AAGvC,SAAS,sCAAA,GAA+C;AAC7D,EAAA,qBAAA,CAAsB,KAAA,EAAM;AAC9B;AAcO,SAAS,uBAAuB,OAAA,EAAwC;AAC7E,EAAA,IAAI,OAAA,CAAQ,OAAA,IAAW,OAAA,CAAQ,OAAA,CAAQ,SAAS,CAAA,EAAG;AACjD,IAAA,OAAO,CAAC,GAAG,OAAA,CAAQ,OAAO,CAAA,CACvB,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,QAAA,GAAW,CAAA,CAAE,QAAQ,CAAA,CACtC,GAAA,CAAI,CAAC,MAAA,MAAY,EAAE,EAAA,EAAI,MAAA,CAAO,IAAA,EAAM,KAAA,EAAO,MAAA,CAAO,IAAA,EAAM,MAAA,EAAQ,CAAC,GAAG,MAAA,CAAO,MAAM,GAAE,CAAE,CAAA;AAAA,EAC1F;AAEA,EAAA,MAAM,OAAA,GAAU,QAAQ,QAAA,CAAS,OAAA;AACjC,EAAA,MAAM,WAAW,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,GAClC,QAAQ,GAAA,CAAI,gBAAgB,CAAA,CAAE,MAAA,CAAO,CAAC,KAAA,KAAuC,OAAA,CAAQ,KAAK,CAAC,IAC3F,EAAC;AAEL,EAAA,MAAM,MAAA,GAA+B,CAAC,GAAG,QAAQ,CAAA;AACjD,EAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,IAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,OAAA,CAAQ,QAAA,CAAS,KAAK,CAAA;AAChD,IAAA,MAAM,MAAA,GAAS,WAAA,CAAY,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA;AAClD,IAAA,IAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,MAAA,CAAO,IAAA,CAAK,EAAE,EAAA,EAAI,SAAA,EAAW,KAAA,EAAO,SAAA,EAAW,MAAA,EAAQ,KAAA,EAAO,CAAA;AACpF,IAAA,IAAI,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,MAAA,CAAO,IAAA,CAAK,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,CAAA;AAAA,EAChF;AAEA,EAAA,IAAI,MAAA,CAAO,SAAS,CAAA,IAAK,CAAC,sBAAsB,GAAA,CAAI,OAAA,CAAQ,EAAE,CAAA,EAAG;AAC/D,IAAA,qBAAA,CAAsB,GAAA,CAAI,QAAQ,EAAE,CAAA;AACpC,IAAA,OAAA,CAAQ,IAAA;AAAA,MACN,CAAA,sBAAA,EAAyB,QAAQ,IAAI,CAAA,2OAAA;AAAA,KAGvC;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAQO,SAAS,0BAAA,CACd,SACA,SAAA,EACuB;AACvB,EAAA,MAAM,WAAW,OAAA,CAAQ,QAAA;AACzB,EAAA,IAAI,CAAC,QAAA,IAAY,QAAA,CAAS,MAAA,KAAW,GAAG,OAAO,IAAA;AAC/C,EAAA,MAAM,UAAA,GAAa,gCAAgC,SAAS,CAAA;AAC5D,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA;AACxC,EAAA,OACE,QAAA,CAAS,IAAA,CAAK,CAAC,OAAA,KAAY;AACzB,IAAA,MAAM,UAAU,OAAA,CAAQ,OAAA;AACxB,IAAA,OACE,OAAO,IAAA,CAAK,OAAO,CAAA,CAAE,MAAA,KAAW,OAAO,MAAA,IACvC,MAAA,CAAO,KAAA,CAAM,CAAC,CAAC,GAAA,EAAK,KAAK,MAAM,OAAA,CAAQ,GAAG,MAAM,KAAK,CAAA;AAAA,EAEzD,CAAC,CAAA,IAAK,IAAA;AAEV;AAIO,SAAS,cAAA,CAAe,SAAkB,SAAA,EAAmD;AAClG,EAAA,MAAM,OAAA,GAAU,0BAAA,CAA2B,OAAA,EAAS,SAAS,CAAA;AAC7D,EAAA,OAAO,OAAA,EAAS,SAAS,OAAA,CAAQ,KAAA;AACnC;AAEO,SAAS,gCAAgC,SAAA,EAAmE;AACjH,EAAA,IAAI,CAAC,SAAA,EAAW,OAAO,EAAC;AACxB,EAAA,OAAO,MAAA,CAAO,WAAA;AAAA,IACZ,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA,CACrB,OAAO,CAAC,KAAA,KAAqC,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA,EAAK,CAAE,MAAA,GAAS,KAAK,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA,EAAK,CAAE,MAAA,GAAS,CAAC,CAAA,CACrG,KAAK,CAAC,CAAC,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA,KAAM,CAAA,CAAE,aAAA,CAAc,CAAC,CAAC;AAAA,GAC1C;AACF;AAEO,SAAS,6BAA6B,SAAA,EAAmD;AAC9F,EAAA,OAAO,OAAO,OAAA,CAAQ,+BAAA,CAAgC,SAAS,CAAC,CAAA,CAC7D,IAAI,CAAC,CAAC,OAAO,KAAK,CAAA,KAAM,GAAG,KAAK,CAAA,EAAA,EAAK,KAAK,CAAA,CAAE,CAAA,CAC5C,KAAK,QAAK,CAAA;AACf;AAEO,SAAS,0BAA0B,SAAA,EAAmD;AAC3F,EAAA,MAAM,UAAA,GAAa,gCAAgC,SAAS,CAAA;AAC5D,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA;AACzC,EAAA,OAAO,QAAQ,MAAA,GAAS,CAAA,GAAI,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA,GAAI,EAAA;AACxD;AChFA,IAAM,KAAA,GAAQ;AAAA,EACZ,UAAA,EAAY,EAAA;AAAA,EACZ,OAAA,EAAS,IAAA;AAAA,EACT,SAAS,EAAC;AAAA,EACV,cAAA,EAAgB,IAAA;AAAA,EAChB,MAAA,EAAQ,MAAA;AAAA,EACR,KAAA,EAAO,IAAA;AAAA,EACP,WAAA,EAAa;AACf,CAAA;AAEO,IAAM,mBAAmBA,MAAAA,EAAsB;AAAA,EACpDC,OAAAA;AAAA,IACE,CAAC,KAAK,GAAA,MAAS;AAAA,MACb,GAAG,KAAA;AAAA,MAEH,MAAM,OAAA,CAAQ,UAAA,EAAoB,QAAA,EAAkB;AAClD,QAAA,MAAM,IAAA,GAAO,oBAAoB,UAAU,CAAA;AAC3C,QAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,UAAA,GAAA,CAAI,EAAE,GAAG,KAAA,EAAO,UAAA,EAAY,QAAQ,OAAA,EAAS,KAAA,EAAO,kCAA+B,CAAA;AACnF,UAAA;AAAA,QACF;AAEA,QAAA,GAAA,CAAI,EAAE,UAAA,EAAY,IAAA,EAAM,QAAQ,SAAA,EAAW,KAAA,EAAO,MAAM,CAAA;AASxD,QAAA,MAAM,OAAOC,eAAAA,EAAgB;AAc7B,QAAA,MAAM,cAAA,GAAiB,KAAK,aAAA,GACxB,IAAA,CACG,cAAc,IAAI,CAAA,CAClB,IAAA,CAAK,CAAC,KAAA,KAAW,KAAA,CAAM,UAAU,KAAA,CAAM,WAAA,IAAe,2BAAA,GAAwB,IAAK,CAAA,CACnF,KAAA,CAAM,MAAM,IAAI,CAAA,GACnB,OAAA,CAAQ,OAAA,CAAQ,IAAI,CAAA;AAExB,QAAA,IAAI,UAAiC,EAAC;AACtC,QAAA,IAAI;AACF,UAAA,OAAA,GAAW,MAAM,IAAA,CAAK,aAAA,GAAgB,IAAA,EAAM,QAAQ,KAAM,EAAC;AAAA,QAC7D,CAAA,CAAA,MAAQ;AACN,UAAA,GAAA,CAAI;AAAA,YAAE,GAAG,KAAA;AAAA,YAAO,UAAA,EAAY,IAAA;AAAA,YAAM,MAAA,EAAQ,OAAA;AAAA,YACpC,KAAA,EAAO;AAAA,WAA2D,CAAA;AACxE,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,cAAc,MAAM,cAAA;AAC1B,QAAA,IAAI,WAAA,YAAuB,EAAC;AAK5B,QAAA,IAAI,OAAA,GAAgC,IAAA;AACpC,QAAA,IAAI,QAAA,GAAW,KAAA;AACf,QAAA,IAAI;AACF,UAAA,OAAA,GAAU,MAAM,iBAAiB,IAAI,CAAA;AACrC,UAAA,QAAA,GAAW,OAAA,KAAY,IAAA;AAAA,QACzB,CAAA,CAAA,MAAQ;AACN,UAAA,OAAA,GAAU,IAAA;AAAA,QACZ;AAEA,QAAA,GAAA,CAAI;AAAA,UACF,UAAA,EAAY,IAAA;AAAA,UACZ,OAAA;AAAA,UACA,OAAA;AAAA,UACA,cAAA,EAAgB,OAAA,CAAQ,CAAC,CAAA,EAAG,MAAA,IAAU,IAAA;AAAA,UACtC,WAAA;AAAA;AAAA;AAAA;AAAA,UAIA,MAAA,EAAQ,OAAA,CAAQ,MAAA,GAAS,CAAA,GAAI,QAAA,GAAW,UAAA;AAAA;AAAA;AAAA,UAGxC,KAAA,EAAO,WAAW,+CAAA,GAA4C;AAAA,SAC/D,CAAA;AAAA,MACH,CAAA;AAAA,MAEA,WAAW,MAAA,EAAgB;AACzB,QAAA,IAAI,CAAC,GAAA,EAAI,CAAE,OAAA,CAAQ,IAAA,CAAK,CAAC,MAAA,KAAW,MAAA,CAAO,MAAA,KAAW,MAAM,CAAA,EAAG;AAC/D,QAAA,GAAA,CAAI,EAAE,cAAA,EAAgB,MAAA,EAAQ,CAAA;AAQ9B,QAAA,KAAKA,iBAAgB,CAAE,oBAAA,GAAuB,MAAM,CAAA,EAAG,MAAM,MAAM;AAAA,QAAC,CAAC,CAAA;AAAA,MACvE,CAAA;AAAA,MAEA,KAAA,GAAQ;AACN,QAAA,GAAA,CAAI,EAAE,GAAG,KAAA,EAAO,CAAA;AAAA,MAClB;AAAA,KACF,CAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAM,6BAAA;AAAA;AAAA;AAAA;AAAA,MAIN,UAAA,EAAY,CAAC,KAAA,MAAW,EAAE,YAAY,KAAA,CAAM,UAAA,EAAY,OAAA,EAAS,KAAA,CAAM,OAAA,EAAQ,CAAA;AAAA,MAC/E,kBAAA,EAAoB,MAAM,CAAC,KAAA,KAAU;AACnC,QAAA,IAAI,KAAA,EAAO,OAAA,EAAS,KAAA,CAAM,MAAA,GAAS,MAAA;AAAA,MACrC;AAAA;AACF;AAEJ;AAeO,SAAS,iBAAA,CAAkB,QAA6B,QAAA,EAA0B;AACvF,EAAA,IAAI,OAAO,SAAA,IAAa,IAAA,IAAQ,QAAA,IAAY,MAAA,CAAO,WAAW,OAAO,CAAA;AACrE,EAAA,OAAO,MAAA,CAAO,QAAA;AAChB;AAEO,IAAM,oBAAA,GAAuB,CAClC,KAAA,EACA,QAAA,KACkB;AAClB,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,QAAA,EAAU,OAAO,IAAA;AACtC,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,KAAW,KAAA,CAAM,cAAc,CAAA,IAAK,KAAA,CAAM,QAAQ,CAAC,CAAA;AAC9F,EAAA,OAAO,MAAA,GAAS,iBAAA,CAAkB,MAAA,EAAQ,QAAQ,CAAA,GAAI,IAAA;AACxD,CAAA;;;ACxHO,IAAM,eAAeF,MAAAA,EAAkB;AAAA,EAC5CC,OAAAA;AAAA,IACE,CAAC,KAAK,GAAA,MAAS;AAAA,MACb,OAAO,EAAC;AAAA,MACR,YAAA,EAAc,IAAA;AAAA,MACd,eAAA,EAAiB,CAAA;AAAA,MACjB,MAAA,EAAQ,KAAA;AAAA,MACR,eAAA,EAAiB,IAAA;AAAA,MAEjB,OAAA,EAAS,CAAC,OAAA,EAAS,GAAA,GAAM,GAAG,OAAA,KAC1B,GAAA,CAAI,CAAC,KAAA,KAAU;AACb,QAAA,MAAM,iBAAA,GAAoB,gCAAgC,OAAO,CAAA;AACjE,QAAA,MAAM,SAAA,GAAY,0BAA0B,iBAAiB,CAAA;AAC7D,QAAA,MAAM,MAAA,GAAS,YAAY,CAAA,EAAG,OAAA,CAAQ,EAAE,CAAA,CAAA,EAAI,SAAS,KAAK,OAAA,CAAQ,EAAA;AAKlE,QAAA,MAAM,OAAA,GAAU,0BAAA,CAA2B,OAAA,EAAS,iBAAiB,CAAA;AACrE,QAAA,MAAM,SAAA,GAAY,OAAA,EAAS,KAAA,IAAS,OAAA,CAAQ,KAAA;AAC5C,QAAA,MAAM,KAAA,GAAQ,OAAA,GAAU,OAAA,CAAQ,cAAA,GAAiB,OAAA,CAAQ,cAAA;AACzD,QAAA,MAAM,QAAA,GAAW,KAAA,CAAM,KAAA,CAAM,IAAA,CAAK,CAAC,OAAO,CAAA,CAAE,MAAA,IAAU,CAAA,CAAE,SAAA,MAAe,MAAM,CAAA;AAC7E,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,MAAM,OAAA,GAAU,KAAK,GAAA,CAAI,QAAA,CAAS,WAAW,GAAA,EAAK,QAAA,CAAS,eAAe,QAAQ,CAAA;AAClF,UAAA,OAAO;AAAA;AAAA;AAAA,YAGL,MAAA,EAAQ,IAAA;AAAA,YACR,eAAA,EAAiB,MAAA;AAAA,YACjB,KAAA,EAAO,MAAM,KAAA,CAAM,GAAA;AAAA,cAAI,CAAC,CAAA,KAAA,CACrB,CAAA,CAAE,MAAA,IAAU,CAAA,CAAE,SAAA,MAAe,MAAA,GAAS,EAAE,GAAG,CAAA,EAAG,MAAA,EAAQ,QAAA,EAAU,SAAQ,GAAI;AAAA;AAC/E,WACF;AAAA,QACF;AACA,QAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,CAAA,IAAK,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA;AACzE,QAAA,MAAM,IAAA,GAAiB;AAAA,UACrB,MAAA;AAAA,UACA,WAAW,OAAA,CAAQ,EAAA;AAAA,UACnB,WAAW,OAAA,EAAS,EAAA;AAAA,UACpB,MAAM,OAAA,CAAQ,IAAA;AAAA,UACd,MAAM,OAAA,CAAQ,IAAA;AAAA,UACd,GAAA,EAAK,OAAA,EAAS,GAAA,IAAO,OAAA,CAAQ,GAAA;AAAA,UAC7B,OAAA,EAAS,iBAAA;AAAA,UACT,YAAA,EAAc,6BAA6B,iBAAiB,CAAA;AAAA,UAC5D,SAAA;AAAA,UACA,QAAA,EAAU,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,SAAS,QAAQ,CAAA;AAAA,UACzC,QAAA,EAAU,OAAO,GAAA,IAAO,IAAA;AAAA,UACxB,WAAA,EAAa,KAAA;AAAA,UACb,gBAAA,EAAkB,QAAQ,UAAA,KAAe,KAAA;AAAA,UACzC,MAAA,EAAQ,OAAA,EAAS,MAAA,IAAU,OAAA,CAAQ,MAAA,IAAU,IAAA;AAAA,UAC7C,UAAA,EAAY,OAAA,EAAS,UAAA,IAAc,OAAA,CAAQ,UAAA,IAAc,IAAA;AAAA,UACzD,QAAA,EAAU,OAAA,EAAS,QAAA,IAAY,OAAA,CAAQ,QAAA,IAAY,IAAA;AAAA,UACnD,OAAA,EAAS,OAAA,EAAS,OAAA,IAAW,OAAA,CAAQ,OAAA,IAAW,IAAA;AAAA,UAChD,QAAA,EAAU,OAAA,EAAS,QAAA,IAAY,OAAA,CAAQ,QAAA,IAAY,IAAA;AAAA,UACnD,SAAA,EAAW,QAAQ,SAAA,IAAa;AAAA,SAClC;AACA,QAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,eAAA,EAAiB,MAAA,EAAQ,KAAA,EAAO,CAAC,GAAG,KAAA,CAAM,KAAA,EAAO,IAAI,CAAA,EAAE;AAAA,MAChF,CAAC,CAAA;AAAA,MAEH,aAAa,CAAC,MAAA,EAAQ,GAAA,KACpB,GAAA,CAAI,CAAC,KAAA,KAAU;AACb,QAAA,IAAI,GAAA,IAAO,CAAA,EAAG,OAAO,EAAE,OAAO,KAAA,CAAM,KAAA,CAAM,MAAA,CAAO,CAAC,OAAO,CAAA,CAAE,MAAA,IAAU,CAAA,CAAE,SAAA,MAAe,MAAM,CAAA,EAAE;AAC9F,QAAA,OAAO;AAAA,UACL,KAAA,EAAO,MAAM,KAAA,CAAM,GAAA;AAAA,YAAI,CAAC,CAAA,KAAA,CACrB,CAAA,CAAE,UAAU,CAAA,CAAE,SAAA,MAAe,SAC1B,EAAE,GAAG,CAAA,EAAG,QAAA,EAAU,KAAK,GAAA,CAAI,GAAA,EAAK,EAAE,WAAA,IAAe,QAAQ,GAAE,GAC3D;AAAA;AACN,SACF;AAAA,MACF,CAAC,CAAA;AAAA,MAEH,YAAY,CAAC,MAAA,KACX,IAAI,CAAC,KAAA,MAAW,EAAE,KAAA,EAAO,KAAA,CAAM,MAAM,MAAA,CAAO,CAAC,OAAO,CAAA,CAAE,MAAA,IAAU,EAAE,SAAA,MAAe,MAAM,GAAE,CAAE,CAAA;AAAA,MAE7F,aAAA,EAAe,CAAC,IAAA,EAAM,OAAA,KAAY,GAAA,CAAI,EAAE,YAAA,EAAc,IAAA,EAAM,eAAA,EAAiB,OAAA,EAAS,CAAA;AAAA,MACtF,aAAA,EAAe,MAAM,GAAA,CAAI,EAAE,cAAc,IAAA,EAAM,eAAA,EAAiB,GAAG,CAAA;AAAA,MACnE,KAAA,EAAO,MAAM,GAAA,CAAI,EAAE,KAAA,EAAO,EAAC,EAAG,YAAA,EAAc,IAAA,EAAM,eAAA,EAAiB,CAAA,EAAG,CAAA;AAAA,MACtE,YAAY,MAAM,GAAA,CAAI,EAAE,MAAA,EAAQ,MAAM,CAAA;AAAA,MACtC,WAAA,EAAa,MAAM,GAAA,CAAI,EAAE,QAAQ,KAAA,EAAO,eAAA,EAAiB,MAAM,CAAA;AAAA,MAE/D,SAAA,EAAW,OAAO,OAAA,KAAY;AAC5B,QAAA,MAAM,KAAA,GAAQ,KAAI,CAAE,KAAA;AACpB,QAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACxB,QAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,GAAA;AAAA,UACzB,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS,OAAA,CAAQ,IAAI,CAAA,CAAE,KAAA,CAAM,MAAM,IAAI,CAAC;AAAA,SACrD;AACA,QAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,IAAA,CAAK,CAAC,CAAC,CAAA;AAC3C,QAAA,IAAI,IAAA,CAAK,WAAW,KAAA,CAAM,MAAA,MAAY,EAAE,KAAA,EAAO,MAAM,CAAA;AAAA,MACvD;AAAA,KACF,CAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAM,yBAAA;AAAA,MACN,UAAA,EAAY,CAAC,KAAA,MAAW;AAAA,QACtB,OAAO,KAAA,CAAM,KAAA;AAAA,QACb,cAAc,KAAA,CAAM,YAAA;AAAA,QACpB,iBAAiB,KAAA,CAAM;AAAA,OACzB;AAAA;AACF;AAEJ;AAOO,IAAM,WAAA,GAAc,CAACE,EAAAA,KAC1BA,EAAAA,CAAE,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAA,CAAE,QAAA,EAAU,CAAC;AAErC,IAAM,iBAAiB,CAACA,EAAAA,KAC7B,UAAA,CAAWA,EAAAA,CAAE,MAAM,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,MAAM,CAAA,CAAE,SAAA,GAAY,CAAA,CAAE,QAAA,EAAU,CAAC,CAAC;AAEnE,IAAM,mBAAA,GAAsB,CAACA,EAAAA,KAClC,UAAA,CAAW,eAAeA,EAAC,CAAA,IAAKA,EAAAA,CAAE,eAAA,GAAkB,GAAA,CAAI;AAyBnD,IAAM,sBAAA,GAAyB,CAACA,EAAAA,KACrCA,EAAAA,CAAE,KAAA,CAAM,KAAK,CAAC,CAAA,KAAM,CAAA,CAAE,gBAAA,KAAqB,KAAK;AAE3C,IAAM,cAAA,GAAiB,CAC5BA,EAAAA,EACA,GAAA,KACW;AACX,EAAA,IAAIA,EAAAA,CAAE,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,CAAA;AAIjC,EAAA,IAAI,CAAC,sBAAA,CAAuBA,EAAC,CAAA,EAAG,OAAO,CAAA;AACvC,EAAA,MAAM,QAAA,GAAW,eAAeA,EAAC,CAAA;AAEjC,EAAA,MAAM,MAAA,GAAS,oBAAA,CAAqB,gBAAA,CAAiB,QAAA,IAAY,QAAQ,CAAA;AACzE,EAAA,IAAI,MAAA,IAAU,MAAM,OAAO,MAAA;AAE3B,EAAA,IAAI,GAAA,CAAI,SAAS,SAAA,IAAa,IAAA,IAAQ,YAAY,GAAA,CAAI,QAAA,CAAS,WAAW,OAAO,CAAA;AACjF,EAAA,OAAO,IAAI,QAAA,CAAS,QAAA;AACtB;AAEO,IAAM,WAAA,GAAc,CACzBA,EAAAA,EACA,GAAA,KAEA,WAAW,cAAA,CAAeA,EAAC,CAAA,GAAI,mBAAA,CAAoBA,EAAC,CAAA,GAAI,cAAA,CAAeA,EAAAA,EAAG,GAAG,CAAC;;;ACtNzE,SAAS,aAAA,CACd,UACA,MAAA,EACS;AACT,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,MAAM,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AAClD,IAAA,MAAM,MAAA,GAAS,WAAW,GAAG,CAAA;AAC7B,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AACzB,MAAA,IAAI,CAAC,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,OAAO,CAAC,CAAA,KAAM,MAAM,CAAA,EAAG,OAAO,KAAA;AAAA,IACxD,CAAA,MAAA,IAAW,MAAA,CAAO,MAAA,IAAU,EAAE,MAAM,MAAA,EAAQ;AAC1C,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAkBO,SAAS,WACd,KAAA,EACe;AACf,EAAA,IAAI,CAAC,KAAA,EAAO,OAAO,EAAC;AACpB,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,GAAG,OAAO,KAAA;AAClC,EAAA,MAAM,MAA8B,EAAC;AACrC,EAAA,KAAA,MAAW,SAAS,KAAA,EAAuC;AACzD,IAAA,IAAI,KAAA,EAAO,GAAA,IAAO,KAAA,CAAM,KAAA,IAAS,IAAA,EAAM,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA,GAAI,MAAA,CAAO,KAAA,CAAM,KAAK,CAAA;AAAA,EAC5E;AACA,EAAA,OAAO,GAAA;AACT;AAGO,SAAS,SAAA,CAAU,MAAA,EAAuB,GAAA,EAAa,KAAA,EAAqC;AACjG,EAAA,IAAI,KAAA,IAAS,IAAA,IAAQ,KAAA,KAAU,EAAA,EAAI;AACjC,IAAA,IAAI,EAAE,GAAA,IAAO,MAAA,CAAA,EAAS,OAAO,MAAA;AAC7B,IAAA,MAAM,EAAE,CAAC,GAAG,GAAG,QAAA,EAAU,GAAG,MAAK,GAAI,MAAA;AACrC,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,MAAA,CAAO,GAAG,CAAA,KAAM,KAAA,EAAO,OAAO,MAAA;AAClC,EAAA,OAAO,EAAE,GAAG,MAAA,EAAQ,CAAC,GAAG,GAAG,KAAA,EAAM;AACnC;AAWO,SAAS,oBAAA,CACd,QACA,UAAA,EACe;AACf,EAAA,MAAM,GAAA,GAAM,WAAW,MAAM,CAAA;AAC7B,EAAA,OAAO,UAAA,GAAa,EAAE,UAAA,EAAY,GAAG,KAAI,GAAI,GAAA;AAC/C;ACvCA,IAAM,gBAAA,GAAyF;AAAA,EAC7F,OAAA,EAAS,EAAE,OAAA,EAAS,YAAA,EAAc,OAAO,KAAA,EAAM;AAAA,EAC/C,MAAA,EAAQ,EAAE,OAAA,EAAS,YAAA,EAAc,OAAO,MAAA,EAAO;AAAA,EAC/C,WAAA,EAAa,EAAE,OAAA,EAAS,OAAA,EAAS,OAAO,KAAA,EAAM;AAAA,EAC9C,YAAA,EAAc,EAAE,OAAA,EAAS,OAAA,EAAS,OAAO,MAAA,EAAO;AAAA,EAChD,IAAA,EAAM,EAAE,OAAA,EAAS,MAAA,EAAQ,OAAO,KAAA;AAClC,CAAA;AAEA,eAAe,YAAA,CAAa,QAA4B,GAAA,EAAkD;AACxG,EAAA,MAAM,OAAqB,MAAA,CAAO,IAAA,KAAS,MAAA,CAAO,MAAA,KAAW,QAAQ,QAAA,GAAW,SAAA,CAAA;AAChF,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,IAAU,MAAA,CAAO,MAAA,KAAW,MAAA;AAClD,EAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,CAAK,YAAA,CAAa;AAAA,IACvC,MAAA,EAAQ,QAAA;AAAA,IACR,MAAA,EAAQ,OAAO,MAAA,IAAU,MAAA;AAAA,IACzB,GAAG,iBAAiB,IAAI;AAAA,GACzB,CAAA;AACD,EAAA,IAAI,GAAA,GAAM,IAAA;AACV,EAAA,IAAI,OAAO,QAAA,EAAU;AACnB,IAAA,GAAA,GAAM,MAAM,gBAAA,CAAiB,GAAA,EAAK,OAAO,MAAA,CAAO,QAAQ,GAAG,GAAG,CAAA;AAAA,EAChE;AAMA,EAAA,MAAM,MAAA,GAAS,oBAAA,CAAqB,MAAA,CAAO,MAAA,EAAQ,OAAO,UAAU,CAAA;AACpE,EAAA,IAAI,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,CAAE,SAAS,CAAA,EAAG,GAAA,GAAM,GAAA,CAAI,MAAA,CAAO,CAAC,CAAA,KAAM,aAAA,CAAc,CAAA,CAAE,QAAA,EAAU,MAAM,CAAC,CAAA;AAC7F,EAAA,IAAI,MAAA,EAAQ,GAAA,GAAM,GAAA,CAAI,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,cAAA,IAAkB,IAAA,IAAQ,CAAA,CAAE,cAAA,GAAiB,CAAA,CAAE,KAAK,CAAA;AAC1F,EAAA,IAAI,MAAA,CAAO,SAAS,GAAA,GAAM,GAAA,CAAI,OAAO,CAAC,CAAA,KAAM,CAAA,CAAE,cAAA,GAAiB,CAAC,CAAA;AAChE,EAAA,MAAM,MAAA,GAAS,OAAO,MAAA,IAAU,CAAA;AAChC,EAAA,OAAO,GAAA,CAAI,MAAM,MAAA,EAAQ,MAAA,CAAO,SAAS,IAAA,GAAO,MAAA,GAAS,MAAA,CAAO,KAAA,GAAQ,MAAS,CAAA;AACnF;AAqBA,eAAe,gBAAA,CACb,QAAA,EACA,KAAA,EACA,GAAA,EACoB;AACpB,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,UAAA,KAAe,KAAA,IAAS,CAAA,CAAE,YAAA,KAAiB,KAAK,CAAA;AACxF,EAAA,IAAI,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,MAAA;AAE9B,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,IAAA,EAAK,CAAE,WAAA,EAAY;AACxC,EAAA,IAAI,CAAC,QAAQ,OAAO,MAAA;AACpB,EAAA,MAAM,UAAA,GAAa,MAAM,GAAA,CAAI,IAAA,CAAK,cAAA,EAAe;AACjD,EAAA,MAAM,KAAA,GAAQ,kBAAA,CAAmB,UAAA,EAAY,MAAM,CAAA;AACnD,EAAA,IAAI,CAAC,OAAO,OAAO,MAAA;AACnB,EAAA,OAAO,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,UAAA,KAAe,KAAA,CAAM,EAAA,IAAM,CAAA,CAAE,YAAA,KAAiB,KAAA,CAAM,IAAI,CAAA;AAC1F;AAGA,SAAS,kBAAA,CAAmB,YAAwB,IAAA,EAA+B;AACjF,EAAA,KAAA,MAAW,YAAY,UAAA,EAAY;AACjC,IAAA,IAAA,CAAK,QAAA,CAAS,QAAQ,EAAA,EAAI,IAAA,GAAO,WAAA,EAAY,KAAM,MAAM,OAAO,QAAA;AAChE,IAAA,MAAM,QAAQ,QAAA,CAAS,QAAA,GAAW,mBAAmB,QAAA,CAAS,QAAA,EAAU,IAAI,CAAA,GAAI,IAAA;AAChF,IAAA,IAAI,OAAO,OAAO,KAAA;AAAA,EACpB;AACA,EAAA,OAAO,IAAA;AACT;AAMA,eAAe,aAAA,CAAc,QAA6B,GAAA,EAAuD;AAC/G,EAAA,IAAI,CAAC,MAAA,CAAO,IAAA,EAAM,OAAO,IAAA;AACzB,EAAA,MAAM,OAAA,GAAU,MAAM,GAAA,CAAI,IAAA,CAAK,YAAA,CAAa,EAAE,IAAA,EAAM,MAAA,CAAO,IAAA,EAAM,MAAA,EAAQ,QAAA,EAAU,KAAA,EAAO,GAAG,CAAA;AAC7F,EAAA,MAAM,OAAA,GAAU,QAAQ,CAAC,CAAA;AACzB,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AAKrB,EAAA,IAAI,GAAA,CAAI,KAAK,kBAAA,EAAoB;AAC/B,IAAA,MAAM,EAAE,SAAS,QAAA,EAAS,GAAI,MAAM,GAAA,CAAI,IAAA,CAAK,kBAAA,CAAmB,OAAA,CAAQ,EAAE,CAAA;AAC1E,IAAA,IAAI,OAAA,CAAQ,MAAA,GAAS,CAAA,IAAK,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG,OAAO,EAAE,GAAG,OAAA,EAAS,OAAA,EAAS,QAAA,EAAS;AAAA,EACxF;AACA,EAAA,OAAO,OAAA;AACT;AAEA,eAAe,cAAA,CAAe,SAAkC,GAAA,EAAmD;AACjH,EAAA,OAAO,GAAA,CAAI,KAAK,cAAA,EAAe;AACjC;AAYA,SAAS,kBAAkB,IAAA,EAAgH;AACzI,EAAA,IAAI,CAAC,IAAA,CAAK,iBAAA,IAAqB,CAAC,KAAK,qBAAA,EAAuB;AAC1D,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KAEF;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAUA,eAAe,UAAA,CAAW,QAA0B,GAAA,EAAuD;AACzG,EAAA,wBAAA,CAAyB,MAAA,CAAO,MAAA,CAAO,MAAA,IAAU,EAAE,CAAC,CAAA;AACpD,EAAA,MAAM,IAAA,GAAO,iBAAA,CAAkB,GAAA,CAAI,IAAI,CAAA;AACvC,EAAA,OAAO,IAAA,CAAK,iBAAA,CAAkB,MAAA,CAAO,MAAA,EAAQ;AAAA,IAC3C,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,QAAQ,MAAA,CAAO,MAAA;AAAA,IACf,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,OAAO,MAAA,CAAO;AAAA,GACf,CAAA;AACH;AAOA,eAAe,YAAA,CAAa,QAA4B,GAAA,EAA4D;AAClH,EAAA,wBAAA,CAAyB,MAAA,CAAO,MAAA,CAAO,MAAA,IAAU,EAAE,CAAC,CAAA;AACpD,EAAA,IAAI,CAAC,MAAA,CAAO,IAAA,EAAM,OAAO,IAAA;AACzB,EAAA,MAAM,IAAA,GAAO,iBAAA,CAAkB,GAAA,CAAI,IAAI,CAAA;AACvC,EAAA,OAAO,IAAA,CAAK,qBAAA,CAAsB,MAAA,CAAO,MAAA,EAAQ,OAAO,IAAI,CAAA;AAC9D;AAEA,eAAe,eAAA,CAAgB,SAAkC,GAAA,EAAiD;AAChH,EAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,IAAA,CAAK,aAAa,EAAE,MAAA,EAAQ,UAAU,CAAA;AACjE,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,MAAM,GAAA,GAAM,QAAQ,QAAA,EAAU,UAAA;AAC9B,IAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,IAAY,GAAA,EAAK,IAAA,CAAK,IAAI,GAAG,CAAA;AAAA,EAClD;AACA,EAAA,OAAO,CAAC,GAAG,IAAI,CAAA,CAAE,IAAA,EAAK;AACxB;AAEA,IAAI,UAAA,GAAa,KAAA;AAIV,SAAS,yBAAA,GAAkC;AAChD,EAAA,IAAI,UAAA,EAAY;AAChB,EAAA,UAAA,GAAa,IAAA;AAEb,EAAA,YAAA,CAAa,iBAAiB,YAAA,EAAc;AAAA,IAC1C,MAAA,EAAQ,KAAA;AAAA,IACR,KAAA,EAAO,cAAA;AAAA,IACP,WAAA,EAAa,6FAAA;AAAA,IACb,MAAA,EAAQ,qGAAA;AAAA,IACR,QAAA,EAAU;AAAA,MACR;AAAA,QACE,EAAA,EAAI,QAAA;AAAA,QACJ,IAAA,EAAM,QAAA;AAAA,QACN,KAAA,EAAO,cAAA;AAAA,QACP,IAAA,EAAM,iHAAA;AAAA,QACN,OAAA,EAAS;AAAA,UACP,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,cAAA,EAAe;AAAA,UACtC,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,cAAA,EAAe;AAAA,UACtC,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,SAAA;AAAU;AACpC,OACF;AAAA,MACA;AAAA,QACE,EAAA,EAAI,UAAA;AAAA,QACJ,IAAA,EAAM,UAAA;AAAA,QACN,KAAA,EAAO,UAAA;AAAA,QACP,IAAA,EAAM;AAAA,OACR;AAAA,MACA;AAAA,QACE,EAAA,EAAI,YAAA;AAAA,QACJ,IAAA,EAAM,MAAA;AAAA,QACN,KAAA,EAAO,gBAAA;AAAA,QACP,IAAA,EAAM;AAAA,OACR;AAAA,MACA;AAAA,QACE,EAAA,EAAI,QAAA;AAAA,QACJ,IAAA,EAAM,MAAA;AAAA,QACN,KAAA,EAAO,sBAAA;AAAA,QACP,IAAA,EAAM,wLAAA;AAAA,QACN,EAAA,EAAI;AAAA,UACF,EAAE,IAAI,KAAA,EAAO,IAAA,EAAM,QAAQ,KAAA,EAAO,gBAAA,EAAkB,UAAU,IAAA,EAAK;AAAA,UACnE,EAAE,IAAI,OAAA,EAAS,IAAA,EAAM,QAAQ,KAAA,EAAO,OAAA,EAAS,UAAU,IAAA;AAAK;AAC9D,OACF;AAAA,MACA,EAAE,IAAI,QAAA,EAAU,IAAA,EAAM,QAAQ,KAAA,EAAO,QAAA,EAAU,MAAM,yCAAA,EAA0C;AAAA,MAC/F;AAAA,QACE,EAAA,EAAI,MAAA;AAAA,QACJ,IAAA,EAAM,QAAA;AAAA,QACN,KAAA,EAAO,MAAA;AAAA,QACP,IAAA,EAAM,wFAAA;AAAA,QACN,OAAA,EAAS;AAAA,UACP,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,eAAA,EAAgB;AAAA,UAC3C,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,cAAA,EAAe;AAAA,UACzC,EAAE,KAAA,EAAO,WAAA,EAAa,KAAA,EAAO,oBAAA,EAAqB;AAAA,UAClD,EAAE,KAAA,EAAO,YAAA,EAAc,KAAA,EAAO,oBAAA,EAAqB;AAAA,UACnD,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA;AAAO;AACjC,OACF;AAAA,MACA,EAAE,EAAA,EAAI,OAAA,EAAS,IAAA,EAAM,QAAA,EAAU,OAAO,OAAA,EAAS,IAAA,EAAM,2CAAA,EAA6C,GAAA,EAAK,CAAA,EAAE;AAAA,MACzG,EAAE,EAAA,EAAI,QAAA,EAAU,IAAA,EAAM,QAAA,EAAU,OAAO,QAAA,EAAU,IAAA,EAAM,wCAAA,EAA0C,GAAA,EAAK,CAAA,EAAE;AAAA,MACxG,EAAE,EAAA,EAAI,SAAA,EAAW,IAAA,EAAM,SAAA,EAAW,OAAO,eAAA,EAAgB;AAAA,MACzD,EAAE,IAAI,QAAA,EAAU,IAAA,EAAM,WAAW,KAAA,EAAO,cAAA,EAAgB,MAAM,gEAAA;AAAiE;AACjI,GACD,CAAA;AAED,EAAA,YAAA,CAAa,mBAAmB,aAAA,EAAe;AAAA,IAC7C,MAAA,EAAQ,KAAA;AAAA,IACR,KAAA,EAAO,iBAAA;AAAA,IACP,WAAA,EAAa,6EAAA;AAAA,IACb,MAAA,EACE,8IAAA;AAAA,IACF,QAAA,EAAU;AAAA,MACR;AAAA,QACE,EAAA,EAAI,MAAA;AAAA,QACJ,IAAA,EAAM,MAAA;AAAA,QACN,KAAA,EAAO,MAAA;AAAA,QACP,IAAA,EAAM,oFAAA;AAAA,QACN,QAAA,EAAU;AAAA;AACZ;AACF,GACD,CAAA;AAED,EAAA,YAAA,CAAa,mBAAmB,cAAA,EAAgB;AAAA,IAC9C,MAAA,EAAQ,KAAA;AAAA,IACR,KAAA,EAAO,eAAA;AAAA,IACP,WAAA,EAAa,yCAAA;AAAA,IACb,MAAA,EAAQ,sDAAA;AAAA,IACR,UAAU;AAAC,GACZ,CAAA;AAED,EAAA,YAAA,CAAa,oBAAoB,eAAA,EAAiB;AAAA,IAChD,MAAA,EAAQ,KAAA;AAAA,IACR,KAAA,EAAO,iBAAA;AAAA,IACP,WAAA,EAAa,4EAAA;AAAA,IACb,MAAA,EAAQ,yCAAA;AAAA,IACR,UAAU;AAAC,GACZ,CAAA;AAED,EAAA,YAAA,CAAa,eAAe,UAAA,EAAY;AAAA,IACtC,MAAA,EAAQ,KAAA;AAAA,IACR,KAAA,EAAO,gBAAA;AAAA,IACP,WAAA,EACE,kHAAA;AAAA,IACF,MAAA,EAAQ,iGAAA;AAAA,IACR,QAAA,EAAU;AAAA,MACR;AAAA,QACE,EAAA,EAAI,QAAA;AAAA,QACJ,IAAA,EAAM,QAAA;AAAA,QACN,KAAA,EAAO,QAAA;AAAA,QACP,IAAA,EAAM,iGAAA;AAAA,QACN,QAAA,EAAU;AAAA,OACZ;AAAA,MACA,EAAE,EAAA,EAAI,OAAA,EAAS,IAAA,EAAM,QAAA,EAAU,OAAO,OAAA,EAAS,IAAA,EAAM,0CAAA,EAA4C,GAAA,EAAK,CAAA,EAAE;AAAA,MACxG,EAAE,EAAA,EAAI,QAAA,EAAU,IAAA,EAAM,QAAA,EAAU,OAAO,QAAA,EAAU,IAAA,EAAM,wCAAA,EAA0C,GAAA,EAAK,CAAA,EAAE;AAAA,MACxG,EAAE,IAAI,SAAA,EAAW,IAAA,EAAM,QAAQ,KAAA,EAAO,UAAA,EAAY,MAAM,oDAAA,EAAqD;AAAA,MAC7G;AAAA,QACE,EAAA,EAAI,OAAA;AAAA,QACJ,IAAA,EAAM,QAAA;AAAA,QACN,KAAA,EAAO,WAAA;AAAA,QACP,OAAA,EAAS;AAAA,UACP,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,WAAA,EAAY;AAAA,UACnC,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,YAAA;AAAa;AACvC;AACF;AACF,GACD,CAAA;AAED,EAAA,YAAA,CAAa,iBAAiB,YAAA,EAAc;AAAA,IAC1C,MAAA,EAAQ,KAAA;AAAA,IACR,KAAA,EAAO,uBAAA;AAAA,IACP,WAAA,EAAa,oEAAA;AAAA,IACb,MAAA,EAAQ,oDAAA;AAAA,IACR,QAAA,EAAU;AAAA,MACR,EAAE,EAAA,EAAI,QAAA,EAAU,IAAA,EAAM,QAAA,EAAU,OAAO,QAAA,EAAU,IAAA,EAAM,uBAAA,EAAyB,QAAA,EAAU,IAAA,EAAK;AAAA,MAC/F;AAAA,QACE,EAAA,EAAI,MAAA;AAAA,QACJ,IAAA,EAAM,MAAA;AAAA,QACN,KAAA,EAAO,MAAA;AAAA,QACP,IAAA,EAAM,iFAAA;AAAA,QACN,QAAA,EAAU;AAAA;AACZ;AACF,GACD,CAAA;AAEH;;;ACpPO,SAAS,kBAAkB,KAAA,EAAe,IAAA,EAAc,MAAc,CAAA,GAAI,IAAA,EAAM,IAAI,GAAA,EAAa;AACtG,EAAA,MAAM,GAAA,GACJ,CAAA,+CAAA,EAAkD,CAAC,CAAA,UAAA,EAAa,CAAC,CAAA,4FAAA,EAE7B,IAAI,CAAA,6CAAA,EACJ,IAAI,oDAExB,CAAC,CAAA,UAAA,EAAa,CAAC,CAAA,8BAAA,EAChB,IAAI,GAAG,CAAA,MAAA,EAAS,CAAA,GAAI,GAAG,CAAA,KAAA,EAAQ,CAAA,GAAI,IAAI,CAAA,aAAA,EAAgB,IAAI,CAAA,6BAAA,EAC3D,CAAA,GAAI,IAAI,CAAA,MAAA,EAAS,IAAI,IAAI,CAAA,KAAA,EAAQ,CAAA,GAAI,IAAI,gBAAgB,IAAI,CAAA,uBAAA,CAAA;AAE9E,EAAA,OAAO,CAAA,wBAAA,EAA2B,kBAAA,CAAmB,GAAG,CAAC,CAAA,CAAA;AAC3D;AAgCO,IAAM,mBAAA,GAAsB;AAAA,EACjC,OAAA,EAAS,CAAC,GAAA,EAAK,GAAI,CAAA;AAAA,EACnB,MAAA,EAAQ,CAAC,IAAA,EAAM,GAAG,CAAA;AAAA,EAClB,QAAA,EAAU,CAAC,GAAA,EAAK,GAAG;AACrB;AAGA,SAAS,QAAQ,IAAA,EAAsB;AACrC,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,MAAA,EAAQ,CAAA,EAAA,EAAK,IAAA,GAAA,CAAQ,IAAA,GAAO,EAAA,GAAK,IAAA,CAAK,UAAA,CAAW,CAAC,CAAA,IAAK,GAAA;AAChF,EAAA,OAAO,IAAA;AACT;AAGA,SAAS,SAAS,KAAA,EAAuB;AACvC,EAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,EAAK,CAAE,MAAM,KAAK,CAAA,CAAE,OAAO,OAAO,CAAA;AACtD,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,GAAA;AAC/B,EAAA,MAAM,UAAU,KAAA,CAAM,MAAA,KAAW,IAAI,KAAA,CAAM,CAAC,EAAG,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,GAAI,KAAA,CAAM,CAAC,CAAA,CAAG,CAAC,IAAK,KAAA,CAAM,CAAC,EAAG,CAAC,CAAA;AACxF,EAAA,OAAO,QAAQ,WAAA,EAAY;AAC7B;AAMO,SAAS,kBAAA,CACd,KAAA,EACA,CAAA,GAAY,mBAAA,CAAoB,OAAA,CAAQ,CAAC,CAAA,EACzC,CAAA,GAAY,mBAAA,CAAoB,OAAA,CAAQ,CAAC,CAAA,EACjC;AACR,EAAA,MAAM,GAAA,GAAM,QAAQ,KAAK,CAAA;AACzB,EAAA,MAAM,GAAA,GACJ,CAAA,+CAAA,EAAkD,CAAC,CAAA,UAAA,EAAa,CAAC,CAAA,4FAAA,EAE7B,GAAG,CAAA,6CAAA,EAAA,CACF,GAAA,GAAM,EAAA,IAAM,GAAG,CAAA,iDAAA,EAEpC,CAAC,aAAa,CAAC,CAAA,uIAAA,EAEkB,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAC,IAAI,IAAI,CAAC,CAAA,+BAAA,EAClD,GAAG,CAAA,gBAAA,EAAmB,SAAA,CAAU,QAAA,CAAS,KAAK,CAAC,CAAC,CAAA,aAAA,CAAA;AAElF,EAAA,OAAO,CAAA,wBAAA,EAA2B,kBAAA,CAAmB,GAAG,CAAC,CAAA,CAAA;AAC3D;AAGA,SAAS,UAAU,IAAA,EAAsB;AACvC,EAAA,OAAO,KACJ,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAA,CACrB,OAAA,CAAQ,MAAM,MAAM,CAAA,CACpB,QAAQ,IAAA,EAAM,MAAM,EACpB,OAAA,CAAQ,IAAA,EAAM,QAAQ,CAAA,CACtB,OAAA,CAAQ,MAAM,QAAQ,CAAA;AAC3B;ACqFO,SAAS,cAAc,MAAA,EAAoD;AAIhF,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,KAAA,EAAO,IAAA,KAAS,MAAA,CAAO,IAAA,GAAO,EAAE,MAAA,EAAQ,MAAA,CAAO,IAAA,CAAK,QAAA,EAAS,GAAI,MAAA,CAAA;AACzF,EAAA,MAAM,WAAA,GAAc,WAAW,UAAA,GAAa,GAAA;AAC5C,EAAA,MAAM,YAAA,GAAe,OAAO,YAAA,IAAgB,UAAA;AAC5C,EAAA,MAAM,kBAAkB,YAAA,KAAiB,UAAA;AACzC,EAAA,OAAO;AAAA,IACL,GAAG,MAAA;AAAA,IACH,KAAA,EAAO,EAAE,GAAG,MAAA,CAAO,KAAA,EAAO,GAAI,QAAA,GAAW,EAAE,IAAA,EAAM,QAAA,EAAS,GAAI,EAAC,EAAG;AAAA,IAClE,QAAA,EAAU,OAAO,QAAA,IAAY,KAAA;AAAA,IAC7B,MAAA,EAAQ,OAAO,MAAA,IAAU,OAAA;AAAA,IACzB,QAAA,EAAU,EAAE,QAAA,EAAU,MAAA,CAAO,QAAA,EAAU,YAAY,CAAA,EAAG,SAAA,EAAW,MAAA,CAAO,QAAA,EAAU,SAAA,EAAU;AAAA,IAC5F,QAAA,EAAU;AAAA,MACR,IAAA,EAAM,MAAA,CAAO,QAAA,EAAU,IAAA,IAAQ,MAAA;AAAA,MAC/B,OAAA,EAAS,MAAA,CAAO,QAAA,EAAU,OAAA,EAAS,MAAA,GAAS,MAAA,CAAO,QAAA,CAAS,OAAA,GAAU,CAAC,KAAA,EAAO,aAAA,EAAe,MAAM,CAAA;AAAA;AAAA;AAAA;AAAA,MAInG,KAAA,EAAO,OAAO,QAAA,EAAU;AAAA,KAC1B;AAAA,IACA,YAAA;AAAA,IACA,OAAA,EAAS;AAAA,MACP,KAAA,EAAO,MAAA,CAAO,OAAA,EAAS,KAAA,IAAS,YAAA;AAAA,MAChC,cAAA,EAAgB,MAAA,CAAO,OAAA,EAAS,cAAA,IAAkB,mCAAA;AAAA,MAClD,aAAA,EAAe,MAAA,CAAO,OAAA,EAAS,aAAA,IAAiB,iBAAA;AAAA,MAChD,KAAA,EAAO,OAAO,OAAA,EAAS,KAAA;AAAA,MACvB,WAAA,EAAa,OAAO,OAAA,EAAS,WAAA;AAAA,MAC7B,YAAA,EAAc,OAAO,OAAA,EAAS;AAAA,KAChC;AAAA,IACA,QAAA,EAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAMR,SAAA,EACE,MAAA,CAAO,QAAA,EAAU,SAAA,IACjB,OAAA;AAAA,QACE,MAAA,CAAO,WAAW,MAAA,IAClB,MAAA,CAAO,SAAS,SAAA,EAAW,MAAA,IAC3B,MAAA,CAAO,UAAA,EAAY,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,IAAI,KACrC,MAAA,CAAO,OAAA,EAAS,YAAY,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI;AAAA,OAChD;AAAA,MACF,QAAA,EAAU,MAAA,CAAO,QAAA,EAAU,QAAA,IAAY,eAAA;AAAA,MACvC,IAAA,EAAM,MAAA,CAAO,QAAA,EAAU,IAAA,IAAQ,eAAA;AAAA,MAC/B,QAAA,EAAU,MAAA,CAAO,QAAA,EAAU,QAAA,IAAY;AAAA,KACzC;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,IAAA,EAAM,MAAA,CAAO,YAAA,EAAc,IAAA,IAAQ,MAAA;AAAA,MACnC,UAAA,EAAY,MAAA,CAAO,YAAA,EAAc,UAAA,IAAc,GAAA;AAAA,MAC/C,MAAA,EAAQ,MAAA,CAAO,YAAA,EAAc,MAAA,IAAU,gCAAA;AAAA,MACvC,IAAA,EAAM,MAAA,CAAO,YAAA,EAAc,IAAA,IAAQ;AAAA,KACrC;AAAA,IACA,WAAA;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,MAAA,CAAO,MAAA,EAAQ,IAAA,IAAQ,QAAA;AAAA,MAC7B,WAAA,EAAa,MAAA,CAAO,MAAA,EAAQ,WAAA,IAAe,oBAAA;AAAA,MAC3C,WAAA,EAAa,MAAA,CAAO,MAAA,EAAQ,WAAA,IAAe,SAAA;AAAA,MAC3C,gBAAA,EAAkB,MAAA,CAAO,MAAA,EAAQ,gBAAA,IAAoB,CAAA;AAAA,MACrD,QAAA,EAAU,MAAA,CAAO,MAAA,EAAQ,QAAA,IAAY,CAAA;AAAA,MACrC,QAAA,EAAU,MAAA,CAAO,MAAA,EAAQ,QAAA,IAAY,sBAAA;AAAA,MACrC,UAAA,EAAY,MAAA,CAAO,MAAA,EAAQ,UAAA,IAAc,sBAAA;AAAA,MACzC,gBAAA,EAAkB,OAAO,MAAA,EAAQ;AAAA,KACnC;AAAA,IACA,GAAA,EACE,MAAA,CAAO,GAAA,KACN,QAAA,GACG;AAAA,MACE,EAAE,KAAA,EAAO,WAAA,EAAU,EAAA,EAAI,GAAA,EAAI;AAAA,MAC3B,EAAE,KAAA,EAAO,MAAA,EAAQ,EAAA,EAAI,UAAA;AAAW,QAElC,CAAC,EAAE,OAAO,MAAA,EAAQ,EAAA,EAAI,KAAK,CAAA;AAAA,GACnC;AACF;AAEA,IAAM,uBAAA,GAA0B,cAA+C,IAAI,CAAA;AAE5E,IAAM,2BAA2B,uBAAA,CAAwB;AAEzD,SAAS,mBAAA,GAAgD;AAC9D,EAAA,MAAM,GAAA,GAAM,WAAW,uBAAuB,CAAA;AAC9C,EAAA,IAAI,CAAC,GAAA,EAAK,MAAM,IAAI,MAAM,6DAA6D,CAAA;AACvF,EAAA,OAAO,GAAA;AACT;AAEO,SAAS,2BAAA,GAA+D;AAC7E,EAAA,OAAO,WAAW,uBAAuB,CAAA;AAC3C;AAEO,SAAS,wBAAwB,MAAA,EAAwD;AAC9F,EAAA,OAAO,MAAA,CAAO,cAAc,EAAC;AAC/B;ACpYO,SAAS,oBAAA,GAAgC;AAC9C,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,CAAC,MAAA,CAAO,YAAY,OAAO,KAAA;AAChE,EAAA,OAAO,MAAA,CAAO,UAAA,CAAW,kCAAkC,CAAA,CAAE,OAAA;AAC/D;AAGO,SAAS,SAAA,CAAiC,SAAS,iBAAA,EAAkD;AAG1G,EAAA,MAAM,GAAA,GAAM,OAAU,IAAK,CAAA;AAC3B,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,IAAI,QAAA,CAAS,MAAM,sBAAsB,CAAA;AAEjE,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,MAAA,EAAQ;AACZ,IAAA,MAAM,KAAK,GAAA,CAAI,OAAA;AACf,IAAA,IAAI,CAAC,EAAA,IAAM,OAAO,oBAAA,KAAyB,WAAA,EAAa;AACtD,MAAA,SAAA,CAAU,IAAI,CAAA;AACd,MAAA;AAAA,IACF;AACA,IAAA,MAAM,WAAW,IAAI,oBAAA;AAAA,MACnB,CAAC,OAAA,KAAY;AACX,QAAA,IAAI,QAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,cAAc,CAAA,EAAG;AACzC,UAAA,SAAA,CAAU,IAAI,CAAA;AACd,UAAA,QAAA,CAAS,UAAA,EAAW;AAAA,QACtB;AAAA,MACF,CAAA;AAAA,MACA,EAAE,YAAY,MAAA;AAAO,KACvB;AACA,IAAA,QAAA,CAAS,QAAQ,EAAE,CAAA;AACnB,IAAA,OAAO,MAAM,SAAS,UAAA,EAAW;AAAA,EACnC,CAAA,EAAG,CAAC,MAAA,EAAQ,MAAM,CAAC,CAAA;AAEnB,EAAA,OAAO,CAAC,KAAK,MAAM,CAAA;AACrB;AAYO,SAAS,MAAA,CAAO,EAAE,KAAA,GAAQ,CAAA,EAAG,UAAU,SAAA,EAAW,KAAA,EAAO,GAAG,IAAA,EAAK,EAAgB;AACtF,EAAA,MAAM,CAAC,GAAA,EAAK,MAAM,CAAA,GAAI,SAAA,EAA0B;AAChD,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,WAAW,CAAA,EAAG,MAAA,GAAS,oBAAoB,EAAE,CAAA,CAAA,EAAI,aAAa,EAAE,CAAA,CAAA;AAAA,MAChE,KAAA,EAAO,EAAE,GAAG,KAAA,EAAO,gBAAgB,KAAA,GAAQ,CAAA,EAAG,KAAK,CAAA,EAAA,CAAA,GAAO,MAAA,EAAU;AAAA,MACnE,GAAG,IAAA;AAAA,MAEH;AAAA;AAAA,GACH;AAEJ;AAGO,SAAS,WAAA,CAAY,YAAY,CAAA,EAAY;AAClD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,SAAS,KAAK,CAAA;AAC9C,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,QAAA,GAAW,MAAM,WAAA,CAAY,MAAA,CAAO,UAAU,SAAS,CAAA;AAC7D,IAAA,QAAA,EAAS;AACT,IAAA,MAAA,CAAO,iBAAiB,QAAA,EAAU,QAAA,EAAU,EAAE,OAAA,EAAS,MAAM,CAAA;AAC7D,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,QAAA,EAAU,QAAQ,CAAA;AAAA,EAC5D,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AACd,EAAA,OAAO,QAAA;AACT;AAGO,SAAS,eAAe,KAAA,EAAwB;AACrD,EAAA,MAAM,CAAC,GAAA,EAAK,MAAM,CAAA,GAAI,SAAS,KAAK,CAAA;AACpC,EAAA,MAAM,IAAA,GAAO,OAAO,KAAK,CAAA;AACzB,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,IAAA,CAAK,OAAA,KAAY,KAAA,IAAS,KAAA,GAAQ,CAAA,EAAG;AACvC,MAAA,MAAA,CAAO,IAAI,CAAA;AACX,MAAA,MAAM,IAAI,UAAA,CAAW,MAAM,MAAA,CAAO,KAAK,GAAG,GAAG,CAAA;AAC7C,MAAA,OAAO,MAAM,aAAa,CAAC,CAAA;AAAA,IAC7B;AACA,IAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AACf,IAAA,OAAO,MAAA;AAAA,EACT,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AACV,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AAAA,EACjB,CAAC,CAAA;AACD,EAAA,OAAO,GAAA;AACT;ACxEA,IAAM,oBAAA,GAAuBC,cAAoC,IAAI,CAAA;AAE9D,IAAM,2BAA2B,oBAAA,CAAqB;AAS7D,IAAI,cAAA,GAAuC,IAAA;AAC3C,IAAI,SAAA,GAAkC,IAAA;AAQtC,SAAS,eAAA,GAAiC;AACxC,EAAA,IAAI,CAAC,SAAA,EAAW,SAAA,GAAY,oBAAA,CAAqB,MAAM,CAAA;AACvD,EAAA,OAAO,SAAA;AACT;AAEO,SAAS,gBAAA,GAAkC;AAChD,EAAA,MAAM,QAAA,GAAWC,WAAW,oBAAoB,CAAA;AAChD,EAAA,MAAM,OAAA,GAAU,YAAY,eAAA,EAAgB;AAC5C,EAAAC,UAAU,MAAM;AACd,IAAA,cAAA,GAAiB,OAAA;AAAA,EACnB,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AACZ,EAAA,OAAO,OAAA;AACT;AAGO,SAAS,YAAA,GAAuB;AACrC,EAAA,MAAM,UAAU,gBAAA,EAAiB;AACjC,EAAA,OAAO,oBAAA;AAAA,IACL,CAAC,QAAA,KAAa,OAAA,CAAQ,YAAA,CAAa,QAAQ,CAAA;AAAA,IAC3C,MAAM,OAAA,CAAQ,cAAA,EAAe,IAAK,GAAA;AAAA,IAClC,MAAM,OAAA,CAAQ,cAAA,EAAe,IAAK;AAAA,GACpC;AACF;AAIO,SAAS,yBAAyB,IAAA,EAAoB;AAC3D,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,MAAA,CAAO,QAAA,CAAS,GAAG,CAAC,CAAA;AAAA,EACzD,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AACX;AAEO,SAAS,WAAA,GAAoC;AAClD,EAAA,MAAM,UAAU,gBAAA,EAAiB;AACjC,EAAA,OAAO,OAAA,CAAQ,QAAA,CAAS,IAAA,CAAK,OAAO,CAAA;AACtC;AAGO,IAAM,WAAA,GAAc;AAGpB,SAAS,WAAW,EAAA,EAAkB;AAC1C,EAAA,CAAC,cAAA,IAAkB,eAAA,EAAgB,EAAG,QAAA,CAAS,EAAE,CAAA;AACpD;AASO,SAAS,kBAAA,CAAmB,cAAkC,IAAA,EAAoC;AACvG,EAAA,IAAI,YAAA,IAAgB,MAAM,OAAO,IAAA;AAKjC,EAAA,OAAO,mBAAA,CAAoB,YAAA,EAAc,EAAE,IAAA,EAAM,CAAC,OAAO,IAAA,CAAK,IAAA,CAAK,EAAE,CAAA,EAAG,CAAA;AAC1E;AAGO,SAAS,SAAA,CAAU,SAAiB,IAAA,EAA6C;AACtF,EAAA,MAAM,SAAA,GAAA,CAAa,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,EAAA,EAAI,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA,IAAK,GAAA;AACpE,EAAA,MAAM,eAAe,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAA,CAAE,OAAO,OAAO,CAAA;AACtD,EAAA,MAAM,YAAY,SAAA,CAAU,KAAA,CAAM,GAAG,CAAA,CAAE,OAAO,OAAO,CAAA;AACrD,EAAA,IAAI,YAAA,CAAa,MAAA,KAAW,SAAA,CAAU,MAAA,EAAQ,OAAO,IAAA;AACrD,EAAA,MAAM,SAAiC,EAAC;AACxC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,YAAA,CAAa,QAAQ,CAAA,EAAA,EAAK;AAC5C,IAAA,MAAM,GAAA,GAAM,aAAa,CAAC,CAAA;AAC1B,IAAA,MAAM,IAAA,GAAO,UAAU,CAAC,CAAA;AACxB,IAAA,IAAI,GAAA,CAAI,UAAA,CAAW,GAAG,CAAA,EAAG,MAAA,CAAO,GAAA,CAAI,KAAA,CAAM,CAAC,CAAC,CAAA,GAAI,kBAAA,CAAmB,IAAI,CAAA;AAAA,SAAA,IAC9D,GAAA,KAAQ,MAAM,OAAO,IAAA;AAAA,EAChC;AACA,EAAA,OAAO,MAAA;AACT;AAeO,SAAS,IAAA,CAAK,EAAE,EAAA,EAAI,QAAA,EAAU,SAAS,MAAA,EAAQ,GAAG,MAAK,EAAc;AAC1E,EAAA,MAAM,UAAU,gBAAA,EAAiB;AAEjC,EAAA,MAAM,WAAA,GAAc,CAAC,KAAA,KAA+C;AAClE,IAAA,OAAA,GAAU,KAAK,CAAA;AACf,IAAA,IAAI,CAAC,QAAQ,oBAAA,EAAsB;AACnC,IAAA,IAAI,MAAM,gBAAA,EAAkB;AAC5B,IAAA,IAAI,MAAA,IAAU,WAAW,OAAA,EAAS;AAClC,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACxB,IAAA,IAAI,MAAM,OAAA,IAAW,KAAA,CAAM,WAAW,KAAA,CAAM,QAAA,IAAY,MAAM,MAAA,EAAQ;AACtE,IAAA,KAAA,CAAM,cAAA,EAAe;AACrB,IAAA,OAAA,CAAQ,SAAS,EAAE,CAAA;AAAA,EACrB,CAAA;AAEA,EAAA,OAAOC,MAAAA,CAAM,aAAA;AAAA,IACX,GAAA;AAAA,IACA,EAAE,IAAA,EAAM,OAAA,CAAQ,IAAA,CAAK,EAAE,GAAG,OAAA,EAAS,WAAA,EAAa,MAAA,EAAQ,GAAG,IAAA,EAAK;AAAA,IAChE;AAAA,GACF;AACF;;;ACtJO,IAAM,GAAA,GAAM;AAAA;AAAA,EAEjB,YAAA,EAAc,eAAA;AAAA,EACd,kBAAA,EAAoB,sBAAA;AAAA,EACpB,aAAA,EAAe,gBAAA;AAAA,EACf,kBAAA,EAAoB,sBAAA;AAAA,EACpB,kBAAA,EAAoB,sBAAA;AAAA,EACpB,gBAAA,EAAkB,oBAAA;AAAA,EAClB,gBAAA,EAAkB,mBAAA;AAAA,EAClB,UAAA,EAAY,aAAA;AAAA,EACZ,SAAA,EAAW,YAAA;AAAA,EACX,WAAA,EAAa,cAAA;AAAA,EACb,eAAA,EAAiB,kBAAA;AAAA,EACjB,eAAA,EAAiB,kBAAA;AAAA,EACjB,OAAA,EAAS,CAAC,KAAA,KAAkB,CAAA,IAAA,EAAO,KAAA,CAAM,aAAY,CAAE,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAC,CAAA,CAAA;AAAA,EAC3E,WAAA,EAAa,CAAC,IAAA,KAAiB,CAAA,QAAA,EAAW,IAAI,CAAA,CAAA;AAAA,EAC9C,WAAA,EAAa,cAAA;AAAA;AAAA,EAEb,IAAA,EAAM,WAAA;AAAA,EACN,QAAA,EAAU,WAAA;AAAA,EACV,QAAA,EAAU,WAAA;AAAA,EACV,aAAA,EAAe,gBAAA;AAAA,EACf,iBAAA,EAAmB,qBAAA;AAAA,EACnB,iBAAA,EAAmB,qBAAA;AAAA,EACnB,aAAA,EAAe,gBAAA;AAAA,EACf,qBAAA,EAAuB,yBAAA;AAAA,EACvB,iBAAA,EAAmB,qBAAA;AAAA,EACnB,iBAAA,EAAmB,qBAAA;AAAA,EACnB,gBAAA,EAAkB,mBAAA;AAAA,EAClB,WAAA,EAAa,cAAA;AAAA,EACb,UAAA,EAAY,aAAA;AAAA,EACZ,QAAA,EAAU,cAAA;AAAA,EACV,WAAA,EAAa,cAAA;AAAA,EACb,SAAA,EAAW,WAAA;AAAA,EACX,YAAA,EAAc,cAAA;AAAA,EACd,UAAA,EAAY,YAAA;AAAA,EACZ,eAAA,EAAiB,kBAAA;AAAA,EACjB,gBAAA,EAAkB,mBAAA;AAAA,EAClB,cAAA,EAAgB,iBAAA;AAAA,EAChB,SAAA,EAAW,YAAA;AAAA,EACX,cAAA,EAAgB,CAAC,EAAA,KAAe,CAAA,iBAAA,EAAoB,EAAE,CAAA,CAAA;AAAA,EACtD,eAAA,EAAiB,mBAAA;AAAA,EACjB,gBAAA,EAAkB,oBAAA;AAAA,EAClB,cAAA,EAAgB,kBAAA;AAAA;AAAA,EAEhB,cAAA,EAAgB,iBAAA;AAAA,EAChB,iBAAA,EAAmB,qBAAA;AAAA,EACnB,gBAAA,EAAkB,mBAAA;AAAA,EAClB,mBAAA,EAAqB,uBAAA;AAAA,EACrB,UAAA,EAAY,aAAA;AAAA,EACZ,aAAA,EAAe,gBAAA;AAAA,EACf,mBAAA,EAAqB,uBAAA;AAAA;AAAA,EAErB,WAAA,EAAa,cAAA;AAAA,EACb,WAAA,EAAa,cAAA;AAAA,EACb,eAAA,EAAiB,mBAAA;AAAA,EACjB,gBAAA,EAAkB,oBAAA;AAAA,EAClB,cAAA,EAAgB,kBAAA;AAAA,EAChB,SAAA,EAAW,YAAA;AAAA,EACX,YAAA,EAAc,eAAA;AAAA;AAAA,EAEd,cAAA,EAAgB,CAAC,IAAA,KAAiB,CAAA,gBAAA,EAAmB,IAAI,CAAA,CAAA;AAAA,EACzD,cAAA,EAAgB,kBAAA;AAAA,EAChB,cAAA,EAAgB,kBAAA;AAAA,EAChB,aAAA,EAAe,gBAAA;AAAA,EACf,UAAA,EAAY,aAAA;AAAA,EACZ,YAAA,EAAc,eAAA;AAAA;AAAA,EAEd,OAAA,EAAS,UAAA;AAAA,EACT,QAAA,EAAU,WAAA;AAAA,EACV,eAAA,EAAiB,mBAAA;AAAA,EACjB,cAAA,EAAgB,iBAAA;AAAA,EAChB,kBAAA,EAAoB,CAAC,EAAA,KAAe,CAAA,eAAA,EAAkB,EAAA,CAAG,aAAY,CAAE,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAC,CAAA,CAAA;AAAA,EAC3F,oBAAoB,CAAC,EAAA,EAAY,UAAkB,CAAA,eAAA,EAAkB,EAAA,CAAG,aAAY,CAAE,OAAA,CAAQ,QAAQ,GAAG,CAAC,IAAI,KAAA,CAAM,WAAA,GAAc,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAC,CAAA,CAAA;AAAA,EACtJ,WAAA,EAAa,eAAA;AAAA,EACb,YAAA,EAAc,iBAAA;AAAA,EACd,OAAA,EAAS,UAAA;AAAA,EACT,UAAA,EAAY,aAAA;AAAA,EACZ,eAAA,EAAiB,mBAAA;AAAA,EACjB,gBAAA,EAAkB,oBAAA;AAAA,EAClB,eAAA,EAAiB,mBAAA;AAAA,EACjB,UAAA,EAAY,aAAA;AAAA,EACZ,gBAAA,EAAkB,oBAAA;AAAA,EAClB,WAAA,EAAa,cAAA;AAAA,EACb,WAAA,EAAa,cAAA;AAAA,EACb,YAAA,EAAc,eAAA;AAAA,EACd,YAAA,EAAc,eAAA;AAAA,EACd,cAAA,EAAgB,iBAAA;AAAA,EAChB,cAAA,EAAgB,iBAAA;AAAA,EAChB,aAAA,EAAe,gBAAA;AAAA,EACf,cAAA,EAAgB,iBAAA;AAAA,EAChB,YAAA,EAAc,eAAA;AAAA;AAAA,EAEd,UAAA,EAAY,aAAA;AAAA,EACZ,aAAA,EAAe,iBAAA;AAAA,EACf,UAAA,EAAY,aAAA;AAAA,EACZ,QAAA,EAAU,WAAA;AAAA,EACV,OAAA,EAAS,UAAA;AAAA,EACT,OAAA,EAAS,UAAA;AAAA,EACT,OAAA,EAAS,UAAA;AAAA,EACT,UAAA,EAAY,aAAA;AAAA,EACZ,YAAA,EAAc,eAAA;AAAA,EACd,aAAA,EAAe,gBAAA;AAAA,EACf,aAAA,EAAe,gBAAA;AAAA,EACf,WAAA,EAAa,cAAA;AAAA,EACb,aAAA,EAAe,gBAAA;AAAA,EACf,YAAA,EAAc,eAAA;AAAA,EACd,gBAAA,EAAkB,mBAAA;AAAA,EAClB,SAAA,EAAW,YAAA;AAAA,EACX,UAAA,EAAY,aAAA;AAAA,EACZ,SAAA,EAAW,YAAA;AAAA;AAAA,EAEX,iBAAA,EAAmB,oBAAA;AAAA,EACnB,gBAAA,EAAkB,oBAAA;AAAA,EAClB,iBAAA,EAAmB,qBAAA;AAAA,EACnB,cAAA,EAAgB,iBAAA;AAAA,EAChB,gBAAA,EAAkB,mBAAA;AAAA,EAClB,aAAA,EAAe,gBAAA;AAAA,EACf,eAAA,EAAiB,kBAAA;AAAA,EACjB,aAAA,EAAe,gBAAA;AAAA;AAAA,EAEf,aAAA,EAAe,gBAAA;AAAA,EACf,YAAA,EAAc,eAAA;AAAA,EACd,gBAAA,EAAkB,mBAAA;AAAA,EAClB,cAAA,EAAgB,iBAAA;AAAA,EAChB,YAAA,EAAc,eAAA;AAAA,EACd,WAAA,EAAa,cAAA;AAAA,EACb,YAAA,EAAc,eAAA;AAAA,EACd,cAAA,EAAgB,iBAAA;AAAA,EAChB,WAAA,EAAa,cAAA;AAAA,EACb,UAAA,EAAY,aAAA;AAAA;AAAA,EAEZ,aAAA,EAAe,gBAAA;AAAA,EACf,YAAA,EAAc,CAAC,CAAA,KAAc,CAAA,cAAA,EAAiB,CAAC,CAAA,CAAA;AAAA,EAC/C,eAAA,EAAiB,kBAAA;AAAA,EACjB,oBAAA,EAAsB,wBAAA;AAAA,EACtB,gBAAA,EAAkB,mBAAA;AAAA,EAClB,YAAA,EAAc,eAAA;AAAA,EACd,YAAA,EAAc,eAAA;AAAA;AAAA,EAEd,QAAA,EAAU,WAAA;AAAA,EACV,OAAA,EAAS,UAAA;AAAA,EACT,OAAA,EAAS,UAAA;AAAA,EACT,UAAA,EAAY,aAAA;AAAA,EACZ,aAAA,EAAe,gBAAA;AAAA,EACf,kBAAA,EAAoB,qBAAA;AAAA;AAAA,EAEpB,WAAA,EAAa,cAAA;AAAA,EACb,WAAA,EAAa,cAAA;AAAA,EACb,aAAA,EAAe,gBAAA;AAAA,EACf,iBAAA,EAAmB,CAAC,IAAA,KAAiB,CAAA,oBAAA,EAAuB,IAAI,CAAA,CAAA;AAAA,EAChE,UAAA,EAAY,aAAA;AAAA,EACZ,aAAA,EAAe,gBAAA;AAAA;AAAA,EAEf,oBAAA,EAAsB,wBAAA;AAAA,EACtB,mBAAA,EAAqB,uBAAA;AAAA,EACrB,WAAA,EAAa,cAAA;AAAA,EACb,aAAA,EAAe,iBAAA;AAAA,EACf,aAAA,EAAe,iBAAA;AAAA,EACf,WAAA,EAAa,cAAA;AAAA,EACb,cAAA,EAAgB,iBAAA;AAAA,EAChB,UAAA,EAAY,aAAA;AAAA,EACZ,YAAA,EAAc,eAAA;AAAA,EACd,SAAA,EAAW,YAAA;AAAA,EACX,UAAA,EAAY,aAAA;AAAA,EACZ,aAAA,EAAe,gBAAA;AAAA,EACf,YAAA,EAAc,eAAA;AAAA,EACd,cAAA,EAAgB,iBAAA;AAAA,EAChB,OAAA,EAAS;AACX;ACpKO,SAAS,WAAA,CAAY;AAAA,EAC1B,YAAA;AAAA,EACA,OAAA,GAAU,MAAA;AAAA,EACV,QAAA,GAAW,OAAA;AAAA,EACX,MAAA;AAAA,EACA,KAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAqB;AACnB,EAAA,MAAM,SAAS,2BAAA,EAA4B;AAC3C,EAAA,MAAM,QAAA,GAAW;AAAA,IACf,GAAG,MAAA,EAAQ,YAAA;AAAA,IACX,GAAG;AAAA,GACL;AACA,EAAA,MAAM,IAAA,GAAO,SAAS,IAAA,IAAQ,MAAA;AAC9B,EAAA,MAAM,UAAA,GAAa,SAAS,UAAA,IAAc,GAAA;AAC1C,EAAA,MAAM,MAAA,GAAS,SAAS,MAAA,IAAU,gCAAA;AAClC,EAAA,MAAM,IAAA,GAAO,SAAS,IAAA,IAAQ,IAAA;AAC9B,EAAA,MAAM,GAAA,GAAMA,MAAAA,CAAM,MAAA,CAAgC,IAAI,CAAA;AACtD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,IAAIA,MAAAA,CAAM,QAAA,CAAS,SAAS,MAAM,CAAA;AAE1D,EAAAA,MAAAA,CAAM,UAAU,MAAM;AACpB,IAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,MAAA,SAAA,CAAU,IAAI,CAAA;AACd,MAAA;AAAA,IACF;AACA,IAAA,IAAI,GAAA,CAAI,SAAS,QAAA,IAAY,GAAA,CAAI,QAAQ,YAAA,GAAe,CAAA,YAAa,IAAI,CAAA;AAAA,EAC3E,CAAA,EAAG,CAAC,IAAA,EAAM,KAAA,CAAM,GAAG,CAAC,CAAA;AAEpB,EAAA,MAAM,WAAA,GACJ,IAAA,KAAS,MAAA,GACL,EAAC,GACD;AAAA,IACE,OAAA,EAAS,SAAS,CAAA,GAAI,CAAA;AAAA,IACtB,MAAA,EAAQ,IAAA,IAAQ,CAAC,MAAA,GAAS,YAAA,GAAe,WAAA;AAAA,IACzC,UAAA,EAAY,CAAA,QAAA,EAAW,UAAU,CAAA,GAAA,EAAM,MAAM,CAAA,SAAA,EAAY,UAAU,CAAA,GAAA,EAAM,MAAM,CAAA,YAAA,EAAe,UAAU,CAAA,GAAA,EAAM,MAAM,CAAA;AAAA,GACtH;AAEN,EAAA,uBACEC,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACE,GAAG,KAAA;AAAA,MACJ,GAAA;AAAA,MACA,OAAA;AAAA,MACA,QAAA;AAAA,MACA,sBAAA,EAAsB,SAAS,MAAA,GAAS,OAAA;AAAA,MACxC,KAAA,EAAO,EAAE,GAAG,KAAA,EAAO,GAAG,WAAA,EAAY;AAAA,MAClC,MAAA,EAAQ,CAAC,KAAA,KAAU;AACjB,QAAA,SAAA,CAAU,IAAI,CAAA;AACd,QAAA,MAAA,GAAS,KAAK,CAAA;AAAA,MAChB;AAAA;AAAA,GACF;AAEJ;AC9CA,SAAS,UAAA,CAAW,KAAA,EAAkB,CAAA,GAAI,IAAA,EAAM,IAAI,GAAA,EAAa;AAC/D,EAAA,OAAO,KAAA,CAAM,KAAA,IAAS,iBAAA,CAAkB,KAAA,CAAM,KAAA,EAAO,KAAA,CAAM,GAAA,IAAO,GAAA,EAAA,CAAM,KAAA,CAAM,GAAA,IAAO,GAAA,IAAO,EAAA,EAAI,GAAG,CAAC,CAAA;AACtG;AAEA,SAAS,SAAA,CAAU,EAAE,KAAA,EAAO,MAAA,EAAAC,SAAO,EAA0C;AAC3E,EAAA,MAAM,UAAU,CAAC,CAAA,KACfA,UAAS,EAAE,SAAA,EAAW,mBAAmB,KAAA,EAAO,EAAE,cAAA,EAAgB,CAAA,EAAG,IAAI,GAAG,CAAA,EAAA,CAAA,IAAO,GAAI,EAAE,WAAW,WAAA,EAAY;AAElH,EAAA,MAAM,wBACJ,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAD,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAW,CAAA,uEAAA,EAA0E,QAAQ,CAAC,CAAA,CAAE,SAAS,CAAA,CAAA,EAAI,OAAO,OAAA,CAAQ,CAAC,CAAA,CAAE,KAAA,EAChI,gBAAM,KAAA,EACT,CAAA;AAAA,IACC,MAAM,QAAA,oBACLA,IAAC,GAAA,EAAA,EAAE,SAAA,EAAW,sCAAsC,OAAA,CAAQ,CAAC,CAAA,CAAE,SAAS,IAAI,KAAA,EAAO,OAAA,CAAQ,CAAC,CAAA,CAAE,KAAA,EAC3F,gBAAM,QAAA,EACT,CAAA;AAAA,IAED,KAAA,CAAM,GAAA,oBACLA,GAAAA,CAAC,SAAI,SAAA,EAAW,OAAA,CAAQ,CAAC,CAAA,CAAE,WAAW,KAAA,EAAO,OAAA,CAAQ,CAAC,CAAA,CAAE,OACtD,QAAA,kBAAAA,GAAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,EAAA,EAAI,MAAM,IAAA,IAAQ,UAAA;AAAA,QAClB,SAAA,EAAU,uJAAA;AAAA,QACV,KAAA,EAAO,EAAE,YAAA,EAAc,yBAAA,EAA0B;AAAA,QAEhD,QAAA,EAAA,KAAA,CAAM;AAAA;AAAA,KACT,EACF;AAAA,GAAA,EAEJ,CAAA;AAEF,EAAA,IAAI,MAAM,KAAA,EAAO;AACf,IAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6EAA6E,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,EAEtG;AACA,EAAA,uBAAOA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,cAAc,QAAA,EAAA,KAAA,EAAM,CAAA;AAC5C;AAEO,SAAS,WAAA,CAAY;AAAA,EAC1B,OAAA;AAAA;AAAA;AAAA;AAAA,EAIA,SAAS,EAAC;AAAA,EACV,MAAA,GAAS;AACX,CAAA,EAIG;AACD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIE,SAAS,CAAC,CAAA;AACpC,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,QAAAA,CAAkC,EAAE,CAAA;AAC5E,EAAA,MAAM,SAAS,mBAAA,EAAoB;AACnC,EAAA,MAAM,UAAA,GAAaC,OAAO,KAAK,CAAA;AAC/B,EAAA,MAAM,MAAA,GAAS,MAAA,KAAW,MAAA,GAAS,wBAAA,GAA2B,wBAAA;AAC9D,EAAA,MAAM,YAAA,GAAe,MAAA,CAAO,YAAA,CAAa,IAAA,KAAS,MAAA;AAClD,EAAA,MAAM,WAAA,GAAc,CAAC,MAAA,KACnB,YAAA,GACI;AAAA,IACE,QAAQ,MAAA,CAAO,YAAA,CAAa,IAAA,IAAQ,CAAC,SAAS,YAAA,GAAe,WAAA;AAAA,IAC7D,UAAA,EAAY,8BAA8B,MAAA,CAAO,YAAA,CAAa,UAAU,CAAA,GAAA,EAAM,MAAA,CAAO,aAAa,MAAM,CAAA;AAAA,GAC1G,GACA,MAAA;AAGN,EAAAL,UAAU,MAAM;AACd,IAAA,IAAI,YAAY,QAAA,IAAY,MAAA,CAAO,MAAA,GAAS,CAAA,IAAK,sBAAqB,EAAG;AACzE,IAAA,MAAM,KAAA,GAAQ,YAAY,MAAM;AAC9B,MAAA,IAAI,CAAC,WAAW,OAAA,EAAS,QAAA,CAAS,CAAC,CAAA,KAAA,CAAO,CAAA,GAAI,CAAA,IAAK,MAAA,CAAO,MAAM,CAAA;AAAA,IAClE,GAAG,GAAI,CAAA;AACP,IAAA,OAAO,MAAM,cAAc,KAAK,CAAA;AAAA,EAClC,CAAA,EAAG,CAAC,OAAA,EAAS,MAAA,CAAO,MAAM,CAAC,CAAA;AAE3B,EAAA,MAAM,IAAA,GAAO,CAAC,CAAA,KAAc;AAC1B,IAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AACrB,IAAA,QAAA,CAAA,CAAU,CAAA,GAAI,MAAA,CAAO,MAAA,IAAU,MAAA,CAAO,MAAM,CAAA;AAAA,EAC9C,CAAA;AAEA,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAEhC,EAAA,IAAI,YAAY,OAAA,EAAS;AACvB,IAAA,uBACEE,GAAAA,CAAC,SAAA,EAAA,EAAQ,aAAA,EAAa,GAAA,CAAI,MAAM,SAAA,EAAU,4BAAA,EACvC,QAAA,EAAA,MAAA,CAAO,KAAA,CAAM,GAAG,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,OAAO,CAAA,qBAC9B,IAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QAEC,EAAA,EAAI,MAAM,IAAA,IAAQ,UAAA;AAAA,QAClB,SAAA,EAAU,6DAAA;AAAA,QAEV,QAAA,EAAA;AAAA,0BAAAA,GAAAA;AAAA,YAAC,WAAA;AAAA,YAAA;AAAA,cACC,GAAA,EAAK,UAAA,CAAW,KAAA,EAAO,GAAA,EAAK,GAAG,CAAA;AAAA,cAC/B,KAAK,KAAA,CAAM,KAAA;AAAA,cACX,SAAA,EAAU;AAAA;AAAA,WACZ;AAAA,0BACA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+IAAA,EACb,QAAA,EAAA;AAAA,4BAAAA,GAAAA;AAAA,cAAC,IAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAU,kGAAA;AAAA,gBACV,OAAO,EAAE,cAAA,EAAgB,CAAA,EAAG,CAAA,GAAI,GAAG,CAAA,EAAA,CAAA,EAAK;AAAA,gBAEvC,QAAA,EAAA,KAAA,CAAM;AAAA;AAAA,aACT;AAAA,YACC,MAAM,QAAA,oBACLA,GAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,2CAAA,EAA4C,KAAA,EAAO,EAAE,cAAA,EAAgB,GAAG,CAAA,GAAI,GAAA,GAAM,GAAG,CAAA,EAAA,CAAA,EAAK,EACpG,gBAAM,QAAA,EACT,CAAA;AAAA,4BAEFA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4LAA2L,QAAA,EAAA,iBAAA,EAE3M;AAAA,WAAA,EACF;AAAA;AAAA,OAAA;AAAA,MAxBK;AAAA,KA0BR,CAAA,EACH,CAAA;AAAA,EAEJ;AAEA,EAAA,MAAMC,OAAAA,GAAS,OAAO,IAAA,CAAK,GAAA,CAAI,OAAO,MAAA,CAAO,MAAA,GAAS,CAAC,CAAC,CAAA;AAExD,EAAA,uBACE,IAAA,CAAC,aAAQ,aAAA,EAAa,GAAA,CAAI,MAAM,SAAA,EAAW,CAAA,gCAAA,EAAmC,MAAM,CAAA,CAAA,EAEjF,QAAA,EAAA;AAAA,IAAA,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,EAAO,CAAA,qBAClBD,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QAEC,GAAA,EAAK,WAAW,KAAK,CAAA;AAAA,QACrB,KAAK,KAAA,CAAM,KAAA;AAAA,QACX,eAAa,CAAA,KAAM,KAAA;AAAA,QACnB,OAAA,EAAS,CAAA,KAAM,CAAA,GAAI,OAAA,GAAU,MAAA;AAAA,QAC7B,QAAA,EAAS,OAAA;AAAA,QACT,MAAA,EAAQ,MAAM,eAAA,CAAgB,CAAC,OAAA,MAAa,EAAE,GAAG,OAAA,EAAS,CAAC,CAAC,GAAG,IAAA,EAAK,CAAE,CAAA;AAAA,QACtE,OAAO,WAAA,CAAY,OAAA,CAAQ,YAAA,CAAa,CAAC,CAAC,CAAC,CAAA;AAAA,QAC3C,SAAA,EAAW,CAAA,4EAAA,EACT,CAAA,KAAM,KAAA,KAAU,CAAC,gBAAgB,YAAA,CAAa,CAAC,CAAA,CAAA,GAAK,8BAAA,GAAiC,WACvF,CAAA;AAAA,OAAA;AAAA,MAVK;AAAA,KAYR,CAAA;AAAA,oBACDA,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,CAAA,4CAAA,EACTC,OAAAA,CAAO,KAAA,GAAQ,KAAK,4DACtB,CAAA,CAAA;AAAA,QAEA,0BAAAD,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,0BAAA,EACb,QAAA,kBAAAA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YACb,QAAA,kBAAAA,GAAAA,CAAC,aAAsB,KAAA,EAAOC,OAAAA,EAAQ,QAAM,IAAA,EAAA,EAA5B,KAA6B,GAC/C,CAAA,EACF;AAAA;AAAA,KACF;AAAA,IAEC,OAAA,KAAY,QAAA,IAAY,MAAA,CAAO,MAAA,GAAS,qBACvC,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,sBAAAD,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,YAAA,EAAW,gBAAA;AAAA,UACX,eAAa,GAAA,CAAI,QAAA;AAAA,UACjB,OAAA,EAAS,MAAM,IAAA,CAAK,KAAA,GAAQ,CAAC,CAAA;AAAA,UAC7B,SAAA,EAAU,oIAAA;AAAA,UAEV,QAAA,kBAAAA,GAAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAU,uBAAA,EAAwB;AAAA;AAAA,OACjD;AAAA,sBACAA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,YAAA,EAAW,kBAAA;AAAA,UACX,eAAa,GAAA,CAAI,QAAA;AAAA,UACjB,OAAA,EAAS,MAAM,IAAA,CAAK,KAAA,GAAQ,CAAC,CAAA;AAAA,UAC7B,SAAA,EAAU,qIAAA;AAAA,UAEV,QAAA,kBAAAA,GAAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAU,uBAAA,EAAwB;AAAA;AAAA,OAClD;AAAA,sBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wDAAA,EACZ,iBAAO,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,qBACdA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UAEC,IAAA,EAAK,QAAA;AAAA,UACL,YAAA,EAAY,CAAA,gBAAA,EAAmB,CAAA,GAAI,CAAC,CAAA,CAAA;AAAA,UACpC,OAAA,EAAS,MAAM,IAAA,CAAK,CAAC,CAAA;AAAA,UACrB,SAAA,EAAW,CAAA,6CAAA,EAAgD,CAAA,KAAM,KAAA,GAAQ,iBAAiB,mCAAmC,CAAA;AAAA,SAAA;AAAA,QAJxH;AAAA,OAMR,CAAA,EACH;AAAA,KAAA,EACF;AAAA,GAAA,EAEJ,CAAA;AAEJ;AAEO,IAAM,aAAA,GAAgB;AAAA,EAC3B,KAAA,EAAO,MAAA;AAAA,EACP,WAAA,EAAa,8FAAA;AAAA,EACb,QAAA,EAAU;AAAA,IACR;AAAA,MACE,EAAA,EAAI,SAAA;AAAA,MACJ,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,QAAA;AAAA,MACP,IAAA,EAAM,6HAAA;AAAA,MACN,OAAA,EAAS,QAAA;AAAA,MACT,OAAA,EAAS;AAAA,QACP,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,QAAA,EAAS;AAAA,QACnC,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,QAAA,EAAS;AAAA,QACnC,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,mBAAA;AAAoB;AAC/C,KACF;AAAA,IACA;AAAA,MACE,EAAA,EAAI,QAAA;AAAA,MACJ,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,QAAA;AAAA,MACP,IAAA,EAAM,gFAAA;AAAA,MACN,OAAA,EAAS,MAAA;AAAA,MACT,OAAA,EAAS;AAAA,QACP,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO;AAAA,QAC/B,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,QAAA;AAAS;AACrC,KACF;AAAA,IACA;AAAA,MACE,EAAA,EAAI,QAAA;AAAA,MACJ,IAAA,EAAM,MAAA;AAAA,MACN,KAAA,EAAO,QAAA;AAAA,MACP,IAAA,EAAM,6HAAA;AAAA,MACN,QAAA,EAAU,IAAA;AAAA,MACV,EAAA,EAAI;AAAA,QACF,EAAE,IAAI,OAAA,EAAS,IAAA,EAAM,QAAQ,KAAA,EAAO,OAAA,EAAS,UAAU,IAAA,EAAK;AAAA,QAC5D,EAAE,EAAA,EAAI,UAAA,EAAY,IAAA,EAAM,MAAA,EAAQ,OAAO,UAAA,EAAW;AAAA,QAClD,EAAE,IAAI,KAAA,EAAO,IAAA,EAAM,QAAQ,KAAA,EAAO,cAAA,EAAgB,MAAM,iEAAA,EAAkE;AAAA,QAC1H,EAAE,IAAI,MAAA,EAAQ,IAAA,EAAM,OAAO,KAAA,EAAO,aAAA,EAAe,MAAM,uFAAA,EAAwF;AAAA,QAC/I;AAAA,UACE,EAAA,EAAI,OAAA;AAAA,UACJ,IAAA,EAAM,OAAA;AAAA,UACN,KAAA,EAAO,kBAAA;AAAA,UACP,IAAA,EAAM;AAAA,SACR;AAAA,QACA;AAAA,UACE,EAAA,EAAI,KAAA;AAAA,UACJ,IAAA,EAAM,QAAA;AAAA,UACN,KAAA,EAAO,iBAAA;AAAA,UACP,IAAA,EAAM,6EAAA;AAAA,UACN,GAAA,EAAK,CAAA;AAAA,UACL,GAAA,EAAK,GAAA;AAAA,UACL,OAAA,EAAS;AAAA,SACX;AAAA,QACA;AAAA,UACE,EAAA,EAAI,OAAA;AAAA,UACJ,IAAA,EAAM,SAAA;AAAA,UACN,KAAA,EAAO,YAAA;AAAA,UACP,IAAA,EAAM,iHAAA;AAAA,UACN,OAAA,EAAS;AAAA;AACX;AACF;AACF,GACF;AAAA,EACA,OAAA,EAAS;AAAA,IACP;AAAA,MACE,IAAA,EAAM,aAAA;AAAA,MACN,KAAA,EAAO;AAAA,QACL,OAAA,EAAS,QAAA;AAAA,QACT,MAAA,EAAQ,MAAA;AAAA,QACR,MAAA,EAAQ;AAAA,UACN,EAAE,KAAA,EAAO,0BAAA,EAAsB,QAAA,EAAU,iDAAA,EAA0C,KAAK,mBAAA,EAAe,IAAA,EAAM,UAAA,EAAY,GAAA,EAAK,GAAA;AAAI;AACpI;AACF,KACF;AAAA,IACA;AAAA,MACE,IAAA,EAAM,aAAA;AAAA,MACN,KAAA,EAAO;AAAA,QACL,OAAA,EAAS,QAAA;AAAA,QACT,MAAA,EAAQ,QAAA;AAAA,QACR,MAAA,EAAQ;AAAA,UACN,EAAE,KAAA,EAAO,0BAAA,EAAsB,QAAA,EAAU,iDAAA,EAA0C,KAAK,mBAAA,EAAe,IAAA,EAAM,UAAA,EAAY,GAAA,EAAK,GAAA,EAAI;AAAA,UAClI,EAAE,KAAA,EAAO,iCAAA,EAAgC,QAAA,EAAU,oCAAA,EAAmC,KAAK,YAAA,EAAc,IAAA,EAAM,UAAA,EAAY,GAAA,EAAK,EAAA;AAAG;AACrI;AACF,KACF;AAAA,IACA;AAAA,MACE,IAAA,EAAM,YAAA;AAAA,MACN,KAAA,EAAO;AAAA,QACL,OAAA,EAAS,OAAA;AAAA,QACT,MAAA,EAAQ;AAAA,UACN,EAAE,OAAO,WAAA,EAAa,QAAA,EAAU,0BAA0B,IAAA,EAAM,UAAA,EAAY,KAAK,GAAA,EAAI;AAAA,UACrF,EAAE,OAAO,SAAA,EAAW,QAAA,EAAU,8BAAwB,IAAA,EAAM,UAAA,EAAY,KAAK,GAAA;AAAI;AACnF;AACF;AACF,GACF;AAAA;AAAA,EAEA,SAAA,EAAW,CAAC,MAAA,EAAQ,YAAA,EAAc,SAAS;AAC7C,CAAA;ACtQA,IAAM,OAAA,GAAU;AAAA,EACd,MAAA,EAAQ,EAAA;AAAA,EACR,UAAA,EAAY,IAAA;AAAA,EACZ,UAAA,EAAY,IAAA;AAAA,EACZ,QAAQ,EAAC;AAAA,EACT,QAAA,EAAU,IAAA;AAAA,EACV,QAAA,EAAU,IAAA;AAAA,EACV,WAAA,EAAa,KAAA;AAAA,EACb,IAAA,EAAM;AACR,CAAA;AAEO,IAAM,eAAA,GAAkBR,MAAAA,EAAqB,CAAE,CAAC,GAAA,MAAS;AAAA,EAC9D,GAAG,OAAA;AAAA,EACH,WAAW,CAAC,MAAA,KAAW,GAAA,CAAI,EAAE,QAAQ,CAAA;AAAA,EACrC,eAAe,CAAC,UAAA,KAAe,GAAA,CAAI,EAAE,YAAY,CAAA;AAAA;AAAA;AAAA,EAGjD,aAAA,EAAe,CAAC,UAAA,KACd,GAAA,CAAI,CAACG,EAAAA,MAAO,EAAE,UAAA,EAAY,MAAA,EAAQ,UAAUA,EAAAA,CAAE,MAAA,EAAQ,YAAA,EAAc,UAAU,GAAE,CAAE,CAAA;AAAA,EACpF,UAAU,CAAC,GAAA,EAAK,KAAA,KACd,GAAA,CAAI,CAACA,EAAAA,MAAO;AAAA,IACV,MAAA,EAAQ,SAAA,CAAUA,EAAAA,CAAE,MAAA,EAAQ,KAAK,KAAK,CAAA;AAAA,IACtC,GAAI,GAAA,KAAQ,YAAA,GAAe,EAAE,UAAA,EAAY,OAAM,GAAI;AAAA,GACrD,CAAE,CAAA;AAAA,EACJ,WAAA,EAAa,MAAM,GAAA,CAAI,EAAE,QAAQ,EAAC,EAAG,UAAA,EAAY,IAAA,EAAM,CAAA;AAAA,EACvD,aAAa,CAAC,QAAA,KAAa,GAAA,CAAI,EAAE,UAAU,CAAA;AAAA,EAC3C,aAAa,CAAC,QAAA,KAAa,GAAA,CAAI,EAAE,UAAU,CAAA;AAAA,EAC3C,gBAAgB,CAAC,WAAA,KAAgB,GAAA,CAAI,EAAE,aAAa,CAAA;AAAA,EACpD,SAAS,CAAC,IAAA,KAAS,GAAA,CAAI,EAAE,MAAM,CAAA;AAAA,EAC/B,KAAA,EAAO,MAAM,GAAA,CAAI,OAAO;AAC1B,CAAA,CAAE;;;ACXF,IAAI,MAAA,GAAkC,IAAA;AAG/B,SAAS,uBAAA,GAAmD;AACjE,EAAA,OAAO,MAAA;AACT;AAIO,SAAS,oBAAA,CAAwB,MAAwB,MAAA,EAAoB;AAClF,EAAA,MAAM,QAAA,GAAW,MAAA;AACjB,EAAA,MAAA,GAAS,IAAA;AACT,EAAA,IAAI;AACF,IAAA,OAAO,MAAA,EAAO;AAAA,EAChB,CAAA,SAAE;AACA,IAAA,MAAA,GAAS,QAAA;AAAA,EACX;AACF;ACfO,SAAS,iBAAA,CACd,MACA,OAAA,EACyB;AACzB,EAAA,MAAM,MAA+B,EAAC;AACtC,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,KAAK,CAAA,IAAK,MAAA,CAAO,QAAQ,IAAA,CAAK,MAAA,IAAU,EAAE,CAAA,EAAG;AAC7D,IAAA,IAAI,QAAA,GAAoB,KAAA;AACxB,IAAA,IAAI,iBAAiB,KAAK,CAAA,aAAc,OAAA,CAAQ,MAAA,CAAO,MAAM,MAAM,CAAA;AAAA,SAAA,IAC1D,gBAAgB,KAAK,CAAA,aAAc,OAAA,CAAQ,KAAA,CAAM,MAAM,KAAK,CAAA;AACrE,IAAA,IAAI,QAAA,KAAa,MAAA,EAAW,GAAA,CAAI,IAAI,CAAA,GAAI,QAAA;AAAA,EAC1C;AACA,EAAA,OAAO,GAAA;AACT;AAIA,SAAS,aAAa,IAAA,EAAgD;AACpE,EAAA,MAAM,IAAA,GAAO,YAAA,CAAa,IAAA,CAAK,IAAI,CAAA;AACnC,EAAA,OAAO,EAAE,GAAG,IAAA,EAAM,IAAA,EAAM,GAAG,KAAK,IAAA,EAAK;AACvC;AAMO,SAAS,gBAAA,CACd,KAAA,EACA,WAAA,GAAsC,EAAC,EACvB;AAChB,EAAA,MAAM,KAAA,uBAAY,GAAA,EAA0B;AAC5C,EAAA,MAAM,KAAA,GAAQ,CAAC,IAAA,KAA0B;AACvC,IAAA,MAAM,IAAA,GAAO,YAAA,CAAa,IAAA,CAAK,IAAI,CAAA;AACnC,IAAA,MAAM,KAAA,GAAQ,aAAa,IAAI,CAAA;AAC/B,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,CAAE,SAAS,CAAA,EAAG;AACjC,MAAA,MAAM,KAAA,GAAQ,EAAE,GAAG,wBAAA,CAAyB,MAAM,QAAQ,CAAA,EAAG,GAAG,IAAA,CAAK,KAAA,EAAM;AAC3E,MAAA,KAAA,MAAW,IAAA,IAAQ,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA,EAAG;AACvC,QAAA,IAAI,CAAC,QAAQ,OAAO,IAAA,CAAK,WAAW,QAAA,IAAY,CAAC,KAAK,MAAA,EAAQ;AAC9D,QAAA,MAAM,SAAS,iBAAA,CAAkB,IAAA,EAAM,EAAE,MAAA,EAAQ,WAAA,EAAa,OAAO,CAAA;AACrE,QAAA,MAAM,GAAA,GAAM,WAAA,CAAY,IAAA,CAAK,MAAA,EAAQ,MAAM,CAAA;AAC3C,QAAA,IAAI,CAAC,KAAA,CAAM,GAAA,CAAI,GAAG,GAAG,KAAA,CAAM,GAAA,CAAI,GAAA,EAAK,EAAE,GAAA,EAAK,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAQ,QAAQ,CAAA;AAAA,MAC1E;AAAA,IACF;AACA,IAAA,KAAA,MAAW,SAAS,IAAA,CAAK,QAAA,IAAY,EAAC,QAAS,KAAK,CAAA;AAAA,EACtD,CAAA;AACA,EAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,EAAO,KAAA,CAAM,IAAI,CAAA;AACpC,EAAA,OAAO,CAAC,GAAG,KAAA,CAAM,MAAA,EAAQ,CAAA;AAC3B;AAMA,eAAsB,oBAAoB,IAAA,EAAuE;AAC/G,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,aAAA,CAAc,IAAA,CAAK,MAAM,CAAA;AACtC,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,IAAA,CAAK,QAAQ,EAAE,IAAA,EAAMD,eAAAA,EAAgB,EAAG,CAAA;AAChE,IAAA,OAAO,EAAE,MAAA,EAAQ,OAAA,EAAS,IAAA,EAAK;AAAA,EACjC,SAAS,GAAA,EAAK;AACZ,IAAA,MAAM,UAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAG/D,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,qBAAA,EAAwB,IAAA,CAAK,MAAM,aAAa,GAAG,CAAA;AACjE,IAAA,OAAO,EAAE,MAAA,EAAQ,OAAA,EAAS,KAAA,EAAO,OAAA,EAAQ;AAAA,EAC3C;AACF;AAIA,eAAsB,gBACpB,KAAA,EACwC;AACxC,EAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,GAAA;AAAA,IAC5B,KAAA,CAAM,GAAA,CAAI,OAAO,IAAA,KAAS,CAAC,IAAA,CAAK,GAAA,EAAK,MAAM,mBAAA,CAAoB,IAAI,CAAC,CAAU;AAAA,GAChF;AACA,EAAA,OAAO,MAAA,CAAO,YAAY,OAAO,CAAA;AACnC;AAWA,IAAM,eAAA,GAAkBE,cAA2C,IAAI,CAAA;AAsBhE,SAAS,cAAc,EAAE,KAAA,EAAO,QAAQ,OAAA,EAAAQ,QAAAA,EAAS,UAAS,EAAuB;AACtF,EAAA,MAAM,MAAA,GAASP,WAAW,eAAe,CAAA;AACzC,EAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,MAAM,MAAA,IAAU,MAAA,EAAQ,MAAA,IAAU,EAAC,EAAG,CAAC,MAAA,EAAQ,MAAM,CAAC,CAAA;AAClF,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,MAAM,gBAAA,CAAiB,KAAA,EAAO,WAAW,CAAA,EAAG,CAAC,KAAA,EAAO,WAAW,CAAC,CAAA;AACtF,EAAA,MAAM,GAAA,GAAM,OAAA;AAAA,IACV,MAAM,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS,CAAC,MAAA,IAAU,EAAE,IAAA,CAAK,GAAA,IAAO,MAAA,CAAO,OAAA,CAAQ,CAAA;AAAA,IACrE,CAAC,OAAO,MAAM;AAAA,GAChB;AAIA,EAAA,MAAM,aAAa,uBAAA,EAAwB;AAC3C,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,UAAA,CAAW,KAAK,KAAK,CAAA;AACrB,IAAA,UAAA,CAAW,MAAM,GAAG,CAAA;AAAA,EACtB;AAKA,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIK,SAAwC,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAO3E,GAAGE,QAAAA;AAAA,IACH,GAAG,MAAA,CAAO,WAAA;AAAA,MACR,GAAA,CAAI,GAAA,CAAI,CAAC,IAAA,KAAS;AAAA,QAChB,IAAA,CAAK,GAAA;AAAA,QACLA,QAAAA,GAAU,IAAA,CAAK,GAAG,CAAA,IAAK,UAAA,EAAY,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAA,IAAM,EAAE,MAAA,EAAQ,SAAA;AAAU,OAC9E;AAAA;AACH,GACF,CAAE,CAAA;AAEF,EAAA,MAAM,SAAA,GAAY,IAAI,GAAA,CAAI,CAAC,SAAS,IAAA,CAAK,GAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AACvD,EAAAN,UAAU,MAAM;AAEd,IAAA,MAAM,OAAA,GAAU,GAAA,CAAI,MAAA,CAAO,CAAC,IAAA,KAASM,WAAU,IAAA,CAAK,GAAG,CAAA,EAAG,MAAA,KAAW,OAAO,CAAA;AAC5E,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AAC1B,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,UAAA,CAAW,CAAC,IAAA,KAAS;AACnB,MAAA,MAAM,IAAA,GAAO,EAAE,GAAG,IAAA,EAAK;AACvB,MAAA,KAAA,MAAW,QAAQ,OAAA,EAAS;AAC1B,QAAA,IAAI,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA,EAAG,MAAA,KAAW,OAAA,EAAS,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA,GAAI,EAAE,MAAA,EAAQ,SAAA,EAAU;AAAA,MAC/E;AACA,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AACD,IAAA,KAAA,MAAW,QAAQ,OAAA,EAAS;AAC1B,MAAA,KAAK,mBAAA,CAAoB,IAAI,CAAA,CAAE,IAAA,CAAK,CAAC,KAAA,KAAU;AAC7C,QAAA,IAAI,CAAC,SAAA,EAAW,UAAA,CAAW,CAAC,IAAA,MAAU,EAAE,GAAG,IAAA,EAAM,CAAC,IAAA,CAAK,GAAG,GAAG,OAAM,CAAE,CAAA;AAAA,MACvE,CAAC,CAAA;AAAA,IACH;AACA,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AAAA,IACd,CAAA;AAAA,EAGF,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAEd,EAAA,MAAM,KAAA,GAAQ,OAAA;AAAA,IACZ,OAAO,EAAE,OAAA,EAAS,EAAE,GAAG,MAAA,EAAQ,OAAA,EAAS,GAAG,OAAA,EAAQ,EAAG,MAAA,EAAQ,WAAA,EAAY,CAAA;AAAA,IAC1E,CAAC,MAAA,EAAQ,OAAA,EAAS,WAAW;AAAA,GAC/B;AACA,EAAA,uBAAOJ,GAAAA,CAAC,eAAA,CAAgB,QAAA,EAAhB,EAAyB,OAAe,QAAA,EAAS,CAAA;AAC3D;AAsBO,SAAS,SAAA,CACd,QACA,MAAA,EACoB;AACpB,EAAA,MAAM,KAAA,GAAQH,WAAW,eAAe,CAAA;AACxC,EAAA,MAAM,MAAM,MAAA,KAAW,IAAA,GAAO,IAAA,GAAO,WAAA,CAAY,QAAQ,MAAM,CAAA;AAC/D,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIK,SAAS,CAAC,CAAA;AACpC,EAAA,MAAM,MAAA,GAAS,UAAU,CAAA,IAAK,GAAA,KAAQ,QAAQ,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,GAAI,MAAA;AAC3E,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAuD,IAAI,CAAA;AAMrF,EAAA,MAAM,aAAa,uBAAA,EAAwB;AAC3C,EAAA,MAAM,WAAA,GAAc,cAAc,GAAA,KAAQ,IAAA,IAAQ,WAAW,MAAA,GAAY,UAAA,CAAW,OAAA,CAAQ,GAAG,CAAA,GAAI,MAAA;AACnG,EAAA,IAAI,cAAc,GAAA,KAAQ,IAAA,IAAQ,MAAA,KAAW,MAAA,IAAa,gBAAgB,MAAA,EAAW;AACnF,IAAA,UAAA,CAAW,MAAM,CAAC,EAAE,KAAK,MAAA,EAAQ,MAAA,EAAiB,CAAC,CAAA;AAAA,EACrD;AAEA,EAAA,MAAM,YAAY,MAAA,KAAW,IAAA,GAAO,IAAA,GAAO,IAAA,CAAK,UAAU,MAAM,CAAA;AAChE,EAAAJ,UAAU,MAAM;AACd,IAAA,IAAI,GAAA,KAAQ,IAAA,IAAQ,MAAA,KAAW,MAAA,EAAW;AAC1C,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,QAAA,CAAS,EAAE,GAAA,EAAK,KAAA,EAAO,EAAE,MAAA,EAAQ,SAAA,IAAa,CAAA;AAC9C,IAAA,KAAK,mBAAA,CAAoB,EAAE,MAAA,EAAQ,MAAA,EAAiB,CAAA,CAAE,IAAA,CAAK,CAACO,MAAAA,KAAU;AACpE,MAAA,IAAI,CAAC,SAAA,EAAW,QAAA,CAAS,EAAE,GAAA,EAAK,KAAA,EAAAA,QAAO,CAAA;AAAA,IACzC,CAAC,CAAA;AACD,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AAAA,IACd,CAAA;AAAA,EAGF,GAAG,CAAC,MAAA,EAAQ,WAAW,KAAA,EAAO,MAAA,KAAW,MAAS,CAAC,CAAA;AAEnD,EAAA,MAAM,KAAA,GACJ,MAAA,IACA,WAAA,KACC,KAAA,IAAS,MAAM,GAAA,KAAQ,GAAA,GAAM,KAAA,CAAM,KAAA,GAAQ,GAAA,KAAQ,IAAA,GAAO,EAAE,MAAA,EAAQ,WAAmB,GAAI,IAAA,CAAA;AAE9F,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,OAAO,MAAA,IAAU,MAAA;AAAA,IACzB,IAAA,EAAM,KAAA,EAAO,MAAA,KAAW,OAAA,GAAW,MAAM,IAAA,GAAa,IAAA;AAAA,IACtD,OAAO,KAAA,EAAO,MAAA,KAAW,OAAA,GAAU,KAAA,CAAM,SAAS,eAAA,GAAkB,IAAA;AAAA,IACpE,QAAQ,MAAM,QAAA,CAAS,CAAC,CAAA,KAAM,IAAI,CAAC;AAAA,GACrC;AACF;AAgBO,SAAS,YAAA,CACd,IAAA,EACA,IAAA,EACA,QAAA,EACyC;AACzC,EAAA,MAAM,KAAA,GAAQR,WAAW,eAAe,CAAA;AACxC,EAAA,IAAI,SAAS,QAAA,CAAS,MAAA;AACtB,EAAA,IAAI,SAAS,QAAA,CAAS,MAAA;AACtB,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,MAAM,IAAA,GAAO,YAAA,CAAa,IAAI,CAAA,CAAE,IAAI,CAAA;AACpC,IAAA,IAAI,QAAQ,OAAO,IAAA,CAAK,MAAA,KAAW,QAAA,IAAY,KAAK,MAAA,EAAQ;AAC1D,MAAA,MAAM,IAAA,GAAO,YAAA,CAAa,IAAA,CAAK,IAAI,CAAA;AACnC,MAAA,MAAA,GAAS,IAAA,CAAK,MAAA;AACd,MAAA,MAAA,GAAS,kBAAkB,IAAA,EAAM;AAAA,QAC/B,MAAA,EAAQ,KAAA,EAAO,MAAA,IAAU,EAAC;AAAA,QAC1B,KAAA,EAAO,EAAE,GAAG,wBAAA,CAAyB,MAAM,QAAQ,CAAA,EAAG,GAAG,IAAA,CAAK,KAAA;AAAM,OACrE,CAAA;AAAA,IACH;AAAA,EACF;AACA,EAAA,MAAM,MAAA,GAAS,SAAA,CAAa,MAAA,EAAQ,MAAM,CAAA;AAC1C,EAAA,OAAO,EAAE,GAAG,MAAA,EAAQ,MAAA,EAAO;AAC7B;AAUO,SAAS,cAAA,CAAe,EAAE,MAAA,EAAQ,OAAA,EAAQ,EAAgD;AAC/F,EAAA,IAAI,uBAAA,EAAwB,KAAM,QAAA,EAAU,OAAO,IAAA;AACnD,EAAA,uBACES,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,kBAAA,EAAkB,UAAU,MAAM,CAAA,CAAA;AAAA,MAClC,KAAA,EAAO;AAAA,QACL,MAAA,EAAQ,oBAAA;AAAA,QACR,KAAA,EAAO,SAAA;AAAA,QACP,OAAA,EAAS,UAAA;AAAA,QACT,IAAA,EAAM,8BAAA;AAAA,QACN,YAAA,EAAc;AAAA,OAChB;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,CAAA,oCAAA,EAAuC,MAAM,CAAA,EAAA,CAAA;AAAA,QAC7C,OAAA,mBAAUN,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,OAAA,EAAS,GAAA,EAAK,SAAA,EAAW,CAAA,EAAE,EAAI,QAAA,EAAA,OAAA,EAAQ,CAAA,GAAS;AAAA;AAAA;AAAA,GAC3E;AAEJ;AC7VO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,KAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,EAKG;AAGD,EAAA,MAAM,EAAE,QAAQ,IAAA,EAAM,KAAA,EAAO,QAAO,GAAI,YAAA,CAAyB,MAAM,YAAA,EAAc;AAAA,IACnF,MAAA,EAAQ,iBAAA;AAAA,IACR,QAAQ;AAAC,GACV,CAAA;AACD,EAAA,MAAM,UAAA,GAAa,QAAQ,EAAC;AAC5B,EAAA,MAAM,SAAS,mBAAA,EAAoB;AACnC,EAAA,MAAM,aAAA,GAAgB,eAAA,CAAgB,CAACL,EAAAA,KAAMA,GAAE,aAAa,CAAA;AAE5D,EAAA,IAAI,MAAA,KAAW,SAAS,uBAAOK,IAAC,cAAA,EAAA,EAAe,MAAA,EAAgB,SAAS,KAAA,EAAO,CAAA;AAC/E,EAAA,IAAI,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAEpC,EAAA,MAAM,EAAA,GAAK,CAAC,UAAA,KAAuB;AACjC,IAAA,eAAA,CAAgB,QAAA,GAAW,KAAA,EAAM;AACjC,IAAA,aAAA,CAAc,UAAU,CAAA;AACxB,IAAA,UAAA,CAAW,OAAO,WAAW,CAAA;AAAA,EAC/B,CAAA;AAEA,EAAA,IAAI,UAAU,SAAA,EAAW;AACvB,IAAA,uBACEM,IAAAA,CAAC,SAAA,EAAA,EAAQ,eAAa,GAAA,CAAI,gBAAA,EAAkB,WAAU,sCAAA,EACnD,QAAA,EAAA;AAAA,MAAA,KAAA,oBACCN,IAAC,MAAA,EAAA,EACC,QAAA,kBAAAA,IAAC,IAAA,EAAA,EAAG,SAAA,EAAU,gDAAA,EAAkD,QAAA,EAAA,KAAA,EAAM,CAAA,EACxE,CAAA;AAAA,sBAEFA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iDAAA,EACZ,QAAA,EAAA,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,qBAClBA,GAAAA,CAAC,MAAA,EAAA,EAAkB,KAAA,EAAO,CAAA,GAAI,EAAA,EAC5B,QAAA,kBAAAM,IAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,OAAA,EAAS,MAAM,EAAA,CAAG,CAAA,CAAE,EAAE,CAAA,EAAG,SAAA,EAAU,6CAAA,EACvD,QAAA,EAAA;AAAA,wBAAAN,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uLAAA,EACd,QAAA,kBAAAA,GAAAA;AAAA,UAAC,WAAA;AAAA,UAAA;AAAA,YACC,GAAA,EAAK,CAAA,CAAE,QAAA,IAAY,iBAAA,CAAkB,CAAA,CAAE,IAAA,EAAM,EAAA,GAAK,CAAA,GAAI,EAAA,EAAI,EAAA,GAAK,CAAA,GAAI,EAAA,EAAI,KAAK,GAAG,CAAA;AAAA,YAC/E,KAAK,CAAA,CAAE,IAAA;AAAA,YACP,SAAA,EAAU;AAAA;AAAA,SACZ,EACF,CAAA;AAAA,wBACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+CAAA,EAAiD,YAAE,IAAA,EAAK;AAAA,OAAA,EAC1E,CAAA,EAAA,EAVW,CAAA,CAAE,EAWf,CACD,CAAA,EACH;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACEM,IAAAA,CAAC,SAAA,EAAA,EAAQ,eAAa,GAAA,CAAI,gBAAA,EAAkB,WAAU,sCAAA,EACnD,QAAA,EAAA;AAAA,IAAA,KAAA,oBACCN,IAAC,MAAA,EAAA,EACC,QAAA,kBAAAA,IAAC,IAAA,EAAA,EAAG,SAAA,EAAU,gDAAA,EAAkD,QAAA,EAAA,KAAA,EAAM,CAAA,EACxE,CAAA;AAAA,oBAEFA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yCACZ,QAAA,EAAA,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,qBAClBA,GAAAA,CAAC,MAAA,EAAA,EAAkB,OAAO,CAAA,GAAI,EAAA,EAC5B,QAAA,kBAAAM,IAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,OAAA,EAAS,MAAM,EAAA,CAAG,CAAA,CAAE,EAAE,CAAA,EAAG,WAAU,0DAAA,EAA2D,KAAA,EAAO,EAAE,YAAA,EAAc,yBAAwB,EACjK,QAAA,EAAA;AAAA,sBAAAN,GAAAA;AAAA,QAAC,WAAA;AAAA,QAAA;AAAA,UACC,GAAA,EAAK,CAAA,CAAE,QAAA,IAAY,iBAAA,CAAkB,CAAA,CAAE,IAAA,EAAM,EAAA,GAAK,CAAA,GAAI,EAAA,EAAI,EAAA,GAAK,CAAA,GAAI,EAAA,EAAI,KAAK,GAAG,CAAA;AAAA,UAC/E,KAAK,CAAA,CAAE,IAAA;AAAA,UACP,SAAA,EAAU;AAAA;AAAA,OACZ;AAAA,sBACAM,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4GAAA,EACd,QAAA,EAAA;AAAA,wBAAAN,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mDAAA,EAAqD,YAAE,IAAA,EAAK,CAAA;AAAA,wBAC5EA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wGAAuG,QAAA,EAAA,iBAAA,EAEvH;AAAA,OAAA,EACF;AAAA,KAAA,EACF,CAAA,EAAA,EAbW,CAAA,CAAE,EAcf,CACD,CAAA,EACH;AAAA,GAAA,EACF,CAAA;AAEJ;AAEO,IAAM,mBAAA,GAAsB;AAAA,EACjC,KAAA,EAAO,YAAA;AAAA,EACP,WAAA,EAAa,wEAAA;AAAA;AAAA;AAAA,EAGb,QAAA,EAAU;AAAA,IACR;AAAA,MACE,EAAA,EAAI,OAAA;AAAA,MACJ,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,QAAA;AAAA,MACP,IAAA,EAAM,yFAAA;AAAA,MACN,OAAA,EAAS;AAAA,QACP,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,SAAA,EAAU;AAAA,QACrC,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,OAAA;AAAQ,OACnC;AAAA,MACA,OAAA,EAAS;AAAA,KACX;AAAA,IACA;AAAA,MACE,EAAA,EAAI,OAAA;AAAA,MACJ,IAAA,EAAM,MAAA;AAAA,MACN,KAAA,EAAO,SAAA;AAAA,MACP,IAAA,EAAM;AAAA;AACR,GACF;AAAA,EACA,OAAA,EAAS;AAAA,IACP,EAAE,MAAM,gBAAA,EAAkB,KAAA,EAAO,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,mBAAA,EAAoB,EAAE;AAAA,IAChF,EAAE,MAAM,kBAAA,EAAoB,KAAA,EAAO,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,sBAAA,EAAuB;AAAE,GACzF;AAAA;AAAA;AAAA,EAGA,SAAA,EAAW,CAAC,MAAA,EAAQ,SAAA,EAAW,SAAS,CAAA;AAAA;AAAA,EAExC,MAAM,EAAE,UAAA,EAAY,EAAE,MAAA,EAAQ,mBAAkB;AAClD,CAAA;AC/HO,SAAS,UAAA,GAAa;AAC3B,EAAA,MAAM,SAAS,mBAAA,EAAoB;AAEnC,EAAA,MAAM,oBAAA,GAAuB,OAAO,KAAA,KAAqC;AACvE,IAAA,MAAM,WAAWN,eAAAA,EAAgB;AACjC,IAAA,IAAI,CAAC,SAAS,oBAAA,EAAsB;AAClC,MAAA,MAAM,IAAI,MAAM,8DAA8D,CAAA;AAAA,IAChF;AACA,IAAA,OAAO,QAAA,CAAS,qBAAqB,KAAK,CAAA;AAAA,EAC5C,CAAA;AAEA,EAAA,OAAO,EAAE,OAAA,EAAS,MAAA,CAAO,OAAA,EAAS,oBAAA,EAAqB;AACzD;;;ACVO,SAAS,oBAAA,GAAuB;AACrC,EAAA,MAAM,OAAA,GAAU,YAAA,CAAa,CAAC,KAAA,KAAU,MAAM,OAAO,CAAA;AACrD,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAC,KAAA,KAAU,MAAM,UAAU,CAAA;AAC3D,EAAA,MAAM,WAAA,GAAc,YAAA,CAAa,CAAC,KAAA,KAAU,MAAM,WAAW,CAAA;AAC7D,EAAA,MAAM,EAAE,oBAAA,EAAqB,GAAI,UAAA,EAAW;AAE5C,EAAA,OAAO;AAAA,IACL,UAAA;AAAA,IACA,SAAA,EAAW,CAAC,OAAA,EAAkB,QAAA,EAAmB,YAC/C,OAAA,CAAQ,OAAA,EAAS,UAAU,OAAO,CAAA;AAAA,IACpC,QAAA,EAAU,UAAA;AAAA,IACV,SAAA,EAAW,WAAA;AAAA,IACX;AAAA,GACF;AACF;ACRO,SAAS,MAAM,EAAE,KAAA,EAAO,WAAW,MAAA,EAAQ,aAAA,EAAe,WAAU,EAAe;AACxF,EAAA,MAAM,EAAE,QAAA,EAAU,MAAA,EAAO,GAAI,mBAAA,EAAoB;AACjD,EAAA,uBACEY,IAAAA,CAAC,MAAA,EAAA,EAAK,WAAW,CAAA,iCAAA,EAAoC,SAAA,IAAa,EAAE,CAAA,CAAA,EAClE,QAAA,EAAA;AAAA,oBAAAN,GAAAA,CAAC,MAAA,EAAA,EAAK,aAAA,EAAa,MAAA,EAAQ,cAAY,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,EAAG,WAAU,eAAA,EAChE,QAAA,EAAA,WAAA,CAAY,KAAA,EAAO,QAAA,EAAU,MAAM,CAAA,EACtC,CAAA;AAAA,IACC,SAAA,IAAa,IAAA,IAAQ,SAAA,GAAY,KAAA,oBAChCA,GAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,aAAA,EAAa,aAAA;AAAA,QACb,YAAA,EAAY,SAAA,CAAU,OAAA,CAAQ,CAAC,CAAA;AAAA,QAC/B,SAAA,EAAU,4CAAA;AAAA,QAET,QAAA,EAAA,WAAA,CAAY,SAAA,EAAW,QAAA,EAAU,MAAM;AAAA;AAAA;AAC1C,GAAA,EAEJ,CAAA;AAEJ;ACPA,IAAM,uBAAA,GAA0B,EAAA;AAOzB,SAAS,mBAAA,CACd,KAAA,EACA,MAAA,EACA,QAAA,EACsB;AACtB,EAAA,MAAM,KAAA,GAAQ,OAAO,QAAA,EAAU,KAAA;AAC/B,EAAA,MAAM,WAAW,OAAO,QAAA,EAAU,QAAA,KAAa,QAAA,GAAW,SAAS,QAAA,GAAW,IAAA;AAC9E,EAAA,MAAM,GAAA,GAAM,OAAO,kBAAA,IAAsB,IAAA;AACzC,EAAA,MAAM,WACJ,QAAA,IAAY,IAAA,IAAQ,QAAA,GAAW,KAAA,GAC3B,WACA,GAAA,IAAO,GAAA,GAAM,CAAA,GACX,MAAA,CAAA,CAAQ,SAAS,CAAA,GAAI,GAAA,GAAM,MAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,GAC3C,IAAA;AAER,EAAA,MAAM,GAAA,GAAM,OAAO,mBAAA,IAAuB,uBAAA;AAC1C,EAAA,MAAM,GAAA,GAAM,OAAO,eAAA,IAAmB,CAAA;AACtC,EAAA,MAAM,YAAA,GAAe,GAAA,GAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,GAAG,CAAC,CAAA,GAAI,CAAA;AAExE,EAAA,OAAO;AAAA,IACL,QAAA;AAAA,IACA,kBAAA,EAAoB,GAAA;AAAA,IACpB,YAAA,EAAc,YAAA,IAAgB,CAAA,GAAI,YAAA,GAAe,CAAA;AAAA,IACjD,gBAAA,EAAkB,YAAA,IAAgB,CAAA,GAAI,KAAA,GAAQ,YAAA,GAAe;AAAA,GAC/D;AACF;AAUO,SAAS,YAAA,CAAa,EAAE,KAAA,EAAO,QAAA,EAAU,UAAU,MAAA,EAAQ,SAAA,GAAY,IAAG,EAAsB;AACrG,EAAA,MAAM,SAAS,mBAAA,EAAoB;AACnC,EAAA,MAAM,KAAA,GAAQ,mBAAA,CAAoB,KAAA,EAAO,MAAA,EAAQ,QAAQ,CAAA;AACzD,EAAA,IAAI,MAAM,QAAA,IAAY,IAAA,IAAQ,KAAA,CAAM,YAAA,KAAiB,GAAG,OAAO,IAAA;AAE/D,EAAA,MAAM,WAAW,MAAA,CAAO,QAAA;AACxB,EAAA,MAAM,SAAS,MAAA,CAAO,MAAA;AACtB,EAAA,MAAMO,WAAU,OAAA,KAAY,MAAA;AAE5B,EAAA,uBACED,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,aAAA,EAAY,eAAA;AAAA,MACZ,WAAW,CAAA,EAAGC,QAAAA,GAAU,gCAAA,GAAmC,wBAAwB,wCAAwC,SAAS,CAAA,CAAA;AAAA,MAEnI,QAAA,EAAA;AAAA,QAAA,KAAA,CAAM,YAAY,IAAA,oBACjBD,IAAAA,CAAC,GAAA,EAAA,EAAE,eAAY,mBAAA,EACb,QAAA,EAAA;AAAA,0BAAAN,GAAAA,CAAC,YAAO,SAAA,EAAU,+BAAA,EAAiC,sBAAY,KAAA,CAAM,QAAA,EAAU,QAAA,EAAU,MAAM,CAAA,EAAE,CAAA;AAAA,UAAU,GAAA;AAAA,UAAI,QAAA;AAAA,UAE9G,KAAA,CAAM,kBAAA,GAAqB,CAAA,EAAA,EAAK,KAAA,CAAM,kBAAkB,CAAA,cAAA,CAAA,GAAmB;AAAA,SAAA,EAC9E,CAAA;AAAA,QAED,MAAM,YAAA,GAAe,CAAA,oBACpBM,IAAAA,CAAC,GAAA,EAAA,EAAE,eAAY,4BAAA,EAA6B,QAAA,EAAA;AAAA,UAAA,KAAA;AAAA,UACtC,KAAA,CAAM,YAAA;AAAA,UAAa,OAAA;AAAA,UAAM,WAAA,CAAY,KAAA,CAAM,gBAAA,EAAkB,QAAA,EAAU,MAAM,CAAA;AAAA,UAAE;AAAA,SAAA,EACrF;AAAA;AAAA;AAAA,GAEJ;AAEJ;;;ACtFO,IAAM,4BAAA,GAA+B;AAAA,EAC1C,IAAA,EAAM,EAAE,aAAA,EAAe,GAAA,CAAI,WAAA,EAAY;AAAA,EACvC,IAAA,EAAM,EAAE,aAAA,EAAe,GAAA,CAAI,eAAA,EAAgB;AAAA,EAC3C,aAAa,GAAA,CAAI,gBAAA;AAAA,EACjB,SAAA,EAAW,EAAE,aAAA,EAAe,GAAA,CAAI,cAAA;AAClC;AAEO,IAAM,4BAAA,GAA+B;AAAA,EAC1C,WAAA,EAAa,4BAAA;AAAA,EACb,aAAA,EAAe;AAAA,IACb,IAAA,EAAM,EAAE,aAAA,EAAe,GAAA,CAAI,OAAA,EAAQ;AAAA,IACnC,OAAA,EAAS,EAAE,aAAA,EAAe,GAAA,CAAI,UAAA,EAAW;AAAA,IACzC,IAAA,EAAM,EAAE,aAAA,EAAe,GAAA,CAAI,OAAA,EAAQ;AAAA,IACnC,WAAA,EAAa,EAAE,aAAA,EAAe,GAAA,CAAI,cAAA,EAAe;AAAA,IACjD,OAAA,EAAS,EAAE,aAAA,EAAe,GAAA,CAAI,UAAA,EAAW;AAAA,IACzC,SAAA,EAAW,EAAE,aAAA,EAAe,GAAA,CAAI,YAAA,EAAa;AAAA,IAC7C,aAAA,EAAe,EAAE,aAAA,EAAe,GAAA,CAAI,gBAAA,EAAiB;AAAA,IACrD,WAAA,EAAa,EAAE,aAAA,EAAe,GAAA,CAAI,WAAA;AAAY;AAElD;AC2FO,SAAS,cAAA,CACd,MACA,OAAA,EAC6B;AAC7B,EAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,OAAA,EAAS,OAAO,MAAA;AAC9B,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,EAAA,MAAM,OAAO,OAAA,CAAQ,IAAA,KAAS,OAAO,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,KAAA,CAAA,GAAU,MAAA,CAAA;AAC3D,EAAA,MAAM,IAAA,GAAO,IAAA,EAAM,IAAA,GAAO,EAAE,GAAG,IAAA,CAAK,IAAA,EAAM,GAAG,OAAA,CAAQ,IAAA,EAAK,GAAK,OAAA,CAAQ,IAAA;AACvE,EAAA,OAAO;AAAA,IACL,GAAG,IAAA;AAAA,IACH,GAAG,OAAA;AAAA,IACH,IAAA;AAAA,IACA,QAAQ,EAAE,GAAG,MAAM,MAAA,EAAQ,GAAG,QAAQ,MAAA,EAAO;AAAA,IAC7C,IAAA;AAAA,IACA,QAAQ,EAAE,GAAG,MAAM,MAAA,EAAQ,GAAG,QAAQ,MAAA,EAAO;AAAA,IAC7C,QAAQ,EAAE,GAAG,MAAM,MAAA,EAAQ,GAAG,QAAQ,MAAA,EAAO;AAAA,IAC7C,aAAa,EAAE,GAAG,MAAM,WAAA,EAAa,GAAG,QAAQ,WAAA;AAAY,GAC9D;AACF;AAGO,SAAS,kBAAkB,IAAA,EAAsB;AACtD,EAAA,OAAO,eAAe,IAAI,CAAA,EAAA,CAAA;AAC5B;AAGO,SAAS,gBAAgB,IAAA,EAAwB;AACtD,EAAA,OAAO,KACJ,KAAA,CAAM,GAAG,EACT,MAAA,CAAO,CAAC,YAAY,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAC,EAC3C,GAAA,CAAI,CAAC,YAAY,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAC,CAAA;AACtC;AAYO,SAAS,eAAA,CAAgB,MAAc,IAAA,EAA2C;AACvF,EAAA,OAAO,IAAA,CAAK,IAAA,IAAQ,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AAC9B;AAYO,SAAS,gBAAA,CACd,OACA,IAAA,EACyB;AACzB,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,IAAI,CAAA,IAAK,MAAA,CAAO,QAAQ,KAAA,EAAO,OAAA,IAAW,EAAE,CAAA,EAAG;AAC/D,IAAA,MAAM,SAAS,SAAA,CAAU,eAAA,CAAgB,IAAA,EAAM,IAAI,GAAG,IAAI,CAAA;AAC1D,IAAA,IAAI,MAAA,EAAQ,OAAO,EAAE,IAAA,EAAM,MAAM,MAAA,EAAO;AAAA,EAC1C;AACA,EAAA,OAAO,IAAA;AACT;AAGO,IAAM,kBAAA,GAAqB;AAC3B,IAAM,kBAAA,GAAqB;AAGlC,IAAM,kBAAA,GAAkE;AAAA,EACtE,OAAA,EAAS,kBAAA;AAAA,EACT,OAAA,EAAS;AACX,CAAA;AAUO,IAAM,qBAAA,uBAAiD,GAAA,CAAI;AAAA,EAChE,MAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAC;AAED,IAAM,eAAA,GAAkB,qBAAA;AAUjB,SAAS,iBAAiB,KAAA,EAAyB;AACxD,EAAA,OAAO,YAAY,KAA4B,CAAA;AACjD;AAEA,SAAS,YAAY,KAAA,EAAqC;AACxD,EAAA,MAAM,MAAA,GAAS,KAAA;AAIf,EAAA,IAAI,OAAA,IAAW,QAAQ,OAAO,IAAA;AAC9B,EAAA,OAAO,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,CAAE,KAAA,CAAM,CAAC,GAAA,KAAQ,eAAA,CAAgB,GAAA,CAAI,GAAG,CAAC,CAAA;AACpE;AAaO,SAAS,eAAA,CAAgB,OAAgB,KAAA,EAAuB;AACrE,EAAA,MAAM,MAAA,GAAS,KAAA;AACf,EAAA,IAAI,MAAA,IAAU,OAAO,MAAA,CAAO,EAAA,KAAO,YAAY,MAAA,CAAO,EAAA,SAAW,MAAA,CAAO,EAAA;AACxE,EAAA,OAAO,GAAG,MAAA,CAAO,MAAA,EAAQ,IAAI,CAAC,IAAI,KAAK,CAAA,CAAA;AACzC;AAQA,SAAS,WAAA,CAAY,OAA4B,KAAA,EAA0B;AACzE,EAAA,MAAM,MAAA,GAAS,KAAA;AACf,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA;AAC/B,EAAA,MAAM,EAAA,GAAK,eAAA,CAAgB,KAAA,EAAO,KAAK,CAAA;AAEvC,EAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AAEpB,EAAA,IAAI,WAAA,CAAY,KAAK,CAAA,EAAG;AACtB,IAAA,MAAM,QAAA,GAAY,MAAA,CAAO,QAAA,IAA0D,EAAC;AACpF,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MACA,EAAA;AAAA,MACA,KAAA,EAAQ,MAAA,CAAO,KAAA,IAAiD,EAAC;AAAA,MACjE,GAAI,QAAA,CAAS,MAAA,GAAS,EAAE,QAAA,EAAU,SAAS,GAAA,CAAI,CAAC,KAAA,EAAO,CAAA,KAAM,YAAY,KAAA,EAAO,CAAC,CAAC,CAAA,KAAM,EAAC;AAAA,MACzF,GAAI,IAAA,GAAO,EAAE,IAAA,KAAS;AAAC,KACzB;AAAA,EACF;AAGA,EAAA,MAAM,QAAiC,EAAC;AACxC,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AACjD,IAAA,IAAI,CAAC,eAAA,CAAgB,GAAA,CAAI,GAAG,CAAA,EAAG,KAAA,CAAM,GAAG,CAAA,GAAI,KAAA;AAAA,EAC9C;AACA,EAAA,OAAO,EAAE,IAAA,EAAM,EAAA,EAAI,KAAA,EAAO,GAAI,OAAO,EAAE,IAAA,EAAK,GAAI,EAAC,EAAG;AACtD;AAGO,SAAS,aAAa,MAAA,EAAqD;AAChF,EAAA,OAAO,MAAA,CAAO,IAAI,WAAW,CAAA;AAC/B;AAOO,SAAS,kBAAkB,IAAA,EAAuC;AACvE,EAAA,MAAM,IAAA,GAAO,mBAAmB,IAAI,CAAA;AACpC,EAAA,OAAO,IAAA,GAAO,CAAC,EAAE,IAAA,EAAM,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,KAAA,EAAO,EAAC,EAAG,CAAA,GAAI,EAAC;AACzD;AAgBO,SAAS,eAAA,CAAgB,MAA0B,KAAA,EAAoD;AAC5G,EAAA,MAAM,QAA+B,EAAC;AACtC,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAChC,EAAA,MAAM,YAAA,GAAe,mBAAmB,IAAI,CAAA;AAC5C,EAAA,IAAI,OAAA,GAAU,KAAA;AAEd,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,IAAA,CAAK,IAAA,KAAS,YAAA,EAAc,OAAA,GAAU,IAAA;AAE1C,IAAA,IAAI,KAAK,EAAA,EAAI;AACX,MAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,EAAG;AACxB,QAAA,KAAA,CAAM,IAAA,CAAK;AAAA,UACT,KAAA,EAAO,SAAA;AAAA,UACP,IAAA,EAAM,oBAAA;AAAA,UACN,MAAA,EAAQ,CAAA,kBAAA,EAAqB,IAAI,CAAA,oBAAA,EAAuB,KAAK,EAAE,CAAA,6DAAA;AAAA,SAChE,CAAA;AAAA,MACH;AACA,MAAA,OAAA,CAAQ,GAAA,CAAI,KAAK,EAAE,CAAA;AAAA,IACrB;AAEA,IAAA,MAAM,IAAA,GAAOE,YAAAA,CAAa,IAAA,CAAK,IAAI,CAAA;AACnC,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,KAAA,CAAM,IAAA,CAAK;AAAA,QACT,KAAA,EAAO,OAAA;AAAA,QACP,IAAA,EAAM,eAAA;AAAA,QACN,MAAA,EAAQ,CAAA,IAAA,EAAO,IAAI,CAAA,wBAAA,EAA2B,KAAK,IAAI,CAAA,0EAAA;AAAA,OACxD,CAAA;AACD,MAAA;AAAA,IACF;AACA,IAAA,IAAI,CAAC,gBAAA,CAAiB,EAAE,SAAA,EAAW,IAAA,CAAK,aAAa,EAAC,EAAE,EAAG,IAAI,CAAA,EAAG;AAChE,MAAA,KAAA,CAAM,IAAA,CAAK;AAAA,QACT,KAAA,EAAO,SAAA;AAAA,QACP,IAAA,EAAM,2BAAA;AAAA,QACN,MAAA,EAAQ,CAAA,OAAA,EAAU,IAAA,CAAK,IAAI,CAAA,sBAAA,EAAA,CAA0B,IAAA,CAAK,SAAA,IAAa,EAAC,EAAG,IAAA,CAAK,IAAI,CAAC,0BAA0B,IAAI,CAAA,KAAA;AAAA,OACpH,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,IAAI,YAAA,IAAgB,CAAC,OAAA,EAAS;AAK5B,IAAA,KAAA,CAAM,IAAA,CAAK;AAAA,MACT,KAAA,EAAO,SAAA;AAAA,MACP,IAAA,EAAM,mBAAA;AAAA,MACN,MAAA,EAAQ,OAAO,IAAI,CAAA,kBAAA,EAAqB,YAAY,CAAA,0BAAA,EAA6B,IAAA,KAAS,SAAA,GAAY,gBAAA,GAAmB,cAAc,CAAA,wDAAA;AAAA,KACxI,CAAA;AAAA,EACH;AAMA,EAAA,KAAA,MAAW,SAAA,IAAa,qBAAA,CAAsB,KAAK,CAAA,EAAG;AACpD,IAAA,KAAA,CAAM,IAAA,CAAK;AAAA,MACT,KAAA,EAAO,OAAA;AAAA,MACP,MAAM,SAAA,CAAU,IAAA;AAAA,MAChB,MAAA,EAAQ,GAAG,IAAI,CAAA,MAAA,EAAS,UAAU,IAAI,CAAA,EAAA,EAAK,UAAU,MAAM,CAAA;AAAA,KAC5D,CAAA;AAAA,EACH;AAKA,EAAA,KAAA,MAAW,OAAA,IAAW,iBAAA,CAAkB,KAAK,CAAA,EAAG;AAC9C,IAAA,KAAA,CAAM,IAAA,CAAK;AAAA,MACT,KAAA,EAAO,SAAA;AAAA,MACP,IAAA,EAAM,sBAAA;AAAA,MACN,MAAA,EAAQ,CAAA,OAAA,EAAU,OAAA,CAAQ,IAAI,QAAQ,IAAI,CAAA,MAAA,EAAS,OAAA,CAAQ,IAAI,CAAA,eAAA,EAAkB,OAAA,CAAQ,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC,CAAA,2BAAA;AAAA,KAC5G,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,KAAA;AACT;;;ACnXO,IAAM,mBAAA,GAAsB;AAiBnC,SAAS,iBAAiB,KAAA,EAAwB;AAChD,EAAA,OAAO,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,CACxB,QAAQ,IAAA,EAAM,SAAS,CAAA,CACvB,OAAA,CAAQ,SAAA,EAAW,SAAS,CAAA,CAC5B,OAAA,CAAQ,WAAW,SAAS,CAAA;AACjC;AAUO,SAAS,kBAAkB,OAAA,EAAmC;AACnE,EAAA,MAAM,QAAuC,EAAC;AAC9C,EAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC1D,IAAA,IAAI,KAAA,CAAM,MAAA,KAAW,OAAA,EAAS,KAAA,CAAM,GAAG,CAAA,GAAI,KAAA;AAAA,EAC7C;AACA,EAAA,MAAM,IAAA,GAAO,iBAAiB,EAAE,OAAA,EAAS,OAAO,IAAA,EAAM,OAAA,CAAQ,MAAM,CAAA;AACpE,EAAA,OAAO,CAAA,YAAA,EAAe,mBAAmB,CAAA,0BAAA,EAA6B,IAAI,CAAA,SAAA,CAAA;AAC5E;AAEA,IAAI,KAAA,GAAQ,KAAA;AACZ,IAAI,MAAA,GAAkC,IAAA;AAS/B,SAAS,oBAAA,GAAgD;AAC9D,EAAA,IAAI,OAAO,OAAO,MAAA;AAClB,EAAA,KAAA,GAAQ,IAAA;AACR,EAAA,IAAI,OAAO,QAAA,KAAa,WAAA,EAAa,OAAQ,MAAA,GAAS,IAAA;AACtD,EAAA,MAAM,EAAA,GAAK,QAAA,CAAS,cAAA,CAAe,mBAAmB,CAAA;AACtD,EAAA,IAAI,CAAC,EAAA,EAAI,WAAA,EAAa,OAAQ,MAAA,GAAS,IAAA;AACvC,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,WAAW,CAAA;AAAA,EACpC,CAAA,CAAA,MAAQ;AAGN,IAAA,MAAA,GAAS,IAAA;AAAA,EACX;AACA,EAAA,OAAO,MAAA;AACT;AASO,SAAS,mBAAmB,IAAA,EAAyD;AAC1F,EAAA,MAAM,UAAU,oBAAA,EAAqB;AACrC,EAAA,IAAI,CAAC,SAAS,OAAO,MAAA;AACrB,EAAA,MAAM,OAAO,CAAC,CAAA,EAAW,CAAA,KAAA,CAAe,CAAA,CAAE,MAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,UAAU,CAAA,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,GAAA,CAAA;AACxF,EAAA,OAAO,KAAK,OAAA,CAAQ,IAAA,EAAM,IAAI,CAAA,GAAI,QAAQ,OAAA,GAAU,MAAA;AACtD;ACpEA,IAAM,WAAA,GAAcZ,cAAiD,IAAI,CAAA;AAElE,IAAM,yBAAyB,WAAA,CAAY,QAAA;AAI3C,SAAS,iBAAA,GAAgD;AAC9D,EAAA,MAAM,GAAA,GAAMC,WAAW,WAAW,CAAA;AAClC,EAAA,IAAI,CAAC,GAAA,EAAK,MAAM,IAAI,MAAM,yDAAyD,CAAA;AACnF,EAAA,OAAO,GAAA;AACT;AAGO,SAAS,yBAAA,GAA+D;AAC7E,EAAA,OAAOA,WAAW,WAAW,CAAA;AAC/B;AASA,IAAM,QAAA,uBAAe,GAAA,EAAY;AAEjC,SAAS,iBAAA,CACP,IAAA,EACA,KAAA,EACA,OAAA,EACM;AACN,EAAA,MAAM,YAAY,CAAA,EAAG,IAAI,IAAI,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,EAAG,EAAE,IAAI,CAAA,CAAA,EAAI,EAAE,EAAA,IAAM,EAAE,EAAE,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA;AAClF,EAAA,IAAI,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA,EAAG;AAC7B,EAAA,QAAA,CAAS,IAAI,SAAS,CAAA;AAEtB,EAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAI5B,IAAA,OAAA,CAAQ,IAAA;AAAA,MACN,CAAA,wDAAA,EAA2D,MAAA,CAAO,QAAQ,CAAA,KAAA,EAAQ,MAAA,CAAO,IAAI,CAAA,CAAA,EAAI,MAAA,CAAO,KAAK,CAAA,SAAA,EAAY,IAAI,CAAA,sCAAA;AAAA,KAC/H;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,OAAA,IAAW,eAAA,CAAgB,IAAA,EAAM,KAAK,CAAA,EAAG;AAClD,IAAA,MAAM,UAAU,CAAA,aAAA,EAAgB,OAAA,CAAQ,IAAI,CAAA,EAAA,EAAK,QAAQ,MAAM,CAAA,CAAA;AAC/D,IAAA,IAAI,OAAA,CAAQ,KAAA,KAAU,OAAA,EAAS,OAAA,CAAQ,MAAM,OAAO,CAAA;AAAA,SAC/C,OAAA,CAAQ,KAAK,OAAO,CAAA;AAAA,EAC3B;AACF;AAGO,SAAS,oBAAA,GAA6B;AAC3C,EAAA,QAAA,CAAS,KAAA,EAAM;AACjB;AAgBO,SAAS,eAAe,EAAE,IAAA,EAAM,MAAM,MAAA,GAAS,IAAG,EAAwB;AAG/E,EAAA,MAAM,YAAY,YAAA,EAAa;AAC/B,EAAA,MAAM,EAAE,KAAA,EAAO,OAAA,EAAQ,GAAIY,QAAQ,MAAM;AACvC,IAAA,MAAM,QAAA,GAAW,MAAM,MAAA,GAAS,YAAA,CAAa,KAAK,MAAM,CAAA,GAAI,kBAAkB,IAAI,CAAA;AAIlF,IAAA,MAAM,QAAA,GAAW,gBAAgB,QAAQ,CAAA;AACzC,IAAA,OAAO,EAAE,KAAA,EAAO,QAAA,CAAS,KAAA,EAAsB,OAAA,EAAS,SAAS,OAAA,EAAQ;AAAA,EAC3E,CAAA,EAAG,CAAC,IAAA,EAAM,IAAI,CAAC,CAAA;AAEf,EAAA,iBAAA,CAAkB,IAAA,EAAM,OAAO,OAAO,CAAA;AAEtC,EAAA,MAAM,GAAA,GAAMA,OAAAA,CAAoC,OAAO,EAAE,IAAA,EAAM,QAAO,CAAA,EAAI,CAAC,IAAA,EAAM,MAAM,CAAC,CAAA;AAExF,EAAA,uBACET,GAAAA,CAAC,sBAAA,EAAA,EAAuB,KAAA,EAAO,GAAA,EAO7B,QAAA,kBAAAA,GAAAA,CAAC,aAAA,EAAA,EAAc,KAAA,EAAc,MAAA,EAAgB,OAAA,EAAS,kBAAA,CAAmB,SAAS,CAAA,EAMhF,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,YAAA,CAAa,KAAA,EAAO,IAAA,KAAS,SAAA,GAAY,MAAA,GAAY,CAAA,mBAAA,EAAsB,IAAI,CAAA,OAAA,CAAS,CAAA,EAAE,CAAA,EACnG,CAAA,EACF,CAAA;AAEJ;AC8DA,IAAM,sBAAA,GAAyB,CAAC,SAAA,EAAW,SAAA,EAAW,YAAY,aAAa,CAAA;AAC/E,IAAM,oBAAA,GAAuB,CAAC,SAAA,EAAW,SAAA,EAAW,UAAU,YAAY,CAAA;AAC1E,IAAM,eAAA,GAAkB,CAAC,UAAA,EAAY,SAAS,CAAA;AAC9C,IAAM,YAAA,GAAe,CAAC,OAAA,EAAS,UAAU,CAAA;AACzC,IAAM,gBAAA,GAAmB,CAAC,UAAA,EAAY,OAAO,CAAA;AAgBtC,IAAM,gBAAA,GAA8C;AAAA,EACzD,CAAA,CAAE,eAAA,EAAiB,aAAA,EAAe,6CAAA,EAA+C,sBAAsB,CAAA;AAAA,EACvG,CAAA,CAAE,eAAA,EAAiB,YAAA,EAAc,yCAAA,EAA2C,sBAAsB,CAAA;AAAA,EAClG,CAAA,CAAE,eAAA,EAAiB,YAAA,EAAc,oCAAA,EAAsC,sBAAsB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAK7F,CAAA;AAAA,IACE,eAAA;AAAA,IACA,kBAAA;AAAA,IACA,oDAAA;AAAA,IACA,sBAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,CAAA,CAAE,eAAA,EAAiB,iBAAA,EAAmB,wCAAA,EAA0C,sBAAsB,CAAA;AAAA,EACtG,CAAA,CAAE,eAAA,EAAiB,gBAAA,EAAkB,2BAAA,EAA6B,sBAAsB,CAAA;AAAA,EACxF,CAAA,CAAE,eAAA,EAAiB,cAAA,EAAgB,uCAAA,EAAyC,sBAAsB,CAAA;AAAA,EAClG,CAAA,CAAE,eAAA,EAAiB,aAAA,EAAe,+BAAA,EAAiC,sBAAsB,CAAA;AAAA,EACzF,CAAA;AAAA,IACE,eAAA;AAAA,IACA,aAAA;AAAA,IACA,gDAAA;AAAA,IACA,sBAAA;AAAA,IACA;AAAA,GACF;AAAA;AAAA;AAAA,EAGA,CAAA;AAAA,IACE,aAAA;AAAA,IACA,WAAA;AAAA,IACA,4CAAA;AAAA,IACA,oBAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,CAAA;AAAA,IACE,aAAA;AAAA,IACA,cAAA;AAAA,IACA,qEAAA;AAAA,IACA,oBAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,CAAA;AAAA,IACE,aAAA;AAAA,IACA,YAAA;AAAA,IACA,qBAAA;AAAA,IACA,oBAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,CAAA,CAAE,aAAA,EAAe,KAAA,EAAO,kCAAA,EAAoC,oBAAoB,CAAA;AAAA,EAChF,CAAA;AAAA,IACE,SAAA;AAAA,IACA,eAAA;AAAA,IACA,2BAAA;AAAA,IACA,eAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,CAAA;AAAA,IACE,SAAA;AAAA,IACA,YAAA;AAAA,IACA,kCAAA;AAAA,IACA,eAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,CAAA,CAAE,SAAA,EAAW,cAAA,EAAgB,6CAAA,EAA+C,eAAe,CAAA;AAAA,EAC3F,CAAA;AAAA,IACE,SAAA;AAAA,IACA,WAAA;AAAA,IACA,wBAAA;AAAA,IACA,eAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,CAAA,CAAE,MAAA,EAAQ,aAAA,EAAe,2BAAA,EAA6B,YAAY,CAAA;AAAA,EAClE,CAAA,CAAE,MAAA,EAAQ,eAAA,EAAiB,kCAAA,EAAoC,YAAY,CAAA;AAAA,EAC3E,CAAA;AAAA,IACE,MAAA;AAAA,IACA,cAAA;AAAA,IACA,8CAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,CAAA,CAAE,UAAA,EAAY,YAAA,EAAc,yBAAA,EAA2B,gBAAgB,CAAA;AAAA,EACvE,CAAA,CAAE,UAAA,EAAY,qBAAA,EAAuB,mCAAA,EAAqC,gBAAgB,CAAA;AAAA,EAC1F,CAAA,CAAE,UAAA,EAAY,WAAA,EAAa,+CAAA,EAAiD,gBAAgB,CAAA;AAAA,EAC5F,CAAA,CAAE,QAAA,EAAU,eAAA,EAAiB,oCAAA,EAAsC,EAAE,CAAA;AAAA,EACrE,CAAA,CAAE,QAAA,EAAU,cAAA,EAAgB,wBAAA,EAA0B,EAAE,CAAA;AAAA,EACxD,CAAA,CAAE,QAAA,EAAU,UAAA,EAAY,2CAAA,EAA6C,EAAE,CAAA;AAAA,EACvE,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,0BAAA,EAA4B,EAAE,CAAA;AAAA,EACpD,CAAA,CAAE,QAAA,EAAU,OAAA,EAAS,iDAAA,EAAmD,EAAE;AAC5E;AAGA,SAAS,CAAA,CACP,IAAA,EACA,IAAA,EACA,QAAA,EACA,UACA,QAAA,EACgB;AAChB,EAAA,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,EAAA,EAAI,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,EAAI,QAAA,EAAU,QAAA,EAAU,SAAA,EAAW,UAAU,QAAA,EAAS;AAChG;AAGA,SAAS,CAAA,CACP,IAAA,EACA,IAAA,EACA,QAAA,EACA,QAAA,EACgB;AAChB,EAAA,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,EAAA,EAAI,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,EAAI,QAAA,EAAU,QAAA,EAAU,SAAA,EAAW,cAAA,EAAe;AAC5F;AASO,SAAS,UACd,aAAA,EAC2B;AAC3B,EAAA,MAAM,OAAA,GACJ,OAAO,aAAA,KAAkB,QAAA,GAAW,EAAE,IAAA,EAAM,aAAA,EAAc,GAAI,aAAA,IAAiB,EAAC;AAClF,EAAA,OAAO,gBAAA,CAAiB,MAAA;AAAA,IACtB,CAAC,IAAA,KAAA,CACE,CAAC,OAAA,CAAQ,IAAA,IAAQ,IAAA,CAAK,IAAA,KAAS,OAAA,CAAQ,IAAA,MACvC,CAAC,OAAA,CAAQ,UAAA,IAAc,KAAK,SAAA,KAAc,QAAA;AAAA,GAC/C;AACF;AAGO,SAAS,UAAU,KAAA,EAA+D;AACvF,EAAA,IAAI,CAAC,KAAA,EAAO,OAAO,EAAC;AACpB,EAAA,OAAO,gBAAA,CAAiB,MAAA,CAAO,CAAC,IAAA,KAAS;AACvC,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAC5B,IAAA,OAAO,OAAA,CAAQ,IAAA,GAAO,IAAA,CAAK,IAAI,GAAG,MAAM,CAAA;AAAA,EAC1C,CAAC,CAAA;AACH;AAIA,IAAM,WAAA,GAAcJ,cAA8C,IAAI,CAAA;AAU/D,SAAS,cAAA,GAAmF;AACjG,EAAA,OAAOC,WAAW,WAAW,CAAA;AAC/B;AAqBO,SAAS,IAAA,CAAmC,EAAE,IAAA,EAAM,IAAA,EAAM,SAAQ,EAAiB;AACxF,EAAA,MAAM,SAAS,2BAAA,EAA4B;AAC3C,EAAA,MAAM,OAAO,yBAAA,EAA0B;AACvC,EAAA,MAAM,MAAA,GAAU,MAAA,EAAQ,KAAA,GAAQ,IAAI,IAA+C,IAAI,CAAA;AAGvF,EAAA,MAAM,KAAA,GAAQY,OAAAA;AAAA,IACZ,MAAO,QAAQ,MAAA,GAASC,eAAAA,CAAgB,aAAa,MAAM,CAAC,EAAE,KAAA,GAAQ,IAAA;AAAA,IACtE,CAAC,MAAM;AAAA,GACT;AACA,EAAA,MAAM,KAAA,GAAQD,QAAQ,MAAO,OAAA,IAAW,EAAC,EAA+B,CAAC,OAAO,CAAC,CAAA;AACjF,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AAInB,EAAA,uBACET,IAAC,WAAA,CAAY,QAAA,EAAZ,EAAqB,KAAA,EACpB,QAAA,kBAAAA,GAAAA,CAAC,aAAA,EAAA,EAAc,KAAA,EAAc,MAAA,EAAQ,MAAM,MAAA,EACxC,QAAA,EAAAW,aAAa,KAAA,EAAO,CAAA,mBAAA,EAAsB,IAAI,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,CAAA,EAC3D,CAAA,EACF,CAAA;AAEJ;ACzYO,IAAM,0BAAA,GAA6B;AACnC,IAAM,oBAAA,GAAuB;AAC7B,IAAM,wBAAA,GAA2B;AACjC,IAAM,oBAAA,GAAuB;AAC7B,IAAM,wBAAA,GAA2B;AAsExC,IAAIC,WAAAA,GAAa,KAAA;AAKV,SAAS,8BAAA,GAAuC;AACrD,EAAA,oBAAA,EAAqB;AACrB,EAAAA,WAAAA,GAAa,KAAA;AACf;AAIO,SAAS,iCAAA,GAA0C;AACxD,EAAA,IAAIA,WAAAA,EAAY;AAChB,EAAAA,WAAAA,GAAa,IAAA;AAEb,EAAA,oBAAA,CAAqB;AAAA,IACnB,EAAA,EAAI,0BAAA;AAAA,IACJ,WAAA,EACE,uKAAA;AAAA,IACF,MAAA,EAAQ,KAAA;AAAA,IACR,KAAA,EAAO,MAAA;AAAA,IACP,KAAA,EAAO;AAAA,MACL,IAAA,EAAM,QAAA;AAAA,MACN,UAAA,EAAY;AAAA,QACV,SAAA,EAAW,EAAE,IAAA,EAAM,QAAA,EAAU,WAAW,CAAA,EAAE;AAAA,QAC1C,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,QACvB,QAAA,EAAU,EAAE,IAAA,EAAM,SAAA,EAAW,SAAS,CAAA,EAAE;AAAA,QACxC,SAAA,EAAW,EAAE,IAAA,EAAM,QAAA,EAAU,SAAS,CAAA,EAAE;AAAA,QACxC,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,QACvB,YAAA,EAAc,EAAE,IAAA,EAAM,QAAA;AAAS,OACjC;AAAA,MACA,QAAA,EAAU,CAAC,WAAA,EAAa,MAAA,EAAQ,YAAY,WAAW,CAAA;AAAA,MACvD,oBAAA,EAAsB;AAAA,KACxB;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,QAAA;AAAA,MACN,UAAA,EAAY;AAAA,QACV,GAAA,EAAK,EAAE,IAAA,EAAM,QAAA,EAAU,WAAW,CAAA,EAAE;AAAA,QACpC,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAU,WAAW,CAAA,EAAE;AAAA,QACtC,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA;AAAS,OAC1B;AAAA,MACA,QAAA,EAAU,CAAC,KAAA,EAAO,OAAO,CAAA;AAAA,MACzB,oBAAA,EAAsB;AAAA;AACxB,GACD,CAAA;AAED,EAAA,oBAAA,CAAqB;AAAA,IACnB,EAAA,EAAI,oBAAA;AAAA,IACJ,WAAA,EACE,+LAAA;AAAA,IACF,MAAA,EAAQ,KAAA;AAAA,IACR,KAAA,EAAO,MAAA;AAAA,IACP,KAAA,EAAO;AAAA,MACL,IAAA,EAAM,QAAA;AAAA,MACN,UAAA,EAAY;AAAA,QACV,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,OAAA;AAAA,UACN,KAAA,EAAO;AAAA,YACL,IAAA,EAAM,QAAA;AAAA,YACN,UAAA,EAAY;AAAA,cACV,SAAA,EAAW,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,cAC5B,QAAA,EAAU,EAAE,IAAA,EAAM,SAAA,EAAW,SAAS,CAAA,EAAE;AAAA,cACxC,SAAA,EAAW,EAAE,IAAA,EAAM,QAAA,EAAU,SAAS,CAAA;AAAE,aAC1C;AAAA,YACA,QAAA,EAAU,CAAC,WAAA,EAAa,UAAA,EAAY,WAAW;AAAA;AACjD,SACF;AAAA,QACA,QAAA,EAAU,EAAE,IAAA,EAAM,QAAA,EAAU,SAAS,CAAA,EAAE;AAAA,QACvC,aAAA,EAAe,EAAE,IAAA,EAAM,QAAA;AAAS,OAClC;AAAA,MACA,QAAA,EAAU,CAAC,OAAA,EAAS,UAAU,CAAA;AAAA,MAC9B,oBAAA,EAAsB;AAAA,KACxB;AAAA,IACA,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA;AAAS,GAC1B,CAAA;AAED,EAAA,oBAAA,CAAqB;AAAA,IACnB,EAAA,EAAI,wBAAA;AAAA,IACJ,WAAA,EACE,qLAAA;AAAA,IACF,MAAA,EAAQ,KAAA;AAAA,IACR,KAAA,EAAO,MAAA;AAAA,IACP,KAAA,EAAO;AAAA,MACL,IAAA,EAAM,QAAA;AAAA,MACN,UAAA,EAAY;AAAA,QACV,EAAA,EAAI,EAAE,IAAA,EAAM,QAAA,EAAU,WAAW,CAAA,EAAE;AAAA,QACnC,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,QACvB,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,QACvB,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,QACxB,cAAA,EAAgB,EAAE,IAAA,EAAM,SAAA,EAAU;AAAA,QAClC,gBAAgB,EAAE,IAAA,EAAM,CAAC,QAAA,EAAU,MAAM,CAAA;AAAE,OAC7C;AAAA,MACA,QAAA,EAAU,CAAC,IAAA,EAAM,MAAA,EAAQ,OAAO,CAAA;AAAA,MAChC,oBAAA,EAAsB;AAAA,KACxB;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,QAAA;AAAA,MACN,UAAA,EAAY;AAAA,QACV,MAAM,EAAE,IAAA,EAAM,UAAU,SAAA,EAAW,CAAA,EAAG,WAAW,EAAA,EAAG;AAAA,QACpD,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAU,MAAM,CAAC,SAAA,EAAW,QAAA,EAAU,SAAS,CAAA;AAAE,OACjE;AAAA,MACA,QAAA,EAAU,CAAC,MAAM,CAAA;AAAA,MACjB,oBAAA,EAAsB;AAAA;AACxB,GACD,CAAA;AAED,EAAA,oBAAA,CAAqB;AAAA,IACnB,EAAA,EAAI,oBAAA;AAAA,IACJ,WAAA,EACE,sKAAA;AAAA,IACF,MAAA,EAAQ,KAAA;AAAA,IACR,KAAA,EAAO,MAAA;AAAA,IACP,KAAA,EAAO;AAAA,MACL,IAAA,EAAM,QAAA;AAAA,MACN,YAAY,EAAE,aAAA,EAAe,EAAE,IAAA,EAAM,UAAS,EAAE;AAAA,MAChD,oBAAA,EAAsB;AAAA,KACxB;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,QAAA;AAAA,MACN,UAAA,EAAY;AAAA,QACV,EAAA,EAAI,EAAE,IAAA,EAAM,QAAA,EAAU,WAAW,CAAA,EAAE;AAAA,QACnC,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAU,WAAW,CAAA,EAAE;AAAA,QACtC,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAU,MAAM,CAAC,MAAA,EAAQ,UAAU,CAAA,EAAE;AAAA,QACnD,QAAA,EAAU,EAAE,IAAA,EAAM,SAAA,EAAU;AAAA,QAC5B,WAAA,EAAa,EAAE,IAAA,EAAM,QAAA;AAAS,OAChC;AAAA,MACA,QAAA,EAAU,CAAC,IAAA,EAAM,OAAA,EAAS,MAAM,CAAA;AAAA,MAChC,oBAAA,EAAsB;AAAA;AACxB,GACD,CAAA;AAMD,EAAA,oBAAA,CAAqB;AAAA,IACnB,EAAA,EAAI,wBAAA;AAAA,IACJ,WAAA,EACE,qMAAA;AAAA,IACF,MAAA,EAAQ,KAAA;AAAA,IACR,KAAA,EAAO,MAAA;AAAA,IACP,IAAA,EAAM,QAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL,IAAA,EAAM,QAAA;AAAA,MACN,UAAA,EAAY;AAAA,QACV,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,OAAA;AAAA,UACN,QAAA,EAAU,CAAA;AAAA,UACV,KAAA,EAAO;AAAA,YACL,IAAA,EAAM,QAAA;AAAA,YACN,UAAA,EAAY;AAAA,cACV,SAAA,EAAW,EAAE,IAAA,EAAM,QAAA,EAAU,WAAW,CAAA,EAAE;AAAA,cAC1C,SAAA,EAAW,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,cAC5B,QAAA,EAAU,EAAE,IAAA,EAAM,SAAA,EAAW,SAAS,CAAA,EAAE;AAAA,cACxC,YAAA,EAAc,EAAE,IAAA,EAAM,QAAA;AAAS,aACjC;AAAA,YACA,QAAA,EAAU,CAAC,WAAA,EAAa,UAAU;AAAA;AACpC,SACF;AAAA,QACA,QAAA,EAAU;AAAA,UACR,IAAA,EAAM,QAAA;AAAA,UACN,UAAA,EAAY,EAAE,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAS,EAAG,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAU,SAAA,EAAW,GAAE,EAAE;AAAA,UAChF,QAAA,EAAU,CAAC,MAAA,EAAQ,OAAO;AAAA,SAC5B;AAAA,QACA,QAAA,EAAU,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,QAC3B,YAAA,EAAc,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,QAC/B,aAAA,EAAe,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,QAChC,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,QACxB,UAAA,EAAY,EAAE,IAAA,EAAM,QAAA;AAAS,OAC/B;AAAA,MACA,QAAA,EAAU,CAAC,OAAA,EAAS,UAAU,CAAA;AAAA,MAC9B,oBAAA,EAAsB;AAAA,KACxB;AAAA;AAAA;AAAA;AAAA,IAIA,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,QAAA;AAAA,MACN,UAAA,EAAY;AAAA,QACV,EAAA,EAAI,EAAE,IAAA,EAAM,QAAA,EAAU,WAAW,CAAA,EAAE;AAAA,QACnC,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA;AAAS,OAC1B;AAAA,MACA,QAAA,EAAU,CAAC,IAAI;AAAA;AACjB,GACD,CAAA;AACH;AAKA,eAAsB,uBAAuB,IAAA,EAA+C;AAC1F,EAAA,iCAAA,EAAkC;AAClC,EAAA,MAAM,KAAA,GAAiC;AAAA,IACrC,WAAW,IAAA,CAAK,SAAA;AAAA,IAChB,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,UAAU,IAAA,CAAK,QAAA;AAAA,IACf,WAAW,IAAA,CAAK,SAAA;AAAA,IAChB,GAAI,KAAK,IAAA,GAAO,EAAE,MAAM,IAAA,CAAK,IAAA,KAAS,EAAC;AAAA,IACvC,GAAI,KAAK,YAAA,GAAe,EAAE,cAAc,IAAA,CAAK,YAAA,KAAiB;AAAC,GACjE;AACA,EAAA,MAAM,gBAAgB,MAAM,iBAAA;AAAA,IAC1B,0BAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,OAAO,aAAA,CAAc,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,KAAK,CAAA;AACzC;AAGA,eAAsB,qBAAqB,OAAA,EAA+C;AACxF,EAAA,iCAAA,EAAkC;AAClC,EAAA,MAAM,KAAA,GAA+B;AAAA,IACnC,IAAI,OAAA,CAAQ,EAAA;AAAA,IACZ,MAAM,OAAA,CAAQ,IAAA;AAAA,IACd,MAAM,OAAA,CAAQ,IAAA;AAAA,IACd,OAAO,OAAA,CAAQ,KAAA;AAAA,IACf,gBAAgB,OAAA,CAAQ,cAAA;AAAA,IACxB,gBAAgB,OAAA,CAAQ;AAAA,GAC1B;AACA,EAAA,MAAM,gBAAgB,MAAM,iBAAA;AAAA,IAC1B,wBAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,OAAO,aAAA,CAAc,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,KAAK,CAAA;AACzC;AAGA,eAAsB,6BAAA,CAA8B,KAAA,GAA4B,EAAC,EAE/E;AACA,EAAA,iCAAA,EAAkC;AAClC,EAAA,MAAM,gBAAgB,MAAM,iBAAA;AAAA,IAC1B,oBAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,OAAO,aAAA,CAAc,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,GAAG,CAAA,CAAE,KAAA,EAAO,SAAA,EAAW,CAAA,CAAE,SAAA,EAAU,CAAE,CAAA;AAC1E;AAOA,eAAsB,qBAAqB,KAAA,EAAyE;AAClH,EAAA,iCAAA,EAAkC;AAClC,EAAA,MAAM,gBAAgB,MAAM,iBAAA;AAAA,IAC1B,oBAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,IAAI,aAAA,CAAc,MAAA,KAAW,CAAA,EAAG,OAAO,MAAA;AACvC,EAAA,OAAO,MAAA,CAAO,WAAA,CAAY,aAAA,CAAc,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,SAAA,EAAW,CAAA,CAAE,KAAK,CAAC,CAAC,CAAA;AAC5E;AAGA,eAAsB,yBACpB,GAAA,EACwB;AACxB,EAAA,iCAAA,EAAkC;AAClC,EAAA,OAAO,cAAA,CAAgD,0BAA0B,GAAG,CAAA;AACtF;AC9UA,IAAM,kBAAA,GAAwF;AAAA,EAC5F,OAAA,EAAS,2BAAA;AAAA,EACT,MAAA,EAAQ,oCAAA;AAAA,EACR,OAAA,EAAS;AACX,CAAA;AAIA,SAAS,mBAAmB,OAAA,EAA0D;AACpF,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,IAAIb,MAAAA,CAAM,QAAA,CAA6B,EAAE,CAAA;AACjE,EAAAA,MAAAA,CAAM,UAAU,MAAM;AACpB,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,oBAAA,CAAqB,OAAO,CAAA,CAAE,IAAA,CAAK,CAAC,IAAA,KAAS;AAG3C,MAAA,IAAI,CAAC,SAAA,IAAa,IAAA,CAAK,MAAA,GAAS,CAAA,YAAa,IAAI,CAAA;AAAA,IACnD,CAAC,CAAA;AACD,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AAAA,IACd,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,CAAQ,EAAA,EAAI,QAAQ,KAAA,EAAO,OAAA,CAAQ,cAAc,CAAC,CAAA;AACtD,EAAA,OAAO,MAAA;AACT;AAUO,SAAS,oBAAA,CACd,MAAA,EACA,KAAA,GAA+B,SAAA,EACL;AAC1B,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,MAAA;AAChC,EAAA,IAAI,UAAU,UAAA,EAAY;AACxB,IAAA,OAAO,CAAC,GAAG,MAAM,CAAA,CAAE,IAAA;AAAA,MACjB,CAAC,CAAA,EAAG,CAAA,KAAA,CAAO,CAAA,CAAE,SAAA,IAAa,MAAM,CAAA,CAAE,SAAA,IAAa,CAAA,CAAA,IAAM,MAAA,CAAO,EAAE,EAAE,CAAA,CAAE,cAAc,MAAA,CAAO,CAAA,CAAE,EAAE,CAAC;AAAA,MAC5F,CAAC,CAAA;AAAA,EACL;AACA,EAAA,OAAO,MAAA,CAAO,KAAK,CAAC,CAAA,KAAM,EAAE,SAAS,CAAA,IAAK,OAAO,CAAC,CAAA;AACpD;AAEO,SAAS,WAAA,CAAY,EAAE,OAAA,EAAS,MAAA,EAAQ,gBAAgB,OAAA,EAAS,eAAA,EAAiB,UAAA,GAAa,SAAA,EAAU,EAAqB;AACnI,EAAA,MAAM,gBAAgB,mBAAA,EAAoB;AAC1C,EAAA,MAAM,iBAAiB,oBAAA,EAAqB;AAC5C,EAAA,MAAM,SAAS,cAAA,IAAkB,aAAA;AACjC,EAAA,MAAM,UAAU,eAAA,IAAmB,cAAA;AACnC,EAAA,MAAM,UAAA,GAAa,sBAAA,CAAuB,OAAO,CAAA,CAAE,MAAA,GAAS,CAAA;AAC5D,EAAA,MAAM,OAAA,GAAU,QAAQ,cAAA,IAAkB,CAAA;AAC1C,EAAA,MAAM,SAAS,OAAA,CAAQ,cAAA,IAAkB,IAAA,IAAQ,OAAA,CAAQ,iBAAiB,OAAA,CAAQ,KAAA;AAClF,EAAA,MAAM,KAAA,GAAQ,oBAAA,CAAqB,OAAA,CAAQ,MAAA,EAAQ,UAAU,CAAA;AAC7D,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,KAAA,EAAO,WAAA,EAAa,KAAA,IAAS,MAAA;AACtD,EAAA,MAAM,eAAA,GAAkB,mBAAmB,OAAO,CAAA;AAClD,EAAA,MAAM,SAAS,MAAA,CAAO,KAAA,EAAO,WAAA,EAAa,WAAA,KAAgB,aAAa,cAAA,GAAiB,eAAA;AACxF,EAAA,MAAM,YAAA,GAAe,OAAO,YAAA,KAAiB,UAAA;AAI7C,EAAA,MAAM,eAAA,GAAkB,EAAE,OAAA,EAAS,OAAA,EAAS,QAAQ,UAAA,EAAW;AAE/D,EAAA,uBACEO,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACE,GAAG,4BAAA,CAA6B,IAAA;AAAA,MACjC,aAAW,OAAA,CAAQ,IAAA;AAAA,MACnB,SAAA,EAAW,CAAA,gEAAA,EACT,SAAA,KAAc,WAAA,GACV,yBACA,qDACN,CAAA,CAAA;AAAA,MACA,KAAA,EAAO,EAAE,YAAA,EAAc,uBAAA,EAAwB;AAAA,MAE/C,QAAA,EAAA;AAAA,wBAAAN,IAAC,IAAA,EAAA,EAAK,IAAA,EAAK,eAAc,IAAA,EAAK,KAAA,EAAM,SAAS,eAAA,EAAiB,CAAA;AAAA,wBAE9DM,IAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,YAAY,MAAM,CAAA,yBAAA,CAAA;AAAA,YAC7B,OAAO,EAAE,YAAA,EAAc,SAAA,KAAc,WAAA,GAAc,0BAA0B,MAAA,EAAU;AAAA,YAEvF,QAAA,EAAA;AAAA,8BAAAA,IAAAA,CAAC,QAAK,EAAA,EAAI,CAAA,SAAA,EAAY,QAAQ,IAAI,CAAA,CAAA,EAAI,WAAU,qBAAA,EAIhD,QAAA,EAAA;AAAA,gCAAAN,GAAAA;AAAA,kBAAC,WAAA;AAAA,kBAAA;AAAA,oBACC,GAAA,EAAK,KAAA,EAAO,GAAA,IAAO,kBAAA,CAAmB,QAAQ,IAAI,CAAA;AAAA,oBAClD,GAAA,EAAK,KAAA,EAAO,OAAA,IAAW,OAAA,CAAQ,IAAA;AAAA,oBAC/B,SAAA,EAAU,oFAAA;AAAA,oBACV,OAAA,EAAQ;AAAA;AAAA,iBACV;AAAA,gCACEM,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCAAA,EACZ,QAAA,EAAA;AAAA,kBAAA,MAAA,IAAU,CAAC,2BACVN,GAAAA;AAAA,oBAAC,MAAA;AAAA,oBAAA;AAAA,sBACC,eAAa,GAAA,CAAI,SAAA;AAAA,sBACjB,SAAA,EAAU,wEAAA;AAAA,sBACX,QAAA,EAAA;AAAA;AAAA,mBAED;AAAA,kBAED,2BACCA,GAAAA;AAAA,oBAAC,MAAA;AAAA,oBAAA;AAAA,sBACC,eAAa,GAAA,CAAI,YAAA;AAAA,sBACjB,SAAA,EAAU,4EAAA;AAAA,sBACX,QAAA,EAAA;AAAA;AAAA,mBAED;AAAA,kBAED,eAAA,CAAgB,GAAA,CAAI,CAAC,KAAA,qBACpBA,GAAAA;AAAA,oBAAC,MAAA;AAAA,oBAAA;AAAA,sBAEC,wBAAsB,KAAA,CAAM,IAAA;AAAA,sBAC5B,WAAW,CAAA,iDAAA,EAAoD,kBAAA,CAAmB,KAAA,CAAM,IAAA,IAAQ,SAAS,CAAC,CAAA,CAAA;AAAA,sBAEzG,QAAA,EAAA,KAAA,CAAM;AAAA,qBAAA;AAAA,oBAJF,KAAA,CAAM;AAAA,mBAMd;AAAA,iBAAA,EACH;AAAA,eAAA,EACF,CAAA;AAAA,8BAIAA,IAAC,IAAA,EAAA,EAAK,IAAA,EAAK,eAAc,IAAA,EAAK,cAAA,EAAe,SAAS,eAAA,EAAiB;AAAA;AAAA;AAAA,SACzE;AAAA,wBAEAM,KAAC,KAAA,EAAA,EAAI,SAAA,EAAW,8BAA8B,SAAA,KAAc,WAAA,GAAc,WAAA,GAAc,KAAK,CAAA,CAAA,EAC3F,QAAA,EAAA;AAAA,0BAAAN,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+BAAA,EAAiC,kBAAQ,YAAA,EAAa,CAAA;AAAA,0BACtEA,GAAAA;AAAA,YAAC,IAAA;AAAA,YAAA;AAAA,cACC,EAAA,EAAI,CAAA,SAAA,EAAY,OAAA,CAAQ,IAAI,CAAA,CAAA;AAAA,cAC3B,GAAG,4BAAA,CAA6B,IAAA;AAAA,cACjC,SAAA,EAAU,0CAAA;AAAA,cAET,QAAA,EAAA,OAAA,CAAQ;AAAA;AAAA,WACX;AAAA,0BAEAA,IAAC,IAAA,EAAA,EAAK,IAAA,EAAK,eAAc,IAAA,EAAK,WAAA,EAAY,SAAS,eAAA,EAAiB,CAAA;AAAA,0BAEpEM,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sDAAA,EACZ,QAAA,EAAA;AAAA,YAAA,YAAA;AAAA;AAAA;AAAA;AAAA,8BAICA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EACb,QAAA,EAAA;AAAA,gCAAAN,GAAAA;AAAA,kBAAC,KAAA;AAAA,kBAAA;AAAA,oBACC,OAAO,OAAA,CAAQ,KAAA;AAAA,oBACf,WAAW,OAAA,CAAQ,cAAA;AAAA,oBACnB,QAAQ,4BAAA,CAA6B;AAAA;AAAA,iBACvC;AAAA,gCACAA,GAAAA,CAAC,YAAA,EAAA,EAAa,KAAA,EAAO,OAAA,CAAQ,OAAO,QAAA,EAAU,OAAA,CAAQ,QAAA,EAAU,OAAA,EAAQ,MAAA,EAAO;AAAA,eAAA,EACjF;AAAA,gCAEAA,GAAAA,CAAC,MAAA,EAAA,EAAK,aAAA,EAAa,6BAA6B,WAAA,EAAa,SAAA,EAAU,+BAAA,EACpE,QAAA,EAAA,MAAA,CAAO,YAAA,KAAiB,SAAA,GAAY,MAAA,CAAO,OAAA,CAAQ,QAAQ,cAAA,EAC9D,CAAA;AAAA,4BAEFA,GAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACJ,GAAG,4BAAA,CAA6B,SAAA;AAAA,gBACjC,UAAU,YAAA,IAAgB,OAAA;AAAA,gBAC1B,cACE,YAAA,GACI,UAAA,GACE,CAAA,yBAAA,EAAsB,OAAA,CAAQ,IAAI,CAAA,CAAA,GAClC,CAAA,UAAA,EAAa,OAAA,CAAQ,IAAI,iBAC3B,CAAA,EAAG,MAAA,CAAO,QAAQ,KAAK,CAAA,CAAA,EAAI,QAAQ,IAAI,CAAA,CAAA;AAAA,gBAE7C,SAAS,MAAM;AACb,kBAAA,IAAI,CAAC,YAAA,EAAc;AACjB,oBAAA,UAAA,CAAW,CAAA,SAAA,EAAY,OAAA,CAAQ,IAAI,CAAA,CAAE,CAAA;AACrC,oBAAA;AAAA,kBACF;AAIA,kBAAA,IAAI,UAAA,EAAY;AACd,oBAAA,UAAA,CAAW,CAAA,SAAA,EAAY,OAAA,CAAQ,IAAI,CAAA,CAAE,CAAA;AACrC,oBAAA;AAAA,kBACF;AACA,kBAAA,OAAA,CAAQ,UAAU,OAAO,CAAA;AAAA,gBAC3B,CAAA;AAAA,gBACA,SAAA,EAAU,6WAAA;AAAA,gBAEV,QAAA,kBAAAA,GAAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA;AACnC,WAAA,EACF,CAAA;AAAA,0BAEAA,IAAC,IAAA,EAAA,EAAK,IAAA,EAAK,eAAc,IAAA,EAAK,YAAA,EAAa,SAAS,eAAA,EAAiB;AAAA,SAAA,EACvE;AAAA;AAAA;AAAA,GACF;AAEJ;;;ACrKA,SAAS,gBAAmB,KAAA,EAA2C;AACrE,EAAA,IAAI,OAAO,KAAA,KAAU,UAAA,EAAY,OAAO,IAAA;AACxC,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,QAAQ,UAAA,IAAc,KAAA;AACtE;AAiBO,SAAS,eAAA,CACd,UACA,QAAA,EACqB;AACrB,EAAA,IAAI,CAAC,QAAA,EAAU,OAAO,EAAE,SAAA,EAAW,UAAU,KAAA,EAAO,EAAC,EAAG,QAAA,EAAU,KAAA,EAAM;AACxE,EAAA,IAAI,eAAA,CAAmB,QAAQ,CAAA,EAAG,OAAO,EAAE,SAAA,EAAW,QAAA,EAAU,KAAA,EAAO,EAAC,EAAG,QAAA,EAAU,IAAA,EAAK;AAC1F,EAAA,MAAM,EAAE,SAAA,EAAW,KAAA,EAAM,GAAI,QAAA;AAC7B,EAAA,OAAO;AAAA,IACL,WAAW,SAAA,IAAa,QAAA;AAAA,IACxB,KAAA,EAAO,SAAS,EAAC;AAAA,IACjB,UAAU,SAAA,IAAa;AAAA,GACzB;AACF;AAQO,SAAS,kBAAqB,QAAA,EAA0E;AAC7G,EAAA,IAAI,CAAC,UAAU,OAAO,MAAA;AACtB,EAAA,IAAI,eAAA,CAAmB,QAAQ,CAAA,EAAG,OAAO,QAAA;AACzC,EAAA,OAAO,QAAA,CAAS,SAAA;AAClB;AAGO,SAAS,cAAiB,QAAA,EAAwD;AACvF,EAAA,IAAI,CAAC,QAAA,IAAY,eAAA,CAAmB,QAAQ,CAAA,SAAU,EAAC;AACvD,EAAA,OAAO,QAAA,CAAS,SAAS,EAAC;AAC5B;AC/EO,SAAS,WAAA,CAAY;AAAA,EAC1B,KAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA,GAAS,KAAA;AAAA,EACT,KAAA,GAAQ,CAAA;AAAA,EACR;AACF,CAAA,EAQG;AACD,EAAA,MAAM,SAAS,mBAAA,EAAoB;AACnC,EAAA,MAAM,UAAU,oBAAA,EAAqB;AACrC,EAAA,MAAM,UAAA,GAAa,wBAAwB,MAAM,CAAA;AACjD,EAAA,MAAM,EAAE,WAAW,oBAAA,EAAsB,KAAA,EAAO,mBAAkB,GAAI,eAAA,CAAgB,UAAA,CAAW,WAAA,EAAa,WAAW,CAAA;AAKzH,EAAA,MAAM,EAAE,QAAQ,IAAA,EAAM,KAAA,EAAO,QAAO,GAAI,YAAA,CAAwB,MAAM,UAAA,EAAY;AAAA,IAChF,MAAA,EAAQ,eAAA;AAAA,IACR,MAAA,EAAQ,EAAE,MAAA,EAAQ,KAAA;AAAM,GACzB,CAAA;AACD,EAAA,IAAI,MAAA,KAAW,SAAS,uBAAOA,IAAC,cAAA,EAAA,EAAe,MAAA,EAAgB,SAAS,KAAA,EAAO,CAAA;AAC/E,EAAA,MAAM,UAAU,MAAA,KAAW,OAAA;AAC3B,EAAA,MAAM,OAAA,GAAU,QAAQ,EAAC;AAEzB,EAAA,IAAI,CAAC,OAAA,IAAW,OAAA,CAAQ,MAAA,KAAW,GAAG,OAAO,IAAA;AAE7C,EAAA,uBACEM,IAAAA,CAAC,SAAA,EAAA,EAAQ,eAAa,GAAA,CAAI,WAAA,EAAa,WAAU,sCAAA,EAC/C,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,MAAA,EAAA,EAAO,SAAA,EAAU,mBAAA,EACf,QAAA,EAAA;AAAA,MAAA,OAAA,oBACCN,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sEAAsE,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,sBAE7FA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,gDAAgD,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,MACnE,4BAAYA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,8BAA8B,QAAA,EAAA,QAAA,EAAS;AAAA,KAAA,EACnE,CAAA;AAAA,IACC,OAAA,mBACCA,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,uCAAA,EACZ,QAAA,EAAA,KAAA,CAAM,KAAK,EAAE,MAAA,EAAQ,OAAM,EAAG,CAAC,GAAG,CAAA,qBACjCA,IAAC,KAAA,EAAA,EAAY,SAAA,EAAU,uCAAsC,KAAA,EAAO,EAAE,cAAc,uBAAA,EAAwB,EAAA,EAAlG,CAAqG,CAChH,CAAA,EACH,oBAEAA,GAAAA,CAAC,SAAI,SAAA,EAAU,uCAAA,EACZ,kBAAQ,GAAA,CAAI,CAAC,GAAG,CAAA,qBACfA,IAAC,MAAA,EAAA,EAAkB,KAAA,EAAO,CAAA,GAAI,EAAA,EAC5B,QAAA,kBAAAA,GAAAA;AAAA,MAAC,oBAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,CAAA;AAAA,QACT,MAAA;AAAA,QACA,cAAc,MAAA,CAAO,YAAA;AAAA,QACrB,OAAA;AAAA,QACC,GAAG;AAAA;AAAA,KACN,EAAA,EAPW,CAAA,CAAE,EAQf,CACD,CAAA,EACH,CAAA;AAAA,oBAEFA,GAAAA,CAAC,MAAA,EAAA,EAAO,WAAU,mBAAA,EAAoB,KAAA,EAAO,KAC3C,QAAA,kBAAAA,GAAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,IAAI,MAAA,CAAO,WAAA;AAAA,QACX,SAAA,EAAU,gLAAA;AAAA,QACV,KAAA,EAAO,EAAE,YAAA,EAAc,yBAAA,EAA0B;AAAA,QAClD,QAAA,EAAA;AAAA;AAAA,KAED,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AAEO,IAAM,iBAAA,GAAoB;AAAA,EAC/B,KAAA,EAAO,cAAA;AAAA,EACP,WAAA,EAAa,qFAAA;AAAA,EACb,QAAA,EAAU;AAAA,IACR,EAAE,IAAI,OAAA,EAAS,IAAA,EAAM,QAAQ,KAAA,EAAO,OAAA,EAAS,UAAU,IAAA,EAAK;AAAA,IAC5D,EAAE,IAAI,UAAA,EAAY,IAAA,EAAM,QAAQ,KAAA,EAAO,UAAA,EAAY,MAAM,qCAAA,EAAsC;AAAA,IAC/F;AAAA,MACE,EAAA,EAAI,SAAA;AAAA,MACJ,IAAA,EAAM,MAAA;AAAA,MACN,KAAA,EAAO,SAAA;AAAA,MACP,IAAA,EAAM;AAAA,KACR;AAAA,IACA;AAAA,MACE,EAAA,EAAI,QAAA;AAAA,MACJ,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,gBAAA;AAAA,MACP,IAAA,EAAM,sKAAA;AAAA,MACN,OAAA,EAAS;AAAA,QACP,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,cAAA,EAAe;AAAA,QACtC,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,cAAA,EAAe;AAAA,QACtC,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,SAAA;AAAU,OACpC;AAAA,MACA,OAAA,EAAS;AAAA,KACX;AAAA,IACA;AAAA,MACE,EAAA,EAAI,OAAA;AAAA,MACJ,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,UAAA;AAAA,MACP,IAAA,EAAM,mEAAA;AAAA,MACN,GAAA,EAAK,CAAA;AAAA,MACL,GAAA,EAAK,EAAA;AAAA,MACL,OAAA,EAAS;AAAA;AACX,GACF;AAAA,EACA,OAAA,EAAS;AAAA,IACP;AAAA,MACE,IAAA,EAAM,mBAAA;AAAA,MACN,KAAA,EAAO;AAAA,QACL,OAAA,EAAS,WAAA;AAAA,QACT,KAAA,EAAO,WAAA;AAAA,QACP,QAAA,EAAU,2CAAA;AAAA,QACV,MAAA,EAAQ,KAAA;AAAA,QACR,KAAA,EAAO;AAAA;AACT,KACF;AAAA,IACA;AAAA,MACE,IAAA,EAAM,cAAA;AAAA,MACN,KAAA,EAAO,EAAE,KAAA,EAAO,WAAA,EAAa,UAAU,gDAAA,EAAyC,MAAA,EAAQ,KAAA,EAAO,KAAA,EAAO,CAAA;AAAE;AAC1G,GACF;AAAA;AAAA;AAAA,EAGA,WAAW,CAAC,MAAA,EAAQ,SAAA,EAAW,YAAA,EAAc,WAAW,SAAS,CAAA;AAAA;AAAA;AAAA;AAAA,EAIjE,IAAA,EAAM;AAAA,IACJ,QAAA,EAAU;AAAA,MACR,MAAA,EAAQ,eAAA;AAAA,MACR,MAAA,EAAQ,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,QAAA,EAAS,EAAG,KAAA,EAAO,EAAE,KAAA,EAAO,OAAA,EAAQ;AAAE;AACnE;AAEJ,CAAA;ACnIA,IAAM,WAAA,GAAc;AAAA,EAClB,MAAA,EAAQ,wBAAA;AAAA,EACR,IAAA,EAAM,wBAAA;AAAA,EACN,MAAA,EAAQ;AACV,CAAA;AAEA,IAAM,UAAA,GAAa;AAAA,EACjB,KAAA,EAAO,uBAAA;AAAA,EACP,MAAA,EAAQ,0BAAA;AAAA,EACR,GAAA,EAAK;AACP,CAAA;AAEO,SAAS,aAAA,CAAc;AAAA;AAAA;AAAA,EAG5B,QAAQ,EAAC;AAAA,EACT,MAAA,GAAS,MAAA;AAAA,EACT,UAAA,GAAa,GAAA;AAAA,EACb,OAAA,GAAU,MAAA;AAAA,EACV,SAAA,GAAY;AACd,CAAA,EAAuB;AACrB,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIE,SAAS,CAAC,CAAA;AACpC,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,QAAAA,CAAkC,EAAE,CAAA;AAC1E,EAAA,MAAM,SAAS,mBAAA,EAAoB;AACnC,EAAA,MAAM,UAAA,GAAaC,OAAO,KAAK,CAAA;AAC/B,EAAA,MAAM,YAAA,GAAe,MAAA,CAAO,YAAA,CAAa,IAAA,KAAS,MAAA;AAClD,EAAA,MAAM,WAAA,GAAc,CAAC,MAAA,KACnB,YAAA,GACI;AAAA,IACE,QAAQ,MAAA,CAAO,YAAA,CAAa,IAAA,IAAQ,CAAC,SAAS,YAAA,GAAe,WAAA;AAAA,IAC7D,UAAA,EAAY,8BAA8B,MAAA,CAAO,YAAA,CAAa,UAAU,CAAA,GAAA,EAAM,MAAA,CAAO,aAAa,MAAM,CAAA;AAAA,GAC1G,GACA,MAAA;AAEN,EAAAL,UAAU,MAAM;AACd,IAAA,IAAI,MAAM,MAAA,GAAS,CAAA,IAAK,UAAA,IAAc,CAAA,IAAK,sBAAqB,EAAG;AACnE,IAAA,MAAM,KAAA,GAAQ,YAAY,MAAM;AAC9B,MAAA,IAAI,CAAC,WAAW,OAAA,EAAS,QAAA,CAAS,CAAC,CAAA,KAAA,CAAO,CAAA,GAAI,CAAA,IAAK,KAAA,CAAM,MAAM,CAAA;AAAA,IACjE,GAAG,UAAU,CAAA;AACb,IAAA,OAAO,MAAM,cAAc,KAAK,CAAA;AAAA,EAClC,CAAA,EAAG,CAAC,UAAA,EAAY,KAAA,CAAM,MAAM,CAAC,CAAA;AAE7B,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAE/B,EAAA,MAAMG,OAAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,OAAO,KAAA,CAAM,MAAA,GAAS,CAAC,CAAC,CAAA;AACtD,EAAA,MAAM,IAAA,GAAO,CAAC,IAAA,KAAiB;AAC7B,IAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AACrB,IAAA,QAAA,CAAA,CAAU,IAAA,GAAO,KAAA,CAAM,MAAA,IAAU,KAAA,CAAM,MAAM,CAAA;AAAA,EAC/C,CAAA;AACA,EAAA,MAAM,eACJ,OAAA,KAAY,MAAA,GACR,yDAAA,GACA,OAAA,KAAY,SACV,4DAAA,GACA,EAAA;AAER,EAAA,uBACEK,IAAAA,CAAC,SAAA,EAAA,EAAQ,aAAA,EAAa,GAAA,CAAI,aAAA,EAAe,SAAA,EAAW,CAAA,iCAAA,EAAoC,WAAA,CAAY,MAAM,CAAC,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA,EACrH,QAAA,EAAA;AAAA,IAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,EAAM,CAAA,qBAChBN,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QAEC,KAAK,IAAA,CAAK,KAAA;AAAA,QACV,GAAA,EAAK,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,KAAA;AAAA,QAC3B,eAAa,CAAA,KAAM,KAAA;AAAA,QACnB,OAAA,EAAS,CAAA,KAAM,CAAA,GAAI,OAAA,GAAU,MAAA;AAAA,QAC7B,QAAA,EAAS,OAAA;AAAA,QACT,MAAA,EAAQ,MAAM,cAAA,CAAe,CAAC,OAAA,MAAa,EAAE,GAAG,OAAA,EAAS,CAAC,CAAC,GAAG,IAAA,EAAK,CAAE,CAAA;AAAA,QACrE,OAAO,WAAA,CAAY,OAAA,CAAQ,WAAA,CAAY,CAAC,CAAC,CAAC,CAAA;AAAA,QAC1C,SAAA,EAAW,CAAA,kFAAA,EACT,CAAA,KAAM,KAAA,KAAU,CAAC,gBAAgB,WAAA,CAAY,CAAC,CAAA,CAAA,GAAK,aAAA,GAAgB,WACrE,CAAA;AAAA,OAAA;AAAA,MAVK,CAAA,EAAG,IAAA,CAAK,KAAK,CAAA,CAAA,EAAI,CAAC,CAAA;AAAA,KAY1B,CAAA;AAAA,oBACDA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,uBAAA,EAA0B,YAAY,CAAA,CAAA,EAAI,CAAA;AAAA,oBAC1DA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,4CAA4C,UAAA,CAAWC,OAAAA,CAAO,KAAA,IAAS,OAAO,CAAC,CAAA,CAAA,EAC7F,QAAA,kBAAAK,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,6CAAA,EACZ,QAAA,EAAA;AAAA,MAAAL,OAAAA,CAAO,2BACND,GAAAA,CAAC,OAAE,SAAA,EAAU,sEAAA,EAAwE,QAAA,EAAAC,OAAAA,CAAO,OAAA,EAAQ,CAAA;AAAA,sBAEtGD,GAAAA,CAAC,IAAA,EAAA,EAAG,WAAU,wEAAA,EAA0E,QAAA,EAAAC,QAAO,KAAA,EAAM,CAAA;AAAA,MACpGA,OAAAA,CAAO,4BAAYD,GAAAA,CAAC,OAAE,SAAA,EAAU,4DAAA,EAA8D,QAAA,EAAAC,OAAAA,CAAO,QAAA,EAAS,CAAA;AAAA,MAC9GA,OAAAA,CAAO,uBACND,GAAAA;AAAA,QAAC,IAAA;AAAA,QAAA;AAAA,UACC,EAAA,EAAIC,QAAO,IAAA,IAAQ,UAAA;AAAA,UACnB,SAAA,EAAU,2JAAA;AAAA,UAET,UAAAA,OAAAA,CAAO;AAAA;AAAA;AACV,KAAA,EAEJ,CAAA,EACF,CAAA;AAAA,IACC,MAAM,MAAA,GAAS,CAAA,oBACdK,IAAAA,CAAAO,UAAA,EACE,QAAA,EAAA;AAAA,sBAAAb,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,YAAA,EAAW,gBAAA;AAAA,UACX,eAAa,GAAA,CAAI,iBAAA;AAAA,UACjB,OAAA,EAAS,MAAM,IAAA,CAAK,KAAA,GAAQ,CAAC,CAAA;AAAA,UAC7B,SAAA,EAAU,mMAAA;AAAA,UAEV,QAAA,kBAAAA,GAAAA,CAACc,WAAAA,EAAA,EAAY,WAAU,SAAA,EAAU;AAAA;AAAA,OACnC;AAAA,sBACAd,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,YAAA,EAAW,YAAA;AAAA,UACX,eAAa,GAAA,CAAI,iBAAA;AAAA,UACjB,OAAA,EAAS,MAAM,IAAA,CAAK,KAAA,GAAQ,CAAC,CAAA;AAAA,UAC7B,SAAA,EAAU,oMAAA;AAAA,UAEV,QAAA,kBAAAA,GAAAA,CAACe,YAAAA,EAAA,EAAa,WAAU,SAAA,EAAU;AAAA;AAAA,OACpC;AAAA,sBACAf,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wDAAA,EACZ,gBAAM,GAAA,CAAI,CAAC,IAAA,EAAM,CAAA,qBAChBA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UAEC,IAAA,EAAK,QAAA;AAAA,UACL,YAAA,EAAY,CAAA,YAAA,EAAe,CAAA,GAAI,CAAC,CAAA,CAAA;AAAA,UAChC,OAAA,EAAS,MAAM,IAAA,CAAK,CAAC,CAAA;AAAA,UACrB,SAAA,EAAW,CAAA,gCAAA,EAAmC,CAAA,KAAM,KAAA,GAAQ,iBAAiB,gCAAgC,CAAA;AAAA,SAAA;AAAA,QAJxG,CAAA,EAAG,IAAA,CAAK,KAAK,CAAA,KAAA,EAAQ,CAAC,CAAA;AAAA,OAM9B,CAAA,EACH;AAAA,KAAA,EACF;AAAA,GAAA,EAEJ,CAAA;AAEJ;AAEO,IAAM,sBAAA,GAAyB;AAAA,EACpC,KAAA,EAAO,gBAAA;AAAA,EACP,WAAA,EAAa,gFAAA;AAAA,EACb,QAAA,EAAU;AAAA,IACR;AAAA,MACE,EAAA,EAAI,OAAA;AAAA,MACJ,IAAA,EAAM,MAAA;AAAA,MACN,KAAA,EAAO,QAAA;AAAA,MACP,IAAA,EAAM,mJAAA;AAAA,MACN,QAAA,EAAU,IAAA;AAAA,MACV,EAAA,EAAI;AAAA,QACF,EAAE,EAAA,EAAI,OAAA,EAAS,IAAA,EAAM,OAAA,EAAS,OAAO,kBAAA,EAAoB,IAAA,EAAM,4CAAA,EAA8C,QAAA,EAAU,IAAA,EAAK;AAAA,QAC5H,EAAE,IAAI,UAAA,EAAY,IAAA,EAAM,QAAQ,KAAA,EAAO,gBAAA,EAAkB,MAAM,qCAAA,EAAsC;AAAA,QACrG,EAAE,IAAI,SAAA,EAAW,IAAA,EAAM,QAAQ,KAAA,EAAO,SAAA,EAAW,MAAM,2CAAA,EAA4C;AAAA,QACnG,EAAE,EAAA,EAAI,OAAA,EAAS,IAAA,EAAM,MAAA,EAAQ,OAAO,UAAA,EAAY,IAAA,EAAM,mDAAA,EAAgD,QAAA,EAAU,IAAA,EAAK;AAAA,QACrH,EAAE,EAAA,EAAI,UAAA,EAAY,IAAA,EAAM,MAAA,EAAQ,OAAO,UAAA,EAAW;AAAA,QAClD,EAAE,IAAI,KAAA,EAAO,IAAA,EAAM,QAAQ,KAAA,EAAO,cAAA,EAAgB,MAAM,kCAAA,EAAmC;AAAA,QAC3F,EAAE,IAAI,MAAA,EAAQ,IAAA,EAAM,OAAO,KAAA,EAAO,aAAA,EAAe,MAAM,uBAAA,EAAwB;AAAA,QAC/E;AAAA,UACE,EAAA,EAAI,OAAA;AAAA,UACJ,IAAA,EAAM,QAAA;AAAA,UACN,KAAA,EAAO,gBAAA;AAAA,UACP,IAAA,EAAM,8FAAA;AAAA,UACN,OAAA,EAAS,OAAA;AAAA,UACT,OAAA,EAAS;AAAA,YACP,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,MAAA,EAAO;AAAA,YAChC,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,QAAA,EAAS;AAAA,YACnC,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,OAAA;AAAQ;AACjC;AACF;AACF,KACF;AAAA,IACA;AAAA,MACE,EAAA,EAAI,QAAA;AAAA,MACJ,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,QAAA;AAAA,MACP,OAAA,EAAS,MAAA;AAAA,MACT,OAAA,EAAS;AAAA,QACP,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,QAAA,EAAS;AAAA,QACnC,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO;AAAA,QAC/B,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,aAAA;AAAc;AAC1C,KACF;AAAA,IACA;AAAA,MACE,EAAA,EAAI,YAAA;AAAA,MACJ,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,wBAAA;AAAA,MACP,IAAA,EAAM,mIAAA;AAAA,MACN,OAAA,EAAS,GAAA;AAAA,MACT,GAAA,EAAK,CAAA;AAAA,MACL,GAAA,EAAK;AAAA,KACP;AAAA,IACA;AAAA,MACE,EAAA,EAAI,SAAA;AAAA,MACJ,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,eAAA;AAAA,MACP,IAAA,EAAM,2GAAA;AAAA,MACN,OAAA,EAAS,MAAA;AAAA,MACT,OAAA,EAAS;AAAA,QACP,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO;AAAA,QAC/B,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO;AAAA,QAC/B,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA;AAAO;AACjC;AACF,GACF;AAAA,EACA,OAAA,EAAS;AAAA,IACP;AAAA,MACE,IAAA,EAAM,gBAAA;AAAA,MACN,KAAA,EAAO;AAAA,QACL,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS,MAAA;AAAA,QACT,UAAA,EAAY,GAAA;AAAA,QACZ,KAAA,EAAO;AAAA,UACL;AAAA,YACE,OAAA,EAAS,oBAAA;AAAA,YACT,KAAA,EAAO,kBAAA;AAAA,YACP,QAAA,EAAU,sEAAA;AAAA,YACV,GAAA,EAAK,mBAAA;AAAA,YACL,IAAA,EAAM,UAAA;AAAA,YACN,KAAA,EAAO,OAAA;AAAA,YACP,KAAA,EAAO,iBAAA,CAAkB,kBAAA,EAAoB,GAAA,EAAK,GAAG;AAAA,WACvD;AAAA,UACA;AAAA,YACE,OAAA,EAAS,eAAA;AAAA,YACT,KAAA,EAAO,sBAAA;AAAA,YACP,QAAA,EAAU,mCAAA;AAAA,YACV,GAAA,EAAK,UAAA;AAAA,YACL,IAAA,EAAM,UAAA;AAAA,YACN,KAAA,EAAO,OAAA;AAAA,YACP,KAAA,EAAO,iBAAA,CAAkB,sBAAA,EAAwB,EAAA,EAAI,EAAE;AAAA;AACzD;AACF;AACF;AACF,GACF;AAAA;AAAA;AAAA,EAGA,SAAA,EAAW,CAAC,MAAA,EAAQ,YAAA,EAAc,SAAS;AAC7C,CAAA;ACnNO,SAAS,aAAA,CAAc;AAAA,EAC5B,KAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA,GAAS,KAAA;AAAA,EACT,YAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA,GAAQ,EAAA;AAAA,EACR,GAAA,GAAM,UAAA;AAAA,EACN,IAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ;AACF,CAAA,EAAuB;AACrB,EAAA,MAAM,SAAS,mBAAA,EAAoB;AACnC,EAAA,MAAM,UAAU,oBAAA,EAAqB;AACrC,EAAA,MAAM,WAAA,GAAcG,OAAuB,IAAI,CAAA;AAC/C,EAAA,MAAM,UAAA,GAAa,wBAAwB,MAAM,CAAA;AACjD,EAAA,MAAM,EAAE,WAAW,oBAAA,EAAsB,KAAA,EAAO,mBAAkB,GAAI,eAAA,CAAgB,UAAA,CAAW,WAAA,EAAa,WAAW,CAAA;AAMzH,EAAA,MAAM,EAAE,QAAQ,IAAA,EAAM,KAAA,EAAO,QAAO,GAAI,YAAA,CAAwB,MAAM,UAAA,EAAY;AAAA,IAChF,MAAA,EAAQ,eAAA;AAAA,IACR,MAAA,EAAQ,EAAE,MAAA,EAAQ,QAAA,EAAU,YAAA,EAAc,YAAY,MAAA,EAAQ,UAAA,CAAW,MAAM,CAAA,EAAG,KAAA;AAAM,GACzF,CAAA;AACD,EAAA,MAAM,UAAU,MAAA,KAAW,OAAA;AAC3B,EAAA,MAAM,OAAA,GAAU,QAAQ,EAAC;AAEzB,EAAA,MAAM,MAAA,GAAS,CAAC,SAAA,KAAsB;AACpC,IAAA,WAAA,CAAY,OAAA,EAAS,QAAA,CAAS,EAAE,IAAA,EAAM,YAAY,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,WAAA,CAAY,QAAQ,WAAA,GAAc,IAAI,CAAA,EAAG,QAAA,EAAU,UAAU,CAAA;AAAA,EAC/H,CAAA;AAEA,EAAA,IAAI,MAAA,KAAW,SAAS,uBAAOH,IAAC,cAAA,EAAA,EAAe,MAAA,EAAgB,SAAS,KAAA,EAAO,CAAA;AAC/E,EAAA,IAAI,CAAC,OAAA,IAAW,OAAA,CAAQ,MAAA,KAAW,GAAG,OAAO,IAAA;AAE7C,EAAA,uBACEM,KAAC,SAAA,EAAA,EAAQ,aAAA,EAAa,IAAI,aAAA,EAAe,SAAA,EAAW,CAAA,qCAAA,EAAwC,SAAS,CAAA,CAAA,EACnG,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sEAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACZ,QAAA,EAAA;AAAA,QAAA,OAAA,oBAAWN,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sEAAsE,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,wBACvGA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,6EAA6E,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,QAChG,4BAAYA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,wCAAwC,QAAA,EAAA,QAAA,EAAS;AAAA,OAAA,EAC7E,CAAA;AAAA,sBACAM,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,wBAAAN,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,YAAA,EAAW,mBAAA;AAAA,YACX,eAAa,GAAA,CAAI,iBAAA;AAAA,YACjB,OAAA,EAAS,MAAM,MAAA,CAAO,EAAE,CAAA;AAAA,YACxB,SAAA,EAAU,2IAAA;AAAA,YAEV,QAAA,kBAAAA,GAAAA,CAACc,WAAAA,EAAA,EAAY,WAAU,SAAA,EAAU;AAAA;AAAA,SACnC;AAAA,wBACAd,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,YAAA,EAAW,eAAA;AAAA,YACX,eAAa,GAAA,CAAI,iBAAA;AAAA,YACjB,OAAA,EAAS,MAAM,MAAA,CAAO,CAAC,CAAA;AAAA,YACvB,SAAA,EAAU,2IAAA;AAAA,YAEV,QAAA,kBAAAA,GAAAA,CAACe,YAAAA,EAAA,EAAa,WAAU,SAAA,EAAU;AAAA;AAAA;AACpC,OAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,oBACAf,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,WAAA;AAAA,QACL,eAAa,GAAA,CAAI,qBAAA;AAAA,QACjB,SAAA,EAAU,+DAAA;AAAA,QAET,QAAA,EAAA,OAAA,GACG,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,CAAC,CAAA,EAAE,EAAG,CAAC,GAAG,CAAA,qBAC7CA,GAAAA,CAAC,KAAA,EAAA,EAAY,SAAA,EAAU,2DAAA,EAAA,EAAb,CAAyE,CACpF,IACD,OAAA,CAAQ,GAAA,CAAI,CAAC,OAAA,qBACXA,GAAAA,CAAC,KAAA,EAAA,EAAqB,SAAA,EAAU,8EAC9B,QAAA,kBAAAA,GAAAA;AAAA,UAAC,oBAAA;AAAA,UAAA;AAAA,YACC,OAAA;AAAA,YACA,MAAA;AAAA,YACA,cAAc,MAAA,CAAO,YAAA;AAAA,YACrB,OAAA;AAAA,YACC,GAAG;AAAA;AAAA,SACN,EAAA,EAPQ,OAAA,CAAQ,EAQlB,CACD;AAAA;AAAA,KACP;AAAA,IACC,uBACCA,GAAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,EAAA,EAAI,QAAQ,MAAA,CAAO,WAAA;AAAA,QACnB,SAAA,EAAU,+JAAA;AAAA,QAET,QAAA,EAAA;AAAA;AAAA;AACH,GAAA,EAEJ,CAAA;AAEJ;AAEO,IAAM,sBAAA,GAAyB;AAAA,EACpC,KAAA,EAAO,gBAAA;AAAA,EACP,WAAA,EAAa,qFAAA;AAAA,EACb,QAAA,EAAU;AAAA,IACR,EAAE,IAAI,OAAA,EAAS,IAAA,EAAM,QAAQ,KAAA,EAAO,OAAA,EAAS,UAAU,IAAA,EAAK;AAAA,IAC5D,EAAE,IAAI,UAAA,EAAY,IAAA,EAAM,QAAQ,KAAA,EAAO,UAAA,EAAY,MAAM,qCAAA,EAAsC;AAAA,IAC/F;AAAA,MACE,EAAA,EAAI,SAAA;AAAA,MACJ,IAAA,EAAM,MAAA;AAAA,MACN,KAAA,EAAO,SAAA;AAAA,MACP,IAAA,EAAM;AAAA,KACR;AAAA,IACA;AAAA,MACE,EAAA,EAAI,QAAA;AAAA,MACJ,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,gBAAA;AAAA,MACP,IAAA,EAAM,oKAAA;AAAA,MACN,OAAA,EAAS;AAAA,QACP,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,cAAA,EAAe;AAAA,QACtC,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,cAAA,EAAe;AAAA,QACtC,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,SAAA;AAAU,OACpC;AAAA,MACA,OAAA,EAAS;AAAA,KACX;AAAA,IACA;AAAA,MACE,EAAA,EAAI,cAAA;AAAA;AAAA;AAAA;AAAA,MAIJ,IAAA,EAAM,UAAA;AAAA,MACN,KAAA,EAAO,mBAAA;AAAA,MACP,IAAA,EAAM;AAAA,KACR;AAAA,IACA;AAAA,MACE,EAAA,EAAI,YAAA;AAAA;AAAA;AAAA;AAAA,MAIJ,IAAA,EAAM,MAAA;AAAA,MACN,KAAA,EAAO,qBAAA;AAAA,MACP,IAAA,EAAM;AAAA,KACR;AAAA,IACA;AAAA,MACE,EAAA,EAAI,QAAA;AAAA,MACJ,IAAA,EAAM,MAAA;AAAA,MACN,KAAA,EAAO,sBAAA;AAAA,MACP,IAAA,EAAM,2OAAA;AAAA,MACN,EAAA,EAAI;AAAA,QACF,EAAE,EAAA,EAAI,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,OAAO,gBAAA,EAAkB,IAAA,EAAM,2CAAA,EAA6C,QAAA,EAAU,IAAA,EAAK;AAAA,QACtH,EAAE,EAAA,EAAI,OAAA,EAAS,IAAA,EAAM,MAAA,EAAQ,OAAO,OAAA,EAAS,IAAA,EAAM,wCAAA,EAA0C,QAAA,EAAU,IAAA;AAAK;AAC9G,KACF;AAAA,IACA;AAAA,MACE,EAAA,EAAI,OAAA;AAAA,MACJ,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,UAAA;AAAA,MACP,IAAA,EAAM,kGAAA;AAAA,MACN,GAAA,EAAK,CAAA;AAAA,MACL,GAAA,EAAK,EAAA;AAAA,MACL,OAAA,EAAS;AAAA,KACX;AAAA,IACA,EAAE,EAAA,EAAI,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,OAAO,WAAA,EAAa,IAAA,EAAM,wCAAA,EAA0C,OAAA,EAAS,UAAA,EAAW;AAAA,IACnH;AAAA,MACE,EAAA,EAAI,MAAA;AAAA,MACJ,IAAA,EAAM,KAAA;AAAA,MACN,KAAA,EAAO,aAAA;AAAA,MACP,IAAA,EAAM;AAAA;AACR,GACF;AAAA,EACA,OAAA,EAAS;AAAA,IACP;AAAA,MACE,IAAA,EAAM,cAAA;AAAA,MACN,KAAA,EAAO;AAAA,QACL,OAAA,EAAS,WAAA;AAAA,QACT,KAAA,EAAO,kBAAA;AAAA,QACP,QAAA,EAAU,iDAAA;AAAA,QACV,MAAA,EAAQ,KAAA;AAAA,QACR,KAAA,EAAO,EAAA;AAAA,QACP,GAAA,EAAK;AAAA;AACP,KACF;AAAA,IACA;AAAA,MACE,IAAA,EAAM,mBAAA;AAAA,MACN,KAAA,EAAO,EAAE,KAAA,EAAO,+BAAA,EAA2B,QAAQ,KAAA,EAAO,KAAA,EAAO,EAAA,EAAI,GAAA,EAAK,UAAA;AAAW;AACvF,GACF;AAAA,EACA,WAAW,CAAC,MAAA,EAAQ,SAAA,EAAW,YAAA,EAAc,WAAW,SAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKjE,IAAA,EAAM;AAAA,IACJ,QAAA,EAAU;AAAA,MACR,MAAA,EAAQ,eAAA;AAAA,MACR,MAAA,EAAQ;AAAA,QACN,MAAA,EAAQ,EAAE,KAAA,EAAO,QAAA,EAAS;AAAA,QAC1B,QAAA,EAAU,EAAE,KAAA,EAAO,cAAA,EAAe;AAAA,QAClC,UAAA,EAAY,EAAE,KAAA,EAAO,YAAA,EAAa;AAAA,QAClC,KAAA,EAAO,EAAE,KAAA,EAAO,OAAA;AAAQ;AAC1B;AACF;AAEJ,CAAA;ACrOO,SAAS,WAAA,CAAY,EAAE,QAAA,EAAU,OAAA,EAAQ,EAA8C;AAC5F,EAAA,MAAM,SAAS,mBAAA,EAAoB;AACnC,EAAA,MAAM,UAAU,oBAAA,EAAqB;AACrC,EAAA,MAAM,UAAA,GAAa,wBAAwB,MAAM,CAAA;AACjD,EAAA,MAAM,EAAE,WAAW,oBAAA,EAAsB,KAAA,EAAO,mBAAkB,GAAI,eAAA,CAAgB,UAAA,CAAW,WAAA,EAAa,WAAW,CAAA;AAEzH,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,aAAA,EAAa,GAAA,CAAI,aAAa,SAAA,EAAU,sDAAA,EAC1C,QAAA,EAAA,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,GAAE,EAAG,CAAC,CAAA,EAAG,CAAA,qBAC7BA,GAAAA,CAAC,SAAY,SAAA,EAAU,gDAAA,EAAA,EAAb,CAA8D,CACzE,CAAA,EACH,CAAA;AAAA,EAEJ;AACA,EAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,IAAA,uBACEA,IAAC,KAAA,EAAA,EAAI,aAAA,EAAa,IAAI,WAAA,EAAa,SAAA,EAAU,2CAA0C,QAAA,EAAA,4BAAA,EAEvF,CAAA;AAAA,EAEJ;AACA,EAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,aAAA,EAAa,GAAA,CAAI,WAAA,EAAa,SAAA,EAAU,sDAAA,EAC1C,QAAA,EAAA,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,qBACbA,GAAAA;AAAA,IAAC,oBAAA;AAAA,IAAA;AAAA,MAEC,OAAA,EAAS,CAAA;AAAA,MACT,MAAA;AAAA,MACA,cAAc,MAAA,CAAO,YAAA;AAAA,MACrB,OAAA;AAAA,MACC,GAAG;AAAA,KAAA;AAAA,IALC,CAAA,CAAE;AAAA,GAOV,CAAA,EACH,CAAA;AAEJ;;;AC5BO,SAAS,aAAA,GAA8D;AAC5E,EAAA,MAAM,EAAE,MAAA,EAAQ,IAAA,KAAS,SAAA,CAAsB,iBAAA,EAAmB,EAAE,CAAA;AACpE,EAAA,OAAO,EAAE,YAAY,IAAA,IAAQ,IAAI,OAAA,EAAS,MAAA,KAAW,SAAA,IAAa,MAAA,KAAW,MAAA,EAAO;AACtF;ACCO,SAAS,YAAA,GAAe;AAC7B,EAAA,MAAM,EAAE,UAAA,EAAW,GAAI,aAAA,EAAc;AACrC,EAAA,MAAM,UAAU,eAAA,EAAgB;AAChC,EAAA,MAAM,MAAA,GAAS,mBAAA,EAAoB,CAAE,aAAA,IAAiB,EAAC;AAEvD,EAAA,uBACEM,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,mCAAA,EAEf,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,sBAAAN,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,aAAA,EAAW,CAAA;AAAA,sBACjDM,IAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,eAAa,GAAA,CAAI,UAAA;AAAA,UACjB,OAAO,OAAA,CAAQ,IAAA;AAAA,UACf,UAAU,CAAC,CAAA,KAAM,QAAQ,OAAA,CAAQ,CAAA,CAAE,OAAO,KAAoB,CAAA;AAAA,UAC9D,SAAA,EAAU,0DAAA;AAAA,UAEV,QAAA,EAAA;AAAA,4BAAAN,GAAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,QAAA,EAAS,QAAA,EAAA,eAAA,EAAa,CAAA;AAAA,4BACpCA,GAAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,aAAY,QAAA,EAAA,gBAAA,EAAW,CAAA;AAAA,4BACrCA,GAAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,cAAa,QAAA,EAAA,gBAAA,EAAW,CAAA;AAAA,4BACtCA,GAAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,QAAO,QAAA,EAAA,iBAAA,EAAU;AAAA;AAAA;AAAA;AACjC,KAAA,EACF,CAAA;AAAA,oBAGAM,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,sBAAAN,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,YAAA,EAAU,CAAA;AAAA,sBAChDM,IAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,WAAA,EACZ,QAAA,EAAA;AAAA,wBAAAN,GAAAA,CAAC,QACC,QAAA,kBAAAA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,MAAM,OAAA,CAAQ,aAAA,CAAc,IAAI,CAAA;AAAA,YACzC,WAAW,CAAA,kEAAA,EACT,OAAA,CAAQ,UAAA,KAAe,IAAA,GAAO,2CAA2C,gBAC3E,CAAA,CAAA;AAAA,YACD,QAAA,EAAA;AAAA;AAAA,SAED,EACF,CAAA;AAAA,QACC,WAAW,GAAA,CAAI,CAAC,sBACfA,GAAAA,CAAC,QACC,QAAA,kBAAAA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,aAAA,EAAa,GAAA,CAAI,cAAA,CAAe,CAAA,CAAE,IAAI,CAAA;AAAA,YACtC,OAAA,EAAS,MAAM,OAAA,CAAQ,aAAA,CAAc,OAAA,CAAQ,eAAe,CAAA,CAAE,EAAA,GAAK,IAAA,GAAO,CAAA,CAAE,EAAE,CAAA;AAAA,YAC9E,WAAW,CAAA,kEAAA,EACT,OAAA,CAAQ,eAAe,CAAA,CAAE,EAAA,GAAK,2CAA2C,gBAC3E,CAAA,CAAA;AAAA,YAEC,QAAA,EAAA,CAAA,CAAE;AAAA;AAAA,SACL,EAAA,EAVO,CAAA,CAAE,EAWX,CACD;AAAA,OAAA,EACH;AAAA,KAAA,EACF,CAAA;AAAA,IAGC,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,KAAU;AACrB,MAAA,MAAMC,OAAAA,GAAS,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA;AACvC,MAAA,MAAM,WAAW,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA,KAAM,EAAE,MAAM,CAAA;AAClD,MAAA,uBACEK,IAAAA,CAAC,KAAA,EAAA,EAAoB,SAAA,EAAU,WAAA,EAC7B,QAAA,EAAA;AAAA,wBAAAN,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uBAAA,EAAyB,gBAAM,KAAA,EAAM,CAAA;AAAA,wBACnDA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,QAAA,GAAW,sBAAA,GAAyB,WAAA,EACjD,QAAA,EAAA,KAAA,CAAM,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM;AACvB,UAAA,MAAM,EAAA,GAAKC,YAAW,CAAA,CAAE,KAAA;AACxB,UAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,KAAA,IAAS,CAAA,CAAE,KAAA;AAC3B,UAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,QAAA,CAAS,MAAM,GAAA,EAAK,EAAA,GAAK,IAAA,GAAO,CAAA,CAAE,KAAK,CAAA;AACpE,UAAA,IAAI,EAAE,MAAA,EAAQ;AACZ,YAAA,uBACEK,IAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBAEC,IAAA,EAAK,QAAA;AAAA,gBACL,OAAA,EAAS,MAAA;AAAA,gBACT,KAAA,EAAO,KAAA;AAAA,gBACP,cAAA,EAAc,EAAA;AAAA,gBACd,eAAa,CAAA,aAAA,EAAgB,KAAA,CAAM,GAAG,CAAA,CAAA,EAAI,EAAE,KAAK,CAAA,CAAA;AAAA,gBAGjD,SAAA,EAAW,CAAA,6DAAA,EACT,EAAA,GAAK,mCAAA,GAAsC,gBAC7C,CAAA,CAAA;AAAA,gBAEA,QAAA,EAAA;AAAA,kCAAAN,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAW,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,kCACjCA,GAAAA;AAAA,oBAAC,MAAA;AAAA,oBAAA;AAAA,sBACC,aAAA,EAAW,IAAA;AAAA,sBACX,SAAA,EAAU,sDAAA;AAAA,sBACV,KAAA,EAAO,EAAE,UAAA,EAAY,CAAA,CAAE,MAAA;AAAO;AAAA;AAChC;AAAA,eAAA;AAAA,cAjBK,CAAA,CAAE;AAAA,aAkBT;AAAA,UAEJ;AACA,UAAA,uBACEA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cAEC,IAAA,EAAK,QAAA;AAAA,cACL,OAAA,EAAS,MAAA;AAAA,cACT,cAAA,EAAc,EAAA;AAAA,cACd,eAAa,CAAA,aAAA,EAAgB,KAAA,CAAM,GAAG,CAAA,CAAA,EAAI,EAAE,KAAK,CAAA,CAAA;AAAA,cACjD,SAAA,EAAW,CAAA,kEAAA,EACT,EAAA,GAAK,wCAAA,GAA2C,gBAClD,CAAA,CAAA;AAAA,cAEC,QAAA,EAAA;AAAA,aAAA;AAAA,YATI,CAAA,CAAE;AAAA,WAUT;AAAA,QAEJ,CAAC,CAAA,EACH;AAAA,OAAA,EAAA,EA9CQ,MAAM,GA+ChB,CAAA;AAAA,IAEJ,CAAC,CAAA;AAAA,oBAGDM,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,sBAAAN,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,UAAA,EAAK,CAAA;AAAA,sBAC3CM,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,wBAAAN,GAAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,eAAa,GAAA,CAAI,cAAA;AAAA,YACjB,IAAA,EAAK,QAAA;AAAA,YACL,WAAA,EAAY,QAAA;AAAA,YACZ,GAAA,EAAK,CAAA;AAAA,YACL,KAAA,EAAO,QAAQ,QAAA,IAAY,EAAA;AAAA,YAC3B,QAAA,EAAU,CAAC,CAAA,KAAM,OAAA,CAAQ,YAAY,CAAA,CAAE,MAAA,CAAO,KAAA,KAAU,EAAA,GAAK,IAAA,GAAO,MAAA,CAAO,CAAA,CAAE,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,YAC1F,SAAA,EAAU;AAAA;AAAA,SACZ;AAAA,wBACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAwB,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,wBACzCA,GAAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,eAAa,GAAA,CAAI,cAAA;AAAA,YACjB,IAAA,EAAK,QAAA;AAAA,YACL,WAAA,EAAY,QAAA;AAAA,YACZ,GAAA,EAAK,CAAA;AAAA,YACL,KAAA,EAAO,QAAQ,QAAA,IAAY,EAAA;AAAA,YAC3B,QAAA,EAAU,CAAC,CAAA,KAAM,OAAA,CAAQ,YAAY,CAAA,CAAE,MAAA,CAAO,KAAA,KAAU,EAAA,GAAK,IAAA,GAAO,MAAA,CAAO,CAAA,CAAE,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,YAC1F,SAAA,EAAU;AAAA;AAAA;AACZ,OAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,oBAGAM,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,gDAAA,EACf,QAAA,EAAA;AAAA,sBAAAN,GAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,eAAa,GAAA,CAAI,aAAA;AAAA,UACjB,IAAA,EAAK,UAAA;AAAA,UACL,SAAS,OAAA,CAAQ,WAAA;AAAA,UACjB,UAAU,CAAC,CAAA,KAAM,QAAQ,cAAA,CAAe,CAAA,CAAE,OAAO,OAAO,CAAA;AAAA,UACxD,SAAA,EAAU;AAAA;AAAA,OACZ;AAAA,MAAE;AAAA,KAAA,EAEJ,CAAA;AAAA,oBAEAA,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,eAAa,GAAA,CAAI,YAAA;AAAA,QACjB,OAAA,EAAS,MAAM,OAAA,CAAQ,KAAA,EAAM;AAAA,QAC7B,SAAA,EAAU,wFAAA;AAAA,QACX,QAAA,EAAA;AAAA;AAAA;AAED,GAAA,EACF,CAAA;AAEJ;AC/JO,SAAS,kBAAkB,KAAA,EAA8B;AAC9D,EAAA,MAAM,EAAE,KAAA,EAAO,WAAA,EAAY,GAAI,KAAA;AAC/B,EAAA,uBAAA,EAAwB,EAAG,KAAK,KAAK,CAAA;AAErC,EAAAF,UAAU,MAAM;AACd,IAAA,IAAI,KAAA,WAAgB,KAAA,GAAQ,KAAA;AAAA,EAC9B,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,WAAA,EAAa;AAClB,IAAA,IAAI,GAAA,GAAM,QAAA,CAAS,IAAA,CAAK,aAAA,CAA+B,0BAA0B,CAAA;AACjF,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,GAAA,GAAM,QAAA,CAAS,cAAc,MAAM,CAAA;AACnC,MAAA,GAAA,CAAI,YAAA,CAAa,QAAQ,aAAa,CAAA;AACtC,MAAA,QAAA,CAAS,IAAA,CAAK,YAAY,GAAG,CAAA;AAAA,IAC/B;AACA,IAAA,GAAA,CAAI,aAAa,SAAA,EAAW,WAAA,CAAY,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC,CAAA;AAAA,EACvD,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAClB;AC1BA,IAAM,KAAA,GAAuB,CAAC,QAAA,EAAU,WAAA,EAAa,cAAc,MAAM,CAAA;AAGzE,IAAM,eAAA,mBAAkB,IAAI,GAAA,CAAI,CAAC,QAAA,EAAU,GAAA,EAAK,UAAA,EAAY,MAAA,EAAQ,OAAA,EAAS,KAAA,EAAO,KAAK,CAAC,CAAA;AAO1F,SAAS,kBAAkB,WAAA,EAA6B;AACtD,EAAA,MAAM,QAAA,GAAWK,OAAO,KAAK,CAAA;AAC7B,EAAA,MAAM,UAAU,gBAAA,EAAiB;AACjC,EAAA,MAAM,UAAU,eAAA,EAAgB;AAEhC,EAAAL,UAAU,MAAM;AACd,IAAA,IAAI,SAAS,OAAA,EAAS;AACtB,IAAA,QAAA,CAAS,OAAA,GAAU,IAAA;AACnB,IAAA,MAAM,IAAI,OAAA,CAAQ,cAAA,GAAiB,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AAC/C,IAAA,IAAI,CAAC,CAAA,EAAG;AACR,IAAA,MAAM,CAAA,GAAI,IAAI,eAAA,CAAgB,CAAC,CAAA;AAC/B,IAAA,MAAMH,EAAAA,GAAI,gBAAgB,QAAA,EAAS;AAInC,IAAA,IAAI,CAAA,CAAE,GAAA,CAAI,GAAG,CAAA,EAAGA,EAAAA,CAAE,SAAA,CAAU,CAAA,CAAE,GAAA,CAAI,GAAG,CAAA,IAAK,EAAE,CAAA;AAAA,SAAA,IACnC,CAAA,CAAE,GAAA,CAAI,QAAQ,CAAA,EAAGA,EAAAA,CAAE,SAAA,CAAU,CAAA,CAAE,GAAA,CAAI,QAAQ,CAAA,IAAK,EAAE,CAAA;AAC3D,IAAA,IAAI,CAAA,CAAE,GAAA,CAAI,UAAU,CAAA,EAAGA,GAAE,aAAA,CAAc,CAAA,CAAE,GAAA,CAAI,UAAU,CAAC,CAAA;AAIxD,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,CAAA,CAAE,SAAQ,EAAG;AACtC,MAAA,IAAI,CAAC,eAAA,CAAgB,GAAA,CAAI,GAAG,CAAA,IAAK,OAAOA,EAAAA,CAAE,QAAA,CAAS,GAAA,EAAK,KAAK,CAAA;AAAA,IAC/D;AACA,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACzB,IAAA,IAAI,IAAA,IAAS,MAAmB,QAAA,CAAS,IAAI,GAAGA,EAAAA,CAAE,QAAQ,IAAmB,CAAA;AAC7E,IAAA,IAAI,CAAA,CAAE,IAAI,OAAO,CAAA,KAAM,KAAKA,EAAAA,CAAE,eAAe,IAAI,CAAA;AACjD,IAAA,IAAI,CAAA,CAAE,GAAA,CAAI,KAAK,CAAA,EAAGA,EAAAA,CAAE,WAAA,CAAY,MAAA,CAAO,CAAA,CAAE,GAAA,CAAI,KAAK,CAAC,KAAK,IAAI,CAAA;AAC5D,IAAA,IAAI,CAAA,CAAE,GAAA,CAAI,KAAK,CAAA,EAAGA,EAAAA,CAAE,WAAA,CAAY,MAAA,CAAO,CAAA,CAAE,GAAA,CAAI,KAAK,CAAC,KAAK,IAAI,CAAA;AAAA,EAC9D,CAAA,EAAG,EAAE,CAAA;AAEL,EAAAG,UAAU,MAAM;AACd,IAAA,MAAM,CAAA,GAAI,IAAI,eAAA,EAAgB;AAC9B,IAAA,IAAI,QAAQ,MAAA,EAAQ,CAAA,CAAE,GAAA,CAAI,WAAA,EAAa,QAAQ,MAAM,CAAA;AACrD,IAAA,IAAI,QAAQ,UAAA,EAAY,CAAA,CAAE,GAAA,CAAI,UAAA,EAAY,QAAQ,UAAU,CAAA;AAC5D,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,MAAA,CAAO,OAAA,CAAQ,OAAA,CAAQ,MAAM,CAAA,EAAG,CAAA,CAAE,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AAC3E,IAAA,IAAI,QAAQ,IAAA,KAAS,QAAA,IAAY,GAAA,CAAI,MAAA,EAAQ,QAAQ,IAAI,CAAA;AACzD,IAAA,IAAI,OAAA,CAAQ,WAAA,EAAa,CAAA,CAAE,GAAA,CAAI,SAAS,GAAG,CAAA;AAC3C,IAAA,IAAI,OAAA,CAAQ,YAAY,IAAA,EAAM,CAAA,CAAE,IAAI,KAAA,EAAO,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAC,CAAA;AACnE,IAAA,IAAI,OAAA,CAAQ,YAAY,IAAA,EAAM,CAAA,CAAE,IAAI,KAAA,EAAO,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAGnE,IAAA,MAAM,IAAA,GAAO,QAAQ,cAAA,EAAe,CAAE,MAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,UAAA;AACvD,IAAA,MAAM,EAAA,GAAK,EAAE,QAAA,EAAS;AACtB,IAAA,MAAM,OAAO,EAAA,GAAK,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,GAAK,IAAA;AACpC,IAAA,IAAI,SAAS,OAAA,CAAQ,cAAA,EAAe,EAAG,OAAA,CAAQ,QAAQ,IAAI,CAAA;AAAA,EAC7D,CAAA,EAAG;AAAA,IACD,OAAA,CAAQ,MAAA;AAAA,IACR,OAAA,CAAQ,UAAA;AAAA,IACR,OAAA,CAAQ,MAAA;AAAA,IACR,OAAA,CAAQ,IAAA;AAAA,IACR,OAAA,CAAQ,WAAA;AAAA,IACR,OAAA,CAAQ,QAAA;AAAA,IACR,OAAA,CAAQ,QAAA;AAAA,IACR;AAAA,GACD,CAAA;AACH;AAEO,SAAS,WAAA,GAAc;AAC5B,EAAA,MAAM,SAAS,mBAAA,EAAoB;AACnC,EAAA,MAAM,UAAU,eAAA,EAAgB;AAIhC,EAAA,MAAM,OAAO,YAAA,EAAa;AAC1B,EAAA,MAAM,gBAAgB,OAAA,CAAQ,SAAA,CAAU,OAAO,MAAA,CAAO,WAAA,EAAa,IAAI,CAAC,CAAA;AACxE,EAAA,iBAAA,CAAkB,aAAA,GAAgB,MAAM,QAAQ,CAAA;AAChD,EAAA,iBAAA,CAAkB;AAAA,IAChB,KAAA,EAAO,OAAA,CAAQ,MAAA,GAAS,CAAA,MAAA,EAAI,OAAA,CAAQ,MAAM,CAAA,cAAA,EAAO,MAAA,CAAO,IAAI,CAAA,CAAA,GAAK,CAAA,EAAG,MAAA,CAAO,IAAI,CAAA,YAAA;AAAA,GAChF,CAAA;AASD,EAAA,MAAM,EAAE,MAAA,EAAQ,IAAA,EAAM,OAAO,MAAA,EAAO,GAAI,UAAqB,eAAA,EAAiB;AAAA,IAC5E,MAAM,OAAA,CAAQ,IAAA;AAAA,IACd,QAAA,EAAU,QAAQ,UAAA,IAAc,MAAA;AAAA,IAChC,MAAA,EAAQ,QAAQ,MAAA,IAAU,MAAA;AAAA,IAC1B,MAAA,EAAQ,OAAO,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA,CAAE,MAAA,GAAS,CAAA,GAAI,OAAA,CAAQ,MAAA,GAAS;AAAA,GACnE,CAAA;AACD,EAAA,MAAM,QAAA,GAAW,QAAQ,EAAC;AAC1B,EAAA,MAAM,OAAA,GAAU,MAAA,KAAW,OAAA,IAAW,MAAA,KAAW,OAAA;AAKjD,EAAA,MAAM,QAAA,GAAWW,OAAAA;AAAA,IACf,MACE,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,KAAM;AACrB,MAAA,IAAI,QAAQ,QAAA,IAAY,IAAA,IAAQ,EAAE,KAAA,GAAQ,OAAA,CAAQ,UAAU,OAAO,KAAA;AACnE,MAAA,IAAI,QAAQ,QAAA,IAAY,IAAA,IAAQ,EAAE,KAAA,GAAQ,OAAA,CAAQ,UAAU,OAAO,KAAA;AACnE,MAAA,IAAI,OAAA,CAAQ,WAAA,IAAe,CAAA,CAAE,cAAA,IAAkB,GAAG,OAAO,KAAA;AACzD,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AAAA,IACH,CAAC,QAAA,EAAU,OAAA,CAAQ,UAAU,OAAA,CAAQ,QAAA,EAAU,QAAQ,WAAW;AAAA,GACpE;AAEA,EAAA,MAAM,WAAA,GAAc,EAAE,QAAA,EAAU,QAAA,EAAU,OAAA,EAAQ;AAElD,EAAA,uBACEH,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qCAAA,EACb,QAAA,EAAA;AAAA,oBAAAN,IAAC,IAAA,EAAA,EAAK,IAAA,EAAK,WAAU,IAAA,EAAK,eAAA,EAAgB,SAAS,WAAA,EAAa,CAAA;AAAA,oBAChEM,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,MAAA,EACb,QAAA,EAAA;AAAA,sBAAAN,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,mCAAA,EAAqC,iBAAO,IAAA,EAAK,CAAA;AAAA,sBAC/DA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,4BAAA,EACV,QAAA,EAAA,OAAA,CAAQ,MAAA,GACL,CAAA,sBAAA,EAAoB,OAAA,CAAQ,MAAM,CAAA,MAAA,CAAA,GAClC,0DAAA,EACN,CAAA;AAAA,MAIC,MAAA,CAAO,KAAK,OAAA,CAAQ,MAAM,EAAE,MAAA,GAAS,CAAA,oBACpCA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BACZ,QAAA,EAAA,MAAA,CAAO,OAAA,CAAQ,OAAA,CAAQ,MAAM,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,qBAC9CM,IAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UAEC,IAAA,EAAK,QAAA;AAAA,UACL,aAAA,EAAa,uBAAuB,GAAG,CAAA,CAAA;AAAA,UACvC,OAAA,EAAS,MAAM,OAAA,CAAQ,QAAA,CAAS,KAAK,IAAI,CAAA;AAAA,UACzC,SAAA,EAAU,yHAAA;AAAA,UAET,QAAA,EAAA;AAAA,YAAA,KAAA;AAAA,4BACDN,GAAAA,CAAC,CAAA,EAAA,EAAE,SAAA,EAAU,aAAA,EAAc,eAAW,IAAA,EAAC,CAAA;AAAA,4BACvCM,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU,QAAA,EAAA;AAAA,cAAA,iBAAA;AAAA,cAAgB;AAAA,aAAA,EAAI;AAAA;AAAA,SAAA;AAAA,QARzC;AAAA,OAUR,CAAA,EACH;AAAA,KAAA,EAEJ,CAAA;AAAA,oBACAN,IAAC,IAAA,EAAA,EAAK,IAAA,EAAK,WAAU,IAAA,EAAK,YAAA,EAAa,SAAS,WAAA,EAAa,CAAA;AAAA,oBAC7DM,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iCAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAN,IAAC,YAAA,EAAA,EAAa,CAAA;AAAA,wBACdA,IAAC,IAAA,EAAA,EAAK,IAAA,EAAK,WAAU,IAAA,EAAK,cAAA,EAAe,SAAS,WAAA,EAAa;AAAA,OAAA,EACjE,CAAA;AAAA,sBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QAAA,EACZ,kCACCM,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8CAAA,EACb,QAAA,EAAA;AAAA,wBAAAN,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,8CAAA,EAAsC,CAAA;AAAA,wBAC3EA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,MAAA;AAAA,YACT,SAAA,EAAU,kFAAA;AAAA,YACX,QAAA,EAAA;AAAA;AAAA;AAED,OAAA,EACF,oBAEAA,GAAAA,CAAC,eAAY,QAAA,EAAU,QAAA,EAAU,SAAkB,CAAA,EAEvD;AAAA,KAAA,EACF,CAAA;AAAA,oBACAA,IAAC,IAAA,EAAA,EAAK,IAAA,EAAK,WAAU,IAAA,EAAK,WAAA,EAAY,SAAS,WAAA,EAAa;AAAA,GAAA,EAC9D,CAAA;AAEJ;;;AC3KO,SAAS,WAAW,IAAA,EAIzB;AACA,EAAA,MAAM,EAAE,QAAQ,IAAA,EAAM,KAAA,KAAU,SAAA,CAA0B,iBAAA,EAAmB,EAAE,IAAA,EAAM,CAAA;AACrF,EAAA,OAAO;AAAA,IACL,SAAS,IAAA,IAAQ,IAAA;AAAA,IACjB,OAAA,EAAS,MAAA,KAAW,SAAA,IAAa,MAAA,KAAW,MAAA;AAAA,IAC5C;AAAA,GACF;AACF;ACOA,SAAS,QAAA,CAAS,GAAA,EAA2B,IAAA,GAAO,GAAA,CAAI,IAAA,EAA0B;AAGhF,EAAA,MAAM,MAAA,GAAA,CAAU,GAAA,CAAI,MAAA,IAAU,uBAAA,EAAwB,EAAG,UAAU,SAAA,EAAU,EAAG,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AACjG,EAAA,IAAI,CAAC,QAAQ,OAAO,MAAA;AACpB,EAAA,OAAO,CAAA,EAAG,MAAM,CAAA,EAAG,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,GAAI,IAAA,GAAO,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,CAAA,CAAA;AAC7D;AAGO,SAAS,gBAAgB,OAAA,EAAsC;AACpE,EAAA,OAAA,CAAQ,OAAA,CAAQ,MAAA,EAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,CAAA,IAAK,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA,GAAI,GAAA;AAC5E;AAOO,SAAS,aAAA,CACd,SACA,GAAA,EACyB;AACzB,EAAA,MAAM,GAAA,GAAM,SAAS,GAAG,CAAA;AACxB,EAAA,MAAM,KAAA,GAAQ,gBAAgB,OAAO,CAAA;AACrC,EAAA,OAAO;AAAA,IACL,UAAA,EAAY,oBAAA;AAAA,IACZ,OAAA,EAAS,SAAA;AAAA,IACT,MAAM,OAAA,CAAQ,IAAA;AAAA,IACd,GAAI,QAAQ,WAAA,GAAc,EAAE,aAAa,OAAA,CAAQ,WAAA,KAAgB,EAAC;AAAA,IAClE,GAAI,QAAQ,GAAA,GAAM,EAAE,KAAK,OAAA,CAAQ,GAAA,KAAQ,EAAC;AAAA,IAC1C,GAAI,QAAQ,EAAE,KAAA,EAAO,CAAC,KAAK,CAAA,KAAM,EAAC;AAAA,IAClC,MAAA,EAAQ;AAAA,MACN,OAAA,EAAS,OAAA;AAAA,MACT,GAAI,GAAA,GAAM,EAAE,GAAA,KAAQ,EAAC;AAAA,MACrB,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,aAAA,EAAe,OAAA,CAAQ,QAAA,IAAY,GAAA,CAAI,MAAA,CAAO,QAAA;AAAA,MAC9C,YAAA,EAAA,CACG,OAAA,CAAQ,cAAA,IAAkB,CAAA,IAAK,IAC5B,4BAAA,GACA;AAAA;AACR,GACF;AACF;AAGO,SAAS,UAAA,CAAW,SAAkB,GAAA,EAA4C;AACvF,EAAA,MAAM,GAAA,GAAM,SAAS,GAAG,CAAA;AACxB,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,GAAA,EAAK,GAAG,CAAA;AAC9B,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,GAAA,EAAK,GAAA,CAAI,OAAO,WAAW,CAAA;AACpD,EAAA,OAAO;AAAA,IACL,OAAO,CAAA,EAAG,OAAA,CAAQ,IAAI,CAAA,QAAA,EAAM,GAAA,CAAI,OAAO,IAAI,CAAA,CAAA;AAAA,IAC3C,WAAA,EAAa,OAAA,CAAQ,WAAA,EAAa,KAAA,CAAM,GAAG,GAAG,CAAA;AAAA,IAC9C,SAAA,EAAW,GAAA;AAAA,IACX,KAAA,EAAO,gBAAgB,OAAO,CAAA;AAAA,IAC9B,IAAA,EAAM,SAAA;AAAA,IACN,MAAA,EAAQ;AAAA,MACN,aAAA,CAAc,SAAS,GAAG,CAAA;AAAA,MAC1B,GAAI,IAAA,IAAQ,OAAA,IAAW,GAAA,GACnB;AAAA,QACE,gBAAA,CAAiB;AAAA,UACf,EAAE,IAAA,EAAM,GAAA,CAAI,MAAA,CAAO,IAAA,EAAM,KAAK,IAAA,EAAK;AAAA,UACnC,EAAE,IAAA,EAAM,MAAA,EAAQ,GAAA,EAAK,OAAA,EAAQ;AAAA,UAC7B,EAAE,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAM,GAAA;AAAI,SAC3B;AAAA,UAEH;AAAC;AACP,GACF;AACF;AAGO,SAAS,OAAA,CACd,KACA,KAAA,EACiB;AACjB,EAAA,OAAO,EAAE,GAAG,KAAA,EAAO,SAAA,EAAW,SAAS,GAAG,CAAA,EAAG,MAAM,SAAA,EAAU;AAC/D;AC5FO,SAAS,aAAA,CAAc,EAAE,KAAA,EAAO,QAAA,EAAU,GAAA,GAAM,GAAG,GAAA,EAAK,MAAA,EAAQ,SAAA,EAAW,SAAA,EAAU,EAAuB;AACjH,EAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAc,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,GAAA,IAAO,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAG,IAAI,CAAC,CAAA;AAI7E,EAAA,uBACEM,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4CAAA,EACb,QAAA,EAAA;AAAA,oBAAAN,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,aAAA,EAAa,SAAA;AAAA,QACb,YAAA,EAAW,qBAAA;AAAA,QACX,SAAS,MAAM,QAAA,CAAS,KAAA,CAAM,KAAA,GAAQ,CAAC,CAAC,CAAA;AAAA,QACxC,SAAA,EAAU,+IAAA;AAAA,QACV,UAAU,KAAA,IAAS,GAAA;AAAA,QAEnB,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAM,SAAA,EAAU,aAAA,EAAc;AAAA;AAAA,KACjC;AAAA,oBACAA,GAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,aAAA,EAAa,MAAA;AAAA,QACb,IAAA,EAAK,QAAA;AAAA,QACL,KAAA;AAAA,QACA,GAAA;AAAA,QACA,GAAA;AAAA,QACA,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,UAAA,MAAM,CAAA,GAAI,QAAA,CAAS,CAAA,CAAE,MAAA,CAAO,OAAO,EAAE,CAAA;AACrC,UAAA,IAAI,CAAC,KAAA,CAAM,CAAC,GAAG,QAAA,CAAS,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,QAClC,CAAA;AAAA,QACA,SAAA,EAAU;AAAA;AAAA,KACZ;AAAA,oBACAA,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,aAAA,EAAa,SAAA;AAAA,QACb,YAAA,EAAW,qBAAA;AAAA,QACX,SAAS,MAAM,QAAA,CAAS,KAAA,CAAM,KAAA,GAAQ,CAAC,CAAC,CAAA;AAAA,QACxC,SAAA,EAAU,+IAAA;AAAA,QACV,QAAA,EAAU,GAAA,IAAO,IAAA,IAAQ,KAAA,IAAS,GAAA;AAAA,QAElC,QAAA,kBAAAA,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,aAAA,EAAc;AAAA;AAAA;AAChC,GAAA,EACF,CAAA;AAEJ;AC5CO,SAAS,qBAAA,CAAsB,EAAE,MAAA,EAAQ,KAAA,EAAO,UAAS,EAA+B;AAC7F,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAEhC,EAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACZ,iBAAO,GAAA,CAAI,CAAC,KAAA,qBACXM,KAAC,KAAA,EAAA,EAAmB,aAAA,EAAa,IAAI,kBAAA,CAAmB,KAAA,CAAM,EAAE,CAAA,EAC9D,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8CAAA,EACb,QAAA,EAAA;AAAA,sBAAAN,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,qBAAA,EAAuB,gBAAM,KAAA,EAAM,CAAA;AAAA,MAC/C,KAAA,CAAM,KAAA,CAAM,KAAK,CAAA,oBAChBA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,wCAAA,EAA0C,QAAA,EAAA,KAAA,CAAM,KAAA,CAAM,KAAK,CAAA,EAAE;AAAA,KAAA,EAE9E,CAAA;AAAA,oBACAA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBACZ,QAAA,EAAA,KAAA,CAAM,MAAA,CAAO,GAAA,CAAI,CAAC,MAAA,KAAW;AAC5B,MAAA,MAAM,QAAA,GAAW,KAAA,CAAM,KAAA,CAAM,KAAK,CAAA,KAAM,MAAA;AACxC,MAAA,uBACEA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UAEC,IAAA,EAAK,QAAA;AAAA,UACL,aAAA,EAAa,GAAA,CAAI,kBAAA,CAAmB,KAAA,CAAM,IAAI,MAAM,CAAA;AAAA,UACpD,cAAA,EAAc,QAAA;AAAA,UACd,OAAA,EAAS,MAAM,QAAA,CAAS,EAAE,GAAG,KAAA,EAAO,CAAC,KAAA,CAAM,KAAK,GAAG,MAAA,EAAQ,CAAA;AAAA,UAC3D,SAAA,EAAW;AAAA,YACT,yEAAA;AAAA,YACA,WACI,mDAAA,GACA;AAAA,WACN,CAAE,KAAK,GAAG,CAAA;AAAA,UAET,QAAA,EAAA;AAAA,SAAA;AAAA,QAZI;AAAA,OAaP;AAAA,IAEJ,CAAC,CAAA,EACH;AAAA,GAAA,EAAA,EA5BQ,KAAA,CAAM,EA6BhB,CACD,CAAA,EACH,CAAA;AAEJ;AC1CA,IAAM,aAAA,uBAAoB,GAAA,CAAI;AAAA,EAC5B,SAAA;AAAA,EAAW,OAAA;AAAA,EAAS,QAAA;AAAA,EACpB,mBAAA;AAAA,EAAqB,QAAA;AAAA,EAAU,UAAA;AAAA,EAAY,WAAA;AAAA,EAAa,UAAA;AAAA,EAAY,MAAA;AAAA;AAAA;AAAA;AAAA,EAIpE,YAAA;AAAA,EAAc,SAAA;AAAA,EAAW,UAAA;AAAA,EAAY,WAAA;AAAA,EAAa;AACpD,CAAC,CAAA;AAGD,SAAS,aAAA,CAAc,KAAa,KAAA,EAAsC;AACxE,EAAA,OAAO,aAAA,CAAc,GAAA,CAAI,GAAG,CAAA,IAAK,OAAO,GAAA,CAAI,GAAG,CAAA,KAAM,IAAA,IAAQ,IAAI,UAAA,CAAW,GAAG,CAAA,IAAK,GAAA,CAAI,WAAW,MAAM,CAAA;AAC3G;AAGA,IAAM,MAAA,GAAiC;AAAA,EACrC,QAAA,EAAU,KAAA;AAAA,EACV,KAAA,EAAO,KAAA;AAAA,EACP,WAAA,EAAa,cAAA;AAAA,EACb,GAAA,EAAK,UAAA;AAAA,EACL,QAAA,EAAU,UAAA;AAAA,EACV,OAAA,EAAS,OAAA;AAAA,EACT,MAAA,EAAQ,WAAA;AAAA,EACR,KAAA,EAAO,KAAA;AAAA,EACP,OAAA,EAAS,oBAAA;AAAA,EACT,GAAA,EAAK,mBAAA;AAAA,EACL,MAAA,EAAQ,QAAA;AAAA,EACR,KAAA,EAAO,OAAA;AAAA,EACP,MAAA,EAAQ,QAAA;AAAA,EACR,QAAA,EAAU,UAAA;AAAA,EACV,UAAA,EAAY;AACd,CAAA;AAEA,SAAS,QAAA,CAAS,KAAa,KAAA,EAAkD;AAC/E,EAAA,IAAI,KAAA,GAAQ,GAAG,CAAA,EAAG,OAAO,MAAM,GAAG,CAAA;AAClC,EAAA,IAAI,MAAA,CAAO,GAAG,CAAA,EAAG,OAAO,OAAO,GAAG,CAAA;AAClC,EAAA,MAAM,MAAA,GAAS,GAAA,CAAI,OAAA,CAAQ,oBAAA,EAAsB,OAAO,EAAE,OAAA,CAAQ,QAAA,EAAU,GAAG,CAAA,CAAE,IAAA,EAAK;AACtF,EAAA,OAAO,MAAA,CAAO,OAAO,CAAC,CAAA,CAAE,aAAY,GAAI,MAAA,CAAO,MAAM,CAAC,CAAA;AACxD;AAEA,SAAS,eAAe,KAAA,EAA+B;AACrD,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA,CAAM,MAAK,IAAK,IAAA;AACtD,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,OAAO,KAAK,CAAA;AAClD,EAAA,IAAI,OAAO,KAAA,KAAU,SAAA,EAAW,OAAO,QAAQ,KAAA,GAAQ,QAAA;AACvD,EAAA,OAAO,IAAA;AACT;AAIO,SAAS,YAAA,CAAa,EAAE,OAAA,EAAQ,EAAyB;AAC9D,EAAA,MAAM,SAAS,mBAAA,EAAoB;AAInC,EAAA,MAAM,gBAAgBD,MAAAA,CAAM,OAAA;AAAA,IAC1B,MAAM,IAAI,GAAA,CAAI,OAAO,YAAA,EAAc,OAAA,IAAW,EAAE,CAAA;AAAA,IAChD,CAAC,MAAA,CAAO,YAAA,EAAc,OAAO;AAAA,GAC/B;AACA,EAAA,MAAM,WAAA,GAAc,OAAO,YAAA,EAAc,MAAA;AAEzC,EAAA,MAAM,OAAgC,EAAC;AACvC,EAAA,IAAI,OAAA,CAAQ,KAAK,IAAA,CAAK,IAAA,CAAK,CAAC,KAAA,EAAO,OAAA,CAAQ,GAAG,CAAC,CAAA;AAC/C,EAAA,IAAI,OAAA,CAAQ,cAAc,IAAA,CAAK,IAAA,CAAK,CAAC,WAAA,EAAa,OAAA,CAAQ,YAAY,CAAC,CAAA;AACvE,EAAA,IAAI,OAAA,CAAQ,MAAA,IAAU,IAAA,EAAM,IAAA,CAAK,KAAK,CAAC,MAAA,EAAQ,CAAA,EAAG,OAAA,CAAQ,MAAM,CAAA,CAAA,EAAI,OAAA,CAAQ,UAAU,EAAE,CAAC,CAAA;AACzF,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,MAAA,CAAO,QAAQ,OAAA,CAAQ,QAAA,IAAY,EAAE,CAAA,EAAG;AACjE,IAAA,IAAI,aAAA,CAAc,GAAA,EAAK,aAAa,CAAA,EAAG;AACvC,IAAA,MAAM,GAAA,GAAM,eAAe,KAAK,CAAA;AAChC,IAAA,IAAI,GAAA,OAAU,IAAA,CAAK,CAAC,SAAS,GAAA,EAAK,WAAW,CAAA,EAAG,GAAG,CAAC,CAAA;AAAA,EACtD;AACA,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAE9B,EAAA,uBACEO,IAAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAU,OAAA,EACjB,QAAA,EAAA;AAAA,oBAAAN,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,iDAAA,EAAkD,QAAA,EAAA,sBAAA,EAAc,CAAA;AAAA,oBAC9EA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,mCAAA,EACX,eAAK,GAAA,CAAI,CAAC,CAAC,KAAA,EAAO,KAAK,CAAA,qBACtBM,IAAAA,CAAC,KAAA,EAAA,EAAgB,WAAU,+DAAA,EACzB,QAAA,EAAA;AAAA,sBAAAN,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uBAAA,EAAyB,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,sBAC7CA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,0BAA0B,QAAA,EAAA,KAAA,EAAM;AAAA,KAAA,EAAA,EAFtC,KAGV,CACD,CAAA,EACH;AAAA,GAAA,EACF,CAAA;AAEJ;AClDA,SAAS,UAAA,CAAW,SAAkB,GAAA,EAAgD;AACpF,EAAA,OAAO,GAAA,CAAI,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,OAAA,KAAY,OAAA,CAAQ,IAAA,IAAQ,CAAA,CAAE,OAAA,KAAY,OAAA,CAAQ,GAAG,CAAA;AAClF;AAEA,SAAS,QAAQ,IAAA,EAAwC;AACvD,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,CAAA;AAC9B,EAAA,OAAO,IAAA,CAAK,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,MAAM,CAAA,CAAE,MAAA,EAAQ,CAAC,CAAA,GAAI,IAAA,CAAK,MAAA;AAC3D;AAEA,SAAS,KAAA,CAAM,EAAE,KAAA,EAAO,KAAA,EAAM,EAAsC;AAClE,EAAA,uBACEA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kCAAA,EAAmC,MAAK,KAAA,EAAM,YAAA,EAAY,KAAA,IAAS,CAAA,EAAG,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,KAAA,CAAA,EACnG,QAAA,EAAA,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,qBACpBA,GAAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MAEC,aAAA,EAAW,IAAA;AAAA,MACX,SAAA,EAAU,SAAA;AAAA,MAGV,MAAM,CAAA,IAAK,IAAA,CAAK,KAAA,CAAM,KAAK,IAAI,cAAA,GAAiB,MAAA;AAAA,MAChD,WAAA,EAAa;AAAA,KAAA;AAAA,IANR;AAAA,GAQR,CAAA,EACH,CAAA;AAEJ;AAEO,SAAS,cAAA,CAAe,EAAE,OAAA,EAAQ,EAAyB;AAChE,EAAA,MAAM,SAAS,mBAAA,EAAoB;AACnC,EAAA,MAAM,UAAU,MAAA,CAAO,OAAA;AACvB,EAAA,IAAI,CAAC,OAAA,IAAW,OAAA,CAAQ,OAAA,KAAY,OAAO,OAAO,IAAA;AAElD,EAAA,MAAM,OAAO,UAAA,CAAW,OAAA,EAAS,OAAA,CAAQ,KAAA,IAAS,EAAE,CAAA;AACpD,EAAA,MAAM,GAAA,GAAM,QAAQ,IAAI,CAAA;AAExB,EAAA,MAAM,OAAA,GAAU,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,IAC7C,IAAA;AAAA,IACA,KAAA,EAAO,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KAAM,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,MAAM,CAAA,KAAM,IAAI,CAAA,CAAE;AAAA,GAC3D,CAAE,CAAA;AAEF,EAAA,uBACEM,IAAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAU,sBAAA,EAAuB,eAAY,iBAAA,EACpD,QAAA,EAAA;AAAA,oBAAAN,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,iDAAA,EAAkD,QAAA,EAAA,kBAAA,EAAU,CAAA;AAAA,IAEzE,IAAA,CAAK,MAAA,KAAW,CAAA,mBACfA,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,oCAAA,EACV,QAAA,EAAA,OAAA,CAAQ,aAAa,yFAAA,EACxB,CAAA,mBAEAM,IAAAA,CAAAO,UAAA,EACE,QAAA,EAAA;AAAA,sBAAAP,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gEAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EACb,QAAA,EAAA;AAAA,0BAAAN,GAAAA,CAAC,OAAE,SAAA,EAAU,iCAAA,EAAkC,eAAY,iBAAA,EACxD,QAAA,EAAA,GAAA,CAAI,OAAA,CAAQ,CAAC,CAAA,EAChB,CAAA;AAAA,0BACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mBAAA,EACb,0BAAAA,GAAAA,CAAC,KAAA,EAAA,EAAM,KAAA,EAAO,GAAA,EAAK,CAAA,EACrB,CAAA;AAAA,0BACAM,IAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,oCAAA,EACV,QAAA,EAAA;AAAA,YAAA,IAAA,CAAK,MAAA;AAAA,YAAO,GAAA;AAAA,YAAE,IAAA,CAAK,MAAA,KAAW,CAAA,GAAI,iBAAA,GAAc;AAAA,WAAA,EACnD;AAAA,SAAA,EACF,CAAA;AAAA,wBAEAN,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,0BAAA,EACX,kBAAQ,GAAA,CAAI,CAAC,EAAE,IAAA,EAAM,OAAM,qBAC1BM,IAAAA,CAAC,KAAA,EAAA,EAAe,WAAU,iCAAA,EACxB,QAAA,EAAA;AAAA,0BAAAA,IAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,oCAAA,EAAsC,QAAA,EAAA;AAAA,YAAA,IAAA;AAAA,YAAK;AAAA,WAAA,EAAC,CAAA;AAAA,0BAC1DN,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,oDACZ,QAAA,kBAAAA,GAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,gCAAA;AAAA,cACV,KAAA,EAAO,EAAE,KAAA,EAAO,CAAA,EAAG,IAAA,CAAK,MAAA,GAAU,KAAA,GAAQ,IAAA,CAAK,MAAA,GAAU,GAAA,GAAM,CAAC,CAAA,CAAA,CAAA;AAAI;AAAA,WACtE,EACF,CAAA;AAAA,0BACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iDAAiD,QAAA,EAAA,KAAA,EAAM;AAAA,SAAA,EAAA,EAR/D,IASV,CACD,CAAA,EACH;AAAA,OAAA,EACF,CAAA;AAAA,sBAEAA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,gBAAA,EACX,QAAA,EAAA,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,qBACTM,IAAAA,CAAC,IAAA,EAAA,EAAc,WAAU,+BAAA,EACvB,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6CAAA,EACb,QAAA,EAAA;AAAA,0BAAAN,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,cAAA,EACd,QAAA,kBAAAA,IAAC,KAAA,EAAA,EAAM,KAAA,EAAO,CAAA,CAAE,MAAA,EAAQ,CAAA,EAC1B,CAAA;AAAA,0BACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EAAyB,YAAE,MAAA,EAAO,CAAA;AAAA,UACjD,EAAE,QAAA,oBACDA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qFAAoF,QAAA,EAAA,mBAAA,EAEpG,CAAA;AAAA,UAED,EAAE,IAAA,oBACDA,IAAC,MAAA,EAAA,EAAK,QAAA,EAAU,EAAE,IAAA,EAAM,SAAA,EAAU,+BAAA,EAC/B,QAAA,EAAA,IAAI,KAAK,CAAA,CAAE,IAAI,EAAE,kBAAA,CAAmB,MAAA,CAAO,MAAM,CAAA,EACpD;AAAA,SAAA,EAEJ,CAAA;AAAA,QACC,CAAA,CAAE,yBAASA,GAAAA,CAAC,OAAE,SAAA,EAAU,4BAAA,EAA8B,YAAE,KAAA,EAAM,CAAA;AAAA,wBAC/DA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,oDAAA,EAAsD,YAAE,IAAA,EAAK;AAAA,OAAA,EAAA,EAlBnE,CAAA,CAAE,EAmBX,CACD,CAAA,EACH;AAAA,KAAA,EACF;AAAA,GAAA,EAEJ,CAAA;AAEJ;AChJO,SAAS,YAAY,IAAA,EAK1B;AACA,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIE,QAAAA,CAAoB,EAAE,CAAA;AACtD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAAS,IAAI,CAAA;AAC3C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAwB,IAAI,CAAA;AACtD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAS,CAAC,CAAA;AACpC,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AAE/B,EAAAJ,UAAU,MAAM;AACd,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAAJ,eAAAA,EAAgB,CACb,YAAA,CAAa,IAAA,CAAK,KAAA,CAAM,GAAG,CAAwB,CAAA,CACnD,IAAA,CAAK,CAAC,IAAA,KAAS;AACd,MAAA,IAAI,SAAA,EAAW;AACf,MAAA,WAAA,CAAY,IAAI,CAAA;AAChB,MAAA,QAAA,CAAS,IAAI,CAAA;AAAA,IACf,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,CAAA,KAAe;AACrB,MAAA,IAAI,CAAC,WAAW,QAAA,CAAS,CAAA,YAAa,QAAQ,CAAA,CAAE,OAAA,GAAU,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,IACrE,CAAC,CAAA,CACA,OAAA,CAAQ,MAAM;AACb,MAAA,IAAI,CAAC,SAAA,EAAW,UAAA,CAAW,KAAK,CAAA;AAAA,IAClC,CAAC,CAAA;AACH,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AAAA,IACd,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,GAAA,EAAK,KAAK,CAAC,CAAA;AAEf,EAAA,OAAO,EAAE,QAAA,EAAU,OAAA,EAAS,KAAA,EAAO,MAAA,EAAQ,MAAM,QAAA,CAAS,CAAC,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA,EAAE;AAC1E;ACzBA,SAAS,cAAA,CAAe,QAAgB,OAAA,EAA0B;AAChE,EAAA,OAAO,CAAA,EAAG,MAAM,CAAA,EAAA,EAAK,OAAA,CAAQ,IAAI,CAAA,CAAA;AACnC;AAEA,SAAS,iBAAA,CAAkB,KAAa,OAAA,EAA0B;AAChE,EAAA,MAAM,IAAA,GAAO,kBAAA,CAAmB,CAAA,2CAAA,EAA8C,OAAA,CAAQ,IAAI,CAAA,CAAA,CAAG,CAAA;AAC7F,EAAA,MAAM,GAAA,GAAM,GAAA,CAAI,QAAA,CAAS,GAAG,IAAI,GAAA,GAAM,GAAA;AACtC,EAAA,OAAO,CAAA,EAAG,GAAG,CAAA,EAAG,GAAG,QAAQ,IAAI,CAAA,CAAA;AACjC;AAEO,SAAS,kBAAA,CAAmB,EAAE,OAAA,EAAS,SAAA,EAAU,EAA4B;AAClF,EAAA,MAAM,SAAS,mBAAA,EAAoB;AACnC,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIQ,SAAS,EAAE,CAAA;AACnD,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIA,SAAS,EAAE,CAAA;AACrD,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIA,SAAS,EAAE,CAAA;AACrD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,QAAAA,CAAS,eAAe,MAAA,CAAO,OAAA,CAAQ,aAAA,EAAe,OAAO,CAAC,CAAA;AAC5F,EAAA,MAAM,CAAC,SAAS,UAAU,CAAA,GAAIA,SAAS,CAAA,oCAAA,EAAuC,OAAA,CAAQ,IAAI,CAAA,CAAA,CAAG,CAAA;AAC7F,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,SAAsD,MAAM,CAAA;AACxF,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAEtD,EAAA,MAAM,MAAA,GAAS,OAAO,KAAA,KAA2B;AAC/C,IAAA,KAAA,CAAM,cAAA,EAAe;AACrB,IAAA,SAAA,CAAU,YAAY,CAAA;AACtB,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,IAAI;AACF,MAAA,MAAM,WAAWR,eAAAA,EAAgB;AACjC,MAAA,IAAI,SAAS,oBAAA,EAAsB;AACjC,QAAA,MAAM,SAAS,oBAAA,CAAqB;AAAA,UAClC,WAAW,OAAA,CAAQ,EAAA;AAAA,UACnB,aAAa,OAAA,CAAQ,IAAA;AAAA,UACrB,aAAa,OAAA,CAAQ,IAAA;AAAA,UACrB,YAAA;AAAA,UACA,aAAA;AAAA,UACA,eAAe,aAAA,IAAiB,KAAA,CAAA;AAAA,UAChC,OAAA;AAAA,UACA,OAAA;AAAA,UACA,WAAW,OAAO,MAAA,KAAW,WAAA,GAAc,KAAA,CAAA,GAAY,OAAO,QAAA,CAAS,IAAA;AAAA,UACvE,UAAU,EAAE,GAAA,EAAK,QAAQ,GAAA,EAAK,YAAA,EAAc,QAAQ,YAAA;AAAa,SAClE,CAAA;AAAA,MACH,CAAA,MAAA,IAAW,MAAA,CAAO,OAAA,CAAQ,KAAA,EAAO;AAC/B,QAAA,MAAA,CAAO,QAAA,CAAS,IAAA,GAAO,CAAA,OAAA,EAAU,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,SAAA,EAAY,kBAAA,CAAmB,OAAO,CAAC,CAAA,MAAA,EAAS,kBAAA,CAAmB,OAAO,CAAC,CAAA,CAAA;AAAA,MAClI;AACA,MAAA,SAAA,CAAU,SAAS,CAAA;AACnB,MAAA,SAAA,IAAY;AAAA,IACd,SAAS,CAAA,EAAG;AACV,MAAA,SAAA,CAAU,OAAO,CAAA;AACjB,MAAA,QAAA,CAAS,aAAa,KAAA,GAAQ,CAAA,CAAE,OAAA,GAAU,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,IACrD;AAAA,EACF,CAAA;AAEA,EAAA,uBACEY,IAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACE,GAAG,6BAA6B,aAAA,CAAc,WAAA;AAAA,MAC/C,QAAA,EAAU,MAAA;AAAA,MACV,SAAA,EAAU,WAAA;AAAA,MAEV,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACb,QAAA,EAAA;AAAA,0BAAAA,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,iCAAA,EACf,QAAA,EAAA;AAAA,4BAAAN,GAAAA,CAAC,UAAK,QAAA,EAAA,WAAA,EAAS,CAAA;AAAA,4BACfA,GAAAA;AAAA,cAAC,OAAA;AAAA,cAAA;AAAA,gBACC,eAAa,GAAA,CAAI,WAAA;AAAA,gBACjB,QAAA,EAAQ,IAAA;AAAA,gBACR,KAAA,EAAO,YAAA;AAAA,gBACP,UAAU,CAAC,CAAA,KAAM,eAAA,CAAgB,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,gBAC/C,SAAA,EAAU,yEAAA;AAAA,gBACV,KAAA,EAAO,EAAE,YAAA,EAAc,wBAAA;AAAyB;AAAA;AAClD,WAAA,EACF,CAAA;AAAA,0BACAM,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,iCAAA,EACf,QAAA,EAAA;AAAA,4BAAAN,GAAAA,CAAC,UAAK,QAAA,EAAA,YAAA,EAAU,CAAA;AAAA,4BAChBA,GAAAA;AAAA,cAAC,OAAA;AAAA,cAAA;AAAA,gBACC,eAAa,GAAA,CAAI,YAAA;AAAA,gBACjB,QAAA,EAAQ,IAAA;AAAA,gBACR,IAAA,EAAK,OAAA;AAAA,gBACL,KAAA,EAAO,aAAA;AAAA,gBACP,UAAU,CAAC,CAAA,KAAM,gBAAA,CAAiB,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,gBAChD,SAAA,EAAU,yEAAA;AAAA,gBACV,KAAA,EAAO,EAAE,YAAA,EAAc,wBAAA;AAAyB;AAAA;AAClD,WAAA,EACF;AAAA,SAAA,EACF,CAAA;AAAA,wBACAM,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,uCAAA,EACf,QAAA,EAAA;AAAA,0BAAAA,KAAC,MAAA,EAAA,EAAK,QAAA,EAAA;AAAA,YAAA,OAAA;AAAA,YAAM,MAAA,CAAO,OAAA,CAAQ,YAAA,GAAe,EAAA,GAAK;AAAA,WAAA,EAAc,CAAA;AAAA,0BAC7DN,GAAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACC,eAAa,GAAA,CAAI,YAAA;AAAA,cACjB,QAAA,EAAU,OAAO,OAAA,CAAQ,YAAA;AAAA,cACzB,KAAA,EAAO,aAAA;AAAA,cACP,UAAU,CAAC,CAAA,KAAM,gBAAA,CAAiB,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,cAChD,SAAA,EAAU,yEAAA;AAAA,cACV,KAAA,EAAO,EAAE,YAAA,EAAc,wBAAA;AAAyB;AAAA;AAClD,SAAA,EACF,CAAA;AAAA,wBACAM,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,uCAAA,EACf,QAAA,EAAA;AAAA,0BAAAN,GAAAA,CAAC,UAAK,QAAA,EAAA,SAAA,EAAO,CAAA;AAAA,0BACbA,GAAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACC,eAAa,GAAA,CAAI,cAAA;AAAA,cACjB,QAAA,EAAQ,IAAA;AAAA,cACR,KAAA,EAAO,OAAA;AAAA,cACP,UAAU,CAAC,CAAA,KAAM,UAAA,CAAW,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,cAC1C,SAAA,EAAU,yEAAA;AAAA,cACV,KAAA,EAAO,EAAE,YAAA,EAAc,wBAAA;AAAyB;AAAA;AAClD,SAAA,EACF,CAAA;AAAA,wBACAM,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,uCAAA,EACf,QAAA,EAAA;AAAA,0BAAAN,GAAAA,CAAC,UAAK,QAAA,EAAA,SAAA,EAAO,CAAA;AAAA,0BACbA,GAAAA;AAAA,YAAC,UAAA;AAAA,YAAA;AAAA,cACC,eAAa,GAAA,CAAI,cAAA;AAAA,cACjB,QAAA,EAAQ,IAAA;AAAA,cACR,IAAA,EAAM,CAAA;AAAA,cACN,KAAA,EAAO,OAAA;AAAA,cACP,UAAU,CAAC,CAAA,KAAM,UAAA,CAAW,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,cAC1C,SAAA,EAAU,qFAAA;AAAA,cACV,KAAA,EAAO,EAAE,YAAA,EAAc,wBAAA;AAAyB;AAAA;AAClD,SAAA,EACF,CAAA;AAAA,wBACAM,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EACb,QAAA,EAAA;AAAA,0BAAAA,IAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,eAAa,GAAA,CAAI,aAAA;AAAA,cACjB,IAAA,EAAK,QAAA;AAAA,cACL,UAAU,MAAA,KAAW,YAAA;AAAA,cACrB,SAAA,EAAU,2IAAA;AAAA,cACV,KAAA,EAAO,EAAE,YAAA,EAAc,yBAAA,EAA0B;AAAA,cAEjD,QAAA,EAAA;AAAA,gCAAAN,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,gBACzB,MAAA,KAAW,eAAe,YAAA,GAAe;AAAA;AAAA;AAAA,WAC5C;AAAA,UACC,MAAA,CAAO,OAAA,CAAQ,WAAA,oBACdM,IAAAA;AAAA,YAAC,GAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAM,iBAAA,CAAkB,MAAA,CAAO,OAAA,CAAQ,aAAa,OAAO,CAAA;AAAA,cAC3D,MAAA,EAAO,QAAA;AAAA,cACP,GAAA,EAAI,YAAA;AAAA,cACJ,SAAA,EAAU,wGAAA;AAAA,cACV,KAAA,EAAO,EAAE,YAAA,EAAc,yBAAA,EAA0B;AAAA,cAEjD,QAAA,EAAA;AAAA,gCAAAN,GAAAA,CAAC,aAAA,EAAA,EAAc,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,gBAAE;AAAA;AAAA;AAAA,WAEvC;AAAA,UAED,MAAA,CAAO,OAAA,CAAQ,KAAA,oBACdM,IAAAA;AAAA,YAAC,GAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAM,CAAA,OAAA,EAAU,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,SAAA,EAAY,kBAAA,CAAmB,OAAO,CAAC,CAAA,MAAA,EAAS,kBAAA,CAAmB,OAAO,CAAC,CAAA,CAAA;AAAA,cAC/G,SAAA,EAAU,wGAAA;AAAA,cACV,KAAA,EAAO,EAAE,YAAA,EAAc,yBAAA,EAA0B;AAAA,cAEjD,QAAA,EAAA;AAAA,gCAAAN,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,gBAAE;AAAA;AAAA;AAAA;AAE9B,SAAA,EAEJ,CAAA;AAAA,QACC,MAAA,KAAW,SAAA,oBACVA,GAAAA,CAAC,GAAA,EAAA,EAAE,aAAA,EAAa,GAAA,CAAI,cAAA,EAAgB,SAAA,EAAU,sCAAA,EAC3C,QAAA,EAAA,MAAA,CAAO,OAAA,CAAQ,cAAA,EAClB,CAAA;AAAA,QAED,KAAA,oBACCA,GAAAA,CAAC,GAAA,EAAA,EAAE,eAAa,GAAA,CAAI,YAAA,EAAc,SAAA,EAAU,kCAAA,EACzC,QAAA,EAAA,KAAA,EACH;AAAA;AAAA;AAAA,GAEJ;AAEJ;ACpJO,SAAS,eAAe,EAAE,OAAA,EAAS,QAAQ,YAAA,EAAc,KAAA,GAAQ,WAAU,EAAwB;AACxG,EAAA,MAAM,OAAA,GAAU,kBAAA,CAAmB,MAAA,EAAQ,YAAA,EAAc,KAAK,CAAA;AAC9D,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIE,SAAS,CAAC,CAAA;AACpC,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,SAA0C,IAAI,CAAA;AACtE,EAAA,MAAM,QAAA,GAAWC,OAAuB,IAAI,CAAA;AAC5C,EAAA,MAAM,WAAW,WAAA,EAAY;AAI7B,EAAAL,UAAU,MAAM;AAAE,IAAA,QAAA,CAAS,CAAC,CAAA;AAAG,IAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,EAAE,CAAA,EAAG,CAAC,OAAA,CAAQ,EAAE,CAAC,CAAA;AAE5D,EAAA,MAAM,OAAA,GAAU,QAAQ,IAAA,CAAK,GAAA,CAAI,OAAO,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAC,CAAA;AAE3D,EAAA,SAAS,aAAa,KAAA,EAAyC;AAC7D,IAAA,IAAI,CAAC,QAAA,EAAU;AACf,IAAA,MAAM,QAAQ,QAAA,CAAS,OAAA;AACvB,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,MAAM,IAAA,GAAO,MAAM,qBAAA,EAAsB;AACzC,IAAA,OAAA,CAAQ;AAAA,MACN,IAAK,KAAA,CAAM,OAAA,GAAU,IAAA,CAAK,IAAA,IAAQ,KAAK,KAAA,GAAS,GAAA;AAAA,MAChD,IAAK,KAAA,CAAM,OAAA,GAAU,IAAA,CAAK,GAAA,IAAO,KAAK,MAAA,GAAU;AAAA,KACjD,CAAA;AAAA,EACH;AAEA,EAAA,SAAS,KAAK,KAAA,EAAe;AAC3B,IAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACxB,IAAA,QAAA,CAAS,CAACkB,QAAAA,KAAAA,CAAaA,QAAAA,GAAU,QAAQ,OAAA,CAAQ,MAAA,IAAU,QAAQ,MAAM,CAAA;AACzE,IAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,EACd;AAEA,EAAA,uBACEV,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gCAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,IAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACE,GAAG,6BAA6B,aAAA,CAAc,OAAA;AAAA,QAC/C,GAAA,EAAK,QAAA;AAAA,QAGL,SAAA,EAAU,qEAAA;AAAA,QACV,KAAA,EAAO,EAAE,YAAA,EAAc,uBAAA,EAAwB;AAAA,QAC/C,WAAA,EAAa,YAAA;AAAA,QACb,YAAA,EAAc,MAAM,OAAA,CAAQ,IAAI,CAAA;AAAA,QAChC,SAAA,EAAW,CAAC,KAAA,KAAU;AACpB,UAAA,IAAI,KAAA,CAAM,GAAA,KAAQ,YAAA,EAAc,IAAA,CAAK,CAAC,CAAA;AACtC,UAAA,IAAI,KAAA,CAAM,GAAA,KAAQ,WAAA,EAAa,IAAA,CAAK,EAAE,CAAA;AAAA,QACxC,CAAA;AAAA,QACA,QAAA,EAAU,OAAA,CAAQ,MAAA,GAAS,CAAA,GAAI,CAAA,GAAI,EAAA;AAAA,QACnC,IAAA,EAAM,OAAA,CAAQ,MAAA,GAAS,CAAA,GAAI,OAAA,GAAU,MAAA;AAAA,QACrC,cAAY,OAAA,CAAQ,MAAA,GAAS,IAAI,CAAA,WAAA,EAAc,OAAA,CAAQ,IAAI,CAAA,CAAA,GAAK,MAAA;AAAA,QAWhE,QAAA,EAAA;AAAA,0BAAAN,GAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,0DAAA;AAAA,cACV,OAAO,IAAA,GACH,EAAE,SAAA,EAAW,UAAA,EAAY,iBAAiB,CAAA,EAAG,IAAA,CAAK,CAAC,CAAA,EAAA,EAAK,KAAK,CAAC,CAAA,CAAA,CAAA,EAAI,GAClE,EAAE,WAAW,UAAA,EAAW;AAAA,cAE5B,QAAA,kBAAAA,GAAAA;AAAA,gBAAC,WAAA;AAAA,gBAAA;AAAA,kBAEC,GAAA,EAAK,OAAA,EAAS,GAAA,IAAO,kBAAA,CAAmB,QAAQ,IAAI,CAAA;AAAA,kBACpD,GAAA,EAAK,OAAA,EAAS,OAAA,IAAW,OAAA,CAAQ,IAAA;AAAA,kBACjC,eAAa,GAAA,CAAI,eAAA;AAAA,kBACjB,SAAA,EAAU;AAAA,iBAAA;AAAA,gBAJL,SAAS,EAAA,IAAM;AAAA;AAKtB;AAAA,WACF;AAAA,UAEC,QAAQ,MAAA,GAAS,CAAA,oBAChBM,IAAAA,CAAAO,UAAA,EACE,QAAA,EAAA;AAAA,4BAAAb,GAAAA,CAAC,gBAAa,IAAA,EAAK,MAAA,EAAO,SAAS,MAAM,IAAA,CAAK,EAAE,CAAA,EAAG,QAAA,EAAoB,CAAA;AAAA,4BACvEA,GAAAA,CAAC,YAAA,EAAA,EAAa,IAAA,EAAK,OAAA,EAAQ,SAAS,MAAM,IAAA,CAAK,CAAC,CAAA,EAAG,QAAA,EAAoB,CAAA;AAAA,4BACvEM,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uHAAA,EACb,QAAA,EAAA;AAAA,cAAA,KAAA,GAAQ,CAAA;AAAA,cAAE,GAAA;AAAA,cAAE,OAAA,CAAQ;AAAA,aAAA,EACvB;AAAA,WAAA,EACF;AAAA;AAAA;AAAA,KAEJ;AAAA,IAEC,QAAQ,MAAA,GAAS,CAAA,oBAChBN,GAAAA,CAAC,IAAA,EAAA,EAAG,eAAa,GAAA,CAAI,gBAAA,EAAkB,WAAU,iCAAA,EAC9C,QAAA,EAAA,OAAA,CAAQ,IAAI,CAAC,KAAA,EAAO,6BACnBA,GAAAA,CAAC,QACC,QAAA,kBAAAA,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,eAAa,GAAA,CAAI,eAAA;AAAA,QACjB,YAAA,EAAY,QAAA;AAAA,QACZ,cAAY,CAAA,OAAA,EAAU,QAAA,GAAW,CAAC,CAAA,IAAA,EAAO,QAAQ,MAAM,CAAA,CAAA;AAAA,QACvD,gBAAc,QAAA,KAAa,KAAA;AAAA,QAC3B,SAAS,MAAM;AAAE,UAAA,QAAA,CAAS,QAAQ,CAAA;AAAG,UAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,QAAE,CAAA;AAAA,QACnD,SAAA,EAAW,CAAA,gEAAA,EACT,QAAA,KAAa,KAAA,GAAQ,0CAA0C,4CACjE,CAAA,CAAA;AAAA,QAEA,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,KAAA,CAAM,GAAA,EAAK,GAAA,EAAI,EAAA,EAAG,SAAA,EAAU,4BAAA,EAA6B,OAAA,EAAQ,MAAA,EAAO;AAAA;AAAA,KACpF,EAAA,EAbO,KAAA,CAAM,EAcf,CACD,CAAA,EACH;AAAA,GAAA,EAEJ,CAAA;AAEJ;AAcO,SAAS,kBAAA,CACd,MAAA,EACA,OAAA,EACA,KAAA,GAAmD,SAAA,EACnC;AAChB,EAAA,MAAM,cAAA,GACJ,OAAA,IAAW,IAAA,IAAQ,CAAC,OAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,OAAA,CAAQ,EAAA,IAAM,CAAA,CAAE,GAAA,KAAQ,QAAQ,GAAG,CAAA;AACrF,EAAA,MAAM,GAAA,GAAM,cAAA,GAAiB,CAAC,OAAA,EAAU,GAAG,MAAM,CAAA,GAAI,MAAA,CAAO,MAAA,GAAS,IAAI,MAAA,GAAS,OAAA,GAAU,CAAC,OAAO,IAAI,EAAC;AACzG,EAAA,OAAO,CAAC,GAAG,GAAG,EAAE,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM;AAC7B,IAAA,IAAI,UAAU,QAAA,EAAU,OAAA,CAAQ,EAAE,SAAA,IAAa,CAAA,KAAM,EAAE,SAAA,IAAa,CAAA,CAAA;AACpE,IAAA,IAAI,KAAA,KAAU,aAAa,CAAA,CAAE,SAAA,KAAc,EAAE,SAAA,EAAW,OAAO,CAAA,CAAE,SAAA,GAAY,EAAA,GAAK,CAAA;AAClF,IAAA,OAAA,CAAQ,CAAA,CAAE,SAAA,IAAa,CAAA,KAAM,CAAA,CAAE,SAAA,IAAa,CAAA,CAAA;AAAA,EAC9C,CAAC,CAAA;AACH;AAOA,SAAS,WAAA,GAAuB;AAC9B,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIE,SAAS,KAAK,CAAA;AAC9C,EAAAJ,UAAU,MAAM;AACd,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,UAAA,GAAa,oCAAoC,CAAA;AACtE,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,WAAA,CAAY,MAAM,OAAO,CAAA;AACzB,IAAA,MAAM,QAAA,GAAW,CAAC,KAAA,KAA+B,WAAA,CAAY,MAAM,OAAO,CAAA;AAC1E,IAAA,KAAA,CAAM,gBAAA,GAAmB,UAAU,QAAQ,CAAA;AAC3C,IAAA,OAAO,MAAM,KAAA,CAAM,mBAAA,GAAsB,QAAA,EAAU,QAAQ,CAAA;AAAA,EAC7D,CAAA,EAAG,EAAE,CAAA;AACL,EAAA,OAAO,QAAA;AACT;AAkBA,SAAS,YAAA,CAAa,EAAE,IAAA,EAAM,OAAA,EAAS,UAAS,EAAuE;AACrH,EAAA,uBACEE,GAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,OAAA;AAAA,MACA,YAAA,EAAY,IAAA,KAAS,MAAA,GAAS,iBAAA,GAAoB,mBAAA;AAAA,MAClD,SAAA,EAAW,wKACT,QAAA,GAAW,qDAAA,GAAwD,aACrE,CAAA,CAAA,EAAI,IAAA,KAAS,MAAA,GAAS,QAAA,GAAW,SAAS,CAAA,CAAA;AAAA,MAE1C,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,aAAA,EAAW,IAAA,EAAC,WAAU,sBAAA,EAAwB,QAAA,EAAA,IAAA,KAAS,MAAA,GAAS,QAAA,GAAM,QAAA,EAAI;AAAA;AAAA,GAClF;AAEJ;ACtMO,SAAS,eAAA,CAAgB,EAAE,OAAA,EAAQ,EAAyB;AACjE,EAAA,MAAM,SAAS,mBAAA,EAAoB;AACnC,EAAA,MAAM,UAAU,oBAAA,EAAqB;AACrC,EAAA,MAAM,UAAA,GAAa,wBAAwB,MAAM,CAAA;AACjD,EAAA,MAAM,EAAE,WAAW,IAAA,EAAM,KAAA,EAAO,mBAAkB,GAAI,eAAA,CAAgB,UAAA,CAAW,WAAA,EAAa,WAAW,CAAA;AACzG,EAAA,MAAM,OAA4B,OAAA,CAAQ,UAAA,GACtC,EAAE,UAAA,EAAY,QAAQ,UAAA,EAAY,MAAA,EAAQ,QAAA,EAAU,KAAA,EAAO,GAAE,GAC7D,EAAE,MAAA,EAAQ,QAAA,EAAU,OAAO,CAAA,EAAE;AACjC,EAAA,MAAM,EAAE,QAAA,EAAU,OAAA,EAAQ,GAAI,YAAY,IAAI,CAAA;AAC9C,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,OAAA,CAAQ,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AAEtE,EAAA,IAAI,OAAA,IAAW,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAE5C,EAAA,uBACEM,IAAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAU,OAAA,EACjB,QAAA,EAAA;AAAA,oBAAAN,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,iDAAA,EAAkD,QAAA,EAAA,+BAAA,EAAuB,CAAA;AAAA,oBACvFA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8CACZ,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,qBACZA,GAAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QAEC,OAAA,EAAS,CAAA;AAAA,QACT,MAAA;AAAA,QACA,cAAc,MAAA,CAAO,YAAA;AAAA,QACrB,OAAA;AAAA,QACC,GAAG;AAAA,OAAA;AAAA,MALC,CAAA,CAAE;AAAA,KAOV,CAAA,EACH;AAAA,GAAA,EACF,CAAA;AAEJ;ACpBO,SAAS,iBAAA,CAAkB,EAAE,OAAA,EAAAO,QAAAA,GAAU,OAAM,EAA0B;AAC5E,EAAA,MAAM,SAAS,mBAAA,EAAoB;AACnC,EAAA,MAAM,OAAO,YAAA,EAAa;AAC1B,EAAA,MAAM,WAAW,gBAAA,EAAiB;AAClC,EAAA,MAAM,CAAC,OAAO,QAAQ,CAAA,GAAIL,SAAS,MAAM,gBAAA,CAAiB,QAAA,CAAS,UAAU,CAAC,CAAA;AAE9E,EAAA,MAAM,QAAA,GAAW,eAAe,IAAI,CAAA;AACpC,EAAA,MAAM,KAAA,GAAQ,CAAC,KAAA,KAAkB,WAAA,CAAY,OAAO,MAAA,CAAO,QAAA,EAAU,OAAO,MAAM,CAAA;AAClF,EAAA,MAAM,OAAA,GAAU,SAAS,MAAA,KAAW,SAAA;AAKpC,EAAA,MAAM,QAAA,GAAW,SAAS,MAAA,KAAW,QAAA;AAErC,EAAA,eAAe,OAAO,KAAA,EAAwB;AAC5C,IAAA,KAAA,CAAM,cAAA,EAAe;AACrB,IAAA,MAAM,QAAA,CAAS,OAAA,CAAQ,KAAA,EAAO,QAAQ,CAAA;AAAA,EACxC;AAEA,EAAA,SAAS,IAAI,MAAA,EAAqE;AAChF,IAAA,MAAM,EAAE,UAAA,EAAY,GAAA,EAAK,UAAA,EAAY,KAAI,GAAI,MAAA;AAC7C,IAAA,IAAI,GAAA,IAAO,IAAA,IAAQ,GAAA,IAAO,IAAA,EAAM,OAAO,IAAA;AACvC,IAAA,IAAI,QAAQ,CAAA,KAAM,GAAA,KAAQ,CAAA,IAAK,GAAA,KAAQ,IAAI,OAAO,mBAAA;AAClD,IAAA,IAAI,GAAA,IAAO,IAAA,IAAQ,GAAA,IAAO,IAAA,IAAQ,GAAA,KAAQ,KAAK,OAAO,CAAA,EAAG,GAAG,CAAA,GAAA,EAAM,GAAG,CAAA,cAAA,CAAA;AACrE,IAAA,OAAO,CAAA,EAAG,OAAO,GAAG,CAAA,oBAAA,CAAA;AAAA,EACtB;AAEA,EAAA,uBACEI,IAAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,eAAa,GAAA,CAAI,iBAAA;AAAA,MACjB,SAAA,EAAWC,WAAU,uBAAA,GAA0B,4BAAA;AAAA,MAE9C,QAAA,EAAA;AAAA,QAAA,CAAC,QAAA,oBACAD,IAAAA,CAAAO,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,0BAAAP,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+CAAA,EACb,QAAA,EAAA;AAAA,4BAAAN,GAAAA,CAAC,KAAA,EAAA,EAAM,SAAA,EAAU,sBAAA,EAAuB,CAAA;AAAA,YAAE;AAAA,WAAA,EAE5C,CAAA;AAAA,0BAEAM,IAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAU,MAAA,EAAQ,WAAU,iBAAA,EAChC,QAAA,EAAA;AAAA,4BAAAN,GAAAA;AAAA,cAAC,OAAA;AAAA,cAAA;AAAA,gBACC,eAAa,GAAA,CAAI,gBAAA;AAAA,gBACjB,YAAA,EAAW,KAAA;AAAA,gBACX,SAAA,EAAU,SAAA;AAAA,gBACV,YAAA,EAAa,aAAA;AAAA,gBACb,WAAA,EAAY,WAAA;AAAA,gBACZ,KAAA,EAAO,KAAA;AAAA,gBACP,QAAA,EAAU,CAAC,KAAA,KAAU,QAAA,CAAS,iBAAiB,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,gBAClE,SAAA,EAAU;AAAA;AAAA,aACZ;AAAA,4BACAA,GAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,eAAa,GAAA,CAAI,iBAAA;AAAA,gBACjB,QAAA,EAAU,OAAA;AAAA,gBACV,SAAA,EAAU,wIAAA;AAAA,gBAET,oBAAU,KAAA,GAAQ;AAAA;AAAA;AACrB,WAAA,EACF;AAAA,SAAA,EACF,CAAA;AAAA,QAKD,QAAA,CAAS,KAAA,oBACRA,GAAAA,CAAC,GAAA,EAAA,EAAE,aAAA,EAAa,GAAA,CAAI,aAAA,EAAe,SAAA,EAAU,+BAAA,EAC1C,QAAA,EAAA,QAAA,CAAS,KAAA,EACZ,CAAA;AAAA,QAGD,QAAA,CAAS,2BACRM,IAAAA,CAAC,OAAE,aAAA,EAAa,GAAA,CAAI,eAAA,EAAiB,SAAA,EAAU,6DAAA,EAC7C,QAAA,EAAA;AAAA,0BAAAN,GAAAA,CAAC,MAAA,EAAA,EAAO,SAAA,EAAU,6BAAA,EAA8B,CAAA;AAAA,0BAChDM,KAAC,MAAA,EAAA,EACE,QAAA,EAAA;AAAA,YAAA,CAAC,QAAA,CAAS,OAAA,CAAQ,MAAA,EAAQ,QAAA,CAAS,OAAA,CAAQ,QAAQ,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAAA,YAC9E,SAAS,OAAA,CAAQ,MAAA,IAAU,QAAA,CAAS,OAAA,CAAQ,WAAW,UAAA,GAAQ,EAAA;AAAA,YAC/D,SAAS,OAAA,CAAQ,IAAA;AAAA,YAAK,GAAA;AAAA,YAAE,SAAS,OAAA,CAAQ;AAAA,WAAA,EAC5C;AAAA,SAAA,EACF,CAAA;AAAA,QAGD,QAAA,CAAS,MAAA,KAAW,QAAA,oBACnBN,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,gBAAA,EACX,QAAA,EAAA,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,KAAW;AAChC,UAAA,MAAM,QAAA,GAAW,QAAA,CAAS,cAAA,KAAmB,MAAA,CAAO,MAAA;AACpD,UAAA,MAAM,KAAA,GAAQ,IAAI,MAAM,CAAA;AAGxB,UAAA,MAAM,IAAA,GAAO,iBAAA,CAAkB,MAAA,EAAQ,QAAQ,CAAA;AAC/C,UAAA,uBACEA,GAAAA,CAAC,IAAA,EAAA,EACC,QAAA,kBAAAM,IAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,eAAa,GAAA,CAAI,cAAA;AAAA,cACjB,aAAW,MAAA,CAAO,MAAA;AAAA,cAClB,WAAA,EAAW,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA;AAAA,cACzB,cAAA,EAAc,QAAA;AAAA,cACd,OAAA,EAAS,MAAM,QAAA,CAAS,UAAA,CAAW,OAAO,MAAM,CAAA;AAAA,cAChD,SAAA,EAAW,CAAA,wGAAA,EACT,QAAA,GAAW,6BAAA,GAAgC,iCAC7C,CAAA,CAAA;AAAA,cAEA,QAAA,EAAA;AAAA,gCAAAA,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EACd,QAAA,EAAA;AAAA,kCAAAN,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4BAAA,EACb,iBAAO,OAAA,GAAU,CAAA,EAAG,MAAA,CAAO,OAAO,CAAA,MAAA,EAAM,MAAA,CAAO,IAAI,CAAA,CAAA,GAAK,OAAO,IAAA,EAClE,CAAA;AAAA,kBACC,yBAASA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uCAAuC,QAAA,EAAA,KAAA,EAAM;AAAA,iBAAA,EACzE,CAAA;AAAA,gCACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wBAAA,EACb,mBAAS,CAAA,GAAI,WAAA,GAAW,KAAA,CAAM,IAAI,CAAA,EACrC;AAAA;AAAA;AAAA,WACF,EAAA,EArBO,OAAO,MAsBhB,CAAA;AAAA,QAEJ,CAAC,CAAA,EACH,CAAA;AAAA,QAUD,QAAA,CAAS,MAAA,KAAW,UAAA,oBACnBA,GAAAA,CAAC,GAAA,EAAA,EAAE,aAAA,EAAa,GAAA,CAAI,gBAAA,EAAkB,SAAA,EAAU,+BAAA,EAAgC,QAAA,EAAA,oCAAA,EAEhF,CAAA;AAAA,QAGD,QAAA,CAAS,8BACRA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,eAAa,GAAA,CAAI,aAAA;AAAA,YACjB,SAAS,MAAM;AAAE,cAAA,QAAA,CAAS,KAAA,EAAM;AAAG,cAAA,QAAA,CAAS,EAAE,CAAA;AAAA,YAAE,CAAA;AAAA,YAChD,SAAA,EAAU,4EAAA;AAAA,YACX,QAAA,EAAA;AAAA;AAAA;AAED;AAAA;AAAA,GAEJ;AAEJ;AC3IO,SAAS,iBAAA,CAAkB,EAAE,IAAA,EAAK,EAAqB;AAC5D,EAAA,MAAM,SAAS,mBAAA,EAAoB;AACnC,EAAA,MAAM,UAAU,oBAAA,EAAqB;AACrC,EAAA,MAAM,EAAE,OAAA,EAAS,OAAA,EAAQ,GAAI,WAAW,IAAI,CAAA;AAC5C,EAAA,MAAM,OAAA,GAAU,YAAA,CAAa,CAACL,EAAAA,KAAMA,GAAE,OAAO,CAAA;AAC7C,EAAA,MAAM,CAAC,GAAA,EAAK,MAAM,CAAA,GAAIO,SAAS,CAAC,CAAA;AAChC,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIA,QAAAA,CAAiC,EAAE,CAAA;AAEjF,EAAA,MAAM,YAAA,GAAe,OAAA,GAAU,sBAAA,CAAuB,OAAO,IAAI,EAAC;AAIlE,EAAA,MAAM,OAAO,YAAA,EAAa;AAC1B,EAAA,iBAAA;AAAA,IACE,OAAA,GACI,UAAA,CAAW,OAAA,EAAS,EAAE,MAAA,EAAQ,IAAA,EAAM,CAAA,GACpC,EAAE,KAAA,EAAO,MAAA,CAAO,IAAA;AAAK,GAC3B;AAEA,EAAAJ,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,MAAM,WAAW,MAAA,CAAO,WAAA;AAAA,MACtB,sBAAA,CAAuB,OAAO,CAAA,CAAE,GAAA,CAAI,CAAC,KAAA,KAAU,CAAC,KAAA,CAAM,KAAA,EAAO,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,IAAK,EAAE,CAAC;AAAA,KACrF;AACA,IAAA,kBAAA,CAAmB,QAAQ,CAAA;AAAA,EAC7B,CAAA,EAAG,CAAC,OAAA,EAAS,EAAE,CAAC,CAAA;AAEhB,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,uBACEE,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uCACb,QAAA,kBAAAM,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0CAAA,EACb,QAAA,EAAA;AAAA,sBAAAN,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oCAAA,EAAqC,CAAA;AAAA,sBACpDM,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,wBAAAN,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EAA6B,CAAA;AAAA,wBAC5CA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EAA6B,CAAA;AAAA,wBAC5CA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAA,EAAwB;AAAA,OAAA,EACzC;AAAA,KAAA,EACF,CAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAKEM,IAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,sBAAA,EAAqB,WAAA;AAAA,UACrB,SAAA,EAAU,kDAAA;AAAA,UAEV,QAAA,EAAA;AAAA,4BAAAN,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+BAAA,EAAgC,QAAA,EAAA,4BAAA,EAAuB,CAAA;AAAA,4BACpEA,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAG,GAAA,EAAI,SAAA,EAAU,4CAA2C,QAAA,EAAA,kBAAA,EAAa;AAAA;AAAA;AAAA;AACjF;AAAA,EAEJ;AAEA,EAAA,MAAM,OAAA,GAAU,QAAQ,cAAA,IAAkB,CAAA;AAC1C,EAAA,MAAM,QAAA,GAAW,CAAC,OAAA,IAAW,OAAA,CAAQ,cAAA,IAAkB,CAAA;AACvD,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,CAAA,IAAK,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA;AACzE,EAAA,MAAM,UAAA,GAAa,wBAAwB,MAAM,CAAA;AAIjD,EAAA,MAAM,sBAAA,GAAyB,iBAAA,CAAkB,UAAA,CAAW,aAAa,CAAA;AACzE,EAAA,MAAM,mBAAA,GAAsB,aAAA,CAAc,UAAA,CAAW,aAAa,CAAA;AAGlE,EAAA,MAAM,EAAE,SAAA,EAAW,gBAAA,EAAkB,KAAA,EAAO,sBAAqB,GAAI,eAAA;AAAA,IACnE,UAAA,CAAW,cAAA;AAAA,IACX;AAAA,GACF;AACA,EAAA,MAAM,SAAA,GAAY,MAAM,OAAA,CAAQ,OAAA,EAAS,KAAK,eAAe,CAAA;AAC7D,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,QAAA,CAAS,cAAA,CAAe,4BAA4B,CAAA,EAAG,cAAA,CAAe,EAAE,QAAA,EAAU,QAAA,EAAU,KAAA,EAAO,OAAA,EAAS,CAAA;AAAA,EAC9G,CAAA;AACA,EAAA,MAAM,WAAA,GACJ,OAAA,CAAQ,cAAA,IAAkB,OAAA,CAAQ,iBAAiB,OAAA,CAAQ,KAAA,GACvD,IAAA,CAAK,KAAA,CAAA,CAAO,IAAI,OAAA,CAAQ,KAAA,GAAQ,OAAA,CAAQ,cAAA,IAAkB,GAAG,CAAA,GAC7D,CAAA;AAKN,EAAA,MAAM,WAAA,GAAc,EAAE,OAAA,EAAS,OAAA,EAAS,UAAU,WAAA,EAAY;AAE9D,EAAA,IAAI,sBAAA,EAAwB;AAC1B,IAAA,uBACEA,GAAAA;AAAA,MAAC,sBAAA;AAAA,MAAA;AAAA,QACC,OAAA;AAAA,QACA,MAAA;AAAA,QACA,cAAc,MAAA,CAAO,YAAA;AAAA,QACrB,YAAA,EAAc,KAAA;AAAA,QACd,YAAA;AAAA,QACA,eAAA;AAAA,QACA,kBAAA;AAAA,QACA,QAAA,EAAU,GAAA;AAAA,QACV,WAAA,EAAa,MAAA;AAAA,QACb,OAAA;AAAA,QACA,QAAA;AAAA,QACA,OAAA;AAAA,QACA,SAAA;AAAA,QACA,WAAA;AAAA,QACC,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ;AAEA,EAAA,uBACEM,KAAC,KAAA,EAAA,EAAK,GAAG,6BAA6B,aAAA,CAAc,IAAA,EAAM,WAAU,qCAAA,EAClE,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,IAAA,EAAA,EAAK,EAAA,EAAG,GAAA,EAAI,WAAU,yFAAA,EACrB,QAAA,EAAA;AAAA,sBAAAN,GAAAA,CAACc,WAAAA,EAAA,EAAY,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,MAAE;AAAA,KAAA,EACrC,CAAA;AAAA,oBAEAR,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wDAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAN,GAAAA;AAAA,UAAC,gBAAA;AAAA,UAAA;AAAA,YACC,OAAA;AAAA,YACA,QAAQ,OAAA,CAAQ,MAAA;AAAA,YAChB,YAAA,EAAc,KAAA;AAAA,YACd,MAAA;AAAA,YACA,cAAc,MAAA,CAAO,YAAA;AAAA,YACpB,GAAG;AAAA;AAAA,SACN;AAAA,wBACAA,IAAC,IAAA,EAAA,EAAK,IAAA,EAAK,iBAAgB,IAAA,EAAK,cAAA,EAAe,SAAS,WAAA,EAAa;AAAA,OAAA,EACvE,CAAA;AAAA,sBAEAM,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sDAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wEAAA,EACb,QAAA,EAAA;AAAA,0BAAAN,IAAC,IAAA,EAAA,EAAK,EAAA,EAAG,GAAA,EAAI,SAAA,EAAU,2CAA0C,QAAA,EAAA,WAAA,EAAM,CAAA;AAAA,UACtE,OAAA,CAAQ,YAAA,oBACPM,IAAAA,CAAAO,UAAA,EACE,QAAA,EAAA;AAAA,4BAAAb,GAAAA,CAAC,MAAA,EAAA,EAAK,aAAA,EAAW,IAAA,EAAC,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,4BACnBA,GAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,OAAA,CAAQ,YAAA,EAAa;AAAA,WAAA,EAC9B,CAAA;AAAA,0BAEFA,GAAAA,CAAC,MAAA,EAAA,EAAK,aAAA,EAAW,MAAC,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,0BACnBA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iBAAA,EAAmB,kBAAQ,IAAA,EAAK;AAAA,SAAA,EAClD,CAAA;AAAA,wBAEAA,IAAC,IAAA,EAAA,EAAK,IAAA,EAAK,iBAAgB,IAAA,EAAK,aAAA,EAAc,SAAS,WAAA,EAAa,CAAA;AAAA,wBAEpEA,IAAC,IAAA,EAAA,EAAG,aAAA,EAAa,IAAI,OAAA,EAAS,SAAA,EAAU,8CAAA,EACrC,QAAA,EAAA,OAAA,CAAQ,IAAA,EACX,CAAA;AAAA,wBAEAA,IAAC,IAAA,EAAA,EAAK,IAAA,EAAK,iBAAgB,IAAA,EAAK,YAAA,EAAa,SAAS,WAAA,EAAa,CAAA;AAAA,QAElE,OAAO,YAAA,KAAiB,UAAA,oBACvBM,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,8BAAA,EACb,QAAA,EAAA;AAAA,0BAAAN,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EACb,QAAA,kBAAAA,GAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,OAAO,OAAA,CAAQ,KAAA;AAAA,cACf,WAAW,OAAA,CAAQ,cAAA;AAAA,cACnB,QAAQ,GAAA,CAAI,QAAA;AAAA,cACZ,eAAe,GAAA,CAAI;AAAA;AAAA,WACrB,EACF,CAAA;AAAA,UACC,cAAc,CAAA,oBACbM,IAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,uEAAA,EAAwE,QAAA,EAAA;AAAA,YAAA,QAAA;AAAA,YACpF,WAAA;AAAA,YAAY;AAAA,WAAA,EAChB;AAAA,SAAA,EAEJ,CAAA;AAAA,QAKD,MAAA,CAAO,YAAA,KAAiB,UAAA,oBACvBN,GAAAA,CAAC,YAAA,EAAA,EAAa,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAO,QAAA,EAAU,OAAA,CAAQ,QAAA,EAAU,SAAQ,QAAA,EAAS,CAAA;AAAA,wBAGnFA,IAAC,IAAA,EAAA,EAAK,IAAA,EAAK,iBAAgB,IAAA,EAAK,YAAA,EAAa,SAAS,WAAA,EAAa,CAAA;AAAA,wBAEnEA,IAAC,GAAA,EAAA,EAAE,aAAA,EAAa,IAAI,cAAA,EAAgB,SAAA,EAAU,4CAAA,EAC3C,QAAA,EAAA,OAAA,CAAQ,WAAA,EACX,CAAA;AAAA,wBAEAA,IAAC,IAAA,EAAA,EAAK,IAAA,EAAK,iBAAgB,IAAA,EAAK,kBAAA,EAAmB,SAAS,WAAA,EAAa,CAAA;AAAA,QAExE,OAAO,YAAA,KAAiB,UAAA,oBACvBM,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,0DAAA,EACZ,QAAA,EAAA;AAAA,UAAA,OAAA,mBACCA,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kEAAA,EACd,QAAA,EAAA;AAAA,4BAAAN,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0CAAA,EAA2C,CAAA;AAAA,YAAE;AAAA,WAAA,EAC/D,IACE,QAAA,mBACFM,IAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,6DAAA,EACd,QAAA,EAAA;AAAA,4BAAAN,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iDAAA,EAAkD,CAAA;AAAA,YAAE,mCAAA;AAAA,YAC7C,OAAA,CAAQ,cAAA;AAAA,YAAe;AAAA,WAAA,EAChD,CAAA,mBAEAM,IAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,6DAAA,EACd,QAAA,EAAA;AAAA,4BAAAN,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qCAAA,EAAsC,CAAA;AAAA,YAAE;AAAA,WAAA,EAC1D,CAAA;AAAA,UAED,QAAQ,GAAA,oBAAOM,IAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,uBAAA,EAAwB,QAAA,EAAA;AAAA,YAAA,OAAA;AAAA,YAAM,OAAA,CAAQ;AAAA,WAAA,EAAI;AAAA,SAAA,EAC5E,CAAA;AAAA,wBAGFN,GAAAA;AAAA,UAAC,qBAAA;AAAA,UAAA;AAAA,YACC,MAAA,EAAQ,YAAA;AAAA,YACR,KAAA,EAAO,eAAA;AAAA,YACP,QAAA,EAAU;AAAA;AAAA,SACZ;AAAA,wBAIAA,IAAC,IAAA,EAAA,EAAK,IAAA,EAAK,iBAAgB,IAAA,EAAK,iBAAA,EAAkB,SAAS,WAAA,EAAa,CAAA;AAAA,wBAExEA,GAAAA,CAAC,KAAA,EAAA,EAAK,GAAG,4BAAA,CAA6B,cAAc,OAAA,EAAS,SAAA,EAAU,MAAA,EACpE,QAAA,EAAA,MAAA,CAAO,iBAAiB,UAAA,mBACvBM,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yBAAA,EACb,QAAA,EAAA;AAAA,0BAAAN,GAAAA;AAAA,YAAC,aAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAO,GAAA;AAAA,cACP,QAAA,EAAU,MAAA;AAAA,cACV,GAAA,EAAK,OAAA,GAAU,CAAA,GAAI,OAAA,CAAQ,cAAA;AAAA,cAC3B,QAAQ,GAAA,CAAI;AAAA;AAAA,WACd;AAAA,0BACAA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,eAAa,GAAA,CAAI,YAAA;AAAA,cACjB,QAAA,EAAU,OAAA;AAAA,cACV,OAAA,EAAS,SAAA;AAAA,cACT,SAAA,EAAU,yOAAA;AAAA,cACV,KAAA,EAAO,EAAE,YAAA,EAAc,yBAAA,EAA0B;AAAA,cAEhD,oBAAU,UAAA,GAAa;AAAA;AAAA;AAC1B,SAAA,EACF,CAAA,GACE,MAAA,CAAO,YAAA,KAAiB,SAAA,mBAC1BA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACF,GAAG,6BAA6B,aAAA,CAAc,aAAA;AAAA,YACjD,OAAA,EAAS,WAAA;AAAA,YACT,SAAA,EAAU,uIAAA;AAAA,YACV,KAAA,EAAO,EAAE,YAAA,EAAc,yBAAA,EAA0B;AAAA,YAEhD,iBAAO,OAAA,CAAQ;AAAA;AAAA,4BAGlBA,GAAAA;AAAA,UAAC,IAAA;AAAA,UAAA;AAAA,YACC,IAAI,MAAA,CAAO,WAAA;AAAA,YACX,SAAA,EAAU,qFAAA;AAAA,YACV,KAAA,EAAO,EAAE,YAAA,EAAc,yBAAA,EAA0B;AAAA,YAClD,QAAA,EAAA;AAAA;AAAA,SAED,EAEJ,CAAA;AAAA,wBAEAA,IAAC,IAAA,EAAA,EAAK,IAAA,EAAK,iBAAgB,IAAA,EAAK,gBAAA,EAAiB,SAAS,WAAA,EAAa,CAAA;AAAA,QAKtE,MAAA,CAAO,iBAAiB,UAAA,IAAc,OAAA,CAAQ,eAAe,KAAA,oBAASA,IAAC,iBAAA,EAAA,EAAkB,CAAA;AAAA,QAEzF,OAAO,YAAA,KAAiB,UAAA,oBACvBM,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,uDAAA,EACb,QAAA,EAAA;AAAA,0BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kFAAA,EACb,QAAA,EAAA;AAAA,4BAAAN,GAAAA,CAACiB,KAAAA,EAAA,EAAM,SAAA,EAAU,sBAAA,EAAuB,CAAA;AAAA,YAAE;AAAA,WAAA,EAC5C,CAAA;AAAA,0BACAX,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kFAAA,EACb,QAAA,EAAA;AAAA,4BAAAN,GAAAA,CAAC,UAAA,EAAA,EAAW,SAAA,EAAU,sBAAA,EAAuB,CAAA;AAAA,YAAE;AAAA,WAAA,EACjD,CAAA;AAAA,0BACAM,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kFAAA,EACb,QAAA,EAAA;AAAA,4BAAAN,GAAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAU,sBAAA,EAAuB,CAAA;AAAA,YAAE;AAAA,WAAA,EAClD;AAAA,SAAA,EACF;AAAA,OAAA,EAEJ;AAAA,KAAA,EACF,CAAA;AAAA,IAEC,MAAA,CAAO,YAAA,KAAiB,SAAA,oBACvBA,IAAC,SAAA,EAAA,EAAQ,EAAA,EAAG,4BAAA,EAA6B,SAAA,EAAU,sBAAA,EACjD,QAAA,kBAAAM,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,mBAAA,EACb,QAAA,EAAA;AAAA,sBAAAN,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,mCAAA,EAAoC,QAAA,EAAA,wBAAA,EAAsB,CAAA;AAAA,sBACxEA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,8BAA6B,QAAA,EAAA,qCAAA,EAAmC,CAAA;AAAA,sBAC7EA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QACb,QAAA,kBAAAA,GAAAA,CAAC,kBAAA,EAAA,EAAmB,OAAA,EAAkB,CAAA,EACxC;AAAA,KAAA,EACF,CAAA,EACF,CAAA;AAAA,oBAGFA,IAAC,IAAA,EAAA,EAAK,IAAA,EAAK,iBAAgB,IAAA,EAAK,aAAA,EAAc,SAAS,WAAA,EAAa,CAAA;AAAA,oBAEpEA,GAAAA,CAAC,YAAA,EAAA,EAAa,OAAA,EAAkB,CAAA;AAAA,oBAChCA,GAAAA,CAAC,cAAA,EAAA,EAAe,OAAA,EAAkB,CAAA;AAAA,oBAClCA,GAAAA,CAAC,eAAA,EAAA,EAAgB,OAAA,EAAkB,CAAA;AAAA,oBAEnCA,IAAC,IAAA,EAAA,EAAK,IAAA,EAAK,iBAAgB,IAAA,EAAK,aAAA,EAAc,SAAS,WAAA,EAAa;AAAA,GAAA,EACtE,CAAA;AAEJ;AC7QO,SAAS,oBAAA,CACd,MAAA,EACA,MAAA,EACA,OAAA,EACA,SAAA,EAC2B;AAC3B,EAAA,MAAM,aAAa,MAAA,CAAO,IAAA,CAAK,CAACkB,EAAAA,KAAMA,EAAAA,CAAE,SAAS,OAAO,CAAA;AACxD,EAAA,MAAM,aAAa,MAAA,CAAO,IAAA,CAAK,CAACA,EAAAA,KAAMA,EAAAA,CAAE,SAAS,OAAO,CAAA;AACxD,EAAA,MAAM,SAAA,GACJ,OAAO,IAAA,CAAK,CAACA,OAAMA,EAAAA,CAAE,EAAA,KAAO,MAAM,CAAA,IAClC,MAAA,CAAO,KAAK,CAACA,EAAAA,KAAAA,CAAOA,GAAE,IAAA,IAAQ,MAAA,MAAY,UAAUA,EAAAA,KAAM,UAAA,IAAcA,OAAM,UAAU,CAAA;AAE1F,EAAA,MAAM,QAAA,mBAAW,IAAI,GAAA,CAAI,CAAC,UAAA,EAAY,IAAI,UAAA,EAAY,EAAA,EAAI,SAAA,EAAW,EAAE,CAAC,CAAA;AACxE,EAAA,MAAM,KAAA,GAAQ,OACX,MAAA,CAAO,CAACA,OAAM,CAAC,QAAA,CAAS,GAAA,CAAIA,EAAAA,CAAE,EAAE,CAAC,EACjC,GAAA,CAAI,CAACA,EAAAA,MAAO,EAAE,KAAA,EAAOA,EAAAA,EAAG,QAAQ,MAAA,CAAOA,EAAAA,CAAE,EAAE,CAAA,IAAK,EAAA,EAAI,IAAA,IAAO,CAAE,CAAA,CAC7D,OAAO,CAAC,KAAA,KAAU,MAAM,KAAK,CAAA,CAC7B,GAAA,CAAI,CAAC,EAAE,KAAA,EAAAC,QAAO,KAAA,EAAM,KAAOA,MAAAA,CAAM,IAAA,KAAS,UAAA,GAAa,KAAA,GAAQ,GAAGA,MAAAA,CAAM,KAAK,CAAA,EAAA,EAAK,KAAK,CAAA,CAAG,CAAA;AAE7F,EAAA,OAAO;AAAA,IACL,WAAA,EAAa,OAAA;AAAA,IACb,cAAe,SAAA,IAAa,MAAA,CAAO,UAAU,EAAE,CAAA,EAAG,MAAK,IAAM,WAAA;AAAA,IAC7D,eAAgB,UAAA,IAAc,MAAA,CAAO,WAAW,EAAE,CAAA,EAAG,MAAK,IAAM,EAAA;AAAA,IAChE,eAAgB,UAAA,IAAc,MAAA,CAAO,WAAW,EAAE,CAAA,EAAG,MAAK,IAAM,MAAA;AAAA,IAChE,OAAA;AAAA,IACA,OAAA,EAAS,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,IAAK,gBAAA;AAAA,IAC7B,SAAA;AAAA,IACA,QAAA,EAAU,EAAE,IAAA,EAAM,OAAA,EAAS,MAAA;AAAO,GACpC;AACF;AAEA,IAAM,WAAA,GACJ,iFAAA;AAEF,SAAS,KAAA,CAAM;AAAA,EACb,KAAA,EAAAA,MAAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,EAIG;AACD,EAAA,MAAM,MAAA,GAAS;AAAA,IACb,aAAA,EAAe,GAAA,CAAI,cAAA,CAAeA,MAAAA,CAAM,EAAE,CAAA;AAAA,IAC1C,UAAUA,MAAAA,CAAM,QAAA;AAAA,IAChB,KAAA;AAAA,IACA,aAAaA,MAAAA,CAAM,WAAA;AAAA,IACnB,SAAA,EAAW,WAAA;AAAA,IACX,KAAA,EAAO,EAAE,YAAA,EAAc,wBAAA;AAAyB,GAClD;AACA,EAAA,uBACEb,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAW,CAAA,gCAAA,EAAmCa,OAAM,IAAA,KAAS,UAAA,GAAa,OAAA,GAAU,EAAE,CAAA,CAAA,EAC3F,QAAA,EAAA;AAAA,oBAAAb,KAAC,MAAA,EAAA,EACE,QAAA,EAAA;AAAA,MAAAa,MAAAA,CAAM,KAAA;AAAA,MACNA,MAAAA,CAAM,WAAW,EAAA,GAAK;AAAA,KAAA,EACzB,CAAA;AAAA,IACCA,OAAM,IAAA,KAAS,UAAA,mBACdnB,GAAAA,CAAC,cAAU,GAAG,MAAA,EAAQ,IAAA,EAAM,CAAA,EAAG,UAAU,CAAC,CAAA,KAAM,SAAS,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA,EAAG,SAAA,EAAW,CAAA,EAAG,WAAW,gBAAgB,CAAA,GACjHmB,MAAAA,CAAM,IAAA,KAAS,QAAA,mBACjBb,IAAAA,CAAC,QAAA,EAAA,EAAQ,GAAG,MAAA,EAAQ,UAAU,CAAC,CAAA,KAAM,SAAS,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA,EAC1D,QAAA,EAAA;AAAA,sBAAAN,GAAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,EAAA,EAAG,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,MAAA,CAChBmB,OAAM,OAAA,IAAW,EAAC,EAAG,GAAA,CAAI,CAAC,MAAA,qBAC1BnB,GAAAA,CAAC,QAAA,EAAA,EAA0B,OAAO,MAAA,CAAO,KAAA,EACtC,iBAAO,KAAA,EAAA,EADG,MAAA,CAAO,KAEpB,CACD;AAAA,KAAA,EACH,oBAEAA,GAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACE,GAAG,MAAA;AAAA,QACJ,IAAA,EAAMmB,OAAM,IAAA,KAAS,OAAA,GAAU,UAAUA,MAAAA,CAAM,IAAA,KAAS,UAAU,KAAA,GAAQ,MAAA;AAAA,QAC1E,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK;AAAA;AAAA;AAC1C,GAAA,EAEJ,CAAA;AAEJ;AAEO,SAAS,SAAA,CAAU;AAAA,EACxB,OAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA,GAAU,SAAA;AAAA,EACV,SAAS,EAAC;AAAA,EACV,WAAA,GAAc,QAAA;AAAA,EACd,cAAA,GAAiB;AACnB,CAAA,EAAmB;AACjB,EAAA,MAAM,EAAE,oBAAA,EAAqB,GAAI,UAAA,EAAW;AAC5C,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIjB,QAAAA,CAAiC,EAAE,CAAA;AAC/D,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,SAAsD,MAAM,CAAA;AACxF,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAEtD,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAEhC,EAAA,MAAM,MAAA,GAAS,OAAO,KAAA,KAA2B;AAC/C,IAAA,KAAA,CAAM,cAAA,EAAe;AACrB,IAAA,SAAA,CAAU,YAAY,CAAA;AACtB,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,IAAI;AACF,MAAA,MAAM,oBAAA;AAAA,QACJ,oBAAA;AAAA,UACE,MAAA;AAAA,UACA,MAAA;AAAA,UACA,OAAA;AAAA,UACA,OAAO,MAAA,KAAW,WAAA,GAAc,KAAA,CAAA,GAAY,OAAO,QAAA,CAAS;AAAA;AAC9D,OACF;AACA,MAAA,SAAA,CAAU,SAAS,CAAA;AACnB,MAAA,SAAA,CAAU,EAAE,CAAA;AAAA,IACd,SAAS,CAAA,EAAG;AACV,MAAA,SAAA,CAAU,OAAO,CAAA;AACjB,MAAA,QAAA,CAAS,aAAa,KAAA,GAAQ,CAAA,CAAE,OAAA,GAAU,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,IACrD;AAAA,EACF,CAAA;AAEA,EAAA,uBACEI,IAAAA,CAAC,SAAA,EAAA,EAAQ,eAAa,GAAA,CAAI,SAAA,EAAW,WAAU,sCAAA,EAC3C,QAAA,EAAA;AAAA,IAAA,CAAA,OAAA,IAAW,SAAS,QAAA,qBACpBA,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,kBAAA,EACZ,QAAA,EAAA;AAAA,MAAA,OAAA,oBACCN,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,gFAAgF,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,MAEtG,yBAASA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,iCAAiC,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,MAC9D,4BAAYA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,8BAA8B,QAAA,EAAA,QAAA,EAAS;AAAA,KAAA,EACnE,CAAA;AAAA,IAED,WAAW,SAAA,mBACVA,IAAC,GAAA,EAAA,EAAE,aAAA,EAAa,IAAI,gBAAA,EAAkB,SAAA,EAAU,0CAAA,EAC7C,QAAA,EAAA,cAAA,EACH,oBAEAM,IAAAA,CAAC,UAAK,QAAA,EAAU,MAAA,EAAQ,WAAU,WAAA,EAC/B,QAAA,EAAA;AAAA,MAAA,MAAA,CAAO,GAAA,CAAI,CAACa,MAAAA,qBACXnB,GAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UAEC,KAAA,EAAOmB,MAAAA;AAAA,UACP,KAAA,EAAO,MAAA,CAAOA,MAAAA,CAAM,EAAE,CAAA,IAAK,EAAA;AAAA,UAC3B,QAAA,EAAU,CAAC,KAAA,KAAU,SAAA,CAAU,CAAC,IAAA,MAAU,EAAE,GAAG,IAAA,EAAM,CAACA,MAAAA,CAAM,EAAE,GAAG,OAAM,CAAE;AAAA,SAAA;AAAA,QAHpEA,MAAAA,CAAM;AAAA,OAKd,CAAA;AAAA,sBACDnB,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,eAAa,GAAA,CAAI,eAAA;AAAA,UACjB,IAAA,EAAK,QAAA;AAAA,UACL,UAAU,MAAA,KAAW,YAAA;AAAA,UACrB,SAAA,EAAU,6HAAA;AAAA,UACV,KAAA,EAAO,EAAE,YAAA,EAAc,yBAAA,EAA0B;AAAA,UAEhD,QAAA,EAAA,MAAA,KAAW,eAAe,aAAA,GAAgB;AAAA;AAAA,OAC7C;AAAA,MACC,KAAA,oBACCA,GAAAA,CAAC,GAAA,EAAA,EAAE,eAAa,GAAA,CAAI,cAAA,EAAgB,SAAA,EAAU,kCAAA,EAC3C,QAAA,EAAA,KAAA,EACH;AAAA,KAAA,EAEJ;AAAA,GAAA,EAEJ,CAAA;AAEJ;AAEO,IAAM,aAAA,GAAgB;AAAA,EAC3B,KAAA,EAAO,MAAA;AAAA,EACP,WAAA,EACE,2KAAA;AAAA,EACF,QAAA,EAAU;AAAA,IACR,EAAE,IAAI,SAAA,EAAW,IAAA,EAAM,QAAQ,KAAA,EAAO,SAAA,EAAW,MAAM,wCAAA,EAAyC;AAAA,IAChG,EAAE,EAAA,EAAI,OAAA,EAAS,IAAA,EAAM,MAAA,EAAQ,OAAO,OAAA,EAAQ;AAAA,IAC5C,EAAE,EAAA,EAAI,UAAA,EAAY,IAAA,EAAM,MAAA,EAAQ,OAAO,UAAA,EAAW;AAAA,IAClD;AAAA,MACE,EAAA,EAAI,SAAA;AAAA,MACJ,IAAA,EAAM,MAAA;AAAA,MACN,KAAA,EAAO,SAAA;AAAA,MACP,IAAA,EAAM,CAAA,6FAAA,CAAA;AAAA,MACN,OAAA,EAAS;AAAA,KACX;AAAA,IACA;AAAA,MACE,EAAA,EAAI,QAAA;AAAA,MACJ,IAAA,EAAM,MAAA;AAAA,MACN,KAAA,EAAO,QAAA;AAAA,MACP,QAAA,EAAU,IAAA;AAAA,MACV,IAAA,EACE,iPAAA;AAAA,MACF,EAAA,EAAI;AAAA,QACF,EAAE,EAAA,EAAI,IAAA,EAAM,IAAA,EAAM,MAAA,EAAQ,OAAO,UAAA,EAAY,IAAA,EAAM,8CAAA,EAAgD,QAAA,EAAU,IAAA,EAAK;AAAA,QAClH,EAAE,IAAI,OAAA,EAAS,IAAA,EAAM,QAAQ,KAAA,EAAO,OAAA,EAAS,UAAU,IAAA,EAAK;AAAA,QAC5D;AAAA,UACE,EAAA,EAAI,MAAA;AAAA,UACJ,IAAA,EAAM,QAAA;AAAA,UACN,KAAA,EAAO,MAAA;AAAA,UACP,OAAA,EAAS,MAAA;AAAA,UACT,OAAA,EAAS;AAAA,YACP,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO;AAAA,YAC/B,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,QAAA,EAAS;AAAA,YAClC,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,OAAA,EAAQ;AAAA,YACjC,EAAE,KAAA,EAAO,UAAA,EAAY,KAAA,EAAO,WAAA,EAAY;AAAA,YACxC,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,QAAA;AAAS;AACrC,SACF;AAAA,QACA,EAAE,IAAI,UAAA,EAAY,IAAA,EAAM,WAAW,KAAA,EAAO,UAAA,EAAY,SAAS,KAAA,EAAM;AAAA,QACrE,EAAE,EAAA,EAAI,aAAA,EAAe,IAAA,EAAM,MAAA,EAAQ,OAAO,aAAA,EAAc;AAAA,QACxD;AAAA,UACE,EAAA,EAAI,SAAA;AAAA,UACJ,IAAA,EAAM,MAAA;AAAA,UACN,KAAA,EAAO,SAAA;AAAA,UACP,IAAA,EAAM,yBAAA;AAAA,UACN,EAAA,EAAI;AAAA,YACF,EAAE,IAAI,OAAA,EAAS,IAAA,EAAM,QAAQ,KAAA,EAAO,OAAA,EAAS,UAAU,IAAA,EAAK;AAAA,YAC5D,EAAE,IAAI,OAAA,EAAS,IAAA,EAAM,QAAQ,KAAA,EAAO,OAAA,EAAS,UAAU,IAAA;AAAK;AAC9D;AACF;AACF,KACF;AAAA,IACA,EAAE,IAAI,aAAA,EAAe,IAAA,EAAM,QAAQ,KAAA,EAAO,cAAA,EAAgB,SAAS,QAAA,EAAS;AAAA,IAC5E;AAAA,MACE,EAAA,EAAI,gBAAA;AAAA,MACJ,IAAA,EAAM,MAAA;AAAA,MACN,KAAA,EAAO,iBAAA;AAAA,MACP,OAAA,EAAS;AAAA;AACX,GACF;AAAA,EACA,OAAA,EAAS;AAAA,IACP;AAAA,MACE,IAAA,EAAM,cAAA;AAAA,MACN,KAAA,EAAO;AAAA,QACL,KAAA,EAAO,kBAAA;AAAA,QACP,QAAA,EAAU,uCAAA;AAAA,QACV,OAAA,EAAS,SAAA;AAAA,QACT,MAAA,EAAQ;AAAA,UACN,EAAE,IAAI,MAAA,EAAQ,KAAA,EAAO,YAAY,IAAA,EAAM,MAAA,EAAQ,UAAU,IAAA,EAAK;AAAA,UAC9D,EAAE,IAAI,OAAA,EAAS,KAAA,EAAO,cAAc,IAAA,EAAM,OAAA,EAAS,UAAU,IAAA,EAAK;AAAA,UAClE,EAAE,EAAA,EAAI,OAAA,EAAS,KAAA,EAAO,UAAA,EAAY,MAAM,OAAA,EAAQ;AAAA,UAChD,EAAE,IAAI,SAAA,EAAW,KAAA,EAAO,YAAY,IAAA,EAAM,UAAA,EAAY,UAAU,IAAA;AAAK;AACvE;AACF;AACF,GACF;AAAA;AAAA,EAEA,SAAA,EAAW,CAAC,MAAA,EAAQ,SAAA,EAAW,cAAc,SAAS;AACxD,CAAA;ACjRA,SAAS,UAAA,CAAWmB,QAAoB,KAAA,EAAiC;AACvE,EAAA,IAAI,UAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAI,OAAO,IAAA;AAClE,EAAA,QAAQA,OAAM,IAAA;AAAM,IAClB,KAAK,OAAA;AACH,MAAA,uBACEnB,GAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,GAAA,EAAK,OAAO,KAAK,CAAA;AAAA,UACjB,GAAA,EAAI,EAAA;AAAA,UACJ,OAAA,EAAQ,MAAA;AAAA,UACR,SAAA,EAAU,0BAAA;AAAA,UACV,KAAA,EAAO,EAAE,YAAA,EAAc,uBAAA;AAAwB;AAAA,OACjD;AAAA,IAEJ,KAAK,KAAA;AACH,MAAA,uBACEA,GAAAA,CAAC,GAAA,EAAA,EAAE,IAAA,EAAM,OAAO,KAAK,CAAA,EAAG,SAAA,EAAU,iDAAA,EAAkD,QAAO,QAAA,EAAS,GAAA,EAAI,YAAA,EACrG,QAAA,EAAA,MAAA,CAAO,KAAK,CAAA,EACf,CAAA;AAAA,IAEJ,KAAK,OAAA,EAAS;AACZ,MAAA,MAAM,KAAA,GAAQ,KAAA;AACd,MAAA,OAAO,OAAO,KAAA,CAAM,GAAA,KAAQ,QAAA,IAAY,OAAO,KAAA,CAAM,GAAA,KAAQ,QAAA,GAAW,CAAA,EAAG,KAAA,CAAM,GAAG,CAAA,EAAA,EAAK,KAAA,CAAM,GAAG,CAAA,CAAA,GAAK,IAAA;AAAA,IACzG;AAAA,IACA,KAAK,SAAA;AACH,MAAA,OAAO,KAAA,KAAU,OAAO,QAAA,GAAM,IAAA;AAAA,IAChC,KAAK,MAAA;AAIH,MAAA,OAAO,IAAA;AAAA,IACT;AACE,MAAA,OAAO,OAAO,KAAK,CAAA;AAAA;AAEzB;AAEA,SAAS,UAAA,CAAW,EAAE,WAAA,EAAa,MAAA,EAAQ,QAAO,EAAwF;AACxI,EAAA,MAAM,aAAa,WAAA,CAAY,UAAA;AAC/B,EAAA,MAAM,KAAA,GAAQ,UAAA,GAAa,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA,GAAI,MAAA;AACrD,EAAA,MAAM,eAAe,MAAA,CAAO,MAAA,CAAO,CAAC,IAAA,KAAS,SAAS,UAAU,CAAA;AAChE,EAAA,uBACEM,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,+CAAA;AAAA,MACV,KAAA,EAAO,EAAE,YAAA,EAAc,uBAAA,EAAwB;AAAA,MAC/C,oBAAA,EAAoB,MAAA,CAAO,IAAA,IAAQ,MAAA,CAAO,EAAA;AAAA,MAEzC,QAAA,EAAA;AAAA,QAAA,OAAO,KAAA,KAAU,YAAY,KAAA,oBAASN,IAAC,IAAA,EAAA,EAAG,SAAA,EAAU,yCAAyC,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,wBACpGA,IAAC,IAAA,EAAA,EAAG,SAAA,EAAU,eACX,QAAA,EAAA,YAAA,CAAa,GAAA,CAAI,CAAC,IAAA,KAAS;AAC1B,UAAA,MAAMmB,MAAAA,GAAQ,WAAA,CAAY,MAAA,CAAO,IAAI,CAAA;AACrC,UAAA,IAAI,CAACA,QAAO,OAAO,IAAA;AACnB,UAAA,MAAM,WAAW,UAAA,CAAWA,MAAAA,EAAO,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA;AACpD,UAAA,IAAI,QAAA,KAAa,MAAM,OAAO,IAAA;AAC9B,UAAA,uBACEb,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,4BAAAN,IAAC,IAAA,EAAA,EAAG,SAAA,EAAU,2EACX,QAAA,EAAAmB,MAAAA,CAAM,SAAS,IAAA,EAClB,CAAA;AAAA,4BACAnB,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,8BAA8B,QAAA,EAAA,QAAA,EAAS;AAAA,WAAA,EAAA,EAJ7C,IAKV,CAAA;AAAA,QAEJ,CAAC,CAAA,EACH;AAAA;AAAA;AAAA,GACF;AAEJ;AAEO,SAAS,eAAA,CAAgB;AAAA,EAC9B,MAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA,GAAQ,EAAA;AAAA,EACR;AACF,CAAA,EASG;AACD,EAAA,MAAM,EAAE,QAAQ,IAAA,EAAM,KAAA,EAAO,QAAO,GAAI,YAAA,CAA6B,MAAM,SAAA,EAAW;AAAA,IACpF,MAAA,EAAQ,aAAA;AAAA,IACR,MAAA,EAAQ,EAAE,MAAA,EAAQ,KAAA;AAAM,GACzB,CAAA;AACD,EAAA,IAAI,MAAA,KAAW,SAAS,uBAAOA,IAAC,cAAA,EAAA,EAAe,MAAA,EAAgB,SAAS,KAAA,EAAO,CAAA;AAG/E,EAAA,MAAM,cAAc,MAAA,IAAU,oBAAA,CAAqB,MAAM,CAAA,GAAIoB,wBAAAA,CAAyB,MAAM,CAAA,GAAI,IAAA;AAChG,EAAA,MAAM,OAAA,GAAU,MAAA,KAAW,OAAA,IAAW,CAAC,WAAA;AACvC,EAAA,MAAM,OAAA,GAAU,QAAQ,EAAC;AACzB,EAAA,MAAM,cACJ,MAAA,IAAU,MAAA,CAAO,MAAA,GAAS,CAAA,GACtB,OAAO,GAAA,CAAI,CAAC,KAAA,KAAU,KAAA,CAAM,KAAK,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,GACjD,WAAA,EAAa,iBAAiB,EAAC;AAErC,EAAA,IAAI,CAAC,OAAA,IAAW,OAAA,CAAQ,MAAA,KAAW,GAAG,OAAO,IAAA;AAE7C,EAAA,uBACEd,IAAAA,CAAC,SAAA,EAAA,EAAQ,eAAa,GAAA,CAAI,UAAA,EAAY,WAAU,sCAAA,EAC5C,QAAA,EAAA;AAAA,IAAA,CAAA,KAAA,IAAS,QAAA,qBACTA,IAAAA,CAAC,MAAA,EAAA,EAAO,WAAU,mBAAA,EACf,QAAA,EAAA;AAAA,MAAA,KAAA,oBAASN,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,gDAAgD,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,MAC7E,4BAAYA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,8BAA8B,QAAA,EAAA,QAAA,EAAS;AAAA,KAAA,EACnE,CAAA;AAAA,oBAEFA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0CAAA,EACZ,oBACG,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,OAAO,CAAC,CAAA,EAAE,EAAG,CAAC,CAAA,EAAG,CAAA,qBAC7CA,GAAAA,CAAC,KAAA,EAAA,EAAY,SAAA,EAAU,6BAAA,EAA8B,KAAA,EAAO,EAAE,YAAA,EAAc,yBAAwB,EAAA,EAA1F,CAA6F,CACxG,CAAA,GACD,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,EAAQ,CAAA,qBACnBA,GAAAA,CAAC,MAAA,EAAA,EAAuB,KAAA,EAAO,IAAI,EAAA,EACjC,QAAA,kBAAAA,GAAAA,CAAC,UAAA,EAAA,EAAW,WAAA,EAA0B,MAAA,EAAgB,MAAA,EAAQ,WAAA,EAAa,CAAA,EAAA,EADhE,MAAA,CAAO,EAEpB,CACD,CAAA,EACP;AAAA,GAAA,EACF,CAAA;AAEJ;AAEO,IAAM,mBAAA,GAAsB;AAAA,EACjC,KAAA,EAAO,aAAA;AAAA,EACP,WAAA,EACE,+IAAA;AAAA,EACF,QAAA,EAAU;AAAA,IACR;AAAA,MACE,EAAA,EAAI,QAAA;AAAA,MACJ,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,QAAA;AAAA,MACP,IAAA,EAAM,4GAAA;AAAA,MACN,QAAA,EAAU;AAAA,KACZ;AAAA,IACA,EAAE,EAAA,EAAI,OAAA,EAAS,IAAA,EAAM,MAAA,EAAQ,OAAO,OAAA,EAAQ;AAAA,IAC5C,EAAE,IAAI,UAAA,EAAY,IAAA,EAAM,QAAQ,KAAA,EAAO,UAAA,EAAY,MAAM,qCAAA,EAAsC;AAAA,IAC/F;AAAA,MACE,EAAA,EAAI,QAAA;AAAA,MACJ,IAAA,EAAM,MAAA;AAAA,MACN,KAAA,EAAO,gBAAA;AAAA,MACP,IAAA,EAAM,gFAAA;AAAA,MACN,EAAA,EAAI,CAAC,EAAE,EAAA,EAAI,OAAA,EAAS,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,YAAA,EAAc,QAAA,EAAU,IAAA,EAAM;AAAA,KACzE;AAAA,IACA;AAAA,MACE,EAAA,EAAI,OAAA;AAAA,MACJ,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,UAAA;AAAA,MACP,IAAA,EAAM,yCAAA;AAAA,MACN,GAAA,EAAK,CAAA;AAAA,MACL,GAAA,EAAK,EAAA;AAAA,MACL,OAAA,EAAS;AAAA;AACX,GACF;AAAA,EACA,OAAA,EAAS;AAAA,IACP;AAAA;AAAA;AAAA;AAAA,MAIE,IAAA,EAAM,eAAA;AAAA,MACN,OAAO,EAAE,MAAA,EAAQ,kBAAkB,KAAA,EAAO,cAAA,EAAgB,OAAO,EAAA;AAAG;AACtE,GACF;AAAA,EACA,WAAW,CAAC,MAAA,EAAQ,SAAA,EAAW,YAAA,EAAc,WAAW,SAAS,CAAA;AAAA;AAAA;AAAA,EAGjE,IAAA,EAAM;AAAA,IACJ,OAAA,EAAS;AAAA,MACP,MAAA,EAAQ,aAAA;AAAA,MACR,MAAA,EAAQ,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,QAAA,EAAS,EAAG,KAAA,EAAO,EAAE,KAAA,EAAO,OAAA,EAAQ;AAAE;AACnE;AAEJ;AC/JO,SAAS,SAAA,CAAU,EAAE,KAAA,GAAQ,IAAG,EAA2B;AAChE,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAC/B,EAAA,uBACEA,GAAAA,CAAC,SAAA,EAAA,EAAQ,aAAA,EAAY,YAAA,EAAa,WAAU,kBAAA,EAC1C,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,uFAAA,EACZ,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,MAAM,CAAA,KAAM;AACtB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,IAAA,KAAS,QAAA,GAAW,uCAAA,GAA0C,qBAAA;AACjF,IAAA,uBACEA,GAAAA,CAAC,MAAA,EAAA,EAAe,KAAA,EAAO,CAAA,GAAI,KACzB,QAAA,kBAAAM,IAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,uFAAA;AAAA,QACV,KAAA,EAAO,EAAE,WAAA,EAAa,KAAA,EAAO,KAAA,EAAM;AAAA,QAElC,QAAA,EAAA;AAAA,UAAA,IAAA,CAAK,uBAAON,GAAAA,CAAC,UAAK,SAAA,EAAU,kEAAA,EAAoE,eAAK,GAAA,EAAI,CAAA;AAAA,0BAC1GA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4CAAA,EAA8C,eAAK,KAAA,EAAM,CAAA;AAAA,UACxE,IAAA,CAAK,0BAAUA,GAAAA,CAAC,UAAK,SAAA,EAAU,kEAAA,EAAoE,eAAK,MAAA,EAAO;AAAA;AAAA;AAAA,SAPvG,CASb,CAAA;AAAA,EAEJ,CAAC,GACH,CAAA,EACF,CAAA;AAEJ;AAEO,IAAM,cAAA,GAAiB;AAAA,EAC5B,KAAA,EAAO,YAAA;AAAA,EACP,WAAA,EAAa,8FAAA;AAAA,EACb,QAAA,EAAU;AAAA,IACR;AAAA,MACE,EAAA,EAAI,OAAA;AAAA,MACJ,IAAA,EAAM,MAAA;AAAA,MACN,KAAA,EAAO,OAAA;AAAA,MACP,QAAA,EAAU,IAAA;AAAA,MACV,IAAA,EAAM,2EAAA;AAAA,MACN,EAAA,EAAI;AAAA,QACF,EAAE,IAAI,KAAA,EAAO,IAAA,EAAM,QAAQ,KAAA,EAAO,UAAA,EAAY,MAAM,mBAAA,EAAoB;AAAA,QACxE,EAAE,EAAA,EAAI,OAAA,EAAS,IAAA,EAAM,MAAA,EAAQ,OAAO,OAAA,EAAS,IAAA,EAAM,oCAAA,EAAsC,QAAA,EAAU,IAAA,EAAK;AAAA,QACxG,EAAE,IAAI,QAAA,EAAU,IAAA,EAAM,QAAQ,KAAA,EAAO,aAAA,EAAe,MAAM,iBAAA,EAAkB;AAAA,QAC5E;AAAA,UACE,EAAA,EAAI,MAAA;AAAA,UACJ,IAAA,EAAM,QAAA;AAAA,UACN,KAAA,EAAO,MAAA;AAAA,UACP,OAAA,EAAS,SAAA;AAAA,UACT,OAAA,EAAS;AAAA,YACP,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,SAAA,EAAU;AAAA,YACrC,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,QAAA;AAAS;AACrC;AACF;AACF;AACF,GACF;AAAA,EACA,OAAA,EAAS;AAAA,IACP;AAAA,MACE,IAAA,EAAM,YAAA;AAAA,MACN,KAAA,EAAO;AAAA,QACL,KAAA,EAAO;AAAA,UACL,EAAE,KAAK,UAAA,EAAY,KAAA,EAAO,OAAO,MAAA,EAAQ,aAAA,EAAe,MAAM,SAAA,EAAU;AAAA,UACxE,EAAE,KAAK,SAAA,EAAW,KAAA,EAAO,SAAS,MAAA,EAAQ,UAAA,EAAY,MAAM,QAAA,EAAS;AAAA,UACrE,EAAE,KAAK,UAAA,EAAY,KAAA,EAAO,MAAM,MAAA,EAAQ,MAAA,EAAQ,MAAM,SAAA;AAAU;AAClE;AACF;AACF,GACF;AAAA,EACA,SAAA,EAAW,CAAC,MAAA,EAAQ,SAAA,EAAW,cAAc,SAAS;AACxD,CAAA;AAWO,SAAS,WAAW,EAAE,OAAA,EAAS,KAAA,EAAO,WAAA,EAAa,OAAM,EAAoB;AAClF,EAAA,uBACEA,GAAAA,CAAC,SAAA,EAAA,EAAQ,eAAY,aAAA,EAAc,SAAA,EAAU,WAC3C,QAAA,kBAAAM,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,CAAA,8DAAA,EAAiE,KAAA,GAAQ,gBAAA,GAAmB,EAAE,CAAA,CAAA;AAAA,MAEzG,QAAA,EAAA;AAAA,wBAAAA,KAAC,MAAA,EAAA,EACE,QAAA,EAAA;AAAA,UAAA,OAAA,oBACCN,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,gFAAgF,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,0BAEvGM,IAAAA;AAAA,YAAC,YAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,0CAAA;AAAA,cACV,KAAA,EAAO,EAAE,UAAA,EAAY,uDAAA,EAAwD;AAAA,cAC9E,QAAA,EAAA;AAAA,gBAAA,QAAA;AAAA,gBACG,KAAA;AAAA,gBAAM;AAAA;AAAA;AAAA,WACV;AAAA,UACC,WAAA,oBACCA,IAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,qEAAA,EAAsE,QAAA,EAAA;AAAA,YAAA,SAAA;AAAA,YAAG;AAAA,WAAA,EAAY;AAAA,SAAA,EAEtG,CAAA;AAAA,QACC,KAAA,oBACCN,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,2BAAA,EAA4B,KAAA,EAAO,EAAE,YAAA,EAAc,uBAAA,EAAwB,EACxF,0BAAAA,GAAAA,CAAC,WAAA,EAAA,EAAY,GAAA,EAAK,KAAA,EAAO,GAAA,EAAK,WAAA,IAAe,IAAI,SAAA,EAAU,0BAAA,EAA2B,OAAA,EAAQ,MAAA,EAAO,CAAA,EACvG;AAAA;AAAA;AAAA,GAEJ,EACF,CAAA;AAEJ;AAEO,IAAM,mBAAA,GAAsB;AAAA,EACjC,KAAA,EAAO,aAAA;AAAA,EACP,WAAA,EAAa,kFAAA;AAAA,EACb,QAAA,EAAU;AAAA,IACR,EAAE,IAAI,SAAA,EAAW,IAAA,EAAM,QAAQ,KAAA,EAAO,SAAA,EAAW,MAAM,uDAAA,EAAwD;AAAA,IAC/G,EAAE,EAAA,EAAI,OAAA,EAAS,IAAA,EAAM,UAAA,EAAY,OAAO,OAAA,EAAS,IAAA,EAAM,4EAAA,EAAyE,QAAA,EAAU,IAAA,EAAK;AAAA,IAC/I,EAAE,IAAI,aAAA,EAAe,IAAA,EAAM,QAAQ,KAAA,EAAO,aAAA,EAAe,MAAM,oDAAA,EAAqD;AAAA,IACpH,EAAE,IAAI,OAAA,EAAS,IAAA,EAAM,SAAS,KAAA,EAAO,OAAA,EAAS,MAAM,uDAAA;AAAmD,GACzG;AAAA,EACA,OAAA,EAAS;AAAA,IACP;AAAA,MACE,IAAA,EAAM,aAAA;AAAA,MACN,KAAA,EAAO;AAAA,QACL,OAAA,EAAS,YAAA;AAAA,QACT,KAAA,EAAO,oHAAA;AAAA,QACP,WAAA,EAAa;AAAA;AACf;AACF,GACF;AAAA,EACA,SAAA,EAAW,CAAC,MAAA,EAAQ,YAAA,EAAc,SAAS;AAC7C,CAAA;AAkBA,IAAM,WAAA,GAAsE;AAAA,EAC1E,QAAA,EAAU,cAAA;AAAA,EACV,MAAA,EAAQ,eAAA;AAAA,EACR,IAAA,EAAM;AACR,CAAA;AAEO,SAAS,UAAA,CAAW,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,GAAQ,EAAC,EAAG,OAAA,GAAU,CAAA,EAAG,MAAA,GAAS,UAAA,EAAW,EAAoB;AAC5G,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAC/B,EAAA,MAAM,SAAS,OAAA,KAAY,CAAA,GAAI,gBAAA,GAAmB,OAAA,KAAY,IAAI,gBAAA,GAAmB,gBAAA;AACrF,EAAA,uBACEM,IAAAA,CAAC,SAAA,EAAA,EAAQ,aAAA,EAAY,aAAA,EAAc,WAAU,+CAAA,EAC1C,QAAA,EAAA;AAAA,IAAA,OAAA,oBAAWN,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,kFAAkF,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,IAClH,yBAASA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,8DAA8D,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,oBAC5FA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,gCAAA,EAAmC,MAAM,CAAA,CAAA,EACtD,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AACnB,MAAA,MAAM,OAAA,mBACJM,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,SAAA,EAAY,WAAA,CAAY,MAAM,CAAA,IAAK,WAAA,CAAY,QAAQ,CAAA,CAAA,EACrE,QAAA,EAAA;AAAA,wBAAAN,GAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,KAAK,IAAA,CAAK,KAAA;AAAA,YACV,GAAA,EAAI,EAAA;AAAA,YACJ,OAAA,EAAQ,MAAA;AAAA,YACR,SAAA,EAAU;AAAA;AAAA,SACZ;AAAA,wBAIAA,GAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,aAAA,EAAW,IAAA;AAAA,YACX,SAAA,EAAU,mCAAA;AAAA,YACV,KAAA,EAAO,EAAE,UAAA,EAAY,wDAAA;AAAyD;AAAA,SAChF;AAAA,wBACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yGAAA,EACb,eAAK,KAAA,EACR;AAAA,OAAA,EACF,CAAA;AAEF,MAAA,MAAM,KAAA,GAAQ,EAAE,YAAA,EAAc,uBAAA,EAAwB;AACtD,MAAA,OAAO,IAAA,CAAK,uBACVA,GAAAA,CAAC,QAAsB,EAAA,EAAI,IAAA,CAAK,IAAA,EAAM,SAAA,EAAU,sCAAA,EAAuC,KAAA,EACpF,qBADQ,IAAA,CAAK,KAEhB,CAAA,mBAEAA,GAAAA,CAAC,KAAA,EAAA,EAAqB,WAAU,gCAAA,EAAiC,KAAA,EAC9D,QAAA,EAAA,OAAA,EAAA,EADO,IAAA,CAAK,KAEf,CAAA;AAAA,IAEJ,CAAC,CAAA,EACH;AAAA,GAAA,EACF,CAAA;AAEJ;AAEO,IAAM,mBAAA,GAAsB;AAAA,EACjC,KAAA,EAAO,aAAA;AAAA,EACP,WAAA,EACE,2JAAA;AAAA,EACF,QAAA,EAAU;AAAA,IACR,EAAE,EAAA,EAAI,SAAA,EAAW,IAAA,EAAM,MAAA,EAAQ,OAAO,SAAA,EAAU;AAAA,IAChD,EAAE,EAAA,EAAI,OAAA,EAAS,IAAA,EAAM,MAAA,EAAQ,OAAO,OAAA,EAAQ;AAAA,IAC5C;AAAA,MACE,EAAA,EAAI,OAAA;AAAA,MACJ,IAAA,EAAM,MAAA;AAAA,MACN,KAAA,EAAO,OAAA;AAAA,MACP,QAAA,EAAU,IAAA;AAAA,MACV,EAAA,EAAI;AAAA,QACF,EAAE,IAAI,OAAA,EAAS,IAAA,EAAM,SAAS,KAAA,EAAO,OAAA,EAAS,UAAU,IAAA,EAAK;AAAA,QAC7D,EAAE,IAAI,OAAA,EAAS,IAAA,EAAM,QAAQ,KAAA,EAAO,OAAA,EAAS,UAAU,IAAA,EAAK;AAAA,QAC5D,EAAE,IAAI,MAAA,EAAQ,IAAA,EAAM,OAAO,KAAA,EAAO,MAAA,EAAQ,MAAM,+DAAA;AAAgE;AAClH,KACF;AAAA,IACA,EAAE,EAAA,EAAI,SAAA,EAAW,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,mBAAA,EAAqB,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,OAAA,EAAS,CAAA,EAAE;AAAA,IACxF;AAAA,MACE,EAAA,EAAI,QAAA;AAAA,MACJ,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,aAAA;AAAA,MACP,OAAA,EAAS,UAAA;AAAA,MACT,OAAA,EAAS;AAAA,QACP,EAAE,KAAA,EAAO,UAAA,EAAY,KAAA,EAAO,gBAAA,EAAiB;AAAA,QAC7C,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,QAAA,EAAS;AAAA,QACnC,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,aAAA;AAAc;AACxC;AACF,GACF;AAAA,EACA,OAAA,EAAS;AAAA,IACP;AAAA,MACE,IAAA,EAAM,aAAA;AAAA,MACN,KAAA,EAAO;AAAA,QACL,KAAA,EAAO,uBAAA;AAAA,QACP,KAAA,EAAO;AAAA,UACL,EAAE,KAAA,EAAO,sCAAA,EAAwC,KAAA,EAAO,WAAA,EAAa,MAAM,UAAA,EAAW;AAAA,UACtF,EAAE,KAAA,EAAO,qCAAA,EAAuC,KAAA,EAAO,iBAAA,EAAmB,MAAM,UAAA,EAAW;AAAA,UAC3F,EAAE,KAAA,EAAO,kCAAA,EAAoC,KAAA,EAAO,uBAAA,EAAsB,MAAM,UAAA,EAAW;AAAA,UAC3F,EAAE,KAAA,EAAO,sCAAA,EAAwC,KAAA,EAAO,WAAA,EAAa,MAAM,UAAA;AAAW;AACxF;AACF;AACF,GACF;AAAA,EACA,SAAA,EAAW,CAAC,MAAA,EAAQ,SAAA,EAAW,cAAc,SAAS;AACxD,CAAA;AASO,SAAS,WAAW,EAAE,KAAA,EAAO,UAAU,KAAA,GAAQ,IAAG,EAA6D;AACpH,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIE,SAAwB,CAAC,CAAA;AACjD,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAC/B,EAAA,uBACEI,IAAAA,CAAC,SAAA,EAAA,EAAQ,aAAA,EAAY,aAAA,EAAc,WAAU,sCAAA,EACzC,QAAA,EAAA;AAAA,IAAA,CAAA,KAAA,IAAS,QAAA,qBACTA,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,mBAAA,EACZ,QAAA,EAAA;AAAA,MAAA,KAAA,oBAASN,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,gDAAgD,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,MAC7E,4BAAYA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,8BAA8B,QAAA,EAAA,QAAA,EAAS;AAAA,KAAA,EACnE,CAAA;AAAA,oBAEFA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6CAA4C,KAAA,EAAO,EAAE,YAAA,EAAc,uBAAA,EAAwB,EACvG,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,MAAM,CAAA,KAAM;AACtB,MAAA,MAAM,SAAS,IAAA,KAAS,CAAA;AACxB,MAAA,uBACEM,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAA,IAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,MAAM,OAAA,CAAQ,MAAA,GAAS,OAAO,CAAC,CAAA;AAAA,YACxC,eAAA,EAAe,MAAA;AAAA,YACf,SAAA,EAAU,qGAAA;AAAA,YAET,QAAA,EAAA;AAAA,cAAA,IAAA,CAAK,CAAA;AAAA,8BACNN,GAAAA;AAAA,gBAAC,WAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAW,CAAA,mDAAA,EAAsD,MAAA,GAAS,YAAA,GAAe,EAAE,CAAA;AAAA;AAAA;AAC7F;AAAA;AAAA,SACF;AAAA,QACC,0BAAUA,GAAAA,CAAC,OAAE,SAAA,EAAU,yDAAA,EAA2D,eAAK,CAAA,EAAE;AAAA,OAAA,EAAA,EAZlF,KAAK,CAaf,CAAA;AAAA,IAEJ,CAAC,CAAA,EACH;AAAA,GAAA,EACF,CAAA;AAEJ;AAEO,IAAM,YAAA,GAAe;AAAA,EAC1B,KAAA,EAAO,KAAA;AAAA,EACP,WAAA,EAAa,+EAAA;AAAA,EACb,QAAA,EAAU;AAAA,IACR,EAAE,IAAI,OAAA,EAAS,IAAA,EAAM,QAAQ,KAAA,EAAO,OAAA,EAAS,SAAS,sBAAA,EAAuB;AAAA,IAC7E,EAAE,EAAA,EAAI,UAAA,EAAY,IAAA,EAAM,MAAA,EAAQ,OAAO,UAAA,EAAW;AAAA,IAClD;AAAA,MACE,EAAA,EAAI,OAAA;AAAA,MACJ,IAAA,EAAM,MAAA;AAAA,MACN,KAAA,EAAO,WAAA;AAAA,MACP,QAAA,EAAU,IAAA;AAAA,MACV,EAAA,EAAI;AAAA,QACF,EAAE,IAAI,GAAA,EAAK,IAAA,EAAM,QAAQ,KAAA,EAAO,UAAA,EAAY,UAAU,IAAA,EAAK;AAAA,QAC3D,EAAE,IAAI,GAAA,EAAK,IAAA,EAAM,YAAY,KAAA,EAAO,QAAA,EAAU,UAAU,IAAA;AAAK;AAC/D;AACF,GACF;AAAA,EACA,OAAA,EAAS;AAAA,IACP;AAAA,MACE,IAAA,EAAM,KAAA;AAAA,MACN,KAAA,EAAO;AAAA,QACL,KAAA,EAAO,sBAAA;AAAA,QACP,KAAA,EAAO;AAAA,UACL,EAAE,CAAA,EAAG,0BAAA,EAA4B,CAAA,EAAG,+FAAA,EAA0F;AAAA,UAC9H,EAAE,CAAA,EAAG,2BAAA,EAA6B,CAAA,EAAG,8FAAA,EAA8E;AAAA,UACnH,EAAE,CAAA,EAAG,+BAAA,EAAiC,CAAA,EAAG,8FAAA;AAAmF;AAC9H;AACF;AACF,GACF;AAAA;AAAA,EAEA,WAAW,CAAC,MAAA,EAAQ,SAAA,EAAW,SAAA,EAAW,cAAc,SAAS;AACnE,CAAA;ACpUO,SAAS,YAAA,CAAa;AAAA,EAC3B,KAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAQ;AACV,CAAA,EAIG;AACD,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAC/B,EAAA,MAAM,IAAA,GAAO,MAAM,MAAA,IAAU,CAAA,GAAI,mBAAmB,KAAA,CAAM,MAAA,KAAW,IAAI,gBAAA,GAAmB,gBAAA;AAC5F,EAAA,uBACEM,IAAAA,CAAC,SAAA,EAAA,EAAQ,aAAA,EAAY,eAAA,EAAgB,WAAU,sCAAA,EAC3C,QAAA,EAAA;AAAA,IAAA,CAAA,KAAA,IAAS,QAAA,qBACTA,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,mBAAA,EACZ,QAAA,EAAA;AAAA,MAAA,KAAA,oBAASN,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,gDAAgD,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,MAC7E,4BAAYA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,8BAA8B,QAAA,EAAA,QAAA,EAAS;AAAA,KAAA,EACnE,CAAA;AAAA,oBAEFA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,0BAAA,EAA6B,IAAI,CAAA,CAAA,EAC9C,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,EAAM,CAAA,KAAM;AACtB,MAAA,MAAMqB,QAAO,IAAA,CAAK,IAAA,GAAO,aAAA,CAAc,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA;AACpD,MAAA,uBACEf,KAAC,KAAA,EAAA,EAAqB,SAAA,EAAU,+BAA8B,KAAA,EAAO,EAAE,YAAA,EAAc,uBAAA,EAAwB,EAC3G,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,0BAAAN,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sGAAA,EACb,cAAI,CAAA,EACP,CAAA;AAAA,UACCqB,yBAAQrB,GAAAA,CAACqB,KAAAA,EAAA,EAAK,WAAU,sBAAA,EAAuB;AAAA,SAAA,EAClD,CAAA;AAAA,wBACArB,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,wBAAA,EAA0B,eAAK,KAAA,EAAM,CAAA;AAAA,QAClD,IAAA,CAAK,wBAAQA,GAAAA,CAAC,OAAE,SAAA,EAAU,sCAAA,EAAwC,eAAK,IAAA,EAAK;AAAA,OAAA,EAAA,EARrE,KAAK,KASf,CAAA;AAAA,IAEJ,CAAC,CAAA,EACH;AAAA,GAAA,EACF,CAAA;AAEJ;AAEO,IAAM,cAAA,GAAiB;AAAA,EAC5B,KAAA,EAAO,OAAA;AAAA,EACP,WAAA,EAAa,iFAAA;AAAA,EACb,QAAA,EAAU;AAAA,IACR,EAAE,IAAI,OAAA,EAAS,IAAA,EAAM,QAAQ,KAAA,EAAO,OAAA,EAAS,SAAS,eAAA,EAAgB;AAAA,IACtE,EAAE,EAAA,EAAI,UAAA,EAAY,IAAA,EAAM,MAAA,EAAQ,OAAO,UAAA,EAAW;AAAA,IAClD;AAAA,MACE,EAAA,EAAI,OAAA;AAAA,MACJ,IAAA,EAAM,MAAA;AAAA,MACN,KAAA,EAAO,OAAA;AAAA,MACP,QAAA,EAAU,IAAA;AAAA,MACV,IAAA,EAAM,mCAAA;AAAA,MACN,EAAA,EAAI;AAAA,QACF,EAAE,IAAI,MAAA,EAAQ,IAAA,EAAM,QAAQ,KAAA,EAAO,MAAA,EAAQ,MAAM,mEAAA,EAAoE;AAAA,QACrH,EAAE,IAAI,OAAA,EAAS,IAAA,EAAM,QAAQ,KAAA,EAAO,OAAA,EAAS,UAAU,IAAA,EAAK;AAAA,QAC5D,EAAE,EAAA,EAAI,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,OAAO,QAAA;AAAS;AAC9C;AACF,GACF;AAAA,EACA,OAAA,EAAS;AAAA,IACP;AAAA,MACE,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO;AAAA,QACL,KAAA,EAAO,eAAA;AAAA,QACP,KAAA,EAAO;AAAA,UACL,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,SAAA,EAAW,MAAM,kCAAA,EAAgC;AAAA,UAC1E,EAAE,IAAA,EAAM,cAAA,EAAgB,KAAA,EAAO,SAAA,EAAQ,MAAM,qCAAA,EAAsC;AAAA,UACnF,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,QAAA,EAAU,MAAM,uCAAA;AAAqC;AAC/E;AACF;AACF,GACF;AAAA,EACA,SAAA,EAAW,CAAC,MAAA,EAAQ,SAAA,EAAW,cAAc,SAAS;AACxD,CAAA;AAWA,SAAS,aAAa,MAAA,EAAgB;AACpC,EAAA,MAAM,CAAC,KAAK,MAAM,CAAA,GAAIE,SAAS,MAAM,IAAA,CAAK,KAAK,CAAA;AAC/C,EAAAJ,UAAU,MAAM;AACd,IAAA,MAAM,EAAA,GAAK,OAAO,WAAA,CAAY,MAAM,OAAO,IAAA,CAAK,GAAA,EAAK,CAAA,EAAG,GAAI,CAAA;AAC5D,IAAA,OAAO,MAAM,MAAA,CAAO,aAAA,CAAc,EAAE,CAAA;AAAA,EACtC,CAAA,EAAG,EAAE,CAAA;AACL,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,SAAS,GAAG,CAAA;AACrC,EAAA,MAAMH,EAAAA,GAAI,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,GAAI,CAAA;AAChC,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,IAAA,CAAK,KAAA,CAAMA,EAAAA,GAAI,KAAK,CAAA;AAAA,IAC1B,KAAA,EAAO,IAAA,CAAK,KAAA,CAAOA,EAAAA,GAAI,QAAS,IAAI,CAAA;AAAA,IACpC,OAAA,EAAS,IAAA,CAAK,KAAA,CAAOA,EAAAA,GAAI,OAAQ,EAAE,CAAA;AAAA,IACnC,SAASA,EAAAA,GAAI;AAAA,GACf;AACF;AAGO,SAAS,aAAA,CACd,YACA,GAAA,EACgC;AAChC,EAAA,OAAO,WAAW,IAAA,CAAK,CAAC,CAAA,KAAM,IAAI,KAAK,CAAA,CAAE,IAAI,CAAA,CAAE,OAAA,KAAY,GAAG,CAAA,IAAK,UAAA,CAAW,UAAA,CAAW,SAAS,CAAC,CAAA;AACrG;AAEO,SAAS,aAAA,CAAc;AAAA,EAC5B,OAAA;AAAA,EACA,aAAa,EAAC;AAAA,EACd;AACF,CAAA,EAIG;AACD,EAAA,MAAM,IAAA,GAAO,aAAA,CAAc,UAAA,EAAY,IAAA,CAAK,KAAK,CAAA;AACjD,EAAA,MAAM,MAAA,GAAS,IAAA,GAAO,IAAI,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,CAAE,OAAA,EAAQ,GAAI,IAAA,CAAK,GAAA,EAAI;AAC/D,EAAA,MAAM,CAAA,GAAI,aAAa,MAAM,CAAA;AAC7B,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,EAAA,MAAM,KAAA,GAAiC;AAAA,IACrC,CAAC,CAAA,CAAE,IAAA,EAAM,MAAM,CAAA;AAAA,IACf,CAAC,CAAA,CAAE,KAAA,EAAO,OAAO,CAAA;AAAA,IACjB,CAAC,CAAA,CAAE,OAAA,EAAS,KAAK,CAAA;AAAA,IACjB,CAAC,CAAA,CAAE,OAAA,EAAS,KAAK;AAAA,GACnB;AACA,EAAA,uBACEK,GAAAA,CAAC,SAAA,EAAA,EAAQ,aAAA,EAAY,gBAAA,EAAiB,SAAA,EAAU,oCAAA,EAC9C,QAAA,kBAAAM,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kDAAA,EACZ,QAAA,EAAA;AAAA,IAAA,OAAA,oBAAWN,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,4DAA4D,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,oBAC7FA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,gDAAA,EAAkD,eAAK,KAAA,EAAM,CAAA;AAAA,oBAC3EA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yCAAA,EACZ,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,CAAC,KAAA,EAAO,IAAI,CAAA,qBACtBM,IAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QAEC,SAAA,EAAU,kEAAA;AAAA,QACV,KAAA,EAAO,EAAE,YAAA,EAAc,uBAAA,EAAwB;AAAA,QAE/C,QAAA,EAAA;AAAA,0BAAAN,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kDAAA,EAAoD,QAAA,EAAA,MAAA,CAAO,KAAK,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAA,EAAE,CAAA;AAAA,0BAClGA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sEAAsE,QAAA,EAAA,IAAA,EAAK;AAAA;AAAA,OAAA;AAAA,MALrF;AAAA,KAOR,CAAA,EACH,CAAA;AAAA,IACC,wBAAQA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,2BAA2B,QAAA,EAAA,IAAA,EAAK;AAAA,GAAA,EACxD,CAAA,EACF,CAAA;AAEJ;AAEO,IAAM,kBAAA,GAAqB;AAAA,EAChC,KAAA,EAAO,WAAA;AAAA,EACP,WAAA,EACE,kKAAA;AAAA,EACF,QAAA,EAAU;AAAA,IACR,EAAE,IAAI,SAAA,EAAW,IAAA,EAAM,QAAQ,KAAA,EAAO,SAAA,EAAW,SAAS,qBAAA,EAAsB;AAAA,IAChF;AAAA,MACE,EAAA,EAAI,YAAA;AAAA,MACJ,IAAA,EAAM,MAAA;AAAA,MACN,KAAA,EAAO,YAAA;AAAA,MACP,QAAA,EAAU,IAAA;AAAA,MACV,IAAA,EAAM,gEAAA;AAAA,MACN,EAAA,EAAI;AAAA,QACF,EAAE,EAAA,EAAI,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,OAAO,MAAA,EAAQ,IAAA,EAAM,8DAAA,EAAgE,QAAA,EAAU,IAAA,EAAK;AAAA,QAChI,EAAE,EAAA,EAAI,OAAA,EAAS,IAAA,EAAM,MAAA,EAAQ,OAAO,SAAA,EAAW,IAAA,EAAM,6CAAA,EAA+C,QAAA,EAAU,IAAA;AAAK;AACrH,KACF;AAAA,IACA,EAAE,IAAI,MAAA,EAAQ,IAAA,EAAM,QAAQ,KAAA,EAAO,MAAA,EAAQ,MAAM,kEAAA;AAAgE,GACnH;AAAA,EACA,OAAA,EAAS;AAAA,IACP;AAAA,MACE,IAAA,EAAM,WAAA;AAAA,MACN,KAAA,EAAO;AAAA,QACL,OAAA,EAAS,qBAAA;AAAA,QACT,YAAY,CAAC,EAAE,MAAM,2BAAA,EAA6B,KAAA,EAAO,iCAA2B,CAAA;AAAA,QACpF,IAAA,EAAM;AAAA;AACR;AACF,GACF;AAAA,EACA,SAAA,EAAW,CAAC,MAAA,EAAQ,SAAA,EAAW,cAAc,SAAS;AACxD,CAAA;AAeO,SAAS,SAAA,CAAU;AAAA,EACxB,OAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAQ,EAAC;AAAA,EACT,QAAA;AAAA,EACA;AACF,CAAA,EAOG;AACD,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAC/B,EAAA,MAAM,QAAA,GAAW,OAAA,GAAU,UAAA,CAAW,IAAA,CAAK,OAAO,CAAA,GAAI,KAAA;AACtD,EAAA,uBACEA,GAAAA,CAAC,SAAA,EAAA,EAAQ,aAAA,EAAY,YAAA,EAAa,SAAA,EAAU,aAAA,EAC1C,QAAA,kBAAAM,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sCAAA,EACX,QAAA,EAAA;AAAA,IAAA,CAAA,OAAA,IAAW,SAAS,QAAA,qBACpBA,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,iBAAA,EACZ,QAAA,EAAA;AAAA,MAAA,OAAA,oBAAWN,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,6DAA6D,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,MAC7F,yBAASA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,qDAAqD,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,MAClF,4BAAYA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,8BAA8B,QAAA,EAAA,QAAA,EAAS;AAAA,KAAA,EACnE,CAAA;AAAA,oBAEFA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BACZ,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,qBACVM,IAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QAEC,SAAA,EAAW,CAAA,WAAA,EAAc,IAAA,CAAK,SAAA,GAAY,oDAAoD,SAAS,CAAA,CAAA;AAAA,QACvG,KAAA,EAAO,EAAE,YAAA,EAAc,uBAAA,EAAwB;AAAA,QAE9C,QAAA,EAAA;AAAA,UAAA,IAAA,CAAK,SAAA,IAAa,KAAK,KAAA,oBACtBN,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uHAAA,EACb,QAAA,EAAA,IAAA,CAAK,KAAA,EACR,CAAA;AAAA,0BAEFA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,mBAAA,EAAqB,eAAK,IAAA,EAAK,CAAA;AAAA,UAC5C,IAAA,CAAK,6BAAaA,GAAAA,CAAC,OAAE,SAAA,EAAU,uCAAA,EAAyC,eAAK,SAAA,EAAU,CAAA;AAAA,UACvF,IAAA,CAAK,0BAAUA,GAAAA,CAAC,OAAE,SAAA,EAAU,oCAAA,EAAsC,eAAK,MAAA,EAAO;AAAA;AAAA,OAAA;AAAA,MAX1E,IAAA,CAAK;AAAA,KAab,CAAA,EACH,CAAA;AAAA,IACC,QAAA,IAAY,2BACXA,GAAAA,CAAC,SAAI,SAAA,EAAU,OAAA,EACZ,qCACCA,GAAAA;AAAA,MAAC,GAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAM,OAAA;AAAA,QACN,MAAA,EAAO,QAAA;AAAA,QACP,GAAA,EAAI,qBAAA;AAAA,QACJ,SAAA,EAAU,wKAAA;AAAA,QACV,KAAA,EAAO,EAAE,YAAA,EAAc,yBAAA,EAA0B;AAAA,QAEhD,QAAA,EAAA;AAAA;AAAA,wBAGHA,GAAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,EAAA,EAAI,OAAA;AAAA,QACJ,SAAA,EAAU,wKAAA;AAAA,QACV,KAAA,EAAO,EAAE,YAAA,EAAc,yBAAA,EAA0B;AAAA,QAEhD,QAAA,EAAA;AAAA;AAAA,KACH,EAEJ;AAAA,GAAA,EAEJ,CAAA,EACF,CAAA;AAEJ;AAEO,IAAM,cAAA,GAAiB;AAAA,EAC5B,KAAA,EAAO,YAAA;AAAA,EACP,WAAA,EACE,2KAAA;AAAA,EACF,QAAA,EAAU;AAAA,IACR,EAAE,EAAA,EAAI,SAAA,EAAW,IAAA,EAAM,MAAA,EAAQ,OAAO,SAAA,EAAU;AAAA,IAChD,EAAE,EAAA,EAAI,OAAA,EAAS,IAAA,EAAM,MAAA,EAAQ,OAAO,OAAA,EAAQ;AAAA,IAC5C,EAAE,EAAA,EAAI,UAAA,EAAY,IAAA,EAAM,MAAA,EAAQ,OAAO,UAAA,EAAW;AAAA,IAClD;AAAA,MACE,EAAA,EAAI,OAAA;AAAA,MACJ,IAAA,EAAM,MAAA;AAAA,MACN,KAAA,EAAO,OAAA;AAAA,MACP,QAAA,EAAU,IAAA;AAAA,MACV,EAAA,EAAI;AAAA,QACF,EAAE,IAAI,MAAA,EAAQ,IAAA,EAAM,QAAQ,KAAA,EAAO,MAAA,EAAQ,UAAU,IAAA,EAAK;AAAA,QAC1D,EAAE,IAAI,WAAA,EAAa,IAAA,EAAM,QAAQ,KAAA,EAAO,WAAA,EAAa,MAAM,mCAAA,EAAoC;AAAA,QAC/F,EAAE,IAAI,QAAA,EAAU,IAAA,EAAM,QAAQ,KAAA,EAAO,QAAA,EAAU,MAAM,qBAAA,EAAsB;AAAA,QAC3E,EAAE,IAAI,WAAA,EAAa,IAAA,EAAM,WAAW,KAAA,EAAO,WAAA,EAAa,SAAS,KAAA,EAAM;AAAA,QACvE,EAAE,IAAI,OAAA,EAAS,IAAA,EAAM,QAAQ,KAAA,EAAO,OAAA,EAAS,MAAM,mDAAA;AAAoD;AACzG,KACF;AAAA,IACA,EAAE,EAAA,EAAI,UAAA,EAAY,IAAA,EAAM,MAAA,EAAQ,OAAO,WAAA,EAAY;AAAA,IACnD,EAAE,IAAI,SAAA,EAAW,IAAA,EAAM,OAAO,KAAA,EAAO,UAAA,EAAY,MAAM,0FAAA;AAAsF,GAC/I;AAAA,EACA,OAAA,EAAS;AAAA,IACP;AAAA,MACE,IAAA,EAAM,YAAA;AAAA,MACN,KAAA,EAAO;AAAA,QACL,OAAA,EAAS,SAAA;AAAA,QACT,KAAA,EAAO,4BAAA;AAAA,QACP,QAAA,EAAU,uDAAA;AAAA,QACV,KAAA,EAAO;AAAA,UACL,EAAE,IAAA,EAAM,QAAA,EAAU,SAAA,EAAW,uBAAA,EAAyB,QAAQ,wCAAA,EAAmC;AAAA,UACjG,EAAE,IAAA,EAAM,SAAA,EAAW,SAAA,EAAW,iBAAA,EAAmB,QAAQ,mDAAA,EAA+C,SAAA,EAAW,IAAA,EAAM,KAAA,EAAO,cAAA,EAAe;AAAA,UAC/I,EAAE,IAAA,EAAM,SAAA,EAAW,SAAA,EAAW,iBAAA,EAAmB,QAAQ,sCAAA;AAAoC,SAC/F;AAAA,QACA,QAAA,EAAU,oBAAA;AAAA,QACV,OAAA,EAAS;AAAA;AACX;AACF,GACF;AAAA,EACA,SAAA,EAAW,CAAC,MAAA,EAAQ,SAAA,EAAW,cAAc,SAAS;AACxD,CAAA;AClTA,SAAS,kBAAkB,QAAA,EAAkC;AAC3D,EAAA,MAAM,OAAO,yBAAA,EAA0B;AACvC,EAAA,IAAI,UAAU,OAAO,QAAA;AACrB,EAAA,IAAI,IAAA,EAAM,SAAS,SAAA,IAAa,IAAA,EAAM,SAAS,YAAA,EAAc,OAAO,IAAA,CAAK,MAAA,CAAO,IAAA,IAAQ,IAAA;AACxF,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,iBAAA,CAAkB,aAAqB,IAAA,EAA6B;AAC3E,EAAA,OAAO,OAAO,CAAA,EAAG,WAAW,eAAe,kBAAA,CAAmB,IAAI,CAAC,CAAA,CAAA,GAAK,WAAA;AAC1E;AAwBA,IAAM,aAAA,GAAgB;AAAA,EACpB,IAAA,EAAM,yDAAA;AAAA,EACN,IAAA,EAAM,4DAAA;AAAA,EACN,IAAA,EAAM;AACR,CAAA;AAEO,SAAS,cAAA,CAAe;AAAA,EAC7B,KAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAA,GAAM,GAAA;AAAA,EACN,KAAA;AAAA,EACA,GAAA;AAAA,EACA,IAAA;AAAA,EACA,UAAA;AAAA,EACA,KAAA,GAAQ,QAAA;AAAA,EACR,OAAA,GAAU,MAAA;AAAA,EACV,MAAA,GAAS;AACX,CAAA,EAAwB;AACtB,EAAA,MAAM,SAAS,mBAAA,EAAoB;AACnC,EAAA,MAAM,IAAA,GAAO,kBAAkB,UAAU,CAAA;AACzC,EAAA,MAAM,MAAA,GAAS,IAAA,IAAQ,iBAAA,CAAkB,MAAA,CAAO,aAAa,IAAI,CAAA;AACjE,EAAA,MAAM,WAAW,KAAA,KAAU,QAAA;AAE3B,EAAA,uBACEM,IAAAA,CAAC,SAAA,EAAA,EAAQ,eAAa,GAAA,CAAI,cAAA,EAAgB,WAAU,0BAAA,EAClD,QAAA,EAAA;AAAA,oBAAAN,GAAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,SAAS,iBAAA,CAAkB,KAAA,EAAO,KAAK,GAAA,GAAM,EAAA,EAAI,MAAM,GAAG,CAAA;AAAA,QAC/D,KAAK,QAAA,IAAY,KAAA;AAAA,QACjB,SAAA,EAAW,CAAA,oBAAA,EAAuB,MAAA,KAAW,MAAA,GAAS,2BAA2B,wBAAwB,CAAA;AAAA;AAAA,KAC3G;AAAA,oBACAA,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,wEAAwE,aAAA,CAAc,OAAO,CAAC,CAAA,CAAA,EACvG,QAAA,GAAW,6BAA6B,uBAC1C,CAAA,CAAA;AAAA,QAEA,0BAAAM,IAAAA,CAAC,MAAA,EAAA,EAAO,SAAA,EAAW,QAAA,GAAW,cAAc,WAAA,EACzC,QAAA,EAAA;AAAA,UAAA,KAAA,IAAS,KAAA,CAAM,SAAS,CAAA,oBACvBN,IAAC,KAAA,EAAA,EAAI,SAAA,EAAW,gCAAgC,QAAA,GAAW,gBAAA,GAAmB,EAAE,CAAA,CAAA,EAC7E,QAAA,EAAA,KAAA,CAAM,IAAI,CAAC,IAAA,EAAM,sBAChBM,IAAAA,CAACP,MAAAA,CAAM,QAAA,EAAN,EACE,QAAA,EAAA;AAAA,YAAA,CAAA,GAAI,CAAA,oBAAKC,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,gCAAA,EAAiC,aAAA,EAAW,MAAC,QAAA,EAAA,MAAA,EAAC,CAAA;AAAA,4BACxEA,GAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,IAAA,CAAK,KAAK,GAAA,EAAK,IAAA,CAAK,GAAA,EAAK,SAAA,EAAU,oCAAA,EAAqC;AAAA,WAAA,EAAA,EAF/D,IAAA,CAAK,GAG1B,CACD,CAAA,EACH,CAAA;AAAA,UAED,2BACCA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,wEAAwE,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,0BAE/FA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uEAAuE,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,UAC1F,2BAAWA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,uDAAuD,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,UACvF,uBACCA,GAAAA;AAAA,YAAC,IAAA;AAAA,YAAA;AAAA,cACC,EAAA,EAAI,MAAA;AAAA,cACJ,eAAa,GAAA,CAAI,iBAAA;AAAA,cACjB,SAAA,EAAU,2IAAA;AAAA,cACV,KAAA,EAAO,EAAE,YAAA,EAAc,yBAAA,EAA0B;AAAA,cAEhD,QAAA,EAAA;AAAA;AAAA;AACH,SAAA,EAEJ;AAAA;AAAA;AACF,GAAA,EACF,CAAA;AAEJ;AAEO,IAAM,uBAAA,GAA0B;AAAA,EACrC,KAAA,EAAO,iBAAA;AAAA,EACP,WAAA,EACE,8FAAA;AAAA,EACF,QAAA,EAAU;AAAA,IACR,EAAE,IAAI,OAAA,EAAS,IAAA,EAAM,QAAQ,KAAA,EAAO,OAAA,EAAS,UAAU,IAAA,EAAK;AAAA,IAC5D,EAAE,IAAI,SAAA,EAAW,IAAA,EAAM,QAAQ,KAAA,EAAO,SAAA,EAAW,MAAM,uDAAA,EAAwD;AAAA,IAC/G,EAAE,IAAI,SAAA,EAAW,IAAA,EAAM,QAAQ,KAAA,EAAO,SAAA,EAAW,MAAM,qCAAA,EAAsC;AAAA,IAC7F,EAAE,IAAI,OAAA,EAAS,IAAA,EAAM,SAAS,KAAA,EAAO,gBAAA,EAAkB,MAAM,uFAAA,EAAqF;AAAA,IAClJ,EAAE,IAAI,UAAA,EAAY,IAAA,EAAM,QAAQ,KAAA,EAAO,gBAAA,EAAkB,MAAM,wBAAA,EAAyB;AAAA,IACxF,EAAE,EAAA,EAAI,KAAA,EAAO,IAAA,EAAM,UAAU,KAAA,EAAO,iBAAA,EAAmB,IAAA,EAAM,mDAAA,EAAgD,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,GAAA,EAAK,SAAS,GAAA,EAAI;AAAA,IAC5I;AAAA,MACE,EAAA,EAAI,OAAA;AAAA,MACJ,IAAA,EAAM,MAAA;AAAA,MACN,KAAA,EAAO,cAAA;AAAA,MACP,IAAA,EAAM,iGAAA;AAAA,MACN,EAAA,EAAI;AAAA,QACF,EAAE,IAAI,KAAA,EAAO,IAAA,EAAM,SAAS,KAAA,EAAO,MAAA,EAAQ,UAAU,IAAA,EAAK;AAAA,QAC1D,EAAE,IAAI,KAAA,EAAO,IAAA,EAAM,QAAQ,KAAA,EAAO,UAAA,EAAY,UAAU,IAAA;AAAK;AAC/D,KACF;AAAA,IACA,EAAE,IAAI,KAAA,EAAO,IAAA,EAAM,QAAQ,KAAA,EAAO,aAAA,EAAe,MAAM,yBAAA,EAA0B;AAAA,IACjF;AAAA,MACE,EAAA,EAAI,MAAA;AAAA,MACJ,IAAA,EAAM,KAAA;AAAA,MACN,KAAA,EAAO,eAAA;AAAA,MACP,IAAA,EAAM;AAAA,KACR;AAAA,IACA;AAAA,MACE,EAAA,EAAI,YAAA;AAAA,MACJ,IAAA,EAAM,MAAA;AAAA,MACN,KAAA,EAAO,gBAAA;AAAA,MACP,IAAA,EAAM;AAAA,KACR;AAAA,IACA;AAAA,MACE,EAAA,EAAI,OAAA;AAAA,MACJ,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,WAAA;AAAA,MACP,OAAA,EAAS;AAAA,QACP,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,UAAA,EAAW;AAAA,QACrC,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,MAAA;AAAO,OAClC;AAAA,MACA,OAAA,EAAS;AAAA,KACX;AAAA,IACA;AAAA,MACE,EAAA,EAAI,SAAA;AAAA,MACJ,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,OAAA;AAAA,MACP,IAAA,EAAM,qGAAA;AAAA,MACN,OAAA,EAAS;AAAA,QACP,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO;AAAA,QAC/B,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO;AAAA,QAC/B,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA;AAAO,OACjC;AAAA,MACA,OAAA,EAAS;AAAA,KACX;AAAA,IACA;AAAA,MACE,EAAA,EAAI,QAAA;AAAA,MACJ,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,QAAA;AAAA,MACP,OAAA,EAAS;AAAA,QACP,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,aAAA,EAAc;AAAA,QACtC,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,eAAA;AAAgB,OAC5C;AAAA,MACA,OAAA,EAAS;AAAA;AACX,GACF;AAAA,EACA,OAAA,EAAS;AAAA,IACP;AAAA,MACE,IAAA,EAAM,eAAA;AAAA,MACN,KAAA,EAAO;AAAA,QACL,OAAA,EAAS,eAAA;AAAA,QACT,KAAA,EAAO,6BAAA;AAAA,QACP,OAAA,EAAS,2DAAA;AAAA,QACT,GAAA,EAAK,qBAAA;AAAA,QACL,KAAA,EAAO,QAAA;AAAA,QACP,OAAA,EAAS,MAAA;AAAA,QACT,MAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA,SAAA,EAAW,CAAC,MAAA,EAAQ,YAAA,EAAc,SAAS;AAC7C,CAAA;AA8BO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,KAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAA,GAAM,GAAA;AAAA,EACN,IAAA,GAAO,MAAA;AAAA,EACP,WAAA;AAAA,EACA,GAAA;AAAA,EACA,IAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA,EAA0B;AACxB,EAAA,MAAM,SAAS,mBAAA,EAAoB;AAKnC,EAAA,MAAM,EAAE,QAAQ,IAAA,EAAM,KAAA,EAAO,QAAO,GAAI,YAAA,CAA6B,MAAM,SAAA,EAAW;AAAA,IACpF,MAAA,EAAQ,iBAAA;AAAA,IACR,MAAA,EAAQ,EAAE,IAAA,EAAM,WAAA;AAAY,GAC7B,CAAA;AACD,EAAA,MAAM,OAAA,GAAU,WAAA,GAAe,IAAA,IAAQ,IAAA,GAAQ,IAAA;AAE/C,EAAA,MAAM,MAAA,GAAS,OAAA,GAAU,CAAA,SAAA,EAAY,OAAA,CAAQ,IAAI,CAAA,CAAA,GAAK,IAAA;AACtD,EAAA,MAAM,GAAA,GAAM,KAAA,IAAS,OAAA,EAAS,MAAA,GAAS,CAAC,CAAA,EAAG,GAAA,IAAO,iBAAA,CAAkB,KAAA,EAAO,GAAA,EAAK,GAAA,GAAM,EAAA,EAAI,MAAM,IAAI,CAAA;AACpG,EAAA,MAAM,KAAA,GAAQ,GAAA,KAAQ,WAAA,GAAc,SAAA,GAAY,MAAA,CAAA;AAChD,EAAA,MAAM,WAAW,IAAA,KAAS,MAAA;AAE1B,EAAA,IAAI,WAAA,IAAe,WAAW,OAAA,EAAS,uBAAOA,GAAAA,CAAC,cAAA,EAAA,EAAe,MAAA,EAAgB,OAAA,EAAS,KAAA,EAAO,CAAA;AAE9F,EAAA,uBACEA,GAAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,eAAa,GAAA,CAAI,gBAAA;AAAA,MACjB,mBAAA,EAAmB,WAAA;AAAA,MACnB,SAAA,EAAU,gBAAA;AAAA,MACV,KAAA,EAAO,UAAA,GAAa,EAAE,UAAA,EAAW,GAAI,MAAA;AAAA,MAErC,QAAA,kBAAAM,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kFAAA,EACb,QAAA,EAAA;AAAA,wBAAAN,IAAC,MAAA,EAAA,EAAO,SAAA,EAAW,QAAA,GAAW,YAAA,GAAe,cAC3C,QAAA,kBAAAA,GAAAA;AAAA,UAAC,WAAA;AAAA,UAAA;AAAA,YACC,GAAA,EAAK,GAAA;AAAA,YACL,GAAA,EAAK,QAAA,IAAY,OAAA,EAAS,IAAA,IAAQ,KAAA;AAAA,YAClC,SAAA,EAAU,mCAAA;AAAA,YACV,KAAA,EAAO,EAAE,YAAA,EAAc,uBAAA;AAAwB;AAAA,SACjD,EACF,CAAA;AAAA,wBACAM,KAAC,MAAA,EAAA,EAAO,KAAA,EAAO,KAAK,SAAA,EAAW,QAAA,GAAW,eAAe,YAAA,EACtD,QAAA,EAAA;AAAA,UAAA,OAAA,oBACCN,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,uEAAuE,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,0BAE9FA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,2DAA2D,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,UAC9E,+BAAeA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,wCAAwC,QAAA,EAAA,WAAA,EAAY,CAAA;AAAA,UAChF,YAAY,QAAA,CAAS,MAAA,GAAS,CAAA,oBAC7BA,IAAC,IAAA,EAAA,EAAG,SAAA,EAAU,kBAAA,EACX,QAAA,EAAA,QAAA,CAAS,IAAI,CAAC,OAAA,qBACbM,IAAAA,CAAC,IAAA,EAAA,EAAiB,WAAU,0BAAA,EAC1B,QAAA,EAAA;AAAA,4BAAAN,GAAAA,CAAC,KAAA,EAAA,EAAM,SAAA,EAAU,sCAAA,EAAuC,eAAW,IAAA,EAAC,CAAA;AAAA,4BACpEA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,aAAa,QAAA,EAAA,OAAA,EAAQ;AAAA,WAAA,EAAA,EAF9B,OAGT,CACD,CAAA,EACH,CAAA;AAAA,UAED,OAAA,oBACCA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,yBAAA,EACV,QAAA,EAAA,WAAA,CAAY,OAAA,CAAQ,KAAA,EAAO,MAAA,CAAO,QAAA,EAAU,MAAA,CAAO,MAAM,CAAA,EAC5D,CAAA;AAAA,UAED,KAAA,IAAS,0BACRA,GAAAA;AAAA,YAAC,IAAA;AAAA,YAAA;AAAA,cACC,EAAA,EAAI,MAAA;AAAA,cACJ,eAAa,GAAA,CAAI,mBAAA;AAAA,cACjB,SAAA,EAAU,qJAAA;AAAA,cACV,KAAA,EAAO,EAAE,YAAA,EAAc,yBAAA,EAA0B;AAAA,cAEhD,QAAA,EAAA;AAAA;AAAA;AACH,SAAA,EAEJ;AAAA,OAAA,EACF;AAAA;AAAA,GACF;AAEJ;AAEO,IAAM,yBAAA,GAA4B;AAAA,EACvC,KAAA,EAAO,mBAAA;AAAA,EACP,WAAA,EACE,mIAAA;AAAA,EACF,QAAA,EAAU;AAAA,IACR,EAAE,IAAI,OAAA,EAAS,IAAA,EAAM,QAAQ,KAAA,EAAO,OAAA,EAAS,UAAU,IAAA,EAAK;AAAA,IAC5D,EAAE,IAAI,SAAA,EAAW,IAAA,EAAM,QAAQ,KAAA,EAAO,SAAA,EAAW,MAAM,mCAAA,EAAoC;AAAA,IAC3F,EAAE,IAAI,aAAA,EAAe,IAAA,EAAM,YAAY,KAAA,EAAO,aAAA,EAAe,MAAM,oDAAA,EAAqD;AAAA,IACxH;AAAA,MACE,EAAA,EAAI,UAAA;AAAA,MACJ,IAAA,EAAM,MAAA;AAAA,MACN,KAAA,EAAO,iBAAA;AAAA,MACP,IAAA,EAAM,gDAAA;AAAA,MACN,EAAA,EAAI,CAAC,EAAE,EAAA,EAAI,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,QAAA,EAAU,QAAA,EAAU,IAAA,EAAM;AAAA,KACpE;AAAA,IACA;AAAA,MACE,EAAA,EAAI,aAAA;AAAA;AAAA;AAAA,MAGJ,IAAA,EAAM,SAAA;AAAA,MACN,KAAA,EAAO,SAAA;AAAA,MACP,IAAA,EAAM;AAAA,KACR;AAAA,IACA,EAAE,IAAI,OAAA,EAAS,IAAA,EAAM,SAAS,KAAA,EAAO,KAAA,EAAO,MAAM,sEAAA,EAAuE;AAAA,IACzH,EAAE,IAAI,UAAA,EAAY,IAAA,EAAM,QAAQ,KAAA,EAAO,gBAAA,EAAkB,MAAM,+CAAA,EAAgD;AAAA,IAC/G,EAAE,EAAA,EAAI,KAAA,EAAO,IAAA,EAAM,UAAU,KAAA,EAAO,iBAAA,EAAmB,IAAA,EAAM,mDAAA,EAAgD,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,GAAA,EAAK,SAAS,GAAA,EAAI;AAAA,IAC5I;AAAA,MACE,EAAA,EAAI,MAAA;AAAA,MACJ,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,UAAA;AAAA,MACP,IAAA,EAAM,mFAAA;AAAA,MACN,OAAA,EAAS;AAAA,QACP,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO;AAAA,QAC/B,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,OAAA;AAAQ,OACnC;AAAA,MACA,OAAA,EAAS;AAAA,KACX;AAAA,IACA,EAAE,IAAI,KAAA,EAAO,IAAA,EAAM,QAAQ,KAAA,EAAO,aAAA,EAAe,MAAM,8CAAA,EAA+C;AAAA,IACtG,EAAE,IAAI,MAAA,EAAQ,IAAA,EAAM,OAAO,KAAA,EAAO,eAAA,EAAiB,MAAM,gFAAA,EAA4E;AAAA,IACrI,EAAE,IAAI,YAAA,EAAc,IAAA,EAAM,SAAS,KAAA,EAAO,iBAAA,EAAmB,MAAM,sDAAA;AAAuD,GAC5H;AAAA,EACA,OAAA,EAAS;AAAA,IACP;AAAA,MACE,IAAA,EAAM,mBAAA;AAAA,MACN,KAAA,EAAO;AAAA,QACL,OAAA,EAAS,UAAA;AAAA,QACT,KAAA,EAAO,4BAAA;AAAA,QACP,WAAA,EAAa,2CAAA;AAAA,QACb,IAAA,EAAM;AAAA;AACR;AACF,GACF;AAAA,EACA,SAAA,EAAW,CAAC,MAAA,EAAQ,YAAA,EAAc,SAAS,CAAA;AAAA;AAAA;AAAA,EAG3C,MAAM,EAAE,OAAA,EAAS,EAAE,MAAA,EAAQ,mBAAkB;AAC/C,CAAA;AAmBO,SAAS,UAAA,CAAW;AAAA,EACzB,MAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,KAAA,GAAQ,EAAA;AAAA,EACR,UAAA;AAAA,EACA,MAAA,GAAS;AACX,CAAA,EAAoB;AAClB,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,EAAE,QAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,EAAE,CAAC,GAAG,CAAA;AACrE,EAAA,uBACEA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,eAAa,GAAA,CAAI,UAAA;AAAA,MACjB,aAAA,EAAW,IAAA;AAAA,MACX,SAAA,EAAW,CAAA,uDAAA,EACT,MAAA,KAAW,MAAA,GAAS,SAAS,MAC/B,CAAA,CAAA;AAAA,MACA,KAAA,EAAO,UAAA,GAAa,EAAE,UAAA,EAAW,GAAI,MAAA;AAAA,MAEpC,QAAA,EAAA,KAAA,CAAM,GAAA;AAAA,QAAI,CAAC,GAAG,CAAA,KACb,GAAA,mBACEA,GAAAA,CAAC,KAAA,EAAA,EAAY,GAAA,EAAU,GAAA,EAAK,GAAA,IAAO,EAAA,EAAI,WAAU,uDAAA,EAAA,EAAvC,CAA+F,oBAEzGA,GAAAA,CAAC,UAAa,SAAA,EAAU,0CAAA,EACrB,QAAA,EAAA,MAAA,IAAU,QAAA,EAAA,EADF,CAEX;AAAA;AAEJ;AAAA,GACF;AAEJ;AAEO,IAAM,mBAAA,GAAsB;AAAA,EACjC,KAAA,EAAO,aAAA;AAAA,EACP,WAAA,EAAa,8EAAA;AAAA,EACb,QAAA,EAAU;AAAA,IACR,EAAE,EAAA,EAAI,QAAA,EAAU,IAAA,EAAM,MAAA,EAAQ,OAAO,QAAA,EAAU,IAAA,EAAM,4DAAA,EAA8D,OAAA,EAAS,QAAA,EAAI;AAAA,IAChI,EAAE,IAAI,KAAA,EAAO,IAAA,EAAM,SAAS,KAAA,EAAO,YAAA,EAAc,MAAM,sDAAA,EAAkD;AAAA,IACzG,EAAE,IAAI,KAAA,EAAO,IAAA,EAAM,QAAQ,KAAA,EAAO,gBAAA,EAAkB,MAAM,2EAAA,EAA4E;AAAA,IACtI,EAAE,EAAA,EAAI,OAAA,EAAS,IAAA,EAAM,UAAU,KAAA,EAAO,SAAA,EAAW,IAAA,EAAM,gDAAA,EAAkD,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,EAAA,EAAI,SAAS,EAAA,EAAG;AAAA,IACtI,EAAE,IAAI,YAAA,EAAc,IAAA,EAAM,SAAS,KAAA,EAAO,YAAA,EAAc,MAAM,+BAAA,EAAgC;AAAA,IAC9F;AAAA,MACE,EAAA,EAAI,QAAA;AAAA,MACJ,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,QAAA;AAAA,MACP,OAAA,EAAS;AAAA,QACP,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,SAAA,EAAU;AAAA,QACrC,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA;AAAO,OACjC;AAAA,MACA,OAAA,EAAS;AAAA;AACX,GACF;AAAA,EACA,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,eAAe,KAAA,EAAO,EAAE,MAAA,EAAQ,QAAA,EAAK,KAAA,EAAO,EAAA,EAAI,MAAA,EAAQ,SAAA,IAAa,CAAA;AAAA,EACvF,SAAA,EAAW,CAAC,MAAA,EAAQ,YAAA,EAAc,SAAS;AAC7C,CAAA;AAoBO,SAAS,aAAA,CAAc;AAAA,EAC5B,KAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,GAAA;AAAA,EACA,IAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA,EAAuB;AACrB,EAAA,MAAM,SAAS,mBAAA,EAAoB;AACnC,EAAA,MAAM,IAAA,GAAO,kBAAkB,UAAU,CAAA;AACzC,EAAA,MAAM,MAAA,GAAS,IAAA,IAAQ,iBAAA,CAAkB,MAAA,CAAO,aAAa,IAAI,CAAA;AAEjE,EAAA,uBACEA,GAAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,eAAa,GAAA,CAAI,aAAA;AAAA,MACjB,SAAA,EAAU,0CAAA;AAAA,MACV,KAAA,EAAO,UAAA,GAAa,EAAE,UAAA,EAAW,GAAI,MAAA;AAAA,MAErC,QAAA,kBAAAM,IAAAA,CAAC,MAAA,EAAA,EAAO,SAAA,EAAU,4CAAA,EACf,QAAA,EAAA;AAAA,QAAA,OAAA,oBACCN,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,qEAAqE,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,wBAE5FA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,6CAA6C,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,QAChE,4BAAYA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,mBAAmB,QAAA,EAAA,QAAA,EAAS,CAAA;AAAA,wBACtDA,GAAAA;AAAA,UAAC,IAAA;AAAA,UAAA;AAAA,YACC,EAAA,EAAI,MAAA;AAAA,YACJ,eAAa,GAAA,CAAI,mBAAA;AAAA,YACjB,SAAA,EAAU,kJAAA;AAAA,YACV,KAAA,EAAO,EAAE,YAAA,EAAc,yBAAA,EAA0B;AAAA,YAEhD,QAAA,EAAA,GAAA,IAAO;AAAA;AAAA;AACV,OAAA,EACF;AAAA;AAAA,GACF;AAEJ;AAEO,IAAM,sBAAA,GAAyB;AAAA,EACpC,KAAA,EAAO,gBAAA;AAAA,EACP,WAAA,EACE,mKAAA;AAAA,EACF,QAAA,EAAU;AAAA,IACR,EAAE,IAAI,OAAA,EAAS,IAAA,EAAM,QAAQ,KAAA,EAAO,OAAA,EAAS,UAAU,IAAA,EAAK;AAAA,IAC5D,EAAE,IAAI,UAAA,EAAY,IAAA,EAAM,QAAQ,KAAA,EAAO,UAAA,EAAY,MAAM,qCAAA,EAAsC;AAAA,IAC/F,EAAE,IAAI,SAAA,EAAW,IAAA,EAAM,QAAQ,KAAA,EAAO,SAAA,EAAW,MAAM,mCAAA,EAAoC;AAAA,IAC3F,EAAE,IAAI,KAAA,EAAO,IAAA,EAAM,QAAQ,KAAA,EAAO,aAAA,EAAe,SAAS,qBAAA,EAAgB;AAAA,IAC1E;AAAA,MACE,EAAA,EAAI,MAAA;AAAA,MACJ,IAAA,EAAM,KAAA;AAAA,MACN,KAAA,EAAO,eAAA;AAAA,MACP,IAAA,EAAM;AAAA,KACR;AAAA,IACA;AAAA,MACE,EAAA,EAAI,YAAA;AAAA,MACJ,IAAA,EAAM,MAAA;AAAA,MACN,KAAA,EAAO,gBAAA;AAAA,MACP,IAAA,EAAM;AAAA,KACR;AAAA,IACA,EAAE,IAAI,YAAA,EAAc,IAAA,EAAM,SAAS,KAAA,EAAO,YAAA,EAAc,MAAM,6CAAA;AAA8C,GAC9G;AAAA,EACA,OAAA,EAAS;AAAA,IACP;AAAA,MACE,IAAA,EAAM,gBAAA;AAAA,MACN,OAAO,EAAE,KAAA,EAAO,gCAA0B,QAAA,EAAU,uCAAA,EAAmC,KAAK,qBAAA;AAAgB;AAC9G,GACF;AAAA,EACA,SAAA,EAAW,CAAC,MAAA,EAAQ,YAAA,EAAc,SAAS;AAC7C,CAAA;AC3hBA,SAAS,IAAA,CAAK,EAAE,IAAA,EAAM,SAAA,EAAU,EAAyC;AACvE,EAAA,MAAM,CAAA,GAAIsB,cAAc,IAAI,CAAA;AAC5B,EAAA,OAAO,CAAA,mBAAItB,GAAAA,CAAC,CAAA,EAAA,EAAE,WAAsB,CAAA,GAAK,IAAA;AAC3C;AAgBO,SAAS,WAAA,CAAY;AAAA,EAC1B,QAAQ,EAAC;AAAA,EACT,MAAA,GAAS;AACX,CAAA,EAGG;AACD,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAE/B,EAAA,MAAM,IAAA,GAAO,CAAC,IAAA,KACZ,IAAA,CAAK,wBACHA,GAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,IAAA,CAAK,KAAA,EAAO,GAAA,EAAI,EAAA,EAAG,SAAQ,MAAA,EAAO,SAAA,EAAU,qBAAA,EAAsB,CAAA,mBAE5EA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kFACd,QAAA,kBAAAA,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAM,IAAA,CAAK,IAAA,IAAQ,EAAA,EAAI,SAAA,EAAU,wBAAuB,CAAA,EAChE,CAAA;AAGJ,EAAA,IAAI,WAAW,OAAA,EAAS;AAGtB,IAAA,uBACEA,IAAC,SAAA,EAAA,EAAQ,aAAA,EAAa,IAAI,QAAA,EAAU,SAAA,EAAU,oBAC5C,QAAA,kBAAAA,GAAAA,CAAC,QAAG,SAAA,EAAU,sHAAA,EACX,gBAAM,GAAA,CAAI,CAAC,yBACVM,IAAAA,CAAC,IAAA,EAAA,EAAoB,SAAA,EAAU,6CAAA,EAC5B,QAAA,EAAA;AAAA,MAAA,IAAA,CAAK,IAAI,CAAA;AAAA,sBACVA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EACb,QAAA,EAAA;AAAA,wBAAAN,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,uDAAA,EAAyD,eAAK,KAAA,EAAM,CAAA;AAAA,QAChF,IAAA,CAAK,wBACJA,GAAAA,CAAC,OAAE,SAAA,EAAU,+DAAA,EAAiE,eAAK,IAAA,EAAK;AAAA,OAAA,EAE5F;AAAA,KAAA,EAAA,EAPO,IAAA,CAAK,KAQd,CACD,CAAA,EACH,CAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACEA,GAAAA,CAAC,SAAA,EAAA,EAAQ,aAAA,EAAa,GAAA,CAAI,QAAA,EAAU,SAAA,EAAU,kBAAA,EAC5C,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2EAAA,EACZ,QAAA,EAAA,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,IAAA,EAAM,CAAA,qBAC5BM,IAAAA,CAAC,MAAA,EAAA,EAAe,KAAA,EAAO,CAAA,GAAI,GAAA,EAAK,WAAU,iEAAA,EACvC,QAAA,EAAA;AAAA,IAAA,IAAA,CAAK,IAAI,CAAA;AAAA,oBACVA,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAN,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,eAAA,EAAiB,eAAK,KAAA,EAAM,CAAA;AAAA,MACxC,IAAA,CAAK,wBAAQA,GAAAA,CAAC,OAAE,SAAA,EAAU,+BAAA,EAAiC,eAAK,IAAA,EAAK;AAAA,KAAA,EACxE;AAAA,GAAA,EAAA,EALW,CAMb,CACD,CAAA,EACH,CAAA,EACF,CAAA;AAEJ;AAEO,IAAM,iBAAA,GAAoB;AAAA,EAC/B,KAAA,EAAO,cAAA;AAAA,EACP,WAAA,EAAa,mEAAA;AAAA,EACb,QAAA,EAAU;AAAA,IACR;AAAA,MACE,EAAA,EAAI,OAAA;AAAA,MACJ,IAAA,EAAM,MAAA;AAAA,MACN,KAAA,EAAO,UAAA;AAAA,MACP,IAAA,EAAM,6FAAA;AAAA,MACN,QAAA,EAAU,IAAA;AAAA,MACV,EAAA,EAAI;AAAA,QACF;AAAA,UACE,EAAA,EAAI,MAAA;AAAA,UACJ,IAAA,EAAM,MAAA;AAAA,UACN,KAAA,EAAO,MAAA;AAAA,UACP,IAAA,EAAM;AAAA,SACR;AAAA,QACA;AAAA,UACE,EAAA,EAAI,OAAA;AAAA,UACJ,IAAA,EAAM,OAAA;AAAA,UACN,KAAA,EAAO,YAAA;AAAA,UACP,IAAA,EAAM;AAAA,SACR;AAAA,QACA,EAAE,EAAA,EAAI,OAAA,EAAS,IAAA,EAAM,MAAA,EAAQ,OAAO,OAAA,EAAS,IAAA,EAAM,6DAAA,EAA4D,QAAA,EAAU,IAAA,EAAK;AAAA,QAC9H,EAAE,IAAI,MAAA,EAAQ,IAAA,EAAM,QAAQ,KAAA,EAAO,QAAA,EAAU,MAAM,4CAAA;AAA6C;AAClG,KACF;AAAA,IACA;AAAA,MACE,EAAA,EAAI,QAAA;AAAA,MACJ,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,QAAA;AAAA,MACP,OAAA,EAAS,MAAA;AAAA,MACT,IAAA,EAAM,6FAAA;AAAA,MACN,OAAA,EAAS;AAAA,QACP,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO;AAAA,QAC/B,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,OAAA;AAAQ;AACnC;AACF,GACF;AAAA,EACA,OAAA,EAAS;AAAA,IACP;AAAA,MACE,IAAA,EAAM,cAAA;AAAA,MACN,KAAA,EAAO;AAAA,QACL,KAAA,EAAO;AAAA,UACL,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,0BAAA,EAA4B,MAAM,qBAAA,EAAmB;AAAA,UAC7E,EAAE,IAAA,EAAM,YAAA,EAAc,KAAA,EAAO,uBAAA,EAAsB,MAAM,kBAAA,EAAmB;AAAA,UAC5E,EAAE,IAAA,EAAM,aAAA,EAAe,KAAA,EAAO,eAAA,EAAiB,MAAM,uBAAA;AAAwB;AAC/E;AACF;AACF,GACF;AAAA;AAAA,EAEA,WAAW,CAAC,MAAA,EAAQ,SAAA,EAAW,SAAA,EAAW,cAAc,SAAS;AACnE,CAAA;AAEO,SAAS,WAAA,CAAY;AAAA,EAC1B,KAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,GAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,GAAA,GAAM;AACR,CAAA,EAQG;AACD,EAAA,uBACEM,IAAAA,CAAC,SAAA,EAAA,EAAQ,eAAa,GAAA,CAAI,WAAA,EAAa,WAAU,sCAAA,EAC/C,QAAA,EAAA;AAAA,oBAAAN,GAAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,SAAS,iBAAA,CAAkB,KAAA,EAAO,KAAK,GAAA,GAAM,EAAA,EAAI,MAAM,GAAG,CAAA;AAAA,QAC/D,GAAA,EAAK,KAAA;AAAA,QACL,SAAA,EAAU;AAAA;AAAA,KACZ;AAAA,oBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,+IAAA,EACb,QAAA,kBAAAM,KAAC,MAAA,EAAA,EACE,QAAA,EAAA;AAAA,MAAA,OAAA,oBACCN,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,wEAAwE,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,sBAE/FA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,yDAAyD,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,MAC5E,4BAAYA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+BAA+B,QAAA,EAAA,QAAA,EAAS,CAAA;AAAA,MACjE,uBACCA,GAAAA;AAAA,QAAC,IAAA;AAAA,QAAA;AAAA,UACC,IAAI,IAAA,IAAQ,UAAA;AAAA,UACZ,SAAA,EAAU,yIAAA;AAAA,UACV,KAAA,EAAO,EAAE,YAAA,EAAc,yBAAA,EAA0B;AAAA,UAEhD,QAAA,EAAA;AAAA;AAAA;AACH,KAAA,EAEJ,CAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AAEO,IAAM,eAAA,GAAkB;AAAA,EAC7B,KAAA,EAAO,cAAA;AAAA,EACP,WAAA,EAAa,kEAAA;AAAA,EACb,QAAA,EAAU;AAAA,IACR,EAAE,IAAI,SAAA,EAAW,IAAA,EAAM,QAAQ,KAAA,EAAO,SAAA,EAAW,MAAM,iEAAA,EAAkE;AAAA,IACzH,EAAE,EAAA,EAAI,OAAA,EAAS,IAAA,EAAM,MAAA,EAAQ,OAAO,OAAA,EAAS,IAAA,EAAM,kCAAA,EAAoC,QAAA,EAAU,IAAA,EAAK;AAAA,IACtG,EAAE,EAAA,EAAI,UAAA,EAAY,IAAA,EAAM,MAAA,EAAQ,OAAO,UAAA,EAAW;AAAA,IAClD,EAAE,IAAI,KAAA,EAAO,IAAA,EAAM,QAAQ,KAAA,EAAO,cAAA,EAAgB,MAAM,kCAAA,EAAmC;AAAA,IAC3F,EAAE,IAAI,MAAA,EAAQ,IAAA,EAAM,OAAO,KAAA,EAAO,aAAA,EAAe,MAAM,uBAAA,EAAwB;AAAA,IAC/E;AAAA,MACE,EAAA,EAAI,OAAA;AAAA,MACJ,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO,kBAAA;AAAA,MACP,IAAA,EAAM;AAAA,KACR;AAAA,IACA;AAAA,MACE,EAAA,EAAI,KAAA;AAAA,MACJ,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,iBAAA;AAAA,MACP,IAAA,EAAM,6EAAA;AAAA,MACN,GAAA,EAAK,CAAA;AAAA,MACL,GAAA,EAAK,GAAA;AAAA,MACL,OAAA,EAAS;AAAA;AACX,GACF;AAAA,EACA,OAAA,EAAS;AAAA,IACP;AAAA,MACE,IAAA,EAAM,cAAA;AAAA,MACN,KAAA,EAAO;AAAA,QACL,OAAA,EAAS,kBAAA;AAAA,QACT,KAAA,EAAO,iCAAA;AAAA,QACP,QAAA,EAAU,+CAAA;AAAA,QACV,GAAA,EAAK,UAAA;AAAA,QACL,IAAA,EAAM,UAAA;AAAA,QACN,GAAA,EAAK;AAAA;AACP;AACF,GACF;AAAA;AAAA;AAAA,EAGA,SAAA,EAAW,CAAC,MAAA,EAAQ,SAAA,EAAW,cAAc,SAAS;AACxD,CAAA;AAEO,SAAS,cAAA,CAAe,EAAE,KAAA,EAAO,IAAA,EAAK,EAAqC;AAChF,EAAA,uBACEM,IAAAA,CAAC,SAAA,EAAA,EAAQ,eAAa,GAAA,CAAI,SAAA,EAAW,WAAU,kDAAA,EAC5C,QAAA,EAAA;AAAA,IAAA,KAAA,oBAASN,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,sCAAsC,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,oBACpEA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,wEAAwE,QAAA,EAAA,IAAA,EAAK;AAAA,GAAA,EAC5F,CAAA;AAEJ;AAEO,IAAM,kBAAA,GAAqB;AAAA,EAChC,KAAA,EAAO,WAAA;AAAA,EACP,WAAA,EAAa,sFAAA;AAAA,EACb,QAAA,EAAU;AAAA,IACR,EAAE,IAAI,OAAA,EAAS,IAAA,EAAM,QAAQ,KAAA,EAAO,OAAA,EAAS,MAAM,iEAAA,EAA+D;AAAA,IAClH;AAAA,MACE,EAAA,EAAI,MAAA;AAAA,MACJ,IAAA,EAAM,UAAA;AAAA,MACN,KAAA,EAAO,WAAA;AAAA,MACP,IAAA,EAAM,iHAAA;AAAA,MACN,QAAA,EAAU;AAAA;AACZ,GACF;AAAA,EACA,OAAA,EAAS;AAAA,IACP;AAAA,MACE,IAAA,EAAM,WAAA;AAAA,MACN,KAAA,EAAO;AAAA,QACL,KAAA,EAAO,mBAAA;AAAA,QACP,IAAA,EAAM;AAAA;AACR;AACF,GACF;AAAA;AAAA,EAEA,SAAA,EAAW,CAAC,MAAA,EAAQ,YAAA,EAAc,SAAS;AAC7C,CAAA;AAEO,SAAS,YAAA,CAAa;AAAA,EAC3B,KAAA;AAAA,EACA,QAAQ;AACV,CAAA,EAGG;AACD,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAC/B,EAAA,uBACEA,GAAAA,CAAC,SAAA,EAAA,EAAQ,aAAA,EAAa,GAAA,CAAI,YAAA,EAAc,SAAA,EAAU,mBAAA,EAChD,QAAA,kBAAAM,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gCAAA,EACZ,QAAA,EAAA;AAAA,IAAA,KAAA,oBACCN,IAAC,MAAA,EAAA,EACC,QAAA,kBAAAA,IAAC,IAAA,EAAA,EAAG,SAAA,EAAU,iDAAA,EAAmD,QAAA,EAAA,KAAA,EAAM,CAAA,EACzE,CAAA;AAAA,oBAEFA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BACZ,QAAA,EAAA,KAAA,CAAM,KAAA,CAAM,GAAG,CAAC,CAAA,CAAE,IAAI,CAAC,CAAA,EAAG,sBACzBA,GAAAA,CAAC,UAAe,KAAA,EAAO,CAAA,GAAI,KACzB,QAAA,kBAAAM,IAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,gEAAA;AAAA,QACV,KAAA,EAAO,EAAE,YAAA,EAAc,uBAAA,EAAwB;AAAA,QAE/C,QAAA,EAAA;AAAA,0BAAAN,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mBAAA,EAAoB,aAAA,EAAW,MAAC,QAAA,EAAA,gCAAA,EAAK,CAAA;AAAA,0BACpDM,IAAAA,CAAC,YAAA,EAAA,EAAW,SAAA,EAAU,iBAAA,EAAkB,QAAA,EAAA;AAAA,YAAA,QAAA;AAAA,YAAE,CAAA,CAAE,KAAA;AAAA,YAAM;AAAA,WAAA,EAAC,CAAA;AAAA,0BACnDA,IAAAA,CAAC,YAAA,EAAA,EAAW,SAAA,EAAU,kDAAA,EAAmD,QAAA,EAAA;AAAA,YAAA,SAAA;AAAA,YAAG,CAAA,CAAE;AAAA,WAAA,EAAO;AAAA;AAAA;AAAA,KACvF,EAAA,EARW,CASb,CACD,CAAA,EACH;AAAA,GAAA,EACF,CAAA,EACF,CAAA;AAEJ;AAEO,IAAM,qBAAA,GAAwB;AAAA,EACnC,KAAA,EAAO,cAAA;AAAA,EACP,WAAA,EAAa,wDAAA;AAAA,EACb,QAAA,EAAU;AAAA,IACR,EAAE,IAAI,OAAA,EAAS,IAAA,EAAM,QAAQ,KAAA,EAAO,OAAA,EAAS,MAAM,oEAAA,EAAkE;AAAA,IACrH;AAAA,MACE,EAAA,EAAI,OAAA;AAAA,MACJ,IAAA,EAAM,MAAA;AAAA,MACN,KAAA,EAAO,QAAA;AAAA,MACP,IAAA,EAAM,yDAAA;AAAA,MACN,QAAA,EAAU,IAAA;AAAA,MACV,EAAA,EAAI;AAAA,QACF;AAAA,UACE,EAAA,EAAI,OAAA;AAAA,UACJ,IAAA,EAAM,MAAA;AAAA,UACN,KAAA,EAAO,OAAA;AAAA,UACP,IAAA,EAAM,kFAAA;AAAA,UACN,QAAA,EAAU;AAAA,SACZ;AAAA,QACA,EAAE,EAAA,EAAI,QAAA,EAAU,IAAA,EAAM,MAAA,EAAQ,OAAO,QAAA,EAAU,IAAA,EAAM,8CAAA,EAAgD,QAAA,EAAU,IAAA;AAAK;AACtH;AACF,GACF;AAAA,EACA,OAAA,EAAS;AAAA,IACP;AAAA,MACE,IAAA,EAAM,cAAA;AAAA,MACN,KAAA,EAAO;AAAA,QACL,KAAA,EAAO,0BAAA;AAAA,QACP,KAAA,EAAO;AAAA,UACL,EAAE,KAAA,EAAO,6CAAA,EAA+C,MAAA,EAAQ,YAAA,EAAa;AAAA,UAC7E,EAAE,KAAA,EAAO,kDAAA,EAA8C,MAAA,EAAQ,UAAA,EAAW;AAAA,UAC1E,EAAE,KAAA,EAAO,2CAAA,EAA6C,MAAA,EAAQ,UAAA;AAAW;AAC3E;AACF;AACF,GACF;AAAA;AAAA,EAEA,WAAW,CAAC,MAAA,EAAQ,SAAA,EAAW,SAAA,EAAW,cAAc,SAAS;AACnE,CAAA;AAEO,SAAS,cAAA,CAAe,EAAE,KAAA,EAAO,QAAA,EAAS,EAA0C;AACzF,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIJ,SAAS,EAAE,CAAA;AACrC,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,SAAS,KAAK,CAAA;AACtC,EAAA,uBACEF,GAAAA,CAAC,SAAA,EAAA,EAAQ,aAAA,EAAa,GAAA,CAAI,UAAA,EAAY,SAAA,EAAU,0CAAA,EAC9C,QAAA,kBAAAM,IAAAA,CAAC,MAAA,EAAA,EAAO,SAAA,EAAU,2CAAA,EAChB,QAAA,EAAA;AAAA,oBAAAN,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,+BAAA,EAAiC,mBAAS,yBAAA,EAA0B,CAAA;AAAA,IACjF,4BAAYA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,mBAAmB,QAAA,EAAA,QAAA,EAAS,CAAA;AAAA,IACrD,IAAA,mBACCA,GAAAA,CAAC,GAAA,EAAA,EAAE,aAAA,EAAa,GAAA,CAAI,cAAA,EAAgB,SAAA,EAAU,kBAAA,EAAmB,QAAA,EAAA,uCAAA,EAAwB,CAAA,mBAEzFM,IAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,iBAAA;AAAA,QACV,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,IAAI,KAAA,CAAM,IAAA,EAAK,EAAG,OAAA,CAAQ,IAAI,CAAA;AAAA,QAChC,CAAA;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAAN,GAAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACC,eAAa,GAAA,CAAI,eAAA;AAAA,cACjB,IAAA,EAAK,OAAA;AAAA,cACL,QAAA,EAAQ,IAAA;AAAA,cACR,WAAA,EAAY,YAAA;AAAA,cACZ,KAAA,EAAO,KAAA;AAAA,cACP,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,cACxC,SAAA,EAAU,0EAAA;AAAA,cACV,KAAA,EAAO,EAAE,YAAA,EAAc,wBAAA;AAAyB;AAAA,WAClD;AAAA,0BACAA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,eAAa,GAAA,CAAI,gBAAA;AAAA,cACjB,SAAA,EAAU,sEAAA;AAAA,cACV,KAAA,EAAO,EAAE,YAAA,EAAc,yBAAA,EAA0B;AAAA,cAClD,QAAA,EAAA;AAAA;AAAA;AAED;AAAA;AAAA;AACF,GAAA,EAEJ,CAAA,EACF,CAAA;AAEJ;AAEO,IAAM,mBAAA,GAAsB;AAAA,EACjC,KAAA,EAAO,iBAAA;AAAA,EACP,WAAA,EAAa,uDAAA;AAAA,EACb,QAAA,EAAU;AAAA,IACR;AAAA,MACE,EAAA,EAAI,OAAA;AAAA,MACJ,IAAA,EAAM,MAAA;AAAA,MACN,KAAA,EAAO,OAAA;AAAA,MACP,IAAA,EAAM,qDAAA;AAAA,MACN,OAAA,EAAS;AAAA,KACX;AAAA,IACA;AAAA,MACE,EAAA,EAAI,UAAA;AAAA,MACJ,IAAA,EAAM,MAAA;AAAA,MACN,KAAA,EAAO,UAAA;AAAA,MACP,IAAA,EAAM;AAAA;AACR,GACF;AAAA,EACA,OAAA,EAAS;AAAA,IACP;AAAA,MACE,IAAA,EAAM,iBAAA;AAAA,MACN,KAAA,EAAO;AAAA,QACL,KAAA,EAAO,yBAAA;AAAA,QACP,QAAA,EAAU;AAAA;AACZ;AACF,GACF;AAAA;AAAA,EAEA,WAAW,CAAC,MAAA,EAAQ,SAAA,EAAW,SAAA,EAAW,cAAc,SAAS;AACnE,CAAA;ACnYO,SAAS,gBAAA,GAAmB;AACjC,EAAA,uBAAOA,IAAC,WAAA,EAAA,EAAY,CAAA;AACtB;AAEO,IAAM,oBAAA,GAAuB;AAAA,EAClC,KAAA,EAAO,cAAA;AAAA,EACP,WAAA,EACE,yIAAA;AAAA,EACF,UAAU,EAAC;AAAA,EACX,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,gBAAgB,CAAA;AAAA,EAClC,SAAA,EAAW,CAAC,SAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMrB,IAAA,EAAM,EAAE,QAAA,EAAU,EAAE,MAAA,EAAQ,eAAA,EAAiB,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAS,EAAE;AAC1E,CAAA;AAEO,SAAS,gBAAA,GAAmB;AAGjC,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,iBAAA,EAAkB;AACrC,EAAA,uBAAOA,GAAAA,CAAC,iBAAA,EAAA,EAAkB,IAAA,EAAM,MAAA,CAAO,QAAQ,EAAA,EAAI,CAAA;AACrD;AAEO,IAAM,oBAAA,GAAuB;AAAA,EAClC,KAAA,EAAO,gBAAA;AAAA,EACP,WAAA,EACE,sKAAA;AAAA,EACF,UAAU,EAAC;AAAA,EACX,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,kBAAkB,CAAA;AAAA,EACpC,SAAA,EAAW,CAAC,SAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKrB,IAAA,EAAM,EAAE,OAAA,EAAS,EAAE,QAAQ,iBAAA,EAAmB,MAAA,EAAQ,EAAE,IAAA,EAAM,EAAE,MAAA,EAAQ,MAAA,EAAO,IAAI;AACrF,CAAA;;;ACIA,IAAIY,WAAAA,GAAa,KAAA;AAEV,SAAS,wBAAA,GAAiC;AAC/C,EAAA,IAAIA,WAAAA,EAAY;AAChB,EAAAA,WAAAA,GAAa,IAAA;AAIb,EAAA,yBAAA,EAA0B;AAI1B,EAAA,WAAA,CAAY,QAAQ,WAAA,EAAa,EAAE,QAAQ,KAAA,EAAO,GAAG,eAAe,CAAA;AACpE,EAAA,WAAA,CAAY,iBAAiB,aAAA,EAAe,EAAE,QAAQ,KAAA,EAAO,GAAG,wBAAwB,CAAA;AACxF,EAAA,WAAA,CAAY,cAAc,gBAAA,EAAkB,EAAE,QAAQ,KAAA,EAAO,GAAG,qBAAqB,CAAA;AACrF,EAAA,WAAA,CAAY,YAAY,WAAA,EAAa,EAAE,QAAQ,KAAA,EAAO,GAAG,mBAAmB,CAAA;AAC5E,EAAA,WAAA,CAAY,iBAAiB,aAAA,EAAe,EAAE,QAAQ,KAAA,EAAO,GAAG,wBAAwB,CAAA;AACxF,EAAA,WAAA,CAAY,YAAY,WAAA,EAAa,EAAE,QAAQ,KAAA,EAAO,GAAG,mBAAmB,CAAA;AAC5E,EAAA,WAAA,CAAY,UAAU,WAAA,EAAa,EAAE,QAAQ,KAAA,EAAO,GAAG,iBAAiB,CAAA;AACxE,EAAA,WAAA,CAAY,aAAa,cAAA,EAAgB,EAAE,QAAQ,KAAA,EAAO,GAAG,oBAAoB,CAAA;AACjF,EAAA,WAAA,CAAY,gBAAgB,YAAA,EAAc,EAAE,QAAQ,KAAA,EAAO,GAAG,uBAAuB,CAAA;AACrF,EAAA,WAAA,CAAY,cAAc,cAAA,EAAgB,EAAE,QAAQ,KAAA,EAAO,GAAG,qBAAqB,CAAA;AACnF,EAAA,WAAA,CAAY,QAAQ,SAAA,EAAW,EAAE,QAAQ,KAAA,EAAO,GAAG,eAAe,CAAA;AAGlE,EAAA,WAAA,CAAY,cAAc,eAAA,EAAiB,EAAE,QAAQ,KAAA,EAAO,GAAG,qBAAqB,CAAA;AAGpF,EAAA,WAAA,CAAY,SAAS,SAAA,EAAW,EAAE,QAAQ,KAAA,EAAO,GAAG,gBAAgB,CAAA;AACpE,EAAA,WAAA,CAAY,cAAc,UAAA,EAAY,EAAE,QAAQ,KAAA,EAAO,GAAG,qBAAqB,CAAA;AAC/E,EAAA,WAAA,CAAY,cAAc,UAAA,EAAY,EAAE,QAAQ,KAAA,EAAO,GAAG,qBAAqB,CAAA;AAC/E,EAAA,WAAA,CAAY,OAAO,UAAA,EAAY,EAAE,QAAQ,KAAA,EAAO,GAAG,cAAc,CAAA;AACjE,EAAA,WAAA,CAAY,SAAS,YAAA,EAAc,EAAE,QAAQ,KAAA,EAAO,GAAG,gBAAgB,CAAA;AACvE,EAAA,WAAA,CAAY,aAAa,aAAA,EAAe,EAAE,QAAQ,KAAA,EAAO,GAAG,oBAAoB,CAAA;AAChF,EAAA,WAAA,CAAY,SAAS,SAAA,EAAW,EAAE,QAAQ,KAAA,EAAO,GAAG,gBAAgB,CAAA;AAIpE,EAAA,WAAA,CAAY,kBAAkB,cAAA,EAAgB,EAAE,QAAQ,KAAA,EAAO,GAAG,yBAAyB,CAAA;AAC3F,EAAA,WAAA,CAAY,oBAAoB,gBAAA,EAAkB,EAAE,QAAQ,KAAA,EAAO,GAAG,2BAA2B,CAAA;AACjG,EAAA,WAAA,CAAY,cAAc,UAAA,EAAY,EAAE,QAAQ,KAAA,EAAO,GAAG,qBAAqB,CAAA;AAC/E,EAAA,WAAA,CAAY,iBAAiB,aAAA,EAAe,EAAE,QAAQ,KAAA,EAAO,GAAG,wBAAwB,CAAA;AAGxF,EAAA,WAAA,CAAY,eAAe,gBAAA,EAAkB,EAAE,QAAQ,KAAA,EAAO,GAAG,sBAAsB,CAAA;AACvF,EAAA,WAAA,CAAY,eAAe,gBAAA,EAAkB,EAAE,QAAQ,KAAA,EAAO,GAAG,sBAAsB,CAAA;AACzF;AAMO,SAAS,iBAAiB,QAAA,EAAqD;AACpF,EAAA,OAAO,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,EAAS,CAAA,KAAM;AAClC,IAAA,MAAM,EAAE,IAAA,EAAM,GAAG,KAAA,EAAM,GAAI,OAAA;AAC3B,IAAA,OAAO,EAAE,MAAM,EAAA,EAAI,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,CAAC,IAAI,KAAA,EAAwC;AAAA,EAC7E,CAAC,CAAA;AACH;ACzFO,SAAS,kBAAA,CACd,QACA,QAAA,EAC0B;AAC1B,EAAA,IAAI,CAAC,UAAU,OAAO,MAAA;AAEtB,EAAA,MAAM,IAAA,GAAiC,EAAE,GAAG,MAAA,EAAQ,QAAQ,QAAA,EAAS;AAErE,EAAA,IAAI,QAAA,CAAS,QAAA,EAAU,IAAA,CAAK,QAAA,GAAW,QAAA,CAAS,QAAA;AAChD,EAAA,IAAI,QAAA,CAAS,MAAA,EAAQ,IAAA,CAAK,MAAA,GAAS,QAAA,CAAS,MAAA;AAO5C,EAAA,IAAI,QAAA,CAAS,gBAAgB,MAAA,EAAQ;AACnC,IAAA,IAAA,CAAK,WAAW,EAAE,GAAG,OAAO,QAAA,EAAU,OAAA,EAAS,SAAS,cAAA,EAAe;AAAA,EACzE;AAEA,EAAA,IAAI,QAAA,CAAS,qBAAqB,MAAA,EAAW;AAC3C,IAAA,IAAA,CAAK,WAAW,EAAE,GAAG,OAAO,QAAA,EAAU,SAAA,EAAW,SAAS,gBAAA,EAAiB;AAAA,EAC7E;AAKA,EAAA,IAAI,QAAA,CAAS,kBAAkB,KAAA,EAAO;AACpC,IAAA,IAAA,CAAK,WAAW,EAAE,GAAG,IAAA,CAAK,QAAA,EAAU,UAAU,IAAA,EAAK;AAAA,EACrD;AAEA,EAAA,OAAO,IAAA;AACT;AAeO,SAAS,oBAAA,CAAqB;AAAA,EACnC,MAAA;AAAA,EACA;AACF,CAAA,EAGG;AACD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIb,MAAAA,CAAM,SAA+B,IAAI,CAAA;AAErE,EAAAA,MAAAA,CAAM,UAAU,MAAM;AACpB,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI;AACF,MAAA,QAAA,GAAW,MAAA,CAAO,YAAYL,eAAAA,EAAgB;AAAA,IAChD,CAAA,CAAA,MAAQ;AACN,MAAA;AAAA,IACF;AACA,IAAA,IAAI,OAAO,QAAA,CAAS,sBAAA,KAA2B,UAAA,EAAY;AAC3D,IAAA,KAAK,QAAA,CACF,sBAAA,EAAuB,CACvB,IAAA,CAAK,CAAC,QAAA,KAAa;AAClB,MAAA,IAAI,SAAA,EAAW;AACf,MAAA,SAAA,CAAU,QAAQ,CAAA;AAKlB,MAAA,4BAAA,CAA6B,MAAM,UAAU,aAAa,CAAA;AAAA,IAC5D,CAAC,CAAA,CACA,KAAA,CAAM,MAAM;AAAA,IAA+B,CAAC,CAAA;AAC/C,IAAA,OAAO,MAAM;AAAE,MAAA,SAAA,GAAY,IAAA;AAAA,IAAK,CAAA;AAAA,EAClC,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAA,MAAM,QAAA,GAAWK,MAAAA,CAAM,OAAA,CAAQ,MAAM,kBAAA,CAAmB,MAAA,EAAQ,MAAM,CAAA,EAAG,CAAC,MAAA,EAAQ,MAAM,CAAC,CAAA;AAEzF,EAAA,uBAAOC,GAAAA,CAAC,wBAAA,EAAA,EAAyB,KAAA,EAAO,UAAW,QAAA,EAAS,CAAA;AAC9D;ACXA,IAAM,UAAA,GAAwF;AAAA,EAC5F,MAAM,EAAE,MAAA,EAAQ,OAAO,IAAA,EAAM,KAAA,EAAO,OAAO,KAAA,EAAM;AAAA,EACjD,MAAM,EAAE,MAAA,EAAQ,OAAO,IAAA,EAAM,MAAA,EAAQ,OAAO,KAAA,EAAM;AAAA,EAClD,OAAO,EAAE,MAAA,EAAQ,QAAQ,IAAA,EAAM,MAAA,EAAQ,OAAO,MAAA,EAAO;AAAA,EACrD,MAAM,EAAE,MAAA,EAAQ,SAAS,IAAA,EAAM,MAAA,EAAQ,OAAO,OAAA;AAChD,CAAA;AAEA,IAAM,aAAA,GAA6D;AAAA,EACjE,UAAA,EAAY,cAAA;AAAA,EACZ,UAAA,EAAY,cAAA;AAAA,EACZ,OAAA,EAAS,WAAA;AAAA,EACT,iBAAA,EAAmB,sBAAA;AAAA,EACnB,IAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAgB,mBAAA;AAAA,EAChB,KAAA,EAAO,SAAA;AAAA,EACP,eAAA,EAAiB,oBAAA;AAAA,EACjB,MAAA,EAAQ,UAAA;AAAA,EACR,gBAAA,EAAkB,gBAAA;AAAA,EAClB,gBAAA,EAAkB,gBAAA;AAAA,EAClB,sBAAA,EAAwB,sBAAA;AAAA,EACxB,sBAAA,EAAwB,sBAAA;AAAA,EACxB,MAAA,EAAQ,aAAA;AAAA,EACR,gBAAA,EAAkB;AACpB,CAAA;AAGO,IAAM,sBAAA,GAAyB;AAAA,EACpC,OAAA,EAAS,YAAA;AAAA,EACT,SAAA,EAAW,WAAA;AAAA,EACX,WAAA,EAAa,iBAAA;AAAA,EACb,MAAA,EAAQ;AACV;AAIO,IAAM,kBAAA,GAAqB,MAAA,CAAO,IAAA,CAAK,sBAAsB;AAS7D,SAAS,UAAA,CAAW,KAAA,EAAwB,OAAA,GAA2B,EAAC,EAAW;AACxF,EAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,IAAY,OAAA;AACrC,EAAA,MAAM,SAAS,QAAA,KAAa,OAAA;AAC5B,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,MAAM,KAAK,MAAA,CAAO,OAAA,CAAQ,aAAa,CAAA,EAA8C;AACpG,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,MAAA,GAAS,GAAG,CAAA;AAChC,IAAA,IAAI,OAAO,KAAA,CAAM,IAAA,CAAK,GAAG,MAAM,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,EAC9C;AAEA,EAAA,IAAI,CAAC,KAAA,CAAM,MAAA,EAAQ,gBAAA,IAAoB,KAAA,CAAM,QAAQ,UAAA,EAAY;AAC/D,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,gBAAA,EAAmB,KAAA,CAAM,MAAA,CAAO,UAAU,CAAA,CAAA,CAAG,CAAA;AAAA,EAC1D;AACA,EAAA,IAAI,CAAC,KAAA,CAAM,MAAA,EAAQ,gBAAA,IAAoB,KAAA,CAAM,QAAQ,UAAA,EAAY;AAC/D,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,gBAAA,EAAmB,KAAA,CAAM,MAAA,CAAO,UAAU,CAAA,CAAA,CAAG,CAAA;AAAA,EAC1D;AAEA,EAAA,IAAI,MAAM,IAAA,EAAM;AACd,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,IAAA,CAAK,QAAA,IAAY,YAAA;AACxC,IAAA,KAAA,CAAM,KAAK,CAAA,gBAAA,EAAmB,KAAA,CAAM,KAAK,IAAI,CAAA,GAAA,EAAM,QAAQ,CAAA,CAAA,CAAG,CAAA;AAC9D,IAAA,KAAA,CAAM,KAAK,CAAA,oBAAA,EAAuB,KAAA,CAAM,KAAK,OAAO,CAAA,GAAA,EAAM,QAAQ,CAAA,CAAA,CAAG,CAAA;AACrE,IAAA,IAAI,KAAA,CAAM,IAAA,CAAK,OAAA,EAAS,KAAA,CAAM,IAAA,CAAK,CAAA,oBAAA,EAAuB,KAAA,CAAM,IAAA,CAAK,OAAO,CAAA,GAAA,EAAM,QAAQ,CAAA,CAAA,CAAG,CAAA;AAC7F,IAAA,IAAI,KAAA,CAAM,KAAK,KAAA,EAAO,KAAA,CAAM,KAAK,CAAA,kBAAA,EAAqB,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA,SAAA,CAAW,CAAA;AAAA,EACnF;AAGA,EAAA,KAAA,MAAW,CAACmB,MAAAA,EAAO,MAAM,KAAK,MAAA,CAAO,OAAA,CAAQ,sBAAsB,CAAA,EAAkC;AACnG,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,MAAA,CAAO,OAAA,CAAQ,KAAA,CAAMA,MAAK,CAAA,IAAK,EAAE,CAAA,EAAG;AAC7D,MAAA,KAAA,CAAM,KAAK,CAAA,EAAG,MAAM,IAAI,GAAG,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,IAC1C;AAAA,EACF;AAGA,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,MAAA,CAAO,QAAQ,KAAA,CAAM,MAAA,IAAU,EAAE,CAAA,EAAG;AAC7D,IAAA,MAAM,OAAO,GAAA,CAAI,UAAA,CAAW,IAAI,CAAA,GAAI,GAAA,GAAM,KAAK,GAAG,CAAA,CAAA;AAClD,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,IAAI,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,EACjC;AAEA,EAAA,MAAM,MAAA,GAAS,UAAA,CAAW,KAAA,CAAM,MAAA,IAAU,MAAM,CAAA;AAChD,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,iBAAA,EAAoB,MAAA,CAAO,MAAM,CAAA,CAAA,CAAG,CAAA;AAC/C,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,eAAA,EAAkB,MAAA,CAAO,IAAI,CAAA,CAAA,CAAG,CAAA;AAC3C,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,gBAAA,EAAmB,MAAA,CAAO,KAAK,CAAA,CAAA,CAAG,CAAA;AAC7C,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,oBAAA,EAAuB,MAAA,CAAO,MAAM,CAAA,CAAA,CAAG,CAAA;AAClD,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,kBAAA,EAAqB,MAAA,CAAO,IAAI,CAAA,CAAA,CAAG,CAAA;AAC9C,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,mBAAA,EAAsB,MAAA,CAAO,KAAK,CAAA,CAAA,CAAG,CAAA;AAKhD,EAAA,MAAM,IAAA,GAAO,SAAS,QAAA,GAAW,MAAA;AACjC,EAAA,MAAM,EAAA,GAAK,CAAC,GAAA,KAAiB,MAAA,GAAS,GAAG,QAAQ,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,GAAK,GAAA;AAE7D,EAAA,IAAI,GAAA,GAAM,GAAG,QAAQ,CAAA;AAAA,EAAA,EAAS,KAAA,CAAM,IAAA,CAAK,MAAM,CAAC;AAAA;AAAA,CAAA;AAChD,EAAA,GAAA,IAAO,GAAG,IAAI,CAAA;AAAA,CAAA;AACd,EAAA,GAAA,IAAO,CAAA,EAAG,CAAC,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,aAAa,CAAA,CAAE,GAAA,CAAI,EAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,CAAA;AACpE,EAAA,IAAI,MAAM,gBAAA,EAAkB;AAC1B,IAAA,GAAA,IAAO,CAAA,EAAG,EAAA,CAAG,SAAS,CAAC,CAAA;AAAA,CAAA;AAAA,EACzB;AACA,EAAA,IAAI,KAAA,CAAM,QAAQ,YAAA,EAAc;AAC9B,IAAA,GAAA,IAAO,CAAA,EAAG,EAAA,CAAG,cAAc,CAAC,CAAA;AAAA,CAAA;AAAA,EAC9B;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,gBAAgB,KAAA,EAAuC;AAC9D,EAAA,IAAI,CAAC,KAAA,CAAM,IAAA,EAAM,OAAO,IAAA;AACxB,EAAA,MAAM,WACJ,KAAA,CAAM,IAAA,CAAK,WAAA,IACX,CAAC,MAAM,IAAA,CAAK,OAAA,EAAS,KAAA,CAAM,IAAA,CAAK,MAAM,KAAA,CAAM,IAAA,CAAK,SAAS,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA,CAAE,MAAA;AAAA,IAC1E,CAACD,EAAAA,KAAmB,OAAA,CAAQA,EAAC;AAAA,GAC/B;AACF,EAAA,MAAM,SAAS,CAAC,GAAG,IAAI,GAAA,CAAI,QAAQ,CAAC,CAAA;AACpC,EAAA,MAAM,SAAS,MAAA,CACZ,GAAA,CAAI,CAACA,EAAAA,KAAM,UAAU,kBAAA,CAAmBA,EAAC,CAAA,CAAE,OAAA,CAAQ,QAAQ,GAAG,CAAC,CAAA,yBAAA,CAA2B,CAAA,CAC1F,KAAK,GAAG,CAAA;AACX,EAAA,OAAO,qCAAqC,MAAM,CAAA,aAAA,CAAA;AACpD;AAKO,SAAS,oBAAA,CAAqB;AAAA,EACnC,KAAA;AAAA,EACA;AACF,CAAA,EAIG;AACD,EAAA,MAAM,SAAA,GAAY,gBAAgB,KAAK,CAAA;AAIvC,EAAA,MAAM,SAAS,QAAA,GAAW,CAAA,eAAA,EAAkB,YAAA,CAAa,QAAQ,CAAC,CAAA,CAAA,GAAK,gBAAA;AAEvE,EAAApB,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,SAAA,EAAW;AAChB,IAAA,IAAI,IAAA,GAAO,QAAA,CAAS,cAAA,CAAe,MAAM,CAAA;AACzC,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,IAAA,GAAO,QAAA,CAAS,cAAc,MAAM,CAAA;AACpC,MAAA,IAAA,CAAK,EAAA,GAAK,MAAA;AACV,MAAA,IAAA,CAAK,GAAA,GAAM,YAAA;AACX,MAAA,QAAA,CAAS,IAAA,CAAK,YAAY,IAAI,CAAA;AAAA,IAChC;AACA,IAAA,IAAA,CAAK,IAAA,GAAO,SAAA;AAGZ,IAAA,IAAI,CAAC,QAAA,EAAU;AACf,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,cAAA,CAAe,MAAM,CAAA,EAAG,MAAA,EAAO;AAAA,IAC1C,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,SAAA,EAAW,MAAA,EAAQ,QAAQ,CAAC,CAAA;AAEhC,EAAA,OAAOC,MAAAA,CAAM,aAAA;AAAA,IACX,OAAA;AAAA,IACA,EAAE,eAAA,EAAiB,KAAA,CAAM,IAAA,EAAK;AAAA,IAC9B,UAAA,CAAW,KAAA,EAAO,EAAE,QAAA,EAAU;AAAA,GAChC;AACF;AAEA,SAAS,aAAa,KAAA,EAAuB;AAC3C,EAAA,OAAO,KAAA,CAAM,QAAQ,gBAAA,EAAkB,GAAG,EAAE,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA,CAAE,WAAA,EAAY;AAChF;AC5PO,SAAS,aAAA,CAAc,EAAE,OAAA,EAAQ,EAA4B;AAClE,EAAA,MAAM,SAAS,mBAAA,EAAoB;AACnC,EAAA,MAAM,EAAE,MAAA,EAAQ,YAAA,EAAa,GAAI,MAAA;AACjC,EAAA,MAAM,gBAAA,GAAmB,eAAA,CAAgB,CAACJ,EAAAA,KAAMA,GAAE,SAAS,CAAA;AAC3D,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIO,SAAS,EAAE,CAAA;AACnC,EAAA,MAAM,QAAA,GAAWC,OAAyB,IAAI,CAAA;AAE9C,EAAAL,UAAU,MAAM;AACd,IAAA,QAAA,CAAS,SAAS,KAAA,EAAM;AAExB,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,QAAA;AACrC,IAAA,QAAA,CAAS,IAAA,CAAK,MAAM,QAAA,GAAW,QAAA;AAC/B,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,IAAA,CAAK,MAAM,QAAA,GAAW,QAAA;AAAA,IACjC,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAII,SAAS,EAAE,CAAA;AACrC,EAAAJ,UAAU,MAAM;AACd,IAAA,MAAM,EAAA,GAAK,WAAW,MAAM,QAAA,CAAS,KAAK,IAAA,EAAM,GAAG,GAAG,CAAA;AACtD,IAAA,OAAO,MAAM,aAAa,EAAE,CAAA;AAAA,EAC9B,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAA,MAAMG,OAAAA,GAAS,KAAA,CAAM,MAAA,IAAU,YAAA,CAAa,QAAA;AAC5C,EAAA,MAAM,EAAE,QAAA,EAAU,OAAA,EAAQ,GAAI,WAAA;AAAA,IAC5BA,OAAAA,GAAS,EAAE,MAAA,EAAQ,QAAA,EAAU,QAAQ,KAAA,EAAO,KAAA,EAAO,YAAA,CAAa,gBAAA,EAAiB,GAAI,EAAE,MAAA,EAAQ,QAAA,EAAU,OAAO,CAAA;AAAE,GACpH;AACA,EAAA,MAAM,WAAA,GAAcQ,OAAAA;AAAA,IAClB,MAAOR,UAAS,QAAA,CAAS,KAAA,CAAM,GAAG,YAAA,CAAa,gBAAgB,IAAI,EAAC;AAAA,IACpE,CAACA,OAAAA,EAAQ,QAAA,EAAU,YAAA,CAAa,gBAAgB;AAAA,GAClD;AAEA,EAAA,MAAM,MAAA,GAAS,CAAC,KAAA,KAAkB;AAChC,IAAA,MAAM,CAAA,GAAI,MAAM,IAAA,EAAK;AACrB,IAAA,IAAI,CAAC,CAAA,EAAG;AAGR,IAAA,gBAAA,CAAiB,CAAC,CAAA;AAClB,IAAA,UAAA,CAAW,GAAG,YAAA,CAAa,WAAW,MAAM,kBAAA,CAAmB,CAAC,CAAC,CAAA,CAAE,CAAA;AACnE,IAAA,OAAA,EAAQ;AAAA,EACV,CAAA;AAEA,EAAA,uBACEK,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,eAAa,GAAA,CAAI,aAAA;AAAA,MACjB,SAAA,EAAU,oCAAA;AAAA,MACV,IAAA,EAAK,QAAA;AAAA,MACL,YAAA,EAAW,MAAA;AAAA,MACX,YAAA,EAAW,iBAAA;AAAA,MAEX,QAAA,EAAA;AAAA,wBAAAN,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,YAAA,EAAW,cAAA;AAAA,YACX,eAAa,GAAA,CAAI,kBAAA;AAAA,YACjB,OAAA,EAAS,OAAA;AAAA,YACT,SAAA,EAAU;AAAA;AAAA,SACZ;AAAA,wBAEAM,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kDAAA,EACb,QAAA,EAAA;AAAA,0BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6DAAA,EACb,QAAA,EAAA;AAAA,4BAAAN,GAAAA,CAAC,MAAA,EAAA,EAAO,SAAA,EAAU,6BAAA,EAA8B,eAAW,IAAA,EAAC,CAAA;AAAA,4BAC5DA,GAAAA;AAAA,cAAC,OAAA;AAAA,cAAA;AAAA,gBACC,GAAA,EAAK,QAAA;AAAA,gBACL,eAAa,GAAA,CAAI,kBAAA;AAAA,gBACjB,IAAA,EAAK,QAAA;AAAA,gBACL,KAAA,EAAO,IAAA;AAAA,gBACP,aAAa,YAAA,CAAa,WAAA;AAAA,gBAC1B,UAAU,CAAC,CAAA,KAAM,OAAA,CAAQ,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,gBACvC,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,kBAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,QAAA,EAAU,OAAA,EAAQ;AAChC,kBAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,EAAS,MAAA,CAAO,IAAI,CAAA;AAAA,gBACpC,CAAA;AAAA,gBACA,SAAA,EAAU;AAAA;AAAA,aACZ;AAAA,4BACAA,GAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,YAAA,EAAW,cAAA;AAAA,gBACX,OAAA,EAAS,OAAA;AAAA,gBACT,SAAA,EAAU,sDAAA;AAAA,gBAEV,0BAAAA,GAAAA,CAACuB,CAAAA,EAAA,EAAE,SAAA,EAAU,SAAA,EAAU,eAAW,IAAA,EAAC;AAAA;AAAA;AACrC,WAAA,EACF,CAAA;AAAA,UAECtB,OAAAA,oBACCD,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,qCAAA,EACZ,QAAA,EAAA,OAAA,IAAW,YAAY,MAAA,KAAW,CAAA,mBACjCA,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,+CAAA,EACZ,QAAA,EAAA,KAAA,CAAM,KAAK,EAAE,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,YAAA,CAAa,gBAAA,EAAkB,CAAC,CAAA,EAAG,EAAE,GAAA,CAAI,CAAC,GAAG,CAAA,qBAC1EA,GAAAA,CAAC,KAAA,EAAA,EAAY,SAAA,EAAU,wCAAA,EAAA,EAAb,CAAsD,CACjE,CAAA,EACH,IACE,WAAA,CAAY,MAAA,KAAW,oBACzBM,IAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,gDAAA,EACV,QAAA,EAAA;AAAA,YAAA,YAAA,CAAa,UAAA;AAAA,YAAW,SAAA;AAAA,YAAG,KAAA;AAAA,YAAM;AAAA,WAAA,EACpC,CAAA,mBAEAA,IAAAA,CAAAO,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,4BAAAb,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0CAAA,EACZ,QAAA,EAAA,WAAA,CAAY,GAAA;AAAA,cAAI,CAAC,YAChB,YAAA,CAAa,gBAAA,mBACXA,GAAAA,CAACD,MAAAA,CAAM,QAAA,EAAN,EACE,QAAA,EAAA,YAAA,CAAa,gBAAA,CAAiB,OAAO,CAAA,EAAA,EADnB,OAAA,CAAQ,EAE7B,CAAA,mBAEAC,GAAAA,CAAC,kBAAgC,OAAA,EAAkB,UAAA,EAAY,OAAA,EAAA,EAA1C,OAAA,CAAQ,EAA2C;AAAA,aAE5E,EACF,CAAA;AAAA,4BACAA,GAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,eAAa,GAAA,CAAI,gBAAA;AAAA,gBACjB,OAAA,EAAS,MAAM,MAAA,CAAO,IAAI,CAAA;AAAA,gBAC1B,SAAA,EAAU,0HAAA;AAAA,gBAET,QAAA,EAAA,YAAA,CAAa;AAAA;AAAA;AAChB,WAAA,EACF,CAAA,EAEJ;AAAA,SAAA,EAEJ;AAAA;AAAA;AAAA,GACF;AAEJ;AAEA,SAAS,cAAA,CAAe,EAAE,OAAA,EAAS,UAAA,EAAW,EAAiD;AAC7F,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,CAAA,IAAK,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA;AACzE,EAAA,uBACEM,IAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,eAAa,GAAA,CAAI,gBAAA;AAAA,MACjB,aAAW,OAAA,CAAQ,IAAA;AAAA,MACnB,SAAS,MAAM;AACb,QAAA,UAAA,CAAW,CAAA,SAAA,EAAY,OAAA,CAAQ,IAAI,CAAA,CAAE,CAAA;AACrC,QAAA,UAAA,EAAW;AAAA,MACb,CAAA;AAAA,MACA,SAAA,EAAU,+FAAA;AAAA,MAEV,QAAA,EAAA;AAAA,wBAAAN,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+DAAA,EACZ,mCACCA,GAAAA;AAAA,UAAC,WAAA;AAAA,UAAA;AAAA,YACC,KAAK,KAAA,CAAM,GAAA;AAAA,YACX,GAAA,EAAK,KAAA,CAAM,OAAA,IAAW,OAAA,CAAQ,IAAA;AAAA,YAC9B,SAAA,EAAU;AAAA;AAAA,SACZ,EAEJ,CAAA;AAAA,wBACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,kCAAA,EAAoC,kBAAQ,IAAA,EAAK,CAAA;AAAA,wBAC9DM,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAA,EACb,QAAA,EAAA;AAAA,0BAAAN,GAAAA,CAAC,SAAM,KAAA,EAAO,OAAA,CAAQ,OAAO,SAAA,EAAW,OAAA,CAAQ,kBAAkB,MAAA,EAAW,CAAA;AAAA,0BAC7EA,GAAAA,CAAC,YAAA,EAAA,EAAa,KAAA,EAAO,OAAA,CAAQ,OAAO,QAAA,EAAU,OAAA,CAAQ,QAAA,EAAU,OAAA,EAAQ,MAAA,EAAO;AAAA,SAAA,EACjF;AAAA;AAAA;AAAA,GACF;AAEJ;AC9JA,IAAM,WAAA,GAAmC;AAAA,EACvC,eAAA,EAAiB,6CAAA;AAAA,EACjB,KAAA,EAAO,6CAAA;AAAA,EACP,WAAA,EAAa;AACf,CAAA;AAEA,IAAM,aAAA,GAAqC;AAAA,EACzC,WAAA,EAAa;AACf,CAAA;AAEA,IAAM,gBAAA,GAAmB,wCAAA;AAEzB,SAAS,eAAA,GAAkB;AACzB,EAAA,MAAM,SAAS,mBAAA,EAAoB;AACnC,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIE,SAAS,MAAM;AAC/C,IAAA,IAAI;AACF,MAAA,OAAO,YAAA,CAAa,OAAA,CAAQ,gBAAgB,CAAA,KAAM,MAAA,CAAO,YAAA;AAAA,IAC3D,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF,CAAC,CAAA;AACD,EAAA,IAAI,CAAC,MAAA,CAAO,YAAA,IAAgB,SAAA,EAAW,OAAO,IAAA;AAE9C,EAAA,MAAM,UAAU,MAAM;AACpB,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,IAAI;AACF,MAAA,YAAA,CAAa,OAAA,CAAQ,gBAAA,EAAkB,MAAA,CAAO,YAAA,IAAgB,EAAE,CAAA;AAAA,IAClE,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF,CAAA;AAEA,EAAA,uBACEI,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,eAAa,GAAA,CAAI,eAAA;AAAA,MACjB,SAAA,EAAU,oEAAA;AAAA,MACV,KAAA,EAAO;AAAA,QACL,eAAA,EAAiB,gDAAA;AAAA,QACjB,KAAA,EAAO;AAAA,OACT;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,MAAA,CAAO,YAAA;AAAA,wBACRN,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,YAAA,EAAW,cAAA;AAAA,YACX,OAAA,EAAS,OAAA;AAAA,YACT,SAAA,EAAU,4GAAA;AAAA,YAEV,QAAA,kBAAAA,GAAAA,CAACuB,CAAAA,EAAA,EAAE,WAAU,aAAA,EAAc;AAAA;AAAA;AAC7B;AAAA;AAAA,GACF;AAEJ;AAGA,SAAS,UAAA,GAAa;AACpB,EAAA,MAAM,SAAS,mBAAA,EAAoB;AACnC,EAAA,MAAM,OAAA,GAAU,OAAO,MAAA,EAAQ,OAAA;AAC/B,EAAA,MAAM,MAAA,GAAS,OAAO,MAAA,EAAQ,MAAA;AAC9B,EAAA,IAAI,CAAC,SAAS,KAAA,IAAS,CAAC,SAAS,KAAA,IAAS,CAAC,MAAA,EAAQ,MAAA,EAAQ,OAAO,IAAA;AAClE,EAAA,uBACEvB,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6CAAA,EAA8C,KAAA,EAAO,aAAA,EAClE,QAAA,kBAAAM,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4DAAA,EACZ,QAAA,EAAA;AAAA,IAAA,OAAA,EAAS,KAAA,oBACRA,IAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,kCAAA,EACd,QAAA,EAAA;AAAA,sBAAAN,GAAAA,CAAC,KAAA,EAAA,EAAM,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,MAAE,GAAA;AAAA,MAAE,OAAA,CAAQ;AAAA,KAAA,EACzC,CAAA;AAAA,IAED,SAAS,KAAA,oBACRM,IAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,kCAAA,EACd,QAAA,EAAA;AAAA,sBAAAN,GAAAA,CAACwB,IAAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,MAAE,GAAA;AAAA,MAAE,OAAA,CAAQ;AAAA,KAAA,EACxC,CAAA;AAAA,oBAEFxB,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iCAAA,EACb,QAAA,EAAA,MAAA,EAAQ,GAAA,CAAI,CAACL,EAAAA,qBACZK,GAAAA,CAAC,GAAA,EAAA,EAAe,IAAA,EAAML,EAAAA,CAAE,IAAA,EAAM,MAAA,EAAO,QAAA,EAAS,GAAA,EAAI,YAAA,EAAa,SAAA,EAAU,iBAAA,EACtE,QAAA,EAAAA,EAAAA,CAAE,KAAA,EAAA,EADGA,EAAAA,CAAE,IAEV,CACD,CAAA,EACH;AAAA,GAAA,EACF,CAAA,EACF,CAAA;AAEJ;AAEA,SAAS,WAAA,CAAY,EAAE,SAAA,EAAW,QAAA,GAAW,OAAM,EAA+C;AAChG,EAAA,MAAM,SAAS,mBAAA,EAAoB;AACnC,EAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,CAACA,EAAAA,KAAMA,GAAE,MAAM,CAAA;AAC9C,EAAA,MAAM,SAAA,GAAY,eAAA,CAAgB,CAACA,EAAAA,KAAMA,GAAE,SAAS,CAAA;AACpD,EAAA,MAAM,OAAO,WAAA,EAAY;AACzB,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIO,SAAS,KAAK,CAAA;AACtC,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAAS,KAAK,CAAA;AAI5C,EAAA,IAAI,MAAA,CAAO,MAAA,CAAO,IAAA,KAAS,SAAA,EAAW;AACpC,IAAA,uBACEI,IAAAA,CAAAO,QAAAA,EAAA,EACG,QAAA,EAAA;AAAA,MAAA,QAAA,mBACCb,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,YAAA,EAAW,iBAAA;AAAA,UACX,eAAa,GAAA,CAAI,kBAAA;AAAA,UACjB,OAAA,EAAS,MAAM,UAAA,CAAW,IAAI,CAAA;AAAA,UAC9B,SAAA,EAAU,wDAAA;AAAA,UAEV,QAAA,kBAAAA,GAAAA,CAACyB,MAAAA,EAAA,EAAO,WAAU,SAAA,EAAU;AAAA;AAAA,0BAG9BnB,IAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,eAAa,GAAA,CAAI,kBAAA;AAAA,UACjB,OAAA,EAAS,MAAM,UAAA,CAAW,IAAI,CAAA;AAAA,UAC9B,SAAA,EAAW,CAAA,oHAAA,EAAuH,SAAA,IAAa,EAAE,CAAA,CAAA;AAAA,UACjJ,KAAA,EAAO;AAAA,YACL,YAAA,EAAc,wBAAA;AAAA,YACd,WAAA,EAAa;AAAA,WACf;AAAA,UAEA,QAAA,EAAA;AAAA,4BAAAN,IAACyB,MAAAA,EAAA,EAAO,SAAA,EAAU,6BAAA,EAA8B,eAAW,IAAA,EAAC,CAAA;AAAA,4BAC5DzB,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,YAAY,QAAA,EAAA,MAAA,IAAU,MAAA,CAAO,OAAO,WAAA,EAAY;AAAA;AAAA;AAAA,OAClE;AAAA,MAED,OAAA,oBAAWA,GAAAA,CAAC,aAAA,EAAA,EAAc,SAAS,MAAM,UAAA,CAAW,KAAK,CAAA,EAAG;AAAA,KAAA,EAC/D,CAAA;AAAA,EAEJ;AAIA,EAAA,IAAI,QAAA,IAAY,CAAC,IAAA,EAAM;AACrB,IAAA,uBACEA,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,YAAA,EAAW,iBAAA;AAAA,QACX,eAAa,GAAA,CAAI,kBAAA;AAAA,QACjB,OAAA,EAAS,MAAM,OAAA,CAAQ,IAAI,CAAA;AAAA,QAC3B,SAAA,EAAU,wDAAA;AAAA,QAEV,QAAA,kBAAAA,GAAAA,CAACyB,MAAAA,EAAA,EAAO,WAAU,SAAA,EAAU;AAAA;AAAA,KAC9B;AAAA,EAEJ;AAEA,EAAA,uBACEnB,KAAC,KAAA,EAAA,EAAI,SAAA,EAAW,YAAY,QAAA,GAAW,iBAAA,GAAqB,SAAA,IAAa,EAAG,CAAA,CAAA,EAC1E,QAAA,EAAA;AAAA,oBAAAN,GAAAA,CAACyB,MAAAA,EAAA,EAAO,SAAA,EAAU,iFAAA,EAAkF,CAAA;AAAA,oBACpGzB,GAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,eAAa,GAAA,CAAI,YAAA;AAAA,QACjB,IAAA,EAAK,QAAA;AAAA,QACL,WAAA,EAAa,OAAO,MAAA,CAAO,WAAA;AAAA,QAC3B,KAAA,EAAO,MAAA;AAAA,QACP,SAAA,EAAW,QAAA;AAAA,QACX,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,UAAA,SAAA,CAAU,CAAA,CAAE,OAAO,KAAK,CAAA;AACxB,UAAA,IAAI,IAAA,KAAS,MAAA,CAAO,WAAA,EAAa,UAAA,CAAW,OAAO,WAAW,CAAA;AAAA,QAChE,CAAA;AAAA,QACA,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,UAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,QAAA,IAAY,QAAA,UAAkB,KAAK,CAAA;AAAA,QACnD,CAAA;AAAA,QACA,QAAQ,MAAM;AACZ,UAAA,IAAI,QAAA,IAAY,CAAC,MAAA,EAAQ,OAAA,CAAQ,KAAK,CAAA;AAAA,QACxC,CAAA;AAAA,QACA,SAAA,EAAU,gKAAA;AAAA,QACV,KAAA,EAAO;AAAA,UACL,YAAA,EAAc,wBAAA;AAAA,UACd,WAAA,EAAa;AAAA;AACf;AAAA;AACF,GAAA,EACF,CAAA;AAEJ;AAEA,SAAS,aAAA,CAAc,EAAE,WAAA,EAAY,EAAiC;AACpE,EAAA,MAAM,SAAS,mBAAA,EAAoB;AACnC,EAAA,MAAM,KAAA,GAAQ,aAAa,WAAW,CAAA;AACtC,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAACL,EAAAA,KAAMA,GAAE,UAAU,CAAA;AACnD,EAAA,MAAM,UAAU,eAAA,EAAgB;AAChC,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIO,SAAS,KAAK,CAAA;AACpD,EAAA,MAAM,UAAA,GAAaH,MAAAA,CAAM,MAAA,CAAuB,IAAI,CAAA;AACpD,EAAA,MAAM,GAAA,GAAM,eAAe,KAAK,CAAA;AAChC,EAAA,MAAM,YAAY,OAAA,CAAQ,IAAA,EAAM,KAAA,CAAM,KAAK,EAAE,CAAC,CAAA;AAC9C,EAAA,MAAMK,QAAAA,GAAAA,CAAW,aAAa,OAAA,CAAQ,KAAA,IAAS,KAAK,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,WAAA,EAAY;AAI5E,EAAAL,MAAAA,CAAM,UAAU,MAAM;AACpB,IAAA,IAAI,CAAC,WAAA,EAAa;AAClB,IAAA,MAAM,aAAA,GAAgB,CAAC,KAAA,KAAwB;AAC7C,MAAA,IAAI,CAAC,WAAW,OAAA,EAAS,QAAA,CAAS,MAAM,MAAc,CAAA,iBAAkB,KAAK,CAAA;AAAA,IAC/E,CAAA;AACA,IAAA,MAAM,KAAA,GAAQ,CAAC,KAAA,KAAyB;AACtC,MAAA,IAAI,KAAA,CAAM,GAAA,KAAQ,QAAA,EAAU,cAAA,CAAe,KAAK,CAAA;AAAA,IAClD,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,eAAe,aAAa,CAAA;AACtD,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,KAAK,CAAA;AAC1C,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,mBAAA,CAAoB,eAAe,aAAa,CAAA;AACzD,MAAA,QAAA,CAAS,mBAAA,CAAoB,WAAW,KAAK,CAAA;AAAA,IAC/C,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAEhB,EAAA,uBACEO,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,oBAAAN,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,QAAA,EAAS,MAAK,eAAA,EAAgB,CAAA;AAAA,IACxC,MAAA,CAAO,SAAS,QAAA,oBACfM,KAAC,KAAA,EAAA,EAAI,GAAA,EAAK,UAAA,EAAY,SAAA,EAAU,UAAA,EAC7B,QAAA,EAAA;AAAA,MAAA,OAAA,CAAQ,wBACPA,IAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,eAAa,GAAA,CAAI,WAAA;AAAA,UACjB,YAAA,EAAW,qBAAA;AAAA,UACX,eAAA,EAAe,WAAA;AAAA,UACf,SAAS,MAAM,cAAA,CAAe,CAAC,IAAA,KAAS,CAAC,IAAI,CAAA;AAAA,UAC7C,SAAA,EAAU,kFAAA;AAAA,UAEV,QAAA,EAAA;AAAA,4BAAAN,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4GAAA,EACb,UAAAI,QAAAA,EACH,CAAA;AAAA,YACC,SAAA,oBACCJ,GAAAA,CAAC,MAAA,EAAA,EAAK,eAAa,GAAA,CAAI,WAAA,EAAa,SAAA,EAAU,wDAAA,EAC3C,QAAA,EAAA,SAAA,EACH;AAAA;AAAA;AAAA,0BAIJA,GAAAA;AAAA,QAAC,IAAA;AAAA,QAAA;AAAA,UACC,EAAA,EAAG,UAAA;AAAA,UACH,eAAa,GAAA,CAAI,WAAA;AAAA,UACjB,YAAA,EAAW,gBAAA;AAAA,UACX,SAAA,EAAU,kFAAA;AAAA,UAEV,QAAA,kBAAAA,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,OAC5B;AAAA,MAED,WAAA,IAAe,OAAA,CAAQ,KAAA,oBACtBM,IAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,eAAa,GAAA,CAAI,eAAA;AAAA,UACjB,SAAA,EAAU,oHAAA;AAAA,UAEV,QAAA,EAAA;AAAA,4BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,cAAA,EACb,QAAA,EAAA;AAAA,8BAAAN,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,iBAAiB,QAAA,EAAA,OAAA,CAAQ,IAAA,IAAQ,aAAa,SAAA,EAAU,CAAA;AAAA,8BACrEA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,wCAAA,EAA0C,kBAAQ,KAAA,EAAM;AAAA,aAAA,EACvE,CAAA;AAAA,4BACAM,KAAC,KAAA,EAAA,EAAI,SAAA,EAAU,OAAM,OAAA,EAAS,MAAM,cAAA,CAAe,KAAK,CAAA,EACtD,QAAA,EAAA;AAAA,8BAAAA,IAAAA,CAAC,IAAA,EAAA,EAAK,EAAA,EAAG,UAAA,EAAW,WAAU,qFAAA,EAC5B,QAAA,EAAA;AAAA,gCAAAN,GAAAA,CAAC,UAAA,EAAA,EAAW,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,gBAAE;AAAA,eAAA,EAEpC,CAAA;AAAA,8BACAM,IAAAA,CAAC,IAAA,EAAA,EAAK,EAAA,EAAG,UAAA,EAAW,WAAU,qFAAA,EAC5B,QAAA,EAAA;AAAA,gCAAAN,GAAAA,CAAC,OAAA,EAAA,EAAQ,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,gBAAE;AAAA,eAAA,EAEjC,CAAA;AAAA,8BACAM,IAAAA,CAAC,IAAA,EAAA,EAAK,EAAA,EAAG,UAAA,EAAW,WAAU,qFAAA,EAC5B,QAAA,EAAA;AAAA,gCAAAN,GAAAA,CAAC,UAAA,EAAA,EAAW,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,gBAAE;AAAA,eAAA,EAEpC,CAAA;AAAA,8BACAM,IAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAK,QAAA;AAAA,kBACL,SAAS,MAAM;AACb,oBAAA,cAAA,CAAe,KAAK,CAAA;AACpB,oBAAA,KAAK,eAAA,EAAgB;AAAA,kBACvB,CAAA;AAAA,kBACA,SAAA,EAAU,sGAAA;AAAA,kBAEV,QAAA,EAAA;AAAA,oCAAAN,GAAAA,CAAC,MAAA,EAAA,EAAO,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,oBAAE;AAAA;AAAA;AAAA;AAEhC,aAAA,EACF;AAAA;AAAA;AAAA;AACF,KAAA,EAEJ,CAAA;AAAA,IAED,MAAA,CAAO,QAAA,CAAS,IAAA,oBACfM,IAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,eAAa,GAAA,CAAI,UAAA;AAAA,QACjB,YAAA,EAAW,UAAA;AAAA,QACX,OAAA,EAAS,UAAA;AAAA,QACT,SAAA,EAAU,iEAAA;AAAA,QAEV,QAAA,EAAA;AAAA,0BAAAN,GAAAA,CAAC0B,WAAAA,EAAA,EAAY,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,UAChC,KAAA,GAAQ,qBACP1B,GAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,eAAa,GAAA,CAAI,SAAA;AAAA,cACjB,SAAA,EAAW,CAAA,qJAAA,EACT,GAAA,GAAM,mBAAA,GAAsB,EAC9B,CAAA,CAAA;AAAA,cAEC,QAAA,EAAA;AAAA;AAAA;AACH;AAAA;AAAA,KAEJ;AAAA,IAED,+BACCA,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,YAAA,EAAW,YAAA;AAAA,QACX,OAAA,EAAS,WAAA;AAAA,QACT,SAAA,EAAU,2EAAA;AAAA,QAEV,QAAA,kBAAAA,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,KAC5B;AAAA,oBAEFA,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,QAAA,EAAS,MAAK,cAAA,EAAe;AAAA,GAAA,EAC1C,CAAA;AAEJ;AAEA,SAAS,QAAA,CAAS,EAAE,SAAA,EAAU,EAA2B;AACvD,EAAA,MAAM,SAAS,mBAAA,EAAoB;AACnC,EAAA,MAAM,EAAE,UAAA,EAAW,GAAI,aAAA,EAAc;AACrC,EAAA,MAAM,aAAA,GAAgB,eAAA,CAAgB,CAACL,EAAAA,KAAMA,GAAE,aAAa,CAAA;AAC5D,EAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,KAAA,EAAO,MAAA,EAAQ,cAAA,KAAmB,KAAA;AAEhE,EAAA,MAAM,UAAA,GAAa,CAAC,UAAA,KAAuB;AACzC,IAAA,eAAA,CAAgB,QAAA,GAAW,KAAA,EAAM;AACjC,IAAA,aAAA,CAAc,UAAU,CAAA;AACxB,IAAA,UAAA,CAAW,OAAO,WAAW,CAAA;AAAA,EAC/B,CAAA;AAEA,EAAA,uBACEW,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAW,CAAA,kCAAA,EAAqC,SAAA,IAAa,EAAE,CAAA,CAAA,EACjE,QAAA,EAAA;AAAA,IAAA,MAAA,CAAO,GAAA,CAAI,GAAA,CAAI,CAAC,IAAA,qBACfN,GAAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QAEC,IAAI,IAAA,CAAK,EAAA;AAAA,QACT,aAAA,EAAa,GAAA,CAAI,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA;AAAA,QACnC,SAAA,EAAU,qEAAA;AAAA,QAET,QAAA,EAAA,IAAA,CAAK;AAAA,OAAA;AAAA,MALD,IAAA,CAAK;AAAA,KAOb,CAAA;AAAA,IACA,cAAA,IACC,WAAW,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,qBAC1BM,IAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QAEC,IAAA,EAAK,QAAA;AAAA,QACL,aAAA,EAAa,GAAA,CAAI,WAAA,CAAY,CAAA,CAAE,IAAI,CAAA;AAAA,QACnC,OAAA,EAAS,MAAM,UAAA,CAAW,CAAA,CAAE,EAAE,CAAA;AAAA,QAC9B,SAAA,EAAU,qGAAA;AAAA,QAET,QAAA,EAAA;AAAA,UAAA,CAAA,CAAE,IAAA;AAAA,0BACHN,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+FAAA,EAAgG;AAAA;AAAA,OAAA;AAAA,MAP3G,CAAA,CAAE;AAAA,KASV;AAAA,GAAA,EACL,CAAA;AAEJ;AAEA,SAAS,gBAAA,CAAiB,EAAE,IAAA,EAAM,OAAA,EAAQ,EAA2C;AACnF,EAAA,MAAM,SAAS,mBAAA,EAAoB;AACnC,EAAA,MAAM,EAAE,UAAA,EAAW,GAAI,aAAA,EAAc;AACrC,EAAA,MAAM,aAAA,GAAgB,eAAA,CAAgB,CAACL,EAAAA,KAAMA,GAAE,aAAa,CAAA;AAC5D,EAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,KAAA,EAAO,MAAA,EAAQ,cAAA,KAAmB,KAAA;AAEhE,EAAA,MAAM,UAAA,GAAa,CAAC,UAAA,KAAuB;AACzC,IAAA,eAAA,CAAgB,QAAA,GAAW,KAAA,EAAM;AACjC,IAAA,aAAA,CAAc,UAAU,CAAA;AACxB,IAAA,UAAA,CAAW,OAAO,WAAW,CAAA;AAC7B,IAAA,OAAA,EAAQ;AAAA,EACV,CAAA;AAGA,EAAAI,MAAAA,CAAM,UAAU,MAAM;AACpB,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAqB;AAClC,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,QAAA,EAAU,OAAA,EAAQ;AAAA,IAClC,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,KAAK,CAAA;AAC1C,IAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,KAAK,CAAA;AAAA,EAC5D,CAAA,EAAG,CAAC,IAAA,EAAM,OAAO,CAAC,CAAA;AAElB,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAElB,EAAA,uBACEO,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8BAAA,EACb,QAAA,EAAA;AAAA,oBAAAN,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,8CAAA;AAAA,QACV,aAAA,EAAW,IAAA;AAAA,QACX,OAAA,EAAS;AAAA;AAAA,KACX;AAAA,oBACAM,IAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,aAAA,EAAY,oBAAA;AAAA,QACZ,IAAA,EAAK,QAAA;AAAA,QACL,YAAA,EAAW,gBAAA;AAAA,QACX,SAAA,EAAU,uHAAA;AAAA,QAEV,QAAA,EAAA;AAAA,0BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sDAAA,EACb,QAAA,EAAA;AAAA,4BAAAN,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,MAAA,EAAI,CAAA;AAAA,4BAC1CA,GAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,YAAA,EAAW,aAAA;AAAA,gBACX,OAAA,EAAS,OAAA;AAAA,gBACT,SAAA,EAAU,mCAAA;AAAA,gBAEV,QAAA,kBAAAA,GAAAA,CAACuB,CAAAA,EAAA,EAAE,WAAU,SAAA,EAAU;AAAA;AAAA;AACzB,WAAA,EACF,CAAA;AAAA,0BACAvB,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8BACb,QAAA,kBAAAM,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EACZ,QAAA,EAAA;AAAA,YAAA,MAAA,CAAO,GAAA,CAAI,GAAA,CAAI,CAAC,IAAA,qBACfN,GAAAA;AAAA,cAAC,IAAA;AAAA,cAAA;AAAA,gBAEC,IAAI,IAAA,CAAK,EAAA;AAAA,gBACT,OAAA,EAAS,OAAA;AAAA,gBACT,SAAA,EAAU,6DAAA;AAAA,gBAET,QAAA,EAAA,IAAA,CAAK;AAAA,eAAA;AAAA,cALD,IAAA,CAAK;AAAA,aAOb,CAAA;AAAA,YACA,kBAAkB,UAAA,CAAW,MAAA,GAAS,qBACrCM,IAAAA,CAAAO,UAAA,EACE,QAAA,EAAA;AAAA,8BAAAb,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAA,EAAgB,CAAA;AAAA,8BAC/BA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yEAAwE,QAAA,EAAA,YAAA,EAEvF,CAAA;AAAA,cACC,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,qBACfA,GAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBAEC,IAAA,EAAK,QAAA;AAAA,kBACL,OAAA,EAAS,MAAM,UAAA,CAAW,CAAA,CAAE,EAAE,CAAA;AAAA,kBAC9B,SAAA,EAAU,mEAAA;AAAA,kBAET,QAAA,EAAA,CAAA,CAAE;AAAA,iBAAA;AAAA,gBALE,CAAA,CAAE;AAAA,eAOV;AAAA,aAAA,EACH;AAAA,WAAA,EAEJ,CAAA,EACF;AAAA;AAAA;AAAA;AACF,GAAA,EACF,CAAA;AAEJ;AAEO,SAAS,gBAAA,GAAmB;AACjC,EAAA,MAAM,SAAS,mBAAA,EAAoB;AACnC,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,KAAA,EAAO,MAAA,EAAQ,OAAA,IAAW,SAAA;AACjD,EAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,KAAA,EAAO,MAAA,EAAQ,UAAA,KAAe,KAAA;AACxD,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,KAAA,EAAO,MAAA,EAAQ,WAAA,KAAgB,MAAA;AACzD,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIE,SAAS,KAAK,CAAA;AAC1D,EAAA,MAAM,IAAA,mBACJF,GAAAA,CAAC,IAAA,EAAA,EAAK,EAAA,EAAG,GAAA,EAAI,SAAA,EAAU,sDAAA,EACpB,QAAA,EAAA,MAAA,CAAO,IAAA,IAAQ,MAAA,CAAO,IAAA,EACzB,CAAA;AAGF,EAAA,uBACEM,IAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,CAAA,0DAAA,EAA6D,QAAA,GAAW,WAAA,GAAc,EAAE,CAAA,CAAA;AAAA,MACnG,KAAA,EAAO,WAAA;AAAA,MAEP,QAAA,EAAA;AAAA,wBAAAN,IAAC,eAAA,EAAA,EAAgB,CAAA;AAAA,wBACjBA,IAAC,UAAA,EAAA,EAAW,CAAA;AAAA,QAEX,OAAA,KAAY,UAAA;AAAA;AAAA,0BAEXM,IAAAA,CAAAO,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,4BAAAP,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gFAAA,EACZ,QAAA,EAAA;AAAA,cAAA,UAAA,mBAAaN,GAAAA,CAAC,WAAA,EAAA,EAAY,QAAA,EAAU,UAAA,EAAY,WAAU,iCAAA,EAAkC,CAAA,mBAAKA,GAAAA,CAAC,KAAA,EAAA,EAAI,CAAA;AAAA,8BACvGA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAe,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,8BACnCA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBACb,QAAA,kBAAAA,GAAAA,CAAC,iBAAc,CAAA,EACjB;AAAA,aAAA,EACF,CAAA;AAAA,4BACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wDAAA,EAAyD,OAAO,aAAA,EAC7E,QAAA,kBAAAA,GAAAA,CAAC,QAAA,EAAA,EAAS,CAAA,EACZ;AAAA,WAAA,EACF;AAAA,YACE,OAAA,KAAY,QAAA;AAAA;AAAA,0BAEdM,IAAAA,CAAAO,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,4BAAAP,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sFAAA,EACZ,QAAA,EAAA;AAAA,cAAA,UAAA,mBAAaN,GAAAA,CAAC,WAAA,EAAA,EAAY,QAAA,EAAU,UAAA,EAAY,WAAU,iCAAA,EAAkC,CAAA,mBAAKA,GAAAA,CAAC,KAAA,EAAA,EAAI,CAAA;AAAA,8BACvGA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAe,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,8BACnCA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBACb,QAAA,kBAAAA,GAAAA,CAAC,iBAAc,CAAA,EACjB;AAAA,aAAA,EACF,CAAA;AAAA,4BACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BAAA,EAA2B,OAAO,aAAA,EAC/C,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,uCAAA,EACb,QAAA,kBAAAA,GAAAA,CAAC,QAAA,EAAA,EAAS,GACZ,CAAA,EACF;AAAA,WAAA,EACF;AAAA,YACE,OAAA,KAAY,SAAA;AAAA;AAAA,0BAEdM,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gFAAA,EACb,QAAA,EAAA;AAAA,4BAAAN,GAAAA,CAAC,SAAI,SAAA,EAAU,yBAAA,EACb,0BAAAA,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,gBAAA,EAAiB,CAAA,EACvC,CAAA;AAAA,4BACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAe,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,4BACnCM,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qCAAA,EACZ,QAAA,EAAA;AAAA,cAAA,UAAA,oBAAcN,GAAAA,CAAC,WAAA,EAAA,EAAY,QAAA,EAAU,UAAA,EAAY,WAAU,sBAAA,EAAuB,CAAA;AAAA,8BACnFA,IAAC,aAAA,EAAA,EAAc;AAAA,aAAA,EACjB;AAAA,WAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAMAM,IAAAA,CAAAO,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,4BAAAP,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6DAAA,EACZ,QAAA,EAAA;AAAA,cAAA,IAAA;AAAA,8BACDN,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,gBAAA,EAAiB,CAAA;AAAA,8BACrCM,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0CAAA,EACZ,QAAA,EAAA;AAAA,gBAAA,UAAA,oBAAcN,IAAC,WAAA,EAAA,EAAY,QAAA,EAAU,YAAY,SAAA,EAAW,UAAA,GAAa,KAAK,iCAAA,EAAmC,CAAA;AAAA,gCAClHA,GAAAA,CAAC,aAAA,EAAA,EAAc,aAAa,MAAM,iBAAA,CAAkB,IAAI,CAAA,EAAG;AAAA,eAAA,EAC7D;AAAA,aAAA,EACF,CAAA;AAAA,4BACAA,IAAC,gBAAA,EAAA,EAAiB,IAAA,EAAM,gBAAgB,OAAA,EAAS,MAAM,iBAAA,CAAkB,KAAK,CAAA,EAAG;AAAA,WAAA,EACnF;AAAA,SAAA;AAAA,wBAEFA,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,QAAA,EAAS,MAAK,UAAA,EAAW;AAAA;AAAA;AAAA,GACtC;AAEJ;AClhBO,SAAS,gBAAA,GAAmB;AACjC,EAAA,MAAM,SAAS,mBAAA,EAAoB;AACnC,EAAA,MAAM,EAAE,UAAA,EAAW,GAAI,aAAA,EAAc;AACrC,EAAA,MAAM,iBAAA,GAAoB,UAAA,CAAW,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AAC/C,EAAA,MAAM,sBAAsB,IAAA,CAAK,GAAA,CAAI,WAAW,MAAA,GAAS,iBAAA,CAAkB,QAAQ,CAAC,CAAA;AACpF,EAAA,MAAM,MAAA,GAAS;AAAA,IACb,UAAA,EAAY,eAAA;AAAA,IACZ,UAAA,EAAY,iBAAA;AAAA,IACZ,OAAA,EAAS,SAAA;AAAA,IACT,OAAA,EAAS,WAAA;AAAA,IACT,SAAA,EAAW,gBAAA;AAAA,IACX,OAAA,EAAS,aAAA;AAAA,IACT,KAAA,EAAO,QAAA;AAAA,IACP,OAAA,EAAS,2BAAA;AAAA,IACT,GAAG,OAAO,MAAA,EAAQ;AAAA,GACpB;AAEA,EAAA,MAAM,UAAA,GAAa,CAAC,UAAA,KAAuB;AACzC,IAAA,eAAA,CAAgB,QAAA,GAAW,KAAA,EAAM;AACjC,IAAA,eAAA,CAAgB,QAAA,EAAS,CAAE,aAAA,CAAc,UAAU,CAAA;AACnD,IAAA,UAAA,CAAW,OAAO,WAAW,CAAA;AAAA,EAC/B,CAAA;AAEA,EAAA,uBACEM,IAAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,wBAAA,EAChB,QAAA,EAAA;AAAA,oBAAAN,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,QAAA,EAAS,MAAK,QAAA,EAAS,CAAA;AAAA,oBAClCM,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gFAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAN,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,8BAAA,EAAgC,iBAAO,IAAA,EAAK,CAAA;AAAA,QACxD,MAAA,CAAO,MAAA,EAAQ,KAAA,oBACdA,GAAAA,CAAC,OAAE,SAAA,EAAU,oDAAA,EAAsD,QAAA,EAAA,MAAA,CAAO,MAAA,CAAO,KAAA,EAAM;AAAA,OAAA,EAE3F,CAAA;AAAA,sBAEAM,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAN,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,0EAAA,EAA4E,iBAAO,UAAA,EAAW,CAAA;AAAA,wBAC5GM,IAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,mBAAA,EACX,QAAA,EAAA;AAAA,UAAA,iBAAA,CAAkB,IAAI,CAAC,CAAA,qBACtBN,GAAAA,CAAC,QACC,QAAA,kBAAAA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,OAAA,EAAS,MAAM,UAAA,CAAW,CAAA,CAAE,EAAE,CAAA;AAAA,cAC9B,SAAA,EAAU,mEAAA;AAAA,cAET,QAAA,EAAA,CAAA,CAAE;AAAA;AAAA,WACL,EAAA,EAPO,CAAA,CAAE,EAQX,CACD,CAAA;AAAA,UACA,mBAAA,GAAsB,CAAA,oBACrBA,GAAAA,CAAC,IAAA,EAAA,EACC,QAAA,kBAAAM,IAAAA,CAAC,IAAA,EAAA,EAAK,EAAA,EAAI,MAAA,CAAO,WAAA,EAAa,SAAA,EAAU,mEAAA,EACrC,QAAA,EAAA;AAAA,YAAA,MAAA,CAAO,OAAA;AAAA,YAAQ,IAAA;AAAA,YAAG,UAAA,CAAW,MAAA;AAAA,YAAO;AAAA,WAAA,EACvC,CAAA,EACF;AAAA,SAAA,EAEJ;AAAA,OAAA,EACF,CAAA;AAAA,sBAEAA,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAN,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,0EAAA,EAA4E,iBAAO,UAAA,EAAW,CAAA;AAAA,wBAC5GM,IAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,mBAAA,EACX,QAAA,EAAA;AAAA,UAAA,MAAA,CAAO,GAAA,CAAI,IAAI,CAAC,IAAA,qBACfN,GAAAA,CAAC,IAAA,EAAA,EACC,0BAAAA,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAI,IAAA,CAAK,EAAA,EAAI,WAAU,qCAAA,EAAuC,QAAA,EAAA,IAAA,CAAK,OAAM,CAAA,EAAA,EADxE,IAAA,CAAK,EAEd,CACD,CAAA;AAAA,UACA,MAAA,CAAO,QAAA,CAAS,QAAA,oBACfA,IAAC,IAAA,EAAA,EACC,QAAA,kBAAAA,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAG,UAAA,EAAW,SAAA,EAAU,qCAAA,EAAuC,QAAA,EAAA,MAAA,CAAO,WAAU,CAAA,EACxF;AAAA,SAAA,EAEJ;AAAA,OAAA,EACF,CAAA;AAAA,sBAEAM,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAN,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,0EAAA,EAA4E,iBAAO,OAAA,EAAQ,CAAA;AAAA,wBACzGM,IAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,yCAAA,EACX,QAAA,EAAA;AAAA,UAAA,MAAA,CAAO,MAAA,EAAQ,SAAS,KAAA,oBAASN,IAAC,IAAA,EAAA,EAAI,QAAA,EAAA,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,KAAA,EAAM,CAAA;AAAA,UAClE,MAAA,CAAO,MAAA,EAAQ,OAAA,EAAS,KAAA,oBAASA,IAAC,IAAA,EAAA,EAAI,QAAA,EAAA,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,KAAA,EAAM,CAAA;AAAA,UAClE,MAAA,CAAO,MAAA,EAAQ,OAAA,EAAS,OAAA,oBAAWA,IAAC,IAAA,EAAA,EAAI,QAAA,EAAA,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,OAAA,EAAQ,CAAA;AAAA,UACtE,MAAA,CAAO,MAAA,EAAQ,MAAA,EAAQ,GAAA,CAAI,CAACL,EAAAA,qBAC3BK,GAAAA,CAAC,IAAA,EAAA,EACC,QAAA,kBAAAA,GAAAA,CAAC,GAAA,EAAA,EAAE,IAAA,EAAML,EAAAA,CAAE,IAAA,EAAM,MAAA,EAAO,QAAA,EAAS,GAAA,EAAI,YAAA,EAAa,SAAA,EAAU,qCAAA,EACzD,QAAA,EAAAA,EAAAA,CAAE,KAAA,EACL,CAAA,EAAA,EAHOA,EAAAA,CAAE,IAIX,CACD;AAAA,SAAA,EACH;AAAA,OAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,oBACAK,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,QAAA,EAAS,MAAK,OAAA,EAAQ,CAAA;AAAA,oBACjCA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YACb,QAAA,kBAAAM,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mIAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4DAAA,EACb,QAAA,EAAA;AAAA,wBAAAN,IAAC,IAAA,EAAA,EAAK,EAAA,EAAG,YAAW,SAAA,EAAU,yCAAA,EAA2C,iBAAO,OAAA,EAAQ,CAAA;AAAA,wBACxFA,IAAC,IAAA,EAAA,EAAK,EAAA,EAAG,UAAS,SAAA,EAAU,yCAAA,EAA2C,iBAAO,KAAA,EAAM,CAAA;AAAA,wBACpFA,IAAC,IAAA,EAAA,EAAK,EAAA,EAAG,YAAW,SAAA,EAAU,yCAAA,EAA2C,iBAAO,OAAA,EAAQ;AAAA,OAAA,EAC1F,CAAA;AAAA,sBACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,aAAA,EACV,QAAA,EAAA,MAAA,CAAO,MAAA,EAAQ,MAAA,oBAAUM,IAAAA,CAAAO,QAAAA,EAAA,EAAE,QAAA,EAAA;AAAA,QAAA,OAAA;AAAA,QAAG,MAAA,CAAO,IAAA;AAAA,QAAK;AAAA,OAAA,EAAkB,CAAA,EAC/D;AAAA,KAAA,EACF,CAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AC/FA,IAAM,cAAA,GAAyC;AAAA,EAC7C,OAAA,EAAS,iBAAA;AAAA,EACT,WAAA,EAAa,mCAAA;AAAA,EACb,WAAA,EAAa,iBAAA;AAAA,EACb,SAAA,EAAW,gCAAA;AAAA,EACX,QAAA,EAAU,gCAAA;AAAA,EACV,iBAAA,EAAmB,8CAAA;AAAA,EACnB,WAAA,EAAa;AACf,CAAA;AAIA,SAAS,YAAA,GAAiC;AACxC,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,QAAA,EAAS,CAAE,KAAA;AACtC,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,MAC1B,EAAA,EAAI,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,SAAA;AAAA,MACxB,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,WAAW,IAAA,CAAK;AAAA,KAClB,CAAE;AAAA,GACJ;AACF;AAeO,SAAS,oBAAA,GAAsE;AACpF,EAAA,MAAM,SAAS,mBAAA,EAAoB;AACnC,EAAA,OAAO,WAAA,CAAY,OAAO,IAAA,KAAiB;AACzC,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,IAAA,EAAK,CAAE,WAAA,EAAY;AAC3C,IAAA,IAAI,CAAC,YAAY,OAAO,EAAE,OAAO,KAAA,EAAO,OAAA,EAAS,CAAA,EAAG,OAAA,EAAS,mBAAA,EAAoB;AAGjF,IAAA,MAAM,KAAA,GAAqB;AAAA,MACzB,GAAI,MAAA,CAAO,UAAA,IAAc,EAAC;AAAA,MAC1B,IAAI,MAAA,CAAO,SAAA,IAAa,EAAC,EAAG,IAAI,6BAA6B;AAAA,KAC/D;AACA,IAAA,MAAM,YAAA,GAAe,oBAAA,CAAqB,KAAA,EAAO,UAAA,EAAY,cAAc,CAAA;AAC3E,IAAA,IAAI,YAAA,CAAa,OAAO,OAAO,EAAE,OAAO,IAAA,EAAM,OAAA,EAAS,aAAa,OAAA,EAAQ;AAC5E,IAAA,IAAI,YAAA,CAAa,WAAW,WAAA,EAAa;AACvC,MAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,OAAA,EAAS,CAAA,EAAG,OAAA,EAAS,cAAA,CAAe,YAAA,CAAa,MAAA,IAAU,WAAW,CAAA,IAAK,oBAAA,EAAkB;AAAA,IACtH;AAGA,IAAA,MAAM,aAAa,MAAM,gBAAA,CAAiB,EAAE,IAAA,EAAM,YAAY,CAAA;AAC9D,IAAA,IAAI,CAAC,WAAW,KAAA,EAAO;AACrB,MAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,OAAA,EAAS,CAAA,EAAG,OAAA,EAAS,cAAA,CAAe,UAAA,CAAW,MAAA,IAAU,WAAW,CAAA,IAAK,gCAAA,EAA8B;AAAA,IAChI;AACA,IAAA,IAAI,UAAA,CAAW,SAAS,YAAA,EAAc;AACpC,MAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,SAAS,CAAA,EAAG,OAAA,EAAS,eAAe,WAAA,EAAY;AAAA,IACzE;AACA,IAAA,MAAM,YAAY,mBAAA,CAAoB;AAAA,MACpC,EAAA,EAAI,YAAY,UAAU,CAAA,CAAA;AAAA,MAC1B,QAAA,EAAU,YAAA;AAAA,MACV,KAAA,EAAO,UAAA;AAAA,MACP,IAAA,EAAM,WAAW,IAAA,IAAQ,UAAA;AAAA,MACzB,IAAA,EAAM,YAAA;AAAA,MACN,MAAA,EAAQ,MAAA;AAAA,MACR,OAAO,UAAA,CAAW,KAAA;AAAA,MAClB,UAAA,EAAY,IAAA;AAAA,MACZ,eAAA,EAAiB,KAAA;AAAA,MACjB,WAAA,EAAa,IAAA;AAAA,MACb,SAAA,EAAW,KAAA;AAAA,MACX,YAAY,EAAC;AAAA,MACb,aAAa,EAAC;AAAA,MACd,QAAA,EAAU,sBAAA;AAAA,MACV,MAAA,EAAQ,IAAA;AAAA,MACR,MAAA,EAAQ,QAAA;AAAA,MACR,SAAA,EAAW,CAAA;AAAA,MACX,SAAA,EAAW,sBAAA;AAAA,MACX,SAAA,EAAW;AAAA,KACZ,CAAA;AACD,IAAA,MAAM,OAAA,GAAU,YAAY,oBAAA,CAAqB,CAAC,SAAS,CAAA,EAAG,UAAA,EAAY,YAAA,EAAc,CAAA,GAAI,IAAA;AAC5F,IAAA,IAAI,CAAC,SAAS,KAAA,EAAO;AACnB,MAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,OAAA,EAAS,CAAA,EAAG,OAAA,EAAS,cAAA,CAAe,OAAA,EAAS,MAAA,IAAU,WAAW,CAAA,IAAK,oBAAA,EAAkB;AAAA,IAClH;AACA,IAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,OAAA,EAAS,QAAQ,OAAA,EAAQ;AAAA,EACjD,GAAG,CAAC,MAAA,CAAO,SAAA,EAAW,MAAA,CAAO,UAAU,CAAC,CAAA;AAC1C;ACxFA,IAAI,GAAA,GAAM,CAAA;AAEH,IAAM,aAAA,GAAgBrB,MAAAA,CAAmB,CAAC,GAAA,MAAS;AAAA,EACxD,QAAQ,EAAC;AAAA,EACT,IAAA,EAAM,CAAC,KAAA,KAAU;AACf,IAAA,MAAM,KAAK,CAAA,MAAA,EAAS,EAAE,GAAG,CAAA,CAAA,EAAI,IAAA,CAAK,KAAK,CAAA,CAAA;AACvC,IAAA,MAAMmC,MAAAA,GAAe;AAAA,MACnB,EAAA;AAAA,MACA,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,aAAa,KAAA,CAAM,WAAA;AAAA,MACnB,OAAA,EAAS,MAAM,OAAA,IAAW,MAAA;AAAA,MAC1B,UAAA,EAAY,MAAM,UAAA,IAAc;AAAA,KAClC;AACA,IAAA,GAAA,CAAI,CAAChC,EAAAA,MAAO,EAAE,MAAA,EAAQ,CAAC,GAAGA,EAAAA,CAAE,MAAA,EAAQgC,MAAK,CAAA,EAAE,CAAE,CAAA;AAC7C,IAAA,OAAO,EAAA;AAAA,EACT,CAAA;AAAA,EACA,SAAS,CAAC,EAAA,KAAO,GAAA,CAAI,CAAChC,QAAO,EAAE,MAAA,EAAQA,EAAAA,CAAE,MAAA,CAAO,OAAO,CAAC,CAAA,KAAM,EAAE,EAAA,KAAO,EAAE,GAAE,CAAE;AAC/E,CAAA,CAAE,CAAA;AAGK,IAAM,KAAA,GAAQ;AAAA,EACnB,OAAA,EAAS,CAAC,KAAA,EAAe,WAAA,KAAyB,aAAA,CAAc,QAAA,EAAS,CAAE,IAAA,CAAK,EAAE,KAAA,EAAO,WAAA,EAAa,OAAA,EAAS,WAAW,CAAA;AAAA,EAC1H,KAAA,EAAO,CAAC,KAAA,EAAe,WAAA,KAAyB,aAAA,CAAc,QAAA,EAAS,CAAE,IAAA,CAAK,EAAE,KAAA,EAAO,WAAA,EAAa,OAAA,EAAS,SAAS,CAAA;AAAA,EACtH,IAAA,EAAM,CAAC,KAAA,EAAe,WAAA,KAAyB,aAAA,CAAc,QAAA,EAAS,CAAE,IAAA,CAAK,EAAE,KAAA,EAAO,WAAA,EAAa,OAAA,EAAS,QAAQ;AACtH,CAAA;ACdA,SAAS,mBAAA,CAAoB,EAAE,IAAA,EAAK,EAAuB;AACzD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIO,QAAAA,CAA+B,EAAE,CAAA;AACvE,EAAAJ,UAAU,MAAM;AACd,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,sBAAA,CAAuB,IAAI,CAAA,CAAE,IAAA,CAAK,CAAC,IAAA,KAAS;AAC1C,MAAA,IAAI,CAAC,SAAA,IAAa,IAAA,CAAK,MAAA,GAAS,CAAA,iBAAkB,IAAI,CAAA;AAAA,IACxD,CAAC,CAAA;AACD,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AAAA,IACd,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,IAAA,CAAK,MAAA,IAAU,KAAK,SAAA,EAAW,IAAA,CAAK,QAAQ,CAAC,CAAA;AACjD,EAAA,IAAI,WAAA,CAAY,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AACrC,EAAA,uBACEE,IAAAa,QAAAA,EAAA,EACG,sBAAY,GAAA,CAAI,CAAC,+BAChBb,GAAAA,CAAC,UAA0B,sBAAA,EAAsB,UAAA,CAAW,KAAK,SAAA,EAAU,+BAAA,EACxE,qBAAW,KAAA,EAAA,EADH,UAAA,CAAW,GAEtB,CACD,CAAA,EACH,CAAA;AAEJ;AAEO,SAAS,UAAA,GAAa;AAC3B,EAAA,MAAM,SAAS,mBAAA,EAAoB;AACnC,EAAA,MAAM,OAAO,YAAA,EAAa;AAC1B,EAAA,MAAM,UAAA,GAAa,wBAAwB,MAAM,CAAA;AAGjD,EAAA,MAAM,WAAA,GAAc,iBAAA,CAAkB,UAAA,CAAW,qBAAqB,CAAA;AACtE,EAAA,MAAM,gBAAA,GAAmB,aAAA,CAAc,UAAA,CAAW,qBAAqB,CAAA;AACvE,EAAA,MAAM,WAAW,oBAAA,EAAqB;AACtC,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIE,SAAS,EAAE,CAAA;AACnC,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIA,SAAwB,IAAI,CAAA;AACtE,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,SAAS,KAAK,CAAA;AAG9C,EAAAJ,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAClB,IAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAqB;AAClC,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,QAAA,EAAU,IAAA,CAAK,WAAA,EAAY;AAAA,IAC3C,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,KAAK,CAAA;AAC1C,IAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,KAAK,CAAA;AAAA,EAC5D,GAAG,CAAC,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,WAAW,CAAC,CAAA;AAKlC,EAAA,MAAM,WAAW,gBAAA,EAAiB;AAElC,EAAA,MAAM,QAAA,GAAW,eAAe,IAAI,CAAA;AACpC,EAAA,MAAM,aAAA,GAAgB,oBAAoB,IAAI,CAAA;AAC9C,EAAA,MAAM,QAAA,GAAW,cAAA,CAAe,IAAA,EAAM,MAAM,CAAA;AAE5C,EAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,IAAA,EAAM,MAAM,CAAA;AACtC,EAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAc,WAAA,CAAY,GAAG,MAAA,CAAO,QAAA,EAAU,OAAO,MAAM,CAAA;AAE1E,EAAA,MAAM,eAAA,GAAkB,EAAE,KAAA,EAAO,IAAA,CAAK,OAAO,QAAA,EAAS;AAEtD,EAAA,eAAe,SAAA,GAAY;AACzB,IAAA,WAAA,CAAY,IAAI,CAAA;AAChB,IAAA,gBAAA,CAAiB,IAAI,CAAA;AACrB,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,IAAI,CAAA;AAClC,MAAA,IAAI,OAAO,KAAA,EAAO;AAChB,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,IAAA,EAAK,CAAE,WAAA,EAAY;AACxC,QAAA,IAAA,CAAK,aAAA,CAAc,OAAA,EAAS,MAAA,CAAO,OAAO,CAAA;AAC1C,QAAA,OAAA,CAAQ,EAAE,CAAA;AACV,QAAA,KAAA,CAAM,QAAQ,iBAAA,EAAmB,CAAA,EAAG,OAAO,CAAA,QAAA,EAAM,MAAA,CAAO,OAAO,CAAA,aAAA,CAAe,CAAA;AAAA,MAChF,CAAA,MAAO;AACL,QAAA,gBAAA,CAAiB,MAAA,CAAO,WAAW,oBAAiB,CAAA;AACpD,QAAA,KAAA,CAAM,KAAA,CAAM,mBAAA,EAAkB,MAAA,CAAO,OAAA,IAAW,0CAAuC,CAAA;AAAA,MACzF;AAAA,IACF,SAAS,GAAA,EAAK;AAIZ,MAAA,gBAAA,CAAiB,8CAA2C,CAAA;AAC5D,MAAA,KAAA,CAAM,KAAA,CAAM,sCAAmC,oCAAoC,CAAA;AACnF,MAAA,OAAA,CAAQ,IAAA,CAAK,iCAAiC,GAAG,CAAA;AAAA,IACnD,CAAA,SAAE;AACA,MAAA,WAAA,CAAY,KAAK,CAAA;AAAA,IACnB;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,IAAA,CAAK,MAAA,EAAQ,OAAO,IAAA;AAGzB,EAAA,MAAM,SAAA,GAAY,OAAO,QAAA,CAAS,SAAA;AAClC,EAAA,MAAM,iBAAiB,SAAA,IAAa,IAAA,IAAQ,QAAA,GAAW,SAAA,GAAY,YAAY,QAAA,GAAW,CAAA;AAC1F,EAAA,MAAM,QAAA,GAAW,aAAa,IAAA,GAAO,IAAA,CAAK,IAAI,GAAA,EAAM,QAAA,GAAW,SAAA,GAAa,GAAG,CAAA,GAAI,CAAA;AAEnF,EAAA,uBACEQ,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EACb,QAAA,EAAA;AAAA,oBAAAN,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,8CAAA;AAAA,QACV,aAAA,EAAW,IAAA;AAAA,QACX,SAAS,IAAA,CAAK;AAAA;AAAA,KAChB;AAAA,oBAIAM,IAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,eAAa,GAAA,CAAI,UAAA;AAAA,QACjB,IAAA,EAAK,QAAA;AAAA,QACL,YAAA,EAAW,UAAA;AAAA,QACX,SAAA,EAAU,kHAAA;AAAA,QAEV,QAAA,EAAA;AAAA,0BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sDAAA,EACb,QAAA,EAAA;AAAA,4BAAAN,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,UAAA,EAAQ,CAAA;AAAA,4BAC9CA,GAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,YAAA,EAAW,iBAAA;AAAA,gBACX,SAAS,IAAA,CAAK,WAAA;AAAA,gBACd,SAAA,EAAU,mGAAA;AAAA,gBAEV,QAAA,kBAAAA,GAAAA,CAACuB,CAAAA,EAAA,EAAE,WAAU,SAAA,EAAU;AAAA;AAAA;AACzB,WAAA,EACF,CAAA;AAAA,UAEC,KAAK,KAAA,CAAM,MAAA,KAAW,CAAA,mBACrBvB,IAAC,KAAA,EAAA,EAAI,aAAA,EAAa,GAAA,CAAI,SAAA,EAAW,WAAU,+EAAA,EAAgF,QAAA,EAAA,6BAAA,EAE3H,oBAEAM,IAAAA,CAAAO,UAAA,EACG,QAAA,EAAA;AAAA,YAAA,SAAA,IAAa,IAAA,oBACZP,IAAAA,CAAC,KAAA,EAAA,EAAI,eAAa,GAAA,CAAI,gBAAA,EAAkB,WAAU,gCAAA,EAChD,QAAA,EAAA;AAAA,8BAAAN,GAAAA,CAAC,OAAE,SAAA,EAAU,qBAAA,EACV,2BAAiB,CAAA,mBAChBM,IAAAA,CAAAO,QAAAA,EAAA,EAAE,QAAA,EAAA;AAAA,gBAAA,SAAA;AAAA,gCAAOb,GAAAA,CAAC,QAAA,EAAA,EAAQ,QAAA,EAAA,KAAA,CAAM,cAAc,CAAA,EAAE,CAAA;AAAA,gBAAS;AAAA,eAAA,EAAqB,CAAA,mBAEtEM,IAAAA,CAAAO,QAAAA,EAAA,EAAE,QAAA,EAAA;AAAA,gBAAA,2BAAA;AAAA,gCAAeb,GAAAA,CAAC,QAAA,EAAA,EAAO,QAAA,EAAA,iBAAA,EAAY,CAAA;AAAA,gBAAS;AAAA,eAAA,EAAC,CAAA,EAEnD,CAAA;AAAA,8BACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qDACb,QAAA,kBAAAA,GAAAA;AAAA,gBAAC,KAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAU,qEAAA;AAAA,kBACV,KAAA,EAAO,EAAE,KAAA,EAAO,CAAA,EAAG,QAAQ,CAAA,CAAA,CAAA;AAAI;AAAA,eACjC,EACF;AAAA,aAAA,EACF,CAAA;AAAA,4BAEFM,IAAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBACC,eAAa,GAAA,CAAI,aAAA;AAAA,gBACjB,SAAA,EAAU,iDAAA;AAAA,gBACV,KAAA,EAAO,EAAE,eAAA,EAAiB,QAAA,EAAS;AAAA,gBAEnC,QAAA,EAAA;AAAA,kCAAAN,IAAC,IAAA,EAAA,EAAK,IAAA,EAAK,QAAO,IAAA,EAAK,aAAA,EAAc,SAAS,eAAA,EAAiB,CAAA;AAAA,kBAC9D,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,CAAC,yBACfM,IAAAA;AAAA,oBAAC,KAAA;AAAA,oBAAA;AAAA,sBAEC,eAAa,GAAA,CAAI,QAAA;AAAA,sBACjB,mBAAiB,IAAA,CAAK,SAAA;AAAA,sBACtB,cAAA,EAAc,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,SAAA;AAAA,sBAClC,SAAA,EAAW,iFACR,IAAA,CAAK,MAAA,IAAU,KAAK,SAAA,MAAe,IAAA,CAAK,eAAA,GACrC,qCAAA,GACA,EACN,CAAA,CAAA;AAAA,sBAEC,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAK,QAAA,oBACJN,GAAAA,CAAC,WAAA,EAAA,EAAY,GAAA,EAAK,IAAA,CAAK,QAAA,EAAU,GAAA,EAAK,IAAA,CAAK,IAAA,EAAM,SAAA,EAAU,mDAAA,EAAoD,CAAA;AAAA,wCAEjHM,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EACb,QAAA,EAAA;AAAA,0CAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EACb,QAAA,EAAA;AAAA,4CAAAN,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kCAAA,EAAoC,eAAK,IAAA,EAAK,CAAA;AAAA,4CAC9DA,GAAAA;AAAA,8BAAC,QAAA;AAAA,8BAAA;AAAA,gCACC,IAAA,EAAK,QAAA;AAAA,gCACL,eAAa,GAAA,CAAI,UAAA;AAAA,gCACjB,YAAA,EAAY,CAAA,QAAA,EAAW,IAAA,CAAK,IAAI,CAAA,CAAA;AAAA,gCAChC,SAAS,MAAM,IAAA,CAAK,WAAW,IAAA,CAAK,MAAA,IAAU,KAAK,SAAS,CAAA;AAAA,gCAC5D,SAAA,EAAU,2HAAA;AAAA,gCAEV,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAO,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA;AAC9B,2BAAA,EACF,CAAA;AAAA,0CACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+BAAA,EAAiC,eAAK,GAAA,EAAI,CAAA;AAAA,0BACzD,IAAA,CAAK,gCACJA,GAAAA,CAAC,UAAK,SAAA,EAAU,+BAAA,EAAiC,eAAK,YAAA,EAAa,CAAA;AAAA,0CAErEA,GAAAA,CAAC,mBAAA,EAAA,EAAoB,IAAA,EAAY,CAAA;AAAA,0CACjCM,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gDAAA,EACb,QAAA,EAAA;AAAA,4CAAAN,GAAAA;AAAA,8BAAC,aAAA;AAAA,8BAAA;AAAA,gCACC,OAAO,IAAA,CAAK,QAAA;AAAA,gCACZ,GAAA,EAAK,KAAK,WAAA,IAAe,MAAA;AAAA,gCACzB,QAAA,EAAU,CAAC,CAAA,KAAM,IAAA,CAAK,YAAY,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,SAAA,EAAW,CAAC,CAAA;AAAA,gCAClE,QAAQ,GAAA,CAAI,OAAA;AAAA,gCACZ,WAAW,GAAA,CAAI,OAAA;AAAA,gCACf,WAAW,GAAA,CAAI;AAAA;AAAA,6BACjB;AAAA,4CACAA,GAAAA;AAAA,8BAAC,MAAA;AAAA,8BAAA;AAAA,gCACC,SAAA,EAAU,uBAAA;AAAA,gCACV,eAAa,IAAA,CAAK,SAAA,GAAY,IAAA,CAAK,QAAA,EAAU,QAAQ,CAAC,CAAA;AAAA,gCAErD,QAAA,EAAA,KAAA,CAAM,IAAA,CAAK,SAAA,GAAY,IAAA,CAAK,QAAQ;AAAA;AAAA;AACvC,2BAAA,EACF;AAAA,yBAAA,EACF;AAAA;AAAA,qBAAA;AAAA,oBA/CK,IAAA,CAAK,UAAU,IAAA,CAAK;AAAA,mBAiD5B;AAAA;AAAA;AAAA,aACH;AAAA,4BAEAM,IAAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBACC,eAAa,GAAA,CAAI,UAAA;AAAA,gBACjB,SAAA,EAAU,8BAAA;AAAA,gBAET,QAAA,EAAA;AAAA,kBAAA,MAAA,CAAO,SAAS,SAAA,oBACfA,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,WAAA,EACb,QAAA,EAAA;AAAA,oCAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAA,EACb,QAAA,EAAA;AAAA,sCAAAN,GAAAA;AAAA,wBAAC,OAAA;AAAA,wBAAA;AAAA,0BACC,eAAa,GAAA,CAAI,aAAA;AAAA,0BACjB,IAAA,EAAK,MAAA;AAAA,0BACL,WAAA,EAAY,mBAAA;AAAA,0BACZ,KAAA,EAAO,IAAA;AAAA,0BACP,UAAU,CAAC,CAAA,KAAM,OAAA,CAAQ,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,0BACvC,SAAA,EAAU;AAAA;AAAA,uBACZ;AAAA,sCACAA,GAAAA;AAAA,wBAAC,QAAA;AAAA,wBAAA;AAAA,0BACC,IAAA,EAAK,QAAA;AAAA,0BACL,eAAa,GAAA,CAAI,aAAA;AAAA,0BACjB,OAAA,EAAS,SAAA;AAAA,0BACT,QAAA,EAAU,QAAA,IAAY,CAAC,IAAA,CAAK,IAAA,EAAK;AAAA,0BACjC,SAAA,EAAU,oFAAA;AAAA,0BACX,QAAA,EAAA;AAAA;AAAA;AAED,qBAAA,EACF,CAAA;AAAA,oBACC,aAAA,oBACCA,GAAAA,CAAC,GAAA,EAAA,EAAE,eAAa,GAAA,CAAI,aAAA,EAAe,SAAA,EAAU,0BAAA,EAC1C,QAAA,EAAA,aAAA,EACH;AAAA,mBAAA,EAEJ,CAAA;AAAA,kCAGFA,IAAC,IAAA,EAAA,EAAK,IAAA,EAAK,QAAO,IAAA,EAAK,eAAA,EAAgB,SAAS,eAAA,EAAiB,CAAA;AAAA,kBAMhE,sBAAA,CAAuB,IAAI,CAAA,oBAC1BA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,MAAA,EACb,QAAA,kBAAAA,GAAAA,CAAC,iBAAA,EAAA,EAAkB,OAAA,EAAO,MAAC,CAAA,EAC7B,CAAA;AAAA,kCAGFM,IAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,qBAAA,EACZ,QAAA,EAAA;AAAA,oCAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EACb,QAAA,EAAA;AAAA,sCAAAN,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,UAAA,EAAQ,CAAA;AAAA,sCAC9CA,GAAAA,CAAC,IAAA,EAAA,EAAG,aAAA,EAAa,GAAA,CAAI,YAAA,EAAc,YAAA,EAAY,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAA,EAAI,QAAA,EAAA,KAAA,CAAM,QAAQ,CAAA,EAAE;AAAA,qBAAA,EACvF,CAAA;AAAA,oBACC,aAAA,GAAgB,qBACfM,IAAAA,CAAC,SAAI,SAAA,EAAU,uCAAA,EAAwC,aAAA,EAAa,GAAA,CAAI,WAAA,EACtE,QAAA,EAAA;AAAA,sCAAAA,KAAC,IAAA,EAAA,EAAG,QAAA,EAAA;AAAA,wBAAA,UAAA;AAAA,wBACO,GAAA;AAAA,wCACTA,IAAAA;AAAA,0BAAC,QAAA;AAAA,0BAAA;AAAA,4BACC,IAAA,EAAK,QAAA;AAAA,4BACL,SAAS,IAAA,CAAK,aAAA;AAAA,4BACd,SAAA,EAAU,2DAAA;AAAA,4BACX,QAAA,EAAA;AAAA,8BAAA,GAAA;AAAA,8BACG,IAAA,CAAK,YAAA;AAAA,8BAAa;AAAA;AAAA;AAAA;AACtB,uBAAA,EACF,CAAA;AAAA,sCACAA,IAAAA,CAAC,IAAA,EAAA,EAAG,cAAY,aAAA,CAAc,OAAA,CAAQ,CAAC,CAAA,EAAG,QAAA,EAAA;AAAA,wBAAA,QAAA;AAAA,wBAAE,MAAM,aAAa;AAAA,uBAAA,EAAE;AAAA,qBAAA,EACnE,CAAA;AAAA,oCAEFA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EACb,QAAA,EAAA;AAAA,sCAAAA,IAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA;AAAA,wBAAA,OAAA;AAAA,wBAEnC,QAAA,CAAS,WAAW,QAAA,IAAY,QAAA,CAAS,8BACxCA,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,cAAA,EAAe,QAAA,EAAA;AAAA,0BAAA,OAAA;AAAA,0BAC1BsB,gBAAAA,CAAiB,SAAS,UAAU;AAAA,yBAAA,EACzC;AAAA,uBAAA,EAEJ,CAAA;AAAA,sCACA5B,GAAAA,CAAC,IAAA,EAAA,EAAG,aAAA,EAAa,GAAA,CAAI,cAAc,YAAA,EAAY,QAAA,CAAS,OAAA,CAAQ,CAAC,GAC9D,QAAA,EAAA,QAAA,KAAa,CAAA,GAAI,WAAA,GAAW,KAAA,CAAM,QAAQ,CAAA,EAC7C;AAAA,qBAAA,EACF,CAAA;AAAA,oCACAM,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4DAAA,EACb,QAAA,EAAA;AAAA,sCAAAN,GAAAA,CAAC,QAAG,QAAA,EAAA,OAAA,EAAK,CAAA;AAAA,sCACTA,GAAAA,CAAC,IAAA,EAAA,EAAG,aAAA,EAAa,GAAA,CAAI,SAAA,EAAW,YAAA,EAAY,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,EAAI,QAAA,EAAA,KAAA,CAAM,KAAK,CAAA,EAAE;AAAA,qBAAA,EAC9E;AAAA,mBAAA,EACF,CAAA;AAAA,kCAEAA,GAAAA;AAAA,oBAAC,QAAA;AAAA,oBAAA;AAAA,sBACC,IAAA,EAAK,QAAA;AAAA,sBACL,eAAa,GAAA,CAAI,UAAA;AAAA,sBACjB,SAAS,MAAM;AACb,wBAAA,IAAA,CAAK,WAAA,EAAY;AACjB,wBAAA,UAAA,CAAW,WAAW,CAAA;AAAA,sBACxB,CAAA;AAAA,sBACA,SAAA,EAAU,uIAAA;AAAA,sBACV,KAAA,EAAO,EAAE,YAAA,EAAc,yBAAA,EAA0B;AAAA,sBAClD,QAAA,EAAA;AAAA;AAAA,mBAED;AAAA,kCAEAA,IAAC,IAAA,EAAA,EAAK,IAAA,EAAK,QAAO,IAAA,EAAK,cAAA,EAAe,SAAS,eAAA,EAAiB,CAAA;AAAA,kBAE/D,WAAA,oBACCA,GAAAA,CAAC,WAAA,EAAA,EAAY,IAAA,EAAY,QAAgB,YAAA,EAAc,MAAA,CAAO,YAAA,EAAe,GAAG,gBAAA,EAAkB;AAAA;AAAA;AAAA;AAEtG,WAAA,EACF;AAAA;AAAA;AAAA;AAEJ,GAAA,EACF,CAAA;AAEJ;AChUA,SAAS,cAAc,IAAA,EAAsB;AAC3C,EAAA,OAAO,IAAA,CACJ,MAAM,GAAG,CAAA,CACT,OAAO,OAAO,CAAA,CACd,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,aAAY,GAAI,IAAA,CAAK,MAAM,CAAC,CAAC,CAAA,CAC1D,IAAA,CAAK,GAAG,CAAA;AACb;AAUO,SAAS,WAAA,CAAY,EAAE,IAAA,EAAM,IAAA,EAAM,QAAO,EAAqB;AACpE,EAAA,MAAM,SAAS,mBAAA,EAAoB;AACnC,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,IAAS,aAAA,CAAc,IAAI,CAAA;AAC9C,EAAA,iBAAA,CAAkB,EAAE,OAAO,CAAA,EAAG,KAAK,WAAM,MAAA,CAAO,IAAI,IAAI,CAAA;AAExD,EAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,GAAQ,cAAA,CAAe,OAAO,KAAA,EAAO,IAAA,CAAK,KAAK,CAAA,GAAI,MAAA;AACtE,EAAA,MAAM,IAAA,mBAAOA,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,SAAA,EAAU,IAAA,EAAY,MAAA,EAAQ,EAAE,IAAA,EAAM,GAAG,MAAA,EAAO,EAAG,CAAA;AACrF,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AAEnB,EAAA,uBACEM,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAA,EAAW,IAAA,EAAM,eAAY,qBAAA,EAChC,QAAA,EAAA;AAAA,oBAAAN,IAAC,oBAAA,EAAA,EAAqB,KAAA,EAAc,QAAA,EAAU,iBAAA,CAAkB,IAAI,CAAA,EAAG,CAAA;AAAA,IACtE;AAAA,GAAA,EACH,CAAA;AAEJ;;;ACRO,SAAS,sBAAA,CACd,QACA,OAAA,EACsB;AACtB,EAAA,MAAM,QAAA,GAAW,eAAe,MAAM,CAAA;AACtC,EAAA,MAAM,OAAO,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,GAAA;AAEtC,EAAA,KAAA,MAAW,KAAA,IAAS,QAAA,CAAS,MAAA,IAAU,EAAC,EAAG;AACzC,IAAA,MAAM,MAAA,GAAS,SAAA,CAAU,KAAA,CAAM,IAAA,EAAM,IAAI,CAAA;AACzC,IAAA,IAAI,QAAQ,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,OAAO,MAAA,EAAO;AAAA,EACrD;AAEA,EAAA,MAAM,OAAA,GAAU,SAAA,CAAU,gBAAA,EAAkB,IAAI,CAAA;AAChD,EAAA,IAAI,SAAS,IAAA,EAAM,OAAO,EAAE,IAAA,EAAM,SAAA,EAAW,QAAQ,OAAA,EAAQ;AAE7D,EAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,YAAA,EAAc,IAAI,CAAA;AAC1C,EAAA,IAAI,OAAO,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,QAAQ,KAAA,EAAM;AAIrD,EAAA,IAAI,UAAU,WAAA,EAAa,IAAI,GAAG,OAAO,EAAE,MAAM,UAAA,EAAW;AAC5D,EAAA,IAAI,UAAU,UAAA,EAAY,IAAI,GAAG,OAAO,EAAE,MAAM,SAAA,EAAU;AAC1D,EAAA,IAAI,UAAU,UAAA,EAAY,IAAI,GAAG,OAAO,EAAE,MAAM,SAAA,EAAU;AAC1D,EAAA,IAAI,QAAA,CAAS,OAAO,IAAA,KAAS,SAAA,IAAa,UAAU,QAAA,CAAS,MAAA,CAAO,WAAA,EAAa,IAAI,CAAA,EAAG;AACtF,IAAA,OAAO,EAAE,MAAM,eAAA,EAAgB;AAAA,EACjC;AACA,EAAA,IAAI,SAAA,CAAU,YAAY,IAAI,CAAA,SAAU,EAAE,IAAA,EAAM,QAAA,EAAU,MAAA,EAAQ,SAAA,EAAU;AAC5E,EAAA,IAAI,SAAA,CAAU,UAAU,IAAI,CAAA,SAAU,EAAE,IAAA,EAAM,QAAA,EAAU,MAAA,EAAQ,OAAA,EAAQ;AACxE,EAAA,IAAI,SAAA,CAAU,YAAY,IAAI,CAAA,SAAU,EAAE,IAAA,EAAM,QAAA,EAAU,MAAA,EAAQ,SAAA,EAAU;AAE5E,EAAA,MAAM,OAAA,GAAU,gBAAA,CAAiB,QAAA,CAAS,KAAA,EAAO,IAAI,CAAA;AACrD,EAAA,IAAI,OAAA,EAAS,OAAO,EAAE,IAAA,EAAM,SAAA,EAAW,MAAM,OAAA,CAAQ,IAAA,EAAM,MAAA,EAAQ,OAAA,CAAQ,MAAA,EAAO;AAElF,EAAA,IAAI,SAAS,GAAA,IAAO,IAAA,KAAS,IAAI,OAAO,EAAE,MAAM,MAAA,EAAO;AACvD,EAAA,OAAO,EAAE,MAAM,UAAA,EAAW;AAC5B;AAGO,SAAS,WAAA,CACd,QACA,IAAA,EACS;AACT,EAAA,OAAO,sBAAA,CAAuB,MAAA,EAAQ,IAAI,CAAA,CAAE,IAAA,KAAS,UAAA;AACvD;AAMA,IAAM,kBAAkB,CAAC,GAAA,EAAK,UAAA,EAAY,UAAA,EAAY,UAAU,UAAU,CAAA;AAE1E,SAAS,eAAe,MAAA,EAA+E;AACrG,EAAA,OAAO,cAAc,MAAA,IAAU,OAAA,IAAW,MAAA,GACrC,MAAA,GACD,cAAc,MAAM,CAAA;AAC1B;AASO,SAAS,YAAA,CACd,QACA,IAAA,EACS;AACT,EAAA,MAAM,KAAA,GAAQ,sBAAA,CAAuB,MAAA,EAAQ,IAAI,CAAA;AACjD,EAAA,QAAQ,MAAM,IAAA;AAAM,IAClB,KAAK,UAAA;AAAA,IACL,KAAK,SAAA;AAAA,IACL,KAAK,OAAA;AACH,MAAA,OAAO,KAAA;AAAA,IACT,KAAK,QAAA;AACH,MAAA,OACE,KAAA,CAAM,KAAA,CAAM,IAAA,KAAS,UAAA,IACrB,KAAA,CAAM,MAAM,IAAA,KAAS,SAAA,IACrB,KAAA,CAAM,KAAA,CAAM,MAAA,KAAW,SAAA;AAAA,IAE3B;AACE,MAAA,OAAO,IAAA;AAAA;AAEb;AAUA,eAAsB,gBAAgB,KAAA,EAKhB;AACpB,EAAA,MAAM,QAAA,GAAW,cAAA,CAAe,KAAA,CAAM,MAAM,CAAA;AAC5C,EAAA,MAAM,KAAA,GAAQ,CAAC,GAAG,eAAe,CAAA;AAEjC,EAAA,KAAA,MAAW,KAAA,IAAS,QAAA,CAAS,MAAA,IAAU,EAAC,EAAG;AACzC,IAAA,IAAI,CAAC,MAAM,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAAA,EACtD;AAEA,EAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,QAAA,CAAS,aAAa,EAAE,MAAA,EAAQ,UAAU,CAAA;AACvE,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU,KAAA,CAAM,KAAK,CAAA,SAAA,EAAY,OAAA,CAAQ,IAAI,CAAA,CAAE,CAAA;AAErE,EAAA,MAAM,SAAS,KAAA,CAAM,IAAA,CAAK,IAAI,GAAA,CAAI,KAAK,CAAC,CAAA;AACxC,EAAA,OAAO,KAAA,CAAM,cAAA,GAAiB,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,YAAA,CAAa,QAAA,EAAU,CAAC,CAAC,CAAA;AACvF;;;ACvIA,IAAM,GAAA,GAAM,2BAAA;AAEZ,IAAM,GAAA,GAAM,EAAA;AAEZ,SAAS,IAAA,GAAiB;AACxB,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,UAAA,CAAW,YAAA,EAAc,OAAA,CAAQ,GAAG,CAAA;AAChD,IAAA,MAAM,SAAS,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,GAAG,IAAI,EAAC;AACxC,IAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,GAAI,MAAA,CAAO,MAAA,CAAO,CAAC,EAAA,KAAO,OAAO,EAAA,KAAO,QAAQ,CAAA,GAAI,EAAC;AAAA,EAClF,CAAA,CAAA,MAAQ;AAGN,IAAA,OAAO,EAAC;AAAA,EACV;AACF;AAEO,SAAS,mBAAmB,OAAA,EAAuB;AACxD,EAAA,IAAI,CAAC,OAAA,EAAS;AACd,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,CAAC,OAAA,EAAS,GAAG,MAAK,CAAE,MAAA,CAAO,CAAC,EAAA,KAAO,OAAO,OAAO,CAAC,CAAA,CAAE,KAAA,CAAM,GAAG,GAAG,CAAA;AAC7E,IAAA,UAAA,CAAW,cAAc,OAAA,CAAQ,GAAA,EAAK,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC,CAAA;AAAA,EAC5D,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;AAGO,SAAS,iBAAA,GAA8B;AAC5C,EAAA,OAAO,IAAA,EAAK;AACd;;;ACzCO,SAAS,aAAa,GAAA,EAAsB;AACjD,EAAA,IAAI,GAAA,YAAe,KAAA,EAAO,OAAO,GAAA,CAAI,OAAA;AACrC,EAAA,IAAI,OAAO,OAAO,GAAA,KAAQ,YAAY,OAAQ,GAAA,CAA8B,YAAY,QAAA,EAAU;AAChG,IAAA,OAAQ,GAAA,CAA4B,OAAA;AAAA,EACtC;AACA,EAAA,OAAO,EAAA;AACT;;;ACoCA,SAAS,mBAAA,CACP,SACA,eAAA,EACoB;AACpB,EAAA,IAAI,SAAS,KAAA,EAAO,IAAA,IAAQ,OAAO,OAAA,CAAQ,MAAM,IAAA,EAAK;AAGtD,EAAA,IAAI,iBAAiB,OAAO,MAAA;AAE5B,EAAA,IAAI,CAAC,SAAS,OAAO,MAAA;AACrB,EAAA,MAAM,QAAQ,CAAC,OAAA,CAAQ,MAAA,EAAQ,OAAA,CAAQ,MAAM,OAAA,CAAQ,GAAG,CAAA,CACrD,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,EAAM,MAAM,CAAA,CAC1B,OAAO,OAAO,CAAA;AAEjB,EAAA,OAAO,KAAA,CAAM,SAAS,CAAA,GAAI,CAAA,SAAA,EAAY,MAAM,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,GAAK,MAAA;AAC7D;AAGA,SAAS,qBAAqB,GAAA,EAAuB;AACnD,EAAA,MAAM,OAAA,GAAU,YAAA,CAAa,GAAG,CAAA,CAAE,WAAA,EAAY;AAC9C,EAAA,OAAO,OAAA,CAAQ,QAAA,CAAS,yBAAyB,CAAA,IAC5C,OAAA,CAAQ,SAAS,wCAAwC,CAAA,IACzD,OAAA,CAAQ,QAAA,CAAS,qCAAqC,CAAA;AAC7D;AAOA,eAAsB,oBAAA,CAAqB;AAAA,EACzC,MAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,eAAA;AAAA,EACA,aAAA;AAAA,EACA,QAAA,GAAW;AACb,CAAA,EAAmE;AACjE,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,IAAA,GAAO,WAAA,EAAY;AAChD,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,IAAA,CAAK,IAAA,EAAK;AAChC,EAAA,MAAM,WAAWN,eAAAA,EAAgB;AAEjC,EAAA,IAAI,UAAA,GAAa,SAAS,UAAA,IAAc,IAAA;AAGxC,EAAA,IAAI,CAAC,cAAc,OAAA,EAAS,KAAA,EAAO,MAAK,CAAE,WAAA,OAAkB,KAAA,EAAO;AACjE,IAAA,MAAM,cAAc,MAAM,wBAAA,CAAyB,KAAA,EAAO,EAAE,MAAM,CAAA;AAClE,IAAA,UAAA,GAAa,WAAA,CAAY,UAAA;AAAA,EAC3B;AAEA,EAAA,MAAM,KAAA,GAAQ,mBAAA,CAAoB,OAAA,EAAS,eAAe,CAAA;AAC1D,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,IACtC,WAAW,IAAA,CAAK,SAAA;AAAA;AAAA;AAAA,IAGhB,SAAA,EAAW,KAAK,SAAA,IAAa,MAAA;AAAA,IAC7B,UAAU,IAAA,CAAK,QAAA;AAAA,IACf,YAAA,EAAc,KAAK,YAAA,IAAgB;AAAA,GACrC,CAAE,CAAA;AACF,EAAA,MAAM,aAAA,GAAgB,cAAA,CAAe,IAAA,EAAM,MAAM,CAAA;AAKjD,EAAA,MAAM,QAAA,GAAW,MAAM,wBAAA,CAAgC;AAAA,IACrD,KAAA;AAAA,IACA,QAAA,EAAU,EAAE,IAAA,EAAM,KAAA,EAAM;AAAA,IACxB,UAAU,MAAA,CAAO,QAAA;AAAA,IACjB,YAAA,EAAc,KAAK,YAAA,IAAgB,MAAA;AAAA,IACnC,aAAA;AAAA,IACA,KAAA;AAAA,IACA,YAAY,UAAA,IAAc;AAAA,GAC3B,CAAA;AACD,EAAA,IAAI,QAAA,SAAiB,EAAE,KAAA,EAAO,UAAU,UAAA,EAAY,UAAA,IAAc,QAAA,CAAS,UAAA,IAAc,EAAA,EAAG;AAI5F,EAAA,MAAM,QAAA,GAAW,MAAM,oBAAA,CAAqB;AAAA,IAC1C,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,MAC/B,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,WAAW,IAAA,CAAK;AAAA,KAClB,CAAE,CAAA;AAAA,IACF,QAAA,EAAU,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,CAAC,GAAA,EAAK,IAAA,KAAS,GAAA,GAAM,IAAA,CAAK,SAAA,GAAY,IAAA,CAAK,QAAA,EAAU,CAAC,CAAA;AAAA,IAClF,aAAA,EAAe;AAAA,GAChB,CAAA;AAKD,EAAA,MAAM,KAAA,GAAQ,CAAC,cAAA,KAAuC,QAAA,CAAS,UAAA,CAAW;AAAA,IACxE,UAAA,EAAY,cAAA;AAAA,IACZ,QAAA,EAAU,EAAE,IAAA,EAAM,KAAA,EAAM;AAAA,IACxB,UAAU,MAAA,CAAO,QAAA;AAAA,IACjB,KAAA;AAAA,IACA,YAAA,EAAc,KAAK,YAAA,IAAgB,MAAA;AAAA,IACnC,aAAA;AAAA;AAAA;AAAA;AAAA,IAIA,eAAA;AAAA,IACA,aAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,IAAI,KAAA;AACJ,EAAA,IAAI;AACF,IAAA,KAAA,GAAQ,MAAM,KAAA,CAAM,UAAA,IAAc,KAAA,CAAS,CAAA;AAAA,EAC7C,SAAS,GAAA,EAAK;AAQZ,IAAA,IAAI,CAAC,UAAA,IAAc,CAAC,oBAAA,CAAqB,GAAG,GAAG,MAAM,GAAA;AACrD,IAAA,UAAA,GAAa,IAAA;AACb,IAAA,KAAA,GAAQ,MAAM,MAAM,MAAS,CAAA;AAAA,EAC/B;AAEA,EAAA,IAAI,QAAA,EAAU;AAGZ,IAAA,IAAI,SAAS,cAAA,EAAgB,MAAM,QAAA,CAAS,cAAA,CAAe,MAAM,EAAE,CAAA;AAAA,SAC9D,MAAM,SAAS,WAAA,CAAY,KAAA,CAAM,IAAI,EAAE,eAAA,EAAiB,QAAQ,CAAA;AAAA,EACvE;AAIA,EAAA,kBAAA,CAAmB,MAAM,EAAE,CAAA;AAE3B,EAAA,OAAO,EAAE,KAAA,EAAO,UAAA,EAAY,UAAA,IAAc,KAAA,CAAM,cAAc,EAAA,EAAG;AACnE;ACtKO,SAAS,YAAY,EAAE,YAAA,GAAe,EAAA,EAAI,OAAA,EAAS,YAAW,EAAqB;AACxF,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIQ,SAAS,YAAY,CAAA;AAC/C,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,SAAS,EAAE,CAAA;AAC3C,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,SAAS,KAAK,CAAA;AACtC,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAEtD,EAAAJ,UAAU,MAAM;AACd,IAAA,MAAM,KAAA,GAAQ,CAAC,KAAA,KAAyB;AAAE,MAAA,IAAI,KAAA,CAAM,GAAA,KAAQ,QAAA,EAAU,OAAA,EAAQ;AAAA,IAAE,CAAA;AAChF,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,KAAK,CAAA;AAC1C,IAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,KAAK,CAAA;AAAA,EAC5D,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,eAAe,OAAO,KAAA,EAAwB;AAC5C,IAAA,KAAA,CAAM,cAAA,EAAe;AACrB,IAAA,IAAI,CAAC,KAAA,CAAM,IAAA,EAAK,IAAK,CAAC,QAAA,EAAU;AAChC,IAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,IAAI;AACF,MAAA,MAAM,wBAAA,CAAyB,KAAA,EAAO,EAAE,QAAA,EAAU,CAAA;AAClD,MAAA,MAAM,OAAA,GAAU,gBAAgB,QAAA,EAAS;AACzC,MAAA,UAAA,GAAa,EAAE,KAAA,EAAO,OAAA,CAAQ,OAAO,IAAA,EAAM,OAAA,CAAQ,MAAM,CAAA;AACzD,MAAA,OAAA,EAAQ;AAAA,IACV,CAAA,CAAA,MAAQ;AACN,MAAA,QAAA,CAAS,8DAAwD,CAAA;AAAA,IACnE,CAAA,SAAE;AACA,MAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,IACf;AAAA,EACF;AAEA,EAAA,uBACEQ,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,2DAAA;AAAA,MACV,IAAA,EAAK,QAAA;AAAA,MACL,YAAA,EAAW,MAAA;AAAA,MACX,YAAA,EAAW,qBAAA;AAAA,MAEX,QAAA,EAAA;AAAA,wBAAAN,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oEAAA,EAAqE,SAAS,OAAA,EAAS,CAAA;AAAA,wBACtGM,IAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,6EAAA;AAAA,YACV,KAAA,EAAO,EAAE,YAAA,EAAc,uBAAA,EAAwB;AAAA,YAE/C,QAAA,EAAA;AAAA,8BAAAN,GAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAK,QAAA;AAAA,kBACL,OAAA,EAAS,OAAA;AAAA,kBACT,YAAA,EAAW,QAAA;AAAA,kBACX,SAAA,EAAU,+GAAA;AAAA,kBAEV,QAAA,kBAAAA,GAAAA,CAACuB,CAAAA,EAAA,EAAE,WAAU,SAAA,EAAU;AAAA;AAAA,eACzB;AAAA,8BAEAjB,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,gCAAAN,GAAAA,CAAC,UAAK,SAAA,EAAU,kFAAA,EACd,0BAAAA,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU,CAAA,EAC5B,CAAA;AAAA,gCACAM,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,kCAAAN,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,gDAAA,EAAiD,QAAA,EAAA,qBAAA,EAAmB,CAAA;AAAA,kCAClFA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,iCAAgC,QAAA,EAAA,4CAAA,EAA0C;AAAA,iBAAA,EACzF;AAAA,eAAA,EACF,CAAA;AAAA,8BAEAM,IAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAU,MAAA,EAAQ,WAAU,gBAAA,EAChC,QAAA,EAAA;AAAA,gCAAAN,GAAAA;AAAA,kBAAC,OAAA;AAAA,kBAAA;AAAA,oBACC,IAAA,EAAK,OAAA;AAAA,oBACL,QAAA,EAAQ,IAAA;AAAA,oBACR,SAAA,EAAS,IAAA;AAAA,oBACT,WAAA,EAAY,kBAAA;AAAA,oBACZ,KAAA,EAAO,KAAA;AAAA,oBACP,UAAU,CAAC,KAAA,KAAU,QAAA,CAAS,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,oBAChD,SAAA,EAAU,iIAAA;AAAA,oBACV,KAAA,EAAO,EAAE,YAAA,EAAc,wBAAA;AAAyB;AAAA,iBAClD;AAAA,gCACAA,GAAAA;AAAA,kBAAC,OAAA;AAAA,kBAAA;AAAA,oBACC,IAAA,EAAK,UAAA;AAAA,oBACL,QAAA,EAAQ,IAAA;AAAA,oBACR,WAAA,EAAY,OAAA;AAAA,oBACZ,KAAA,EAAO,QAAA;AAAA,oBACP,UAAU,CAAC,KAAA,KAAU,WAAA,CAAY,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,oBACnD,SAAA,EAAU,iIAAA;AAAA,oBACV,KAAA,EAAO,EAAE,YAAA,EAAc,wBAAA;AAAyB;AAAA,iBAClD;AAAA,gBACC,yBAASA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,4BAA4B,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,gCACzDA,GAAAA;AAAA,kBAAC,QAAA;AAAA,kBAAA;AAAA,oBACC,IAAA,EAAK,QAAA;AAAA,oBACL,QAAA,EAAU,IAAA;AAAA,oBACV,SAAA,EAAU,yJAAA;AAAA,oBACV,KAAA,EAAO,EAAE,YAAA,EAAc,yBAAA,EAA0B;AAAA,oBAEhD,iBAAO,gBAAA,GAAc;AAAA;AAAA;AACxB,eAAA,EACF,CAAA;AAAA,8BAEAM,IAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,gDAAA,EAAiD,QAAA,EAAA;AAAA,gBAAA,mBAAA;AAAA,gBAC7C,GAAA;AAAA,gCACfN,IAAC,IAAA,EAAA,EAAK,EAAA,EAAG,YAAW,OAAA,EAAS,OAAA,EAAS,SAAA,EAAU,4CAAA,EAA6C,QAAA,EAAA,aAAA,EAE7F;AAAA,eAAA,EACF;AAAA;AAAA;AAAA;AACF;AAAA;AAAA,GACF;AAEJ;ACtGA,IAAM6B,OAAAA,GAAuC;AAAA,EAC3C,CAAA,EAAG,OAAA;AAAA,EACH,CAAA,EAAG,SAAA;AAAA,EACH,CAAA,EAAG,WAAA;AAAA,EACH,CAAA,EAAG;AACL,CAAA;AAQO,SAAS,aAAA,CAAc,EAAE,OAAA,EAAS,UAAA,EAAW,EAAuB;AACzE,EAAA,MAAM,KAAA,GAAwB,CAAC,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAEzC,EAAA,uBACEvB,KAAC,KAAA,EAAA,EAAI,aAAA,EAAa,IAAI,aAAA,EAAe,YAAA,EAAW,oBAAA,EAAqB,SAAA,EAAU,MAAA,EAC7E,QAAA,EAAA;AAAA,oBAAAN,GAAAA,CAAC,QAAG,SAAA,EAAU,oCAAA,EACX,gBAAM,GAAA,CAAI,CAAC,MAAM,KAAA,KAAU;AAC1B,MAAA,MAAM,OAAO,IAAA,GAAO,OAAA;AACpB,MAAA,MAAMC,UAAS,IAAA,KAAS,OAAA;AACxB,MAAA,MAAM,SAAA,GAAY,IAAA,IAAQ,CAAC,CAAC,UAAA;AAC5B,MAAA,MAAM,GAAA,GAAM,YAAY,QAAA,GAAW,KAAA;AAEnC,MAAA,uBACEK,IAAAA,CAAC,IAAA,EAAA,EAAc,SAAA,EAAU,mDAAA,EACvB,QAAA,EAAA;AAAA,wBAAAA,IAAAA;AAAA,UAAC,GAAA;AAAA,UAAA;AAAA,YACE,GAAI,SAAA,GACD,EAAE,IAAA,EAAM,QAAA,EAAmB,OAAA,EAAS,MAAM,UAAA,CAAW,IAAI,CAAA,EAAE,GAC3D,EAAC;AAAA,YACL,aAAA,EAAa,GAAA,CAAI,YAAA,CAAa,IAAI,CAAA;AAAA,YAClC,YAAA,EAAY,IAAA,GAAO,MAAA,GAASL,OAAAA,GAAS,SAAA,GAAY,SAAA;AAAA,YACjD,cAAA,EAAcA,UAAS,MAAA,GAAS,MAAA;AAAA,YAChC,SAAA,EAAW;AAAA,cACT,6EAAA;AAAA,cACA,YAAY,gBAAA,GAAmB,EAAA;AAAA,cAC/BA,OAAAA,GAAS,iBAAA,GAAoB,IAAA,GAAO,iBAAA,GAAoB;AAAA,aAC1D,CAAE,KAAK,GAAG,CAAA;AAAA,YAEV,QAAA,EAAA;AAAA,8BAAAD,GAAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAW;AAAA,oBACT,oFAAA;AAAA,oBACA,IAAA,GACI,mDAAA,GACAC,OAAAA,GAIE,2CAAA,GACA;AAAA,mBACR,CAAE,KAAK,GAAG,CAAA;AAAA,kBAET,iCAAOD,GAAAA,CAAC8B,OAAA,EAAM,SAAA,EAAU,eAAc,CAAA,GAAK;AAAA;AAAA,eAC9C;AAAA,8BACA9B,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,CAAA,kCAAA,EAAqCC,OAAAA,GAAS,eAAA,GAAkB,EAAE,CAAA,CAAA,EAChF,QAAA,EAAA4B,OAAAA,CAAO,IAAI,CAAA,EACd;AAAA;AAAA;AAAA,SACF;AAAA,QACC,KAAA,GAAQ,KAAA,CAAM,MAAA,GAAS,CAAA,oBACtB7B,GAAAA,CAAC,MAAA,EAAA,EAAK,aAAA,EAAW,IAAA,EAAC,SAAA,EAAW,CAAA,YAAA,EAAe,IAAA,GAAO,YAAA,GAAe,WAAW,CAAA,CAAA,EAAI;AAAA,OAAA,EAAA,EAlC5E,IAoCT,CAAA;AAAA,IAEJ,CAAC,CAAA,EACH,CAAA;AAAA,oBAGAM,IAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sCAAA,EACV,QAAA,EAAA;AAAA,MAAA,OAAA;AAAA,MAAQ,IAAA;AAAA,MAAGuB,QAAO,OAAO;AAAA,KAAA,EAC5B;AAAA,GAAA,EACF,CAAA;AAEJ;AC/EO,SAAS,QAAA,CAAS,EAAE,SAAA,GAAY,EAAA,EAAI,OAAM,EAAkB;AAEjE,EAAA,uBAAO7B,IAAC,MAAA,EAAA,EAAK,aAAA,EAAW,MAAC,SAAA,EAAW,CAAA,uBAAA,EAA0B,SAAS,CAAA,CAAA,EAAI,KAAA,EAAc,CAAA;AAC3F;AAOO,SAAS,aAAA,CAAc,EAAE,KAAA,EAAO,SAAA,GAAY,IAAI,QAAA,EAAU,GAAG,MAAK,EAAuB;AAC9F,EAAA,uBACEM,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,WAAA,EAAU,MAAA;AAAA,MACV,SAAA,EAAW,4CAA4C,SAAS,CAAA,CAAA;AAAA,MAC/D,GAAG,IAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,wBAAAN,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAW,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,QAChC;AAAA;AAAA;AAAA,GACH;AAEJ;AAGO,SAAS,QAAA,CAAS,EAAE,SAAA,GAAY,EAAA,EAAG,EAA2B;AACnE,EAAA,uBACEM,KAAC,MAAA,EAAA,EAAK,aAAA,EAAW,MAAC,SAAA,EAAW,CAAA,mCAAA,EAAsC,SAAS,CAAA,CAAA,EAC1E,QAAA,EAAA;AAAA,oBAAAN,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,6FAAA,EAA8F,CAAA;AAAA,oBAC9GA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0DAAA,EAA2D;AAAA,GAAA,EAC7E,CAAA;AAEJ;ACpBA,IAAM,OAAA,GAAU,GAAA;AAkBT,SAAS,gBAAgB,EAAE,KAAA,EAAO,QAAQ,MAAA,EAAQ,KAAA,EAAO,eAAc,EAAyB;AACrG,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIE,SAAgB,SAAS,CAAA;AACnD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,SAA+B,IAAI,CAAA;AAC/D,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAwB,IAAI,CAAA;AACtD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAI9D,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAC5D,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAwB,IAAI,CAAA;AACtD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,SAAS,KAAK,CAAA;AAE1C,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,SAAS,KAAK,CAAA;AAC9C,EAAA,MAAM,OAAA,GAAUC,OAAO,KAAK,CAAA;AAG5B,EAAA,MAAM,MAAA,GAASA,OAAO,KAAK,CAAA;AAE3B,EAAA,MAAM,IAAA,GAAO4B,YAAY,YAAY;AACnC,IAAA,MAAM,OAAOrC,eAAAA,EAAgB;AAC7B,IAAA,IAAI,CAAC,KAAK,mBAAA,EAAqB;AAC7B,MAAA,QAAA,CAAS,iDAA8C,CAAA;AACvD,MAAA,QAAA,CAAS,OAAO,CAAA;AAChB,MAAA;AAAA,IACF;AACA,IAAA,QAAA,CAAS,SAAS,CAAA;AAClB,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,mBAAA,CAAoB,KAAK,CAAA;AACpD,MAAA,YAAA,CAAa,QAAQ,SAAS,CAAA;AAC9B,MAAA,WAAA,CAAY,OAAA,CAAQ,QAAA,IAAY,KAAA,CAAM,QAAA,IAAY,IAAI,CAAA;AACtD,MAAA,QAAA,CAAS,QAAQ,KAAK,CAAA;AACtB,MAAA,SAAA,CAAU,QAAQ,MAAM,CAAA;AACxB,MAAA,QAAA,CAAS,OAAA,CAAQ,MAAA,GAAS,SAAA,GAAY,OAAO,CAAA;AAC7C,MAAA,IAAI,CAAC,OAAA,CAAQ,MAAA,EAAQ,QAAA,CAAS,+CAAyC,CAAA;AAAA,IACzE,SAAS,GAAA,EAAK;AAEZ,MAAA,IAAK,GAAA,EAA6B,WAAW,GAAA,EAAK;AAChD,QAAA,aAAA,IAAgB;AAChB,QAAA;AAAA,MACF;AACA,MAAA,QAAA,CAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,+CAAyC,CAAA;AACvF,MAAA,QAAA,CAAS,OAAO,CAAA;AAAA,IAClB;AAAA,EACF,CAAA,EAAG,CAAC,KAAA,EAAO,aAAa,CAAC,CAAA;AAEzB,EAAAI,UAAU,MAAM;AACd,IAAA,IAAI,OAAO,OAAA,EAAS;AACpB,IAAA,MAAA,CAAO,OAAA,GAAU,IAAA;AACjB,IAAA,KAAK,IAAA,EAAK;AAAA,EACZ,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAST,EAAA,MAAM,KAAA,GAAQiC,YAAY,YAA8B;AACtD,IAAA,IAAI,CAAC,SAAA,IAAa,OAAA,CAAQ,OAAA,EAAS,OAAO,KAAA;AAC1C,IAAA,MAAM,OAAOrC,eAAAA,EAAgB;AAC7B,IAAA,IAAI,CAAC,IAAA,CAAK,qBAAA,EAAuB,OAAO,KAAA;AACxC,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,qBAAA,CAAsB,WAAW,QAAQ,CAAA;AACnE,MAAA,IAAI,OAAA,CAAQ,SAAS,OAAO,KAAA;AAC5B,MAAA,IAAI,MAAA,CAAO,KAAA,KAAU,MAAA,IAAU,MAAA,CAAO,OAAA,EAAS;AAC7C,QAAA,OAAA,CAAQ,OAAA,GAAU,IAAA;AAClB,QAAA,QAAA,CAAS,UAAU,CAAA;AACnB,QAAA,MAAA,CAAO,OAAO,OAAO,CAAA;AACrB,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,IAAI,MAAA,CAAO,KAAA,KAAU,QAAA,IAAY,MAAA,CAAO,UAAU,SAAA,EAAW;AAC3D,QAAA,QAAA;AAAA,UACE,MAAA,CAAO,MAAA,KACD,MAAA,CAAO,KAAA,KAAU,YACjB,mDAAA,GACA,sCAAA;AAAA,SACR;AACA,QAAA,QAAA,CAAS,OAAO,CAAA;AAAA,MAClB;AACA,MAAA,OAAO,KAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AAEN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF,CAAA,EAAG,CAAC,SAAA,EAAW,QAAA,EAAU,MAAM,CAAC,CAAA;AAEhC,EAAAI,UAAU,MAAM;AACd,IAAA,IAAI,KAAA,KAAU,SAAA,IAAa,CAAC,SAAA,EAAW;AACvC,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,MAAM,KAAA,GAAQ,YAAY,MAAM;AAAE,MAAA,IAAI,CAAC,OAAA,EAAS,KAAK,KAAA,EAAM;AAAA,IAAE,GAAG,OAAO,CAAA;AACvE,IAAA,OAAO,MAAM;AAAE,MAAA,OAAA,GAAU,IAAA;AAAM,MAAA,aAAA,CAAc,KAAK,CAAA;AAAA,IAAE,CAAA;AAAA,EACtD,CAAA,EAAG,CAAC,KAAA,EAAO,SAAA,EAAW,KAAK,CAAC,CAAA;AAE5B,EAAA,eAAe,WAAA,GAAc;AAC3B,IAAA,WAAA,CAAY,IAAI,CAAA;AAChB,IAAA,MAAM,IAAA,GAAO,MAAM,KAAA,EAAM;AAGzB,IAAA,IAAI,CAAC,IAAA,EAAM,WAAA,CAAY,KAAK,CAAA;AAAA,EAC9B;AAEA,EAAA,eAAe,IAAA,GAAO;AACpB,IAAA,IAAI,CAAC,QAAQ,GAAA,EAAK;AAClB,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,CAAU,SAAA,CAAU,SAAA,CAAU,MAAA,CAAO,GAAG,CAAA;AAC9C,MAAA,SAAA,CAAU,IAAI,CAAA;AACd,MAAA,UAAA,CAAW,MAAM,SAAA,CAAU,KAAK,CAAA,EAAG,IAAI,CAAA;AAAA,IACzC,CAAA,CAAA,MAAQ;AACN,MAAA,KAAA,CAAM,MAAM,+BAA4B,CAAA;AAAA,IAC1C;AAAA,EACF;AAEA,EAAA,IAAI,UAAU,SAAA,EAAW;AACvB,IAAA;AAAA;AAAA,sBAEEQ,IAAAA;AAAA,QAAC,aAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAM,0BAAA;AAAA,UACN,eAAa,GAAA,CAAI,eAAA;AAAA,UACjB,SAAA,EAAU,+BAAA;AAAA,UAEV,QAAA,EAAA;AAAA,4BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,8BAAAN,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,oBAAA,EAAqB,CAAA;AAAA,8BACzCA,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,sBAAA,EAAuB;AAAA,aAAA,EAC7C,CAAA;AAAA,4BACAA,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,4BAAA,EAA6B,CAAA;AAAA,4BACjDM,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kEAAA,EACb,QAAA,EAAA;AAAA,8BAAAN,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,8BAAA,EAA+B,CAAA;AAAA,8BACnDM,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EACb,QAAA,EAAA;AAAA,gCAAAN,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,UAAA,EAAW,CAAA;AAAA,gCAC/BA,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,eAAA,EAAgB,CAAA;AAAA,gCACpCA,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,6BAAA,EAA8B,CAAA;AAAA,gCAClDM,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EACb,QAAA,EAAA;AAAA,kCAAAN,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,sBAAA,EAAuB,CAAA;AAAA,kCAC3CA,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,sBAAA,EAAuB;AAAA,iBAAA,EAC7C;AAAA,eAAA,EACF;AAAA,aAAA,EACF;AAAA;AAAA;AAAA;AACF;AAAA,EAEJ;AAEA,EAAA,IAAI,UAAU,OAAA,EAAS;AACrB,IAAA,uBACEM,IAAAA,CAAC,KAAA,EAAA,EAAI,eAAa,GAAA,CAAI,eAAA,EAAiB,WAAU,yCAAA,EAC/C,QAAA,EAAA;AAAA,sBAAAN,GAAAA,CAAC,OAAE,aAAA,EAAa,GAAA,CAAI,eAAe,SAAA,EAAU,6FAAA,EAC1C,mBAAS,+CAAA,EACZ,CAAA;AAAA,sBACAM,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAA,EACb,QAAA,EAAA;AAAA,wBAAAN,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,SAAS,MAAM;AAAE,cAAA,MAAA,CAAO,OAAA,GAAU,KAAA;AAAO,cAAA,KAAK,IAAA,EAAK;AAAA,YAAE,CAAA;AAAA,YACrD,SAAA,EAAU,6GAAA;AAAA,YACX,QAAA,EAAA;AAAA;AAAA,SAED;AAAA,wBACAA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,MAAA;AAAA,YACT,SAAA,EAAU,6EAAA;AAAA,YACX,QAAA,EAAA;AAAA;AAAA;AAED,OAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACEM,KAAC,KAAA,EAAA,EAAI,aAAA,EAAa,IAAI,eAAA,EAAiB,SAAA,EAAU,WAAA,EAAY,WAAA,EAAU,QAAA,EACrE,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,wBAAAN,GAAAA,CAAC,MAAA,EAAA,EAAO,SAAA,EAAU,sBAAA,EAAuB,CAAA;AAAA,wBACzCA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,yBAAwB,QAAA,EAAA,oCAAA,EAAkC;AAAA,OAAA,EAC1E,CAAA;AAAA,sBACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sCAEiD,QAAA,EAAA,oFAAA,EAE9D,CAAA;AAAA,sBAEAM,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kEAAA,EACZ,QAAA,EAAA;AAAA,QAAA,MAAA,EAAQ,gCACPN,GAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,GAAA,EAAK,CAAA,sBAAA,EAAyB,MAAA,CAAO,YAAY,CAAA,CAAA;AAAA,YACjD,GAAA,EAAI,gBAAA;AAAA,YACJ,SAAA,EAAU;AAAA;AAAA,SACZ;AAAA,wBAEFM,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EACZ,QAAA,EAAA;AAAA,UAAA,KAAA,IAAS,IAAA,oBACRA,IAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,SAAA,EAAU,QAAA,EAAA;AAAA,YAAA,SAAA;AAAA,4BACdN,IAAC,QAAA,EAAA,EAAO,aAAA,EAAa,IAAI,oBAAA,EAAuB,QAAA,EAAA,KAAA,CAAM,KAAK,CAAA,EAAE;AAAA,WAAA,EACtE,CAAA;AAAA,0BAEFA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,0EAAyE,QAAA,EAAA,kBAAA,EAEtF,CAAA;AAAA,0BACAA,GAAAA;AAAA,YAAC,GAAA;AAAA,YAAA;AAAA,cACC,eAAa,GAAA,CAAI,OAAA;AAAA,cACjB,SAAA,EAAU,6FAAA;AAAA,cAET,QAAA,EAAA,MAAA,EAAQ;AAAA;AAAA,WACX;AAAA,0BAGAM,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EACb,QAAA,EAAA;AAAA,4BAAAA,IAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,OAAA,EAAS,IAAA;AAAA,gBACT,eAAa,GAAA,CAAI,OAAA;AAAA,gBACjB,SAAA,EAAU,mJAAA;AAAA,gBAET,QAAA,EAAA;AAAA,kBAAA,MAAA,mBAASN,GAAAA,CAAC8B,KAAAA,EAAA,EAAM,SAAA,EAAU,SAAA,EAAU,CAAA,mBAAK9B,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,kBACnE,SAAS,mBAAA,GAAmB;AAAA;AAAA;AAAA,aAC/B;AAAA,4BACAM,IAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,SAAS,MAAM;AAAE,kBAAA,KAAK,WAAA,EAAY;AAAA,gBAAE,CAAA;AAAA,gBACpC,QAAA,EAAU,YAAY,KAAA,KAAU,UAAA;AAAA,gBAChC,eAAa,GAAA,CAAI,UAAA;AAAA,gBACjB,SAAA,EAAU,2KAAA;AAAA,gBAET,QAAA,EAAA;AAAA,kBAAA,QAAA,IAAY,KAAA,KAAU,UAAA,mBACnBN,GAAAA,CAAC,QAAA,EAAA,EAAS,CAAA,mBACVA,GAAAA,CAAC8B,KAAAA,EAAA,EAAM,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,kBAC9B,KAAA,KAAU,UAAA,GAAa,mBAAA,GAAiB,QAAA,GAAW,mBAAA,GAAiB;AAAA;AAAA;AAAA;AACvE,WAAA,EACF;AAAA,SAAA,EACF;AAAA,OAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,oBAEA9B,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,MAAA;AAAA,QACT,SAAA,EAAU,+DAAA;AAAA,QACX,QAAA,EAAA;AAAA;AAAA;AAED,GAAA,EACF,CAAA;AAEJ;ACzRA,IAAM,kBAAkB,CAAC,qBAAA,EAAuB,SAAA,EAAW,SAAA,EAAW,WAAW,SAAS,CAAA;AASnF,SAAS,WAAA,GAAc;AAC5B,EAAA,MAAM,UAAU,oBAAA,EAAqB;AACrC,EAAA,uBACEM,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EACZ,QAAA,EAAA;AAAA,IAAA,CAAC,OAAA,IACA,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,IAAG,EAAG,CAAC,CAAA,EAAG,CAAA,qBAC7BN,GAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QAEC,aAAA,EAAW,IAAA;AAAA,QACX,SAAA,EAAU,mDAAA;AAAA,QACV,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,CAAA,EAAI,CAAA,GAAI,GAAA,GAAO,GAAG,CAAA,CAAA,CAAA;AAAA,UACxB,GAAA,EAAK,MAAA;AAAA,UACL,eAAA,EAAiB,eAAA,CAAgB,CAAA,GAAI,eAAA,CAAgB,MAAM,CAAA;AAAA,UAC3D,cAAA,EAAgB,CAAA,EAAG,GAAA,GAAO,CAAA,GAAI,IAAK,EAAE,CAAA,EAAA;AAAA;AACvC,OAAA;AAAA,MARK;AAAA,KAUR,CAAA;AAAA,oBACHA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAW,gDAAgD,OAAA,GAAU,EAAA,GAAK,gBAAgB,CAAA,CAAA,EAAI,CAAA;AAAA,oBACpGA,IAAC,KAAA,EAAA,EAAI,OAAA,EAAQ,aAAY,SAAA,EAAU,oCAAA,EAAqC,aAAA,EAAW,IAAA,EACjF,QAAA,kBAAAA,GAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,CAAA,EAAE,sBAAA;AAAA,QACF,IAAA,EAAK,MAAA;AAAA,QACL,MAAA,EAAO,gBAAA;AAAA,QACP,WAAA,EAAY,GAAA;AAAA,QACZ,aAAA,EAAc,OAAA;AAAA,QACd,cAAA,EAAe,OAAA;AAAA,QACf,eAAA,EAAgB,IAAA;AAAA,QAChB,SAAA,EAAW,UAAU,EAAA,GAAK;AAAA;AAAA,KAC5B,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;ACaA,IAAM,cAAA,GAA6E;AAAA,EACjF,GAAA,EAAa,EAAE,KAAA,EAAO,KAAA,EAAwB,MAAM,8DAAA,EAAyD;AAAA,EAC7G,WAAA,EAAa,EAAE,KAAA,EAAO,yBAAA,EAAwB,MAAM,uBAAA,EAAwB;AAAA,EAC5E,UAAA,EAAa,EAAE,KAAA,EAAO,wBAAA,EAAwB,MAAM,uBAAA,EAAwB;AAAA,EAC5E,MAAA,EAAa,EAAE,KAAA,EAAO,QAAA,EAAwB,MAAM,gDAAA,EAAwC;AAAA,EAC5F,IAAA,EAAa,EAAE,KAAA,EAAO,UAAA,EAAwB,MAAM,sBAAA,EAAuB;AAAA,EAC3E,KAAA,EAAa,EAAE,KAAA,EAAO,qBAAA,EAAwB,MAAM,kDAAA;AACtD,CAAA;AASA,SAAS,kBAAkB,GAAA,EAAsB;AAC/C,EAAA,MAAM,OAAA,GAAU,aAAa,GAAG,CAAA;AAChC,EAAA,IAAI,+DAAA,CAAgE,IAAA,CAAK,OAAO,CAAA,EAAG;AACjF,IAAA,OAAO,qFAAA;AAAA,EACT;AACA,EAAA,IAAI,oCAAA,CAAqC,IAAA,CAAK,OAAO,CAAA,EAAG;AACtD,IAAA,OAAO,2EAAA;AAAA,EACT;AACA,EAAA,IAAI,qCAAA,CAAsC,IAAA,CAAK,OAAO,CAAA,EAAG;AACvD,IAAA,OAAO,6DAAA;AAAA,EACT;AACA,EAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,oBAAA,EAAsB,EAAE,CAAA,IAAK,2CAAA;AACtD;AAEA,SAAS,KAAA,CACP,KAAA,EACA,MAAA,EACA,KAAA,EACA,UACA,KAAA,EACA;AACA,EAAA,uBACEM,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,OAAA,EACf,QAAA,EAAA;AAAA,oBAAAN,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAW,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,oBACjCA,GAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,aAAA,EAAa,MAAA;AAAA,QACb,YAAA,EAAY,KAAA;AAAA,QACZ,KAAA;AAAA,QACA,UAAU,CAAC,KAAA,KAAU,QAAA,CAAS,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,QAChD,SAAA,EAAU,4IAAA;AAAA,QACT,GAAG;AAAA;AAAA;AACN,GAAA,EACF,CAAA;AAEJ;AAEO,SAAS,YAAA,GAAe;AAC7B,EAAA,MAAM,SAAS,mBAAA,EAAoB;AACnC,EAAA,MAAM,OAAO,YAAA,EAAa;AAC1B,EAAA,MAAM,UAAU,eAAA,EAAgB;AAChC,EAAA,MAAM,WAAW,gBAAA,EAAiB;AAClC,EAAA,MAAMgC,oBAAmB,oBAAA,EAAqB;AAC9C,EAAA,iBAAA,CAAkB,EAAE,KAAA,EAAO,CAAA,gBAAA,EAAc,MAAA,CAAO,IAAI,IAAI,CAAA;AAExD,EAAA,MAAM,cAAA,GAAiB,OAAO,QAAA,CAAS,OAAA;AAcvC,EAAA,MAAM,SAAS,MAAA,CAAO,MAAA;AACtB,EAAA,MAAM,eAAA,GAAkB,QAAQ,aAAA,KAAkB,KAAA;AAClD,EAAA,MAAM,WAAA,GAAc,MAAA,EAAQ,cAAA,IAAkB,EAAC;AAW/C,EAAA,MAAM,kBAAkB,MAAA,CAAO,QAAA,CAAS,SAAS,SAAA,IAAa,CAAC,CAAC,MAAA,EAAQ,eAAA;AAUxE,EAAA,MAAM,KAAA,GAAQ,CAAC,GAAA,KACb,GAAA,KAAQ,UAAA,GACJ,eAAA,IAAmB,WAAA,CAAY,QAAA,EAAU,OAAA,KAAY,IAAA,GACrD,WAAA,CAAY,GAAG,GAAG,OAAA,KAAY,KAAA;AACpC,EAAA,MAAM,QAAA,GAAW,CAAC,GAAA,KAChB,GAAA,KAAQ,aACJ,eAAA,IAAoB,WAAA,CAAY,QAAA,EAAU,OAAA,KAAY,IAAA,IAAQ,WAAA,CAAY,UAAU,QAAA,KAAa,IAAA,GACjG,YAAY,GAAG,CAAA,EAAG,YAAY,KAAA,IAAS,WAAA,CAAY,GAAG,CAAA,EAAG,QAAA,KAAa,IAAA;AAE5E,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAI9B,SAAS,KAAK,CAAA;AAChE,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIA,QAAAA,CAA4B,EAAE,CAAA;AAE1E,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAIA,SAAS,KAAK,CAAA;AAG9D,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,SAAsB,KAAK,CAAA;AACjE,EAAA,MAAM,CAAC,eAAe,gBAAgB,CAAA,GAAIA,SAA4B,cAAA,CAAe,CAAC,KAAK,KAAK,CAAA;AAChG,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,QAAAA,CAAuB;AAAA,IAC7C,KAAA,EAAO,QAAQ,KAAA,IAAS,EAAA;AAAA,IACxB,IAAA,EAAM,QAAQ,IAAA,IAAQ,EAAA;AAAA,IACtB,KAAA,EAAO,EAAA;AAAA,IACP,QAAA,EAAU,EAAA;AAAA,IACV,MAAA,EAAQ,EAAA;AAAA,IACR,IAAA,EAAM,EAAA;AAAA,IACN,GAAA,EAAK,EAAA;AAAA,IACL,MAAA,EAAQ,EAAA;AAAA,IACR,UAAA,EAAY,EAAA;AAAA,IACZ,QAAA,EAAU,EAAA;AAAA,IACV,KAAA,EAAO;AAAA,GACR,CAAA;AASD,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,SAAuB,CAAC,CAAA;AAChD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAClE,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAwB,IAAI,CAAA;AACtD,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,SAAS,EAAE,CAAA;AACnD,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIA,SAAwB,IAAI,CAAA;AACtE,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAC1E,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAIA,SAAS,KAAK,CAAA;AAC9D,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,SAAS,KAAK,CAAA;AAClD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAAS,KAAK,CAAA;AAQ5C,EAAA,MAAM,OAAA,GAAUH,MAAAA,CAAM,MAAA,CAAO,KAAK,CAAA;AAClC,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIG,SAAqD,MAAM,CAAA;AAE7F,EAAA,MAAM,QAAA,GAAW,eAAe,IAAI,CAAA;AACpC,EAAA,MAAM,aAAA,GAAgB,oBAAoB,IAAI,CAAA;AAC9C,EAAA,MAAM,QAAA,GAAW,cAAA,CAAe,IAAA,EAAM,MAAM,CAAA;AAC5C,EAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,IAAA,EAAM,MAAM,CAAA;AAEtC,EAAA,MAAM,mBAAA,GAAsB,EAAE,QAAA,EAAU,KAAA,EAAM;AAe9C,EAAA,MAAM,oBAAA,GAAuBH,MAAAA,CAAM,OAAA,CAAQ,OAAO;AAAA,IAChD,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,MAC/B,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,SAAA,EAAW,KAAK,SAAA,IAAa,IAAA;AAAA,MAC7B,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,YAAA,EAAc,KAAK,YAAA,IAAgB;AAAA,KACrC,CAAE,CAAA;AAAA,IACF,QAAA,EAAU,EAAE,IAAA,EAAM,IAAA,CAAK,IAAA,CAAK,IAAA,EAAK,EAAG,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,IAAA,EAAK,EAAE;AAAA,IAC7D,eAAA,EAAiB;AAAA,MACf,UAAA,EAAY,IAAA,CAAK,GAAA,CAAI,IAAA,EAAK;AAAA,MAC1B,MAAA,EAAQ,IAAA,CAAK,MAAA,CAAO,IAAA,EAAK;AAAA,MACzB,MAAA,EAAQ,IAAA,CAAK,MAAA,CAAO,IAAA,EAAK,IAAK,MAAA;AAAA,MAC9B,UAAA,EAAY,IAAA,CAAK,UAAA,CAAW,IAAA,EAAK,IAAK,MAAA;AAAA,MACtC,QAAA,EAAU,IAAA,CAAK,QAAA,CAAS,IAAA,EAAK,IAAK,MAAA;AAAA,MAClC,IAAA,EAAM,IAAA,CAAK,IAAA,CAAK,IAAA,EAAK;AAAA,MACrB,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,WAAA,EAAY;AAAA,MACrC,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,IAAA,EAAK,IAAK,MAAA;AAAA,MAC5B,QAAA,EAAU,cAAA,CAAe,IAAA,CAAK,QAAQ,CAAA,IAAK;AAAA,KAC7C;AAAA,IACA,YAAA,EAAc,KAAK,YAAA,IAAgB,IAAA;AAAA,IACnC,aAAA;AAAA;AAAA;AAAA;AAAA,IAIA,QAAA,EAAU,QAAQ,eAAA,IAAmB;AAAA;AAAA,GAEvC,CAAA,EAAI,CAAC,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,cAAc,IAAA,EAAM,aAAA,EAAe,MAAA,EAAQ,eAAe,CAAC,CAAA;AAejF,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIG,SAAS,KAAK,CAAA;AAC5D,EAAA,MAAM,aAAA,GACJ,aAAA,KAAkB,KAAA,IACf,CAAC,eAAA,KAKA,CAAC,MAAA,EAAQ,eAAA,IAAmB,oBAAA,CAAqB,MAAA,CAAO,eAAe,CAAA,CAAA;AAC7E,EAAA,MAAM,KAAA,GAAQ,CAAC,KAAA,KAAkB,WAAA,CAAY,OAAO,MAAA,CAAO,QAAA,EAAU,OAAO,MAAM,CAAA;AAElF,EAAAJ,UAAU,MAAM;AAId,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,MAAA,KAAW,CAAA,IAAK,CAAC,WAAA,IAAe,CAAC,OAAA,CAAQ,OAAA,EAAS,UAAA,CAAW,MAAA,CAAO,WAAW,CAAA;AAAA,EAChG,CAAA,EAAG,CAAC,IAAA,CAAK,KAAA,CAAM,QAAQ,MAAA,CAAO,WAAA,EAAa,WAAW,CAAC,CAAA;AAWvD,EAAA,MAAM,GAAA,GAAM,CAAC,GAAA,KAA4B,CAAC,KAAA,KAAkB;AAC1D,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,OAAA,CAAQ,CAAC,aAAa,EAAE,GAAG,SAAS,CAAC,GAAG,GAAG,KAAA,EAAM,CAAE,CAAA;AAAA,EACrD,CAAA;AAWA,EAAA,eAAe,OAAO,KAAA,EAAe;AACnC,IAAA,MAAM,MAAA,GAAS8B,iBAAiB,KAAK,CAAA;AACrC,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,OAAA,CAAQ,CAAC,OAAA,MAAa,EAAE,GAAG,OAAA,EAAS,GAAA,EAAK,QAAO,CAAE,CAAA;AAClD,IAAA,IAAIK,mBAAAA,CAAoB,MAAM,CAAA,CAAE,MAAA,KAAW,CAAA,EAAG;AAC5C,MAAA,YAAA,CAAa,MAAM,CAAA;AACnB,MAAA;AAAA,IACF;AACA,IAAA,YAAA,CAAa,SAAS,CAAA;AAQtB,IAAA,KAAK,QAAA,CAAS,OAAA,CAAQ,MAAA,EAAQ,QAAQ,CAAA;AACtC,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,MAAMC,gBAAAA,CAAiB,MAAM,CAAA;AAC3C,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,YAAA,CAAa,WAAW,CAAA;AACxB,QAAA;AAAA,MACF;AACA,MAAA,YAAA,CAAa,OAAO,CAAA;AACpB,MAAA,OAAA,CAAQ,CAAC,OAAA,MAAa;AAAA,QACpB,GAAG,OAAA;AAAA,QACH,MAAA,EAAQ,KAAA,CAAM,MAAA,IAAU,OAAA,CAAQ,MAAA;AAAA,QAChC,QAAA,EAAU,KAAA,CAAM,QAAA,IAAY,OAAA,CAAQ,QAAA;AAAA,QACpC,MAAM,KAAA,CAAM,IAAA;AAAA,QACZ,OAAO,KAAA,CAAM;AAAA,OACf,CAAE,CAAA;AAAA,IACJ,CAAA,CAAA,MAAQ;AAEN,MAAA,YAAA,CAAa,MAAM,CAAA;AAAA,IACrB;AAAA,EACF;AAEA,EAAA,eAAe,iBAAA,GAAoB;AACjC,IAAA,mBAAA,CAAoB,IAAI,CAAA;AACxB,IAAA,gBAAA,CAAiB,IAAI,CAAA;AACrB,IAAA,kBAAA,CAAmB,IAAI,CAAA;AACvB,IAAA,IAAI;AACF,MAAA,MAAM,WAAA,GAAc,YAAA,CAAa,IAAA,EAAK,CAAE,WAAA,EAAY;AACpD,MAAA,MAAM,MAAA,GAAS,MAAMF,iBAAAA,CAAiB,YAAY,CAAA;AAClD,MAAA,IAAI,OAAO,KAAA,EAAO;AAChB,QAAA,IAAA,CAAK,aAAA,CAAc,WAAA,EAAa,MAAA,CAAO,OAAO,CAAA;AAC9C,QAAA,eAAA,CAAgB,WAAW,CAAA;AAC3B,QAAA,kBAAA,CAAmB,CAAA,EAAG,WAAW,CAAA,WAAA,EAAc,MAAA,CAAO,OAAO,CAAA,cAAA,CAAgB,CAAA;AAC7E,QAAA,KAAA,CAAM,QAAQ,iBAAA,EAAmB,CAAA,EAAG,WAAW,CAAA,QAAA,EAAM,MAAA,CAAO,OAAO,CAAA,aAAA,CAAe,CAAA;AAAA,MACpF,CAAA,MAAO;AACL,QAAA,gBAAA,CAAiB,MAAA,CAAO,WAAW,oBAAiB,CAAA;AACpD,QAAA,KAAA,CAAM,KAAA,CAAM,mBAAA,EAAkB,MAAA,CAAO,OAAA,IAAW,0CAAuC,CAAA;AAAA,MACzF;AAAA,IACF,CAAA,SAAE;AACA,MAAA,mBAAA,CAAoB,KAAK,CAAA;AAAA,IAC3B;AAAA,EACF;AAEA,EAAA,SAAS,iBAAA,GAAoB;AAC3B,IAAA,IAAA,CAAK,aAAA,EAAc;AACnB,IAAA,eAAA,CAAgB,EAAE,CAAA;AAClB,IAAA,kBAAA,CAAmB,IAAI,CAAA;AACvB,IAAA,gBAAA,CAAiB,IAAI,CAAA;AAAA,EACvB;AAKA,EAAAlC,UAAU,MAAM;AACd,IAAA,MAAM,aAAa,OAAA,CAAQ,UAAA;AAC3B,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,iBAAA,CAAkB,EAAE,CAAA;AACpB,MAAA,cAAA,CAAe,KAAK,CAAA;AACpB,MAAA,mBAAA,CAAoB,KAAK,CAAA;AACzB,MAAA;AAAA,IACF;AACA,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,MAAM,WAAWJ,eAAAA,EAAgB;AAGjC,IAAA,MAAM,aAAA,GAAgB,QAAA,CAAS,qBAAA,EAAuB,IAAA,CAAK,QAAQ,CAAA;AACnE,IAAA,IAAI,CAAC,aAAA,EAAe;AAClB,MAAA,mBAAA,CAAoB,KAAK,CAAA;AACzB,MAAA;AAAA,IACF;AACA,IAAA,mBAAA,CAAoB,IAAI,CAAA;AACxB,IAAA,KAAK,aAAA,CAAc,UAAU,CAAA,CAC1B,IAAA,CAAK,CAAC,SAAA,KAAc;AACnB,MAAA,IAAI,SAAA,IAAa,SAAA,CAAU,MAAA,KAAW,CAAA,EAAG;AACzC,MAAA,iBAAA,CAAkB,SAAS,CAAA;AAC3B,MAAA,iBAAA,CAAkB,SAAA,CAAU,CAAC,CAAE,CAAA;AAAA,IACjC,CAAC,CAAA,CACA,KAAA,CAAM,MAAM;AAAA,IAAC,CAAC,CAAA,CACd,OAAA,CAAQ,MAAM;AACb,MAAA,IAAI,CAAC,SAAA,EAAW,mBAAA,CAAoB,KAAK,CAAA;AAAA,IAC3C,CAAC,CAAA;AACH,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AAAA,IACd,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,CAAQ,UAAU,CAAC,CAAA;AAWvB,EAAAI,UAAU,MAAM;AACd,IAAA,IAAI,gBAAgB,KAAA,EAAO;AAC3B,IAAA,MAAM,SAAS,QAAA,CAAS,OAAA;AACxB,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,OAAA,CAAQ,CAAC,OAAA,KAAY;AACnB,MAAA,IAAI,OAAA,CAAQ,IAAI,IAAA,EAAK,IAAK,QAAQ,MAAA,CAAO,IAAA,IAAQ,OAAO,OAAA;AACxD,MAAA,OAAO;AAAA,QACL,GAAG,OAAA;AAAA,QACH,GAAA,EAAK8B,gBAAAA,CAAiB,MAAA,CAAO,UAAU,CAAA;AAAA,QACvC,QAAQ,MAAA,CAAO,MAAA;AAAA,QACf,UAAU,MAAA,CAAO,QAAA;AAAA,QACjB,MAAM,MAAA,CAAO,IAAA;AAAA,QACb,OAAO,MAAA,CAAO;AAAA,OAChB;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,QAAA,CAAS,OAAA,EAAS,WAAW,CAAC,CAAA;AAElC,EAAA,SAAS,kBAAkB,OAAA,EAA0B;AACnD,IAAA,cAAA,CAAe,OAAO,CAAA;AACtB,IAAA,oBAAA,CAAqB,QAAQ,EAAE,CAAA;AAC/B,IAAA,OAAA,CAAQ,CAAC,OAAA,MAAa;AAAA,MACpB,GAAG,OAAA;AAAA,MACH,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,KAAK,OAAA,CAAQ,UAAA;AAAA,MACb,MAAA,EAAQ,QAAQ,MAAA,IAAU,EAAA;AAAA,MAC1B,UAAA,EAAY,QAAQ,UAAA,IAAc,EAAA;AAAA,MAClC,QAAA,EAAU,QAAQ,QAAA,IAAY,EAAA;AAAA,MAC9B,OAAO,OAAA,CAAQ,KAAA;AAAA;AAAA;AAAA;AAAA,MAIf,KAAA,EAAO,OAAA,CAAQ,KAAA,IAAS,OAAA,CAAQ;AAAA,KAClC,CAAE,CAAA;AAAA,EACJ;AAEA,EAAA,SAAS,cAAc,SAAA,EAAmB;AACxC,IAAA,MAAM,UAAU,cAAA,CAAe,IAAA,CAAK,CAAC,IAAA,KAAS,IAAA,CAAK,OAAO,SAAS,CAAA;AACnE,IAAA,IAAI,OAAA,oBAA2B,OAAO,CAAA;AAAA,EACxC;AAEA,EAAA,SAAS,aAAA,GAAgB;AACvB,IAAA,cAAA,CAAe,KAAK,CAAA;AACpB,IAAA,oBAAA,CAAqB,KAAK,CAAA;AAC1B,IAAA,OAAA,CAAQ,CAAC,OAAA,MAAa,EAAE,GAAG,OAAA,EAAS,MAAA,EAAQ,IAAI,IAAA,EAAM,EAAA,EAAI,KAAK,EAAA,EAAI,MAAA,EAAQ,IAAI,UAAA,EAAY,EAAA,EAAI,UAAU,EAAA,EAAI,KAAA,EAAO,IAAG,CAAE,CAAA;AAAA,EAC3H;AAWA,EAAA,SAAS,IAAA,CAAK,SAAiB,MAAA,EAAwB;AACrD,IAAA,QAAA,CAAS,OAAO,CAAA;AAChB,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAMT,MAAAA,GAAQ,QAAA,CAAS,aAAA,CAA2B,CAAA,cAAA,EAAiB,MAAM,CAAA,EAAA,CAAI,CAAA;AAC7E,MAAAA,MAAAA,EAAO,cAAA,CAAe,EAAE,KAAA,EAAO,QAAA,EAAU,UAAU,oBAAA,EAAqB,GAAI,MAAA,GAAS,QAAA,EAAU,CAAA;AAC/F,MAAAA,MAAAA,EAAO,KAAA,CAAM,EAAE,aAAA,EAAe,MAAM,CAAA;AAAA,IACtC;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAUA,EAAA,SAAS,eAAA,GAA2B;AAClC,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,IAAI,eAAA,IAAmB,CAAC,OAAA,CAAQ,UAAA,EAAY;AAC1C,MAAA,aAAA,CAAc,IAAI,CAAA;AAClB,MAAA,OAAO,KAAK,wEAAwE,CAAA;AAAA,IACtF;AACA,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,CAAM,IAAA,EAAK,IAAK,CAAC,WAAA,CAAY,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA,EAAG;AACvD,MAAA,OAAO,IAAA,CAAK,8BAAA,EAA6B,GAAA,CAAI,aAAa,CAAA;AAAA,IAC5D;AACA,IAAA,IAAI,CAAC,KAAK,IAAA,CAAK,IAAA,IAAQ,OAAO,IAAA,CAAK,4BAAA,EAA8B,GAAA,CAAI,YAAY,CAAA;AACjF,IAAA,IAAI,SAAS,OAAO,CAAA,IAAK,CAAC,IAAA,CAAK,KAAA,CAAM,MAAK,EAAG;AAC3C,MAAA,OAAO,IAAA,CAAK,mCAAmC,gBAAgB,CAAA;AAAA,IACjE;AACA,IAAA,IAAI,SAAS,UAAU,CAAA,IAAK,CAAC,eAAA,CAAgB,IAAA,CAAK,QAAQ,CAAA,EAAG;AAC3D,MAAA,OAAO,IAAA;AAAA,QACL,IAAA,CAAK,QAAA,CAAS,IAAA,EAAK,GAAI,uDAAA,GAA+C,qCAAA;AAAA,QACtE,GAAA,CAAI;AAAA,OACN;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,SAAS,gBAAA,GAA4B;AACnC,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,IAAI,CAAC,sBAAA,CAAuB,IAAI,CAAA,EAAG,OAAO,IAAA;AAC1C,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,MAAK,IAAK,CAAC,KAAK,IAAA,CAAK,IAAA,MAAU,CAAC,IAAA,CAAK,IAAI,IAAA,EAAK,IAAK,CAAC,IAAA,CAAK,QAAA,CAAS,MAAK,EAAG;AACzF,MAAA,OAAO,IAAA,CAAK,iDAAA,EAAgD,GAAA,CAAI,cAAc,CAAA;AAAA,IAChF;AACA,IAAA,IAAI,CAAC,KAAK,MAAA,CAAO,IAAA,IAAQ,OAAO,IAAA,CAAK,qCAA+B,iBAAiB,CAAA;AACrF,IAAA,IAAI,SAAS,YAAY,CAAA,IAAK,CAAC,IAAA,CAAK,UAAA,CAAW,MAAK,EAAG;AACrD,MAAA,OAAO,IAAA,CAAK,wCAAwC,qBAAqB,CAAA;AAAA,IAC3E;AACA,IAAA,IAAI,CAAC,eAAA,CAAgB,IAAA,CAAK,KAAK,KAAA,CAAM,IAAA,EAAM,CAAA,EAAG;AAC5C,MAAA,OAAO,IAAA,CAAK,2CAA2C,gBAAgB,CAAA;AAAA,IACzE;AACA,IAAA,IACE,QAAA,CAAS,WAAW,UAAA,IACjB,QAAA,CAAS,eAAec,mBAAAA,CAAoB,IAAA,CAAK,GAAG,CAAA,EACvD;AACA,MAAA,OAAO,IAAA;AAAA,QACL,QAAA,CAAS,cACL,0DAAA,GACA,6DAAA;AAAA,QACJ,GAAA,CAAI;AAAA,OACN;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,SAAS,SAAS,IAAA,EAAoB;AACpC,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,OAAA,CAAQ,IAAI,CAAA;AAEZ,IAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,MAAA,CAAO,QAAA,CAAS,EAAE,GAAA,EAAK,CAAA,EAAG,QAAA,EAAU,QAAA,EAAU,CAAA;AAAA,EACnF;AAEA,EAAA,SAAS,OAAA,GAAU;AACjB,IAAA,IAAI,IAAA,KAAS,CAAA,IAAK,eAAA,EAAgB,WAAY,CAAC,CAAA;AAAA,SAAA,IACtC,IAAA,KAAS,CAAA,IAAK,gBAAA,EAAiB,WAAY,CAAC,CAAA;AAAA,EACvD;AAUA,EAAA,eAAe,oBAAA,GAAuB;AACpC,IAAA,IAAI,CAAC,UAAS,EAAG;AACjB,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,KAAA,EAAO,UAAA,EAAW,GAAI,MAAM,oBAAA,CAAqB;AAAA,QACvD,MAAA;AAAA,QACA,IAAA;AAAA,QACA,OAAA;AAAA,QACA,UAAU,EAAE,KAAA,EAAO,KAAK,KAAA,EAAO,IAAA,EAAM,KAAK,IAAA,EAAK;AAAA,QAC/C,OAAA,EAAS,EAAE,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAQ,MAAM,IAAA,CAAK,IAAA,EAAM,GAAA,EAAK,IAAA,CAAK,GAAA,EAAI;AAAA,QAC/D,eAAA,EAAiB;AAAA,UACf,UAAA,EAAY,IAAA,CAAK,GAAA,CAAI,IAAA,EAAK;AAAA,UAC1B,MAAA,EAAQ,IAAA,CAAK,MAAA,CAAO,IAAA,EAAK;AAAA,UACzB,MAAA,EAAQ,IAAA,CAAK,MAAA,CAAO,IAAA,EAAK,IAAK,KAAA,CAAA;AAAA,UAC9B,UAAA,EAAY,IAAA,CAAK,UAAA,CAAW,IAAA,EAAK,IAAK,KAAA,CAAA;AAAA,UACtC,QAAA,EAAU,IAAA,CAAK,QAAA,CAAS,IAAA,EAAK,IAAK,KAAA,CAAA;AAAA,UAClC,IAAA,EAAM,IAAA,CAAK,IAAA,CAAK,IAAA,EAAK;AAAA,UACrB,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,WAAA,EAAY;AAAA,UACrC,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,IAAA,EAAK,IAAK,KAAA,CAAA;AAAA;AAAA;AAAA;AAAA,UAI5B,QAAA,EAAU,cAAA,CAAe,IAAA,CAAK,QAAQ,CAAA,IAAK,KAAA;AAAA,SAC7C;AAAA,QACA;AAAA,OACD,CAAA;AAID,MAAA,IAAI,UAAA,EAAY,OAAA,CAAQ,UAAA,CAAW,EAAE,UAAA,EAAY,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,CAAA;AACrF,MAAA,OAAA,CAAQ,OAAA,GAAU,IAAA;AAClB,MAAA,IAAA,CAAK,KAAA,EAAM;AACX,MAAA,UAAA,CAAW,CAAA,OAAA,EAAU,KAAA,CAAM,EAAE,CAAA,CAAE,CAAA;AAAA,IACjC,SAAS,GAAA,EAAK;AACZ,MAAA,QAAA,CAAS,iBAAA,CAAkB,GAAG,CAAC,CAAA;AAC/B,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB;AAAA,EACF;AAEA,EAAA,SAAS,QAAA,GAAoB;AAC3B,IAAA,QAAA,CAAS,IAAI,CAAA;AAGb,IAAA,IAAI,eAAA,IAAmB,CAAC,OAAA,CAAQ,UAAA,EAAY;AAC1C,MAAA,aAAA,CAAc,IAAI,CAAA;AAClB,MAAA,OAAO,KAAK,wEAAwE,CAAA;AAAA,IACtF;AACA,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,CAAM,IAAA,EAAK,IAAK,CAAC,WAAA,CAAY,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA,EAAG;AACvD,MAAA,OAAO,IAAA,CAAK,8BAAA,EAA6B,GAAA,CAAI,aAAa,CAAA;AAAA,IAC5D;AACA,IAAA,IAAI,SAAS,OAAO,CAAA,IAAK,CAAC,IAAA,CAAK,KAAA,CAAM,MAAK,EAAG;AAC3C,MAAA,OAAO,IAAA,CAAK,mCAAmC,gBAAgB,CAAA;AAAA,IACjE;AACA,IAAA,IAAI,CAAC,IAAA,CAAK,IAAA,CAAK,IAAA,EAAK,EAAG;AACrB,MAAA,OAAO,IAAA,CAAK,4BAAA,EAA8B,GAAA,CAAI,YAAY,CAAA;AAAA,IAC5D;AAIA,IAAA,IAAI,SAAS,UAAU,CAAA,IAAK,CAAC,eAAA,CAAgB,IAAA,CAAK,QAAQ,CAAA,EAAG;AAC3D,MAAA,OAAO,IAAA;AAAA,QACL,IAAA,CAAK,QAAA,CAAS,IAAA,EAAK,GACf,uDAAA,GACA,qCAAA;AAAA,QACJ,GAAA,CAAI;AAAA,OACN;AAAA,IACF;AAGA,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,MAAK,IAAK,CAAC,KAAK,IAAA,CAAK,IAAA,MAAU,CAAC,IAAA,CAAK,IAAI,IAAA,EAAK,IAAK,CAAC,IAAA,CAAK,QAAA,CAAS,MAAK,EAAG;AACzF,MAAA,OAAO,IAAA,CAAK,iDAAA,EAAgD,GAAA,CAAI,cAAc,CAAA;AAAA,IAChF;AAIA,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,IAAA,EAAK,EAAG;AACvB,MAAA,OAAO,IAAA,CAAK,qCAA+B,iBAAiB,CAAA;AAAA,IAC9D;AACA,IAAA,IAAI,SAAS,YAAY,CAAA,IAAK,CAAC,IAAA,CAAK,UAAA,CAAW,MAAK,EAAG;AACrD,MAAA,OAAO,IAAA,CAAK,wCAAwC,qBAAqB,CAAA;AAAA,IAC3E;AAGA,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,IAAA,EAAK,CAAE,WAAW,CAAA,EAAG;AAClC,MAAA,OAAO,IAAA,CAAK,2CAA2C,gBAAgB,CAAA;AAAA,IACzE;AAOA,IAAA,IACE,sBAAA,CAAuB,IAAI,CAAA,IAC3B,QAAA,CAAS,MAAA,KAAW,UAAA,IACpB,QAAA,CAAS,UAAA,KAAeA,mBAAAA,CAAoB,IAAA,CAAK,GAAG,CAAA,EACpD;AAIA,MAAA,OAAO,IAAA;AAAA,QACL,QAAA,CAAS,cACL,0DAAA,GACA,6DAAA;AAAA,QACJ,GAAA,CAAI;AAAA,OACN;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,uBACE3B,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4BAAA,EACd,QAAA,EAAA;AAAA,oBAAAN,IAAC,IAAA,EAAA,EAAK,IAAA,EAAK,YAAW,IAAA,EAAK,YAAA,EAAa,SAAS,mBAAA,EAAqB,CAAA;AAAA,IACrE,UAAA,IAAc,CAAC,OAAA,CAAQ,KAAA,oBACtBA,GAAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACC,cAAc,IAAA,CAAK,KAAA;AAAA,QACnB,OAAA,EAAS,MAAM,aAAA,CAAc,KAAK,CAAA;AAAA,QAClC,YAAY,CAAC,MAAA,KACX,QAAQ,CAAC,OAAA,MAAa,EAAE,GAAG,OAAA,EAAS,OAAO,MAAA,CAAO,KAAA,IAAS,QAAQ,KAAA,EAAO,IAAA,EAAM,OAAO,IAAA,IAAQ,OAAA,CAAQ,MAAK,CAAE;AAAA;AAAA,KAElH;AAAA,oBAEFA,IAAC,QAAA,EAAA,EAAO,SAAA,EAAU,0BAChB,QAAA,kBAAAM,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6EAAA,EACb,QAAA,EAAA;AAAA,sBAAAN,IAAC,IAAA,EAAA,EAAK,EAAA,EAAI,OAAO,WAAA,EAAa,SAAA,EAAU,uDAAsD,QAAA,EAAA,kBAAA,EAE9F,CAAA;AAAA,sBACAM,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EACb,QAAA,EAAA;AAAA,wBAAAN,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gDAAgD,QAAA,EAAA,MAAA,CAAO,IAAA,IAAQ,OAAO,IAAA,EAAK,CAAA;AAAA,wBAC1FM,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2EAAA,EACb,QAAA,EAAA;AAAA,0BAAAN,GAAAA,CAACmC,IAAAA,EAAA,EAAK,SAAA,EAAU,aAAA,EAAc,CAAA;AAAA,UAAE;AAAA,SAAA,EAElC;AAAA,OAAA,EACF,CAAA;AAAA,sBACAnC,GAAAA,CAAC,GAAA,EAAA,EAAE,MAAK,4BAAA,EAA6B,SAAA,EAAU,uDAAsD,QAAA,EAAA,OAAA,EAErG;AAAA,KAAA,EACF,CAAA,EACF,CAAA;AAAA,oBAEAM,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mFAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAU,wBAAA,EACjB,QAAA,EAAA;AAAA,wBAAAN,GAAAA;AAAA,UAAC,aAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,IAAA;AAAA,YACT,YAAY,IAAA,KAAS,CAAA,GAAI,SAAY,CAAC,MAAA,KAAW,SAAS,MAAM;AAAA;AAAA,SAClE;AAAA,wBAKAM,IAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,WAAA;AAAA,YACV,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,cAAA,KAAA,CAAM,cAAA,EAAe;AACrB,cAAA,OAAA,EAAQ;AAAA,YACV,CAAA;AAAA,YAEC,QAAA,EAAA;AAAA,cAAA,IAAA,KAAS,CAAA,oBACVA,IAAAA,CAAC,SAAA,EAAA,EACC,QAAA,EAAA;AAAA,gCAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8CAAA,EACb,QAAA,EAAA;AAAA,kCAAAN,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,sCAAA,EAAuC,QAAA,EAAA,8BAAA,EAAsB,CAAA;AAAA,kBAC1E,QAAQ,KAAA,mBACPM,IAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,+BAAA,EAAgC,QAAA,EAAA;AAAA,oBAAA,iBAAA;AAAA,oBAAgB,OAAA,CAAQ;AAAA,mBAAA,EAAM,oBAE9EN,GAAAA;AAAA,oBAAC,QAAA;AAAA,oBAAA;AAAA,sBACC,IAAA,EAAK,QAAA;AAAA,sBACL,SAAS,MAAM,aAAA,CAAc,CAAC,KAAA,KAAU,CAAC,KAAK,CAAA;AAAA,sBAC9C,SAAA,EAAU,kDAAA;AAAA,sBACX,QAAA,EAAA;AAAA;AAAA;AAED,iBAAA,EAEJ,CAAA;AAAA,gCACAM,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACZ,QAAA,EAAA;AAAA,kBAAA,KAAA,CAAM,UAAU,GAAA,CAAI,aAAA,EAAe,KAAK,KAAA,EAAO,GAAA,CAAI,OAAO,CAAA,EAAG;AAAA,oBAC5D,IAAA,EAAM,OAAA;AAAA,oBACN,WAAA,EAAa;AAAA,mBACd,CAAA;AAAA,kBACA,KAAA,CAAM,iBAAiB,GAAA,CAAI,YAAA,EAAc,KAAK,IAAA,EAAM,GAAA,CAAI,MAAM,CAAA,EAAG;AAAA,oBAChE,WAAA,EAAa;AAAA,mBACd,CAAA;AAAA,kBACA,KAAA,CAAM,OAAO,CAAA,IAAK,KAAA,CAAM,UAAA,EAAY,kBAAkB,IAAA,CAAK,KAAA,EAAO,GAAA,CAAI,OAAO,CAAA,EAAG;AAAA,oBAC/E,IAAA,EAAM,KAAA;AAAA,oBACN,YAAA,EAAc,KAAA;AAAA,oBACd,WAAA,EAAa,QAAA,CAAS,OAAO,CAAA,GAAI,UAAA,GAAa;AAAA,mBAC/C,CAAA;AAAA,kBACA,KAAA,CAAM,UAAU,CAAA,IAAK,KAAA;AAAA,oBACpB,aAAA;AAAA,oBACA,GAAA,CAAI,gBAAA;AAAA,oBACJ,IAAA,CAAK,QAAA;AAAA,oBACL,CAAC,KAAA,KAAU;AACT,sBAAA,QAAA,CAAS,IAAI,CAAA;AACb,sBAAA,OAAA,CAAQ,CAAC,aAAa,EAAE,GAAG,SAAS,QAAA,EAAU,cAAA,CAAe,KAAK,CAAA,EAAE,CAAE,CAAA;AAAA,oBACxE,CAAA;AAAA,oBACA;AAAA;AAAA;AAAA,sBAGE,SAAA,EAAW,SAAA;AAAA,sBACX,YAAA,EAAc,KAAA;AAAA,sBACd,WAAA,EAAa,QAAA,CAAS,UAAU,CAAA,GAAI,aAAA,GAAgB;AAAA;AACtD;AACF,iBAAA,EACF,CAAA;AAAA,gBACC,eAAA,IAAmB,CAAC,OAAA,CAAQ,UAAA,oBAC3BA,IAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,yEAAA,EAA0E,QAAA,EAAA;AAAA,kBAAA,mDAAA;AAAA,kBACnC,GAAA;AAAA,kCAClDN,GAAAA;AAAA,oBAAC,QAAA;AAAA,oBAAA;AAAA,sBACC,IAAA,EAAK,QAAA;AAAA,sBACL,OAAA,EAAS,MAAM,aAAA,CAAc,IAAI,CAAA;AAAA,sBACjC,SAAA,EAAU,4CAAA;AAAA,sBACX,QAAA,EAAA;AAAA;AAAA;AAED,iBAAA,EACF;AAAA,eAAA,EAEJ,CAAA;AAAA,cAGC,IAAA,KAAS,CAAA,oBACVM,IAAAA,CAAC,SAAA,EAAA,EACC,QAAA,EAAA;AAAA,gCAAAN,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,2CAAA,EAA4C,QAAA,EAAA,wBAAA,EAAmB,CAAA;AAAA,gCAC7EM,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAA,EACZ,QAAA,EAAA;AAAA,kBAAA,gBAAA,IAAoB,cAAA,CAAe,WAAW,CAAA,oBAC7CN,IAAC,aAAA,EAAA,EAAc,KAAA,EAAM,qCAAiC,SAAA,EAAU,YAAA,EAC7D,WAAC,CAAA,EAAG,CAAC,EAAE,GAAA,CAAI,CAAC,wBACXM,IAAAA,CAAC,KAAA,EAAA,EAAc,SAAA,EAAU,uBAAA,EACvB,QAAA,EAAA;AAAA,oCAAAN,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,UAAA,EAAW,CAAA;AAAA,oCAC/BA,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,gBAAA,EAAiB,CAAA;AAAA,oCACrCA,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,kBAAA,EAAmB;AAAA,mBAAA,EAAA,EAH/B,GAIV,CACD,CAAA,EACH,CAAA;AAAA,kBAED,cAAA,CAAe,GAAA,CAAI,CAAC,OAAA,qBACnBA,GAAAA;AAAA,oBAAC,KAAA;AAAA,oBAAA;AAAA,sBAEC,WAAW,CAAA,0FAAA,EACT,iBAAA,KAAsB,OAAA,CAAQ,EAAA,GAAK,gCAAgC,6BACrE,CAAA,CAAA;AAAA,sBAEA,QAAA,kBAAAM,IAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,OAAA,EAAS,MAAM,aAAA,CAAc,OAAA,CAAQ,EAAE,CAAA,EAAG,SAAA,EAAU,wBAAA,EACxE,QAAA,EAAA;AAAA,wCAAAA,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uDAAA,EACb,QAAA,EAAA;AAAA,0BAAA,OAAA,CAAQ,KAAA;AAAA,0BACR,WAAA,KAAgB,OAAA,IAAW,iBAAA,KAAsB,OAAA,CAAQ,EAAA,oBACxDN,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2EAAA,EAA4E,QAAA,EAAA,aAAA,EAAW;AAAA,yBAAA,EAE3G,CAAA;AAAA,wCACAM,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kCAAA,EACb,QAAA,EAAA;AAAA,0BAAA,CAAC,OAAA,CAAQ,QAAQ,OAAA,CAAQ,MAAM,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAAA,0BAC1D,OAAA,CAAQ,UAAA,GAAa,CAAA,QAAA,EAAM,OAAA,CAAQ,UAAU,CAAA,CAAA,GAAK;AAAA,yBAAA,EACrD,CAAA;AAAA,wCACAA,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,6BAAA,EACb,QAAA,EAAA;AAAA,0BAAA,CAAC,OAAA,CAAQ,QAAA,EAAU,OAAA,CAAQ,IAAA,EAAM,OAAA,CAAQ,KAAK,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,QAAK,CAAA;AAAA,0BAAE,UAAA;AAAA,0BAAI,OAAA,CAAQ;AAAA,yBAAA,EAC3F;AAAA,uBAAA,EACF;AAAA,qBAAA;AAAA,oBAnBK,OAAA,CAAQ;AAAA,mBAqBhB,CAAA;AAAA,kCACDA,IAAAA;AAAA,oBAAC,QAAA;AAAA,oBAAA;AAAA,sBACC,IAAA,EAAK,QAAA;AAAA,sBACL,OAAA,EAAS,aAAA;AAAA,sBACT,SAAA,EAAW,CAAA,mFAAA,EACT,WAAA,KAAgB,KAAA,GAAQ,gCAAgC,2BAC1D,CAAA,CAAA;AAAA,sBAEA,QAAA,EAAA;AAAA,wCAAAN,GAAAA,CAAC,UAAK,SAAA,EAAU,kCAAA,EACb,yBAAe,MAAA,GAAS,CAAA,GAAI,iCAA8B,kCAAA,EAC7D,CAAA;AAAA,wCACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oCAAmC,QAAA,EAAA,8CAAA,EAAyC;AAAA;AAAA;AAAA;AAC9F,iBAAA,EACF,CAAA;AAAA,gBACC,gBAAgB,KAAA,oBACfM,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,YAAA,EAMb,QAAA,EAAA;AAAA,kCAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qDAAA,EACZ,QAAA,EAAA;AAAA,oBAAA,KAAA,CAAM,KAAA,EAAO,GAAA,CAAI,WAAA,EAAa,IAAA,CAAK,KAAK,MAAA,EAAQ;AAAA,sBAC/C,WAAA,EAAa,KAAA;AAAA,sBACb,SAAA,EAAW,SAAA;AAAA,sBACX,YAAA,EAAc;AAAA,qBACf,CAAA;AAAA,oBACA,SAAA,KAAc,4BACbA,IAAAA,CAAC,iBAAc,KAAA,EAAM,kCAAA,EAAgC,WAAU,mBAAA,EAC7D,QAAA,EAAA;AAAA,sCAAAN,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,YAAA,EAAa,CAAA;AAAA,sCACjCA,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,YAAA,EAAa;AAAA,qBAAA,EACnC,CAAA,mBAEAA,GAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,oCAAA,EACV,QAAA,EAAA,SAAA,KAAc,WAAA,GACX,kEAAA,GACA,yCAAA,EACN;AAAA,mBAAA,EAEJ,CAAA;AAAA,kBACC,KAAA,CAAM,aAAA,EAAY,GAAA,CAAI,cAAA,EAAgB,IAAA,CAAK,MAAA,EAAQ,GAAA,CAAI,QAAQ,CAAA,EAAG,EAAE,WAAA,EAAa,oBAAA,EAAiB,CAAA;AAAA,kCACnGM,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACZ,QAAA,EAAA;AAAA,oBAAA,KAAA,CAAM,WAAA,EAAU,iBAAA,EAAmB,IAAA,CAAK,MAAA,EAAQ,GAAA,CAAI,QAAQ,CAAA,EAAG,EAAE,WAAA,EAAa,WAAA,EAAU,CAAA;AAAA,oBACxF,KAAA,CAAM,YAAY,CAAA,IAAK,KAAA,CAAM,aAAA,EAAe,uBAAuB,IAAA,CAAK,UAAA,EAAY,GAAA,CAAI,YAAY,CAAA,EAAG;AAAA,sBACtG,WAAA,EAAa,QAAA,CAAS,YAAY,CAAA,GAAI,aAAA,GAAgB;AAAA,qBACvD;AAAA,mBAAA,EACH,CAAA;AAAA,kCACAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACZ,QAAA,EAAA;AAAA,oBAAA,KAAA,CAAM,QAAA,EAAU,mBAAA,EAAqB,IAAA,CAAK,QAAA,EAAU,GAAA,CAAI,UAAU,CAAA,EAAG,EAAE,WAAA,EAAa,QAAA,EAAU,CAAA;AAAA,oBAC9F,KAAA,CAAM,IAAA,EAAM,gBAAA,EAAkB,IAAA,CAAK,KAAA,EAAO,GAAA,CAAI,OAAO,CAAA,EAAG,EAAE,WAAA,EAAa,IAAA,EAAM;AAAA,mBAAA,EAChF,CAAA;AAAA,kBACC,KAAA,CAAM,QAAA,EAAU,GAAA,CAAI,YAAA,EAAc,IAAA,CAAK,IAAA,EAAM,GAAA,CAAI,MAAM,CAAA,EAAG,EAAE,WAAA,EAAa,QAAA,EAAU;AAAA,iBAAA,EACtF;AAAA,eAAA,EAEJ,CAAA;AAAA,cAKC,IAAA,KAAS,CAAA,IAAK,OAAA,oBACbA,KAAC,SAAA,EAAA,EACC,QAAA,EAAA;AAAA,gCAAAN,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,2CAAA,EAA4C,QAAA,EAAA,wBAAA,EAAsB,CAAA;AAAA,gCAChFM,IAAAA,CAAC,aAAA,EAAA,EAAc,KAAA,EAAM,oBAAA,EAAqB,WAAU,sCAAA,EAClD,QAAA,EAAA;AAAA,kCAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6DAAA,EACb,QAAA,EAAA;AAAA,oCAAAN,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,gCAAA,EAAiC,CAAA;AAAA,oCACrDM,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,sCAAAN,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,qBAAA,EAAsB,CAAA;AAAA,sCAC1CA,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,4BAAA,EAA6B,CAAA;AAAA,sCACjDA,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,eAAA,EAAgB;AAAA,qBAAA,EACtC;AAAA,mBAAA,EACF,CAAA;AAAA,kCACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oEACZ,QAAA,EAAA,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,EAAE,GAAA,CAAI,CAAC,MAAA,qBACdM,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,oCAAAN,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,UAAA,EAAW,CAAA;AAAA,oCAC/BA,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,eAAA,EAAgB;AAAA,mBAAA,EAAA,EAF5B,MAGV,CACD,CAAA,EACH,CAAA;AAAA,kCACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,gBAAA,EACZ,QAAA,EAAA,IAAA,CAAK,MAAM,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,IAAI,CAAC,IAAA,qBAC3BM,IAAAA,CAAC,KAAA,EAAA,EAAwC,WAAU,yBAAA,EACjD,QAAA,EAAA;AAAA,oCAAAN,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,sBAAA,EAAuB,CAAA;AAAA,oCAC3CA,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,cAAA,EAAe,CAAA;AAAA,oCACnCA,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,YAAA,EAAa;AAAA,mBAAA,EAAA,EAHzB,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,SAI9B,CACD,CAAA,EACH;AAAA,iBAAA,EACF,CAAA;AAAA,gCACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,kDAAiD,QAAA,EAAA,4EAAA,EAE9D;AAAA,eAAA,EACF,CAAA;AAAA,cAGD,SAAS,CAAA,IAAK,CAAC,OAAA,oBAChBM,KAAC,SAAA,EAAA,EACC,QAAA,EAAA;AAAA,gCAAAN,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,2CAAA,EAA4C,QAAA,EAAA,WAAA,EAAS,CAAA;AAAA,gCACnEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAA,EAAkB,IAAA,EAAK,YAAA,EAAa,YAAA,EAAW,oBAAA,EAC3D,QAAA,EAAA,cAAA,CAAe,GAAA,CAAI,CAAC,MAAA,KAAW;AAC9B,kBAAA,MAAM,IAAA,GAAO,eAAe,MAAM,CAAA;AAClC,kBAAA,MAAM,WAAW,aAAA,KAAkB,MAAA;AACnC,kBAAA;AAAA;AAAA;AAAA;AAAA,oCAIEM,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,sCAAAA,IAAAA;AAAA,wBAAC,QAAA;AAAA,wBAAA;AAAA,0BACC,IAAA,EAAK,QAAA;AAAA,0BACL,IAAA,EAAK,OAAA;AAAA,0BACL,cAAA,EAAc,QAAA;AAAA,0BACd,aAAA,EAAa,oBAAoB,MAAM,CAAA,CAAA;AAAA,0BACvC,OAAA,EAAS,MAAM,gBAAA,CAAiB,MAAM,CAAA;AAAA,0BACtC,SAAA,EAAW,CAAA,4EAAA,EACT,QAAA,GAAW,6BAAA,GAAgC,6BAC7C,CAAA,CAAA;AAAA,0BAEA,QAAA,EAAA;AAAA,4CAAAA,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uDAAA,EACd,QAAA,EAAA;AAAA,8CAAAA,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAA,EAA0B,QAAA,EAAA;AAAA,gDAAAN,GAAAA,CAACoC,UAAAA,EAAA,EAAW,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,gCAAG,IAAA,CAAK;AAAA,+BAAA,EAAM,CAAA;AAAA,8BACvF,4BACCpC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,6EAA4E,QAAA,EAAA,aAAA,EAAW;AAAA,6BAAA,EAE3G,CAAA;AAAA,4CACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kCAAA,EAAoC,eAAK,IAAA,EAAK;AAAA;AAAA;AAAA,uBAChE;AAAA,sBACC,YAAY,aAAA,oBACXA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QACb,QAAA,kBAAAA,GAAAA;AAAA,wBAAC,eAAA;AAAA,wBAAA;AAAA,0BACC,KAAA,EAAO,oBAAA;AAAA,0BACP,KAAA;AAAA,0BACA,MAAA,EAAQ,MAAM,QAAA,CAAS,CAAC,CAAA;AAAA,0BACxB,aAAA,EAAe,MAAM,kBAAA,CAAmB,IAAI,CAAA;AAAA,0BAC5C,MAAA,EAAQ,CAAC,OAAA,KAAY;AAKnB,4BAAA,OAAA,CAAQ,OAAA,GAAU,IAAA;AAClB,4BAAA,cAAA,CAAe,OAAO,CAAA;AACtB,4BAAA,QAAA,CAAS,CAAC,CAAA;AACV,4BAAA,IAAA,CAAK,KAAA,EAAM;AAAA,0BACb;AAAA;AAAA,uBACF,EACF;AAAA,qBAAA,EAAA,EArCM,MAuCV;AAAA;AAAA,gBAEJ,CAAC,CAAA,EACH,CAAA;AAAA,gCACAA,IAAC,IAAA,EAAA,EAAK,IAAA,EAAK,YAAW,IAAA,EAAK,qBAAA,EAAsB,SAAS,mBAAA,EAAqB,CAAA;AAAA,gBAQ9E,CAAC,aAAA,oBACAM,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,MAAA,EACb,QAAA,EAAA;AAAA,kCAAAN,GAAAA;AAAA,oBAAC,QAAA;AAAA,oBAAA;AAAA,sBACC,IAAA,EAAK,QAAA;AAAA,sBACL,eAAa,GAAA,CAAI,UAAA;AAAA,sBACjB,QAAA,EAAU,OAAA;AAAA,sBACV,SAAS,MAAM;AAAE,wBAAA,KAAK,oBAAA,EAAqB;AAAA,sBAAE,CAAA;AAAA,sBAC7C,SAAA,EAAU,uIAAA;AAAA,sBAET,QAAA,EAAA,CAAA,eAAA,EAAkB,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA;AAAA,mBACjC;AAAA,kCACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,kDAAiD,QAAA,EAAA,6DAAA,EAE9D;AAAA,iBAAA,EACF;AAAA,eAAA,EAGJ,CAAA;AAAA,cAGC,IAAA,KAAS,CAAA,IAAK,WAAA,oBACbM,IAAAA,CAAC,aAAQ,aAAA,EAAa,GAAA,CAAI,YAAA,EAAc,SAAA,EAAU,2CAAA,EAChD,QAAA,EAAA;AAAA,gCAAAN,IAAC,WAAA,EAAA,EAAY,CAAA;AAAA,gCACbA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,0CAAyC,QAAA,EAAA,uBAAA,EAAqB,CAAA;AAAA,gCAC5EA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,8BAA6B,QAAA,EAAA,mDAAA,EAE1C,CAAA;AAAA,gCACAA,GAAAA;AAAA,kBAAC,QAAA;AAAA,kBAAA;AAAA,oBACC,IAAA,EAAK,QAAA;AAAA,oBACL,OAAA,EAAS,MAAM,UAAA,CAAW,CAAA,OAAA,EAAU,WAAW,CAAA,CAAE,CAAA;AAAA,oBACjD,SAAA,EAAU,kJAAA;AAAA,oBACX,QAAA,EAAA;AAAA;AAAA;AAED,eAAA,EACF,CAAA;AAAA,cAGD,KAAA,oBACCA,GAAAA,CAAC,GAAA,EAAA,EAAE,eAAa,GAAA,CAAI,aAAA,EAAe,SAAA,EAAU,6FAAA,EAC1C,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,cAAA,CAOA,IAAA,KAAS,KAAK,IAAA,KAAS,CAAA,qBACvBM,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,0BAAA,EACb,QAAA,EAAA;AAAA,gCAAAN,GAAAA;AAAA,kBAAC,QAAA;AAAA,kBAAA;AAAA,oBACC,IAAA,EAAK,QAAA;AAAA,oBACL,eAAa,GAAA,CAAI,gBAAA;AAAA,oBACjB,SAAA,EAAU,gHAAA;AAAA,oBAET,mBAAS,CAAA,GAAI,0BAAA,GAA6B,CAAA,sBAAA,EAAyB,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA;AAAA,iBAClF;AAAA,gBACC,IAAA,KAAS,qBACRA,GAAAA;AAAA,kBAAC,QAAA;AAAA,kBAAA;AAAA,oBACC,IAAA,EAAK,QAAA;AAAA,oBACL,eAAa,GAAA,CAAI,YAAA;AAAA,oBACjB,OAAA,EAAS,MAAM,QAAA,CAAS,CAAC,CAAA;AAAA,oBACzB,SAAA,EAAU,oFAAA;AAAA,oBACX,QAAA,EAAA;AAAA;AAAA,iBAED;AAAA,gCAEFA,IAAC,IAAA,EAAA,EAAK,EAAA,EAAI,OAAO,WAAA,EAAa,SAAA,EAAU,mEAAkE,QAAA,EAAA,oBAAA,EAE1G;AAAA,eAAA,EACF;AAAA;AAAA;AAAA,SAGJ;AAAA,wBAEAM,IAAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,wEAAA,EAChB,QAAA,EAAA;AAAA,0BAAAN,IAAC,IAAA,EAAA,EAAK,EAAA,EAAG,UAAA,EAAW,SAAA,EAAU,yBAAwB,QAAA,EAAA,aAAA,EAAW,CAAA;AAAA,0BACjEA,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAG,QAAA,EAAS,SAAA,EAAU,yBAAwB,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,0BAC1DA,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAG,UAAA,EAAW,SAAA,EAAU,yBAAwB,QAAA,EAAA,2BAAA,EAAmB;AAAA,SAAA,EAC3E;AAAA,OAAA,EACF,CAAA;AAAA,sBAEAM,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,kFAAA,EACf,QAAA,EAAA;AAAA,wBAAAN,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,SAAA,EAAU,QAAA,EAAA,kBAAA,EAAgB,CAAA;AAAA,wBACxCA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,aACX,QAAA,EAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,qBACfM,IAAAA,CAAC,IAAA,EAAA,EAAuC,WAAU,oBAAA,EAChD,QAAA,EAAA;AAAA,0BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8EAAA,EACZ,QAAA,EAAA;AAAA,YAAA,IAAA,CAAK,QAAA,oBAAYN,GAAAA,CAAC,WAAA,EAAA,EAAY,GAAA,EAAK,IAAA,CAAK,QAAA,EAAU,GAAA,EAAK,IAAA,CAAK,IAAA,EAAM,SAAA,EAAU,4BAAA,EAA6B,CAAA;AAAA,4BAC1GA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qJAAA,EACb,eAAK,QAAA,EACR;AAAA,WAAA,EACF,CAAA;AAAA,0BACAM,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,4BAAAN,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sBAAA,EAAwB,eAAK,IAAA,EAAK,CAAA;AAAA,YAC9C,IAAA,CAAK,uBAAOA,GAAAA,CAAC,OAAE,SAAA,EAAU,+BAAA,EAAiC,eAAK,GAAA,EAAI,CAAA;AAAA,YACnE,IAAA,CAAK,gCAAgBA,GAAAA,CAAC,OAAE,SAAA,EAAU,+BAAA,EAAiC,eAAK,YAAA,EAAa;AAAA,WAAA,EACxF,CAAA;AAAA,0BACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,YAAA,EAAA,CAAa,IAAA,CAAK,YAAY,IAAA,CAAK,QAAA,EAAU,OAAA,CAAQ,CAAC,GACzD,QAAA,EAAA,KAAA,CAAM,IAAA,CAAK,SAAA,GAAY,IAAA,CAAK,QAAQ,CAAA,EACvC;AAAA,SAAA,EAAA,EAdO,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,SAe7B,CACD,CAAA,EACH,CAAA;AAAA,QACC,OAAO,QAAA,CAAS,SAAA,oBACfM,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,8BAAA,EACb,QAAA,EAAA;AAAA,0BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAA,EACb,QAAA,EAAA;AAAA,4BAAAN,GAAAA;AAAA,cAAC,OAAA;AAAA,cAAA;AAAA,gBACC,eAAa,GAAA,CAAI,aAAA;AAAA,gBACjB,IAAA,EAAK,MAAA;AAAA,gBACL,WAAA,EAAY,mBAAA;AAAA,gBACZ,KAAA,EAAO,YAAA;AAAA,gBACP,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,kBAAA,eAAA,CAAgB,KAAA,CAAM,OAAO,KAAK,CAAA;AAClC,kBAAA,kBAAA,CAAmB,IAAI,CAAA;AACvB,kBAAA,gBAAA,CAAiB,IAAI,CAAA;AAAA,gBACvB,CAAA;AAAA,gBACA,SAAA,EAAU;AAAA;AAAA,aACZ;AAAA,4BACAA,GAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,eAAa,GAAA,CAAI,aAAA;AAAA,gBACjB,OAAA,EAAS,iBAAA;AAAA,gBACT,QAAA,EAAU,gBAAA,IAAoB,CAAC,YAAA,CAAa,IAAA,EAAK;AAAA,gBACjD,SAAA,EAAU,sFAAA;AAAA,gBACX,QAAA,EAAA;AAAA;AAAA;AAED,WAAA,EACF,CAAA;AAAA,UACC,aAAA,oBACCA,GAAAA,CAAC,GAAA,EAAA,EAAE,eAAa,GAAA,CAAI,aAAA,EAAe,SAAA,EAAU,0BAAA,EAC1C,QAAA,EAAA,aAAA,EACH,CAAA;AAAA,UAED,mCACCA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,0CACV,QAAA,EAAA,eAAA,EACH;AAAA,SAAA,EAEJ,CAAA;AAAA,wBAEFM,IAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,sCAAA,EACZ,QAAA,EAAA;AAAA,0BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EACb,QAAA,EAAA;AAAA,4BAAAN,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,UAAA,EAAQ,CAAA;AAAA,4BAC9CA,GAAAA,CAAC,IAAA,EAAA,EAAG,YAAA,EAAY,QAAA,CAAS,QAAQ,CAAC,CAAA,EAAI,QAAA,EAAA,KAAA,CAAM,QAAQ,CAAA,EAAE;AAAA,WAAA,EACxD,CAAA;AAAA,UACC,aAAA,GAAgB,qBACfM,IAAAA,CAAC,SAAI,SAAA,EAAU,uCAAA,EAAwC,aAAA,EAAa,GAAA,CAAI,WAAA,EACtE,QAAA,EAAA;AAAA,4BAAAA,KAAC,IAAA,EAAA,EAAG,QAAA,EAAA;AAAA,cAAA,UAAA;AAAA,cACO,GAAA;AAAA,8BACTA,IAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAK,QAAA;AAAA,kBACL,OAAA,EAAS,iBAAA;AAAA,kBACT,SAAA,EAAU,yCAAA;AAAA,kBACX,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,oBACG,IAAA,CAAK,YAAA;AAAA,oBAAa;AAAA;AAAA;AAAA;AACtB,aAAA,EACF,CAAA;AAAA,4BACAA,IAAAA,CAAC,IAAA,EAAA,EAAG,cAAY,aAAA,CAAc,OAAA,CAAQ,CAAC,CAAA,EAAG,QAAA,EAAA;AAAA,cAAA,GAAA;AAAA,cAAE,MAAM,aAAa;AAAA,aAAA,EAAE;AAAA,WAAA,EACnE,CAAA;AAAA,0BAEFA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EACb,QAAA,EAAA;AAAA,4BAAAN,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,SAAA,EAAO,CAAA;AAAA,4BAC7CA,GAAAA,CAAC,IAAA,EAAA,EAAG,YAAA,EAAY,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAA,EAAI,QAAA,EAAA,QAAA,KAAa,CAAA,GAAI,WAAA,GAAW,KAAA,CAAM,QAAQ,CAAA,EAAE;AAAA,WAAA,EACpF,CAAA;AAAA,0BACAM,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sDAAA,EACb,QAAA,EAAA;AAAA,4BAAAN,GAAAA,CAAC,QAAG,QAAA,EAAA,OAAA,EAAK,CAAA;AAAA,4BACTA,GAAAA,CAAC,IAAA,EAAA,EAAG,YAAA,EAAY,KAAA,CAAM,QAAQ,CAAC,CAAA,EAAI,QAAA,EAAA,KAAA,CAAM,KAAK,CAAA,EAAE;AAAA,WAAA,EAClD;AAAA,SAAA,EACF,CAAA;AAAA,wBACAM,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4DAAA,EACb,QAAA,EAAA;AAAA,0BAAAN,GAAAA,CAACqC,WAAAA,EAAA,EAAY,SAAA,EAAU,sBAAA,EAAuB,CAAA;AAAA,UAAE;AAAA,SAAA,EAElD,CAAA;AAAA,wBAKArC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBACb,QAAA,kBAAAA,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,UAAA,EAAW,IAAA,EAAK,WAAA,EAAY,OAAA,EAAS,qBAAqB,CAAA,EACvE;AAAA,OAAA,EACF;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;;;AC1oCA,IAAM,SAAA,GAAoE;AAAA,EACxE,OAAA,EAAS,EAAE,KAAA,EAAO,UAAA,EAAY,MAAM,SAAA,EAAU;AAAA,EAC9C,IAAA,EAAM,EAAE,KAAA,EAAO,MAAA,EAAQ,MAAM,UAAA,EAAW;AAAA,EACxC,cAAA,EAAgB,EAAE,KAAA,EAAO,mBAAA,EAAqB,MAAM,SAAA,EAAU;AAAA,EAC9D,kBAAA,EAAoB,EAAE,KAAA,EAAO,0BAAA,EAA4B,MAAM,UAAA,EAAW;AAAA,EAC1E,QAAA,EAAU,EAAE,KAAA,EAAO,aAAA,EAAe,MAAM,UAAA,EAAW;AAAA,EACnD,MAAA,EAAQ,EAAE,KAAA,EAAO,WAAA,EAAa,MAAM,UAAA;AACtC,CAAA;AAEA,IAAM,UAAA,GAAmC;AAAA,EACvC,QAAA,EAAU,iCAAA;AAAA,EACV,OAAA,EAAS,6BAAA;AAAA,EACT,QAAA,EAAU;AACZ,CAAA;AAIO,SAAS,qBAAqB,MAAA,EAA+D;AAClG,EAAA,MAAM,KAAA,GAAQ,UAAU,MAAM,CAAA,IAAK,EAAE,KAAA,EAAO,MAAA,EAAQ,MAAM,SAAA,EAAkB;AAC5E,EAAA,OAAO,EAAE,OAAO,KAAA,CAAM,KAAA,EAAO,WAAW,UAAA,CAAW,KAAA,CAAM,IAAI,CAAA,EAAE;AACjE;AAEO,SAAS,OAAO,MAAA,EAAkC;AACvD,EAAA,OAAO,MAAA,KAAW,UAAU,MAAA,KAAW,gBAAA;AACzC;AAEO,SAAS,WAAW,MAAA,EAAkC;AAC3D,EAAA,OAAO,MAAA,KAAW,cAAc,MAAA,KAAW,oBAAA;AAC7C;AChBA,SAAS,mBAAmB,KAAA,EAA8B;AACxD,EAAA,MAAM,QAAA,GAAyB;AAAA,IAC7B,EAAA,EAAI,UAAA;AAAA,IACJ,KAAA,EAAO,iBAAA;AAAA,IACP,WAAA,EAAa,CAAA,CAAA,EAAI,KAAA,CAAM,WAAW,CAAA,CAAA;AAAA,IAClC,KAAA,EAAO,UAAA;AAAA,IACP,IAAA,EAAM8B;AAAA,GACR;AAGA,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,WAAA,IAAe,KAAA,CAAM,oBAAoB,QAAA,EAAU;AACtE,IAAA,OAAO;AAAA,MACL,QAAA;AAAA,MACA,EAAE,EAAA,EAAI,SAAA,EAAW,KAAA,EAAO,kBAAA,EAAoB,aAAa,2BAAA,EAA6B,KAAA,EAAO,WAAA,EAAa,IAAA,EAAM,OAAA;AAAQ,KAC1H;AAAA,EACF;AACA,EAAA,IAAI,UAAA,CAAW,KAAA,CAAM,eAAe,CAAA,EAAG;AACrC,IAAA,OAAO;AAAA,MACL,QAAA;AAAA,MACA,EAAE,EAAA,EAAI,SAAA,EAAW,KAAA,EAAO,oBAAA,EAAsB,aAAa,mBAAA,EAAqB,KAAA,EAAO,UAAA,EAAY,IAAA,EAAMA,KAAAA,EAAM;AAAA,MAC/G;AAAA,QACE,EAAA,EAAI,QAAA;AAAA,QACJ,KAAA,EAAO,KAAA,CAAM,eAAA,KAAoB,UAAA,GAAa,aAAA,GAAgB,mBAAA;AAAA,QAC9D,WAAA,EAAa,4BAAA;AAAA,QACb,KAAA,EAAO,WAAA;AAAA,QACP,IAAA,EAAM;AAAA;AACR,KACF;AAAA,EACF;AAEA,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,KAAA,CAAM,eAAe,CAAA;AACzC,EAAA,MAAM,kBAAA,GAAqB,MAAM,iBAAA,KAAsB,qBAAA;AACvD,EAAA,MAAM,SAAA,GAAY,MAAM,iBAAA,KAAsB,WAAA;AAE9C,EAAA,OAAO;AAAA,IACL,QAAA;AAAA,IACA;AAAA,MACE,EAAA,EAAI,SAAA;AAAA,MACJ,KAAA,EAAO,OAAO,oBAAA,GAAuB,sBAAA;AAAA;AAAA,MAErC,WAAA,EAAa,OAAO,mBAAA,GAAsB,wBAAA;AAAA,MAC1C,KAAA,EAAO,OAAO,UAAA,GAAa,SAAA;AAAA,MAC3B,IAAA,EAAM,OAAOA,KAAAA,GAAQ;AAAA,KACvB;AAAA,IACA;AAAA,MACE,EAAA,EAAI,WAAA;AAAA,MACJ,KAAA,EAAO,kBAAA;AAAA,MACP,WAAA,EAAa,OAAO,oBAAA,GAAuB,+BAAA;AAAA,MAC3C,KAAA,EAAO,SAAA,IAAa,kBAAA,GAAqB,UAAA,GAAa,OAAO,SAAA,GAAY,SAAA;AAAA,MACzE,IAAA,EAAM;AAAA,KACR;AAAA,IACA;AAAA,MACE,EAAA,EAAI,UAAA;AAAA,MACJ,KAAA,EAAO,SAAA,GAAY,gBAAA,GAAmB,kBAAA,GAAqB,eAAA,GAAkB,SAAA;AAAA,MAC7E,WAAA,EAAa,SAAA,GAAY,sBAAA,GAAyB,kBAAA,GAAqB,sBAAA,GAAyB,kBAAA;AAAA,MAChG,KAAA,EAAO,SAAA,GAAY,UAAA,GAAa,kBAAA,GAAqB,SAAA,GAAY,SAAA;AAAA,MACjE,IAAA,EAAM,SAAA,IAAa,kBAAA,GAAqBb,KAAAA,GAAQ;AAAA;AAClD,GACF;AACF;AAEA,IAAM,SAAA,GAAoC;AAAA,EACxC,CAAA,EAAG,gBAAA;AAAA,EACH,CAAA,EAAG,gBAAA;AAAA,EACH,CAAA,EAAG;AACL,CAAA;AAEO,SAAS,sBAAsB,EAAE,KAAA,EAAO,OAAA,EAAAV,QAAAA,GAAU,OAAM,EAAwC;AACrG,EAAA,MAAM,KAAA,GAAQ,mBAAmB,KAAK,CAAA;AAEtC,EAAA,uBACEP,GAAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,eAAa,GAAA,CAAI,aAAA;AAAA,MACjB,SAAA,EAAW,CAAA,KAAA,EAAQO,QAAAA,GAAU,OAAA,GAAU,OAAO,IAAI,SAAA,CAAU,KAAA,CAAM,MAAM,CAAA,IAAK,gBAAgB,CAAA,CAAA;AAAA,MAC7F,YAAA,EAAW,0BAAA;AAAA,MAEV,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AACnB,QAAA,MAAMc,QAAO,IAAA,CAAK,IAAA;AAClB,QAAA,MAAM,SAAA,GAAY,KAAK,KAAA,KAAU,WAAA;AACjC,QAAA,MAAM,IAAA,GAAO,KAAK,KAAA,KAAU,UAAA;AAK5B,QAAA,MAAM,OAAA,GAAU,KAAK,KAAA,KAAU,SAAA;AAC/B,QAAA,MAAMpB,UAAS,IAAA,IAAQ,OAAA;AACvB,QAAA,uBACED,GAAAA;AAAA,UAAC,IAAA;AAAA,UAAA;AAAA,YAEC,aAAA,EAAa,GAAA,CAAI,iBAAA,CAAkB,IAAA,CAAK,EAAE,CAAA;AAAA,YAC1C,cAAY,IAAA,CAAK,KAAA;AAAA,YACjB,SAAA,EAAW;AAAA,cACT,wCAAA;AAAA,cACA,SAAA,GACI,0CAAA,GACAC,OAAAA,GACE,gCAAA,GACA,mCAAA;AAAA,cACNM,WAAU,SAAA,GAAY;AAAA,aACxB,CAAE,KAAK,GAAG,CAAA;AAAA,YAEV,QAAA,kBAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACb,QAAA,EAAA;AAAA,8BAAAN,GAAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAW;AAAA,oBACT,8DAAA;AAAA,oBACA,SAAA,GACI,wCAAA,GACA,IAAA,GACE,mDAAA,GACA,UACE,2CAAA,GACA;AAAA,mBACV,CAAE,KAAK,GAAG,CAAA;AAAA,kBACV,aAAA,EAAW,IAAA;AAAA,kBAEX,QAAA,kBAAAA,GAAAA,CAACqB,KAAAA,EAAA,EAAK,WAAU,aAAA,EAAc;AAAA;AAAA,eAChC;AAAA,8BACAf,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAId,QAAA,EAAA;AAAA,gCAAAN,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kDAAA,EAAoD,eAAK,KAAA,EAAM,CAAA;AAAA,gCAC/EA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iDAAA,EAAmD,eAAK,WAAA,EAAY;AAAA,eAAA,EACtF;AAAA,aAAA,EACF;AAAA,WAAA;AAAA,UApCK,IAAA,CAAK;AAAA,SAqCZ;AAAA,MAEJ,CAAC;AAAA;AAAA,GACH;AAEJ;;;ACvIO,IAAM,gBAAA,GAA8C;AAAA,EACzD,SAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAA;AAGO,IAAM,uBAAA,GAA0C,QAAA;AAEvD,SAAS,iBAAiB,KAAA,EAAwC;AAChE,EAAA,OAAQ,gBAAA,CAAuC,SAAS,KAAK,CAAA;AAC/D;AASO,SAAS,oBAAoB,IAAA,EAA8B;AAChE,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AAC/B,EAAA,IAAI,CAAC,OAAO,OAAO,uBAAA;AACnB,EAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,CAAM,KAAA,CAAM,GAAG,CAAA,EAAG;AACnC,IAAA,MAAM,CAAC,GAAA,EAAK,GAAA,GAAM,EAAE,CAAA,GAAI,IAAA,CAAK,MAAM,GAAG,CAAA;AACtC,IAAA,IAAI,QAAQ,SAAA,EAAW;AACvB,IAAA,MAAM,KAAA,GAAQ,mBAAmB,GAAG,CAAA;AACpC,IAAA,OAAO,gBAAA,CAAiB,KAAK,CAAA,GAAI,KAAA,GAAQ,uBAAA;AAAA,EAC3C;AACA,EAAA,OAAO,uBAAA;AACT;AAGO,SAAS,mBAAmB,OAAA,EAAiC;AAClE,EAAA,OAAO,oBAAoB,OAAO,CAAA,CAAA;AACpC;ACvBA,IAAM,SAAA,GAAY;AAAA,EAChB,EAAE,EAAA,EAAI,SAAA,EAAW,KAAA,EAAO,QAAA,EAAU,MAAMsC,IAAAA,EAAK;AAAA,EAC7C,EAAE,EAAA,EAAI,QAAA,EAAU,KAAA,EAAO,cAAA,EAAgB,MAAMC,OAAAA,EAAQ;AAAA,EACrD,EAAE,EAAA,EAAI,WAAA,EAAa,KAAA,EAAO,cAAA,EAAa,MAAMC,MAAAA,EAAO;AAAA,EACpD,EAAE,EAAA,EAAI,UAAA,EAAY,KAAA,EAAO,YAAA,EAAc,MAAMJ,UAAAA;AAC/C,CAAA;AAEO,SAAS,oBAAA,CAAqB,EAAE,KAAA,EAAO,QAAA,EAAU,QAAAnC,OAAAA,EAAQ,QAAA,EAAU,UAAS,EAA8B;AAC/G,EAAA,MAAM,SAAS,mBAAA,EAAoB;AACnC,EAAA,MAAM,UAAU,eAAA,EAAgB;AAChC,EAAA,MAAM,WAAA,GAAc,QAAQ,IAAA,IAAQ,OAAA,CAAQ,OAAO,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,SAAA;AACpE,EAAA,MAAM,YAAA,GAAe,QAAQ,KAAA,IAAS,0BAAA;AAEtC,EAAA,uBACEK,IAAAA,CAAC,MAAA,EAAA,EAAK,eAAa,GAAA,CAAI,oBAAA,EAAsB,WAAU,qCAAA,EACrD,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wDAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAN,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,2CAAA,EAA6C,iBAAO,IAAA,EAAK,CAAA;AAAA,wBACtEA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,gDAAgD,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,QACnE,4BAAYA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sCAAsC,QAAA,EAAA,QAAA,EAAS;AAAA,OAAA,EAC3E,CAAA;AAAA,sBACAA,IAAC,IAAA,EAAA,EAAK,EAAA,EAAI,OAAO,WAAA,EAAa,SAAA,EAAU,oEAAmE,QAAA,EAAA,kBAAA,EAE3G;AAAA,KAAA,EACF,CAAA;AAAA,oBAEAM,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+CAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,qCAAA,EACf,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uCAAA,EACb,QAAA,EAAA;AAAA,0BAAAN,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8FAAA,EACZ,QAAA,EAAA,WAAA,CAAY,MAAM,CAAA,EAAG,CAAC,CAAA,CAAE,WAAA,EAAY,EACvC,CAAA;AAAA,0BACAM,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EACb,QAAA,EAAA;AAAA,4BAAAN,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,wBAAA,EAA0B,QAAA,EAAA,WAAA,EAAY,CAAA;AAAA,4BACnDA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,0CAA0C,QAAA,EAAA,YAAA,EAAa;AAAA,WAAA,EACtE;AAAA,SAAA,EACF,CAAA;AAAA,wBAEAA,GAAAA,CAAC,KAAA,EAAA,EAAI,aAAA,EAAa,GAAA,CAAI,mBAAA,EAAqB,SAAA,EAAU,gBAAA,EAAiB,YAAA,EAAW,oBAAA,EAC9E,QAAA,EAAA,SAAA,CAAU,GAAA,CAAI,CAAC,IAAA,KAAS;AACvB,UAAA,MAAMqB,QAAO,IAAA,CAAK,IAAA;AAClB,UAAA,MAAM,QAAA,GAAW,KAAK,EAAA,KAAOpB,OAAAA;AAC7B,UAAA,uBACEK,IAAAA;AAAA,YAAC,IAAA;AAAA,YAAA;AAAA,cAEC,EAAA,EAAI,kBAAA,CAAmB,IAAA,CAAK,EAAE,CAAA;AAAA,cAC9B,gBAAc,IAAA,CAAK,EAAA;AAAA,cACnB,cAAA,EAAc,WAAW,MAAA,GAAS,MAAA;AAAA,cAGlC,OAAA,EAAS,CAAC,KAAA,KAAU;AAClB,gBAAA,IAAI,CAAC,QAAA,EAAU;AACf,gBAAA,KAAA,CAAM,cAAA,EAAe;AACrB,gBAAA,QAAA,CAAS,KAAK,EAAE,CAAA;AAAA,cAClB,CAAA;AAAA,cACA,SAAA,EAAW,CAAA,iGAAA,EACT,QAAA,GAAW,4BAAA,GAA+B,4DAC5C,CAAA,CAAA;AAAA,cAEA,QAAA,EAAA;AAAA,gCAAAN,GAAAA,CAACqB,KAAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,gBACzB,IAAA,CAAK;AAAA;AAAA,aAAA;AAAA,YAhBD,IAAA,CAAK;AAAA,WAiBZ;AAAA,QAEJ,CAAC,CAAA,EACH,CAAA;AAAA,wBAEAf,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+DAAA,EACb,QAAA,EAAA;AAAA,0BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uDAAA,EACb,QAAA,EAAA;AAAA,4BAAAN,GAAAA,CAACqC,WAAAA,EAAA,EAAY,SAAA,EAAU,sBAAA,EAAuB,CAAA;AAAA,YAAE;AAAA,WAAA,EAElD,CAAA;AAAA,0BACArC,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,QAAO,QAAA,EAAA,gFAAA,EAAwE;AAAA,SAAA,EAC9F,CAAA;AAAA,wBAEAM,IAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,eAAa,GAAA,CAAI,OAAA;AAAA,YACjB,OAAA,EAAS,MAAM,KAAK,eAAA,EAAgB;AAAA,YACpC,SAAA,EAAU,wJAAA;AAAA,YAEV,QAAA,EAAA;AAAA,8BAAAN,GAAAA,CAACyC,MAAAA,EAAA,EAAO,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,cAAE;AAAA;AAAA;AAAA;AAEhC,OAAA,EACF,CAAA;AAAA,sBAEAzC,GAAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAU,WAAW,QAAA,EAAS;AAAA,KAAA,EACzC;AAAA,GAAA,EACF,CAAA;AAEJ;AChGA,SAAS,WAAA,GAAc;AACrB,EAAA,uBACEM,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EACb,QAAA,EAAA;AAAA,oBAAAN,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4CAAA,EAA6C,CAAA;AAAA,oBAC7DM,KAAC,KAAA,EAAA,EAAI,OAAA,EAAQ,aAAY,SAAA,EAAU,oCAAA,EAAqC,eAAW,IAAA,EACjF,QAAA,EAAA;AAAA,sBAAAN,GAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,CAAA,EAAE,IAAA,EAAK,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,eAAA,EAAgB,aAAY,GAAA,EAAI,CAAA;AAAA,sBAClFA,GAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UAAK,CAAA,EAAE,sBAAA;AAAA,UAAuB,IAAA,EAAK,MAAA;AAAA,UAAO,MAAA,EAAO,eAAA;AAAA,UAAgB,WAAA,EAAY,GAAA;AAAA,UAC5E,aAAA,EAAc,OAAA;AAAA,UAAQ,cAAA,EAAe;AAAA;AAAA;AAAQ,KAAA,EACjD;AAAA,GAAA,EACF,CAAA;AAEJ;AAEO,SAAS,qBAAA,CAAsB,EAAE,OAAA,EAAQ,EAAwB;AACtE,EAAA,MAAM,SAAS,mBAAA,EAAoB;AACnC,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIE,SAAuB,IAAI,CAAA;AACrD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAAS,IAAI,CAAA;AAC3C,EAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAc,WAAA,CAAY,GAAG,MAAA,CAAO,QAAA,EAAU,OAAO,MAAM,CAAA;AAC1E,EAAA,iBAAA,CAAkB,EAAE,KAAA,EAAO,KAAA,GAAQ,CAAA,QAAA,EAAW,KAAA,CAAM,WAAW,CAAA,QAAA,EAAM,MAAA,CAAO,IAAI,CAAA,CAAA,GAAK,MAAA,CAAO,IAAA,EAAM,CAAA;AAElG,EAAA,MAAM,MAAA,GAASH,MAAAA,CAAM,WAAA,CAAY,MAAM;AACrC,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAAL,iBAAgB,CACb,QAAA,CAAS,OAAO,CAAA,CAChB,IAAA,CAAK,CAAC,CAAA,KAAM;AACX,MAAA,IAAI,CAAC,SAAA,EAAW,QAAA,CAAS,CAAC,CAAA;AAAA,IAC5B,CAAC,CAAA,CACA,OAAA,CAAQ,MAAM;AACb,MAAA,IAAI,CAAC,SAAA,EAAW,UAAA,CAAW,KAAK,CAAA;AAAA,IAClC,CAAC,CAAA;AACH,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AAAA,IACd,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAAI,UAAU,MAAM,MAAA,EAAO,EAAG,CAAC,MAAM,CAAC,CAAA;AAElC,EAAA,IAAI,OAAA,EAAS;AAGX,IAAA,uBACEE,GAAAA,CAAC,oBAAA,EAAA,EAAqB,KAAA,EAAM,mBAAA,EAAoB,MAAA,EAAO,QAAA,EACrD,QAAA,kBAAAM,IAAAA,CAAC,aAAA,EAAA,EAAc,KAAA,EAAM,uBAAA,EAAwB,WAAU,sCAAA,EACrD,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6DAAA,EACb,QAAA,EAAA;AAAA,wBAAAN,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,gCAAA,EAAiC,CAAA;AAAA,wBACrDM,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAAN,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,qBAAA,EAAsB,CAAA;AAAA,0BAC1CA,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,4BAAA,EAA6B,CAAA;AAAA,0BACjDA,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,eAAA,EAAgB;AAAA,SAAA,EACtC;AAAA,OAAA,EACF,CAAA;AAAA,sBAEAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oEACZ,QAAA,EAAA,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,EAAE,GAAA,CAAI,CAAC,MAAA,qBACdM,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAN,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,UAAA,EAAW,CAAA;AAAA,wBAC/BA,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,eAAA,EAAgB,CAAA;AAAA,wBACpCA,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,iBAAA,EAAkB;AAAA,OAAA,EAAA,EAH9B,MAIV,CACD,CAAA,EACH,CAAA;AAAA,sBAEAM,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,MAAA,EACb,QAAA,EAAA;AAAA,wBAAAN,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,UAAA,EAAW,CAAA;AAAA,wBAC/BA,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,8BAAA,EACZ,QAAA,EAAA,CAAC,GAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,CAAE,IAAI,CAAC,IAAA,qBACjBM,IAAAA,CAACP,MAAAA,CAAM,UAAN,EACC,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,+BAAA,EAAgC,CAAA;AAAA,UACnD,OAAO,CAAA,oBAAKA,GAAAA,CAAC,QAAA,EAAA,EAAS,WAAU,aAAA,EAAc;AAAA,SAAA,EAAA,EAF5B,IAGrB,CACD,CAAA,EACH;AAAA,OAAA,EACF,CAAA;AAAA,sBAEAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACZ,WAAC,CAAA,EAAG,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,GAAA,qBACXM,IAAAA,CAAC,KAAA,EAAA,EAAc,WAAU,yBAAA,EACvB,QAAA,EAAA;AAAA,wBAAAN,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,sBAAA,EAAuB,CAAA;AAAA,wBAC3CA,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,cAAA,EAAe,CAAA;AAAA,wBACnCA,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,YAAA,EAAa;AAAA,OAAA,EAAA,EAHzB,GAIV,CACD,CAAA,EACH,CAAA;AAAA,sBAEAM,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8BAAA,EACb,QAAA,EAAA;AAAA,wBAAAN,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,uBAAA,EAAwB,CAAA;AAAA,wBAC5CA,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,4BAAA,EAA6B,CAAA;AAAA,wBACjDA,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,UAAA,EAAW;AAAA,OAAA,EACjC;AAAA,KAAA,EACF,CAAA,EACF,CAAA;AAAA,EAEJ;AACA,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,uBACEM,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0CAAA,EACd,QAAA,EAAA;AAAA,sBAAAN,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,2BAAA,EAAsB,CAAA;AAAA,sBAC3DA,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAG,GAAA,EAAI,SAAA,EAAU,4CAA2C,QAAA,EAAA,kBAAA,EAAa;AAAA,KAAA,EACjF,CAAA;AAAA,EAEJ;AAEA,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,KAAA,CAAM,eAAe,CAAA;AAEzC,EAAA,uBACEA,GAAAA;AAAA,IAAC,oBAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAM,mBAAA;AAAA,MACN,QAAA,EAAU,OAAO,+CAAA,GAA+C,0CAAA;AAAA,MAChE,MAAA,EAAO,QAAA;AAAA,MAIP,UAAU,CAAC,OAAA,KAAY,UAAA,CAAW,CAAA,iBAAA,EAAoB,OAAO,CAAA,CAAE,CAAA;AAAA,MAU/D,0BAAAM,IAAAA,CAAC,SAAA,EAAA,EAAQ,eAAa,GAAA,CAAI,WAAA,EAAa,WAAU,sDAAA,EAC/C,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6DAAA,EAKZ,QAAA,EAAA;AAAA,UAAA,IAAA,mBAAON,GAAAA,CAAC,WAAA,EAAA,EAAY,CAAA,mBAAKA,IAAC,WAAA,EAAA,EAAY,CAAA;AAAA,0BACvCM,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BAAA,EACb,QAAA,EAAA;AAAA,4BAAAN,IAAC,IAAA,EAAA,EAAG,SAAA,EAAU,8CAAA,EACX,QAAA,EAAA,IAAA,GAAO,uBAAuB,mBAAA,EACjC,CAAA;AAAA,4BACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,8BACV,QAAA,EAAA,IAAA,GACG,CAAA,sBAAA,EAAyB,KAAA,CAAM,YAAA,IAAgB,SAAS,CAAA,6CAAA,CAAA,GACxD,CAAA,sBAAA,EAAyB,KAAA,CAAM,YAAA,IAAgB,SAAS,CAAA,yDAAA,CAAA,EAC9D,CAAA;AAAA,4BACAM,IAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,cAAA,EAAe,QAAA,EAAA;AAAA,cAAA,SAAA;AAAA,8BACnBA,IAAAA,CAAC,MAAA,EAAA,EAAK,eAAa,GAAA,CAAI,WAAA,EAAa,WAAU,eAAA,EAAgB,QAAA,EAAA;AAAA,gBAAA,GAAA;AAAA,gBAAE,KAAA,CAAM;AAAA,eAAA,EAAY,CAAA;AAAA,cAAQ,GAAA;AAAA,8BACjGN,GAAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBACC,eAAa,GAAA,CAAI,WAAA;AAAA,kBACjB,WAAW,CAAA,gEAAA,EAAmE,oBAAA,CAAqB,KAAA,CAAM,eAAe,EAAE,SAAS,CAAA,CAAA;AAAA,kBAElI,QAAA,EAAA,oBAAA,CAAqB,KAAA,CAAM,eAAe,CAAA,CAAE;AAAA;AAAA;AAC/C,aAAA,EACF;AAAA,WAAA,EACF;AAAA,SAAA,EACF,CAAA;AAAA,wBAEAM,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0EAAA,EACb,QAAA,EAAA;AAAA,0BAAAA,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,4BAAAN,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,SAAA,EAAO,CAAA;AAAA,4BAC5CA,GAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,oBAAA,EAAsB,QAAA,EAAA,KAAA,CAAM,gBAAgB,SAAA,EAAU,CAAA;AAAA,4BACnEA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,uBAAA,EAAyB,gBAAM,aAAA,EAAc;AAAA,WAAA,EAC5D,CAAA;AAAA,0BACAM,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,4BAAAN,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,SAAA,EAAO,CAAA;AAAA,4BAG5CA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,oBAAA,EACV,QAAA,EAAA,KAAA,CAAM,iBAAA,KAAsB,WAAA,GACzB,SAAA,GACA,IAAA,GAAO,kBAAA,GAAqB,sBAAA,EAClC,CAAA;AAAA,4BACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,uBAAA,EAAyB,QAAA,EAAA,KAAA,CAAM,SAAS,6BAAA,EAA2B;AAAA,WAAA,EAClF,CAAA;AAAA,0BACAM,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,4BAAAN,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,WAAA,EAAS,CAAA;AAAA,4BAC9CA,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sBAAsB,QAAA,EAAA,oBAAA,CAAqB,KAAA,CAAM,eAAe,CAAA,CAAE,KAAA,EAAM,CAAA;AAAA,4BAErFA,GAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,uBAAA,EACV,QAAA,EAAA,IAAA,GAAO,uBAAuB,uBAAA,EACjC;AAAA,WAAA,EACF;AAAA,SAAA,EACF,CAAA;AAAA,wBAEAM,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,MAAA,EACb,QAAA,EAAA;AAAA,0BAAAN,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,4DAAA,EAA6D,QAAA,EAAA,gBAAA,EAE3E,CAAA;AAAA,0BACAA,GAAAA,CAAC,qBAAA,EAAA,EAAsB,KAAA,EAAc,CAAA;AAAA,UAAA,CAInC,KAAA,CAAM,SAAA,IAAa,EAAC,EAAG,MAAA,CAAO,CAACL,EAAAA,KAAMA,EAAAA,CAAE,YAAY,CAAA,CAAE,GAAA,CAAI,CAAC,6BAC1DW,IAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cAEC,aAAA,EAAa,IAAI,aAAA,GAAgB,OAAA;AAAA,cACjC,SAAA,EAAU,kGAAA;AAAA,cAEV,QAAA,EAAA;AAAA,gCAAAN,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EACb,QAAA,EAAA,QAAA,CAAS,UAAU,CAAA,YAAA,EAAe,QAAA,CAAS,OAAO,CAAA,CAAA,GAAK,SAAA,EAC1D,CAAA;AAAA,gBACC,QAAA,CAAS,8BACRA,GAAAA;AAAA,kBAAC,GAAA;AAAA,kBAAA;AAAA,oBACC,MAAM,QAAA,CAAS,WAAA;AAAA,oBACf,MAAA,EAAO,QAAA;AAAA,oBACP,GAAA,EAAI,YAAA;AAAA,oBACJ,SAAA,EAAU,oDAAA;AAAA,oBAET,QAAA,EAAA,QAAA,CAAS;AAAA;AAAA,oCAGZA,GAAAA,CAAC,UAAK,SAAA,EAAU,uBAAA,EAAyB,mBAAS,YAAA,EAAa;AAAA;AAAA,aAAA;AAAA,YAjB5D,QAAA,CAAS;AAAA,WAoBjB;AAAA,SAAA,EACH,CAAA;AAAA,wBAEAA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,4BACX,QAAA,EAAA,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,qBAChBM,IAAAA,CAAC,IAAA,EAAA,EAAiB,WAAU,iCAAA,EACzB,QAAA,EAAA;AAAA,UAAA,IAAA,CAAK,QAAA,oBAAYN,GAAAA,CAAC,WAAA,EAAA,EAAY,GAAA,EAAK,IAAA,CAAK,QAAA,EAAU,GAAA,EAAK,IAAA,CAAK,IAAA,EAAM,SAAA,EAAU,0CAAA,EAA2C,CAAA;AAAA,0BACxHM,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,QAAA,EACb,QAAA,EAAA;AAAA,YAAA,IAAA,CAAK,IAAA;AAAA,YAAK,GAAA;AAAA,4BAACA,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA;AAAA,cAAA,OAAA;AAAA,cAAG,IAAA,CAAK;AAAA,aAAA,EAAS;AAAA,WAAA,EACvE,CAAA;AAAA,0BACAN,GAAAA,CAAC,MAAA,EAAA,EAAK,YAAA,EAAY,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,EAAI,QAAA,EAAA,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA,EAAE;AAAA,SAAA,EAAA,EALrD,IAAA,CAAK,EAMd,CACD,CAAA,EACH,CAAA;AAAA,wBAEAM,IAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,kDAAA,EACZ,QAAA,EAAA;AAAA,0BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EACb,QAAA,EAAA;AAAA,4BAAAN,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,UAAA,EAAQ,CAAA;AAAA,4BAC9CA,GAAAA,CAAC,IAAA,EAAA,EAAG,YAAA,EAAY,KAAA,CAAM,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAA,EAAI,QAAA,EAAA,KAAA,CAAM,KAAA,CAAM,QAAQ,CAAA,EAAE;AAAA,WAAA,EACpE,CAAA;AAAA,UACC,MAAM,aAAA,GAAgB,CAAA,oBACrBM,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,uCAAA,EACb,QAAA,EAAA;AAAA,4BAAAA,KAAC,IAAA,EAAA,EAAG,QAAA,EAAA;AAAA,cAAA,WAAA;AAAA,cAAU,KAAA,CAAM,YAAA,GAAe,CAAA,CAAA,EAAI,KAAA,CAAM,YAAY,CAAA,CAAA,CAAA,GAAM;AAAA,aAAA,EAAG,CAAA;AAAA,4BAClEA,KAAC,IAAA,EAAA,EAAG,YAAA,EAAY,MAAM,aAAA,CAAc,OAAA,CAAQ,CAAC,CAAA,EAAG,QAAA,EAAA;AAAA,cAAA,QAAA;AAAA,cAAE,KAAA,CAAM,MAAM,aAAa;AAAA,aAAA,EAAE;AAAA,WAAA,EAC/E,CAAA;AAAA,0BAEFA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EACb,QAAA,EAAA;AAAA,4BAAAN,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,OAAA,EAAK,CAAA;AAAA,4BAC3CA,GAAAA,CAAC,IAAA,EAAA,EAAG,YAAA,EAAY,KAAA,CAAM,cAAc,OAAA,CAAQ,CAAC,CAAA,EAC1C,QAAA,EAAA,KAAA,CAAM,kBAAkB,CAAA,GAAI,WAAA,GAAW,KAAA,CAAM,KAAA,CAAM,aAAa,CAAA,EACnE;AAAA,WAAA,EACF,CAAA;AAAA,0BACAM,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4DAAA,EACb,QAAA,EAAA;AAAA,4BAAAN,GAAAA,CAAC,QAAG,QAAA,EAAA,OAAA,EAAK,CAAA;AAAA,4BACTA,GAAAA,CAAC,IAAA,EAAA,EAAG,aAAA,EAAa,IAAI,UAAA,EAAY,YAAA,EAAY,KAAA,CAAM,KAAA,CAAM,QAAQ,CAAC,CAAA,EAAI,QAAA,EAAA,KAAA,CAAM,KAAA,CAAM,KAAK,CAAA,EAAE;AAAA,WAAA,EAC3F;AAAA,SAAA,EACF,CAAA;AAAA,wBAEAM,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACb,QAAA,EAAA;AAAA,0BAAAN,GAAAA;AAAA,YAAC,IAAA;AAAA,YAAA;AAAA,cACC,EAAA,EAAG,UAAA;AAAA,cACH,eAAa,GAAA,CAAI,aAAA;AAAA,cACjB,SAAA,EAAU,0FAAA;AAAA,cACX,QAAA,EAAA;AAAA;AAAA,WAED;AAAA,0BACAA,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAG,GAAA,EAAI,SAAA,EAAU,8DAA6D,QAAA,EAAA,qBAAA,EAEpF;AAAA,SAAA,EACF;AAAA,OAAA,EACF;AAAA;AAAA,GACF;AAEJ;AC/QO,SAAS,WAAA,GAA0E;AACxF,EAAA,MAAM,UAAA,GAAa,eAAA,CAAgB,CAACL,EAAAA,KAAMA,GAAE,UAAU,CAAA;AACtD,EAAA,MAAM,KAAA,GAAQ,eAAA,CAAgB,CAACA,EAAAA,KAAMA,GAAE,KAAK,CAAA;AAC5C,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIO,QAAAA,CAAkB,EAAE,CAAA;AAChD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAAS,IAAI,CAAA;AAC3C,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,SAAS,CAAC,CAAA;AAElC,EAAA,MAAM,OAAA,GAAU6B,WAAAA,CAAY,MAAM,OAAA,CAAQ,CAAC,MAAM,CAAA,GAAI,CAAC,CAAA,EAAG,EAAE,CAAA;AAE3D,EAAAjC,UAAU,MAAM;AACd,IAAA,IAAI,SAAA,GAAY,KAAA;AAIhB,IAAA,MAAM,QAAQ,iBAAA,EAAkB;AAChC,IAAA,IAAI,CAAC,UAAA,IAAc,CAAC,KAAA,EAAO;AACzB,MAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,QAAA,SAAA,CAAU,EAAE,CAAA;AACZ,QAAA,UAAA,CAAW,KAAK,CAAA;AAChB,QAAA;AAAA,MACF;AAAA,IACF;AACA,IAAA,UAAA,CAAW,IAAI,CAAA;AAGf,IAAA,MAAM,KAAA,GAAQ,UAAA,GAAa,EAAE,UAAA,EAAY,KAAA,EAAO,EAAA,EAAG,GAAI,EAAE,aAAA,EAAe,KAAA,EAAQ,KAAA,EAAO,EAAA,EAAG;AAC1F,IAAAJ,iBAAgB,CACb,UAAA,CAAW,KAAK,CAAA,CAChB,IAAA,CAAK,CAAC,IAAA,KAAS;AACd,MAAA,IAAI,CAAC,SAAA,EAAW,SAAA,CAAU,IAAI,CAAA;AAAA,IAChC,CAAC,CAAA,CACA,KAAA,CAAM,YAAY;AAIjB,MAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,GAAA;AAAA,QACzB,iBAAA,EAAkB,CAAE,GAAA,CAAI,CAAC,EAAA,KAAOA,eAAAA,EAAgB,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,MAAM,IAAI,CAAC;AAAA,OAClF;AACA,MAAA,IAAI,CAAC,SAAA,EAAW,SAAA,CAAU,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KAAkB,CAAC,CAAC,CAAC,CAAC,CAAA;AAAA,IAC/D,CAAC,CAAA,CACA,OAAA,CAAQ,MAAM;AACb,MAAA,IAAI,CAAC,SAAA,EAAW,UAAA,CAAW,KAAK,CAAA;AAAA,IAClC,CAAC,CAAA;AACH,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AAAA,IACd,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,UAAA,EAAY,KAAA,EAAO,IAAI,CAAC,CAAA;AAE5B,EAAA,OAAO,EAAE,MAAA,EAAQ,OAAA,EAAS,OAAA,EAAQ;AACpC;ACrCA,SAAS,QAAA,GAAW;AAClB,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIQ,SAA8B,QAAQ,CAAA;AAC9D,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAS,EAAE,CAAA;AACrC,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,SAAS,EAAE,CAAA;AAC3C,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,SAAS,EAAE,CAAA;AACnC,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,SAAS,KAAK,CAAA;AACtC,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAwB,IAAI,CAAA;AACtD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAExD,EAAA,eAAe,OAAO,CAAA,EAAoB;AACxC,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,SAAA,CAAU,IAAI,CAAA;AACd,IAAA,IAAI,CAAC,KAAA,CAAM,IAAA,EAAK,IAAK,CAAC,QAAA,EAAU;AAChC,IAAA,IAAI,IAAA,KAAS,QAAA,IAAY,CAAC,IAAA,CAAK,MAAK,EAAG;AACrC,MAAA,QAAA,CAAS,mBAAmB,CAAA;AAC5B,MAAA;AAAA,IACF;AACA,IAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,IAAA,IAAI;AACF,MAAA,IAAI,IAAA,KAAS,UAAU,MAAM,cAAA,CAAe,OAAO,QAAA,EAAU,IAAA,CAAK,MAAM,CAAA;AAAA,WACnE,MAAM,wBAAA,CAAyB,KAAA,EAAO,EAAE,UAAU,CAAA;AAAA,IACzD,SAAS,GAAA,EAAK;AACZ,MAAA,IAAI,eAAe,8BAAA,EAAgC;AACjD,QAAA,SAAA,CAAU,yDAAyD,CAAA;AAAA,MACrE,CAAA,MAAO;AACL,QAAA,QAAA,CAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,sDAAgD,CAAA;AAAA,MAChG;AAAA,IACF,CAAA,SAAE;AACA,MAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,IACf;AAAA,EACF;AAEA,EAAA,MAAM,GAAA,GAAM,CAAC,EAAA,EAAyB,KAAA,EAAe,2BACnDF,GAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,aAAA,EAAa,MAAA;AAAA,MACb,SAAS,MAAM;AACb,QAAA,OAAA,CAAQ,EAAE,CAAA;AACV,QAAA,QAAA,CAAS,IAAI,CAAA;AACb,QAAA,SAAA,CAAU,IAAI,CAAA;AAAA,MAChB,CAAA;AAAA,MACA,SAAA,EAAW,CAAA,iEAAA,EACT,IAAA,KAAS,EAAA,GAAK,gCAAgC,gEAChD,CAAA,CAAA;AAAA,MAEC,QAAA,EAAA;AAAA;AAAA,GACH;AAGF,EAAA,uBACEM,KAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uDAAsD,KAAA,EAAO,EAAE,YAAA,EAAc,uBAAA,EAAwB,EAClH,QAAA,EAAA;AAAA,oBAAAN,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,kCAAA,EAAmC,QAAA,EAAA,aAAA,EAAW,CAAA;AAAA,oBAC5DA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sCAAqC,QAAA,EAAA,yDAAA,EAElD,CAAA;AAAA,oBACAM,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAA,EACZ,QAAA,EAAA;AAAA,MAAA,GAAA,CAAI,QAAA,EAAU,QAAA,EAAU,GAAA,CAAI,aAAa,CAAA;AAAA,MACzC,GAAA,CAAI,QAAA,EAAU,aAAA,EAAe,GAAA,CAAI,aAAa;AAAA,KAAA,EACjD,CAAA;AAAA,oBACAA,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gBAAA,EAAiB,UAAU,MAAA,EACxC,QAAA,EAAA;AAAA,MAAA,IAAA,KAAS,4BACRN,GAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,eAAa,GAAA,CAAI,UAAA;AAAA,UACjB,IAAA,EAAK,MAAA;AAAA,UACL,QAAA,EAAQ,IAAA;AAAA,UACR,WAAA,EAAY,eAAA;AAAA,UACZ,KAAA,EAAO,IAAA;AAAA,UACP,UAAU,CAAC,CAAA,KAAM,OAAA,CAAQ,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,UACvC,SAAA,EAAU,iDAAA;AAAA,UACV,KAAA,EAAO,EAAE,YAAA,EAAc,wBAAA;AAAyB;AAAA,OAClD;AAAA,sBAEFA,GAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,eAAa,GAAA,CAAI,WAAA;AAAA,UACjB,IAAA,EAAK,OAAA;AAAA,UACL,QAAA,EAAQ,IAAA;AAAA,UACR,WAAA,EAAY,kBAAA;AAAA,UACZ,KAAA,EAAO,KAAA;AAAA,UACP,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,UACxC,SAAA,EAAU,iDAAA;AAAA,UACV,KAAA,EAAO,EAAE,YAAA,EAAc,wBAAA;AAAyB;AAAA,OAClD;AAAA,sBACAA,GAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,eAAa,GAAA,CAAI,cAAA;AAAA,UACjB,IAAA,EAAK,UAAA;AAAA,UACL,QAAA,EAAQ,IAAA;AAAA,UACR,WAAA,EAAY,OAAA;AAAA,UACZ,KAAA,EAAO,QAAA;AAAA,UACP,UAAU,CAAC,CAAA,KAAM,WAAA,CAAY,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,UAC3C,SAAA,EAAU,iDAAA;AAAA,UACV,KAAA,EAAO,EAAE,YAAA,EAAc,wBAAA;AAAyB;AAAA,OAClD;AAAA,MACC,MAAA,oBACCA,GAAAA,CAAC,GAAA,EAAA,EAAE,eAAa,GAAA,CAAI,UAAA,EAAY,SAAA,EAAU,sCAAA,EAAwC,QAAA,EAAA,MAAA,EAAO,CAAA;AAAA,MAE1F,KAAA,oBACCA,GAAAA,CAAC,GAAA,EAAA,EAAE,eAAa,GAAA,CAAI,SAAA,EAAW,SAAA,EAAU,0BAAA,EAA4B,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,sBAE7EA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,eAAa,GAAA,CAAI,YAAA;AAAA,UACjB,QAAA,EAAU,IAAA;AAAA,UACV,SAAA,EAAU,yJAAA;AAAA,UACV,KAAA,EAAO,EAAE,YAAA,EAAc,yBAAA,EAA0B;AAAA,UAEhD,QAAA,EAAA,IAAA,GAAO,gBAAA,GAAc,IAAA,KAAS,QAAA,GAAW,aAAA,GAAgB;AAAA;AAAA;AAC5D,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AAEA,SAAS,WAAA,GAAc;AACrB,EAAA,MAAM,SAAS,mBAAA,EAAoB;AACnC,EAAA,MAAM,EAAE,MAAA,EAAQ,OAAA,EAAQ,GAAI,WAAA,EAAY;AACxC,EAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAc,WAAA,CAAY,GAAG,MAAA,CAAO,QAAA,EAAU,OAAO,MAAM,CAAA;AAE1E,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,uBACEA,GAAAA,CAAC,aAAA,EAAA,EAAc,OAAM,yBAAA,EAA0B,SAAA,EAAU,aACtD,QAAA,EAAA,CAAC,CAAA,EAAG,CAAC,CAAA,CAAE,IAAI,CAAC,GAAA,qBACXM,IAAAA,CAAC,KAAA,EAAA,EAAc,WAAU,gCAAA,EACvB,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EACb,QAAA,EAAA;AAAA,wBAAAN,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,UAAA,EAAW,CAAA;AAAA,wBAC/BA,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,uBAAA,EAAwB;AAAA,OAAA,EAC9C,CAAA;AAAA,sBACAA,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,eAAA,EAAgB,CAAA;AAAA,sBACpCA,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,8BAAA,EACZ,QAAA,EAAA,CAAC,GAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,CAAE,IAAI,CAAC,IAAA,qBACjBM,IAAAA,CAACP,MAAAA,CAAM,UAAN,EACC,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,+BAAA,EAAgC,CAAA;AAAA,QACnD,OAAO,CAAA,oBAAKA,GAAAA,CAAC,QAAA,EAAA,EAAS,WAAU,aAAA,EAAc;AAAA,OAAA,EAAA,EAF5B,IAGrB,CACD,CAAA,EACH,CAAA;AAAA,sBACAM,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACb,QAAA,EAAA;AAAA,wBAAAN,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,qBAAA,EAAsB,CAAA;AAAA,wBAC1CA,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,qBAAA,EAAsB;AAAA,OAAA,EAC5C,CAAA;AAAA,sBACAM,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sDAAA,EACb,QAAA,EAAA;AAAA,wBAAAN,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,UAAA,EAAW,CAAA;AAAA,wBAC/BA,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,UAAA,EAAW;AAAA,OAAA,EACjC;AAAA,KAAA,EAAA,EArBQ,GAsBV,CACD,CAAA,EACH,CAAA;AAAA,EAEJ;AACA,EAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,IAAA,uBACEM,IAAAA,CAAC,KAAA,EAAA,EAAI,eAAa,GAAA,CAAI,cAAA,EAAgB,WAAU,8CAAA,EAC9C,QAAA,EAAA;AAAA,sBAAAN,GAAAA,CAACuC,OAAAA,EAAA,EAAQ,SAAA,EAAU,yCAAA,EAA0C,CAAA;AAAA,sBAC7DvC,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,8BAA6B,QAAA,EAAA,mCAAA,EAA2B,CAAA;AAAA,sBACrEA,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAG,GAAA,EAAI,SAAA,EAAU,4CAA2C,QAAA,EAAA,iBAAA,EAAe;AAAA,KAAA,EACnF,CAAA;AAAA,EAEJ;AACA,EAAA,uBACEA,GAAAA,CAAC,IAAA,EAAA,EAAG,aAAA,EAAa,GAAA,CAAI,aAAA,EAAe,SAAA,EAAU,WAAA,EAC3C,QAAA,EAAA,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,qBACXM,IAAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MAEC,eAAa,GAAA,CAAI,YAAA;AAAA,MACjB,qBAAmB,KAAA,CAAM,WAAA;AAAA,MACzB,SAAA,EAAU,gCAAA;AAAA,MAEV,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EACb,QAAA,EAAA;AAAA,0BAAAA,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,eAAA,EAAgB,QAAA,EAAA;AAAA,YAAA,UAAA;AAAA,YAAS,KAAA,CAAM;AAAA,WAAA,EAAY,CAAA;AAAA,0BAC3DN,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,8DAA8D,oBAAA,CAAqB,KAAA,CAAM,eAAe,CAAA,CAAE,SAAS,CAAA,CAAA,EACjI,QAAA,EAAA,oBAAA,CAAqB,KAAA,CAAM,eAAe,EAAE,KAAA,EAC/C;AAAA,SAAA,EACF,CAAA;AAAA,wBACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sCAAA,EACV,QAAA,EAAA,IAAI,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA,CAAE,kBAAA,CAAmB,MAAA,CAAO,MAAM,CAAA,EAC7D,CAAA;AAAA,wBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,MAAA,EACb,QAAA,kBAAAA,GAAAA,CAAC,qBAAA,EAAA,EAAsB,KAAA,EAAc,OAAA,EAAO,IAAA,EAAC,CAAA,EAC/C,CAAA;AAAA,wBACAA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,6BACX,QAAA,EAAA,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,qBAChBM,IAAAA,CAAC,IAAA,EAAA,EAAiB,WAAU,6DAAA,EACzB,QAAA,EAAA;AAAA,UAAA,IAAA,CAAK,QAAA,oBAAYN,GAAAA,CAAC,WAAA,EAAA,EAAY,GAAA,EAAK,IAAA,CAAK,QAAA,EAAU,GAAA,EAAK,IAAA,CAAK,IAAA,EAAM,SAAA,EAAU,8BAAA,EAA+B,CAAA;AAAA,UAC3G,IAAA,CAAK,IAAA;AAAA,UAAK,QAAA;AAAA,UAAI,IAAA,CAAK;AAAA,SAAA,EAAA,EAFb,IAAA,CAAK,EAGd,CACD,CAAA,EACH,CAAA;AAAA,wBACAM,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8DAAA,EACb,QAAA,EAAA;AAAA,0BAAAN,GAAAA,CAAC,QAAK,EAAA,EAAI,CAAA,OAAA,EAAU,MAAM,EAAE,CAAA,CAAA,EAAI,SAAA,EAAU,0CAAA,EAA2C,QAAA,EAAA,cAAA,EAErF,CAAA;AAAA,0BACAM,KAAC,MAAA,EAAA,EACC,QAAA,EAAA;AAAA,4BAAAN,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4BAAA,EAA6B,QAAA,EAAA,OAAA,EAAK,CAAA;AAAA,4BAClDA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iBAAgB,YAAA,EAAY,KAAA,CAAM,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,EAAI,QAAA,EAAA,KAAA,CAAM,KAAA,CAAM,KAAK,CAAA,EAAE;AAAA,WAAA,EAC1F;AAAA,SAAA,EACF;AAAA;AAAA,KAAA;AAAA,IAjCK,KAAA,CAAM;AAAA,GAmCd,CAAA,EACH,CAAA;AAEJ;AAEA,SAAS,YAAA,GAAe;AACtB,EAAA,MAAM,UAAU,eAAA,EAAgB;AAChC,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,IAAIE,QAAAA,CAAS,OAAA,CAAQ,QAAQ,EAAE,CAAA;AACnD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,SAAS,KAAK,CAAA;AAC1C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAS,KAAK,CAAA;AACxC,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAEtD,EAAA,eAAe,KAAK,CAAA,EAAoB;AACtC,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,SAAA,CAAU,IAAI,CAAA;AACd,IAAA,QAAA,CAAS,KAAK,CAAA;AACd,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,IAAI;AACF,MAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,QAAA,MAAM,QAAQ,OAAA,CAAQ,KAAA,CAAM,KAAK,CAAA,CAAE,OAAO,OAAO,CAAA;AACjD,QAAA,MAAMR,eAAAA,EAAgB,CAAE,cAAA,CAAe,OAAA,CAAQ,UAAA,EAAY;AAAA,UACzD,SAAA,EAAW,KAAA,CAAM,CAAC,CAAA,IAAK,OAAA;AAAA,UACvB,UAAU,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA,CAAE,KAAK,GAAG;AAAA,SAClC,CAAA;AAAA,MACH;AAGA,MAAA,eAAA,CAAgB,QAAA,CAAS,EAAE,IAAA,EAAM,OAAA,EAAS,CAAA;AAC1C,MAAA,QAAA,CAAS,IAAI,CAAA;AAAA,IACf,CAAA,CAAA,MAAQ;AACN,MAAA,QAAA,CAAS,6EAAuE,CAAA;AAAA,IAClF,CAAA,SAAE;AACA,MAAA,SAAA,CAAU,KAAK,CAAA;AAAA,IACjB;AAAA,EACF;AAEA,EAAA,uBACEY,IAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAU,IAAA,EAAM,WAAU,yCAAA,EAC9B,QAAA,EAAA;AAAA,oBAAAN,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,kCAAA,EAAmC,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,oBACvDA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sCAAqC,QAAA,EAAA,2CAAA,EAAsC,CAAA;AAAA,oBACxFM,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,gCAAA,EAAiC,QAAA,EAAA;AAAA,MAAA,eAAA;AAAA,sBAEhDN,GAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,IAAA;AAAA,UACP,QAAA,EAAU,CAAC,CAAA,KAAM;AAAE,YAAA,OAAA,CAAQ,CAAA,CAAE,OAAO,KAAK,CAAA;AAAG,YAAA,QAAA,CAAS,KAAK,CAAA;AAAA,UAAE,CAAA;AAAA,UAC5D,SAAA,EAAU,iEAAA;AAAA,UACV,WAAA,EAAY;AAAA;AAAA;AACd,KAAA,EACF,CAAA;AAAA,oBACAM,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,gCAAA,EAAiC,QAAA,EAAA;AAAA,MAAA,QAAA;AAAA,sBAEhDN,GAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,QAAQ,KAAA,IAAS,EAAA;AAAA,UACxB,QAAA,EAAQ,IAAA;AAAA,UACR,SAAA,EAAU;AAAA;AAAA;AACZ,KAAA,EACF,CAAA;AAAA,oBACAM,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8BAAA,EACb,QAAA,EAAA;AAAA,sBAAAN,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,QAAA,EAAU,MAAA;AAAA,UACV,SAAA,EAAU,4GAAA;AAAA,UAET,mBAAS,gBAAA,GAAc;AAAA;AAAA,OAC1B;AAAA,MACC,yBAASA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wCAAuC,QAAA,EAAA,OAAA,EAAK;AAAA,KAAA,EACxE,CAAA;AAAA,IACC,yBAASA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,iCAAiC,QAAA,EAAA,KAAA,EAAM;AAAA,GAAA,EAChE,CAAA;AAEJ;AAEA,SAAS,cAAA,GAAiB;AACxB,EAAA,uBACEM,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gCAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,sBAAAN,GAAAA,CAACwC,MAAAA,EAAA,EAAO,SAAA,EAAU,sBAAA,EAAuB,CAAA;AAAA,sBACzCxC,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,oCAAmC,QAAA,EAAA,cAAA,EAAS;AAAA,KAAA,EAC5D,CAAA;AAAA,oBACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sCAAqC,QAAA,EAAA,iJAAA,EAGlD,CAAA;AAAA,oBACAA,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAG,GAAA,EAAI,SAAA,EAAU,kEAAiE,QAAA,EAAA,qBAAA,EAExF;AAAA,GAAA,EACF,CAAA;AAEJ;AAEA,SAAS,aAAA,GAAgB;AACvB,EAAA,uBACEM,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gCAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,sBAAAN,GAAAA,CAACoC,UAAAA,EAAA,EAAW,SAAA,EAAU,sBAAA,EAAuB,CAAA;AAAA,sBAC7CpC,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,oCAAmC,QAAA,EAAA,YAAA,EAAU;AAAA,KAAA,EAC7D,CAAA;AAAA,oBACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sCAAqC,QAAA,EAAA,uHAAA,EAElD,CAAA;AAAA,oBACAM,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yEAAA,EACb,QAAA,EAAA;AAAA,sBAAAN,GAAAA,CAAC0C,MAAAA,EAAA,EAAO,SAAA,EAAU,sBAAA,EAAuB,CAAA;AAAA,sBACzC1C,GAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA,wDAAA,EAAmD;AAAA,KAAA,EAC3D;AAAA,GAAA,EACF,CAAA;AAEJ;AAEA,IAAM,gBAAA,GAAmD;AAAA,EACvD,OAAA,EAAS,wBAAA;AAAA,EACT,MAAA,EAAQ,oCAAA;AAAA,EACR,SAAA,EAAW,0BAAA;AAAA,EACX,QAAA,EAAU;AACZ,CAAA;AAEO,SAAS,eAAA,GAAkB;AAChC,EAAA,MAAM,SAAS,mBAAA,EAAoB;AACnC,EAAA,MAAM,UAAU,eAAA,EAAgB;AAChC,EAAA,MAAM,OAAA,GAAU,mBAAA,CAAoB,YAAA,EAAc,CAAA;AAClD,EAAA,iBAAA,CAAkB,EAAE,KAAA,EAAO,CAAA,mBAAA,EAAiB,MAAA,CAAO,IAAI,IAAI,CAAA;AAE3D,EAAA,IAAI,CAAC,QAAQ,KAAA,EAAO;AAClB,IAAA,uBACEA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wCACd,QAAA,kBAAAA,GAAAA,CAAC,YAAS,CAAA,EACZ,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACEM,IAAAA;AAAA,IAAC,oBAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAM,aAAA;AAAA,MACN,QAAA,EAAU,iBAAiB,OAAO,CAAA;AAAA,MAClC,MAAA,EAAQ,OAAA;AAAA,MAEP,QAAA,EAAA;AAAA,QAAA,OAAA,KAAY,SAAA,oBAAaN,GAAAA,CAAC,YAAA,EAAA,EAAa,CAAA;AAAA,QACvC,OAAA,KAAY,QAAA,oBAAYA,GAAAA,CAAC,WAAA,EAAA,EAAY,CAAA;AAAA,QACrC,OAAA,KAAY,WAAA,oBAAeA,GAAAA,CAAC,cAAA,EAAA,EAAe,CAAA;AAAA,QAC3C,OAAA,KAAY,UAAA,oBAAcA,GAAAA,CAAC,aAAA,EAAA,EAAc;AAAA;AAAA;AAAA,GAC5C;AAEJ;ACjVO,SAAS,iBAAA,GAA0B;AACxC,EAAA,4BAAA;AAAA,IAA6B,MAC3B,YAAA,CAAa,QAAA,GAAW,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,MAC3C,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,MAAA,EAAQ,KAAK,MAAA,IAAU,IAAA;AAAA,MACvB,UAAA,EAAY,KAAK,UAAA,IAAc,IAAA;AAAA,MAC/B,MAAA,EAAQ,KAAK,QAAA,IAAY,IAAA;AAAA,MACzB,KAAA,EAAO,KAAK,OAAA,IAAW,IAAA;AAAA,MACvB,MAAA,EAAQ,KAAK,QAAA,IAAY,IAAA;AAAA,MACzB,SAAA,EAAW,KAAK,SAAA,IAAa,IAAA;AAAA;AAAA;AAAA;AAAA,MAI7B,UAAA,EAAY,KAAK,gBAAA,KAAqB,KAAA;AAAA,MACtC,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,KAAK,IAAA,CAAK;AAAA,KACZ,CAAE;AAAA,GACJ;AACF;ACnCO,SAAS,YAAA,GAAe;AAC7B,EAAA,MAAM,SAAS,mBAAA,EAAoB;AACnC,EAAA,iBAAA,CAAkB,EAAE,KAAA,EAAO,CAAA,mCAAA,EAA2B,MAAA,CAAO,IAAI,IAAI,CAAA;AACrE,EAAA;AAAA;AAAA;AAAA;AAAA,oBAIEM,IAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,sBAAA,EAAqB,WAAA;AAAA,QACrB,SAAA,EAAU,iGAAA;AAAA,QAEV,QAAA,EAAA;AAAA,0BAAAN,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,2DAAA,EAA4D,QAAA,EAAA,KAAA,EAAG,CAAA;AAAA,0BAC5EA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,8BAA6B,QAAA,EAAA,6BAAA,EAAqB,CAAA;AAAA,0BAChEA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sCAAqC,QAAA,EAAA,uEAAA,EAElD,CAAA;AAAA,0BACAA,GAAAA;AAAA,YAAC,IAAA;AAAA,YAAA;AAAA,cACC,IAAI,MAAA,CAAO,WAAA;AAAA,cACX,SAAA,EAAU,kHAAA;AAAA,cACX,QAAA,EAAA;AAAA;AAAA;AAED;AAAA;AAAA;AACF;AAEJ;ACzBA,IAAM,MAAA,GAAS;AAAA,EACb,OAAA,EAAS,4BAAA;AAAA,EACT,KAAA,EAAO,eAAA;AAAA,EACP,OAAA,EAAS;AACX,CAAA;AAOO,SAAS,UAAA,CAAW,EAAE,IAAA,EAAK,EAAyB;AACzD,EAAA,MAAM,SAAS,mBAAA,EAAoB;AACnC,EAAA,MAAM,KAAA,GAAQ,OAAO,IAAI,CAAA;AACzB,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,KAAA,GAAQ,IAAI,CAAA;AACnC,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,MAAA,EAAQ,OAAA,EAAS,KAAA;AACtC,EAAA,iBAAA,CAAkB,EAAE,OAAO,CAAA,EAAG,KAAK,WAAM,MAAA,CAAO,IAAI,IAAI,CAAA;AAExD,EAAA,uBACEM,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sCAAA,EACd,QAAA,EAAA;AAAA,oBAAAN,IAAC,IAAA,EAAA,EAAK,EAAA,EAAI,OAAO,WAAA,EAAa,SAAA,EAAU,yEAAwE,QAAA,EAAA,yBAAA,EAEhH,CAAA;AAAA,oBACAA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,qDAAqD,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,oBACzEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sDAAA,EACZ,QAAA,EAAA,OAAA,GACC,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA,CAAE,MAAA,CAAO,CAAC,SAAS,IAAA,CAAK,IAAA,EAAM,CAAA,CAAE,GAAA,CAAI,CAAC,SAAA,EAAW,CAAA,qBAAMA,GAAAA,CAAC,GAAA,EAAA,EAAW,QAAA,EAAA,SAAA,EAAA,EAAJ,CAAc,CAAI,CAAA,mBAElGM,IAAAA,CAAAO,UAAA,EACE,QAAA,EAAA;AAAA,sBAAAb,GAAAA,CAAC,OAAE,QAAA,EAAA,oEAAA,EAAyD,CAAA;AAAA,MAC3D,KAAA,oBACCM,IAAAA,CAAC,GAAA,EAAA,EAAE,QAAA,EAAA;AAAA,QAAA,4CAAA;AAAA,QACuC,GAAA;AAAA,wBACxCN,IAAC,GAAA,EAAA,EAAE,IAAA,EAAM,UAAU,KAAK,CAAA,CAAA,EAAI,SAAA,EAAU,wBAAA,EAA0B,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,QAAI;AAAA,OAAA,EAC5E;AAAA,KAAA,EAEJ,CAAA,EAEJ;AAAA,GAAA,EACF,CAAA;AAEJ;AC9BO,IAAM,uBAAA,GAAN,cAAsCD,MAAAA,CAAM,SAAA,CAAwB;AAAA,EAApE,WAAA,GAAA;AAAA,IAAA,KAAA,CAAA,GAAA,SAAA,CAAA;AACL,IAAA,IAAA,CAAA,KAAA,GAAe,EAAE,OAAO,IAAA,EAAK;AAAA,EAAA;AAAA,EAE7B,OAAO,yBAAyB,KAAA,EAAqB;AACnD,IAAA,OAAO,EAAE,KAAA,EAAM;AAAA,EACjB;AAAA,EAEA,iBAAA,CAAkB,OAAc,IAAA,EAA6B;AAE3D,IAAA,OAAA,CAAQ,KAAA,CAAM,4BAAA,EAA8B,KAAA,EAAO,IAAA,CAAK,cAAc,CAAA;AAAA,EACxE;AAAA,EAEA,MAAA,GAA0B;AACxB,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO,OAAO,KAAK,KAAA,CAAM,QAAA;AACzC,IAAA,uBACEO,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qFAAA,EACb,QAAA,EAAA;AAAA,sBAAAN,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,kCAAA,EAAmC,QAAA,EAAA,iBAAA,EAAe,CAAA;AAAA,sBAChEA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,0CAAyC,QAAA,EAAA,+EAAA,EAEtD,CAAA;AAAA,sBACAM,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qCAAA,EACb,QAAA,EAAA;AAAA,wBAAAN,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,MAAM,MAAA,CAAO,QAAA,CAAS,MAAA,EAAO;AAAA,YACtC,SAAA,EAAU,6GAAA;AAAA,YACX,QAAA,EAAA;AAAA;AAAA,SAED;AAAA,wBACAA,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAG,GAAA,EAAI,SAAA,EAAU,iFAAgF,QAAA,EAAA,qBAAA,EAEvG;AAAA,OAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ;AACF,CAAA;AC/CA,IAAM,IAAA,GAA8E;AAAA,EAClF,OAAA,EAAS8B,KAAAA;AAAA,EACT,KAAA,EAAO,WAAA;AAAA,EACP,IAAA,EAAM;AACR,CAAA;AAEA,IAAM,MAAA,GAA2C;AAAA,EAC/C,OAAA,EAAS,oCAAA;AAAA,EACT,KAAA,EAAO,oCAAA;AAAA,EACP,IAAA,EAAM;AACR,CAAA;AAEA,SAAS,SAAA,CAAU,EAAE,KAAA,EAAAH,MAAAA,EAAM,EAAqB;AAC9C,EAAA,MAAM,OAAA,GAAU,aAAA,CAAc,CAAChC,EAAAA,KAAMA,GAAE,OAAO,CAAA;AAC9C,EAAA,MAAM0B,KAAAA,GAAO,IAAA,CAAKM,MAAAA,CAAM,OAAO,CAAA;AAE/B,EAAA7B,UAAU,MAAM;AACd,IAAA,MAAM,KAAA,GAAQ,OAAO,UAAA,CAAW,MAAM,QAAQ6B,MAAAA,CAAM,EAAE,CAAA,EAAGA,MAAAA,CAAM,UAAU,CAAA;AACzE,IAAA,OAAO,MAAM,MAAA,CAAO,YAAA,CAAa,KAAK,CAAA;AAAA,EACxC,GAAG,CAACA,MAAAA,CAAM,IAAIA,MAAAA,CAAM,UAAA,EAAY,OAAO,CAAC,CAAA;AAExC,EAAA,uBACErB,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,SAAA,EAAU,gJAAA;AAAA,MAEV,QAAA,EAAA;AAAA,wBAAAN,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,CAAA,sDAAA,EAAyD,OAAO2B,MAAAA,CAAM,OAAO,CAAC,CAAA,CAAA,EAC7F,0BAAA3B,GAAAA,CAACqB,KAAAA,EAAA,EAAK,SAAA,EAAU,WAAU,CAAA,EAC5B,CAAA;AAAA,wBACAf,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,0BAAAN,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,qCAAA,EAAuC,QAAA,EAAA2B,OAAM,KAAA,EAAM,CAAA;AAAA,UAC/DA,MAAAA,CAAM,+BAAe3B,GAAAA,CAAC,OAAE,SAAA,EAAU,sCAAA,EAAwC,QAAA,EAAA2B,MAAAA,CAAM,WAAA,EAAY;AAAA,SAAA,EAC/F,CAAA;AAAA,wBACA3B,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,YAAA,EAAW,QAAA;AAAA,YACX,OAAA,EAAS,MAAM,OAAA,CAAQ2B,MAAAA,CAAM,EAAE,CAAA;AAAA,YAC/B,SAAA,EAAU,+DAAA;AAAA,YAEV,QAAA,kBAAA3B,GAAAA,CAACuB,CAAAA,EAAA,EAAE,WAAU,SAAA,EAAU;AAAA;AAAA;AACzB;AAAA;AAAA,GACF;AAEJ;AAEO,SAAS,OAAA,GAAU;AACxB,EAAA,MAAM,MAAA,GAAS,aAAA,CAAc,CAAC5B,EAAAA,KAAMA,GAAE,MAAM,CAAA;AAC5C,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAChC,EAAA,uBACEK,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uEAAA,EACZ,iBAAO,GAAA,CAAI,CAAC,CAAA,qBACXA,IAAC,SAAA,EAAA,EAAqB,KAAA,EAAO,KAAb,CAAA,CAAE,EAAc,CACjC,CAAA,EACH,CAAA;AAEJ;AChBA,SAAS,cAAA,CAAe,QAAgD,IAAA,EAAuB;AAC7F,EAAA,MAAM,KAAA,GAAQ,sBAAA,CAAuB,MAAA,EAAQ,IAAI,CAAA;AACjD,EAAA,IAAI,KAAA,CAAM,SAAS,QAAA,EAAU;AAC3B,IAAA,OAAO,MAAM,KAAA,CAAM,MAAA,KAAW,SAAA,IAAa,KAAA,CAAM,MAAM,IAAA,KAAS,UAAA;AAAA,EAClE;AACA,EAAA,OAAO,MAAM,IAAA,KAAS,UAAA;AACxB;AAEA,SAAS,WAAA,CAAY,EAAE,IAAA,EAAK,EAAqB;AAC/C,EAAA,MAAM,SAAS,mBAAA,EAAoB;AAInC,EAAA,MAAM,KAAA,GAAQ,sBAAA,CAAuB,MAAA,EAAQ,IAAI,CAAA;AAEjD,EAAA,QAAQ,MAAM,IAAA;AAAM,IAClB,KAAK,QAAA,EAAU;AACb,MAAA,MAAM,WAAA,GAAc,MAAM,KAAA,CAAM,SAAA;AAChC,MAAA,uBAAOA,GAAAA,CAAC,WAAA,EAAA,EAAY,MAAY,MAAA,EAAQ,KAAA,CAAM,QAAQ,MAAA,EAAgB,CAAA;AAAA,IACxE;AAAA,IACA,KAAK,SAAA;AACH,MAAA,uBAAOA,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,SAAA,EAAU,IAAA,EAAM,MAAA,CAAO,KAAA,CAAM,OAAA,EAAS,MAAA,EAAQ,KAAA,CAAM,MAAA,EAAQ,CAAA;AAAA,IAC1F,KAAK,OAAA;AACH,MAAA,uBAAOA,GAAAA,CAAC,qBAAA,EAAA,EAAsB,OAAA,EAAS,KAAA,CAAM,OAAO,EAAA,EAAK,CAAA;AAAA;AAAA;AAAA,IAG3D,KAAK,UAAA;AACH,MAAA,OAAO,MAAA,CAAO,SAAS,QAAA,mBAAWA,IAAC,YAAA,EAAA,EAAa,CAAA,mBAAKA,GAAAA,CAAC,YAAA,EAAA,EAAa,CAAA;AAAA,IACrE,KAAK,SAAA;AACH,MAAA,OAAO,MAAA,CAAO,SAAS,QAAA,mBAAWA,IAAC,eAAA,EAAA,EAAgB,CAAA,mBAAKA,GAAAA,CAAC,YAAA,EAAA,EAAa,CAAA;AAAA,IACxE,KAAK,SAAA;AAAA;AAAA;AAAA,IAGL,KAAK,eAAA;AACH,MAAA,uBAAOA,IAAC,cAAA,EAAA,EAAe,IAAA,EAAK,WAAU,IAAA,EAAM,MAAA,CAAO,MAAM,OAAA,EAAS,CAAA;AAAA,IACpE,KAAK,QAAA;AACH,MAAA,uBAAOA,GAAAA,CAAC,UAAA,EAAA,EAAW,IAAA,EAAM,MAAM,MAAA,EAAQ,CAAA;AAAA,IACzC,KAAK,SAAA,EAAW;AACd,MAAA,MAAM,OAAA,GAAU,gBAAA,CAAiB,MAAA,CAAO,KAAA,EAAO,IAAI,CAAA;AACnD,MAAA,OAAO,0BACLA,GAAAA,CAAC,WAAA,EAAA,EAAY,IAAA,EAAM,QAAQ,IAAA,EAAM,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAM,QAAQ,OAAA,CAAQ,MAAA,EAAQ,CAAA,mBAE7EA,IAAC,YAAA,EAAA,EAAa,CAAA;AAAA,IAElB;AAAA;AAAA,IAEA,KAAK,MAAA;AACH,MAAA,OAAO,MAAA,CAAO,MAAM,IAAA,mBAClBA,IAAC,cAAA,EAAA,EAAe,IAAA,EAAK,QAAO,IAAA,EAAM,MAAA,CAAO,MAAM,IAAA,EAAM,CAAA,mBAErDA,GAAAA,CAAC,cAAA,EAAA,EAAe,MAAK,SAAA,EAAU,IAAA,EAAM,MAAA,CAAO,KAAA,CAAM,OAAA,EAAS,CAAA;AAAA,IAE/D,KAAK,UAAA;AACH,MAAA,uBAAOA,IAAC,YAAA,EAAA,EAAa,CAAA;AAAA;AAE3B;AAaA,SAAS,yBAAyB,QAAA,EAA8C;AAC9E,EAAA,MAAM,EAAA,GAAA,iBAAK,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAClC,EAAA,OAAO;AAAA,IACL,IAAI,CAAA,aAAA,EAAgB,QAAA,CAAS,KAAK,IAAA,EAAK,CAAE,aAAa,CAAA,CAAA;AAAA,IACtD,QAAA,EAAU,MAAA;AAAA,IACV,KAAA,EAAO,QAAA,CAAS,KAAA,IAAS,CAAA,EAAG,SAAS,OAAO,CAAA,KAAA,CAAA;AAAA,IAC5C,IAAA,EAAM,QAAA,CAAS,IAAA,CAAK,IAAA,GAAO,WAAA,EAAY;AAAA,IACvC,IAAA,EAAM,YAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,OAAO,QAAA,CAAS,OAAA;AAAA,IAChB,UAAA,EAAY,IAAA;AAAA,IACZ,eAAA,EAAiB,KAAA;AAAA,IACjB,WAAA,EAAa,IAAA;AAAA,IACb,SAAA,EAAW,KAAA;AAAA,IACX,YAAY,EAAC;AAAA,IACb,aAAa,EAAC;AAAA,IACd,QAAA,EAAU,EAAA;AAAA,IACV,MAAA,EAAQ,IAAA;AAAA,IACR,MAAA,EAAQ,QAAA;AAAA,IACR,SAAA,EAAW,CAAA;AAAA,IACX,SAAA,EAAW,EAAA;AAAA,IACX,SAAA,EAAW;AAAA,GACb;AACF;AAEA,SAAS,cAAc,MAAA,EAAoD;AACzE,EAAA,MAAM,mBAAmB,MAAA,CAAO,SAAA,IAAa,EAAC,EAAG,IAAI,wBAAwB,CAAA;AAC7E,EAAA,MAAM,UAAA,GAAa,CAAC,GAAI,MAAA,CAAO,OAAA,EAAS,UAAA,IAAc,EAAC,EAAI,GAAI,MAAA,CAAO,UAAA,IAAc,EAAG,CAAA;AACvF,EAAA,IAAI,CAAC,OAAO,OAAA,IAAW,eAAA,CAAgB,WAAW,CAAA,IAAK,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG,OAAO,MAAA;AAEvF,EAAA,MAAM,gBAAA,GAAA,CAAoB,MAAA,CAAO,OAAA,EAAS,SAAA,IAAa,EAAC,EAAG,MAAA;AAAA,IACzD,CAAC,EAAA,KAAO,CAAC,eAAA,CAAgB,IAAA,CAAK,CAAC,GAAA,KAAA,CAAS,EAAA,CAAG,IAAA,IAAQ,EAAA,EAAI,WAAA,EAAY,KAAM,IAAI,IAAI;AAAA,GACnF;AACA,EAAA,OAAO;AAAA,IACL,GAAG,MAAA,CAAO,OAAA;AAAA,IACV,SAAA,EAAW,CAAC,GAAG,gBAAA,EAAkB,GAAG,eAAe,CAAA;AAAA;AAAA;AAAA,IAGnD;AAAA,GACF;AACF;AAWO,SAAS,2BAA2B,MAAA,EAAgC;AACzE,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,WAAW,CAAA,IAAK,MAAA,CAAO,QAAQ,MAAA,CAAO,QAAA,IAAY,EAAE,CAAA,EAAG;AACtE,IAAA,YAAA,CAAa,GAAA,EAAK,WAAA,EAAa,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,EAClD;AACF;AAUO,SAAS,0BAA0B,MAAA,EAAwC;AAChF,EAAA,OAAO,MAAA,CAAO,QAAA,IAAY,sBAAA,CAAuB,aAAA,CAAc,MAAM,CAAC,CAAA;AACxE;AAEO,SAAS,sBAAsB,MAAA,EAAgC;AACpE,EAAA,wBAAA,EAAyB;AACzB,EAAA,0BAAA,CAA2B,MAAM,CAAA;AACjC,EAAA,IAAI,aAAA,CAAc,MAAM,CAAA,CAAE,QAAA,CAAS,QAAA,EAAU;AAC3C,IAAA,gBAAA,CAAiB,kBAAA,CAAmB,OAAO,IAAA,EAAM;AAAA,MAC/C,aAAa,MAAA,CAAO,WAAA;AAAA,MACpB,iBAAiB,MAAA,CAAO;AAAA,KACzB,CAAC,CAAA;AAAA,EACJ;AAEA,EAAA,eAAA,CAAgB,yBAAA,CAA0B,MAAM,CAAC,CAAA;AAKjD,EAAA,iBAAA,EAAkB;AAQlB,EAAA,MAAM,gBAAgB,MAAM;AAC1B,IAAA,MAAM,WAAWN,eAAAA,EAAgB;AACjC,IAAA,KAAK,YAAA,CAAa,QAAA,EAAS,CAAE,SAAA,CAAU,OAAO,IAAA,KAAS;AACrD,MAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CAAS,UAAA,CAAW,KAAK,SAAS,CAAA;AACxD,MAAA,OAAO,OAAA,IAAW,IAAA;AAAA,IACpB,CAAC,CAAA;AAAA,EACH,CAAA;AAOA,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,YAAA,CAAa,OAAA,EAAS;AACzD,IAAA,IAAI,YAAA,CAAa,OAAA,CAAQ,WAAA,EAAY,EAAG,aAAA,EAAc;AAAA,SACjD,YAAA,CAAa,OAAA,CAAQ,iBAAA,CAAkB,aAAa,CAAA;AAAA,EAC3D;AAEA,EAAA,IAAI,MAAA,CAAO,WAAA,IAAe,MAAA,CAAO,eAAA,EAAiB;AAChD,IAAA,OAAA,CAAQ,IAAA;AAAA,MACN;AAAA,KACF;AAAA,EACF;AACF;AAsBO,SAAS,gBAAgB,EAAE,IAAA,EAAM,cAAc,MAAA,EAAO,GAA0B,EAAC,EAAG;AACzF,EAAA,MAAM,OAAO,gBAAA,EAAiB;AAO9B,EAAA,MAAM,OAAA,GAAU,MAAA,IAAU,kBAAA,CAAmB,YAAA,EAAc,IAAI,CAAA;AAC/D,EAAA,uBACEM,IAAC,wBAAA,EAAA,EAAyB,KAAA,EAAO,SAC/B,QAAA,kBAAAA,GAAAA,CAAC,mBAAA,EAAA,EAAoB,YAAA,EAA4B,CAAA,EACnD,CAAA;AAEJ;AAEA,SAAS,mBAAA,CAAoB,EAAE,YAAA,EAAa,EAA8B;AACxE,EAAA,MAAM,SAAS,mBAAA,EAAoB;AACnC,EAAA,MAAM,WAAW,YAAA,EAAa;AAC9B,EAAA,MAAM,OAAO,YAAA,IAAgB,QAAA;AAC7B,EAAA,wBAAA,CAAyB,IAAI,CAAA;AAC7B,EAAA,MAAM,OAAA,GAAU,cAAA,CAAe,MAAA,EAAQ,IAAI,CAAA;AAC3C,EAAA,MAAM,UAAA,GAAa,wBAAwB,MAAM,CAAA;AACjD,EAAA,MAAM,WAAA,GAAc,EAAE,MAAA,EAAQ,YAAA,EAAc,OAAO,YAAA,EAAa;AAChE,EAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,UAAA,CAAW,MAAA,EAAQ,gBAAgB,CAAA;AAClE,EAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,UAAA,CAAW,MAAA,EAAQ,gBAAgB,CAAA;AAGlE,EAAA,MAAM,KAAA,GAAQ,iBAAA,CAAkB,UAAA,CAAW,KAAK,CAAA;AAChD,EAAA,MAAM,UAAA,GAAa,aAAA,CAAc,UAAA,CAAW,KAAK,CAAA;AAEjD,EAAA,MAAM,IAAA,mBACJM,IAAAA,CAAAO,QAAAA,EAAA,EACG,QAAA,EAAA;AAAA,IAAA,MAAA,CAAO,yBAASb,GAAAA,CAAC,oBAAA,EAAA,EAAqB,KAAA,EAAO,OAAO,KAAA,EAAO,CAAA;AAAA,IAC3D,CAAC,OAAA,oBAAWA,GAAAA,CAAC,MAAA,CAAO,SAAA,EAAP,EAAkB,GAAG,WAAA,EAAc,GAAG,MAAA,CAAO,KAAA,EAAO,CAAA;AAAA,oBAClEA,IAAC,uBAAA,EAAA,EACC,QAAA,kBAAAA,IAAC,WAAA,EAAA,EAAY,IAAA,EAAY,KADG,IAE9B,CAAA;AAAA,IACC,CAAC,OAAA,IAAW,MAAA,CAAO,SAAS,IAAA,oBAAQA,IAAC,UAAA,EAAA,EAAW,CAAA;AAAA,IAChD,CAAC,OAAA,oBAAWA,GAAAA,CAAC,MAAA,CAAO,SAAA,EAAP,EAAkB,GAAG,WAAA,EAAc,GAAG,MAAA,CAAO,KAAA,EAAO,CAAA;AAAA,oBAClEA,IAAC,OAAA,EAAA,EAAQ;AAAA,GAAA,EACX,CAAA;AAGF,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAO,GAAG,WAAA,EAAc,GAAG,YACzB,QAAA,EAAA,IAAA,EACH,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8CACZ,QAAA,EAAA,IAAA,EACH,CAAA;AAEJ;AAUO,SAAS,oBAAoB,MAAA,EAA+C;AACjF,EAAA,MAAM,QAAA,GAAW,cAAc,MAAM,CAAA;AACrC,EAAA,qBAAA,CAAsB,MAAM,CAAA;AAI5B,EAAA,MAAM,MAAA,GAAS2C,oBAAAA,CAAqB,QAAA,CAAS,OAAA,IAAW,MAAM,CAAA;AAE9D,EAAA,SAAS,aAAA,GAAgB;AACvB,IAAA,uBACE3C,IAAC,oBAAA,EAAA,EAAqB,MAAA,EAAQ,UAC5B,QAAA,kBAAAA,GAAAA,CAAC,eAAA,EAAA,EAAgB,MAAA,EAAgB,CAAA,EACnC,CAAA;AAAA,EAEJ;AACA,EAAA,aAAA,CAAc,WAAA,GAAc,eAAA;AAC5B,EAAA,OAAO,aAAA;AACT;AAWO,SAAS,iBAAiB,OAAA,EAAuD;AACtF,EAAA,MAAM,MAAA,GAAS,CAAC,GAAI,OAAA,CAAQ,KAAA,IAAS,EAAC,EAAI,GAAI,OAAA,CAAQ,MAAA,IAAU,EAAG,CAAA;AACnE,EAAA,MAAM,MAAA,GAA2B;AAAA,IAC/B,GAAG,OAAA,CAAQ,MAAA;AAAA,IACX,QAAA,EAAU,OAAA,CAAQ,QAAA,IAAY,OAAA,CAAQ,MAAA,CAAO,QAAA;AAAA,IAC7C,UAAA,EAAY;AAAA,MACV,GAAG,QAAQ,MAAA,CAAO,UAAA;AAAA,MAClB,GAAG,OAAA,CAAQ;AAAA,KACb;AAAA,IACA,QAAQ,MAAA,CAAO,MAAA,GAAS,CAAA,GAAI,MAAA,GAAS,QAAQ,MAAA,CAAO,MAAA;AAAA,IACpD,MAAM,OAAA,CAAQ,QAAA,GACV,EAAE,GAAI,OAAA,CAAQ,OAAO,IAAA,IAAQ,EAAE,QAAA,EAAU,IAAG,EAAI,QAAA,EAAU,QAAQ,QAAA,EAAS,GAC3E,QAAQ,MAAA,CAAO;AAAA,GACrB;AAEA,EAAA,OAAO,oBAAoB,MAAM,CAAA;AACnC;;;AChUO,IAAM,mBAAA,GAAsB;AAM5B,IAAM,oBAAA,GAAuB,CAAC,UAAA,EAAY,SAAA,EAAW,SAAS;AAS9D,IAAM,mBAAA,GAAsB,CAAC,MAAA,EAAQ,iBAAA,EAAmB,SAAS;AAIjE,IAAM,0BAAA,GAA6B;AAAA,EACxC,KAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF;AAMO,IAAM,uBAAA,GAA0B,CAAC,MAAA,EAAQ,UAAA,EAAY,aAAa,QAAQ;AAK1E,IAAM,iBAAA,GAAoB;AAAA,EAC/B,MAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF;AAKO,IAAM,mBAAA,GAAsB,CAAC,SAAA,EAAW,SAAS;AAKjD,IAAM,iBAAA,GAAoB,CAAC,MAAA,EAAQ,MAAA,EAAQ,SAAS,MAAM,CAAA;AAuLjE,IAAM,CAAA,GAAI,CACR,IAAA,EACA,WAAA,EACA,KAAA,GAAiC,EAAC,MACd,EAAE,IAAA,EAAM,WAAA,EAAa,GAAG,KAAA,EAAM,CAAA;AAE7C,IAAM,cAAA,GAA6D;AAAA,EACxE,KAAA,EAAO;AAAA,IACL,WAAA,EAAa,yCAAA;AAAA,IACb,QAAA,EAAU,CAAC,CAAC,CAAA;AAAA,IACZ,MAAA,EAAQ;AAAA,MACN,MAAM,CAAA,CAAE,QAAA,EAAU,4CAA4C,EAAE,QAAA,EAAU,MAAM,CAAA;AAAA,MAChF,QAAA,EAAU,CAAA,CAAE,QAAA,EAAU,8CAAyC,CAAA;AAAA,MAC/D,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAU,+DAA0D;AAAA;AAChF,GACF;AAAA,EACA,KAAA,EAAO;AAAA,IACL,WAAA,EAAa,kEAAA;AAAA,IACb,QAAA,EAAU,CAAC,CAAC,CAAA;AAAA,IACZ,MAAA,EAAQ;AAAA,MACN,MAAM,CAAA,CAAE,QAAA,EAAU,eAAe,EAAE,QAAA,EAAU,MAAM,CAAA;AAAA,MACnD,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAU,mDAA8C,CAAA;AAAA,MAClE,IAAA,EAAM,CAAA,CAAE,QAAA,EAAU,uDAAuD,CAAA;AAAA,MACzE,QAAQ,CAAA,CAAE,QAAA,EAAU,wBAAwB,EAAE,IAAA,EAAM,mBAAmB,CAAA;AAAA,MACvE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAU,mDAAmD,CAAA;AAAA,MACvE,WAAA,EAAa,CAAA,CAAE,QAAA,EAAU,8BAA8B,CAAA;AAAA,MACvD,gBAAA,EAAkB,CAAA,CAAE,SAAA,EAAW,4CAA4C,CAAA;AAAA,MAC3E,OAAA,EAAS,CAAA,CAAE,QAAA,EAAU,iGAA4F,CAAA;AAAA,MACjH,SAAA,EAAW,CAAA,CAAE,QAAA,EAAU,mHAA8G,CAAA;AAAA,MACrI,WAAA,EAAa,CAAA,CAAE,QAAA,EAAU,gHAA2G,CAAA;AAAA,MACpI,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAU,yIAAoI,CAAA;AAAA,MACxJ,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAU,+EAA+E;AAAA;AACrG,GACF;AAAA,EACA,QAAA,EAAU;AAAA,IACR,WAAA,EAAa,qFAAA;AAAA;AAAA;AAAA;AAAA,IAIb,QAAA,EAAU,CAAC,CAAA,EAAG,CAAC,CAAA;AAAA,IACf,MAAA,EAAQ;AAAA,MACN,YAAA,EAAc,CAAA,CAAE,QAAA,EAAU,4DAAA,EAA8D;AAAA,QACtF,IAAA,EAAM;AAAA,OACP,CAAA;AAAA,MACD,QAAA,EAAU,CAAA,CAAE,QAAA,EAAU,qCAAqC,CAAA;AAAA,MAC3D,QAAA,EAAU,CAAA,CAAE,QAAA,EAAU,mCAAmC,CAAA;AAAA,MACzD,SAAA,EAAW,CAAA,CAAE,OAAA,EAAS,oGAAA,EAAiG;AAAA,QACrH,UAAA,EAAY;AAAA,UACV,EAAA,EAAI,+BAAA;AAAA,UACJ,gBAAA,EAAkB,CAAA;AAAA,UAClB,WAAA,EAAa;AAAA;AACf,OACD,CAAA;AAAA,MACD,OAAA,EAAS,CAAA,CAAE,QAAA,EAAU,sDAAsD,CAAA;AAAA,MAC3E,QAAA,EAAU,CAAA,CAAE,QAAA,EAAU,wDAAwD;AAAA;AAChF,GACF;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,WAAA,EAAa,oEAAA;AAAA,IACb,QAAA,EAAU,CAAC,CAAC,CAAA;AAAA,IACZ,MAAA,EAAQ;AAAA,MACN,YAAA,EAAc,CAAA,CAAE,QAAA,EAAU,iCAAiC,CAAA;AAAA,MAC3D,IAAA,EAAM,CAAA,CAAE,QAAA,EAAU,uDAAuD,CAAA;AAAA,MACzE,IAAA,EAAM,CAAA,CAAE,QAAA,EAAU,wDAAwD,CAAA;AAAA,MAC1E,KAAA,EAAO,CAAA,CAAE,QAAA,EAAU,iDAAiD,CAAA;AAAA,MACpE,KAAA,EAAO,CAAA,CAAE,QAAA,EAAU,uDAAuD,CAAA;AAAA,MAC1E,GAAA,EAAK,CAAA,CAAE,OAAA,EAAS,iCAAiC,CAAA;AAAA,MACjD,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAU,kDAAkD,CAAA;AAAA,MACtE,YAAA,EAAc,CAAA,CAAE,QAAA,EAAU,+BAA+B,CAAA;AAAA,MACzD,aAAA,EAAe,CAAA;AAAA,QACb,OAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,YAAA,EAAc,CAAA;AAAA,QACZ,QAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,MAAA,EAAQ,CAAA;AAAA,QACN,QAAA;AAAA,QACA;AAAA;AACF;AACF,GACF;AAAA,EACA,OAAA,EAAS;AAAA,IACP,WAAA,EAAa,gEAAA;AAAA,IACb,QAAA,EAAU,CAAC,CAAC,CAAA;AAAA,IACZ,MAAA,EAAQ;AAAA,MACN,KAAA,EAAO,CAAA,CAAE,QAAA,EAAU,sCAAsC,CAAA;AAAA,MACzD,OAAA,EAAS,CAAA;AAAA,QACP,QAAA;AAAA,QACA;AAAA;AACF;AACF,GACF;AAAA,EACA,OAAA,EAAS;AAAA,IACP,WAAA,EAAa,sDAAA;AAAA,IACb,QAAA,EAAU,CAAC,CAAC,CAAA;AAAA,IACZ,MAAA,EAAQ;AAAA,MACN,QAAA,EAAU,CAAA,CAAE,OAAA,EAAS,gBAAgB,CAAA;AAAA,MACrC,UAAA,EAAY,CAAA,CAAE,OAAA,EAAS,kBAAkB,CAAA;AAAA,MACzC,SAAA,EAAW,CAAA,CAAE,OAAA,EAAS,iBAAiB,CAAA;AAAA,MACvC,UAAA,EAAY,CAAA,CAAE,OAAA,EAAS,6FAA6F;AAAA;AACtH,GACF;AAAA,EACA,QAAA,EAAU;AAAA,IACR,WAAA,EAAa,wEAAA;AAAA,IACb,QAAA,EAAU,CAAC,CAAC,CAAA;AAAA,IACZ,MAAA,EAAQ;AAAA,MACN,WAAA,EAAa,CAAA,CAAE,QAAA,EAAU,2EAAiE;AAAA;AAC5F,GACF;AAAA,EACA,UAAA,EAAY;AAAA,IACV,WAAA,EAAa,0FAAA;AAAA,IACb,QAAA,EAAU,CAAC,CAAC,CAAA;AAAA,IACZ,MAAA,EAAQ;AAAA,MACN,UAAA,EAAY,CAAA,CAAE,OAAA,EAAS,6HAA6H;AAAA;AACtJ,GACF;AAAA,EACA,OAAA,EAAS;AAAA,IACP,WAAA,EAAa,sDAAA;AAAA;AAAA;AAAA,IAGb,QAAA,EAAU,CAAC,CAAA,EAAG,CAAC,CAAA;AAAA,IACf,MAAA,EAAQ;AAAA,MACN,UAAU,CAAA,CAAE,QAAA,EAAU,4BAA4B,EAAE,IAAA,EAAM,yBAAyB,CAAA;AAAA,MACnF,GAAA,EAAK,CAAA,CAAE,QAAA,EAAU,2CAA2C,CAAA;AAAA,MAC5D,WAAA,EAAa,CAAA,CAAE,QAAA,EAAU,+EAAA,EAAiF;AAAA,QACxG,UAAA,EAAY;AAAA,UACV,EAAA,EAAI,gCAAA;AAAA,UACJ,gBAAA,EAAkB,CAAA;AAAA,UAClB,WAAA,EAAa;AAAA;AACf,OACD,CAAA;AAAA,MACD,eAAA,EAAiB,CAAA,CAAE,QAAA,EAAU,mFAAA,EAAqF;AAAA,QAChH,UAAA,EAAY;AAAA,UACV,EAAA,EAAI,oCAAA;AAAA,UACJ,gBAAA,EAAkB,CAAA;AAAA,UAClB,WAAA,EAAa;AAAA;AACf,OACD;AAAA;AACH,GACF;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,WAAA,EAAa,gFAAA;AAAA,IACb,QAAA,EAAU,CAAC,CAAC,CAAA;AAAA,IACZ,MAAA,EAAQ;AAAA,MACN,OAAA,EAAS,CAAA,CAAE,QAAA,EAAU,mCAAmC,CAAA;AAAA,MACxD,QAAA,EAAU,CAAA,CAAE,QAAA,EAAU,oCAAoC,CAAA;AAAA,MAC1D,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAU,uBAAuB,CAAA;AAAA,MAC3C,QAAA,EAAU,CAAA,CAAE,QAAA,EAAU,oDAAoD;AAAA;AAC5E,GACF;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,WAAA,EAAa,uFAAA;AAAA,IACb,QAAA,EAAU,CAAC,CAAC,CAAA;AAAA,IACZ,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,CAAA,CAAE,QAAA,EAAU,8BAA8B,CAAA;AAAA,MAChD,QAAA,EAAU,CAAA,CAAE,QAAA,EAAU,sCAAsC,CAAA;AAAA,MAC5D,IAAA,EAAM,CAAA,CAAE,QAAA,EAAU,uCAAuC,CAAA;AAAA,MACzD,YAAA,EAAc,CAAA,CAAE,QAAA,EAAU,mCAAmC,CAAA;AAAA,MAC7D,sBAAA,EAAwB,CAAA,CAAE,QAAA,EAAU,kDAAkD,CAAA;AAAA,MACtF,UAAA,EAAY,CAAA,CAAE,QAAA,EAAU,oDAA+C,CAAA;AAAA,MACvE,MAAA,EAAQ,CAAA,CAAE,OAAA,EAAS,iDAAiD;AAAA;AACtE;AAEJ;AAEO,IAAM,mBAAA,GAAsB,MAAA,CAAO,IAAA,CAAK,cAAc;AAItD,SAAS,oBAAoB,IAAA,EAAoC;AACtE,EAAA,MAAM,IAAA,GAAO,eAAe,IAAI,CAAA;AAChC,EAAA,MAAM,UAAA,GAAyC;AAAA,IAC7C,OAAA,EAAS;AAAA,MACP,IAAA,EAAM,SAAA;AAAA,MACN,WAAA,EAAa,yBAAyB,IAAI,CAAA,qBAAA,EAAwB,KAAK,QAAA,CAAS,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA;AAAA,MAC1F,IAAA,EAAM,CAAC,GAAG,IAAA,CAAK,QAAQ;AAAA;AACzB,GACF;AACA,EAAA,MAAM,QAAA,GAAqB,CAAC,SAAS,CAAA;AACrC,EAAA,KAAA,MAAW,CAACmB,QAAO,SAAS,CAAA,IAAK,OAAO,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAA,EAAG;AAC5D,IAAA,MAAM,OAAmB,EAAE,IAAA,EAAM,UAAU,IAAA,EAAM,WAAA,EAAa,UAAU,WAAA,EAAY;AACpF,IAAA,IAAI,UAAU,IAAA,EAAM,IAAA,CAAK,OAAO,CAAC,GAAG,UAAU,IAAI,CAAA;AAClD,IAAA,IAAI,UAAU,UAAA,EAAY;AAIxB,MAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,MAAA,IAAA,CAAK,oBAAoB,CAAA,GAAI,SAAA,CAAU,UAAA,CAAW,EAAA;AAClD,MAAA,IAAA,CAAK,oBAAoB,CAAA,GAAI,SAAA,CAAU,UAAA,CAAW,WAAA;AAClD,MAAA,IAAA,CAAK,mCAAmC,CAAA,GAAI,SAAA,CAAU,UAAA,CAAW,gBAAA;AAAA,IACnE;AACA,IAAA,UAAA,CAAWA,MAAK,CAAA,GAAI,IAAA;AACpB,IAAA,IAAI,SAAA,CAAU,QAAA,EAAU,QAAA,CAAS,IAAA,CAAKA,MAAK,CAAA;AAAA,EAC7C;AACA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,QAAA;AAAA,IACN,aAAa,IAAA,CAAK,WAAA;AAAA,IAClB,UAAA;AAAA,IACA;AAAA,GACF;AACF;AAUO,SAAS,YAAY,KAAA,EAAyB;AACnD,EAAA,IAAI,KAAA,KAAU,MAAM,OAAO,IAAA;AAC3B,EAAA,MAAM,IAAI,OAAO,KAAA;AACjB,EAAA,IAAI,MAAM,QAAA,IAAY,CAAA,KAAM,QAAA,IAAY,CAAA,KAAM,WAAW,OAAO,IAAA;AAChE,EAAA,IAAI,MAAM,OAAA,CAAQ,KAAK,GAAG,OAAO,KAAA,CAAM,MAAM,WAAW,CAAA;AACxD,EAAA,IAAI,MAAM,QAAA,EAAU;AAClB,IAAA,MAAM,MAAA,GAAS,KAAA;AACf,IAAA,IAAI,UAAA,IAAc,QAAQ,OAAO,KAAA;AACjC,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,cAAA,CAAe,MAAM,CAAA;AAC1C,IAAA,IAAI,KAAA,KAAU,MAAA,CAAO,SAAA,IAAa,KAAA,KAAU,MAAM,OAAO,KAAA;AAGzD,IAAA,OAAO,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,KAAM,CAAA,KAAM,MAAA,IAAa,WAAA,CAAY,CAAC,CAAC,CAAA;AAAA,EAC7E;AACA,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,SAAS,KAAA,EAAkD;AACzE,EAAA,OAAO,OAAO,UAAU,QAAA,IAAY,KAAA,KAAU,QAAQ,CAAC,KAAA,CAAM,QAAQ,KAAK,CAAA;AAC5E;AAIO,SAAS,QAA2C,GAAA,EAAW;AACpE,EAAA,MAAM,MAA+B,EAAC;AACtC,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,EAAG;AAC9C,IAAA,IAAI,KAAA,KAAU,MAAA,EAAW,GAAA,CAAI,GAAG,CAAA,GAAI,KAAA;AAAA,EACtC;AACA,EAAA,OAAO,GAAA;AACT;;;ACtTO,IAAM,yBAAA,GAA4B;AAAA,EACvC,aAAA;AAAA,EACA,eAAA;AAAA,EACA,gBAAA;AAAA,EACA,cAAA;AAAA,EACA,gBAAA;AAAA,EACA,oBAAA;AAAA,EACA,cAAA;AAAA,EACA,mBAAA;AAAA,EACA,aAAA;AAAA,EACA,eAAA;AAAA,EACA,eAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,YAAA;AAAA,EACA,cAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF;ACvJO,IAAM,wBAAwB,CAAC,MAAA,EAAQ,SAAA,EAAW,SAAA,EAAW,cAAc,SAAS;AAE3F,IAAM,qBAAA,uBAA4B,GAAA,CAAI,CAAC,QAAQ,IAAA,EAAM,OAAA,EAAS,UAAA,EAAY,MAAM,CAAC,CAAA;AAIjF,IAAM,cAAA,GAAiB,CAAC,QAAA,EAAU,QAAQ,CAAA;AAG1C,IAAM,kBAAkB,CAAC,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAQ,UAAU,WAAW,CAAA;AAEpE,IAAM,UAAA,GAAa,CAAC,GAAG,IAAI,GAAA,CAAI,gBAAA,CAAiB,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,IAAI,CAAC,CAAC,CAAA;AAEzE,SAAS,aAAa,IAAA,EAAwB;AAC5C,EAAA,OAAO,gBAAA,CAAiB,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,IAAA,KAAS,IAAI,CAAA,CAAE,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,IAAI,CAAA;AACtF;AAIA,IAAM,gBAAA,GAAsD;AAAA,EAC1D,MAAM,EAAC;AAAA,EACP,SAAS,EAAC;AAAA,EACV,OAAA,EAAS,CAAC,MAAM,CAAA;AAAA,EAChB,UAAA,EAAY,CAAC,MAAM;AACrB,CAAA;AAIA,IAAM,gBAAA,GAAsD;AAAA,EAC1D,aAAA,EAAe,CAAC,MAAM;AACxB,CAAA;AASA,IAAI,aAAA,uBAAiC,GAAA,EAAI;AAEzC,SAAS,cAAA,CAAe,MAAA,EAAgB,IAAA,EAAc,KAAA,EAAsB;AAC1E,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,CAAC,KAAA,EAAO;AACzC,EAAA,IAAI,CAAC,aAAA,CAAc,GAAA,CAAI,KAAK,CAAA,EAAG;AAC7B,IAAA,IAAA;AAAA,MACE,MAAA;AAAA,MACA,IAAA;AAAA,MACA,gBAAA;AAAA,MACA,WAAW,KAAK,CAAA,wDAAA,CAAA;AAAA,MAChB,CAAC,GAAG,aAAa,CAAA,CAAE,IAAA;AAAK,KAC1B;AAAA,EACF;AACF;AAEA,SAAS,IAAA,CAAK,MAAA,EAAgB,IAAA,EAAc,IAAA,EAAc,SAAiB,KAAA,EAAiC;AAC1G,EAAA,MAAA,CAAO,KAAK,KAAA,GAAQ,EAAE,IAAA,EAAM,IAAA,EAAM,SAAS,KAAA,EAAO,CAAC,GAAG,KAAK,GAAE,GAAI,EAAE,IAAA,EAAM,IAAA,EAAM,SAAS,CAAA;AAC1F;AAIA,SAAS,cAAc,KAAA,EAA0C;AAC/D,EAAA,IAAI,WAAW,KAAA,EAAO;AACpB,IAAA,MAAM,QAAQ,KAAA,CAAM,KAAA;AACpB,IAAA,OAAO,SAAS,KAAK,CAAA,GAAI,OAAO,IAAA,CAAK,KAAK,IAAI,EAAC;AAAA,EACjD;AACA,EAAA,OAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,CAAE,MAAA,CAAO,CAAC,GAAA,KAAQ,CAAC,qBAAA,CAAsB,GAAA,CAAI,GAAG,CAAC,CAAA;AAC3E;AA8BA,SAAS,sBACP,MAAA,EACA,UAAA,EACA,UACA,MAAA,EACA,KAAA,EACA,cAAc,EAAA,EACR;AACN,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,OAAA,CAAQ,EAAE,CAAA;AAC/B,IAAA,IAAI,UAAU,MAAA,EAAW;AACzB,IAAA,MAAM,SAAA,GAAY,CAAA,EAAG,UAAU,CAAA,CAAA,EAAI,QAAQ,EAAE,CAAA,CAAA;AAC7C,IAAA,MAAM,KAAA,GAAQ,CAAA,EAAG,WAAW,CAAA,EAAG,QAAQ,EAAE,CAAA,CAAA;AACzC,IAAA,IAAI,OAAA,CAAQ,SAAS,QAAA,EAAU;AAC7B,MAAA,cAAA,CAAe,MAAA,EAAQ,WAAW,KAAK,CAAA;AACvC,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,OAAA,CAAQ,IAAA,KAAS,MAAA,IAAU,CAAC,OAAA,CAAQ,EAAA,EAAI,MAAA,IAAU,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC7E,IAAA,MAAM,KAAK,OAAA,CAAQ,EAAA;AACnB,IAAA,MAAM,QAAA,GAAW,kBAAkB,EAAE,CAAA;AACrC,IAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,EAAM,KAAA,KAAU;AAG7B,MAAA,IAAI,CAAC,QAAA,CAAS,IAAI,CAAA,EAAG;AACrB,MAAA,MAAM,QAAA,GAAW,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,CAAA;AACtC,MAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,EAAG;AACnC,QAAA,IAAI,CAAC,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA,EAAG;AACtB,UAAA,IAAA;AAAA,YACE,MAAA;AAAA,YACA,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA;AAAA,YAClB,KAAA,CAAM,IAAA;AAAA,YACN,CAAA,EAAG,MAAM,OAAO,CAAA,aAAA,EAAgB,MAAM,IAAI,CAAA,EAAA,EAAK,KAAK,CAAA,GAAA,EAAM,GAAG,CAAA,CAAA,CAAA;AAAA,YAC7D,CAAC,GAAG,QAAQ,CAAA,CAAE,IAAA;AAAK,WACrB;AAAA,QACF;AAAA,MACF;AACA,MAAA,qBAAA,CAAsB,QAAQ,QAAA,EAAU,EAAA,EAAI,MAAM,KAAA,EAAO,CAAA,EAAG,KAAK,CAAA,GAAA,CAAK,CAAA;AAAA,IACxE,CAAC,CAAA;AAAA,EACH;AACF;AAMA,SAAS,kBACP,MAAA,EACA,IAAA,EACA,aAAA,EACA,QAAA,EACA,SACA,KAAA,EACM;AACN,EAAA,MAAM,QAAA,GACJ,OAAA,CAAQ,IAAA,KAAS,QAAA,GAAW,QAAA,GAAW,OAAA,CAAQ,IAAA,KAAS,SAAA,GAAY,SAAA,GAAY,OAAA,CAAQ,IAAA,KAAS,MAAA,GAAS,OAAA,GAAU,QAAA;AACtH,EAAA,MAAM,SAAS,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,UAAU,OAAO,KAAA;AACvD,EAAA,IAAI,WAAW,QAAA,EAAU;AACvB,IAAA,IAAA;AAAA,MACE,MAAA;AAAA,MACA,IAAA;AAAA,MACA,eAAA;AAAA,MACA,CAAA,QAAA,EAAW,QAAQ,CAAA,SAAA,EAAY,OAAA,CAAQ,EAAE,CAAA,UAAA,EAAa,QAAQ,SAAS,MAAM,CAAA;AAAA,KAC/E;AACA,IAAA;AAAA,EACF;AACA,EAAA,IAAI,OAAA,CAAQ,SAAS,QAAA,IAAY,OAAA,CAAQ,SAAS,MAAA,IAAU,OAAO,UAAU,QAAA,EAAU;AACrF,IAAA,MAAM,UAAU,OAAA,CAAQ,OAAA,CAAQ,IAAI,CAAC,MAAA,KAAW,OAAO,KAAK,CAAA;AAC5D,IAAA,IAAI,CAAC,OAAA,CAAQ,QAAA,CAAS,KAAK,CAAA,EAAG;AAC5B,MAAA,IAAA,CAAK,MAAA,EAAQ,MAAM,eAAA,EAAiB,CAAA,CAAA,EAAI,KAAK,CAAA,iBAAA,EAAoB,OAAA,CAAQ,EAAE,CAAA,CAAA,EAAI,OAAO,CAAA;AAAA,IACxF;AAAA,EACF;AACA,EAAA,IAAI,QAAQ,IAAA,KAAS,QAAA,EAAU,cAAA,CAAe,MAAA,EAAQ,MAAM,KAAK,CAAA;AAIjE,EAAA,IAAI,OAAA,CAAQ,SAAS,MAAA,EAAQ;AAC3B,IAAA,qBAAA;AAAA,MACE,MAAA;AAAA,MACA,aAAA;AAAA,MACA,CAAC,OAAO,CAAA;AAAA,MACR,EAAE,CAAC,OAAA,CAAQ,EAAE,GAAG,KAAA,EAAM;AAAA,MACtB,EAAE,SAAS,CAAA,QAAA,EAAW,QAAQ,KAAK,IAAA,EAAM,OAAA,EAAS,MAAM,sBAAA;AAAuB,KACjF;AAAA,EACF;AACF;AAQA,SAAS,iBAAA,CACP,MAAA,EACA,SAAA,EACA,SAAA,EACA,OACA,cAAA,EACM;AACN,EAAA,IAAI,CAAC,QAAA,CAAS,KAAK,CAAA,EAAG;AACpB,IAAA,IAAA,CAAK,MAAA,EAAQ,CAAA,EAAG,SAAS,CAAA,KAAA,CAAA,EAAS,iBAAiB,6CAA6C,CAAA;AAChG,IAAA;AAAA,EACF;AACA,EAAA,MAAM,aAAA,GAAgBX,YAAAA,CAAa,SAAS,CAAA,EAAG,QAAA;AAC/C,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,IAAI,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAChD,IAAA,MAAM,QAAA,GAAW,CAAA,EAAG,SAAS,CAAA,MAAA,EAAS,IAAI,CAAA,CAAA;AAC1C,IAAA,IAAI,CAAC,QAAA,CAAS,IAAI,CAAA,IAAK,OAAO,KAAK,MAAA,KAAW,QAAA,IAAY,CAAC,IAAA,CAAK,MAAA,EAAQ;AACtE,MAAA,IAAA,CAAK,MAAA,EAAQ,QAAA,EAAU,eAAA,EAAiB,kDAAkD,CAAA;AAC1F,MAAA;AAAA,IACF;AACA,IAAA,IAAI,CAAC,cAAA,CAAe,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA,EAAG;AACpC,MAAA,IAAA,CAAK,MAAA,EAAQ,CAAA,EAAG,QAAQ,CAAA,OAAA,CAAA,EAAW,gBAAA,EAAkB,WAAW,IAAA,CAAK,MAAM,CAAA,mBAAA,CAAA,EAAuB,WAAA,EAAa,CAAA;AAC/G,MAAA;AAAA,IACF;AAKA,IAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,EAAG;AACnC,MAAA,IAAI,CAAC,cAAA,CAAe,QAAA,CAAS,GAAG,CAAA,EAAG;AACjC,QAAA,IAAA,CAAK,MAAA,EAAQ,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,GAAG,IAAI,eAAA,EAAiB,CAAA,0BAAA,EAA6B,GAAG,CAAA,CAAA,CAAA,EAAK,cAAc,CAAA;AAAA,MACzG;AAAA,IACF;AACA,IAAA,IAAI,IAAA,CAAK,WAAW,MAAA,EAAW;AAC/B,IAAA,IAAI,CAAC,QAAA,CAAS,IAAA,CAAK,MAAM,CAAA,EAAG;AAC1B,MAAA,IAAA,CAAK,MAAA,EAAQ,CAAA,EAAG,QAAQ,CAAA,OAAA,CAAA,EAAW,iBAAiB,6BAA6B,CAAA;AACjF,MAAA;AAAA,IACF;AACA,IAAA,MAAM,iBAAiB,cAAA,CAAe,QAAA,CAAS,IAAA,CAAK,MAAM,GAAG,IAAA,CAAK,QAAA;AAClE,IAAA,MAAM,oBAAA,GAAuB,cAAA,GAAiB,iBAAA,CAAkB,cAAc,CAAA,GAAI,IAAA;AAClF,IAAA,KAAA,MAAW,CAAC,OAAO,UAAU,CAAA,IAAK,OAAO,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAA,EAAG;AAC7D,MAAA,MAAM,SAAA,GAAY,CAAA,EAAG,QAAQ,CAAA,QAAA,EAAW,KAAK,CAAA,CAAA;AAC7C,MAAA,MAAM,UAAU,cAAA,EAAgB,IAAA,CAAK,CAACb,EAAAA,KAAMA,EAAAA,CAAE,OAAO,KAAK,CAAA;AAC1D,MAAA,IAAI,oBAAA,IAAwB,CAAC,oBAAA,CAAqB,GAAA,CAAI,KAAK,CAAA,EAAG;AAC5D,QAAA,IAAA;AAAA,UACE,MAAA;AAAA,UACA,SAAA;AAAA,UACA,sBAAA;AAAA,UACA,CAAA,QAAA,EAAW,IAAA,CAAK,MAAM,CAAA,qBAAA,EAAwB,KAAK,CAAA,CAAA,CAAA;AAAA,UACnD,CAAC,GAAG,oBAAoB,CAAA,CAAE,IAAA;AAAK,SACjC;AACA,QAAA;AAAA,MACF;AACA,MAAA,IAAIiD,gBAAAA,CAAiB,UAAU,CAAA,EAAG;AAChC,QAAA,IAAI,CAAC,cAAA,CAAe,QAAA,CAAS,UAAA,CAAW,MAAM,CAAA,EAAG;AAC/C,UAAA,IAAA;AAAA,YACE,MAAA;AAAA,YACA,SAAA;AAAA,YACA,qBAAA;AAAA,YACA,cAAA,CAAe,SACX,CAAA,QAAA,EAAW,UAAA,CAAW,MAAM,CAAA,mCAAA,CAAA,GAC5B,CAAA,QAAA,EAAW,WAAW,MAAM,CAAA,uDAAA,CAAA;AAAA,YAChC;AAAA,WACF;AAAA,QACF;AACA,QAAA;AAAA,MACF;AACA,MAAA,IAAIC,eAAAA,CAAgB,UAAU,CAAA,EAAG;AAC/B,QAAA,MAAM,UAAA,GAAa,aAAA,GAAgB,iBAAA,CAAkB,aAAa,CAAA,GAAI,IAAA;AACtE,QAAA,IAAI,cAAc,CAAC,UAAA,CAAW,GAAA,CAAI,UAAA,CAAW,KAAK,CAAA,EAAG;AACnD,UAAA,IAAA;AAAA,YACE,MAAA;AAAA,YACA,SAAA;AAAA,YACA,sBAAA;AAAA,YACA,CAAA,OAAA,EAAU,UAAA,CAAW,KAAK,CAAA,6BAAA,EAAgC,SAAS,CAAA,CAAA,CAAA;AAAA,YACnE,CAAC,GAAG,UAAU,CAAA,CAAE,IAAA;AAAK,WACvB;AAAA,QACF;AACA,QAAA;AAAA,MACF;AACA,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,iBAAA,CAAkB,MAAA,EAAQ,WAAW,CAAA,EAAG,QAAQ,WAAW,IAAA,CAAK,MAAA,EAAQ,SAAS,UAAU,CAAA;AAAA,MAC7F;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,iBAAA,CACP,MAAA,EACA,IAAA,EACA,KAAA,EACA,cAAA,EACM;AACN,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACzB,IAAA,IAAA,CAAK,QAAQ,IAAA,EAAM,eAAA,EAAiB,CAAA,iCAAA,EAAoC,OAAO,KAAK,CAAA,CAAE,CAAA;AACtF,IAAA;AAAA,EACF;AACA,EAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,KAAA,EAAO,KAAA,KAAU;AAC9B,IAAA,MAAM,SAAA,GAAY,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,CAAA;AAClC,IAAA,IAAI,CAAC,QAAA,CAAS,KAAK,CAAA,EAAG;AACpB,MAAA,IAAA,CAAK,MAAA,EAAQ,SAAA,EAAW,eAAA,EAAiB,+CAA+C,CAAA;AACxF,MAAA;AAAA,IACF;AACA,IAAA,MAAM,OAAO,KAAA,CAAM,IAAA;AACnB,IAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,CAAC,IAAA,EAAM;AACrC,MAAA,IAAA,CAAK,MAAA,EAAQ,CAAA,EAAG,SAAS,CAAA,KAAA,CAAA,EAAS,iBAAiB,4CAA4C,CAAA;AAC/F,MAAA;AAAA,IACF;AACA,IAAA,IAAI,CAAC,aAAA,CAAc,GAAA,CAAI,IAAI,CAAA,EAAG;AAC5B,MAAA,IAAA;AAAA,QACE,MAAA;AAAA,QACA,GAAG,SAAS,CAAA,KAAA,CAAA;AAAA,QACZ,eAAA;AAAA,QACA,UAAU,IAAI,CAAA,mBAAA,CAAA;AAAA,QACd,aAAA,CAAc,GAAA,EAAI,CAAE,IAAA;AAAK,OAC3B;AACA,MAAA;AAAA,IACF;AACA,IAAA,MAAM,QAAA,GAAWrC,YAAAA,CAAa,IAAI,CAAA,EAAG,QAAA;AACrC,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAM,QAAA,GAAW,kBAAkB,QAAQ,CAAA;AAC3C,MAAA,KAAA,MAAW,GAAA,IAAO,aAAA,CAAc,KAAK,CAAA,EAAG;AACtC,QAAA,IAAI,CAAC,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA,EAAG;AACtB,UAAA,IAAA;AAAA,YACE,MAAA;AAAA,YACA,CAAA,EAAG,SAAS,CAAA,OAAA,EAAU,GAAG,CAAA,CAAA;AAAA,YACzB,iBAAA;AAAA,YACA,CAAA,OAAA,EAAU,IAAI,CAAA,uBAAA,EAA0B,GAAG,CAAA,CAAA,CAAA;AAAA,YAC3C,CAAC,GAAG,QAAQ,CAAA,CAAE,IAAA;AAAK,WACrB;AAAA,QACF;AAAA,MACF;AAKA,MAAA,MAAM,QAAQ,QAAA,CAAS,KAAA,CAAM,KAAK,CAAA,GAAI,MAAM,KAAA,GAAQ,KAAA;AACpD,MAAA,qBAAA,CAAsB,MAAA,EAAQ,CAAA,EAAG,SAAS,CAAA,MAAA,CAAA,EAAU,UAAU,KAAA,EAAO;AAAA,QACnE,OAAA,EAAS,UAAU,IAAI,CAAA,CAAA,CAAA;AAAA,QACvB,IAAA,EAAM,SAAA;AAAA,QACN,IAAA,EAAM;AAAA,OACP,CAAA;AAAA,IACH;AACA,IAAA,IAAI,MAAA,IAAU,KAAA,IAAS,KAAA,CAAM,IAAA,KAAS,MAAA,EAAW;AAC/C,MAAA,iBAAA,CAAkB,MAAA,EAAQ,SAAA,EAAW,IAAA,EAAM,KAAA,CAAM,MAAM,cAAc,CAAA;AAAA,IACvE;AACA,IAAA,IAAI,UAAA,IAAc,KAAA,IAAS,KAAA,CAAM,QAAA,KAAa,MAAA,EAAW;AACvD,MAAA,iBAAA,CAAkB,QAAQ,CAAA,EAAG,SAAS,CAAA,SAAA,CAAA,EAAa,KAAA,CAAM,UAAU,cAAc,CAAA;AAAA,IACnF;AAAA,EACF,CAAC,CAAA;AACH;AAaA,SAAS,kBACP,MAAA,EACA,IAAA,EACA,KAAA,EACA,cAAA,GAAoC,EAAC,EAC/B;AACN,EAAA,iBAAA,CAAkB,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAO,cAAc,CAAA;AACrD,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC3B,EAAA,MAAM,KAAA,GAAQ,aAAa,KAA8B,CAAA;AACzD,EAAA,KAAA,MAAW,SAAA,IAAasC,qBAAAA,CAAsB,KAAK,CAAA,EAAG;AACpD,IAAA,IAAA,CAAK,MAAA,EAAQ,CAAA,EAAG,IAAI,CAAA,EAAG,SAAA,CAAU,IAAI,CAAA,CAAA,EAAI,SAAA,CAAU,IAAA,EAAM,SAAA,CAAU,MAAA,EAAQ,SAAA,CAAU,KAAK,CAAA;AAAA,EAC5F;AACF;AAEA,SAAS,kBAAkB,QAAA,EAAgD;AACzE,EAAA,OAAO,IAAI,IAAI,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,KAAY,OAAA,CAAQ,EAAE,CAAC,CAAA;AACtD;AAOA,IAAM,SAAA,GAAY,yBAAA;AAElB,SAAS,aAAA,CAAc,QAAgB,OAAA,EAAwC;AAC7E,EAAA,KAAA,MAAW3B,UAAS,kBAAA,EAAoB;AACtC,IAAA,MAAM,KAAA,GAAQ,QAAQA,MAAK,CAAA;AAC3B,IAAA,IAAI,UAAU,MAAA,EAAW;AACzB,IAAA,IAAI,CAAC,QAAA,CAAS,KAAK,CAAA,EAAG;AACtB,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAChD,MAAA,MAAM,IAAA,GAAO,CAAA,MAAA,EAASA,MAAK,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA;AAClC,MAAA,IAAI,CAAC,SAAA,CAAU,IAAA,CAAK,GAAG,CAAA,EAAG;AACxB,QAAA,IAAA;AAAA,UACE,MAAA;AAAA,UACA,IAAA;AAAA,UACA,mBAAA;AAAA,UACA,CAAA,CAAA,EAAI,GAAG,CAAA,wCAAA,EAA2C,sBAAA,CAAuBA,MAAK,CAAC,CAAA,CAAA,EAAI,GAAG,CAAA,yBAAA,EAAuB,SAAS,CAAA;AAAA,SACxH;AAAA,MACF;AACA,MAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,QAAA,IAAA,CAAK,MAAA,EAAQ,MAAM,eAAA,EAAiB,CAAA,EAAA,EAAKA,MAAK,CAAA,kCAAA,EAAqC,OAAO,KAAK,CAAA,CAAE,CAAA;AAAA,MACnG;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,uBAAA,CACP,MAAA,EACA,IAAA,EACA,OAAA,EACS;AACT,EAAA,MAAM,IAAA,GAAO,eAAe,IAAI,CAAA;AAChC,EAAA,MAAM,UAAU,OAAA,CAAQ,OAAA;AACxB,EAAA,IAAI,OAAO,YAAY,QAAA,IAAY,CAAC,KAAK,QAAA,CAAS,QAAA,CAAS,OAAO,CAAA,EAAG;AACnE,IAAA,IAAA;AAAA,MACE,MAAA;AAAA,MACA,GAAG,IAAI,CAAA,QAAA,CAAA;AAAA,MACP,6BAAA;AAAA,MACA,YAAY,IAAI,CAAA,mBAAA,EAAsB,IAAA,CAAK,SAAA,CAAU,OAAO,CAAC,CAAA,oCAAA,CAAA;AAAA,MAC7D,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,MAAM;AAAA,KAC1B;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA;AAC1C,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,EAAG;AACtC,IAAA,IAAI,QAAQ,SAAA,EAAW;AACvB,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,MAAA,CAAO,GAAG,CAAA;AACjC,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,IAAA,CAAK,MAAA,EAAQ,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,eAAA,EAAiB,CAAA,SAAA,EAAY,IAAI,CAAA,gBAAA,EAAmB,GAAG,CAAA,CAAA,CAAA,EAAK,UAAU,CAAA;AACrG,MAAA;AAAA,IACF;AAMA,IAAA,MAAM,aAAa,SAAA,CAAU,UAAA;AAC7B,IAAA,IAAI,UAAA,IAAc,OAAA,IAAW,UAAA,CAAW,gBAAA,EAAkB;AACxD,MAAA,IAAA;AAAA,QACE,MAAA;AAAA,QACA,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA;AAAA,QACd,eAAA;AAAA,QACA,CAAA,OAAA,EAAU,IAAI,CAAA,CAAA,EAAI,GAAG,CAAA,iBAAA,EAAoB,IAAI,CAAA,SAAA,EAAY,UAAA,CAAW,gBAAgB,CAAA,cAAA,EAClE,UAAA,CAAW,EAAE,oCAAoC,OAAO,CAAA,CAAA;AAAA,QAC1E,CAAC,WAAW,WAAW;AAAA,OACzB;AACA,MAAA;AAAA,IACF;AACA,IAAA,MAAM,KAAA,GAAQ,QAAQ,GAAG,CAAA;AACzB,IAAA,MAAM,SAAS,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,UAAU,OAAO,KAAA;AACvD,IAAA,IAAI,MAAA,KAAW,UAAU,IAAA,EAAM;AAC7B,MAAA,IAAA;AAAA,QACE,MAAA;AAAA,QACA,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA;AAAA,QACd,eAAA;AAAA,QACA,CAAA,OAAA,EAAU,IAAI,CAAA,CAAA,EAAI,GAAG,aAAa,SAAA,CAAU,IAAI,SAAS,MAAM,CAAA;AAAA,OACjE;AACA,MAAA;AAAA,IACF;AACA,IAAA,IAAI,SAAA,CAAU,IAAA,IAAQ,OAAO,KAAA,KAAU,QAAA,IAAY,CAAC,SAAA,CAAU,IAAA,CAAK,QAAA,CAAS,KAAK,CAAA,EAAG;AAClF,MAAA,IAAA;AAAA,QACE,MAAA;AAAA,QACA,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA;AAAA,QACd,eAAA;AAAA,QACA,CAAA,CAAA,EAAI,KAAK,CAAA,iBAAA,EAAoB,IAAI,IAAI,GAAG,CAAA,CAAA;AAAA,QACxC,SAAA,CAAU;AAAA,OACZ;AAAA,IACF;AAAA,EACF;AACA,EAAA,KAAA,MAAW,CAACA,QAAO,SAAS,CAAA,IAAK,OAAO,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAA,EAAG;AAC5D,IAAA,IAAI,SAAA,CAAU,QAAA,IAAY,OAAA,CAAQA,MAAK,MAAM,MAAA,EAAW;AACtD,MAAA,IAAA,CAAK,MAAA,EAAQ,CAAA,EAAG,IAAI,CAAA,CAAA,EAAIA,MAAK,CAAA,CAAA,EAAI,eAAA,EAAiB,CAAA,SAAA,EAAY,IAAI,CAAA,YAAA,EAAeA,MAAK,CAAA,CAAA,CAAG,CAAA;AAAA,IAC3F;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,gBAAA,CAAiB,QAAgB,OAAA,EAAwC;AAChF,EAAA,MAAM,WAAW,OAAA,CAAQ,QAAA;AACzB,EAAA,IAAI,QAAA,CAAS,QAAQ,CAAA,EAAG;AACtB,IAAA,IAAI,QAAA,CAAS,SAAS,MAAA,EAAW;AAC/B,MAAA,IAAI,OAAO,SAAS,IAAA,KAAS,QAAA,IAAY,CAAE,mBAAA,CAA0C,QAAA,CAAS,QAAA,CAAS,IAAI,CAAA,EAAG;AAC5G,QAAA,IAAA;AAAA,UACE,MAAA;AAAA,UACA,wBAAA;AAAA,UACA,eAAA;AAAA,UACA,CAAA,CAAA,EAAI,MAAA,CAAO,QAAA,CAAS,IAAI,CAAC,CAAA,uBAAA,CAAA;AAAA,UACzB;AAAA,SACF;AAAA,MACF;AAAA,IACF;AACA,IAAA,IAAI,QAAA,CAAS,YAAY,MAAA,EAAW;AAClC,MAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,OAAO,CAAA,EAAG;AACpC,QAAA,IAAA,CAAK,MAAA,EAAQ,2BAAA,EAA6B,eAAA,EAAiB,mCAAmC,CAAA;AAAA,MAChG,CAAA,MAAO;AACL,QAAA,QAAA,CAAS,OAAA,CAAQ,OAAA,CAAQ,CAAC,MAAA,EAAQ,KAAA,KAAU;AAC1C,UAAA,IAAI,OAAO,MAAA,KAAW,QAAA,IAAY,CAAE,0BAAA,CAAiD,QAAA,CAAS,MAAM,CAAA,EAAG;AACrG,YAAA,IAAA;AAAA,cACE,MAAA;AAAA,cACA,6BAA6B,KAAK,CAAA,CAAA,CAAA;AAAA,cAClC,eAAA;AAAA,cACA,CAAA,CAAA,EAAI,MAAA,CAAO,MAAM,CAAC,CAAA,yBAAA,CAAA;AAAA,cAClB;AAAA,aACF;AAAA,UACF;AAAA,QACF,CAAC,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACA,EAAA,MAAM,YAAY,OAAA,CAAQ,SAAA;AAC1B,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAA,EAAG;AAC5B,IAAA,SAAA,CAAU,OAAA,CAAQ,CAAC,QAAA,EAAU,KAAA,KAAU;AACrC,MAAA,IAAI,CAAC,QAAA,CAAS,QAAQ,CAAA,IAAK,OAAO,QAAA,CAAS,IAAA,KAAS,QAAA,IAAY,OAAO,QAAA,CAAS,OAAA,KAAY,QAAA,EAAU;AACpG,QAAA,IAAA;AAAA,UACE,MAAA;AAAA,UACA,sBAAsB,KAAK,CAAA,CAAA,CAAA;AAAA,UAC3B,eAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AACF;AAGA,IAAM,YAAA,GAAe,sBAAA;AAErB,SAAS,oBAAA,CAAqB,MAAA,EAAgB,QAAA,EAAkB,KAAA,EAAsB;AACpF,EAAA,IAAI,CAAC,QAAA,CAAS,KAAK,CAAA,EAAG;AACpB,IAAA,IAAA,CAAK,MAAA,EAAQ,QAAA,EAAU,eAAA,EAAiB,4DAA4D,CAAA;AACpG,IAAA;AAAA,EACF;AACA,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAoB;AAC3C,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,IAAI,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAChD,IAAA,MAAM,QAAA,GAAW,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AACpC,IAAA,IAAI,CAAC,YAAA,CAAa,IAAA,CAAK,IAAI,CAAA,EAAG;AAC5B,MAAA,IAAA;AAAA,QACE,MAAA;AAAA,QACA,QAAA;AAAA,QACA,eAAA;AAAA,QACA,CAAA,CAAA,EAAI,IAAI,CAAA,4BAAA,EAA+B,IAAI,gCAA2B,YAAY,CAAA;AAAA,OACpF;AAAA,IACF;AACA,IAAA,IAAI,CAAC,QAAA,CAAS,IAAI,CAAA,IAAK,IAAA,CAAK,WAAW,MAAA,EAAW;AAChD,MAAA,IAAA,CAAK,MAAA,EAAQ,QAAA,EAAU,eAAA,EAAiB,kDAAkD,CAAA;AAC1F,MAAA;AAAA,IACF;AACA,IAAA,IAAI,KAAK,KAAA,KAAU,MAAA,IAAa,OAAO,IAAA,CAAK,UAAU,QAAA,EAAU;AAC9D,MAAA,IAAA,CAAK,MAAA,EAAQ,GAAG,QAAQ,CAAA,MAAA,CAAA,EAAU,iBAAiB,CAAA,0BAAA,EAA6B,OAAO,IAAA,CAAK,KAAK,CAAA,CAAE,CAAA;AAAA,IACrG;AACA,IAAA,IAAI,SAAA,GAAY,IAAI,IAAI,CAAA,CAAA;AACxB,IAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAW;AAC3B,MAAA,IAAI,OAAO,KAAK,IAAA,KAAS,QAAA,IAAY,CAAC,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,EAAG;AAC/D,QAAA,IAAA,CAAK,MAAA,EAAQ,CAAA,EAAG,QAAQ,CAAA,KAAA,CAAA,EAAS,eAAA,EAAiB,CAAA,6BAAA,EAAgC,IAAI,CAAA,QAAA,EAAW,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,MAC9H,CAAA,MAAO;AACL,QAAA,SAAA,GAAY,IAAA,CAAK,IAAA;AAAA,MACnB;AAAA,IACF;AAGA,IAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,GAAA,CAAI,SAAS,CAAA;AACtC,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,IAAA;AAAA,QACE,MAAA;AAAA,QACA,GAAG,QAAQ,CAAA,KAAA,CAAA;AAAA,QACX,wBAAA;AAAA,QACA,CAAA,eAAA,EAAkB,KAAK,CAAA,OAAA,EAAU,IAAI,sBAAsB,SAAS,CAAA,qCAAA;AAAA,OACtE;AAAA,IACF,CAAA,MAAO;AACL,MAAA,UAAA,CAAW,GAAA,CAAI,WAAW,IAAI,CAAA;AAAA,IAChC;AAIA,IAAA,iBAAA,CAAkB,MAAA,EAAQ,GAAG,QAAQ,CAAA,OAAA,CAAA,EAAW,KAAK,MAAA,EAAQ,eAAA,CAAgB,SAAS,CAAC,CAAA;AAAA,EACzF;AACF;AAEA,SAAS,oBAAA,CAAqB,QAAgB,OAAA,EAAwC;AACpF,EAAA,MAAM,OAAO,OAAA,CAAQ,IAAA;AACrB,EAAA,IAAI,QAAA,CAAS,IAAI,CAAA,IAAK,IAAA,CAAK,aAAa,MAAA,EAAW;AACjD,IAAA,iBAAA,CAAkB,MAAA,EAAQ,4BAAA,EAA8B,IAAA,CAAK,QAAQ,CAAA;AAAA,EACvE;AAEA,EAAA,MAAM,QAAQ,OAAA,CAAQ,KAAA;AACtB,EAAA,IAAI,QAAA,CAAS,KAAK,CAAA,EAAG;AACnB,IAAA,MAAM,UAAA,GAAa,CAAC,GAAG,qBAAqB,CAAA;AAC5C,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,IAAI,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAChD,MAAA,MAAM,QAAA,GAAW,sBAAsB,IAAI,CAAA,CAAA;AAC3C,MAAA,IAAI,CAAE,UAAA,CAAwB,QAAA,CAAS,IAAI,CAAA,EAAG;AAC5C,QAAA,IAAA,CAAK,QAAQ,QAAA,EAAU,mBAAA,EAAqB,CAAA,CAAA,EAAI,IAAI,mCAAmC,UAAU,CAAA;AACjG,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,SAAS,SAAA,EAAW;AACtB,QAAA,oBAAA,CAAqB,MAAA,EAAQ,UAAU,IAAI,CAAA;AAC3C,QAAA;AAAA,MACF;AACA,MAAA,IAAI,CAAC,QAAA,CAAS,IAAI,CAAA,IAAK,IAAA,CAAK,WAAW,MAAA,EAAW;AAChD,QAAA,IAAA,CAAK,MAAA,EAAQ,QAAA,EAAU,eAAA,EAAiB,oCAAoC,CAAA;AAC5E,QAAA;AAAA,MACF;AACA,MAAA,iBAAA,CAAkB,MAAA,EAAQ,CAAA,EAAG,QAAQ,CAAA,OAAA,CAAA,EAAW,IAAA,CAAK,QAAQ,gBAAA,CAAiB,IAAI,CAAA,IAAK,EAAE,CAAA;AAAA,IAC3F;AAAA,EACF;AAEA,EAAA,MAAM,QAAQ,OAAA,CAAQ,KAAA;AACtB,EAAA,IAAI,QAAA,CAAS,KAAK,CAAA,EAAG;AACnB,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,SAAS,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AACrD,MAAA,MAAM,QAAA,GAAW,sBAAsB,IAAI,CAAA,CAAA;AAC3C,MAAA,IAAI,CAAE,UAAA,CAAwB,QAAA,CAAS,IAAI,CAAA,EAAG;AAC5C,QAAA,IAAA,CAAK,QAAQ,QAAA,EAAU,mBAAA,EAAqB,CAAA,CAAA,EAAI,IAAI,wBAAwB,UAAU,CAAA;AACtF,QAAA;AAAA,MACF;AACA,MAAA,IAAI,CAAC,QAAA,CAAS,SAAS,CAAA,EAAG;AACxB,QAAA,IAAA,CAAK,MAAA,EAAQ,QAAA,EAAU,eAAA,EAAiB,4CAA4C,CAAA;AACpF,QAAA;AAAA,MACF;AACA,MAAA,MAAM,UAAA,GAAa,aAAa,IAA0B,CAAA;AAC1D,MAAA,KAAA,MAAW,CAAC,QAAA,EAAU,MAAM,KAAK,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA,EAAG;AAC1D,QAAA,MAAM,QAAA,GAAW,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA;AACxC,QAAA,IAAI,CAAC,UAAA,CAAW,QAAA,CAAS,QAAQ,CAAA,EAAG;AAClC,UAAA,IAAA,CAAK,MAAA,EAAQ,UAAU,cAAA,EAAgB,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,EAAI,QAAQ,mBAAmB,UAAU,CAAA;AACxF,UAAA;AAAA,QACF;AACA,QAAA,iBAAA,CAAkB,QAAQ,QAAA,EAAU,MAAA,EAAQ,iBAAiB,IAAI,CAAA,IAAK,EAAE,CAAA;AAAA,MAC1E;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAM,aAAA,GAAgB,mBAAA;AACtB,IAAM,eAAA,GAAkB,mBAAA;AAQxB,SAAS,uBAAA,CAAwB,QAAgB,OAAA,EAAwC;AACvF,EAAA,MAAM,cAAc,OAAA,CAAQ,WAAA;AAC5B,EAAA,IAAI,WAAA,KAAgB,MAAA,IAAa,CAAC,QAAA,CAAS,WAAW,CAAA,EAAG;AACzD,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,WAAW,KAAK,MAAA,CAAO,OAAA,CAAQ,WAAW,CAAA,EAAG;AAC5D,IAAA,MAAM,IAAA,GAAO,wBAAwB,GAAG,CAAA,CAAA;AACxC,IAAA,IAAI,CAAC,aAAA,CAAc,IAAA,CAAK,GAAG,CAAA,EAAG;AAC5B,MAAA,IAAA,CAAK,MAAA,EAAQ,IAAA,EAAM,eAAA,EAAiB,CAAA,CAAA,EAAI,GAAG,CAAA,sDAAA,CAAmD,CAAA;AAAA,IAChG;AACA,IAAA,IAAI,CAAC,QAAA,CAAS,WAAW,CAAA,IAAK,CAAC,QAAA,CAAS,WAAA,CAAY,MAAM,CAAA,IAAK,OAAO,IAAA,CAAK,WAAA,CAAY,MAAM,CAAA,CAAE,WAAW,CAAA,EAAG;AAC3G,MAAA,IAAA,CAAK,MAAA,EAAQ,IAAA,EAAM,eAAA,EAAiB,wFAAmF,CAAA;AACvH,MAAA;AAAA,IACF;AACA,IAAA,MAAM,SAAS,WAAA,CAAY,MAAA;AAC3B,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA;AACrC,IAAA,KAAA,MAAW,CAAC,IAAA,EAAMA,MAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AAClD,MAAA,MAAM,SAAA,GAAY,CAAA,EAAG,IAAI,CAAA,QAAA,EAAW,IAAI,CAAA,CAAA;AACxC,MAAA,IAAI,CAAC,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAA,EAAG;AAC/B,QAAA,IAAA,CAAK,MAAA,EAAQ,SAAA,EAAW,eAAA,EAAiB,CAAA,CAAA,EAAI,IAAI,CAAA,wDAAA,CAAqD,CAAA;AAAA,MACxG;AACA,MAAA,IAAK,sBAAA,CAA6C,QAAA,CAAS,IAAI,CAAA,EAAG;AAChE,QAAA,IAAA,CAAK,QAAQ,SAAA,EAAW,eAAA,EAAiB,CAAA,CAAA,EAAI,IAAI,mCAAmC,sBAAsB,CAAA;AAC1G,QAAA;AAAA,MACF;AACA,MAAA,IAAI,CAAC,QAAA,CAASA,MAAK,KAAK,OAAOA,MAAAA,CAAM,SAAS,QAAA,EAAU;AACtD,QAAA,IAAA,CAAK,MAAA,EAAQ,SAAA,EAAW,eAAA,EAAiB,mEAA8D,CAAA;AACvG,QAAA;AAAA,MACF;AACA,MAAA,IAAI,CAAE,kBAAA,CAAyC,QAAA,CAASA,MAAAA,CAAM,IAAI,CAAA,EAAG;AACnE,QAAA,IAAA,CAAK,MAAA,EAAQ,GAAG,SAAS,CAAA,KAAA,CAAA,EAAS,6BAA6B,CAAA,CAAA,EAAIA,MAAAA,CAAM,IAAI,CAAA,6BAAA,CAAA,EAAiC,kBAAkB,CAAA;AAChI,QAAA;AAAA,MACF;AACA,MAAA,IAAIA,MAAAA,CAAM,SAAS,KAAA,EAAO;AACxB,QAAA,IAAI,OAAOA,MAAAA,CAAM,MAAA,KAAW,QAAA,IAAY,CAACA,OAAM,MAAA,EAAQ;AACrD,UAAA,IAAA,CAAK,MAAA,EAAQ,SAAA,EAAW,eAAA,EAAiB,CAAA,4DAAA,CAA8D,CAAA;AAAA,QACzG,CAAA,MAAO;AACL,UAAA,cAAA,CAAe,MAAA,EAAQ,CAAA,EAAG,SAAS,CAAA,OAAA,CAAA,EAAWA,OAAM,MAAM,CAAA;AAAA,QAC5D;AAAA,MACF;AAAA,IACF;AACA,IAAA,MAAM,QAAQ,WAAA,CAAY,KAAA;AAC1B,IAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,QAAA,EAAU;AAC7C,MAAA,IAAA,CAAK,MAAA,EAAQ,CAAA,EAAG,IAAI,CAAA,MAAA,CAAA,EAAU,eAAA,EAAiB,CAAA,CAAA,EAAI,MAAA,CAAO,KAAK,CAAC,CAAA,wBAAA,CAAA,EAA4B,CAAC,QAAQ,CAAC,CAAA;AAAA,IACxG;AACA,IAAA,MAAM,SAAS,WAAA,CAAY,MAAA;AAC3B,IAAA,IAAI,WAAW,MAAA,EAAW;AACxB,MAAA,IAAI,CAAC,QAAA,CAAS,MAAM,CAAA,EAAG;AACrB,QAAA,IAAA,CAAK,MAAA,EAAQ,CAAA,EAAG,IAAI,CAAA,OAAA,CAAA,EAAW,iBAAiB,oDAAoD,CAAA;AAAA,MACtG,CAAA,MAAO;AACL,QAAA,IAAI,MAAA,CAAO,SAAS,MAAA,IAAa,MAAA,CAAO,SAAS,QAAA,IAAY,MAAA,CAAO,SAAS,OAAA,EAAS;AACpF,UAAA,IAAA,CAAK,MAAA,EAAQ,CAAA,EAAG,IAAI,CAAA,YAAA,CAAA,EAAgB,iBAAiB,CAAA,CAAA,EAAI,MAAA,CAAO,MAAA,CAAO,IAAI,CAAC,CAAA,4BAAA,CAAA,EAAgC,CAAC,QAAA,EAAU,OAAO,CAAC,CAAA;AAAA,QACjI;AACA,QAAA,IAAI,MAAA,CAAO,KAAA,KAAU,MAAA,IAAa,MAAA,CAAO,UAAU,OAAA,EAAS;AAC1D,UAAA,IAAA,CAAK,MAAA,EAAQ,CAAA,EAAG,IAAI,CAAA,aAAA,CAAA,EAAiB,eAAA,EAAiB,CAAA,CAAA,EAAI,MAAA,CAAO,MAAA,CAAO,KAAK,CAAC,CAAA,oFAAA,CAAA,EAAmF,CAAC,OAAO,CAAC,CAAA;AAAA,QAC5K;AAAA,MACF;AAAA,IACF;AACA,IAAA,MAAM,UAAA,GAAa,CAAC,KAAA,EAAe,IAAA,KAAwB;AACzD,MAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,CAAC,UAAA,CAAW,QAAA,CAAS,IAAI,CAAA,EAAG;AAC1D,QAAA,IAAA,CAAK,MAAA,EAAQ,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,EAAI,eAAA,EAAiB,CAAA,EAAG,KAAK,CAAA,8BAAA,EAAiC,MAAA,CAAO,IAAI,CAAC,KAAK,UAAU,CAAA;AAAA,MACxH;AAAA,IACF,CAAA;AACA,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,WAAA,CAAY,OAAO,CAAA,EAAG;AACtC,MAAA,WAAA,CAAY,OAAA,CAAQ,OAAA,CAAQ,CAAC,KAAA,EAAO,CAAA,KAAM;AACxC,QAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACzB,UAAA,IAAA,CAAK,QAAQ,CAAA,EAAG,IAAI,YAAY,CAAC,CAAA,CAAA,CAAA,EAAK,iBAAiB,8CAA8C,CAAA;AACrG,UAAA;AAAA,QACF;AACA,QAAA,KAAA,MAAW,QAAQ,KAAA,EAAO,UAAA,CAAW,CAAA,QAAA,EAAW,CAAC,KAAK,IAAI,CAAA;AAAA,MAC5D,CAAC,CAAA;AAAA,IACH;AACA,IAAA,IAAI,YAAY,UAAA,KAAe,MAAA,EAAW,UAAA,CAAW,YAAA,EAAc,YAAY,UAAU,CAAA;AACzF,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,WAAA,CAAY,aAAa,CAAA,EAAG;AAC5C,MAAA,KAAA,MAAW,IAAA,IAAQ,WAAA,CAAY,aAAA,EAAe,UAAA,CAAW,iBAAiB,IAAI,CAAA;AAAA,IAChF;AAAA,EACF;AACF;AASA,SAAS,qBAAA,CAAsB,MAAA,EAAgB,IAAA,EAAc,IAAA,EAAqB;AAChF,EAAA,IAAI,CAAC,QAAA,CAAS,IAAI,CAAA,IAAK,OAAO,IAAA,CAAK,SAAA,KAAc,QAAA,IAAY,OAAO,IAAA,CAAK,QAAA,KAAa,QAAA,EAAU;AAC9F,IAAA,IAAA,CAAK,MAAA,EAAQ,IAAA,EAAM,eAAA,EAAiB,gDAAgD,CAAA;AACpF,IAAA;AAAA,EACF;AACA,EAAA,IAAI,CAAC,gBAAA,CAAiB,IAAA,CAAK,SAAS,CAAA,EAAG;AACrC,IAAA,IAAA;AAAA,MACE,MAAA;AAAA,MACA,GAAG,IAAI,CAAA,UAAA,CAAA;AAAA,MACP,wBAAA;AAAA,MACA,CAAA,CAAA,EAAI,KAAK,SAAS,CAAA,yCAAA,CAAA;AAAA,MAClB,qBAAA;AAAsB,KACxB;AACA,IAAA;AAAA,EACF;AACA,EAAA,IAAI,CAAE,cAAA,CAAqC,QAAA,CAAS,IAAA,CAAK,QAAQ,CAAA,EAAG;AAClE,IAAA,IAAA,CAAK,MAAA,EAAQ,GAAG,IAAI,CAAA,SAAA,CAAA,EAAa,yBAAyB,CAAA,CAAA,EAAI,IAAA,CAAK,QAAQ,CAAA,wBAAA,CAAA,EAA4B,cAAc,CAAA;AACrH,IAAA;AAAA,EACF;AACA,EAAA,MAAM,SAAA,GAAY,oBAAA,CAAqB,IAAA,CAAK,SAAS,CAAA;AACrD,EAAA,IAAI,CAAE,SAAA,CAAU,SAAA,CAAgC,QAAA,CAAS,IAAA,CAAK,QAAQ,CAAA,EAAG;AACvE,IAAA,IAAA;AAAA,MACE,MAAA;AAAA,MACA,GAAG,IAAI,CAAA,SAAA,CAAA;AAAA,MACP,2BAAA;AAAA,MACA,CAAA,WAAA,EAAc,IAAA,CAAK,SAAS,CAAA,6BAAA,EAAgC,KAAK,QAAQ,CAAA,CAAA,CAAA;AAAA,MACzE,SAAA,CAAU;AAAA,KACZ;AAAA,EACF;AACA,EAAA,IAAI,CAAC,MAAM,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAA,IAAK,IAAA,CAAK,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG;AAC3D,IAAA,IAAA,CAAK,MAAA,EAAQ,CAAA,EAAG,IAAI,CAAA,OAAA,CAAA,EAAW,iBAAiB,8CAA8C,CAAA;AAC9F,IAAA;AAAA,EACF;AACA,EAAA,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,CAAC,KAAA,EAAO,KAAA,KAAU;AACpC,IAAA,MAAM,IAAI,OAAO,KAAA;AACjB,IAAA,IAAI,CAAA,KAAM,QAAA,IAAY,CAAA,KAAM,QAAA,IAAY,MAAM,SAAA,EAAW;AACvD,MAAA,IAAA,CAAK,MAAA,EAAQ,GAAG,IAAI,CAAA,QAAA,EAAW,KAAK,CAAA,CAAA,CAAA,EAAK,eAAA,EAAiB,CAAA,mCAAA,EAAsC,CAAC,CAAA,CAAE,CAAA;AAAA,IACrG;AAAA,EACF,CAAC,CAAA;AACH;AAEA,SAAS,gBAAA,CAAiB,MAAA,EAAgB,IAAA,EAAc,KAAA,EAAsB;AAC5E,EAAA,IAAI,UAAU,MAAA,EAAW;AACzB,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACzB,IAAA,IAAA,CAAK,QAAQ,IAAA,EAAM,eAAA,EAAiB,CAAA,gCAAA,EAAmC,OAAO,KAAK,CAAA,CAAE,CAAA;AACrF,IAAA;AAAA,EACF;AACA,EAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,EAAM,KAAA,KAAU,qBAAA,CAAsB,MAAA,EAAQ,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,CAAA,EAAK,IAAI,CAAC,CAAA;AACzF;AAEA,SAAS,yBAAA,CAA0B,QAAgB,OAAA,EAAwC;AACzF,EAAA,MAAM,aAAa,OAAA,CAAQ,UAAA;AAC3B,EAAA,IAAI,eAAe,MAAA,IAAa,CAAC,KAAA,CAAM,OAAA,CAAQ,UAAU,CAAA,EAAG;AAC5D,EAAA,UAAA,CAAW,OAAA,CAAQ,CAAC,SAAA,EAAW,KAAA,KAAU;AACvC,IAAA,MAAM,IAAA,GAAO,yBAAyB,KAAK,CAAA,CAAA,CAAA;AAC3C,IAAA,IAAI,CAAC,QAAA,CAAS,SAAS,CAAA,IAAK,OAAO,UAAU,EAAA,KAAO,QAAA,IAAY,CAAC,SAAA,CAAU,EAAA,EAAI;AAC7E,MAAA,IAAA,CAAK,MAAA,EAAQ,IAAA,EAAM,eAAA,EAAiB,qEAAqE,CAAA;AACzG,MAAA;AAAA,IACF;AACA,IAAA,IAAI,SAAA,CAAU,SAAS,MAAA,IAAa,CAAE,gBAAsC,QAAA,CAAS,SAAA,CAAU,IAAc,CAAA,EAAG;AAC9G,MAAA,IAAA,CAAK,MAAA,EAAQ,CAAA,EAAG,IAAI,CAAA,KAAA,CAAA,EAAS,eAAA,EAAiB,CAAA,CAAA,EAAI,MAAA,CAAO,SAAA,CAAU,IAAI,CAAC,CAAA,yBAAA,CAAA,EAA6B,eAAe,CAAA;AAAA,IACtH;AACA,IAAA,IAAI,SAAA,CAAU,WAAW,MAAA,IAAa,CAAE,mBAAyC,QAAA,CAAS,SAAA,CAAU,MAAgB,CAAA,EAAG;AACrH,MAAA,IAAA,CAAK,MAAA,EAAQ,CAAA,EAAG,IAAI,CAAA,OAAA,CAAA,EAAW,eAAA,EAAiB,CAAA,CAAA,EAAI,MAAA,CAAO,SAAA,CAAU,MAAM,CAAC,CAAA,2BAAA,CAAA,EAA+B,kBAAkB,CAAA;AAAA,IAC/H;AACA,IAAA,IAAI,SAAA,CAAU,IAAA,KAAS,MAAA,IAAa,SAAA,CAAU,gBAAgB,IAAA,EAAM;AAClE,MAAA,IAAA;AAAA,QACE,MAAA;AAAA,QACA,GAAG,IAAI,CAAA,KAAA,CAAA;AAAA,QACP,eAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AACA,IAAA,gBAAA,CAAiB,MAAA,EAAQ,CAAA,EAAG,IAAI,CAAA,MAAA,CAAA,EAAU,UAAU,KAAK,CAAA;AACzD,IAAA,MAAM,SAAS,SAAA,CAAU,iBAAA;AACzB,IAAA,IAAI,CAAC,QAAA,CAAS,MAAM,CAAA,EAAG;AACrB,MAAA,IAAA,CAAK,MAAA,EAAQ,CAAA,EAAG,IAAI,CAAA,kBAAA,CAAA,EAAsB,iBAAiB,8EAAyE,CAAA;AACpI,MAAA;AAAA,IACF;AACA,IAAA,MAAM,UAAA,GAAa,GAAG,IAAI,CAAA,kBAAA,CAAA;AAC1B,IAAA,IAAI,OAAO,OAAO,IAAA,KAAS,QAAA,IAAY,CAAE,wBAAA,CAA+C,QAAA,CAAS,MAAA,CAAO,IAAI,CAAA,EAAG;AAC7G,MAAA,IAAA,CAAK,MAAA,EAAQ,CAAA,EAAG,UAAU,CAAA,KAAA,CAAA,EAAS,eAAA,EAAiB,CAAA,CAAA,EAAI,MAAA,CAAO,MAAA,CAAO,IAAI,CAAC,CAAA,mCAAA,CAAA,EAAuC,wBAAwB,CAAA;AAAA,IAC5I;AACA,IAAA,IAAI,OAAO,MAAA,CAAO,KAAA,KAAU,QAAA,IAAY,MAAA,CAAO,QAAQ,CAAA,EAAG;AACxD,MAAA,IAAA,CAAK,MAAA,EAAQ,CAAA,EAAG,UAAU,CAAA,MAAA,CAAA,EAAU,iBAAiB,kDAAkD,CAAA;AAAA,IACzG;AACA,IAAA,IAAI,OAAO,OAAO,UAAA,KAAe,QAAA,IAAY,CAAE,+BAAA,CAAsD,QAAA,CAAS,MAAA,CAAO,UAAU,CAAA,EAAG;AAChI,MAAA,IAAA,CAAK,MAAA,EAAQ,CAAA,EAAG,UAAU,CAAA,WAAA,CAAA,EAAe,eAAA,EAAiB,CAAA,CAAA,EAAI,MAAA,CAAO,MAAA,CAAO,UAAU,CAAC,CAAA,sBAAA,CAAA,EAA0B,+BAA+B,CAAA;AAAA,IAClJ;AACA,IAAA,IAAI,MAAA,CAAO,eAAe,MAAA,IAAa,CAAE,+BAAqD,QAAA,CAAS,MAAA,CAAO,UAAoB,CAAA,EAAG;AACnI,MAAA,IAAA,CAAK,MAAA,EAAQ,CAAA,EAAG,UAAU,CAAA,WAAA,CAAA,EAAe,eAAA,EAAiB,CAAA,CAAA,EAAI,MAAA,CAAO,MAAA,CAAO,UAAU,CAAC,CAAA,sBAAA,CAAA,EAA0B,8BAA8B,CAAA;AAAA,IACjJ;AACA,IAAA,KAAA,MAAWA,MAAAA,IAAS,CAAC,aAAA,EAAe,iBAAA,EAAmB,qBAAqB,CAAA,EAAY;AACtF,MAAA,MAAM,KAAA,GAAQ,OAAOA,MAAK,CAAA;AAC1B,MAAA,IAAI,KAAA,KAAU,UAAa,KAAA,KAAU,IAAA,KAAS,OAAO,KAAA,KAAU,QAAA,IAAY,QAAQ,CAAA,CAAA,EAAI;AACrF,QAAA,IAAA,CAAK,MAAA,EAAQ,GAAG,UAAU,CAAA,CAAA,EAAIA,MAAK,CAAA,CAAA,EAAI,eAAA,EAAiB,CAAA,EAAGA,MAAK,CAAA,+BAAA,CAAiC,CAAA;AAAA,MACnG;AAAA,IACF;AACA,IAAA,gBAAA,CAAiB,MAAA,EAAQ,CAAA,EAAG,UAAU,CAAA,YAAA,CAAA,EAAgB,OAAO,WAAW,CAAA;AACxE,IAAA,gBAAA,CAAiB,MAAA,EAAQ,CAAA,EAAG,UAAU,CAAA,SAAA,CAAA,EAAa,OAAO,QAAQ,CAAA;AAAA,EACpE,CAAC,CAAA;AACH;AAEA,SAAS,iBAAA,CAAkB,MAAA,EAAgB,IAAA,EAAc,IAAA,EAAqB;AAC5E,EAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,CAAC,IAAA,EAAM;AACrC,IAAA,IAAA,CAAK,MAAA,EAAQ,IAAA,EAAM,eAAA,EAAiB,uDAAuD,CAAA;AAC3F,IAAA;AAAA,EACF;AACA,EAAA,IAAI,CAAC,SAAA,CAAU,IAAI,CAAA,EAAG;AACpB,IAAA,IAAA,CAAK,QAAQ,IAAA,EAAM,gBAAA,EAAkB,WAAW,IAAI,CAAA,mBAAA,CAAA,EAAuB,aAAa,CAAA;AAAA,EAC1F;AACF;AAEA,SAAS,YAAA,CAAa,QAAgB,OAAA,EAAwC;AAC5E,EAAA,KAAA,MAAWA,UAAS,CAAC,MAAA,EAAQ,UAAA,EAAY,MAAA,EAAQ,cAAc,CAAA,EAAY;AACzE,IAAA,IAAI,OAAA,CAAQA,MAAK,CAAA,KAAM,MAAA,EAAW,iBAAA,CAAkB,MAAA,EAAQ,CAAA,KAAA,EAAQA,MAAK,CAAA,CAAA,EAAI,OAAA,CAAQA,MAAK,CAAC,CAAA;AAAA,EAC7F;AAEA,EAAA,MAAM,aAAa,OAAA,CAAQ,UAAA;AAC3B,EAAA,IAAI,QAAA,CAAS,UAAU,CAAA,EAAG;AACxB,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,MAAM,KAAK,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,EAAG;AACvD,MAAA,MAAM,QAAA,GAAW,mBAAmB,IAAI,CAAA,CAAA;AACxC,MAAA,IAAI,CAAE,yBAAA,CAAgD,QAAA,CAAS,IAAI,CAAA,EAAG;AACpE,QAAA,IAAA;AAAA,UACE,MAAA;AAAA,UACA,QAAA;AAAA,UACA,wBAAA;AAAA,UACA,IAAI,IAAI,CAAA,4CAAA,CAAA;AAAA,UACR;AAAA,SACF;AACA,QAAA;AAAA,MACF;AACA,MAAA,iBAAA,CAAkB,MAAA,EAAQ,UAAU,MAAM,CAAA;AAAA,IAC5C;AAAA,EACF;AAEA,EAAA,MAAM,SAAS,OAAA,CAAQ,MAAA;AACvB,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AACzB,IAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,KAAA,EAAO,KAAA,KAAU;AAC/B,MAAA,MAAM,SAAA,GAAY,eAAe,KAAK,CAAA,CAAA,CAAA;AACtC,MAAA,IAAI,CAAC,QAAA,CAAS,KAAK,CAAA,EAAG;AACpB,QAAA,IAAA,CAAK,MAAA,EAAQ,SAAA,EAAW,eAAA,EAAiB,kDAAkD,CAAA;AAC3F,QAAA;AAAA,MACF;AACA,MAAA,KAAA,MAAW,QAAA,IAAY,CAAC,IAAA,EAAM,MAAM,CAAA,EAAY;AAC9C,QAAA,IAAI,OAAO,MAAM,QAAQ,CAAA,KAAM,YAAY,CAAC,KAAA,CAAM,QAAQ,CAAA,EAAG;AAC3D,UAAA,IAAA,CAAK,MAAA,EAAQ,GAAG,SAAS,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,EAAI,eAAA,EAAiB,CAAA,yBAAA,EAA4B,QAAQ,CAAA,CAAA,CAAG,CAAA;AAAA,QACnG;AAAA,MACF;AAIA,MAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,EAAG;AACpC,QAAA,IAAI,CAAC,eAAA,CAAgB,QAAA,CAAS,GAAG,CAAA,EAAG;AAClC,UAAA,IAAA,CAAK,MAAA,EAAQ,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,GAAG,IAAI,eAAA,EAAiB,CAAA,sBAAA,EAAyB,GAAG,CAAA,CAAA,CAAA,EAAK,eAAe,CAAA;AAAA,QACvG;AAAA,MACF;AACA,MAAA,IAAI,KAAA,CAAM,SAAS,MAAA,IAAa,CAAE,kBAAwC,QAAA,CAAS,KAAA,CAAM,IAAc,CAAA,EAAG;AACxG,QAAA,IAAA;AAAA,UACE,MAAA;AAAA,UACA,GAAG,SAAS,CAAA,KAAA,CAAA;AAAA,UACZ,eAAA;AAAA,UACA,CAAA,CAAA,EAAI,MAAA,CAAO,KAAA,CAAM,IAAI,CAAC,CAAA,qBAAA,CAAA;AAAA,UACtB;AAAA,SACF;AAAA,MACF;AACA,MAAA,IACE,KAAA,CAAM,WAAW,MAAA,IACjB,CAAE,oBAA0C,QAAA,CAAS,KAAA,CAAM,MAAgB,CAAA,EAC3E;AACA,QAAA,IAAA;AAAA,UACE,MAAA;AAAA,UACA,GAAG,SAAS,CAAA,OAAA,CAAA;AAAA,UACZ,eAAA;AAAA,UACA,CAAA,CAAA,EAAI,MAAA,CAAO,KAAA,CAAM,MAAM,CAAC,CAAA,uBAAA,CAAA;AAAA,UACxB;AAAA,SACF;AAAA,MACF;AACA,MAAA,iBAAA,CAAkB,MAAA,EAAQ,CAAA,EAAG,SAAS,CAAA,UAAA,CAAA,EAAc,MAAM,SAAS,CAAA;AAAA,IACrE,CAAC,CAAA;AAAA,EACH;AACF;AAYO,SAAS,cAAc,GAAA,EAAqC;AACjE,EAAA,wBAAA,EAAyB;AACzB,EAAA,MAAM,SAAiB,EAAC;AAKxB,EAAA,aAAA,GAAgB,IAAI,GAAA,CAAI,sBAAA,EAAwB,CAAA;AAChD,EAAA,IAAI,QAAA,CAAS,GAAG,CAAA,EAAG;AACjB,IAAA,MAAM,kBAAmB,GAAA,CAAgC,QAAA;AACzD,IAAA,IAAI,SAAS,eAAe,CAAA,IAAK,QAAA,CAAS,eAAA,CAAgB,WAAW,CAAA,EAAG;AACtE,MAAA,KAAA,MAAW,GAAA,IAAO,OAAO,IAAA,CAAK,eAAA,CAAgB,WAAW,CAAA,EAAG,aAAA,CAAc,IAAI,GAAG,CAAA;AAAA,IACnF;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,QAAA,CAAS,GAAG,CAAA,EAAG;AAClB,IAAA,IAAA,CAAK,MAAA,EAAQ,IAAI,kBAAA,EAAoB,CAAA,mCAAA,EAAsC,QAAQ,IAAA,GAAO,MAAA,GAAS,OAAO,GAAG,CAAA,CAAE,CAAA;AAC/G,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,MAAA,EAAO;AAAA,EAC7B;AAEA,EAAA,IAAI,GAAA,CAAI,UAAU,mBAAA,EAAqB;AACrC,IAAA,IAAA;AAAA,MACE,MAAA;AAAA,MACA,OAAA;AAAA,MACA,kBAAA;AAAA,MACA,mBAAmB,mBAAmB,CAAA,OAAA,EAAU,KAAK,SAAA,CAAU,GAAA,CAAI,KAAK,CAAC,CAAA,CAAA;AAAA,MACzE,CAAC,mBAAmB;AAAA,KACtB;AAAA,EACF;AAEA,EAAA,IAAI,GAAA,CAAI,UAAU,MAAA,EAAW;AAC3B,IAAA,IAAA,CAAK,MAAA,EAAQ,OAAA,EAAS,iBAAA,EAAmB,wDAAA,EAA0D;AAAA,MACjG,GAAG;AAAA,KACJ,CAAA;AAAA,EACH;AAEA,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,OAAO,KAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,EAAG;AACjD,IAAA,IAAI,SAAS,OAAA,EAAS;AACtB,IAAA,IAAI,CAAE,mBAAA,CAAiC,QAAA,CAAS,IAAI,CAAA,EAAG;AACrD,MAAA,IAAA,CAAK,QAAQ,IAAA,EAAM,iBAAA,EAAmB,CAAA,CAAA,EAAI,IAAI,+BAA+B,mBAAmB,CAAA;AAChG,MAAA;AAAA,IACF;AACA,IAAA,IAAI,CAAC,QAAA,CAAS,OAAO,CAAA,EAAG;AACtB,MAAA,IAAA,CAAK,MAAA,EAAQ,IAAA,EAAM,eAAA,EAAiB,CAAA,SAAA,EAAY,IAAI,CAAA,kCAAA,CAAoC,CAAA;AACxF,MAAA;AAAA,IACF;AACA,IAAA,MAAM,WAAA,GAAc,IAAA;AAIpB,IAAA,IAAI,CAAC,uBAAA,CAAwB,MAAA,EAAQ,WAAA,EAAa,OAAO,CAAA,EAAG;AAC5D,IAAA,IAAI,WAAA,KAAgB,OAAA,EAAS,aAAA,CAAc,MAAA,EAAQ,OAAO,CAAA;AAC1D,IAAA,IAAI,WAAA,KAAgB,UAAA,EAAY,uBAAA,CAAwB,MAAA,EAAQ,OAAO,CAAA;AACvE,IAAA,IAAI,WAAA,KAAgB,YAAA,EAAc,yBAAA,CAA0B,MAAA,EAAQ,OAAO,CAAA;AAC3E,IAAA,IAAI,WAAA,KAAgB,UAAA,EAAY,gBAAA,CAAiB,MAAA,EAAQ,OAAO,CAAA;AAChE,IAAA,IAAI,WAAA,KAAgB,cAAA,EAAgB,oBAAA,CAAqB,MAAA,EAAQ,OAAO,CAAA;AACxE,IAAA,IAAI,WAAA,KAAgB,MAAA,EAAQ,YAAA,CAAa,MAAA,EAAQ,OAAO,CAAA;AAAA,EAC1D;AAEA,EAAA,OAAO,EAAE,EAAA,EAAI,MAAA,CAAO,MAAA,KAAW,GAAG,MAAA,EAAO;AAC3C;ACn/BO,SAAS,iBAAiB,IAAA,EAAsB;AACrD,EAAA,OAAO,IAAA,CAAK,WAAA,EAAY,CAAE,OAAA,CAAQ,aAAA,EAAe,GAAG,CAAA,CAAE,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA,IAAK,KAAA;AACjF;AAqBA,SAAS,OAAA,CAAQ,KAAA,EAAgB,UAAA,EAAoB,YAAA,EAAsB,GAAA,EAA6B;AACtG,EAAA,MAAM,QAAA,GAAW,cAAc,KAAK,CAAA;AACpC,EAAA,IAAI,UAAU,OAAO,QAAA;AACrB,EAAA,MAAM,IAAA,GAAO,CAAA,EAAG,GAAA,CAAI,KAAK,IAAI,YAAY,CAAA,CAAA;AACzC,EAAA,IAAI,CAAC,IAAI,YAAA,EAAc;AACrB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,oBAAA,EAAuB,UAAU,CAAA,kEAAA,EACP,IAAI,CAAA,oGAAA;AAAA,KAEhC;AAAA,EACF;AACA,EAAA,cAAA;AAAA,IACE,IAAA;AAAA,IACA,KAAA;AAAA,IACA,EAAE,WAAA,EAAa,CAAA,4BAAA,EAA+B,UAAU,CAAA,CAAA,EAAI,QAAQ,KAAA,EAAM;AAAA;AAAA;AAAA,IAG1E,EAAE,SAAS,IAAA;AAAK,GAClB;AACA,EAAA,OAAO,IAAA;AACT;AAGA,SAAS,eAAA,CAAgB,OAAgB,IAAA,EAA6B;AACpE,EAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW,OAAO,IAAA;AAClD,EAAA,MAAM,IAAI,OAAO,KAAA;AACjB,EAAA,IAAI,MAAM,QAAA,IAAY,CAAA,KAAM,QAAA,IAAY,CAAA,KAAM,WAAW,OAAO,IAAA;AAChE,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,MAAA,MAAM,KAAA,GAAQ,gBAAgB,KAAA,CAAM,CAAC,GAAG,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,CAAG,CAAA;AACvD,MAAA,IAAI,OAAO,OAAO,KAAA;AAAA,IACpB;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,MAAM,QAAA,EAAU;AAClB,IAAA,MAAM,MAAA,GAAS,KAAA;AACf,IAAA,IAAI,UAAA,IAAc,QAAQ,OAAO,IAAA;AACjC,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,cAAA,CAAe,MAAM,CAAA;AAC1C,IAAA,IAAI,KAAA,KAAU,MAAA,CAAO,SAAA,IAAa,KAAA,KAAU,MAAM,OAAO,IAAA;AACzD,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AACjD,MAAA,MAAM,QAAQ,eAAA,CAAgB,KAAA,EAAO,GAAG,IAAI,CAAA,CAAA,EAAI,GAAG,CAAA,CAAE,CAAA;AACrD,MAAA,IAAI,OAAO,OAAO,KAAA;AAAA,IACpB;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,WAAW,OAAA,EAA2C;AAC7D,EAAA,OAAO,MAAA,CAAO,KAAK,OAAO,CAAA,CAAE,KAAK,CAAC,GAAA,KAAQ,QAAQ,SAAS,CAAA;AAC7D;AAUO,SAAS,WAAA,CAAY,MAAA,EAA0B,OAAA,GAA8B,EAAC,EAAkB;AACrG,EAAA,MAAM,GAAA,GAAsB;AAAA,IAC1B,KAAA,EAAO,OAAA,CAAQ,KAAA,IAAS,gBAAA,CAAiB,OAAO,IAAI,CAAA;AAAA,IACpD,YAAA,EAAc,QAAQ,sBAAA,IAA0B;AAAA,GAClD;AAEA,EAAA,MAAM,IAAA,GAAyB,EAAE,OAAA,EAAS,CAAA,EAAE;AAG5C,EAAA,IAAI,gBAAA;AACJ,EAAA,IAAI,MAAA,CAAO,SAAS,MAAA,EAAW;AAC7B,IAAA,IAAI,OAAO,MAAA,CAAO,IAAA,KAAS,QAAA,qBAA6B,MAAA,CAAO,IAAA;AAAA,cACrD,IAAA,GAAO,OAAA,CAAQ,OAAO,IAAA,EAAM,MAAA,EAAQ,QAAQ,GAAG,CAAA;AAAA,EAC3D;AAGA,EAAA,IAAI,UAAA;AACJ,EAAA,IAAI,MAAA,CAAO,WAAW,MAAA,EAAW;AAC/B,IAAA,MAAM,EAAE,MAAA,EAAQ,GAAG,IAAA,KAAS,MAAA,CAAO,MAAA;AACnC,IAAA,IAAI,MAAA,KAAW,MAAA,IAAa,OAAO,MAAA,KAAW,QAAA,EAAU;AACtD,MAAA,UAAA,GAAa,MAAA,CAAO,MAAA;AAAA,IACtB,CAAA,MAAO;AACL,MAAA,UAAA,GAAa,IAAA;AACb,MAAA,IAAA,CAAK,YAAA,GAAe,OAAA,CAAQ,MAAA,EAAQ,eAAA,EAAiB,iBAAiB,GAAG,CAAA;AAAA,IAC3E;AAAA,EACF;AAGA,EAAA,IAAI,UAAA;AACJ,EAAA,IAAI,MAAA,CAAO,WAAW,MAAA,EAAW;AAC/B,IAAA,MAAM,EAAE,gBAAA,EAAkB,GAAG,IAAA,KAAS,MAAA,CAAO,MAAA;AAC7C,IAAA,UAAA,GAAa,IAAA;AACb,IAAA,IAAI,qBAAqB,MAAA,EAAW;AAClC,MAAA,IAAA,CAAK,sBAAA,GAAyB,OAAA;AAAA,QAC5B,gBAAA;AAAA,QACA,yBAAA;AAAA,QACA,0BAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAKA,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI,MAAA,CAAO,SAAS,MAAA,EAAW;AAC7B,IAAA,IAAI,WAAA,CAAY,MAAA,CAAO,IAAI,CAAA,aAAc,MAAA,CAAO,IAAA;AAAA,cACtC,IAAA,GAAO,OAAA,CAAQ,OAAO,IAAA,EAAM,MAAA,EAAQ,QAAQ,GAAG,CAAA;AAAA,EAC3D;AAEA,EAAA,IAAI,MAAA,CAAO,aAAa,MAAA,EAAW;AACjC,IAAA,IAAA,CAAK,WAAW,OAAA,CAAQ,MAAA,CAAO,QAAA,EAAU,UAAA,EAAY,YAAY,GAAG,CAAA;AAAA,EACtE;AAEA,EAAA,IAAI,MAAA,CAAO,eAAe,MAAA,EAAW;AACnC,IAAA,MAAM,gBAAwC,EAAC;AAC/C,IAAA,KAAA,MAAW,CAAC,KAAK,QAAQ,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,CAAO,UAAU,CAAA,EAAG;AAC/D,MAAA,IAAI,aAAa,MAAA,EAAW;AAC5B,MAAA,aAAA,CAAc,GAAG,CAAA,GAAI,OAAA,CAAQ,QAAA,EAAU,CAAA,WAAA,EAAc,GAAG,CAAA,CAAA,EAAI,CAAA,WAAA,EAAc,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA;AAAA,IACtF;AACA,IAAA,IAAI,OAAO,IAAA,CAAK,aAAa,EAAE,MAAA,GAAS,CAAA,OAAQ,UAAA,GAAa,aAAA;AAAA,EAC/D;AAEA,EAAA,IAAI,OAAO,MAAA,KAAW,MAAA,IAAa,MAAA,CAAO,MAAA,CAAO,SAAS,CAAA,EAAG;AAC3D,IAAA,IAAA,CAAK,MAAA,GAAS,OAAO,MAAA,CAAO,GAAA;AAAA,MAC1B,CAAC,UACC,OAAA,CAAQ;AAAA,QACN,IAAI,KAAA,CAAM,EAAA;AAAA,QACV,MAAM,KAAA,CAAM,IAAA;AAAA,QACZ,MAAM,KAAA,CAAM,IAAA;AAAA,QACZ,QAAQ,KAAA,CAAM,MAAA;AAAA,QACd,SAAA,EAAW,OAAA,CAAQ,KAAA,CAAM,SAAA,EAAW,CAAA,OAAA,EAAU,KAAA,CAAM,EAAE,CAAA,WAAA,CAAA,EAAe,CAAA,OAAA,EAAU,KAAA,CAAM,EAAE,CAAA,CAAA,EAAI,GAAG;AAAA,OAC/F;AAAA,KACL;AAAA,EACF;AAEA,EAAA,MAAM,QAAA,GAAW;AAAA,IACf,OAAO,OAAA,CAAQ;AAAA,MACb,OAAA,EAAS,CAAA;AAAA,MACT,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,QAAQ,MAAA,CAAO;AAAA,KAChB,CAAA;AAAA,IACD,KAAA,EAAO,MAAA,CAAO,KAAA,GACV,EAAE,SAAS,CAAA,EAAG,GAAG,OAAA,CAAQ,MAAA,CAAO,KAA2C,CAAA,EAAE,GAC7E,EAAE,SAAS,CAAA,EAAE;AAAA,IACjB,UAAU,OAAA,CAAQ;AAAA,MAChB,OAAA,EAAS,CAAA;AAAA,MACT,cAAc,MAAA,CAAO,YAAA;AAAA,MACrB,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,WAAW,MAAA,CAAO,SAAA;AAAA,MAClB,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,UAAU,MAAA,CAAO;AAAA,KAClB,CAAA;AAAA,IACD,cAAc,OAAA,CAAQ;AAAA,MACpB,OAAA,EAAS,CAAA;AAAA,MACT,cAAc,MAAA,CAAO,YAAA;AAAA,MACrB,IAAA,EAAM,gBAAA;AAAA,MACN,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,KAAK,MAAA,CAAO,GAAA;AAAA,MACZ,MAAA,EAAQ,UAAA;AAAA,MACR,cAAc,MAAA,CAAO,YAAA;AAAA,MACrB,eAAe,MAAA,CAAO,aAAA;AAAA,MACtB,cAAc,MAAA,CAAO,YAAA;AAAA,MACrB,MAAA,EAAQ;AAAA,KACT,CAAA;AAAA,IACD,OAAA,EAAS,OAAA,CAAQ,EAAE,OAAA,EAAS,CAAA,EAAG,KAAA,EAAO,MAAA,CAAO,KAAA,EAAO,OAAA,EAAS,MAAA,CAAO,OAAA,EAAS,CAAA;AAAA,IAC7E,OAAA,EAAS,MAAA,CAAO,OAAA,GAAU,EAAE,SAAS,CAAA,EAAG,GAAG,OAAA,CAAQ,MAAA,CAAO,OAAkC,CAAA,EAAE,GAAI,EAAE,SAAS,CAAA,EAAE;AAAA,IAC/G,QAAA,EAAU,MAAA,CAAO,QAAA,GAAW,EAAE,OAAA,EAAS,CAAA,EAAG,WAAA,EAAa,MAAA,CAAO,QAAA,EAAS,GAAI,EAAE,OAAA,EAAS,CAAA,EAAE;AAAA,IACxF,UAAA,EAAY,MAAA,CAAO,UAAA,GAAa,EAAE,OAAA,EAAS,CAAA,EAAG,UAAA,EAAY,MAAA,CAAO,UAAA,EAAW,GAAI,EAAE,OAAA,EAAS,CAAA,EAAE;AAAA,IAC7F,SAAS,OAAA,CAAQ;AAAA,MACf,OAAA,EAAS,CAAA;AAAA,MACT,QAAA,EAAU,OAAO,OAAA,EAAS,QAAA;AAAA,MAC1B,GAAA,EAAK,OAAO,OAAA,EAAS,GAAA;AAAA,MACrB,aAAa,MAAA,CAAO,WAAA;AAAA,MACpB,iBAAiB,MAAA,CAAO;AAAA,KACzB,CAAA;AAAA,IACD,IAAA,EAAM,QAAA,GAAW,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,OAAA,CAAQ,QAAmC,CAAA,EAAE,GAAI,EAAE,OAAA,EAAS,CAAA,EAAE;AAAA,IAChG,IAAA,EAAM,QAAQ,IAA0C;AAAA,GAC1D;AAKA,EAAA,MAAM,OAAA,GAAmC;AAAA,IACvC,KAAA,EAAO,OAAO,KAAA,KAAU,MAAA;AAAA,IACxB,OAAA,EAAS,OAAO,OAAA,KAAY,MAAA;AAAA,IAC5B,QAAA,EAAU,OAAO,QAAA,KAAa,MAAA;AAAA,IAC9B,UAAA,EAAY,OAAO,UAAA,KAAe,MAAA;AAAA,IAClC,MAAM,QAAA,KAAa,MAAA;AAAA,IACnB,QAAA,EAAU,UAAA,CAAW,QAAA,CAAS,QAAQ,CAAA;AAAA,IACtC,YAAA,EAAc,UAAA,CAAW,QAAA,CAAS,YAAY,CAAA;AAAA,IAC9C,OAAA,EAAS,UAAA,CAAW,QAAA,CAAS,OAAO,CAAA;AAAA,IACpC,OAAA,EAAS,UAAA,CAAW,QAAA,CAAS,OAAO,CAAA;AAAA,IACpC,IAAA,EAAM,UAAA,CAAW,QAAA,CAAS,IAA0C;AAAA,GACtE;AACA,EAAA,MAAM,MAA+B,EAAE,KAAA,EAAO,mBAAA,EAAqB,KAAA,EAAO,SAAS,KAAA,EAAM;AACzF,EAAA,KAAA,MAAW,IAAA,IAAQ,CAAC,OAAA,EAAS,UAAA,EAAY,cAAA,EAAgB,SAAA,EAAW,SAAA,EAAW,UAAA,EAAY,YAAA,EAAc,SAAA,EAAW,MAAA,EAAQ,MAAM,CAAA,EAAY;AAC5I,IAAA,IAAI,QAAQ,IAAI,CAAA,MAAO,IAAI,CAAA,GAAI,SAAS,IAAI,CAAA;AAAA,EAC9C;AAKA,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,OAAO,KAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,EAAG;AACjD,IAAA,IAAI,SAAS,OAAA,EAAS;AACtB,IAAA,MAAM,SAAA,GAAY,eAAA,CAAgB,OAAA,EAAS,IAAI,CAAA;AAC/C,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,gBAAgB,SAAS,CAAA,yKAAA;AAAA,OAE3B;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,GAAA;AACT;AAaA,SAAS,aAAa,MAAA,EAA4D;AAChF,EAAA,OAAO,MAAA,CACJ,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,GAAA,EAAM,EAAE,IAAA,IAAQ,YAAY,CAAA,EAAA,EAAK,CAAA,CAAE,OAAO,CAAA,EAAG,EAAE,KAAA,GAAQ,CAAA,SAAA,EAAY,CAAA,CAAE,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA,GAAM,EAAE,CAAA,CAAE,CAAA,CAC1G,IAAA,CAAK,IAAI,CAAA;AACd;AASO,SAAS,oBAAA,CACd,KAAA,EACA,OAAA,GAA+B,EAAC,EACd;AAClB,EAAA,MAAM,OAAA,GAAU,QAAQ,OAAA,IAAW,OAAA;AACnC,EAAA,MAAM,MAAA,GAAS,cAAc,KAAK,CAAA;AAClC,EAAA,IAAI,CAAC,OAAO,EAAA,EAAI;AACd,IAAA,MAAM,OAAA,GAAU,CAAA;AAAA,EAAsC,YAAA,CAAa,MAAA,CAAO,MAAM,CAAC,CAAA,CAAA;AACjF,IAAA,IAAI,OAAA,KAAY,OAAA,EAAS,MAAM,IAAI,MAAM,OAAO,CAAA;AAChD,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,aAAA,EAAgB,OAAO,CAAA,CAAE,CAAA;AAAA,EACzC;AAEA,EAAA,MAAM,GAAA,GAAM,KAAA;AACZ,EAAA,MAAM,OAAA,GAAU,CAAI,IAAA,EAAc,IAAA,KAAgC;AAChE,IAAA,IAAI;AACF,MAAA,OAAO,cAAiB,IAAI,CAAA;AAAA,IAC9B,SAAS,GAAA,EAAK;AACZ,MAAA,IAAI,OAAA,KAAY,SAAS,MAAM,GAAA;AAC/B,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,sBAAA,EAAyB,IAAI,CAAA,EAAA,EAAK,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA,CAAE,CAAA;AAClG,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,SAA2B,EAAE,IAAA,EAAM,GAAA,CAAI,KAAA,EAAO,QAAQ,EAAA,EAAG;AAC/D,EAAA,MAAM,GAAA,GAAM,CAAmC,GAAA,EAAQ,KAAA,KAAiD;AACtG,IAAA,IAAI,KAAA,KAAU,MAAA,EAAW,MAAA,CAAO,GAAG,CAAA,GAAI,KAAA;AAAA,EACzC,CAAA;AAEA,EAAA,GAAA,CAAI,UAAA,EAAY,GAAA,CAAI,KAAA,EAAO,QAAQ,CAAA;AACnC,EAAA,GAAA,CAAI,QAAA,EAAU,GAAA,CAAI,KAAA,EAAO,MAAM,CAAA;AAE/B,EAAA,IAAI,IAAI,KAAA,EAAO;AACb,IAAA,MAAM,EAAE,OAAA,EAAS,EAAA,EAAI,GAAG,KAAA,KAAU,GAAA,CAAI,KAAA;AACtC,IAAA,GAAA,CAAI,SAAS,KAAwB,CAAA;AAAA,EACvC;AAEA,EAAA,IAAI,IAAI,QAAA,EAAU;AAChB,IAAA,GAAA,CAAI,cAAA,EAAgB,GAAA,CAAI,QAAA,CAAS,YAAY,CAAA;AAC7C,IAAA,GAAA,CAAI,UAAA,EAAY,GAAA,CAAI,QAAA,CAAS,QAAQ,CAAA;AACrC,IAAA,GAAA,CAAI,UAAA,EAAY,GAAA,CAAI,QAAA,CAAS,QAAQ,CAAA;AACrC,IAAA,GAAA,CAAI,WAAA,EAAa,GAAA,CAAI,QAAA,CAAS,SAAS,CAAA;AACvC,IAAA,GAAA,CAAI,SAAA,EAAW,GAAA,CAAI,QAAA,CAAS,OAAO,CAAA;AACnC,IAAA,GAAA,CAAI,UAAA,EAAY,GAAA,CAAI,QAAA,CAAS,QAAQ,CAAA;AAAA,EACvC;AAEA,EAAA,IAAI,IAAI,YAAA,EAAc;AACpB,IAAA,GAAA,CAAI,cAAA,EAAgB,GAAA,CAAI,YAAA,CAAa,YAAY,CAAA;AACjD,IAAA,GAAA,CAAI,MAAA,EAAQ,GAAA,CAAI,YAAA,CAAa,IAAI,CAAA;AACjC,IAAA,GAAA,CAAI,OAAA,EAAS,GAAA,CAAI,YAAA,CAAa,KAAK,CAAA;AACnC,IAAA,GAAA,CAAI,OAAA,EAAS,GAAA,CAAI,YAAA,CAAa,KAAK,CAAA;AACnC,IAAA,GAAA,CAAI,KAAA,EAAO,GAAA,CAAI,YAAA,CAAa,GAAG,CAAA;AAC/B,IAAA,GAAA,CAAI,cAAA,EAAgB,GAAA,CAAI,YAAA,CAAa,YAAY,CAAA;AACjD,IAAA,GAAA,CAAI,eAAA,EAAiB,GAAA,CAAI,YAAA,CAAa,aAAa,CAAA;AACnD,IAAA,GAAA,CAAI,cAAA,EAAgB,GAAA,CAAI,YAAA,CAAa,YAAY,CAAA;AACjD,IAAA,GAAA,CAAI,QAAA,EAAU,GAAA,CAAI,YAAA,CAAa,MAAM,CAAA;AACrC,IAAA,IAAI,GAAA,CAAI,aAAa,IAAA,KAAS,MAAA,MAAe,MAAA,EAAQ,GAAA,CAAI,aAAa,IAAI,CAAA;AAAA,EAC5E;AAEA,EAAA,IAAI,IAAI,OAAA,EAAS;AACf,IAAA,GAAA,CAAI,OAAA,EAAS,GAAA,CAAI,OAAA,CAAQ,KAAK,CAAA;AAC9B,IAAA,GAAA,CAAI,SAAA,EAAW,GAAA,CAAI,OAAA,CAAQ,OAAO,CAAA;AAAA,EACpC;AAEA,EAAA,IAAI,IAAI,OAAA,EAAS;AACf,IAAA,MAAM,EAAE,OAAA,EAAS,EAAA,EAAI,GAAG,IAAA,KAAS,GAAA,CAAI,OAAA;AACrC,IAAA,GAAA,CAAI,WAAW,IAAI,CAAA;AAAA,EACrB;AAEA,EAAA,IAAI,IAAI,QAAA,EAAU,WAAA,MAAiB,UAAA,EAAY,GAAA,CAAI,SAAS,WAAW,CAAA;AAEvE,EAAA,IAAI,IAAI,UAAA,EAAY,UAAA,MAAgB,YAAA,EAAc,GAAA,CAAI,WAAW,UAAU,CAAA;AAE3E,EAAA,IAAI,IAAI,OAAA,EAAS;AACf,IAAA,MAAM,EAAE,QAAA,EAAU,GAAA,EAAK,WAAA,EAAa,eAAA,KAAoB,GAAA,CAAI,OAAA;AAC5D,IAAA,IAAI,QAAA,KAAa,MAAA,IAAa,GAAA,KAAQ,MAAA,EAAW,GAAA,CAAI,SAAA,EAAW,OAAA,CAAQ,EAAE,QAAA,EAAU,GAAA,EAAK,CAAC,CAAA;AAC1F,IAAA,GAAA,CAAI,eAAe,WAAW,CAAA;AAC9B,IAAA,GAAA,CAAI,mBAAmB,eAAe,CAAA;AAAA,EACxC;AAEA,EAAA,IAAI,IAAI,IAAA,EAAM;AACZ,IAAA,MAAM,EAAE,OAAA,EAAS,EAAA,EAAI,GAAG,IAAA,KAAS,GAAA,CAAI,IAAA;AACrC,IAAA,GAAA,CAAI,QAAQ,IAAI,CAAA;AAAA,EAClB;AAEA,EAAA,MAAM,OAAO,GAAA,CAAI,IAAA;AACjB,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,IAAI,IAAA,CAAK,MAAM,GAAA,CAAI,MAAA,EAAQ,QAAkC,IAAA,CAAK,IAAA,EAAM,WAAW,CAAC,CAAA;AACpF,IAAA,IAAI,IAAA,CAAK,UAAU,GAAA,CAAI,UAAA,EAAY,QAAsB,IAAA,CAAK,QAAA,EAAU,eAAe,CAAC,CAAA;AACxF,IAAA,IAAI,IAAA,CAAK,MAAM,GAAA,CAAI,MAAA,EAAQ,QAA8B,IAAA,CAAK,IAAA,EAAM,WAAW,CAAC,CAAA;AAChF,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,MAAM,aAAsC,EAAC;AAC7C,MAAA,KAAA,MAAW,CAAC,KAAK,MAAM,CAAA,IAAK,OAAO,OAAA,CAAQ,IAAA,CAAK,UAAU,CAAA,EAAG;AAC3D,QAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,MAAA,EAAQ,CAAA,gBAAA,EAAmB,GAAG,CAAA,CAAE,CAAA;AACtD,QAAA,IAAI,KAAA,KAAU,MAAA,EAAW,UAAA,CAAW,GAAG,CAAA,GAAI,KAAA;AAAA,MAC7C;AACA,MAAA,IAAI,MAAA,CAAO,KAAK,UAAU,CAAA,CAAE,SAAS,CAAA,EAAG,GAAA,CAAI,cAAc,UAAkC,CAAA;AAAA,IAC9F;AACA,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,MAAM,SAAsC,EAAC;AAC7C,MAAA,KAAA,MAAW,KAAA,IAAS,KAAK,MAAA,EAAQ;AAC/B,QAAA,MAAM,SAAA,GAAY,OAAA;AAAA,UAChB,KAAA,CAAM,SAAA;AAAA,UACN,CAAA,YAAA,EAAe,MAAM,EAAE,CAAA,WAAA;AAAA,SACzB;AACA,QAAA,IAAI,cAAc,MAAA,EAAW;AAC7B,QAAA,MAAA,CAAO,IAAA;AAAA,UACL,OAAA,CAAQ;AAAA,YACN,IAAI,KAAA,CAAM,EAAA;AAAA,YACV,MAAM,KAAA,CAAM,IAAA;AAAA,YACZ,MAAM,KAAA,CAAM,IAAA;AAAA,YACZ,QAAQ,KAAA,CAAM,MAAA;AAAA,YACd;AAAA,WACD;AAAA,SACH;AAAA,MACF;AACA,MAAA,IAAI,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,GAAA,CAAI,UAAU,MAAM,CAAA;AAAA,IAC7C;AACA,IAAA,IAAI,KAAK,sBAAA,EAAwB;AAC/B,MAAA,MAAM,gBAAA,GAAmB,OAAA;AAAA,QACvB,IAAA,CAAK,sBAAA;AAAA,QACL;AAAA,OACF;AACA,MAAA,IAAI,qBAAqB,MAAA,EAAW;AAClC,QAAA,GAAA,CAAI,QAAA,EAAU,EAAE,GAAI,GAAA,CAAI,cAAc,MAAA,IAAU,EAAC,EAAI,gBAAA,EAAkB,CAAA;AAAA,MACzE;AAAA,IACF;AACA,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,MAAM,MAAA,GAAS,OAAA,CAAgC,IAAA,CAAK,YAAA,EAAc,mBAAmB,CAAA;AACrF,MAAA,IAAI,WAAW,MAAA,EAAW;AACxB,QAAA,GAAA,CAAI,QAAA,EAAU,EAAE,GAAI,GAAA,CAAI,cAAc,MAAA,IAAU,EAAC,EAAI,MAAA,EAAQ,CAAA;AAAA,MAC/D;AAAA,IACF;AAAA,EACF;AACA,EAAA,IAAI,OAAO,MAAA,KAAW,MAAA,IAAa,GAAA,CAAI,YAAA,EAAc,WAAW,MAAA,EAAW;AACzE,IAAA,GAAA,CAAI,QAAA,EAAU,GAAA,CAAI,YAAA,CAAa,MAAM,CAAA;AAAA,EACvC;AAEA,EAAA,OAAO,MAAA;AACT","file":"chunk-SDQHSUFC.js","sourcesContent":["import { create } from 'zustand'\nimport { persist } from 'zustand/middleware'\n\n// Customer session state. Identity is established through the shared\n// @fayz-ai/auth AuthAdapter (see ../auth.ts) — this store only mirrors the\n// linked ShopCustomer for synchronous UI access.\n\nexport interface SessionState {\n customerId: string | null\n email: string | null\n name: string | null\n setSession(session: { customerId: string; email: string; name?: string | null }): void\n signOut(): void\n}\n\nexport const useSessionStore = create<SessionState>()(\n persist(\n (set) => ({\n customerId: null,\n email: null,\n name: null,\n setSession: ({ customerId, email, name }) =>\n set({ customerId, email, name: name ?? null }),\n signOut: () => set({ customerId: null, email: null, name: null }),\n }),\n { name: 'fayz.storefront.session.v1' },\n ),\n)\n","import type { AuthAdapter, AuthUser } from '@fayz-ai/core'\nimport {\n createAuthRuntime,\n createMockAuthAdapter,\n type AuthPluginOptions,\n} from '@fayz-ai/plugin-auth'\nimport { getShopProvider } from '@fayz-ai/shop/runtime'\nimport { setShopAccessTokenResolver } from '@fayz-ai/sdk/shop'\nimport { useSessionStore } from '../stores/session.store'\n\n// ---------------------------------------------------------------------------\n// Customer auth — the SAME AuthAdapter contract createSaasApp uses, so the\n// mock and Supabase adapters from @fayz-ai/auth serve both the saas admin and\n// the storefront customer. The storefront adds one layer on top: linking the\n// auth identity to a ShopCustomer record (find-or-create by email) so orders\n// and purchase history attach to a customer.\n// ---------------------------------------------------------------------------\n\nexport type StorefrontAuthAdapter = AuthAdapter | 'mock' | 'supabase' | (string & {})\n\n/** Thrown by signUpCustomer when the adapter reports a user but no live\n * session (Supabase's signal for \"email confirmation required\" — see\n * createSupabaseAuthAdapter's signUp, which returns accessToken: '' instead\n * of null/an error). Signup succeeded; the customer just isn't authenticated\n * yet, so we must not link/persist a session for them. */\nexport class EmailConfirmationRequiredError extends Error {\n readonly email: string\n\n constructor(email: string) {\n super('Cadastro realizado. Confirme seu e-mail para continuar.')\n this.name = 'EmailConfirmationRequiredError'\n this.email = email\n }\n}\n\nexport interface StorefrontAuthConfig {\n adapter?: AuthPluginOptions['adapter']\n provider?: AuthPluginOptions['provider']\n routes?: AuthPluginOptions['routes']\n supabase?: AuthPluginOptions['supabase']\n}\n\nlet _adapter: AuthAdapter | null = null\n\nfunction isAuthAdapter(value: unknown): value is AuthAdapter {\n return Boolean(\n value &&\n typeof value === 'object' &&\n 'getSession' in value &&\n 'signIn' in value &&\n 'signOut' in value,\n )\n}\n\nfunction normalizeAuthConfig(\n configured: StorefrontAuthAdapter | StorefrontAuthConfig | undefined,\n): StorefrontAuthConfig {\n if (!configured) return {}\n if (typeof configured === 'string' || isAuthAdapter(configured)) return { adapter: configured }\n return configured\n}\n\nexport function resolveAuthAdapter(\n configured: StorefrontAuthAdapter | StorefrontAuthConfig | undefined,\n fallback?: { supabaseUrl?: string; supabaseAnonKey?: string },\n): AuthAdapter {\n const config = normalizeAuthConfig(configured)\n return createAuthRuntime({\n provider: config.provider ?? config.adapter ?? (fallback?.supabaseUrl ? 'supabase' : 'mock'),\n adapter: config.adapter,\n routes: config.routes,\n requireAuth: false,\n supabase: {\n url: config.supabase?.url ?? fallback?.supabaseUrl,\n anonKey: config.supabase?.anonKey ?? fallback?.supabaseAnonKey,\n client: config.supabase?.client,\n callbackUrl: config.supabase?.callbackUrl,\n resetPasswordUrl: config.supabase?.resetPasswordUrl,\n },\n }).adapter\n}\n\n// The shopper's current access token, handed to the shop REST client so its\n// requests reach PostgREST as the signed-in user instead of as `anon`. Held\n// here rather than in the session store because it is a credential: it must not\n// be persisted to localStorage alongside the customer id. The Supabase client\n// owns its own refresh; this is only a mirror of the live value.\nlet _accessToken: string | null = null\n\n/** Whether an authenticated identity was ever seen this session. Distinguishes\n * \"signed out\" from \"was never signed in\" — see the onAuthStateChange guard. */\nlet _hadAuthUser = false\n\n/** Refresh the mirrored token from the adapter. Safe to call on any event. */\nasync function syncAccessToken(adapter: AuthAdapter): Promise<void> {\n try {\n const existing = await adapter.getSession()\n _accessToken = existing?.session.accessToken ?? null\n } catch {\n _accessToken = null\n }\n}\n\n/** Called once by createStorefrontApp. Restores any persisted session. */\nexport function initCustomerAuth(adapter: AuthAdapter): void {\n _adapter = adapter\n\n // Registered before the first await so no request can slip out anonymously\n // while the session is still being restored.\n setShopAccessTokenResolver(() => _accessToken)\n\n adapter\n .getSession()\n .then((existing) => {\n _accessToken = existing?.session.accessToken ?? null\n if (!existing) return\n _hadAuthUser = true\n const store = useSessionStore.getState()\n // Re-link only when the persisted shop session doesn't match the auth user\n if (store.email !== existing.user.email) {\n void linkCustomer(existing.user)\n }\n })\n .catch(() => {})\n\n adapter.onAuthStateChange((user) => {\n if (!user) {\n _accessToken = null\n // Only tear down the shop session if there WAS an authenticated identity\n // to lose. The Supabase adapter fires this once on boot with a null user\n // (INITIAL_SESSION), and clearing unconditionally wiped the guest's local\n // session on every page load — a guest who checked out could no longer\n // find their order after a reload. The mock adapter never surfaced this\n // because it always restored a session.\n if (_hadAuthUser) {\n _hadAuthUser = false\n useSessionStore.getState().signOut()\n }\n return\n }\n _hadAuthUser = true\n // Covers token refresh too, not just sign-in: the callback carries the user\n // but not the token, and a stale token would 401 every read an hour in.\n void syncAccessToken(adapter)\n })\n}\n\nexport function getCustomerAuthAdapter(): AuthAdapter {\n if (!_adapter) _adapter = createMockAuthAdapter()\n return _adapter\n}\n\n/** Resolve (find-or-create + server-side auth link) the ShopCustomer for an email. */\nasync function resolveShopCustomer(email: string, name: string) {\n const provider = getShopProvider()\n // Preferred: provider.resolveCustomer find-or-creates AND links auth.uid\n // server-side (RLS-safe). Falls back to generic CRUD for legacy providers.\n if (provider.resolveCustomer) return provider.resolveCustomer({ email, name })\n const matches = await provider.listCustomers({ search: email, limit: 10 })\n const existing = matches.find((c) => (c.email ?? '').toLowerCase() === email)\n if (existing) return existing\n const parts = name.trim().split(/\\s+/).filter(Boolean)\n return provider.createCustomer({\n firstName: parts[0] ?? email.split('@')[0] ?? 'Cliente',\n lastName: parts.slice(1).join(' '),\n email,\n })\n}\n\n/** Find-or-create the ShopCustomer for an auth identity and persist the session. */\nasync function linkCustomer(user: AuthUser, fullName?: string): Promise<{ customerId: string }> {\n const email = (user.email ?? '').trim().toLowerCase()\n const name = fullName ?? user.fullName ?? ''\n const customer = await resolveShopCustomer(email, name)\n useSessionStore.getState().setSession({\n customerId: customer.id,\n email,\n name: name || `${customer.firstName} ${customer.lastName}`.trim(),\n })\n return { customerId: customer.id }\n}\n\nexport interface EstablishSessionOptions {\n /** Provided → adapter.signIn; omitted → passwordless customer identity via signUp (mock-friendly). */\n password?: string\n name?: string\n}\n\n/**\n * Sign a customer in through the auth adapter and link the ShopCustomer.\n * Used by the account page sign-in AND by checkout (so a buyer is signed in\n * for \"my purchases\" immediately after purchase) — one auth path, two doors.\n */\nexport async function establishCustomerSession(\n email: string,\n opts?: EstablishSessionOptions,\n): Promise<{ customerId: string }> {\n const normalized = email.trim().toLowerCase()\n if (opts?.password) {\n const adapter = getCustomerAuthAdapter()\n const session = await adapter.signIn(normalized, opts.password)\n // Before linkCustomer, not after: linkCustomer calls shop_resolve_customer,\n // which reads auth.uid() to fill auth_user_id. Sent with the old token that\n // link silently no-ops and the account stays unlinked forever.\n _accessToken = session.accessToken ?? null\n _hadAuthUser = true\n return linkCustomer(session.user.email ? session.user : { ...session.user, email: normalized }, opts.name)\n }\n // Guest / passwordless checkout: do NOT create an auth account (that made\n // returning guests fail with \"user already registered\" on Supabase). Just\n // resolve the ShopCustomer and persist the local session for order history.\n return linkCustomer({ id: '', email: normalized } as AuthUser, opts?.name)\n}\n\n/** Convenience wrapper — passwordless email sign-in (guest checkout path). */\nexport function signInByEmail(email: string, name?: string): Promise<{ customerId: string }> {\n return establishCustomerSession(email, { name })\n}\n\n/** Explicit account creation (account page \"Criar conta\" form). */\nexport async function signUpCustomer(\n email: string,\n password: string,\n name: string,\n): Promise<{ customerId: string }> {\n const adapter = getCustomerAuthAdapter()\n const normalized = email.trim().toLowerCase()\n const session = await adapter.signUp(normalized, password, name)\n // Empty accessToken == account created but not authenticated (email\n // confirmation pending). Do NOT link/persist a session for an unconfirmed\n // user — see EmailConfirmationRequiredError.\n if (!session.accessToken) throw new EmailConfirmationRequiredError(normalized)\n _accessToken = session.accessToken\n _hadAuthUser = true\n return linkCustomer(session.user.email ? session.user : { ...session.user, email: normalized }, name)\n}\n\nexport async function signOutCustomer(): Promise<void> {\n try {\n await getCustomerAuthAdapter().signOut()\n } finally {\n _accessToken = null\n _hadAuthUser = false\n useSessionStore.getState().signOut()\n }\n}\n","export function formatMoney(value: number, currency = 'BRL', locale = 'pt-BR'): string {\n return new Intl.NumberFormat(locale, { style: 'currency', currency }).format(value)\n}\n\nexport function roundCents(value: number): number {\n return Math.round(value * 100) / 100\n}\n","import type { Product, ProductVariant } from '@fayz-ai/shop/types'\n\nexport interface ProductOptionGroup {\n id: string\n label: string\n values: string[]\n}\n\nexport type ProductOptionSelection = Record<string, string>\n\nfunction cleanValues(value: unknown): string[] {\n if (!Array.isArray(value)) return []\n return Array.from(new Set(value.filter((item): item is string => typeof item === 'string' && item.trim().length > 0)))\n}\n\nfunction cleanOptionGroup(value: unknown): ProductOptionGroup | null {\n if (!value || typeof value !== 'object') return null\n const record = value as Record<string, unknown>\n const id = typeof record.id === 'string' ? record.id : typeof record.name === 'string' ? record.name : null\n const label = typeof record.label === 'string' ? record.label : typeof record.name === 'string' ? record.name : id\n const values = cleanValues(record.values)\n if (!id || !label || values.length === 0) return null\n return { id, label, values }\n}\n\n// I10: the overlay shim warns once per product, not per render — the console\n// is a signal channel, not a firehose.\nconst warnedOverlayProducts = new Set<string>()\n\n/** Test seam — re-arms the once-per-product overlay deprecation warning. */\nexport function resetProductOptionsDeprecationWarnings(): void {\n warnedOverlayProducts.clear()\n}\n\n/**\n * The option axes the PDP picker renders, in order of authority:\n *\n * 1. `product.options` — the variant tables (0028), attached by the\n * products.bySlug loader. THE source since spine M5: these axes are the\n * ones the server prices and decrements against.\n * 2. metadata options / sizes / colors — the retired productMetadata overlay,\n * kept rendering as an I10 deprecation shim (logged, documented). Display\n * only: nothing server-side has ever heard of these labels, which is\n * exactly why the overlay lost the job. Full deletion from the stores is\n * M9 (`catalog.ts` dies everywhere).\n */\nexport function getProductOptionGroups(product: Product): ProductOptionGroup[] {\n if (product.options && product.options.length > 0) {\n return [...product.options]\n .sort((a, b) => a.position - b.position)\n .map((option) => ({ id: option.name, label: option.name, values: [...option.values] }))\n }\n\n const options = product.metadata.options\n const explicit = Array.isArray(options)\n ? options.map(cleanOptionGroup).filter((group): group is ProductOptionGroup => Boolean(group))\n : []\n\n const groups: ProductOptionGroup[] = [...explicit]\n if (groups.length === 0) {\n const sizes = cleanValues(product.metadata.sizes)\n const colors = cleanValues(product.metadata.colors)\n if (sizes.length > 0) groups.push({ id: 'Tamanho', label: 'Tamanho', values: sizes })\n if (colors.length > 0) groups.push({ id: 'Cor', label: 'Cor', values: colors })\n }\n\n if (groups.length > 0 && !warnedOverlayProducts.has(product.id)) {\n warnedOverlayProducts.add(product.id)\n console.warn(\n `[storefront] product \"${product.slug}\" renders options from the DEPRECATED metadata overlay ` +\n '(metadata.options/sizes/colors). These labels are display-only — checkout cannot price or reserve them. ' +\n 'Define real variants (0028) instead; the overlay path is removed at M9.',\n )\n }\n return groups\n}\n\n/**\n * The variant a selection denotes, or null when the product has no variants\n * or the combination does not exist (a partial selection, or axes/values the\n * variant table never had). Matching is exact over the variant's own options\n * object — the same jsonb equality 0029 relies on server-side.\n */\nexport function resolveVariantForSelection(\n product: Product,\n selection?: ProductOptionSelection | null,\n): ProductVariant | null {\n const variants = product.variants\n if (!variants || variants.length === 0) return null\n const normalized = normalizeProductOptionSelection(selection)\n const wanted = Object.entries(normalized)\n return (\n variants.find((variant) => {\n const options = variant.options\n return (\n Object.keys(options).length === wanted.length &&\n wanted.every(([key, value]) => options[key] === value)\n )\n }) ?? null\n )\n}\n\n/** The price a selection sells for: the variant's own, or the product's when\n * the variant inherits (price null) or nothing matched. */\nexport function selectionPrice(product: Product, selection?: ProductOptionSelection | null): number {\n const variant = resolveVariantForSelection(product, selection)\n return variant?.price ?? product.price\n}\n\nexport function normalizeProductOptionSelection(selection?: ProductOptionSelection | null): ProductOptionSelection {\n if (!selection) return {}\n return Object.fromEntries(\n Object.entries(selection)\n .filter((entry): entry is [string, string] => entry[0].trim().length > 0 && entry[1].trim().length > 0)\n .sort(([a], [b]) => a.localeCompare(b)),\n )\n}\n\nexport function formatProductOptionSelection(selection?: ProductOptionSelection | null): string {\n return Object.entries(normalizeProductOptionSelection(selection))\n .map(([label, value]) => `${label}: ${value}`)\n .join(' · ')\n}\n\nexport function productOptionSelectionKey(selection?: ProductOptionSelection | null): string {\n const normalized = normalizeProductOptionSelection(selection)\n const entries = Object.entries(normalized)\n return entries.length > 0 ? JSON.stringify(entries) : ''\n}\n","import { create } from 'zustand'\nimport { persist } from 'zustand/middleware'\nimport { lookupPostalCode, normalizePostalCode, type PostalAddress } from '@fayz-ai/core'\nimport { getShopProvider } from '@fayz-ai/shop/runtime'\nimport type { ShippingQuoteOption } from '@fayz-ai/shop/types'\n\n/**\n * Where the shopper wants it delivered, decided before the cart exists.\n *\n * Two different things live here and they are persisted differently on purpose:\n *\n * the ADDRESS is durable — a CEP maps to the same street for years, and\n * carrying it to checkout is the whole point (the buyer types the number and\n * nothing else);\n *\n * the QUOTE is not persisted at all. It is a price, and a price restored from\n * localStorage is a price the shopper can edit with devtools. It is re-asked\n * on demand, and resolved for the current cart through resolveOptionRate —\n * the same rule shop_shipping_for applies — so it can never go stale. The\n * order is charged from shop_place_order, which recomputes from the same\n * zones and ignores anything the client sends.\n */\n\nexport type DeliveryStatus = 'idle' | 'loading' | 'served' | 'unserved' | 'error'\n\nexport interface DeliveryState {\n postalCode: string\n address: PostalAddress | null\n options: ShippingQuoteOption[]\n selectedZoneId: string | null\n status: DeliveryStatus\n error: string | null\n /**\n * The name of the exclusion zone covering this CEP, when the store REFUSES the\n * region (0048). Null when it does not.\n *\n * Carried as a separate field rather than a fourth status because every\n * consumer already treats `unserved` as \"no delivery here\" and that is exactly\n * what this is — the field only lets the message say WHY.\n */\n refusedZone: string | null\n\n /** Look the CEP up and quote it. `subtotal` decides free-above thresholds. */\n resolve: (postalCode: string, subtotal: number) => Promise<void>\n selectZone: (zoneId: string) => void\n clear: () => void\n}\n\nconst EMPTY = {\n postalCode: '',\n address: null,\n options: [] as ShippingQuoteOption[],\n selectedZoneId: null,\n status: 'idle' as DeliveryStatus,\n error: null,\n refusedZone: null,\n}\n\nexport const useDeliveryStore = create<DeliveryState>()(\n persist(\n (set, get) => ({\n ...EMPTY,\n\n async resolve(postalCode: string, subtotal: number) {\n const code = normalizePostalCode(postalCode)\n if (code.length !== 8) {\n set({ ...EMPTY, postalCode, status: 'error', error: 'Digite os 8 dígitos do CEP.' })\n return\n }\n\n set({ postalCode: code, status: 'loading', error: null })\n\n // The QUOTE comes first and is the answer that matters. Whether we\n // deliver to a postcode, and for how much, is decided entirely by our\n // own zones against eight digits — it does not need to know the street.\n //\n // Doing it the other way round made the delivery answer depend on a\n // third party: with ViaCEP slow or rate-limited, a perfectly serviceable\n // address reported an error instead of a price.\n const shop = getShopProvider()\n\n // The store's own refusal (0048), asked CONCURRENTLY with the quote —\n // both are one RPC against the same eight digits, and the shopper is on\n // the page waiting for a number.\n //\n // It is a different question from \"does a zone cover this\": an exclusion\n // beats every zone AND a carrier's quote, because the refusal is about\n // the store and not about who carries the parcel. So it empties the\n // options even when a carrier just answered with a price.\n //\n // Swallowing the failure is deliberate: the order itself is refused\n // server-side either way, so a check that cannot run costs the shopper a\n // clearer message, never a sale that should not have happened.\n const refusalPromise = shop.checkDelivery\n ? shop\n .checkDelivery(code)\n .then((check) => (check.refused ? check.refusedZone || 'Região não atendida' : null))\n .catch(() => null)\n : Promise.resolve(null)\n\n let options: ShippingQuoteOption[] = []\n try {\n options = (await shop.quoteShipping?.(code, subtotal)) ?? []\n } catch {\n set({ ...EMPTY, postalCode: code, status: 'error',\n error: 'Não foi possível calcular o frete agora. Tente de novo.' })\n return\n }\n\n const refusedZone = await refusalPromise\n if (refusedZone) options = []\n\n // The ADDRESS is the convenience layer: it saves the buyer typing, and\n // losing it costs typing, not the sale. Failures here never change the\n // delivery verdict already decided above.\n let address: PostalAddress | null = null\n let notFound = false\n try {\n address = await lookupPostalCode(code)\n notFound = address === null\n } catch {\n address = null\n }\n\n set({\n postalCode: code,\n address,\n options,\n selectedZoneId: options[0]?.zoneId ?? null,\n refusedZone,\n // A store with no zones configured quotes nothing, and that must NOT\n // read as \"we don't deliver here\" — it falls back to the store-wide\n // flat rate, which the cart already knows how to show.\n status: options.length > 0 ? 'served' : 'unserved',\n // Reported alongside the price, not instead of it: the CEP may be\n // mistyped even though its range is covered.\n error: notFound ? 'CEP não encontrado. Confira os números.' : null,\n })\n },\n\n selectZone(zoneId: string) {\n if (!get().options.some((option) => option.zoneId === zoneId)) return\n set({ selectedZoneId: zoneId })\n // Told to the server as well, because a CARRIER price is not something\n // the order can re-derive on its own the way it re-derives a zone: it\n // has to read back the option the shopper chose. Deliberately not\n // awaited — the radio button must not wait on a round trip, and the\n // server defaults to the cheapest option, so a lost call can only ever\n // charge less than what is on screen. Stores quoting from their own\n // zones do not implement this at all.\n void getShopProvider().selectShippingOption?.(zoneId)?.catch(() => {})\n },\n\n clear() {\n set({ ...EMPTY })\n },\n }),\n {\n name: 'fayz.storefront.delivery.v1',\n // Deliberately NOT persisting `options`: a rehydrated\n // price would be shown as current without anything having quoted it. The\n // address survives, the money is asked for again.\n partialize: (state) => ({ postalCode: state.postalCode, address: state.address }),\n onRehydrateStorage: () => (state) => {\n if (state?.address) state.status = 'idle'\n },\n },\n ),\n)\n\n/**\n * The freight for the chosen zone at THIS subtotal, or null when there is no\n * zone in play (no CEP yet, or a store that configured none) and the caller\n * should use the store-wide rate. Null never means free.\n *\n * The free-above rule is applied here rather than trusting the `rate` the\n * server resolved, because that one was resolved for whatever the cart held at\n * quote time. Re-deriving from `baseRate`/`freeAbove` — the same CASE\n * shop_shipping_for runs — means adding an item can never leave a stale price\n * on screen. An earlier version fell back to the config flat rate when the\n * quote went stale, which showed R$ 8 (the flat rate) for an address in an\n * R$ 18 zone: shown one number, charged another.\n */\nexport function resolveOptionRate(option: ShippingQuoteOption, subtotal: number): number {\n if (option.freeAbove != null && subtotal >= option.freeAbove) return 0\n return option.baseRate\n}\n\nexport const selectQuotedShipping = (\n state: Pick<DeliveryState, 'options' | 'selectedZoneId' | 'status'>,\n subtotal: number,\n): number | null => {\n if (state.status !== 'served') return null\n const option = state.options.find((o) => o.zoneId === state.selectedZoneId) ?? state.options[0]\n return option ? resolveOptionRate(option, subtotal) : null\n}\n","import { create } from 'zustand'\nimport { persist } from 'zustand/middleware'\nimport type { Product } from '@fayz-ai/shop/types'\nimport { roundCents } from '../lib/format'\nimport type { ResolvedStorefrontConfig } from '../document/config'\nimport { useDeliveryStore, selectQuotedShipping } from './delivery.store'\nimport {\n formatProductOptionSelection,\n normalizeProductOptionSelection,\n productOptionSelectionKey,\n resolveVariantForSelection,\n type ProductOptionSelection,\n} from '../data/product-options'\n\nexport interface CartLine {\n lineId: string\n productId: string\n /** Variant the selection resolved to (spine M5) — what checkout sends so\n * the server prices and decrements the right counter. Absent for\n * variantless products and overlay-only (display) options. */\n variantId?: string\n slug: string\n name: string\n sku: string | null\n options: ProductOptionSelection\n optionsLabel: string\n unitPrice: number\n quantity: number\n imageUrl: string | null\n /** inventoryCount at add time — clamps quantity */\n maxQuantity: number\n /**\n * What the carrier needs to price a box, copied at add time from the VARIANT\n * when there is one and the product otherwise (0046: a camiseta P and a GG do\n * not occupy the same box).\n *\n * Copied rather than re-fetched because the quote runs on every postcode\n * keystroke and the cart is the only thing that knows what is in it. Lines\n * persisted before FAY-1407 carry none of these and read as unmeasured, which\n * is exactly what they are — the quote degrades to the store's default\n * package instead of failing.\n */\n requiresShipping?: boolean\n weight?: number | null\n weightUnit?: string | null\n heightCm?: number | null\n widthCm?: number | null\n lengthCm?: number | null\n /** Em que embalagem da loja o lojista despacha este produto (0047). Do\n * PRODUTO, nunca da variante — a variante carrega medida, não caixa. */\n packageId?: string | null\n}\n\nexport interface CartState {\n lines: CartLine[]\n discountCode: string | null\n discountPercent: number\n isOpen: boolean\n /** Line most recently added — lets the drawer briefly highlight it. */\n justAddedLineId: string | null\n addItem(product: Product, qty?: number, options?: ProductOptionSelection): void\n setQuantity(lineId: string, qty: number): void\n removeItem(lineId: string): void\n applyDiscount(code: string, percent: number): void\n clearDiscount(): void\n clear(): void\n openDrawer(): void\n closeDrawer(): void\n /** Drop persisted lines the active backend can no longer resolve (e.g. a cart\n * built in an earlier mock-mode session, whose ids don't exist live). The\n * resolver returns false only for a definitive \"not found\"; on error it must\n * return true so a transient failure never discards a legit line. */\n reconcile(resolve: (line: CartLine) => Promise<boolean>): Promise<void>\n}\n\nexport const useCartStore = create<CartState>()(\n persist(\n (set, get) => ({\n lines: [],\n discountCode: null,\n discountPercent: 0,\n isOpen: false,\n justAddedLineId: null,\n\n addItem: (product, qty = 1, options) =>\n set((state) => {\n const normalizedOptions = normalizeProductOptionSelection(options)\n const optionKey = productOptionSelectionKey(normalizedOptions)\n const lineId = optionKey ? `${product.id}:${optionKey}` : product.id\n // The selection's variant (spine M5): when the product carries real\n // variants, the VARIANT is the sellable unit — its price and its own\n // stock counter, never the product's. Display-only overlay options\n // resolve to null and keep the product-level numbers.\n const variant = resolveVariantForSelection(product, normalizedOptions)\n const unitPrice = variant?.price ?? product.price\n const stock = variant ? variant.inventoryCount : product.inventoryCount\n const existing = state.lines.find((l) => (l.lineId ?? l.productId) === lineId)\n if (existing) {\n const nextQty = Math.min(existing.quantity + qty, existing.maxQuantity || Infinity)\n return {\n // Auto-open the cart on add — the standard premium \"slide-in cart\"\n // signal — and flag the line so the drawer can highlight it.\n isOpen: true,\n justAddedLineId: lineId,\n lines: state.lines.map((l) =>\n (l.lineId ?? l.productId) === lineId ? { ...l, lineId, quantity: nextQty } : l,\n ),\n }\n }\n const image = product.images.find((i) => i.isPrimary) ?? product.images[0]\n const line: CartLine = {\n lineId,\n productId: product.id,\n variantId: variant?.id,\n slug: product.slug,\n name: product.name,\n sku: variant?.sku ?? product.sku,\n options: normalizedOptions,\n optionsLabel: formatProductOptionSelection(normalizedOptions),\n unitPrice,\n quantity: Math.min(qty, stock || Infinity),\n imageUrl: image?.url ?? null,\n maxQuantity: stock,\n requiresShipping: product.isPhysical !== false,\n weight: variant?.weight ?? product.weight ?? null,\n weightUnit: variant?.weightUnit ?? product.weightUnit ?? null,\n heightCm: variant?.heightCm ?? product.heightCm ?? null,\n widthCm: variant?.widthCm ?? product.widthCm ?? null,\n lengthCm: variant?.lengthCm ?? product.lengthCm ?? null,\n packageId: product.packageId ?? null,\n }\n return { isOpen: true, justAddedLineId: lineId, lines: [...state.lines, line] }\n }),\n\n setQuantity: (lineId, qty) =>\n set((state) => {\n if (qty <= 0) return { lines: state.lines.filter((l) => (l.lineId ?? l.productId) !== lineId) }\n return {\n lines: state.lines.map((l) =>\n (l.lineId ?? l.productId) === lineId\n ? { ...l, quantity: Math.min(qty, l.maxQuantity || Infinity) }\n : l,\n ),\n }\n }),\n\n removeItem: (lineId) =>\n set((state) => ({ lines: state.lines.filter((l) => (l.lineId ?? l.productId) !== lineId) })),\n\n applyDiscount: (code, percent) => set({ discountCode: code, discountPercent: percent }),\n clearDiscount: () => set({ discountCode: null, discountPercent: 0 }),\n clear: () => set({ lines: [], discountCode: null, discountPercent: 0 }),\n openDrawer: () => set({ isOpen: true }),\n closeDrawer: () => set({ isOpen: false, justAddedLineId: null }),\n\n reconcile: async (resolve) => {\n const lines = get().lines\n if (lines.length === 0) return\n const keep = await Promise.all(\n lines.map((line) => resolve(line).catch(() => true)),\n )\n const kept = lines.filter((_, i) => keep[i])\n if (kept.length !== lines.length) set({ lines: kept })\n },\n }),\n {\n name: 'fayz.storefront.cart.v1',\n partialize: (state) => ({\n lines: state.lines,\n discountCode: state.discountCode,\n discountPercent: state.discountPercent,\n }),\n },\n ),\n)\n\n// ---------------------------------------------------------------------------\n// Money selectors — the single place cart math happens. Checkout passes these\n// exact values to createOrder so drawer totals always match order totals.\n// ---------------------------------------------------------------------------\n\nexport const selectCount = (s: Pick<CartState, 'lines'>): number =>\n s.lines.reduce((n, l) => n + l.quantity, 0)\n\nexport const selectSubtotal = (s: Pick<CartState, 'lines'>): number =>\n roundCents(s.lines.reduce((sum, l) => sum + l.unitPrice * l.quantity, 0))\n\nexport const selectDiscountTotal = (s: Pick<CartState, 'lines' | 'discountPercent'>): number =>\n roundCents(selectSubtotal(s) * (s.discountPercent / 100))\n\n/**\n * Freight to display.\n *\n * When the shopper has given a CEP and the store quoted it, that quote wins —\n * it came from the same shipping_zones rows shop_place_order will charge from.\n * Otherwise this falls back to the store-wide rate in config, which is what\n * every storefront did before zones existed.\n *\n * The subtotal is PRE-discount on both sides of this. That is 0017's rule, and\n * the quote is requested against the same number, so a coupon can never make\n * the cart and the order disagree.\n *\n * Read through getState() rather than a hook because this is a plain selector\n * called from several screens; components that render the value subscribe to\n * useDeliveryStore themselves so a fresh quote re-renders them.\n */\n/**\n * Whether anything in this cart travels.\n *\n * A line added before FAY-1407 has no flag and counts as physical: a cart of\n * real goods that suddenly ships for free is a worse failure than a download\n * that shows a delivery box.\n */\nexport const selectRequiresShipping = (s: Pick<CartState, 'lines'>): boolean =>\n s.lines.some((l) => l.requiresShipping !== false)\n\nexport const selectShipping = (\n s: Pick<CartState, 'lines'>,\n cfg: ResolvedStorefrontConfig,\n): number => {\n if (s.lines.length === 0) return 0\n // Nothing here is delivered. Not \"free delivery\" — no delivery, so neither\n // the quote nor the store-wide flat rate applies. Without this a cart of\n // e-books was charged the config's flatRate for a parcel that never exists.\n if (!selectRequiresShipping(s)) return 0\n const subtotal = selectSubtotal(s)\n\n const quoted = selectQuotedShipping(useDeliveryStore.getState(), subtotal)\n if (quoted != null) return quoted\n\n if (cfg.shipping.freeAbove != null && subtotal >= cfg.shipping.freeAbove) return 0\n return cfg.shipping.flatRate\n}\n\nexport const selectTotal = (\n s: Pick<CartState, 'lines' | 'discountPercent'>,\n cfg: ResolvedStorefrontConfig,\n): number =>\n roundCents(selectSubtotal(s) - selectDiscountTotal(s) + selectShipping(s, cfg))\n","// ---------------------------------------------------------------------------\n// Metadata refinements — the one matcher.\n//\n// A store's discovery axes live in `product.metadata`: `collection`, and\n// whatever else that store sells by (`purpose`, `brand`, `room`, `skin type`).\n// The catalogue page refines by them from the URL, a rail refines by them from\n// its props, and a server loader has to answer both — so the rule for \"does\n// this product match this refinement\" is defined once, here, and imported by\n// all three.\n//\n// A leaf module on purpose: the loader must import it without pulling zustand\n// in behind the catalogue store.\n// ---------------------------------------------------------------------------\n\n/**\n * Active refinements, keyed by the `product.metadata` field they match.\n *\n * A metadata value may be a scalar or an array; an array matches if it contains\n * the wanted value, which is what makes multi-valued facets like\n * `purpose: ['estudar', 'presentear']` work.\n */\nexport type CatalogFacets = Readonly<Record<string, string>>\n\n/** Does a product satisfy every active facet? */\nexport function matchesFacets(\n metadata: Record<string, unknown> | null | undefined,\n facets: CatalogFacets,\n): boolean {\n for (const [key, wanted] of Object.entries(facets)) {\n const actual = metadata?.[key]\n if (Array.isArray(actual)) {\n if (!actual.some((v) => String(v) === wanted)) return false\n } else if (String(actual ?? '') !== wanted) {\n return false\n }\n }\n return true\n}\n\n/**\n * One authored refinement, as a repeatable row.\n *\n * A `Record<string, string>` is the natural shape for the matcher and for a\n * hand-written config, but it is not something an editor can render a form for\n * or an agent can generate against — the block schema vocabulary has no map\n * type, and declaring one as a shapeless `list` is a schema that lies (the\n * strict `auditBlocks` bar rejects it). So the authored form is a list of\n * pairs, and both forms normalise here.\n */\nexport interface CatalogFacetEntry {\n key: string\n value: string\n}\n\n/** Either authored form → the map the matcher and the loader use. */\nexport function toFacetMap(\n input: CatalogFacets | readonly CatalogFacetEntry[] | undefined | null,\n): CatalogFacets {\n if (!input) return {}\n if (!Array.isArray(input)) return input as CatalogFacets\n const out: Record<string, string> = {}\n for (const entry of input as readonly CatalogFacetEntry[]) {\n if (entry?.key && entry.value != null) out[entry.key] = String(entry.value)\n }\n return out\n}\n\n/** Immutably set or drop one key. */\nexport function withFacet(facets: CatalogFacets, key: string, value: string | null): CatalogFacets {\n if (value == null || value === '') {\n if (!(key in facets)) return facets\n const { [key]: _dropped, ...rest } = facets\n return rest\n }\n if (facets[key] === value) return facets\n return { ...facets, [key]: value }\n}\n\n/**\n * Fold the named `collection` shorthand into the facet map.\n *\n * `collection` is the one axis with a name of its own — a block prop, a loader\n * param and a query key all spell it out. It is still just a metadata\n * refinement, so it is merged here rather than filtered separately: two code\n * paths applying refinements is how a rail and the catalogue come to disagree\n * about what \"in this collection\" means.\n */\nexport function mergeCollectionFacet(\n facets: CatalogFacets | readonly CatalogFacetEntry[] | undefined | null,\n collection: string | undefined | null,\n): CatalogFacets {\n const map = toFacetMap(facets)\n return collection ? { collection, ...map } : map\n}\n","import { defineLoader, resolveEntityDeclaration } from '@fayz-ai/core'\nimport type { LoaderContext } from '@fayz-ai/core'\nimport type { ShopProvider } from '@fayz-ai/shop/provider'\nimport type { EntityRecord } from '@fayz-ai/shop/entities'\nimport type { Category, ListProductsOptions, Product } from '@fayz-ai/shop/types'\nimport { matchesFacets, mergeCollectionFacet, type CatalogFacetEntry } from './facets'\n\n// ---------------------------------------------------------------------------\n// The core storefront loaders — the reads the SDK blocks and the fleet's\n// param-driven routes actually need, behind the ShopProvider port (I11).\n//\n// Every read here goes through `ctx.shop`; nothing imports a backend. Filters\n// the provider cannot push down (category-by-name, collection tag, sale state)\n// are applied over the fetched active list, which keeps loader semantics\n// identical across the mock and Supabase providers and identical to what the\n// blocks did internally before M3. Pushing them into the providers is a\n// provider-contract change tracked for M9, not a loader change: the loader's\n// params are the stable surface.\n// ---------------------------------------------------------------------------\n\nexport type StorefrontLoaderContext = LoaderContext<ShopProvider>\n\nexport type ProductsSort = 'catalog' | 'newest' | 'price-asc' | 'price-desc' | 'name'\n\nexport interface ProductsListParams extends Record<string, unknown> {\n /** Quick filter, mirroring the products/productSlider block vocabulary:\n * 'new' implies sort 'newest'; 'sale' implies onSale. */\n filter?: 'all' | 'new' | 'sale'\n /**\n * Category id, category SLUG, or exact category name — resolved in that\n * order (see {@link filterByCategory}). The slug form is what makes the M3\n * `/category/:slug` page shape portable to a backend with opaque ids.\n */\n category?: string\n /**\n * Matched against each product's `metadata.collection` tag. The named\n * shorthand for `facets: { collection }` — both go through one matcher.\n */\n collection?: string\n /**\n * Arbitrary refinements over `product.metadata`. This is the store's own\n * discovery axis — `purpose`, `brand`, `room` — without the SDK knowing the\n * axis exists. An array-valued metadata field matches if it contains the\n * value. Accepts the authored row form or a plain map; both normalise.\n */\n facets?: Record<string, string> | readonly CatalogFacetEntry[]\n search?: string\n sort?: ProductsSort\n limit?: number\n offset?: number\n inStock?: boolean\n onSale?: boolean\n}\n\nconst SORT_TO_PROVIDER: Record<ProductsSort, Pick<ListProductsOptions, 'orderBy' | 'order'>> = {\n catalog: { orderBy: 'sort_order', order: 'asc' },\n newest: { orderBy: 'created_at', order: 'desc' },\n 'price-asc': { orderBy: 'price', order: 'asc' },\n 'price-desc': { orderBy: 'price', order: 'desc' },\n name: { orderBy: 'name', order: 'asc' },\n}\n\nasync function productsList(params: ProductsListParams, ctx: StorefrontLoaderContext): Promise<Product[]> {\n const sort: ProductsSort = params.sort ?? (params.filter === 'new' ? 'newest' : 'catalog')\n const onSale = params.onSale ?? params.filter === 'sale'\n const list = await ctx.shop.listProducts({\n status: 'active',\n search: params.search || undefined,\n ...SORT_TO_PROVIDER[sort],\n })\n let out = list\n if (params.category) {\n out = await filterByCategory(out, String(params.category), ctx)\n }\n // `collection` is folded into the facet map rather than filtered separately:\n // two code paths applying metadata refinements is how a rail and the\n // catalogue come to disagree about what \"in this collection\" means. Strict\n // equality also missed an array-valued tag, so a product in two collections\n // was in neither.\n const facets = mergeCollectionFacet(params.facets, params.collection)\n if (Object.keys(facets).length > 0) out = out.filter((p) => matchesFacets(p.metadata, facets))\n if (onSale) out = out.filter((p) => p.compareAtPrice != null && p.compareAtPrice > p.price)\n if (params.inStock) out = out.filter((p) => p.inventoryCount > 0)\n const offset = params.offset ?? 0\n return out.slice(offset, params.limit != null ? offset + params.limit : undefined)\n}\n\n/**\n * The `category` param → a filtered product list, with a DOCUMENTED resolution\n * order:\n *\n * 1. category id (`p.categoryId === param`)\n * 2. exact category name (`p.categoryName === param`)\n * 3. category SLUG (resolved through `listCategories()`, case-insensitive)\n *\n * (1) and (2) are the pre-M3 block vocabulary and stay byte-identical — a\n * store whose ids already match keeps working and pays no extra read, because\n * the categories lookup only happens when the direct match found nothing.\n *\n * (3) is why this function exists. The M3 category-landing shape is\n * `path: '/category/:slug'` + `params: { category: { $param: 'slug' } }`, which\n * previously only worked when a store's category ids HAPPENED to equal its\n * slugs — cristinarotondaro had to remap its mock catalog to make the URLs\n * resolve, and against a live backend with opaque (uuid) ids those same URLs\n * would have silently returned an empty grid. The page shape is portable now.\n */\nasync function filterByCategory(\n products: Product[],\n param: string,\n ctx: StorefrontLoaderContext,\n): Promise<Product[]> {\n const direct = products.filter((p) => p.categoryId === param || p.categoryName === param)\n if (direct.length > 0) return direct\n\n const wanted = param.trim().toLowerCase()\n if (!wanted) return direct\n const categories = await ctx.shop.listCategories()\n const match = findCategoryBySlug(categories, wanted)\n if (!match) return direct\n return products.filter((p) => p.categoryId === match.id || p.categoryName === match.name)\n}\n\n/** Depth-first slug lookup — `listCategories()` may return a nested tree. */\nfunction findCategoryBySlug(categories: Category[], slug: string): Category | null {\n for (const category of categories) {\n if ((category.slug ?? '').trim().toLowerCase() === slug) return category\n const child = category.children ? findCategoryBySlug(category.children, slug) : null\n if (child) return child\n }\n return null\n}\n\nexport interface ProductBySlugParams extends Record<string, unknown> {\n slug: string\n}\n\nasync function productBySlug(params: ProductBySlugParams, ctx: StorefrontLoaderContext): Promise<Product | null> {\n if (!params.slug) return null\n const matches = await ctx.shop.listProducts({ slug: params.slug, status: 'active', limit: 1 })\n const product = matches[0]\n if (!product) return null\n // Variants ride the product-detail read (spine M5): the option picker\n // sources from the 0028 tables through the provider port — never from the\n // productMetadata overlay. Attached here and not in listProducts because a\n // catalog grid does not pay a per-product variant read.\n if (ctx.shop.getProductVariants) {\n const { options, variants } = await ctx.shop.getProductVariants(product.id)\n if (options.length > 0 || variants.length > 0) return { ...product, options, variants }\n }\n return product\n}\n\nasync function categoriesList(_params: Record<string, unknown>, ctx: StorefrontLoaderContext): Promise<Category[]> {\n return ctx.shop.listCategories()\n}\n\n/**\n * Collections are not a catalog entity (yet — spine M4 can make them one):\n * they are the distinct `metadata.collection` tags stores already put on\n * products. The loader makes the vocabulary readable without inventing data.\n */\n// --- Custom entities (spine M4) -----------------------------------------------\n// The declaration is checked FIRST (I2: an unknown entity names the declared\n// set), then the read goes through the provider port like every other loader.\n// A provider without entity support is a capability error, not a silent [].\n\nfunction entityCapableShop(shop: ShopProvider): Required<Pick<ShopProvider, 'listEntityRecords' | 'getEntityRecordBySlug'>> & ShopProvider {\n if (!shop.listEntityRecords || !shop.getEntityRecordBySlug) {\n throw new Error(\n 'This backend provider does not support custom entities (describeStore capabilities.customEntities). ' +\n 'Both the Fayz Supabase provider and the mock provider do — a custom provider must implement the entity methods.',\n )\n }\n return shop as Required<Pick<ShopProvider, 'listEntityRecords' | 'getEntityRecordBySlug'>> & ShopProvider\n}\n\nexport interface EntityListParams extends Record<string, unknown> {\n entity: string\n limit?: number\n offset?: number\n orderBy?: string\n order?: 'asc' | 'desc'\n}\n\nasync function entityList(params: EntityListParams, ctx: StorefrontLoaderContext): Promise<EntityRecord[]> {\n resolveEntityDeclaration(String(params.entity ?? ''))\n const shop = entityCapableShop(ctx.shop)\n return shop.listEntityRecords(params.entity, {\n limit: params.limit,\n offset: params.offset,\n orderBy: params.orderBy,\n order: params.order,\n })\n}\n\nexport interface EntityBySlugParams extends Record<string, unknown> {\n entity: string\n slug: string\n}\n\nasync function entityBySlug(params: EntityBySlugParams, ctx: StorefrontLoaderContext): Promise<EntityRecord | null> {\n resolveEntityDeclaration(String(params.entity ?? ''))\n if (!params.slug) return null\n const shop = entityCapableShop(ctx.shop)\n return shop.getEntityRecordBySlug(params.entity, params.slug)\n}\n\nasync function collectionsList(_params: Record<string, unknown>, ctx: StorefrontLoaderContext): Promise<string[]> {\n const products = await ctx.shop.listProducts({ status: 'active' })\n const tags = new Set<string>()\n for (const product of products) {\n const tag = product.metadata?.collection\n if (typeof tag === 'string' && tag) tags.add(tag)\n }\n return [...tags].sort()\n}\n\nlet registered = false\n\n/** Register the SDK loaders. Idempotent; called wherever blocks are registered,\n * because the SDK blocks declare their data needs against these ids. */\nexport function registerStorefrontLoaders(): void {\n if (registered) return\n registered = true\n\n defineLoader('products.list', productsList, {\n source: 'sdk',\n title: 'Product list',\n description: 'Active products, filtered and ordered. The read behind every product rail, slider and grid.',\n output: 'Array of Product (id, slug, name, price, compareAtPrice, images, categoryId/Name, metadata …).',\n settings: [\n {\n id: 'filter',\n type: 'select',\n label: 'Quick filter',\n help: \"Mirrors the block vocabulary: 'new' = newest first, 'sale' = only discounted products, 'all' = no quick filter.\",\n options: [\n { value: 'all', label: 'All products' },\n { value: 'new', label: 'New arrivals' },\n { value: 'sale', label: 'On sale' },\n ],\n },\n {\n id: 'category',\n type: 'category',\n label: 'Category',\n help: 'Category id or exact category name. Empty means the whole catalog.',\n },\n {\n id: 'collection',\n type: 'text',\n label: 'Collection tag',\n help: \"Matched against each product's metadata.collection tag. Shorthand for the `collection` key of `facets`.\",\n },\n {\n id: 'facets',\n type: 'list',\n label: 'Metadata refinements',\n help: \"Refinements over product.metadata — the store's own discovery axis (purpose, brand, room). Every row must match. An array-valued metadata field matches if it contains the value.\",\n of: [\n { id: 'key', type: 'text', label: 'Metadata field', required: true },\n { id: 'value', type: 'text', label: 'Value', required: true },\n ],\n },\n { id: 'search', type: 'text', label: 'Search', help: 'Free-text search over name/description.' },\n {\n id: 'sort',\n type: 'select',\n label: 'Sort',\n help: \"Default 'catalog' (the store's own ordering); the 'new' quick filter implies 'newest'.\",\n options: [\n { value: 'catalog', label: 'Catalog order' },\n { value: 'newest', label: 'Newest first' },\n { value: 'price-asc', label: 'Price, low to high' },\n { value: 'price-desc', label: 'Price, high to low' },\n { value: 'name', label: 'Name' },\n ],\n },\n { id: 'limit', type: 'number', label: 'Limit', help: 'Max products returned. Empty returns all.', min: 1 },\n { id: 'offset', type: 'number', label: 'Offset', help: 'Pagination offset, applied with limit.', min: 0 },\n { id: 'inStock', type: 'boolean', label: 'In stock only' },\n { id: 'onSale', type: 'boolean', label: 'On sale only', help: 'Only products with a compare-at price above the current price.' },\n ],\n })\n\n defineLoader('products.bySlug', productBySlug, {\n source: 'sdk',\n title: 'Product by slug',\n description: 'One active product, looked up by its URL slug — the product page read.',\n output:\n 'Product with its option axes and variants attached (options/variants, from the variant tables), or null when no active product has the slug.',\n settings: [\n {\n id: 'slug',\n type: 'text',\n label: 'Slug',\n help: \"The product's URL slug. On a product route, bind it: { slug: { $param: 'slug' } }.\",\n required: true,\n },\n ],\n })\n\n defineLoader('categories.list', categoriesList, {\n source: 'sdk',\n title: 'Category list',\n description: 'Every catalog category, in store order.',\n output: 'Array of Category (id, name, slug, imageUrl …).',\n settings: [],\n })\n\n defineLoader('collections.list', collectionsList, {\n source: 'sdk',\n title: 'Collection tags',\n description: \"The distinct metadata.collection tags used by the store's active products.\",\n output: 'Sorted array of collection tag strings.',\n settings: [],\n })\n\n defineLoader('entity.list', entityList, {\n source: 'sdk',\n title: 'Entity records',\n description:\n 'Records of a declared custom entity (defineEntity). The read behind the entityList block and any custom listing.',\n output: 'Array of EntityRecord (id, slug, data — the declared fields —, createdAt, updatedAt).',\n settings: [\n {\n id: 'entity',\n type: 'entity',\n label: 'Entity',\n help: \"The defineEntity key, e.g. 'store_location'. Unknown keys are an error naming the declared set.\",\n required: true,\n },\n { id: 'limit', type: 'number', label: 'Limit', help: 'Max records returned. Empty returns all.', min: 1 },\n { id: 'offset', type: 'number', label: 'Offset', help: 'Pagination offset, applied with limit.', min: 0 },\n { id: 'orderBy', type: 'text', label: 'Order by', help: 'A declared field name. Empty keeps creation order.' },\n {\n id: 'order',\n type: 'select',\n label: 'Direction',\n options: [\n { value: 'asc', label: 'Ascending' },\n { value: 'desc', label: 'Descending' },\n ],\n },\n ],\n })\n\n defineLoader('entity.bySlug', entityBySlug, {\n source: 'sdk',\n title: 'Entity record by slug',\n description: 'One record of a declared custom entity, looked up by its URL slug.',\n output: 'EntityRecord, or null when no record has the slug.',\n settings: [\n { id: 'entity', type: 'entity', label: 'Entity', help: 'The defineEntity key.', required: true },\n {\n id: 'slug',\n type: 'text',\n label: 'Slug',\n help: \"The record's URL slug. On a param route, bind it: { slug: { $param: 'slug' } }.\",\n required: true,\n },\n ],\n })\n\n}\n","import type { HeroVariant } from '../lib/theme'\n// Type-only: page-blocks imports StorefrontSection from here at type level too,\n// so a value import would close the cycle. Types are erased, so this one is\n// free — same reason config.ts imports StorefrontSlots this way.\nimport type { StorefrontBlockLike } from './page-blocks'\nimport type React from 'react'\n\n// ---------------------------------------------------------------------------\n// Home-page section blueprint — the storefront's PageConfig equivalent.\n// A template (or the Fayz agent) declares the home as an ordered list of\n// typed sections; HomePage renders them. Every recurring block found in the\n// Nuvemshop research maps to one section type.\n// ---------------------------------------------------------------------------\n\nexport interface HeroSlide {\n title: string\n subtitle?: string\n cta?: string\n href?: string\n /** Image URL; omit for a gradient placeholder derived from `hue` */\n image?: string\n hue?: number\n /** Editorial boxed copy block (Uyuni) instead of free overlay */\n boxed?: boolean\n}\n\nexport interface MediaCarouselItem {\n title: string\n subtitle?: string\n eyebrow?: string\n cta?: string\n href?: string\n image: string\n imageAlt?: string\n align?: 'start' | 'center' | 'end'\n}\n\nexport type StorefrontSection =\n | { type: 'hero'; variant: HeroVariant; slides: HeroSlide[]; height?: 'tall' | 'medium' }\n | {\n type: 'mediaCarousel'\n items: MediaCarouselItem[]\n height?: 'medium' | 'tall' | 'screen'\n autoplayMs?: number\n overlay?: 'dark' | 'soft' | 'none'\n className?: string\n }\n | { type: 'categories'; style: 'bubbles' | 'tiles'; title?: string }\n | {\n type: 'products'\n title: string\n subtitle?: string\n /** Small-caps label above the title (e.g. 'curadoria') */\n eyebrow?: string\n /** 'sale' = compareAtPrice set; 'new' = newest first; 'all' = catalog order */\n filter?: 'sale' | 'new' | 'all'\n limit?: number\n }\n | {\n type: 'productSlider'\n title: string\n subtitle?: string\n eyebrow?: string\n filter?: 'sale' | 'new' | 'all'\n categoryName?: string\n collection?: string\n limit?: number\n cta?: string\n href?: string\n className?: string\n }\n | { type: 'benefits'; items: Array<{ icon: string; title: string; text?: string }> }\n | { type: 'banner'; title: string; subtitle?: string; eyebrow?: string; cta?: string; href?: string; image?: string; hue?: number }\n | { type: 'manifesto'; title?: string; text: string }\n | { type: 'testimonials'; title?: string; items: Array<{ quote: string; author: string }> }\n | { type: 'newsletter'; title?: string; subtitle?: string }\n\n/** @deprecated Use StorefrontSection. Kept for existing generated stores. */\nexport type HomeSection = StorefrontSection\n\nexport interface HomeConfig {\n /**\n * Accepts an app's own registered block, not just the SDK's typed sections.\n *\n * `home` and `pages.home` are the same page written two ways, and\n * `pages.home.blocks` has taken `StorefrontBlockLike` since the page-tree\n * work — so the short form five of seven live stores actually write was the\n * one that still could not name a block the union has never heard of. That\n * asymmetry is what forced `sections: mySections as never`, which throws away\n * type checking on the whole array to place one custom block.\n *\n * The typed union is still first in the union, so a bad `variant` on an SDK\n * section remains a type error.\n */\n sections: readonly StorefrontBlockLike[]\n}\n\nexport interface NavLink {\n label: string\n to: string\n}\n\nexport interface FooterConfig {\n about?: string\n contact?: { phone?: string; email?: string; address?: string }\n social?: Array<{ label: string; href: string }>\n credit?: React.ReactNode\n labels?: {\n categories?: string\n navigation?: string\n contact?: string\n viewAll?: string\n purchases?: string\n privacy?: string\n terms?: string\n returns?: string\n }\n}\n\n/** Wide gradient SVG data-URI — deterministic hero/banner art, no network. */\nexport function bannerPlaceholder(label: string, hueA: number, hueB: number, w = 1600, h = 700): string {\n const svg =\n `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${w}\" height=\"${h}\">` +\n `<defs><linearGradient id=\"g\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"1\">` +\n `<stop offset=\"0\" stop-color=\"hsl(${hueA},40%,78%)\"/>` +\n `<stop offset=\"1\" stop-color=\"hsl(${hueB},45%,55%)\"/>` +\n `</linearGradient></defs>` +\n `<rect width=\"${w}\" height=\"${h}\" fill=\"url(#g)\"/>` +\n `<circle cx=\"${w * 0.8}\" cy=\"${h * 0.3}\" r=\"${h * 0.45}\" fill=\"hsla(${hueB},50%,90%,0.25)\"/>` +\n `<circle cx=\"${w * 0.15}\" cy=\"${h * 0.85}\" r=\"${h * 0.35}\" fill=\"hsla(${hueA},45%,30%,0.12)\"/>` +\n `</svg>`\n return `data:image/svg+xml;utf8,${encodeURIComponent(svg)}`\n}\n\n// ---------------------------------------------------------------------------\n// Product imagery that does not exist yet.\n//\n// A store generated before anyone uploaded photos used to render a grey hole\n// per card: ProductCard was `{image && <img …>}`, so a product with no image\n// got an empty box. Categories and banners already fell back to generated art;\n// products were the one shape that did not.\n//\n// Amboras solves this by shipping six JPGs — a watch, a sneaker, a piece of\n// clothing — plus a README prescribing aspect ratios. The aspect ratios are the\n// good idea and are kept below. The photographs are not: they are right for a\n// fashion store and wrong for a butcher, a jeweller and a sticker shop, which\n// is three of our six. A generated mark carries no such claim, costs no bytes\n// and no request, and takes the store's own hue.\n// ---------------------------------------------------------------------------\n\n/**\n * The aspect ratios the SDK's layouts are built around. A replacement image\n * that honours these drops in; one that does not will letterbox or crop.\n *\n * product 3:4 portrait (cards, gallery) 750 × 1000\n * banner ~21:9 wide (promo strips) 1600 × 700\n * category 4:5 portrait (showcase tiles) 480 × 600\n *\n * `product` is 3:4 because that is what ProductCard's `imageAspect: 'portrait'`\n * actually renders (`aspect-[3/4]`). Amboras's placeholder README prescribes\n * \"3:4 portrait (800x1000px)\" — 800 × 1000 is 4:5, so following their pixels\n * would letterbox every card by 5%. Ratios are worth copying; arithmetic is\n * worth checking.\n */\nexport const PLACEHOLDER_ASPECTS = {\n product: [750, 1000],\n banner: [1600, 700],\n category: [480, 600],\n} as const\n\n/** Stable hue from a string, so the same product always gets the same mark. */\nfunction hueFrom(seed: string): number {\n let hash = 0\n for (let i = 0; i < seed.length; i++) hash = (hash * 31 + seed.charCodeAt(i)) % 360\n return hash\n}\n\n/** Up to two initials — a mark, not a word, so it never overflows the tile. */\nfunction initials(label: string): string {\n const words = label.trim().split(/\\s+/).filter(Boolean)\n if (words.length === 0) return '?'\n const letters = words.length === 1 ? words[0]!.slice(0, 2) : words[0]![0]! + words[1]![0]!\n return letters.toUpperCase()\n}\n\n/**\n * Portrait product placeholder as an SVG data-URI — deterministic per product\n * name, no network. Defaults to the prescribed 3:4.\n */\nexport function productPlaceholder(\n label: string,\n w: number = PLACEHOLDER_ASPECTS.product[0],\n h: number = PLACEHOLDER_ASPECTS.product[1],\n): string {\n const hue = hueFrom(label)\n const svg =\n `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${w}\" height=\"${h}\">` +\n `<defs><linearGradient id=\"g\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"1\">` +\n `<stop offset=\"0\" stop-color=\"hsl(${hue},22%,90%)\"/>` +\n `<stop offset=\"1\" stop-color=\"hsl(${(hue + 40) % 360},26%,78%)\"/>` +\n `</linearGradient></defs>` +\n `<rect width=\"${w}\" height=\"${h}\" fill=\"url(#g)\"/>` +\n `<text x=\"50%\" y=\"50%\" text-anchor=\"middle\" dominant-baseline=\"central\" ` +\n `font-family=\"system-ui,sans-serif\" font-size=\"${Math.round(Math.min(w, h) * 0.28)}\" ` +\n `font-weight=\"600\" fill=\"hsla(${hue},30%,32%,0.42)\">${escapeXml(initials(label))}</text>` +\n `</svg>`\n return `data:image/svg+xml;utf8,${encodeURIComponent(svg)}`\n}\n\n/** A product name is store data and may contain anything — & and < included. */\nfunction escapeXml(text: string): string {\n return text\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&apos;')\n}\n","import React, { createContext, useContext, type ReactNode } from 'react'\nimport type { EntityDeclarationInput } from '@fayz-ai/core'\nimport type { ShopProvider } from '@fayz-ai/shop/provider'\nimport type { MockShopSeed } from '@fayz-ai/shop/mock'\nimport type { PaymentMethodKind, Product, StoreSettings } from '@fayz-ai/shop/types'\nimport type { Promotion } from '@fayz-ai/shop/rules'\nimport type { StorefrontTheme } from '../lib/theme'\nimport type { HomeConfig, NavLink, FooterConfig } from '../blocks/sections'\nimport type { StorefrontPagesConfig } from '../blocks/page-blocks'\n// Type-only: slots.tsx imports the config hook at runtime, so a value import\n// here would close the cycle.\nimport type { StorefrontSlots } from '../extend/slots'\nimport type { StorefrontAuthConfig } from '../data/auth'\nimport type { StorefrontComponents } from '../extend/component-contracts'\nimport type { StorefrontReviewsConfig } from '../components/product/ProductReviews'\nimport type { CatalogFacetConfig } from '../components/collection/FiltersPanel'\n\nexport type StorefrontRouteKind =\n | 'home'\n | 'catalog'\n | 'product'\n | 'checkout'\n | 'account'\n | 'order'\n | 'custom'\n\nexport type StorefrontRouteParams = Record<string, string>\n\nexport interface StorefrontRouteComponentProps {\n path: string\n params: StorefrontRouteParams\n config: ResolvedStorefrontConfig\n}\n\nexport type StorefrontRouteChrome = 'default' | 'focused'\nexport type StorefrontCommerceMode = 'checkout' | 'catalog' | 'enquiry'\nexport type StorefrontImageLoadingMode = 'fade' | 'none'\n\nexport interface StorefrontImageLoadingConfig {\n mode?: StorefrontImageLoadingMode\n durationMs?: number\n easing?: string\n blur?: boolean\n}\n\nexport interface StorefrontRouteDefinition {\n /**\n * Stable identifier for generated-code diffs, QA reports, and route ownership.\n */\n id: string\n /**\n * Hash route pattern. Supports the same params as matchPath, e.g. '/checkout'\n * or '/collections/:slug'. Custom routes are matched before SDK defaults.\n */\n path: string\n /**\n * Intent label for agents and manifests. It does not change matching behavior.\n */\n kind?: StorefrontRouteKind\n /**\n * Shell chrome for the route. `focused` hides storefront nav/footer/cart\n * around high-intent flows such as checkout.\n */\n chrome?: StorefrontRouteChrome\n /**\n * App-owned screen/workflow that can still use storefront/shop primitives.\n */\n component: React.ComponentType<StorefrontRouteComponentProps>\n}\n\nexport interface StorefrontDiscountConfig {\n code: string\n percent: number\n title?: string\n}\n\nexport interface StorefrontEnquiryConfig {\n label?: string\n successMessage?: string\n subjectPrefix?: string\n email?: string\n whatsappUrl?: string\n requirePhone?: boolean\n}\n\nexport interface StorefrontConfig {\n /** Store display name (header, page title) */\n name: string\n /** Optional logo node; defaults to the store name */\n logo?: React.ReactNode\n /** ISO 4217 — default 'BRL' */\n currency?: string\n /** Intl locale for money/date formatting — default 'pt-BR' */\n locale?: string\n /** Visual identity: colors, fonts, radius, header/card personality */\n theme?: StorefrontTheme\n /** Checkout-first default, catalog-only browsing, or product enquiry flow. */\n commerceMode?: StorefrontCommerceMode\n /** Promo message above the header (e.g. 'FRETE GRÁTIS ACIMA DE R$ 300') */\n announcement?: string\n /**\n * How pages are addressed when this store is served.\n *\n * `'hash'` (the default) needs no server configuration and is how every\n * shipped store works today. `'history'` gives each page a real URL, which is\n * what makes it indexable, shareable with its own link preview, and\n * prerenderable — and requires the host to serve the app shell for unknown\n * paths, or a deep link 404s before the app ever runs.\n */\n routing?: 'hash' | 'history'\n /**\n * Home page blueprint. When set, `/` renders it and the catalog moves to /catalog.\n *\n * Still fully supported — five of seven live stores write it. `pages.home` is\n * the same thing with room for the other routes; this stays as the short form.\n */\n home?: HomeConfig\n /**\n * Pages composed from blocks.\n *\n * `catalog` and `product` compose AROUND the native body block rather than\n * replacing it, so a store adds content to those pages without taking over\n * their maintenance. Omitting a page renders the SDK default — adopting this\n * field changes nothing until something is added.\n */\n pages?: StorefrontPagesConfig\n /**\n * Blocks grafted into named positions inside SDK pages.\n *\n * This is the rung between \"configure a section\" and \"rewrite the page\". If\n * you are about to reimplement an SDK page to add one thing to it, look for\n * the slot first — and if the position you need is missing, that is a gap in\n * this list rather than a reason to fork. `listSlots()` enumerates them.\n */\n slots?: StorefrontSlots\n /** Header nav links — defaults derived from home/catalog routing */\n nav?: NavLink[]\n /** Footer content (about text, contact, social) */\n footer?: FooterConfig\n /** Preferred backend descriptor for manifest/scaffold metadata. */\n backend?: { provider?: 'mock' | 'fayz-api' | 'fayz-shop' | 'custom'; url?: string }\n /** @deprecated Use backend/provider adapters. Storefront no longer creates Supabase clients. */\n supabaseUrl?: string\n /** @deprecated Use backend/provider adapters. Storefront no longer creates Supabase clients. */\n supabaseAnonKey?: string\n /** Explicit provider override (tests, custom backends) */\n provider?: ShopProvider\n /** Per-store mock catalog (products/categories/discounts) for mock mode */\n catalog?: MockShopSeed\n /**\n * Custom entity declarations (spine M4), keyed by entity key. Registered\n * through defineEntity at runtime init, so one config field yields the\n * record schema, the storage descriptor, the generated RLS, the entity.*\n * loaders and the admin form.\n */\n entities?: Record<string, EntityDeclarationInput>\n /** Store-level discount codes available regardless of provider backend. */\n discounts?: StorefrontDiscountConfig[]\n /**\n * Rule-engine promotions (spine M6) — the serializable Promotion shape:\n * eligibility rules + application method, pure data. Rides in the Store\n * Document's `promotions` section; the mock provider evaluates them with\n * the reference evaluator, a live backend re-evaluates server-side. A\n * `{code, percent}` entry in `discounts` is the same thing in shorthand.\n */\n promotions?: Promotion[]\n /**\n * Institutional/legal page content (privacy, terms, returns). Plain text —\n * blank lines separate paragraphs. Unset pages render a placeholder so the\n * routes (and footer links) exist even before the store writes its policy.\n */\n legal?: { privacy?: string; terms?: string; returns?: string }\n /** Customer auth — same AuthAdapter contract as createSaasApp. Default: mock. */\n auth?: StorefrontAuthConfig\n /** Shipping pricing — default { flatRate: 0 } */\n shipping?: { flatRate?: number; freeAbove?: number }\n /**\n * Payment behavior. v1 default 'mock' instantly marks orders paid with NO\n * real charge (demo). M4 sets 'pix-mercadopago' so orders stay pending until\n * a real payment webhook confirms settlement.\n */\n payments?: {\n /**\n * 'gateway' means a real PSP is connected: the checkout opens a charge and\n * the order waits for it. WHICH provider is deliberately not spelled here —\n * that lives in the store's connection row, server side. A storefront that\n * named the acquirer would need a redeploy to change acquirer.\n */\n mode?: 'mock' | 'pix-mercadopago' | 'gateway'\n /**\n * Which methods the checkout offers. Declaring them is what lets the order\n * record how the buyer intends to pay instead of assuming 'credit_card',\n * which is what it did while the card form was a simulation.\n */\n methods?: readonly PaymentMethodKind[]\n /**\n * Published payment terms, shown on the card and the PDP. These are the two\n * lines every Brazilian storefront carries and the SDK had no model for:\n * the Pix discount and the interest-free instalment.\n *\n * Display only — they describe what the merchant advertises, not a charge\n * the checkout computes. A product may override the Pix price per SKU via\n * `metadata.pixPrice`.\n */\n terms?: {\n /** e.g. 5 → \"5% de desconto no Pix\". */\n pixDiscountPercent?: number\n /** Longest interest-free plan offered. */\n maxInstallments?: number\n /** Don't split below this per-instalment value. Default 10. */\n minInstallmentValue?: number\n }\n }\n /**\n * The PDP specification table renders scalar `product.metadata` alongside\n * SKU/category/weight. Stores also keep bookkeeping in metadata; `exclude`\n * hides those keys and `labels` names the rest, so a store doesn't have to\n * fork ProductSpecs to stop showing an internal field.\n */\n productSpecs?: { exclude?: readonly string[]; labels?: Readonly<Record<string, string>> }\n /** Product reviews shown on the PDP. See ./components/product/ProductReviews. */\n reviews?: StorefrontReviewsConfig\n /**\n * Extra catalog refinements over `product.metadata`, rendered in the filters\n * panel and reflected in `?<key>=<value>`. This is how a store adds its own\n * discovery axis — colour, purpose, brand — without forking FiltersPanel.\n */\n catalogFacets?: readonly CatalogFacetConfig[]\n /** Product enquiry behavior for catalog/enquiry stores. */\n enquiry?: StorefrontEnquiryConfig\n /** Feature toggles — defaults depend on commerceMode. */\n features?: { discounts?: boolean; accounts?: boolean; cart?: boolean; checkout?: boolean }\n /** Global storefront image reveal behavior. Default is a soft fade. */\n imageLoading?: StorefrontImageLoadingConfig\n /** Header search behaviour. Omit for the inline live-filter. */\n search?: StorefrontSearchConfig\n /**\n * The merchant's own commercial policy, read from the store's settings row at\n * boot (see ./store-policy). NOT authored here: an app declares its defaults\n * through the fields above, and this arrives from the database to override the\n * ones the merchant actually decided.\n *\n * Present so components can read the decisions that have no equivalent\n * config field — whether an account is required, which optional checkout\n * fields to show. The ones that DO have a field (currency, payment methods)\n * are folded into those fields instead, so nothing has to read both.\n */\n policy?: StoreSettings\n /** Code-level component replacements. Kept out of serialized manifests. */\n components?: StorefrontComponents\n /** Code-level route overrides/custom routes. Kept out of serialized manifests. */\n routes?: readonly StorefrontRouteDefinition[]\n}\n\nexport interface ResolvedStorefrontConfig extends StorefrontConfig {\n currency: string\n locale: string\n shipping: { flatRate: number; freeAbove?: number }\n payments: {\n mode: NonNullable<NonNullable<StorefrontConfig['payments']>['mode']>\n methods: readonly PaymentMethodKind[]\n terms?: NonNullable<StorefrontConfig['payments']>['terms']\n }\n commerceMode: StorefrontCommerceMode\n enquiry: Required<Pick<StorefrontEnquiryConfig, 'label' | 'successMessage' | 'subjectPrefix'>> &\n Omit<StorefrontEnquiryConfig, 'label' | 'successMessage' | 'subjectPrefix'>\n features: { discounts: boolean; accounts: boolean; cart: boolean; checkout: boolean }\n imageLoading: Required<StorefrontImageLoadingConfig>\n /** Where the full product list lives ('/' without a home page, '/catalog' with one) */\n catalogPath: string\n nav: NavLink[]\n /** `pages` with the legacy `home` short form folded in — always read this one. */\n pages: StorefrontPagesConfig\n search: Required<Omit<StorefrontSearchConfig, 'renderSuggestion'>> &\n Pick<StorefrontSearchConfig, 'renderSuggestion'>\n}\n\n/**\n * Header search. Defaults reproduce the inline live-filter the storefront has\n * always had, so turning this on is opt-in; every label and limit is a knob\n * because \"what a search feels like\" is a per-store decision, not the SDK's.\n */\nexport interface StorefrontSearchConfig {\n /**\n * 'inline' filters the catalogue as you type (the original behaviour).\n * 'overlay' dims the page and shows suggestions under the field, with a\n * link through to the full result page.\n */\n mode?: 'inline' | 'overlay'\n placeholder?: string\n /** Where \"see all results\" lands, carrying `?q=`. */\n resultsPath?: string\n /** Suggestions shown under the field before the shopper commits. */\n suggestionsLimit?: number\n /** Characters before anything is queried — 1 matches everything, which is noise. */\n minChars?: number\n ctaLabel?: string\n emptyLabel?: string\n /** Full control of a suggestion row when the default card is wrong for the store. */\n renderSuggestion?: (product: Product) => ReactNode\n}\n\nexport function resolveConfig(config: StorefrontConfig): ResolvedStorefrontConfig {\n // `home` and `pages.home` are the same page written two ways. Collapse them\n // here so nothing downstream has to check both, and so the legacy short form\n // keeps deciding where the catalog lives exactly as it did before.\n const homePage = config.pages?.home ?? (config.home ? { blocks: config.home.sections } : undefined)\n const catalogPath = homePage ? '/catalog' : '/'\n const commerceMode = config.commerceMode ?? 'checkout'\n const checkoutEnabled = commerceMode === 'checkout'\n return {\n ...config,\n pages: { ...config.pages, ...(homePage ? { home: homePage } : {}) },\n currency: config.currency ?? 'BRL',\n locale: config.locale ?? 'pt-BR',\n shipping: { flatRate: config.shipping?.flatRate ?? 0, freeAbove: config.shipping?.freeAbove },\n payments: {\n mode: config.payments?.mode ?? 'mock',\n methods: config.payments?.methods?.length ? config.payments.methods : ['pix', 'credit_card', 'cash'],\n // Rebuilding `payments` key by key silently dropped `terms`, so the Pix\n // price and the instalment line never reached a component even when the\n // store had configured them.\n terms: config.payments?.terms,\n },\n commerceMode,\n enquiry: {\n label: config.enquiry?.label ?? 'Contact me',\n successMessage: config.enquiry?.successMessage ?? 'Thanks. We received your enquiry.',\n subjectPrefix: config.enquiry?.subjectPrefix ?? 'Product enquiry',\n email: config.enquiry?.email,\n whatsappUrl: config.enquiry?.whatsappUrl,\n requirePhone: config.enquiry?.requirePhone,\n },\n features: {\n // Auto-enable the coupon UI when the store actually ships discount codes\n // (config.discounts, a seeded catalog, or a rule-engine promotion with a\n // code — M6), unless explicitly overridden — otherwise a store can\n // advertise a coupon with no field to enter it, which is exactly the\n // figurinhas pilot failure this milestone exists to end.\n discounts:\n config.features?.discounts ??\n Boolean(\n config.discounts?.length ||\n config.catalog?.discounts?.length ||\n config.promotions?.some((p) => p.code) ||\n config.catalog?.promotions?.some((p) => p.code),\n ),\n accounts: config.features?.accounts ?? checkoutEnabled,\n cart: config.features?.cart ?? checkoutEnabled,\n checkout: config.features?.checkout ?? checkoutEnabled,\n },\n imageLoading: {\n mode: config.imageLoading?.mode ?? 'fade',\n durationMs: config.imageLoading?.durationMs ?? 420,\n easing: config.imageLoading?.easing ?? 'cubic-bezier(0.22, 1, 0.36, 1)',\n blur: config.imageLoading?.blur ?? true,\n },\n catalogPath,\n search: {\n mode: config.search?.mode ?? 'inline',\n placeholder: config.search?.placeholder ?? 'Buscar produtos...',\n resultsPath: config.search?.resultsPath ?? '/search',\n suggestionsLimit: config.search?.suggestionsLimit ?? 4,\n minChars: config.search?.minChars ?? 2,\n ctaLabel: config.search?.ctaLabel ?? 'Ver todos resultados',\n emptyLabel: config.search?.emptyLabel ?? 'Nada encontrado para',\n renderSuggestion: config.search?.renderSuggestion,\n },\n nav:\n config.nav ??\n (homePage\n ? [\n { label: 'Início', to: '/' },\n { label: 'Loja', to: '/catalog' },\n ]\n : [{ label: 'Loja', to: '/' }]),\n }\n}\n\nconst StorefrontConfigContext = createContext<ResolvedStorefrontConfig | null>(null)\n\nexport const StorefrontConfigProvider = StorefrontConfigContext.Provider\n\nexport function useStorefrontConfig(): ResolvedStorefrontConfig {\n const ctx = useContext(StorefrontConfigContext)\n if (!ctx) throw new Error('useStorefrontConfig must be used inside createStorefrontApp')\n return ctx\n}\n\nexport function useStorefrontConfigOptional(): ResolvedStorefrontConfig | null {\n return useContext(StorefrontConfigContext)\n}\n\nexport function getStorefrontComponents(config: ResolvedStorefrontConfig): StorefrontComponents {\n return config.components ?? {}\n}\n","import React, { useEffect, useRef, useState } from 'react'\n\n// ---------------------------------------------------------------------------\n// Core motion primitives — every storefront inherits these; stores never\n// implement animation ad hoc. All effects respect prefers-reduced-motion.\n// ---------------------------------------------------------------------------\n\nexport function prefersReducedMotion(): boolean {\n if (typeof window === 'undefined' || !window.matchMedia) return false\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches\n}\n\n/** True once the element has entered the viewport (one-shot). */\nexport function useInView<T extends HTMLElement>(margin = '0px 0px -8% 0px'): [React.RefObject<T>, boolean] {\n // `null!` keeps this compiling under BOTH React typings: 18 rejects passing a\n // RefObject<T | null> as a JSX ref, 19 rejects the reverse assignment.\n const ref = useRef<T>(null!)\n const [inView, setInView] = useState(() => prefersReducedMotion())\n\n useEffect(() => {\n if (inView) return\n const el = ref.current\n if (!el || typeof IntersectionObserver === 'undefined') {\n setInView(true)\n return\n }\n const observer = new IntersectionObserver(\n (entries) => {\n if (entries.some((e) => e.isIntersecting)) {\n setInView(true)\n observer.disconnect()\n }\n },\n { rootMargin: margin },\n )\n observer.observe(el)\n return () => observer.disconnect()\n }, [inView, margin])\n\n return [ref, inView]\n}\n\nexport interface RevealProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Stagger delay in ms */\n delay?: number\n children: React.ReactNode\n}\n\n/** Plays a fade-up entrance when the element scrolls into view.\n * Content is VISIBLE by default — never pre-hidden — so screenshots,\n * crawlers and environments without IntersectionObserver always see it;\n * the animation's own from-state handles the fade. */\nexport function Reveal({ delay = 0, children, className, style, ...rest }: RevealProps) {\n const [ref, inView] = useInView<HTMLDivElement>()\n return (\n <div\n ref={ref}\n className={`${inView ? 'animate-fade-up' : ''} ${className ?? ''}`}\n style={{ ...style, animationDelay: delay ? `${delay}ms` : undefined }}\n {...rest}\n >\n {children}\n </div>\n )\n}\n\n/** True after the window has scrolled past the threshold (header treatments). */\nexport function useScrolled(threshold = 8): boolean {\n const [scrolled, setScrolled] = useState(false)\n useEffect(() => {\n const onScroll = () => setScrolled(window.scrollY > threshold)\n onScroll()\n window.addEventListener('scroll', onScroll, { passive: true })\n return () => window.removeEventListener('scroll', onScroll)\n }, [threshold])\n return scrolled\n}\n\n/** Re-triggers a CSS animation class whenever `value` changes (cart badge pop). */\nexport function usePopOnChange(value: number): boolean {\n const [pop, setPop] = useState(false)\n const prev = useRef(value)\n useEffect(() => {\n if (prev.current !== value && value > 0) {\n setPop(true)\n const t = setTimeout(() => setPop(false), 400)\n return () => clearTimeout(t)\n }\n prev.current = value\n return undefined\n }, [value])\n useEffect(() => {\n prev.current = value\n })\n return pop\n}\n","import React, { createContext, useContext, useEffect, useSyncExternalStore } from 'react'\nimport { defaultRouterAdapter, staticRouterAdapter, type RouterAdapter } from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// Storefront routing.\n//\n// The storefront owns a handful of flat routes, so it resolves them itself\n// rather than depending on a router package — that dependency is what created\n// the duplicate-singleton hazards under source-alias dev. What it does NOT own\n// is the *addressing scheme*: whether a page lives at `#/product/x` or at\n// `/product/x`, and who controls history.\n//\n// That is injected as a RouterAdapter, which is what lets the same components\n// render under a hash SPA, a real-URL SPA, and a static render. It matters\n// beyond convenience: a fragment is never sent to the server, so a\n// hash-addressed page has no URL of its own to index, share or prerender —\n// `renderStore` can produce perfect HTML for a page that no crawler can reach\n// as a distinct address.\n//\n// Hash remains the default, so an app that never mentions routing behaves\n// exactly as it does today.\n// ---------------------------------------------------------------------------\n\nconst RouterAdapterContext = createContext<RouterAdapter | null>(null)\n\nexport const StorefrontRouterProvider = RouterAdapterContext.Provider\n\n/**\n * `navigateTo` is a module function called from event handlers. Handlers only\n * run in a browser, after the provider has mounted, so a module-level reference\n * to the active adapter is safe here in a way it would not be during render.\n * Render paths use `useNavigate()` / `useRouterAdapter()` so a static render\n * reads the adapter for the path it is rendering, not this process-wide one.\n */\nlet _activeAdapter: RouterAdapter | null = null\nlet _fallback: RouterAdapter | null = null\n\n/**\n * One shared fallback instance, not one per component: an adapter owns its\n * subscriber list, so N instances would mean N event bindings and — for history\n * addressing — navigations that only notify their own subscribers. Constructing\n * one touches no browser API; only its methods do.\n */\nfunction fallbackAdapter(): RouterAdapter {\n if (!_fallback) _fallback = defaultRouterAdapter('hash')\n return _fallback\n}\n\nexport function useRouterAdapter(): RouterAdapter {\n const injected = useContext(RouterAdapterContext)\n const adapter = injected ?? fallbackAdapter()\n useEffect(() => {\n _activeAdapter = adapter\n }, [adapter])\n return adapter\n}\n\n/** The current in-app path, re-rendering on every navigation. */\nexport function useRoutePath(): string {\n const adapter = useRouterAdapter()\n return useSyncExternalStore(\n (onChange) => adapter.onPathChange(onChange),\n () => adapter.getCurrentPath() || '/',\n () => adapter.getCurrentPath() || '/',\n )\n}\n\n/** Scroll to top on route change. Separate from path tracking so a host that\n * manages its own scroll restoration can simply not call it. */\nexport function useScrollToTopOnNavigate(path: string): void {\n useEffect(() => {\n if (typeof window !== 'undefined') window.scrollTo(0, 0)\n }, [path])\n}\n\nexport function useNavigate(): (to: string) => void {\n const adapter = useRouterAdapter()\n return adapter.navigate.bind(adapter)\n}\n\n/** @deprecated Use `useRoutePath()`. Kept so existing imports keep compiling. */\nexport const useHashPath = useRoutePath\n\n/** Imperative navigation from an event handler. See `_activeAdapter` above. */\nexport function navigateTo(to: string): void {\n ;(_activeAdapter ?? fallbackAdapter()).navigate(to)\n}\n\n/**\n * The adapter a shell should install for a given render.\n *\n * A `path` override means a static render (`renderStore`, the preview server, a\n * node test): there is no history to own, but anchors must still carry real,\n * crawlable hrefs — which is the whole point of rendering headlessly.\n */\nexport function shellRouterAdapter(pathOverride: string | undefined, live: RouterAdapter): RouterAdapter {\n if (pathOverride == null) return live\n // Inherit the ambient scheme's href writer: a store served as a hash SPA must\n // still emit `#/…` links when rendered headlessly, or `renderStore` would\n // describe a page whose links do not exist. Pass an explicit `router` to the\n // shell to render a store served at real URLs.\n return staticRouterAdapter(pathOverride, { href: (to) => live.href(to) })\n}\n\n/** Match '/product/:slug' against '/product/leather-backpack' → { slug: 'leather-backpack' } */\nexport function matchPath(pattern: string, path: string): Record<string, string> | null {\n const cleanPath = (path.split('?')[0] ?? '').replace(/\\/+$/, '') || '/'\n const patternParts = pattern.split('/').filter(Boolean)\n const pathParts = cleanPath.split('/').filter(Boolean)\n if (patternParts.length !== pathParts.length) return null\n const params: Record<string, string> = {}\n for (let i = 0; i < patternParts.length; i++) {\n const pat = patternParts[i]!\n const part = pathParts[i]!\n if (pat.startsWith(':')) params[pat.slice(1)] = decodeURIComponent(part)\n else if (pat !== part) return null\n }\n return params\n}\n\nexport interface LinkProps extends Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, 'href'> {\n to: string\n}\n\n/**\n * A real anchor, always — middle-click, cmd-click, \"copy link address\" and\n * Playwright all keep working, and a crawler sees a real href.\n *\n * Under hash addressing the browser handles the fragment itself, so the click\n * is left alone. Under real-URL addressing a plain left-click must be\n * intercepted or the browser would do a full document load; modified clicks and\n * explicit targets are still handed to the browser.\n */\nexport function Link({ to, children, onClick, target, ...rest }: LinkProps) {\n const adapter = useRouterAdapter()\n\n const handleClick = (event: React.MouseEvent<HTMLAnchorElement>) => {\n onClick?.(event)\n if (!adapter.interceptsLinkClicks) return\n if (event.defaultPrevented) return\n if (target && target !== '_self') return\n if (event.button !== 0) return\n if (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) return\n event.preventDefault()\n adapter.navigate(to)\n }\n\n return React.createElement(\n 'a',\n { href: adapter.href(to), onClick: handleClick, target, ...rest },\n children,\n )\n}\n","// Single source of truth for e2e selectors. Components import from here;\n// Playwright specs assert against the same constants — they cannot drift.\nexport const TID = {\n // header\n headerSearch: 'header-search',\n headerSearchToggle: 'header-search-toggle',\n searchOverlay: 'search-overlay',\n searchOverlayInput: 'search-overlay-input',\n searchOverlayClose: 'search-overlay-close',\n searchOverlayCta: 'search-overlay-cta',\n searchSuggestion: 'search-suggestion',\n cartButton: 'cart-button',\n cartCount: 'cart-count',\n accountLink: 'account-link',\n accountDropdown: 'account-dropdown',\n announcementBar: 'announcement-bar',\n navLink: (label: string) => `nav-${label.toLowerCase().replace(/\\s+/g, '-')}`,\n navCategory: (slug: string) => `nav-cat-${slug}`,\n accountName: 'account-name',\n // home sections\n hero: 'home-hero',\n heroPrev: 'hero-prev',\n heroNext: 'hero-next',\n mediaCarousel: 'media-carousel',\n mediaCarouselPrev: 'media-carousel-prev',\n mediaCarouselNext: 'media-carousel-next',\n productSlider: 'product-slider',\n productSliderViewport: 'product-slider-viewport',\n productSliderPrev: 'product-slider-prev',\n productSliderNext: 'product-slider-next',\n categoryShowcase: 'category-showcase',\n productRail: 'product-rail',\n entityList: 'entity-list',\n benefits: 'benefits-row',\n promoBanner: 'promo-banner',\n manifesto: 'manifesto',\n testimonials: 'testimonials',\n newsletter: 'newsletter',\n newsletterEmail: 'newsletter-email',\n newsletterSubmit: 'newsletter-submit',\n newsletterDone: 'newsletter-done',\n formBlock: 'form-block',\n formBlockField: (id: string) => `form-block-field-${id}`,\n formBlockSubmit: 'form-block-submit',\n formBlockSuccess: 'form-block-success',\n formBlockError: 'form-block-error',\n // collection / campaign page blocks\n collectionHero: 'collection-hero',\n collectionHeroCta: 'collection-hero-cta',\n productSpotlight: 'product-spotlight',\n productSpotlightCta: 'product-spotlight-cta',\n motifStrip: 'motif-strip',\n collectionCta: 'collection-cta',\n collectionCtaButton: 'collection-cta-button',\n // catalog\n productGrid: 'product-grid',\n productCard: 'product-card',\n productCardName: 'product-card-name',\n productCardPrice: 'product-card-price',\n productCardAdd: 'product-card-add',\n badgeSale: 'badge-sale',\n badgeSoldout: 'badge-soldout',\n // filters\n filterCategory: (slug: string) => `filter-category-${slug}`,\n filterPriceMin: 'filter-price-min',\n filterPriceMax: 'filter-price-max',\n filterInstock: 'filter-instock',\n sortSelect: 'sort-select',\n filtersClear: 'filters-clear',\n // product detail\n pdpName: 'pdp-name',\n pdpPrice: 'pdp-price',\n pdpComparePrice: 'pdp-compare-price',\n pdpDescription: 'pdp-description',\n productOptionGroup: (id: string) => `product-option-${id.toLowerCase().replace(/\\s+/g, '-')}`,\n productOptionValue: (id: string, value: string) => `product-option-${id.toLowerCase().replace(/\\s+/g, '-')}-${value.toLowerCase().replace(/\\s+/g, '-')}`,\n pdpQtyInput: 'pdp-qty-input',\n pdpAddToCart: 'pdp-add-to-cart',\n pdpRoot: 'pdp-root',\n pdpGallery: 'pdp-gallery',\n pdpGalleryImage: 'pdp-gallery-image',\n pdpGalleryThumbs: 'pdp-gallery-thumbs',\n pdpGalleryThumb: 'pdp-gallery-thumb',\n pdpActions: 'pdp-actions',\n pdpEnquiryButton: 'pdp-enquiry-button',\n enquiryForm: 'enquiry-form',\n enquiryName: 'enquiry-name',\n enquiryEmail: 'enquiry-email',\n enquiryPhone: 'enquiry-phone',\n enquirySubject: 'enquiry-subject',\n enquiryMessage: 'enquiry-message',\n enquirySubmit: 'enquiry-submit',\n enquirySuccess: 'enquiry-success',\n enquiryError: 'enquiry-error',\n // cart\n cartDrawer: 'cart-drawer',\n cartLinesList: 'cart-lines-list',\n cartFooter: 'cart-footer',\n cartLine: 'cart-line',\n lineQty: 'line-qty',\n lineInc: 'line-inc',\n lineDec: 'line-dec',\n lineRemove: 'line-remove',\n cartSubtotal: 'cart-subtotal',\n discountInput: 'discount-input',\n discountApply: 'discount-apply',\n discountRow: 'discount-row',\n discountError: 'discount-error',\n cartShipping: 'cart-shipping',\n shippingProgress: 'shipping-progress',\n cartTotal: 'cart-total',\n goCheckout: 'go-checkout',\n cartEmpty: 'cart-empty',\n // delivery estimate (product page + cart)\n deliveryEstimator: 'delivery-estimator',\n deliveryCepInput: 'delivery-cep-input',\n deliveryCepSubmit: 'delivery-cep-submit',\n deliveryOption: 'delivery-option',\n deliveryUnserved: 'delivery-unserved',\n deliveryError: 'delivery-error',\n deliveryAddress: 'delivery-address',\n deliveryClear: 'delivery-clear',\n // checkout\n checkoutEmail: 'checkout-email',\n checkoutName: 'checkout-name',\n checkoutDocument: 'checkout-document',\n checkoutStreet: 'checkout-street',\n checkoutCity: 'checkout-city',\n checkoutZip: 'checkout-zip',\n checkoutCard: 'checkout-card',\n checkoutExpiry: 'checkout-expiry',\n checkoutCvc: 'checkout-cvc',\n placeOrder: 'place-order',\n // checkout em passos\n checkoutSteps: 'checkout-steps',\n checkoutStep: (n: number) => `checkout-step-${n}`,\n checkoutPayment: 'checkout-payment',\n checkoutPaymentTotal: 'checkout-payment-total',\n checkoutContinue: 'checkout-continue',\n checkoutBack: 'checkout-back',\n checkoutDone: 'checkout-done',\n // payment step\n pixPanel: 'pix-panel',\n pixCode: 'pix-code',\n pixCopy: 'pix-copy',\n pixConfirm: 'pix-confirm',\n checkoutError: 'checkout-error',\n checkoutProcessing: 'checkout-processing',\n // confirmation\n orderNumber: 'order-number',\n orderStatus: 'order-status',\n orderTracking: 'order-tracking',\n orderTrackingStep: (step: string) => `order-tracking-step-${step}`,\n orderTotal: 'order-total',\n viewPurchases: 'view-purchases',\n // account\n customerAccountShell: 'customer-account-shell',\n customerAccountMenu: 'customer-account-menu',\n orderDetail: 'order-detail',\n authTabSignin: 'auth-tab-signin',\n authTabSignup: 'auth-tab-signup',\n signinEmail: 'signin-email',\n signinPassword: 'signin-password',\n signinName: 'signin-name',\n signinSubmit: 'signin-submit',\n authError: 'auth-error',\n authNotice: 'auth-notice',\n purchasesList: 'purchases-list',\n purchaseItem: 'purchase-item',\n purchasesEmpty: 'purchases-empty',\n signout: 'signout',\n} as const\n","import React from 'react'\nimport { useStorefrontConfigOptional, type StorefrontImageLoadingConfig } from '../document/config'\n\nexport interface SmoothImageProps extends React.ImgHTMLAttributes<HTMLImageElement> {\n imageLoading?: StorefrontImageLoadingConfig\n}\n\nexport function SmoothImage({\n imageLoading,\n loading = 'lazy',\n decoding = 'async',\n onLoad,\n style,\n ...props\n}: SmoothImageProps) {\n const config = useStorefrontConfigOptional()\n const resolved = {\n ...config?.imageLoading,\n ...imageLoading,\n }\n const mode = resolved.mode ?? 'fade'\n const durationMs = resolved.durationMs ?? 420\n const easing = resolved.easing ?? 'cubic-bezier(0.22, 1, 0.36, 1)'\n const blur = resolved.blur ?? true\n const ref = React.useRef<HTMLImageElement | null>(null)\n const [loaded, setLoaded] = React.useState(mode === 'none')\n\n React.useEffect(() => {\n if (mode === 'none') {\n setLoaded(true)\n return\n }\n if (ref.current?.complete && ref.current.naturalWidth > 0) setLoaded(true)\n }, [mode, props.src])\n\n const revealStyle: React.CSSProperties =\n mode === 'none'\n ? {}\n : {\n opacity: loaded ? 1 : 0,\n filter: blur && !loaded ? 'blur(10px)' : 'blur(0px)',\n transition: `opacity ${durationMs}ms ${easing}, filter ${durationMs}ms ${easing}, transform ${durationMs}ms ${easing}`,\n }\n\n return (\n <img\n {...props}\n ref={ref}\n loading={loading}\n decoding={decoding}\n data-sf-image-loaded={loaded ? 'true' : 'false'}\n style={{ ...style, ...revealStyle }}\n onLoad={(event) => {\n setLoaded(true)\n onLoad?.(event)\n }}\n />\n )\n}\n","import React, { useEffect, useRef, useState } from 'react'\nimport { ChevronLeft, ChevronRight } from 'lucide-react'\nimport type { RegistryMeta } from '@fayz-ai/core'\nimport type { HeroSlide } from '../../blocks/sections'\nimport type { HeroVariant } from '../../lib/theme'\nimport { bannerPlaceholder } from '../../blocks/sections'\nimport { useStorefrontConfig } from '../../document/config'\nimport { prefersReducedMotion } from '../../lib/motion'\nimport { Link } from '../../app/router'\nimport { TID } from '../../lib/testids'\nimport { SmoothImage } from '../SmoothImage'\n\nfunction slideImage(slide: HeroSlide, w = 1600, h = 700): string {\n return slide.image ?? bannerPlaceholder(slide.title, slide.hue ?? 200, (slide.hue ?? 200) + 40, w, h)\n}\n\nfunction SlideCopy({ slide, active }: { slide: HeroSlide; active: boolean }) {\n const stagger = (i: number) =>\n active ? { className: 'animate-fade-up', style: { animationDelay: `${i * 120}ms` } } : { className: 'opacity-0' }\n\n const inner = (\n <>\n <h2 className={`sf-heading text-3xl font-bold leading-tight tracking-tight sm:text-5xl ${stagger(0).className}`} style={stagger(0).style}>\n {slide.title}\n </h2>\n {slide.subtitle && (\n <p className={`mt-3 max-w-md text-base sm:text-lg ${stagger(1).className}`} style={stagger(1).style}>\n {slide.subtitle}\n </p>\n )}\n {slide.cta && (\n <div className={stagger(2).className} style={stagger(2).style}>\n <Link\n to={slide.href ?? '/catalog'}\n className=\"sf-cta mt-6 inline-block bg-primary px-8 py-3.5 font-semibold text-primary-foreground shadow-lg transition-all hover:-translate-y-0.5 hover:shadow-xl\"\n style={{ borderRadius: 'var(--sf-radius-button)' }}\n >\n {slide.cta}\n </Link>\n </div>\n )}\n </>\n )\n if (slide.boxed) {\n return (\n <div className=\"border border-foreground/30 bg-background/90 p-8 backdrop-blur-sm sm:p-10\">{inner}</div>\n )\n }\n return <div className=\"text-white\">{inner}</div>\n}\n\nexport function HeroSection({\n variant,\n // Defaults to empty, not required: a block inserted from the editor arrives\n // before its content does, and a section that throws on absent props takes the\n // whole page with it. Every array prop in this file defaults for that reason.\n slides = [],\n height = 'tall',\n}: {\n variant: HeroVariant\n slides: HeroSlide[]\n height?: 'tall' | 'medium'\n}) {\n const [index, setIndex] = useState(0)\n const [loadedSlides, setLoadedSlides] = useState<Record<number, boolean>>({})\n const config = useStorefrontConfig()\n const interacted = useRef(false)\n const hClass = height === 'tall' ? 'h-[72vh] min-h-[440px]' : 'h-[48vh] min-h-[340px]'\n const revealImages = config.imageLoading.mode !== 'none'\n const revealStyle = (loaded: boolean): React.CSSProperties | undefined =>\n revealImages\n ? {\n filter: config.imageLoading.blur && !loaded ? 'blur(10px)' : 'blur(0px)',\n transition: `opacity 700ms ease, filter ${config.imageLoading.durationMs}ms ${config.imageLoading.easing}`,\n }\n : undefined\n\n // Auto-advance until the visitor takes over; never under reduced motion.\n useEffect(() => {\n if (variant !== 'slider' || slides.length < 2 || prefersReducedMotion()) return\n const timer = setInterval(() => {\n if (!interacted.current) setIndex((i) => (i + 1) % slides.length)\n }, 7000)\n return () => clearInterval(timer)\n }, [variant, slides.length])\n\n const goTo = (i: number) => {\n interacted.current = true\n setIndex((i + slides.length) % slides.length)\n }\n\n if (slides.length === 0) return null\n\n if (variant === 'split') {\n return (\n <section data-testid={TID.hero} className=\"grid gap-px sm:grid-cols-2\">\n {slides.slice(0, 2).map((slide, i) => (\n <Link\n key={i}\n to={slide.href ?? '/catalog'}\n className=\"group relative block h-[42vh] min-h-[320px] overflow-hidden\"\n >\n <SmoothImage\n src={slideImage(slide, 900, 700)}\n alt={slide.title}\n className=\"h-full w-full object-cover transition-transform duration-700 ease-out group-hover:scale-105\"\n />\n <div className=\"absolute inset-0 flex flex-col items-center justify-center bg-gradient-to-t from-black/65 via-black/25 to-black/10 p-6 text-center text-white\">\n <h2\n className=\"sf-heading animate-fade-up text-3xl font-bold uppercase tracking-wide drop-shadow-md sm:text-4xl\"\n style={{ animationDelay: `${i * 150}ms` }}\n >\n {slide.title}\n </h2>\n {slide.subtitle && (\n <p className=\"animate-fade-up mt-2 max-w-sm drop-shadow\" style={{ animationDelay: `${i * 150 + 120}ms` }}>\n {slide.subtitle}\n </p>\n )}\n <span className=\"mt-4 inline-block border-b-2 border-white/0 pb-0.5 text-sm font-semibold uppercase tracking-wider opacity-0 transition-all duration-300 group-hover:border-white group-hover:opacity-100\">\n Explorar →\n </span>\n </div>\n </Link>\n ))}\n </section>\n )\n }\n\n const active = slides[Math.min(index, slides.length - 1)]!\n\n return (\n <section data-testid={TID.hero} className={`relative w-full overflow-hidden ${hClass}`}>\n {/* stacked slides, crossfade + Ken Burns on the active one */}\n {slides.map((slide, i) => (\n <img\n key={i}\n src={slideImage(slide)}\n alt={slide.title}\n aria-hidden={i !== index}\n loading={i === 0 ? 'eager' : 'lazy'}\n decoding=\"async\"\n onLoad={() => setLoadedSlides((current) => ({ ...current, [i]: true }))}\n style={revealStyle(Boolean(loadedSlides[i]))}\n className={`absolute inset-0 h-full w-full object-cover transition-opacity duration-700 ${\n i === index && (!revealImages || loadedSlides[i]) ? 'animate-kenburns opacity-100' : 'opacity-0'\n }`}\n />\n ))}\n <div\n className={`absolute inset-0 flex items-end p-6 sm:p-12 ${\n active.boxed ? '' : 'bg-gradient-to-t from-black/60 via-black/20 to-transparent'\n }`}\n >\n <div className=\"mx-auto w-full max-w-7xl\">\n <div className=\"max-w-xl\">\n <SlideCopy key={index} slide={active} active />\n </div>\n </div>\n </div>\n\n {variant === 'slider' && slides.length > 1 && (\n <>\n <button\n type=\"button\"\n aria-label=\"Slide anterior\"\n data-testid={TID.heroPrev}\n onClick={() => goTo(index - 1)}\n className=\"absolute left-4 top-1/2 -translate-y-1/2 rounded-full bg-white/85 p-2.5 shadow transition-transform hover:scale-110 hover:bg-white\"\n >\n <ChevronLeft className=\"h-5 w-5 text-gray-900\" />\n </button>\n <button\n type=\"button\"\n aria-label=\"Próximo slide\"\n data-testid={TID.heroNext}\n onClick={() => goTo(index + 1)}\n className=\"absolute right-4 top-1/2 -translate-y-1/2 rounded-full bg-white/85 p-2.5 shadow transition-transform hover:scale-110 hover:bg-white\"\n >\n <ChevronRight className=\"h-5 w-5 text-gray-900\" />\n </button>\n <div className=\"absolute bottom-4 left-1/2 flex -translate-x-1/2 gap-2\">\n {slides.map((_, i) => (\n <button\n key={i}\n type=\"button\"\n aria-label={`Ir para o slide ${i + 1}`}\n onClick={() => goTo(i)}\n className={`h-2 rounded-full transition-all duration-300 ${i === index ? 'w-7 bg-white' : 'w-2 bg-white/60 hover:bg-white/80'}`}\n />\n ))}\n </div>\n </>\n )}\n </section>\n )\n}\n\nexport const heroBlockMeta = {\n label: 'Hero',\n description: 'Full-bleed opening section: one banner, an auto-advancing slider, or two side-by-side tiles.',\n settings: [\n {\n id: 'variant',\n type: 'select',\n label: 'Layout',\n help: 'banner shows the first slide only; slider cycles through every slide; split shows the first two slides as half-width tiles.',\n default: 'banner',\n options: [\n { value: 'banner', label: 'Banner' },\n { value: 'slider', label: 'Slider' },\n { value: 'split', label: 'Split (two tiles)' },\n ],\n },\n {\n id: 'height',\n type: 'select',\n label: 'Height',\n help: 'Applies to the banner and slider layouts; the split layout has a fixed height.',\n default: 'tall',\n options: [\n { value: 'tall', label: 'Tall' },\n { value: 'medium', label: 'Medium' },\n ],\n },\n {\n id: 'slides',\n type: 'list',\n label: 'Slides',\n help: 'One entry is enough for the banner layout. Extra slides are ignored unless the layout is slider (all) or split (first two).',\n required: true,\n of: [\n { id: 'title', type: 'text', label: 'Title', required: true },\n { id: 'subtitle', type: 'text', label: 'Subtitle' },\n { id: 'cta', type: 'text', label: 'Button label', help: 'Leave empty to render no button. Not shown in the split layout.' },\n { id: 'href', type: 'url', label: 'Button link', help: 'Where the button (or the whole tile, in the split layout) goes. Defaults to /catalog.' },\n {\n id: 'image',\n type: 'image',\n label: 'Background image',\n help: 'Optional — a gradient generated from the hue below is used when empty, so a slide always renders.',\n },\n {\n id: 'hue',\n type: 'number',\n label: 'Placeholder hue',\n help: 'Colour of the generated gradient, 0–360. Ignored once an image is set.',\n min: 0,\n max: 360,\n default: 200,\n },\n {\n id: 'boxed',\n type: 'boolean',\n label: 'Boxed copy',\n help: 'Frames the copy in an editorial panel instead of laying it over a dark gradient. Suits light, busy photography.',\n default: false,\n },\n ],\n },\n ],\n presets: [\n {\n name: 'Hero banner',\n props: {\n variant: 'banner',\n height: 'tall',\n slides: [\n { title: 'Coleção nova no ar', subtitle: 'Peças selecionadas, produção limitada.', cta: 'Ver coleção', href: '/catalog', hue: 210 },\n ],\n },\n },\n {\n name: 'Hero slider',\n props: {\n variant: 'slider',\n height: 'medium',\n slides: [\n { title: 'Coleção nova no ar', subtitle: 'Peças selecionadas, produção limitada.', cta: 'Ver coleção', href: '/catalog', hue: 210 },\n { title: 'Frete grátis acima de R$ 199', subtitle: 'Para todo o Brasil, em até 48h.', cta: 'Aproveitar', href: '/catalog', hue: 30 },\n ],\n },\n },\n {\n name: 'Hero split',\n props: {\n variant: 'split',\n slides: [\n { title: 'Novidades', subtitle: 'O que acabou de chegar', href: '/catalog', hue: 210 },\n { title: 'Ofertas', subtitle: 'Seleção com desconto', href: '/catalog', hue: 340 },\n ],\n },\n },\n ],\n // A hero opens a page; on a product page that job belongs to the gallery.\n enabledOn: ['home', 'collection', 'content'],\n} satisfies Omit<RegistryMeta, 'propsSchema'>\n","import { create } from 'zustand'\nimport { withFacet, type CatalogFacets } from '../data/facets'\n\nexport type CatalogSort = 'newest' | 'price-asc' | 'price-desc' | 'name'\n\n// The matcher and the facet type live in ../facets, a leaf module, so the\n// server-side loader can import them without pulling zustand in behind them.\nexport { matchesFacets } from '../data/facets'\nexport type { CatalogFacets }\n\nexport interface CatalogState {\n search: string\n categoryId: string | null\n /** Collection slug, matched against `product.metadata.collection`. */\n collection: string | null\n /** Every active metadata refinement, including `collection`. */\n facets: CatalogFacets\n priceMin: number | null\n priceMax: number | null\n inStockOnly: boolean\n sort: CatalogSort\n setSearch(search: string): void\n setCategoryId(categoryId: string | null): void\n setCollection(collection: string | null): void\n /** Set or (with `null`) clear one metadata refinement. */\n setFacet(key: string, value: string | null): void\n clearFacets(): void\n setPriceMin(priceMin: number | null): void\n setPriceMax(priceMax: number | null): void\n setInStockOnly(inStockOnly: boolean): void\n setSort(sort: CatalogSort): void\n reset(): void\n}\n\nconst initial = {\n search: '',\n categoryId: null,\n collection: null,\n facets: {} as CatalogFacets,\n priceMin: null,\n priceMax: null,\n inStockOnly: false,\n sort: 'newest' as CatalogSort,\n}\n\nexport const useCatalogStore = create<CatalogState>()((set) => ({\n ...initial,\n setSearch: (search) => set({ search }),\n setCategoryId: (categoryId) => set({ categoryId }),\n // `collection` is mirrored into `facets` rather than filtered separately, so\n // there is exactly one code path applying metadata refinements.\n setCollection: (collection) =>\n set((s) => ({ collection, facets: withFacet(s.facets, 'collection', collection) })),\n setFacet: (key, value) =>\n set((s) => ({\n facets: withFacet(s.facets, key, value),\n ...(key === 'collection' ? { collection: value } : null),\n })),\n clearFacets: () => set({ facets: {}, collection: null }),\n setPriceMin: (priceMin) => set({ priceMin }),\n setPriceMax: (priceMax) => set({ priceMax }),\n setInStockOnly: (inStockOnly) => set({ inStockOnly }),\n setSort: (sort) => set({ sort }),\n reset: () => set(initial),\n}))\n","import type { BlockNode } from '@fayz-ai/core'\nimport type { PageDataEntry, PageDataNeed } from '../blocks/page-data'\n\n// Effects do not run under `renderToStaticMarkup`, so a headless render would\n// produce loading states with no title. Instead of reimplementing routing on the\n// server — a second mechanism to keep in sync — components REPORT to the pass\n// rendering them, and the renderer re-renders with the answers seeded.\n//\n// Module-scoped rather than a React context because `renderToStaticMarkup` is\n// synchronous: there is exactly one pass in flight, and a context would force\n// every reporting call site to be a hook (`PageDataScope`'s useState initialiser\n// cannot be one). Null in every browser render.\n\n/**\n * What a route declared for the document head during a static render.\n *\n * Title and description are the client-rendered baseline. The rest is what a\n * page needs to be worth anything once it HAS its own URL: a canonical so the\n * engine knows which address is authoritative, an image and type so a share in\n * a messaging app is not a grey rectangle, and JSON-LD so a product is eligible\n * for a rich result instead of a plain blue link.\n */\nexport interface StaticHeadInput {\n title?: string\n description?: string | null\n /** Absolute URL. A relative canonical is ignored by search engines. */\n canonical?: string\n /** Absolute URL of the image a share should show. */\n image?: string\n /** OpenGraph type — 'website', 'article', 'product'. */\n type?: string\n /** schema.org objects, emitted as <script type=\"application/ld+json\">. */\n jsonLd?: Array<Record<string, unknown>>\n}\n\nexport interface StaticRenderPass {\n /** Called once per scope, so a page plus its slots report the whole rendered\n * composition — including forced-layout repairs (I7). */\n tree(nodes: readonly BlockNode[]): void\n needs(needs: readonly PageDataNeed[]): void\n head(input: StaticHeadInput): void\n /** Resolved by an earlier pass, keyed by `dataNeedKey`. A key present here is\n * served instead of being fetched. */\n entries: Readonly<Record<string, PageDataEntry>>\n /**\n * Absolute origin the rendered page will be served from, when the caller\n * knows it. Pages need it to declare a canonical or an og:image, and a static\n * render has no `window.location` to infer one from — so it travels with the\n * pass rather than being guessed per page.\n */\n origin?: string\n}\n\nlet active: StaticRenderPass | null = null\n\n/** The pass currently rendering, or null — which is every browser render. */\nexport function currentStaticRenderPass(): StaticRenderPass | null {\n return active\n}\n\n/** Run one synchronous render with `pass` installed. Nesting restores the\n * previous pass, so a renderer inside a renderer cannot strand the global. */\nexport function withStaticRenderPass<T>(pass: StaticRenderPass, render: () => T): T {\n const previous = active\n active = pass\n try {\n return render()\n } finally {\n active = previous\n }\n}\n","import React, { createContext, useContext, useEffect, useMemo, useState } from 'react'\nimport {\n dataNeedKey,\n defaultPropsFromSettings,\n getBlockErrorVisibility,\n getBlockMeta,\n isLoaderParamRef,\n isLoaderPropRef,\n resolveLoader,\n} from '@fayz-ai/core'\nimport type { BlockDataNeed, BlockNode } from '@fayz-ai/core'\nimport { getShopProvider } from '@fayz-ai/shop/runtime'\nimport { currentStaticRenderPass } from '../app/static-render'\n\n// ---------------------------------------------------------------------------\n// Page data — declared needs, resolved once per page (spine M3, I11).\n//\n// A block never fetches for itself. Its meta (or its document instance)\n// declares named needs against registered loaders; the page walks its repaired\n// tree, collects them, DEDUPES identical (loader, params) pairs, resolves them\n// concurrently through the ShopProvider port, and hands the results down by\n// context. Two product rails asking the same question cost one provider call —\n// and, because the needs are known before render, a server can resolve the\n// same set ahead of time, which is the SSR prerequisite L4 calls out.\n//\n// Failure semantics follow the M2 error-boundary contract (I7): one failing\n// loader marks ONE entry as errored and never touches the rest of the page.\n// A block whose data errored renders null for shoppers and an error card in\n// dev/admin (BlockDataError), exactly like a block that crashed.\n// ---------------------------------------------------------------------------\n\nexport type PageDataStatus = 'idle' | 'loading' | 'ready' | 'error'\n\nexport interface PageDataEntry {\n status: 'loading' | 'ready' | 'error'\n data?: unknown\n error?: string\n}\n\n/** One collected, binding-resolved, deduped need. */\nexport interface PageDataNeed {\n key: string\n loader: string\n params: Record<string, unknown>\n}\n\n// --- Binding resolution -------------------------------------------------------\n\n/**\n * Resolve a declared need's param bindings against the page's route params and\n * the declaring block's props (setting defaults filled in, so the declaration\n * and the rendered block agree on unset props). A binding that resolves to\n * `undefined` drops its param — dataNeedKey drops undefined anyway, so the\n * declared need and a hook asking with explicit `undefined`s share a key.\n */\nexport function resolveDataParams(\n need: BlockDataNeed,\n context: { params: Record<string, string>; props: Record<string, unknown> },\n): Record<string, unknown> {\n const out: Record<string, unknown> = {}\n for (const [name, value] of Object.entries(need.params ?? {})) {\n let resolved: unknown = value\n if (isLoaderParamRef(value)) resolved = context.params[value.$param]\n else if (isLoaderPropRef(value)) resolved = context.props[value.$prop]\n if (resolved !== undefined) out[name] = resolved\n }\n return out\n}\n\n/** A block's effective needs: the meta declaration with the document\n * instance's `data` merged over it by need name. */\nfunction needsForNode(node: BlockNode): Record<string, BlockDataNeed> {\n const meta = getBlockMeta(node.type)\n return { ...meta?.data, ...node.data }\n}\n\n/**\n * Walk a block tree (children included) and collect every declared need,\n * bindings resolved, deduped by canonical (loader, params) key.\n */\nexport function collectDataNeeds(\n nodes: readonly BlockNode[],\n routeParams: Record<string, string> = {},\n): PageDataNeed[] {\n const found = new Map<string, PageDataNeed>()\n const visit = (node: BlockNode): void => {\n const meta = getBlockMeta(node.type)\n const needs = needsForNode(node)\n if (Object.keys(needs).length > 0) {\n const props = { ...defaultPropsFromSettings(meta?.settings), ...node.props }\n for (const need of Object.values(needs)) {\n if (!need || typeof need.loader !== 'string' || !need.loader) continue\n const params = resolveDataParams(need, { params: routeParams, props })\n const key = dataNeedKey(need.loader, params)\n if (!found.has(key)) found.set(key, { key, loader: need.loader, params })\n }\n }\n for (const child of node.children ?? []) visit(child)\n }\n for (const node of nodes) visit(node)\n return [...found.values()]\n}\n\n// --- Resolution ---------------------------------------------------------------\n\n/** Resolve ONE need through the provider port. Never throws: an unknown\n * loader or a failing read becomes an 'error' entry for that need alone. */\nexport async function resolvePageDataNeed(need: Pick<PageDataNeed, 'loader' | 'params'>): Promise<PageDataEntry> {\n try {\n const impl = resolveLoader(need.loader)\n const data = await impl(need.params, { shop: getShopProvider() })\n return { status: 'ready', data }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n // Always log — a store hitting this in production is better off with the\n // reason in the console than without it (same policy as BlockErrorBoundary).\n console.error(`[storefront] loader \"${need.loader}\" failed:`, err)\n return { status: 'error', error: message }\n }\n}\n\n/** Resolve a set of needs concurrently, isolated per need. Test seam and the\n * future server-side entry point — the scope component uses the same calls. */\nexport async function resolvePageData(\n needs: readonly PageDataNeed[],\n): Promise<Record<string, PageDataEntry>> {\n const settled = await Promise.all(\n needs.map(async (need) => [need.key, await resolvePageDataNeed(need)] as const),\n )\n return Object.fromEntries(settled)\n}\n\n// --- The scope ----------------------------------------------------------------\n\ninterface PageDataContextValue {\n entries: Record<string, PageDataEntry>\n /** The route params this scope resolved `$param` bindings against — the same\n * ones a consuming block must use, or its key would diverge. */\n params: Record<string, string>\n}\n\nconst PageDataContext = createContext<PageDataContextValue | null>(null)\n\nexport interface PageDataScopeProps {\n nodes: readonly BlockNode[]\n /** Route params the tree's `$param` bindings resolve against. */\n params?: Record<string, string>\n /**\n * Pre-resolved entries, keyed by dataNeedKey — the server-side/static-render\n * seam (L4): `resolvePageData(collectDataNeeds(nodes))` ahead of render,\n * then hand the results in. Keys already 'ready' here are never re-fetched;\n * anything missing resolves client-side as usual.\n */\n initial?: Record<string, PageDataEntry>\n children: React.ReactNode\n}\n\n/**\n * Collects and resolves the data needs of one block tree, and provides the\n * results. Scopes nest (a slot inside a page): a child scope reuses every\n * entry an ancestor already resolved and only fetches its own remainder, so\n * dedupe holds across the whole rendered page, not per tree.\n */\nexport function PageDataScope({ nodes, params, initial, children }: PageDataScopeProps) {\n const parent = useContext(PageDataContext)\n const routeParams = useMemo(() => params ?? parent?.params ?? {}, [params, parent])\n const needs = useMemo(() => collectDataNeeds(nodes, routeParams), [nodes, routeParams])\n const own = useMemo(\n () => needs.filter((need) => !parent || !(need.key in parent.entries)),\n [needs, parent],\n )\n // A static render (renderStore) has no effects, so this scope reports what it\n // renders and what it would fetch, and reads back anything an earlier pass\n // already resolved. Null in the browser.\n const staticPass = currentStaticRenderPass()\n if (staticPass) {\n staticPass.tree(nodes)\n staticPass.needs(own)\n }\n\n // Seeded synchronously so the first render already shows 'loading' (or the\n // pre-resolved entry) for every owned key — a consuming block must never see\n // a gap and start its own fetch.\n const [entries, setEntries] = useState<Record<string, PageDataEntry>>(() => ({\n // Everything handed in is published, not only the needs THIS scope\n // collected. That is what lets a host framework resolve a page's data in\n // its own loader and wrap the shell in a seeding scope: the page's own\n // scope then finds those keys already answered on its parent and fetches\n // nothing. Without it, seeding only works when the seeding scope happens to\n // render the same block tree.\n ...initial,\n ...Object.fromEntries(\n own.map((need) => [\n need.key,\n initial?.[need.key] ?? staticPass?.entries[need.key] ?? ({ status: 'loading' } as PageDataEntry),\n ]),\n ),\n }))\n\n const signature = own.map((need) => need.key).join('\\n')\n useEffect(() => {\n // A key handed in ready stays authoritative; everything else resolves here.\n const pending = own.filter((need) => initial?.[need.key]?.status !== 'ready')\n if (pending.length === 0) return\n let cancelled = false\n setEntries((prev) => {\n const next = { ...prev }\n for (const need of pending) {\n if (next[need.key]?.status !== 'ready') next[need.key] = { status: 'loading' }\n }\n return next\n })\n for (const need of pending) {\n void resolvePageDataNeed(need).then((entry) => {\n if (!cancelled) setEntries((prev) => ({ ...prev, [need.key]: entry }))\n })\n }\n return () => {\n cancelled = true\n }\n // `own` is captured by its key signature: same keys = same needs.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [signature])\n\n const value = useMemo<PageDataContextValue>(\n () => ({ entries: { ...parent?.entries, ...entries }, params: routeParams }),\n [parent, entries, routeParams],\n )\n return <PageDataContext.Provider value={value}>{children}</PageDataContext.Provider>\n}\n\n// --- Consumption --------------------------------------------------------------\n\nexport interface UseLoaderResult<T> {\n status: PageDataStatus\n data: T | null\n error: string | null\n /** Re-run the read (bypasses the page-resolved entry from then on). */\n reload: () => void\n}\n\n/**\n * A block's (or page's) read: `useLoader('products.list', { filter, limit })`.\n *\n * When a PageDataScope above already resolved the same (loader, params) pair —\n * because this block, or ANY block on the page, declared it — the resolved\n * entry is returned and no request is made. Otherwise the hook resolves the\n * loader itself, through the same provider port, so a component used outside a\n * composed page (a store's hand-written route) keeps working identically.\n * Pass `null` params to disable the read.\n */\nexport function useLoader<T>(\n loader: string,\n params: Record<string, unknown> | null,\n): UseLoaderResult<T> {\n const scope = useContext(PageDataContext)\n const key = params === null ? null : dataNeedKey(loader, params)\n const [nonce, setNonce] = useState(0)\n const scoped = nonce === 0 && key !== null && scope ? scope.entries[key] : undefined\n const [local, setLocal] = useState<{ key: string; entry: PageDataEntry } | null>(null)\n\n // Undeclared reads — a hand-written route calling the hook directly — still\n // resolve under a static render: the pass collects the key on the first pass\n // and serves it on the next. Without this, exactly the reads that no block\n // declared would be the ones missing from a headless render.\n const staticPass = currentStaticRenderPass()\n const staticEntry = staticPass && key !== null && scoped === undefined ? staticPass.entries[key] : undefined\n if (staticPass && key !== null && scoped === undefined && staticEntry === undefined) {\n staticPass.needs([{ key, loader, params: params! }])\n }\n\n const paramsKey = params === null ? null : JSON.stringify(params)\n useEffect(() => {\n if (key === null || scoped !== undefined) return\n let cancelled = false\n setLocal({ key, entry: { status: 'loading' } })\n void resolvePageDataNeed({ loader, params: params! }).then((entry) => {\n if (!cancelled) setLocal({ key, entry })\n })\n return () => {\n cancelled = true\n }\n // params identity travels through paramsKey; scoped presence through a boolean.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [loader, paramsKey, nonce, scoped !== undefined])\n\n const entry =\n scoped ??\n staticEntry ??\n (local && local.key === key ? local.entry : key !== null ? { status: 'loading' as const } : null)\n\n return {\n status: entry?.status ?? 'idle',\n data: entry?.status === 'ready' ? (entry.data as T) : null,\n error: entry?.status === 'error' ? entry.error ?? 'unknown error' : null,\n reload: () => setNonce((n) => n + 1),\n }\n}\n\n/**\n * A BLOCK's named data need: `useBlockData(node, 'products', fallback)`.\n *\n * Reads the block's effective declaration — meta `data` with the document\n * instance's `data` merged over it — and resolves its bindings with the SAME\n * inputs the page resolver used (scope route params, node props over setting\n * defaults), so the two always compute the same key. That is what makes a\n * document able to rebind a param (`category: { $param: 'slug' }`) and have\n * the rendered block follow: the block asks for its declared need, not for a\n * hardcoded one.\n *\n * `fallback` covers the component being used directly as JSX (a store's\n * hand-written route), where there is no node and no declaration to read.\n */\nexport function useBlockData<T>(\n node: BlockNode | undefined,\n name: string,\n fallback: { loader: string; params: Record<string, unknown> },\n): UseLoaderResult<T> & { loader: string } {\n const scope = useContext(PageDataContext)\n let loader = fallback.loader\n let params = fallback.params\n if (node) {\n const need = needsForNode(node)[name]\n if (need && typeof need.loader === 'string' && need.loader) {\n const meta = getBlockMeta(node.type)\n loader = need.loader\n params = resolveDataParams(need, {\n params: scope?.params ?? {},\n props: { ...defaultPropsFromSettings(meta?.settings), ...node.props },\n })\n }\n }\n const result = useLoader<T>(loader, params)\n return { ...result, loader }\n}\n\n// --- Error surface ------------------------------------------------------------\n\n/**\n * What a block renders when its declared data failed: nothing for shoppers, a\n * visible card for builders — the same visibility rule as a crashed block\n * (M2's per-block error boundary, WooCommerce's `CURRENT_USER_IS_ADMIN ?\n * onError : () => null`).\n */\nexport function BlockDataError({ loader, message }: { loader: string; message?: string | null }) {\n if (getBlockErrorVisibility() === 'silent') return null\n return (\n <div\n data-block-error={`loader:${loader}`}\n style={{\n border: '1px dashed #dc2626',\n color: '#b91c1c',\n padding: '8px 12px',\n font: '12px ui-monospace, monospace',\n borderRadius: 6,\n }}\n >\n {`Data for this block failed (loader \"${loader}\")`}\n {message ? <div style={{ opacity: 0.8, marginTop: 4 }}>{message}</div> : null}\n </div>\n )\n}\n","import React from 'react'\nimport type { BlockNode, RegistryMeta } from '@fayz-ai/core'\nimport type { Category } from '@fayz-ai/shop/types'\nimport { useCatalogStore } from '../../stores/catalog.store'\nimport { useStorefrontConfig } from '../../document/config'\nimport { BlockDataError, useBlockData } from '../../blocks/page-data'\nimport { bannerPlaceholder } from '../../blocks/sections'\nimport { Reveal } from '../../lib/motion'\nimport { navigateTo } from '../../app/router'\nimport { TID } from '../../lib/testids'\nimport { SmoothImage } from '../SmoothImage'\n\nexport function CategoryShowcase({\n style,\n title,\n node,\n}: {\n style: 'bubbles' | 'tiles'\n title?: string\n /** The block node, when rendered from a tree — carries instance `data` overrides. */\n node?: BlockNode\n}) {\n // The declared need ('categories.list', no params): resolved once per page\n // through the provider port, shared with anything else reading categories.\n const { status, data, error, loader } = useBlockData<Category[]>(node, 'categories', {\n loader: 'categories.list',\n params: {},\n })\n const categories = data ?? []\n const config = useStorefrontConfig()\n const setCategoryId = useCatalogStore((s) => s.setCategoryId)\n\n if (status === 'error') return <BlockDataError loader={loader} message={error} />\n if (categories.length === 0) return null\n\n const go = (categoryId: string) => {\n useCatalogStore.getState().reset()\n setCategoryId(categoryId)\n navigateTo(config.catalogPath)\n }\n\n if (style === 'bubbles') {\n return (\n <section data-testid={TID.categoryShowcase} className=\"mx-auto max-w-7xl px-4 py-12 sm:px-6\">\n {title && (\n <Reveal>\n <h2 className=\"sf-heading mb-8 text-center text-3xl font-bold\">{title}</h2>\n </Reveal>\n )}\n <div className=\"flex flex-wrap items-start justify-center gap-8\">\n {categories.map((c, i) => (\n <Reveal key={c.id} delay={i * 80}>\n <button type=\"button\" onClick={() => go(c.id)} className=\"group flex w-28 flex-col items-center gap-3\">\n <span className=\"block h-24 w-24 overflow-hidden rounded-full border-2 border-transparent shadow-sm transition-all duration-300 group-hover:scale-105 group-hover:border-primary group-hover:shadow-md\">\n <SmoothImage\n src={c.imageUrl ?? bannerPlaceholder(c.name, 30 + i * 70, 70 + i * 70, 200, 200)}\n alt={c.name}\n className=\"h-full w-full object-cover\"\n />\n </span>\n <span className=\"text-center text-xs font-medium leading-tight\">{c.name}</span>\n </button>\n </Reveal>\n ))}\n </div>\n </section>\n )\n }\n\n return (\n <section data-testid={TID.categoryShowcase} className=\"mx-auto max-w-7xl px-4 py-12 sm:px-6\">\n {title && (\n <Reveal>\n <h2 className=\"sf-heading mb-8 text-center text-3xl font-bold\">{title}</h2>\n </Reveal>\n )}\n <div className=\"grid grid-cols-2 gap-4 lg:grid-cols-4\">\n {categories.map((c, i) => (\n <Reveal key={c.id} delay={i * 90}>\n <button type=\"button\" onClick={() => go(c.id)} className=\"group relative block aspect-[4/5] w-full overflow-hidden\" style={{ borderRadius: 'var(--sf-radius-card)' }}>\n <SmoothImage\n src={c.imageUrl ?? bannerPlaceholder(c.name, 30 + i * 70, 70 + i * 70, 480, 600)}\n alt={c.name}\n className=\"h-full w-full object-cover transition-transform duration-700 ease-out group-hover:scale-110\"\n />\n <span className=\"absolute inset-x-0 bottom-0 bg-gradient-to-t from-black/70 via-black/30 to-transparent p-5 pt-12 text-left\">\n <span className=\"sf-heading block text-lg font-semibold text-white\">{c.name}</span>\n <span className=\"mt-0.5 block text-xs text-white/80 opacity-0 transition-opacity duration-300 group-hover:opacity-100\">\n Explorar →\n </span>\n </span>\n </button>\n </Reveal>\n ))}\n </div>\n </section>\n )\n}\n\nexport const categoriesBlockMeta = {\n label: 'Categories',\n description: 'Index of every catalog category, as round avatars or tall image tiles.',\n // No setting selects which categories to show: the block renders the whole\n // category list from the catalog, so there is nothing per-category to author.\n settings: [\n {\n id: 'style',\n type: 'select',\n label: 'Layout',\n help: 'bubbles = round avatars in a centered row; tiles = tall image cards in a 4-column grid.',\n options: [\n { value: 'bubbles', label: 'Bubbles' },\n { value: 'tiles', label: 'Tiles' },\n ],\n default: 'tiles',\n },\n {\n id: 'title',\n type: 'text',\n label: 'Heading',\n help: 'Optional heading above the categories. Leave empty to render the grid with no heading.',\n },\n ],\n presets: [\n { name: 'Category tiles', props: { style: 'tiles', title: 'Nossas categorias' } },\n { name: 'Category bubbles', props: { style: 'bubbles', title: 'Compre por categoria' } },\n ],\n // Not on 'product': a full category index on a product page competes with the\n // buying decision instead of supporting it.\n enabledOn: ['home', 'catalog', 'content'],\n // The declared read (M3): the whole category list, no params.\n data: { categories: { loader: 'categories.list' } },\n} satisfies Omit<RegistryMeta, 'propsSchema'>\n","import { getShopProvider } from '@fayz-ai/shop/runtime'\nimport type { CreateProductEnquiryInput } from '@fayz-ai/shop/types'\nimport { useStorefrontConfig } from '../document/config'\n\n/** The enquiry path, for stores that take orders as conversations rather than checkouts. */\nexport function useEnquiry() {\n const config = useStorefrontConfig()\n\n const createProductEnquiry = async (input: CreateProductEnquiryInput) => {\n const provider = getShopProvider()\n if (!provider.createProductEnquiry) {\n throw new Error('The active shop provider does not support product enquiries.')\n }\n return provider.createProductEnquiry(input)\n }\n\n return { enquiry: config.enquiry, createProductEnquiry }\n}\n","import type { Product } from '@fayz-ai/shop/types'\nimport { navigateTo } from '../app/router'\nimport { useCartStore } from '../stores/cart.store'\nimport type { ProductOptionSelection } from '../data/product-options'\nimport { useEnquiry } from './use-enquiry'\n\n/** The verbs a block calls — bound so a block never reaches into a store directly. */\nexport function useStorefrontActions() {\n const addItem = useCartStore((state) => state.addItem)\n const openDrawer = useCartStore((state) => state.openDrawer)\n const closeDrawer = useCartStore((state) => state.closeDrawer)\n const { createProductEnquiry } = useEnquiry()\n\n return {\n navigateTo,\n addToCart: (product: Product, quantity?: number, options?: ProductOptionSelection) =>\n addItem(product, quantity, options),\n openCart: openDrawer,\n closeCart: closeDrawer,\n createProductEnquiry,\n }\n}\n","import React from 'react'\nimport { formatMoney } from '../lib/format'\nimport { useStorefrontConfig } from '../document/config'\n\nexport interface PriceProps {\n value: number\n compareAt?: number | null\n testId?: string\n compareTestId?: string\n className?: string\n}\n\n/** Formatted money. Always carries data-price so tests assert raw numbers, never locale strings. */\nexport function Price({ value, compareAt, testId, compareTestId, className }: PriceProps) {\n const { currency, locale } = useStorefrontConfig()\n return (\n <span className={`inline-flex items-baseline gap-2 ${className ?? ''}`}>\n <span data-testid={testId} data-price={value.toFixed(2)} className=\"font-semibold\">\n {formatMoney(value, currency, locale)}\n </span>\n {compareAt != null && compareAt > value && (\n <span\n data-testid={compareTestId}\n data-price={compareAt.toFixed(2)}\n className=\"text-sm text-muted-foreground line-through\"\n >\n {formatMoney(compareAt, currency, locale)}\n </span>\n )}\n </span>\n )\n}\n","import React from 'react'\nimport { useStorefrontConfig } from '../document/config'\nimport type { StorefrontConfig } from '../document/config'\nimport { formatMoney } from '../lib/format'\n\n/**\n * The published payment terms — the Pix price and the interest-free instalment.\n *\n * Brazilian storefronts show these on every card and every PDP, and they are\n * not a discount in the SDK's sense: nothing is applied at checkout, no coupon\n * exists, and the instalment is a property of the acquirer, not the order. That\n * is why they live in `config.payments.terms` and render as copy rather than\n * going anywhere near the cart total.\n */\n\nexport interface ResolvedPaymentTerms {\n /** Price when paying by Pix, if the store advertises a Pix discount. */\n pixPrice: number | null\n pixDiscountPercent: number | null\n /** Number of interest-free instalments this price supports (0 = don't show). */\n installments: number\n installmentValue: number\n}\n\nconst DEFAULT_MIN_INSTALLMENT = 10\n\n/**\n * `metadata.pixPrice` wins over the percentage: a store migrating from another\n * platform usually has a real per-SKU Pix price already, and recomputing it\n * from a rounded percentage would disagree with their own listings by cents.\n */\nexport function resolvePaymentTerms(\n price: number,\n config: Pick<StorefrontConfig, 'payments'>,\n metadata?: Record<string, unknown> | null,\n): ResolvedPaymentTerms {\n const terms = config.payments?.terms\n const explicit = typeof metadata?.pixPrice === 'number' ? metadata.pixPrice : null\n const pct = terms?.pixDiscountPercent ?? null\n const pixPrice =\n explicit != null && explicit < price\n ? explicit\n : pct && pct > 0\n ? Number((price * (1 - pct / 100)).toFixed(2))\n : null\n\n const min = terms?.minInstallmentValue ?? DEFAULT_MIN_INSTALLMENT\n const max = terms?.maxInstallments ?? 0\n const installments = max > 1 ? Math.min(max, Math.floor(price / min)) : 0\n\n return {\n pixPrice,\n pixDiscountPercent: pct,\n installments: installments >= 2 ? installments : 0,\n installmentValue: installments >= 2 ? price / installments : 0,\n }\n}\n\nexport interface PaymentTermsProps {\n price: number\n metadata?: Record<string, unknown> | null\n /** `card` is the two-line compact form; `detail` is the PDP block. */\n variant?: 'card' | 'detail'\n className?: string\n}\n\nexport function PaymentTerms({ price, metadata, variant = 'card', className = '' }: PaymentTermsProps) {\n const config = useStorefrontConfig()\n const terms = resolvePaymentTerms(price, config, metadata)\n if (terms.pixPrice == null && terms.installments === 0) return null\n\n const currency = config.currency\n const locale = config.locale\n const compact = variant === 'card'\n\n return (\n <div\n data-testid=\"payment-terms\"\n className={`${compact ? 'mt-0.5 space-y-0.5 text-[11px]' : 'mt-3 space-y-1 text-sm'} leading-tight text-muted-foreground ${className}`}\n >\n {terms.pixPrice != null && (\n <p data-testid=\"payment-terms-pix\">\n <strong className=\"font-semibold text-foreground\">{formatMoney(terms.pixPrice, currency, locale)}</strong>{' '}\n no Pix\n {terms.pixDiscountPercent ? ` (${terms.pixDiscountPercent}% de desconto)` : ''}\n </p>\n )}\n {terms.installments > 0 && (\n <p data-testid=\"payment-terms-installments\">\n ou {terms.installments}x de {formatMoney(terms.installmentValue, currency, locale)} sem juros\n </p>\n )}\n </div>\n )\n}\n","import { TID } from '../lib/testids'\n\n/**\n * Stable selectors that custom storefront components must preserve.\n *\n * Apps can fully customize the visual tree, but replacement components still\n * need these anchors so smoke tests, QA, and agents can operate stores.\n */\nexport const productCardComponentContract = {\n root: { 'data-testid': TID.productCard },\n name: { 'data-testid': TID.productCardName },\n priceTestId: TID.productCardPrice,\n addButton: { 'data-testid': TID.productCardAdd },\n} as const\n\nexport const storefrontComponentContracts = {\n productCard: productCardComponentContract,\n productDetail: {\n root: { 'data-testid': TID.pdpRoot },\n gallery: { 'data-testid': TID.pdpGallery },\n name: { 'data-testid': TID.pdpName },\n description: { 'data-testid': TID.pdpDescription },\n actions: { 'data-testid': TID.pdpActions },\n addButton: { 'data-testid': TID.pdpAddToCart },\n enquiryButton: { 'data-testid': TID.pdpEnquiryButton },\n enquiryForm: { 'data-testid': TID.enquiryForm },\n },\n} as const\n\nexport type ProductCardComponentContract = typeof productCardComponentContract\nexport type ProductDetailComponentContract = typeof storefrontComponentContracts.productDetail\n","import { checkBlockConstraints, checkBlockContext, getBlockMeta, isBlockEnabledOn } from '@fayz-ai/core'\nimport type { BlockDataNeeds, BlockNode } from '@fayz-ai/core'\nimport type { StorefrontSection } from './sections'\nimport type { StorefrontTheme } from '../lib/theme'\nimport { matchPath } from '../app/router'\n\n// ---------------------------------------------------------------------------\n// Pages as block trees.\n//\n// The home page has been a block tree since the registry landed. Every other\n// route was hand-written JSX, which is why a store that wanted a banner above\n// the catalog grid had only one move available: reimplement the catalog page.\n// One store did exactly that for three routes and stopped receiving SDK updates\n// for all three.\n//\n// What the benchmarks do, and what this adopts:\n//\n// Shopify templates/product.json lists sections, one of which is `main` —\n// the product form itself. A theme adds sections around `main`\n// without owning it.\n// VTEX IO store.product is a block array containing `product-details`.\n// Same idea, same reason.\n//\n// So the native page body becomes a block (`catalogBody`, `productBody`), and a\n// store composes around it. The body keeps being maintained by the SDK.\n//\n// One deliberate shape change: the general block form nests its props under\n// `props`, matching Shopify's `settings` and VTEX's `props`. The flat\n// StorefrontSection form stays supported — five of seven live stores write it —\n// but it is the outlier, and it is the reason the two stores with custom blocks\n// both had to write `sections: mySections as never`: a closed union cannot\n// describe a block the SDK has never heard of. Nesting fixes that without a cast.\n// ---------------------------------------------------------------------------\n\n/** Pages that are composed from blocks, and the `enabledOn` vocabulary.\n * `content` is the editorial kind: a titled page that is nothing but blocks —\n * no commerce body, no catalog assumptions. */\nexport type StorefrontPageKind = 'home' | 'catalog' | 'product' | 'collection' | 'content'\n\n/**\n * A block instance in a page tree — the general form.\n *\n * `id` matters more than it looks: two product rails on one page are\n * indistinguishable without it, so an external editor cannot target one of them\n * and an AI-generated diff cannot say which it changed. VTEX solved the same\n * problem with `rich-text#hero`; this is the same idea spelled as a field.\n */\nexport interface StorefrontBlockRef {\n /** Registered block id — an SDK section, a plugin block, or an app's own. */\n type: string\n id?: string\n props?: Record<string, unknown>\n children?: readonly StorefrontBlockRef[]\n /**\n * Instance-level data needs, merged over the block meta's `data` declaration\n * by need name — how a document points a block's loader at a route param\n * (`{ products: { loader: 'products.list', params: { category: { $param:\n * 'slug' } } } }`). Resolved once per page by the page-data scope.\n */\n data?: BlockDataNeeds\n}\n\n/**\n * What a page's block list accepts.\n *\n * The typed union keeps checking SDK sections (a bad `variant` is still a type\n * error); the open ref form is what lets an app place its own registered block\n * without casting.\n */\nexport type StorefrontBlockLike = StorefrontSection | StorefrontBlockRef\n\nexport interface StorefrontPageConfig {\n blocks: readonly StorefrontBlockLike[]\n}\n\n/**\n * An editorial page, expressible entirely in the document: a slug, a title, a\n * route, and blocks. This is the page kind that absorbs the \"brand site half\"\n * of a store — biography, philosophy, press, collections — which today lives\n * as hand-written custom routes (cristinarotondaro carries ~240 lines of them).\n *\n * The store chrome (header, footer, cart) still frames the page; what a\n * content page does NOT get is a commerce body block or any catalog\n * assumption. It is blocks all the way down.\n */\nexport interface StorefrontContentPageConfig extends StorefrontPageConfig {\n /** Document/page title (`<title>` gets \"<title> — <store>\"). Defaults to the slug. */\n title?: string\n /**\n * Route path. Defaults to `/<slug>`. May declare params (`/categoria/:slug`)\n * — one page then serves every match, and its blocks read the params through\n * `$param` loader bindings (M3). validateStore checks that every binding\n * names a param the path declares.\n */\n path?: string\n /**\n * Theme overlay applied ONLY inside this page, merged over the store theme.\n *\n * This is what makes a campaign page — a licensed line, a seasonal drop, a\n * collab — expressible as a content page instead of a microsite. Stores\n * routinely build those elsewhere and lose the funnel with them: the \"buy\"\n * CTA leaves for another domain and the cart, the session and the\n * attribution go with it.\n *\n * The overlay is emitted scoped to `[data-page=\"<slug>\"]`, so a hot-pink\n * summer drop cannot repaint the header, the cart drawer or any other route.\n * It merges key by key, so a page that sets only `colors.primary` keeps the\n * store's typography and every other token.\n */\n theme?: Partial<StorefrontTheme>\n}\n\n/**\n * Merge a page's theme overlay over the store theme.\n *\n * Nested groups merge rather than replace: a page declaring one colour must not\n * silently drop the store's fonts, radii and brand tokens back to SDK defaults.\n */\nexport function mergePageTheme(\n base: StorefrontTheme | undefined,\n overlay: Partial<StorefrontTheme> | undefined,\n): StorefrontTheme | undefined {\n if (!base && !overlay) return undefined\n if (!overlay) return base\n const name = overlay.name ?? (base ? `${base.name}-page` : 'page')\n const font = base?.font ? { ...base.font, ...overlay.font } : (overlay.font as StorefrontTheme['font'])\n return {\n ...base,\n ...overlay,\n name,\n colors: { ...base?.colors, ...overlay.colors },\n font,\n tokens: { ...base?.tokens, ...overlay.tokens },\n header: { ...base?.header, ...overlay.header },\n productCard: { ...base?.productCard, ...overlay.productCard },\n }\n}\n\n/** The wrapper attribute + selector a page's scoped theme is emitted under. */\nexport function pageThemeSelector(slug: string): string {\n return `[data-page=\"${slug}\"]`\n}\n\n/** The params a route path pattern declares ('/categoria/:slug' → ['slug']). */\nexport function routePathParams(path: string): string[] {\n return path\n .split('/')\n .filter((segment) => segment.startsWith(':'))\n .map((segment) => segment.slice(1))\n}\n\nexport interface StorefrontPagesConfig {\n home?: StorefrontPageConfig\n catalog?: StorefrontPageConfig\n product?: StorefrontPageConfig\n collection?: StorefrontPageConfig\n /** Editorial pages, keyed by slug. */\n content?: Record<string, StorefrontContentPageConfig>\n}\n\n/** Route path of one content page (explicit `path`, or `/<slug>`). */\nexport function contentPagePath(slug: string, page: StorefrontContentPageConfig): string {\n return page.path ?? `/${slug}`\n}\n\nexport interface ContentPageMatch {\n slug: string\n page: StorefrontContentPageConfig\n /** Params extracted from the page's path pattern, when it declares any. */\n params: Record<string, string>\n}\n\n/** The content page a path resolves to, if the store declared one. Paths are\n * patterns (`/categoria/:slug`), so one declared page can serve a family of\n * URLs and hand the matched params to its blocks' `$param` bindings. */\nexport function matchContentPage(\n pages: StorefrontPagesConfig | undefined,\n path: string,\n): ContentPageMatch | null {\n for (const [slug, page] of Object.entries(pages?.content ?? {})) {\n const params = matchPath(contentPagePath(slug, page), path)\n if (params) return { slug, page, params }\n }\n return null\n}\n\n/** Block ids for the native page bodies — Shopify's `main` section, by another name. */\nexport const CATALOG_BODY_BLOCK = 'catalogBody'\nexport const PRODUCT_BODY_BLOCK = 'productBody'\n\n/** The block that renders the page's own reason for existing, per page kind. */\nconst BODY_BLOCK_BY_KIND: Partial<Record<StorefrontPageKind, string>> = {\n catalog: CATALOG_BODY_BLOCK,\n product: PRODUCT_BODY_BLOCK,\n}\n\n/**\n * Keys that are block identity rather than props, in the nested form.\n *\n * Exported for the same reason `blockInstanceId` is: it must be ONE rule.\n * Whoever asks \"where do this block's settings live\" — the renderer here, the\n * editor via `blockAtPath`, the overlay's settings/structure guard — has to get\n * the same answer, or an edit an editor accepts is one the renderer ignores.\n */\nexport const BLOCK_STRUCTURAL_KEYS: ReadonlySet<string> = new Set([\n 'type',\n 'id',\n 'props',\n 'children',\n 'data',\n])\n\nconst STRUCTURAL_KEYS = BLOCK_STRUCTURAL_KEYS\n\n/**\n * Does this entry keep its settings under `props` (nested form) or inline on\n * the entry itself (flat form)?\n *\n * Both forms are first-class and they MIX inside one array — artorious's home\n * page is 3 nested and 5 flat — so nothing may assume the shape from the path\n * it took to get here.\n */\nexport function isNestedBlockRef(entry: unknown): boolean {\n return isNestedRef(entry as StorefrontBlockLike)\n}\n\nfunction isNestedRef(entry: StorefrontBlockLike): boolean {\n const record = entry as Record<string, unknown>\n // An explicit `props` settles it. Otherwise: an entry carrying nothing but\n // structural keys is a ref with no props (`{ type: 'seals' }`), which the flat\n // reading would also produce — so either branch is correct for that case.\n if ('props' in record) return true\n return Object.keys(record).every((key) => STRUCTURAL_KEYS.has(key))\n}\n\n/**\n * The id a block instance is known by: the authored `id`, or `<type>-<index>`\n * when it has none.\n *\n * Exported because it must be ONE rule. A block with no authored id still\n * reaches the outside world under its synthesized id — `renderStore` reports\n * it, an editor targets it, a generated diff names it — so `applyChange` has\n * to resolve `blocks[#banner-0]` to the same entry the renderer called\n * `banner-0`. Two implementations of this rule would make the id an agent is\n * handed by one ability unusable by another.\n */\nexport function blockInstanceId(entry: unknown, index: number): string {\n const record = entry as Record<string, unknown> | null\n if (record && typeof record.id === 'string' && record.id) return record.id\n return `${String(record?.type)}-${index}`\n}\n\n/**\n * Normalize one authored entry into a `BlockNode`.\n *\n * Both authoring forms collapse to the same node, so everything downstream —\n * the renderer, the editor, `describeBlocks` — sees one shape.\n */\nfunction toBlockNode(entry: StorefrontBlockLike, index: number): BlockNode {\n const record = entry as Record<string, unknown>\n const type = String(record.type)\n const id = blockInstanceId(entry, index)\n\n const data = record.data as BlockDataNeeds | undefined\n\n if (isNestedRef(entry)) {\n const children = (record.children as readonly StorefrontBlockRef[] | undefined) ?? []\n return {\n type,\n id,\n props: (record.props as Record<string, unknown> | undefined) ?? {},\n ...(children.length ? { children: children.map((child, i) => toBlockNode(child, i)) } : {}),\n ...(data ? { data } : {}),\n }\n }\n\n // Flat form: everything that is not identity is a prop.\n const props: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(record)) {\n if (!STRUCTURAL_KEYS.has(key)) props[key] = value\n }\n return { type, id, props, ...(data ? { data } : {}) }\n}\n\n/** Normalize an authored block list into the block tree the renderer consumes. */\nexport function toBlockNodes(blocks: readonly StorefrontBlockLike[]): BlockNode[] {\n return blocks.map(toBlockNode)\n}\n\n/**\n * The default tree for a page kind — what the SDK renders when a store has not\n * composed the page. For catalog and product that is the native body alone,\n * which is why adopting `pages` is a no-op until a store adds something.\n */\nexport function defaultPageBlocks(kind: StorefrontPageKind): BlockNode[] {\n const body = BODY_BLOCK_BY_KIND[kind]\n return body ? [{ type: body, id: body, props: {} }] : []\n}\n\nexport interface PageBlockDiagnostic {\n level: 'error' | 'warning'\n rule: string\n detail: string\n}\n\n/**\n * Diagnostics for one composed page.\n *\n * These are reported, not enforced. A store in production must not go blank\n * because a block was placed on a page its author did not anticipate — so the\n * hard stop belongs in the editor (which reads the same `enabledOn` through\n * `describeBlocks`), and this is the development-time equivalent.\n */\nexport function checkPageBlocks(kind: StorefrontPageKind, nodes: readonly BlockNode[]): PageBlockDiagnostic[] {\n const found: PageBlockDiagnostic[] = []\n const seenIds = new Set<string>()\n const expectedBody = BODY_BLOCK_BY_KIND[kind]\n let hasBody = false\n\n for (const node of nodes) {\n if (node.type === expectedBody) hasBody = true\n\n if (node.id) {\n if (seenIds.has(node.id)) {\n found.push({\n level: 'warning',\n rule: 'duplicate-block-id',\n detail: `two blocks on the ${kind} page share the id \"${node.id}\" — an editor or a generated diff cannot tell them apart`,\n })\n }\n seenIds.add(node.id)\n }\n\n const meta = getBlockMeta(node.type)\n if (!meta) {\n found.push({\n level: 'error',\n rule: 'unknown-block',\n detail: `the ${kind} page references block \"${node.type}\", which is not registered — register it before the storefront mounts`,\n })\n continue\n }\n if (!isBlockEnabledOn({ enabledOn: meta.enabledOn ?? [] }, kind)) {\n found.push({\n level: 'warning',\n rule: 'block-not-enabled-on-page',\n detail: `block \"${node.type}\" declares enabledOn [${(meta.enabledOn ?? []).join(', ')}] and is placed on the ${kind} page`,\n })\n }\n }\n\n if (expectedBody && !hasBody) {\n // Shopify hard-requires the `main` section in a template for this reason. We\n // warn instead of inserting it, because silently adding a block the config\n // does not mention makes the config a lie — and a fully bespoke catalog is a\n // legitimate thing to build.\n found.push({\n level: 'warning',\n rule: 'missing-page-body',\n detail: `the ${kind} page tree omits \"${expectedBody}\", so the page renders no ${kind === 'product' ? 'product detail' : 'product list'} — add it back unless the replacement is deliberate`,\n })\n }\n\n // Composition constraints, for pages composed in code: a document goes\n // through validateStore, but a TS config never does, so the same structural\n // rules are reported here. Errors, because the renderer will keep these\n // blocks off the shopper's page (I7) — the composition already lies.\n for (const violation of checkBlockConstraints(nodes)) {\n found.push({\n level: 'error',\n rule: violation.rule,\n detail: `${kind} page ${violation.path}: ${violation.detail}`,\n })\n }\n\n // Context is advisory: the key may arrive through a runtime channel a static\n // tree cannot see (a slot area, a future loader), so the honest verdict is\n // \"nothing declares this\", not \"this is broken\".\n for (const finding of checkBlockContext(nodes)) {\n found.push({\n level: 'warning',\n rule: 'context-not-provided',\n detail: `block \"${finding.type}\" at ${kind} page ${finding.path} uses context [${finding.missing.join(', ')}] that no ancestor provides`,\n })\n }\n\n return found\n}\n","import type { PageDataEntry } from '../blocks/page-data'\n\n// ---------------------------------------------------------------------------\n// Carrying the server's answers into the browser.\n//\n// Server-rendered HTML is only half of SSR. Without the data that produced it,\n// the browser mounts, finds every need unresolved, and refetches the whole page\n// — so the shopper sees correct content flash to skeletons and back, the\n// provider is hit twice per visit, and the render cost was spent for nothing.\n//\n// `PageDataScope` already accepts `initial`. This is the wire: the renderer\n// serialises what it resolved, the browser reads it once, and the first client\n// render matches the server's markup instead of replacing it.\n// ---------------------------------------------------------------------------\n\n/** Where the payload lives in the document. */\nexport const PAGE_DATA_SCRIPT_ID = '__fayz_page_data__'\n\nexport interface HydrationPayload {\n /** Resolved page data, keyed by `dataNeedKey`. */\n entries: Record<string, PageDataEntry>\n /** The path the server rendered, so a mismatch is detectable rather than silent. */\n path: string\n}\n\n/**\n * Escape a JSON payload for embedding in a `<script>`.\n *\n * `</script>` inside a product description would otherwise close the tag early\n * and drop the rest of the document into the page as markup — the same class of\n * bug as unescaped JSON-LD, with a worse blast radius. `<` is escaped rather\n * than the closing sequence alone so no casing or whitespace variant slips past.\n */\nfunction escapeScriptJson(value: unknown): string {\n return JSON.stringify(value)\n .replace(/</g, '\\\\u003c')\n .replace(/\\u2028/g, '\\\\u2028')\n .replace(/\\u2029/g, '\\\\u2029')\n}\n\n/**\n * The `<script>` tag carrying `payload`, for a renderer to place in the body.\n *\n * Only `ready` entries are carried. An entry that errored server-side is\n * deliberately dropped so the browser retries it: a transient provider failure\n * during a prerender would otherwise be baked into the page for as long as the\n * HTML is cached.\n */\nexport function serializePageData(payload: HydrationPayload): string {\n const ready: Record<string, PageDataEntry> = {}\n for (const [key, entry] of Object.entries(payload.entries)) {\n if (entry.status === 'ready') ready[key] = entry\n }\n const json = escapeScriptJson({ entries: ready, path: payload.path })\n return `<script id=\"${PAGE_DATA_SCRIPT_ID}\" type=\"application/json\">${json}</script>`\n}\n\nlet _read = false\nlet _cache: HydrationPayload | null = null\n\n/**\n * The payload this document was rendered with, or null.\n *\n * Read once and memoised: the tag describes the FIRST render only. After a\n * client-side navigation the document still contains it, and re-reading would\n * seed a new page with the previous one's data.\n */\nexport function readHydratedPageData(): HydrationPayload | null {\n if (_read) return _cache\n _read = true\n if (typeof document === 'undefined') return (_cache = null)\n const el = document.getElementById(PAGE_DATA_SCRIPT_ID)\n if (!el?.textContent) return (_cache = null)\n try {\n _cache = JSON.parse(el.textContent) as HydrationPayload\n } catch {\n // Malformed payload is a bug, but refetching is a correct fallback — never\n // let it take down a page that already rendered.\n _cache = null\n }\n return _cache\n}\n\n/**\n * Entries to seed a page at `path`, or undefined.\n *\n * Path-guarded: the payload belongs to the document the server rendered, so\n * handing it to a different route would seed that route with another page's\n * answers. Query strings are ignored — they address state within a page.\n */\nexport function hydratedEntriesFor(path: string): Record<string, PageDataEntry> | undefined {\n const payload = readHydratedPageData()\n if (!payload) return undefined\n const same = (a: string, b: string) => (a.split('?')[0] || '/') === (b.split('?')[0] || '/')\n return same(payload.path, path) ? payload.entries : undefined\n}\n\n/** Test seam: forget the memoised read. */\nexport function resetHydratedPageData(): void {\n _read = false\n _cache = null\n}\n","import React, { createContext, useContext, useMemo } from 'react'\nimport { renderBlocks, repairBlockTree } from '@fayz-ai/core'\nimport type { BlockNode, BlockTreeRepair } from '@fayz-ai/core'\nimport { checkPageBlocks, defaultPageBlocks, toBlockNodes } from '../blocks/page-blocks'\nimport type { StorefrontPageKind, StorefrontPageConfig } from '../blocks/page-blocks'\nimport type { ResolvedStorefrontConfig } from '../document/config'\nimport { PageDataScope } from '../blocks/page-data'\nimport { hydratedEntriesFor } from '../app/hydration'\nimport { useRoutePath } from '../app/router'\n\n// ---------------------------------------------------------------------------\n// One renderer for every composed page.\n//\n// The page kind and its route params travel by context rather than by props,\n// because the consumers are blocks — arbitrarily deep in a tree the page did not\n// author. `productBody` needs the slug; a store's own block placed on the PDP\n// wants the same product without the store having to thread it. Fase 3's slots\n// read this same context, which is why it is a page-level concern and not a\n// parameter of the body block.\n// ---------------------------------------------------------------------------\n\nexport interface StorefrontPageContextValue {\n kind: StorefrontPageKind\n /** Route params for the current page (`slug` on product and collection). */\n params: Record<string, string>\n}\n\nconst PageContext = createContext<StorefrontPageContextValue | null>(null)\n\nexport const StorefrontPageProvider = PageContext.Provider\n\n/** The page a block is rendering inside. Throws outside a composed page, because\n * a block reading page context off a page is a bug worth surfacing loudly. */\nexport function useStorefrontPage(): StorefrontPageContextValue {\n const ctx = useContext(PageContext)\n if (!ctx) throw new Error('useStorefrontPage must be used inside a storefront page')\n return ctx\n}\n\n/** The page a block is rendering inside, or null — for blocks that work on any surface. */\nexport function useStorefrontPageOptional(): StorefrontPageContextValue | null {\n return useContext(PageContext)\n}\n\n// Diagnostics are printed once per distinct tree, not once per render: a config\n// mistake is worth saying loudly, and worth saying only once.\n//\n// Not gated to development. Every finding here describes a page that is already\n// visibly wrong to a shopper — an unregistered block renders a marker, a missing\n// body block renders no products — so a store hitting one in production is\n// better off with the reason in the console than without it.\nconst reported = new Set<string>()\n\nfunction reportDiagnostics(\n kind: StorefrontPageKind,\n nodes: readonly BlockNode[],\n repairs: readonly BlockTreeRepair[],\n): void {\n const signature = `${kind}:${nodes.map((n) => `${n.type}#${n.id ?? ''}`).join(',')}`\n if (reported.has(signature)) return\n reported.add(signature)\n\n for (const repair of repairs) {\n // A repair means the page RENDERS correctly but the composition is missing\n // a block it cannot function without — say so, so the config gets fixed\n // instead of silently diverging from what the shopper sees.\n console.warn(\n `[storefront] forced-layout: re-inserted required block \"${repair.inserted}\" at ${repair.path}[${repair.index}] on the ${kind} page — add it to the composition`,\n )\n }\n\n for (const finding of checkPageBlocks(kind, nodes)) {\n const message = `[storefront] ${finding.rule}: ${finding.detail}`\n if (finding.level === 'error') console.error(message)\n else console.warn(message)\n }\n}\n\n/** Reset the once-per-tree diagnostic memo. Test seam. */\nexport function resetPageDiagnostics(): void {\n reported.clear()\n}\n\nexport interface StorefrontPageProps {\n kind: StorefrontPageKind\n /** The store's composition for this page. Omitted falls back to the SDK default. */\n page?: StorefrontPageConfig\n params?: Record<string, string>\n}\n\n/**\n * Render a page as a block tree.\n *\n * A store that has not composed the page gets `defaultPageBlocks(kind)` — the\n * native body alone — so adopting `pages` changes nothing until something is\n * actually added around it.\n */\nexport function StorefrontPage({ kind, page, params = {} }: StorefrontPageProps) {\n // The path this page is rendering, so hydrated data is matched to the route\n // it was resolved for rather than handed to whatever renders next.\n const routePath = useRoutePath()\n const { nodes, repairs } = useMemo(() => {\n const authored = page?.blocks ? toBlockNodes(page.blocks) : defaultPageBlocks(kind)\n // Forced-layout repair (I7): a tree that lost a block it cannot function\n // without gets it re-inserted at the template index before rendering —\n // repair what is recoverable, reject (validateStore) what is checkable.\n const repaired = repairBlockTree(authored)\n return { nodes: repaired.nodes as BlockNode[], repairs: repaired.repairs }\n }, [page, kind])\n\n reportDiagnostics(kind, nodes, repairs)\n\n const ctx = useMemo<StorefrontPageContextValue>(() => ({ kind, params }), [kind, params])\n\n return (\n <StorefrontPageProvider value={ctx}>\n {/* Data needs are collected from the REPAIRED tree — a re-inserted\n required block gets its data like any authored one — and resolved\n once for the whole page (M3). */}\n {/* Seeded with whatever the server already resolved for THIS path, so the\n first client render matches the served HTML instead of replacing it\n with skeletons and refetching. Undefined in a pure SPA. */}\n <PageDataScope nodes={nodes} params={params} initial={hydratedEntriesFor(routePath)}>\n {/* The document path of this page's block array, so a rendered block\n carries its own address back (editor mode only — see core/blocks\n setBlockEditorMode). `content` is a map keyed by slug rather than a\n singular page, so it gets no path until the editor needs one; the\n four singular kinds are where editing happens. */}\n <main>{renderBlocks(nodes, kind === 'content' ? undefined : `presentation.pages.${kind}.blocks`)}</main>\n </PageDataScope>\n </StorefrontPageProvider>\n )\n}\n\n/** The composition for a SINGULAR page kind, if the store declared one.\n * `content` pages are a map keyed by slug — resolve those with\n * `matchContentPage` instead. */\nexport function pageConfigFor(\n config: ResolvedStorefrontConfig,\n kind: Exclude<StorefrontPageKind, 'content'>,\n): StorefrontPageConfig | undefined {\n return config.pages?.[kind]\n}\n","import React, { createContext, useContext, useMemo } from 'react'\nimport { renderBlocks, repairBlockTree } from '@fayz-ai/core'\nimport type { Product } from '@fayz-ai/shop/types'\nimport { toBlockNodes } from '../blocks/page-blocks'\nimport type { StorefrontBlockLike } from '../blocks/page-blocks'\nimport { useStorefrontConfigOptional } from '../document/config'\nimport { PageDataScope } from '../blocks/page-data'\nimport { useStorefrontPageOptional } from '../views/StorefrontPage'\nimport type { CartLine } from '../stores/cart.store'\n\n// ---------------------------------------------------------------------------\n// Named slots — the missing rung.\n//\n// Between \"configure a section\" and \"rewrite the page\" there was nothing. So\n// every store that needed one store-specific thing inside an SDK page took the\n// only rung available and rewrote the page, inheriting its maintenance forever.\n// The cost is measurable: one store reimplemented the product page and, in doing\n// so, silently dropped option selection, quantity and add-to-cart, because\n// reimplementing a page means reimplementing everything the page did.\n//\n// Prior art: Shopify's theme app extensions — an app block drops into a named\n// location in a template it does not own. Same shape, same reason.\n//\n// Two decisions worth stating:\n//\n// Slots take BLOCK TREES, not components. A slot holding a component is code,\n// which means it cannot be edited by the visual editor, generated by the agent,\n// or serialized into a manifest. A slot holding blocks is the same currency as\n// the rest of the system.\n//\n// Slot content receives typed context. The point of `afterPrice` is to say\n// something about THIS product; a slot that cannot see the product is a slot\n// that can only hold static copy.\n// ---------------------------------------------------------------------------\n\n/** What each slot area hands to the blocks inside it. */\nexport interface StorefrontSlotContextMap {\n productDetail: {\n product: Product\n soldOut: boolean\n lowStock: boolean\n /** Percent off, or 0 when the product is not discounted. */\n discountPct: number\n }\n /**\n * The card, which renders once per product in a grid — so its context is the\n * one product that card is for, not the list.\n */\n productCard: {\n product: Product\n soldOut: boolean\n onSale: boolean\n /** True when the product has variants, so quick-add routes to the PDP. */\n hasOptions: boolean\n }\n catalog: {\n /** The products currently visible, after filters and search. */\n products: readonly Product[]\n /** True while the list is being fetched. */\n loading: boolean\n }\n cart: { lines: readonly CartLine[]; subtotal: number }\n checkout: { subtotal: number; total: number }\n header: Record<string, never>\n footer: Record<string, never>\n}\n\nexport type StorefrontSlotArea = keyof StorefrontSlotContextMap\n\ntype SlotBlocks = readonly StorefrontBlockLike[]\n\n/**\n * Where a store may graft blocks into an SDK page.\n *\n * Position names read as \"where\", not \"what\": `afterPrice` keeps meaning the\n * same thing if the price stops being a `<Price>` and starts being something\n * else, which a name like `priceBelowSlot` would not.\n */\nexport interface StorefrontSlots {\n productDetail?: {\n /** Between the breadcrumb and the product name. */\n beforeTitle?: SlotBlocks\n /** Immediately under the product name, above the price. */\n afterTitle?: SlotBlocks\n /** Under the price and discount badge. */\n afterPrice?: SlotBlocks\n /** Under the description paragraph. */\n afterDescription?: SlotBlocks\n /** Above the quantity + add-to-cart row. Where trust seals go. */\n beforeAddToCart?: SlotBlocks\n /** Under the add-to-cart row, above the delivery estimate. */\n afterAddToCart?: SlotBlocks\n /** Under the gallery column, in the left half of the page. */\n afterGallery?: SlotBlocks\n /** Above the specification table, below the two-column fold. */\n beforeSpecs?: SlotBlocks\n /** The bottom of the page, after related products. */\n afterDetail?: SlotBlocks\n }\n /**\n * The product card, wherever it appears — grid, rail, slider, related.\n *\n * This is where the fleet actually hurt: four of five customizing stores\n * forked a ~120-line card to add one thing to it, and each fork then lost\n * something else (the sale badge, the variant guard, `commerceMode` gating,\n * `theme.productCard` honouring).\n */\n productCard?: {\n /** Above the image, full card width. */\n top?: SlotBlocks\n /** Over the image. The container is `relative`; content positions itself. */\n imageOverlay?: SlotBlocks\n /** Between the product name and the price row. */\n afterName?: SlotBlocks\n /** Under the price row. */\n underPrice?: SlotBlocks\n }\n catalog?: {\n /** Above the page heading. */\n beforeHeading?: SlotBlocks\n /** Between the heading and the filters/grid row. */\n beforeGrid?: SlotBlocks\n /** Inside the filter column, under the filters. */\n afterFilters?: SlotBlocks\n /** Under the product grid. */\n afterGrid?: SlotBlocks\n }\n cart?: {\n /** Above the line items. */\n beforeLines?: SlotBlocks\n /** Between the lines and the totals. */\n beforeSummary?: SlotBlocks\n /** Under the totals, around the checkout button. */\n afterSummary?: SlotBlocks\n }\n checkout?: {\n /** Above the checkout form. */\n beforeForm?: SlotBlocks\n /** Under the payment method selector. */\n afterPaymentMethods?: SlotBlocks\n /** Under the whole form, around the place-order button. */\n afterForm?: SlotBlocks\n }\n header?: {\n /**\n * Left of the account/cart icons.\n *\n * Named for the actions row rather than for the header, because the header\n * has three layout variants (default, centered, search) that place the logo\n * differently. A slot \"left of the logo\" would land somewhere different in\n * each one; the actions row is shared, so this position is the same in all\n * three.\n */\n beforeActions?: SlotBlocks\n /** Right of the cart icon. */\n afterActions?: SlotBlocks\n /** A full-width strip under the whole header, in every variant. */\n belowNav?: SlotBlocks\n }\n footer?: {\n /** Above the footer columns. */\n before?: SlotBlocks\n /** Under the footer columns, above the credit line. */\n after?: SlotBlocks\n }\n}\n\n// --- The inventory, as data ---------------------------------------------------\n\nexport interface SlotDescriptor {\n area: StorefrontSlotArea\n name: string\n /** Dotted id used in diagnostics and docs. */\n id: string\n /** Where this slot sits in the page. */\n position: string\n /** Keys the blocks inside receive through `useSlotContext`. */\n provides: readonly string[]\n /**\n * `stable` means a store in our fleet actually needed this position and paid\n * for it by forking something; `experimental` means the position is plausible\n * but unproven and may move or be removed in a minor.\n *\n * The distinction is not decoration. Every slot is a compatibility promise,\n * and a surface that promises two dozen positions nobody asked for is a\n * surface that cannot be changed later. FastStore marks unproven API with an\n * `__experimental` prefix for the same reason; this is the same idea as a\n * field, so `fayz upgrade` can tell a store which unproven slots it depends on.\n */\n stability: 'stable' | 'experimental'\n /** For stable slots: the fork that proves the position was needed. */\n evidence?: string\n}\n\nconst PRODUCT_DETAIL_CONTEXT = ['product', 'soldOut', 'lowStock', 'discountPct'] as const\nconst PRODUCT_CARD_CONTEXT = ['product', 'soldOut', 'onSale', 'hasOptions'] as const\nconst CATALOG_CONTEXT = ['products', 'loading'] as const\nconst CART_CONTEXT = ['lines', 'subtotal'] as const\nconst CHECKOUT_CONTEXT = ['subtotal', 'total'] as const\n\n/**\n * Every slot, with its position, the context it provides, and whether a real\n * store ever asked for it.\n *\n * Shipped as data rather than written in prose because a prose inventory drifts\n * the first time a slot is added. The docs page and the agent's prompt both read\n * this, so there is one list and it is the code's.\n *\n * Six slots are `stable`: a store in the fleet needed that exact position and\n * paid for it by forking a page or a component. The rest are `experimental` —\n * plausible positions with no proven demand yet. Marking them honestly is what\n * keeps the surface changeable; a store that builds on one is told, by\n * `fayz upgrade`, that it did.\n */\nexport const STOREFRONT_SLOTS: readonly SlotDescriptor[] = [\n x('productDetail', 'beforeTitle', 'between the breadcrumb and the product name', PRODUCT_DETAIL_CONTEXT),\n x('productDetail', 'afterTitle', 'under the product name, above the price', PRODUCT_DETAIL_CONTEXT),\n x('productDetail', 'afterPrice', 'under the price and discount badge', PRODUCT_DETAIL_CONTEXT),\n // The one PDP position with proof: this store put a Materials/Symbolism/\n // Availability <dl> exactly here, and reimplementing the page to do it cost it\n // the gallery, option selection, quantity, specs, related products and every\n // head tag on every product page.\n s(\n 'productDetail',\n 'afterDescription',\n 'under the description paragraph, above the actions',\n PRODUCT_DETAIL_CONTEXT,\n 'cristinarotondaro-shop/src/storefront/components/product.tsx:71-86',\n ),\n x('productDetail', 'beforeAddToCart', 'above the quantity and add-to-cart row', PRODUCT_DETAIL_CONTEXT),\n x('productDetail', 'afterAddToCart', 'under the add-to-cart row', PRODUCT_DETAIL_CONTEXT),\n x('productDetail', 'afterGallery', 'under the gallery, in the left column', PRODUCT_DETAIL_CONTEXT),\n x('productDetail', 'beforeSpecs', 'above the specification table', PRODUCT_DETAIL_CONTEXT),\n s(\n 'productDetail',\n 'afterDetail',\n 'the bottom of the page, after related products',\n PRODUCT_DETAIL_CONTEXT,\n 'cristinarotondaro-shop/src/storefront/components/product.tsx:95-102 (enquiry panel)',\n ),\n // The four card positions. Three are stable on the strength of the fleet: this\n // is the component our stores forked most, and every fork lost something.\n s(\n 'productCard',\n 'afterName',\n 'between the product name and the price row',\n PRODUCT_CARD_CONTEXT,\n 'pulse-store PulseProductCard.tsx:70-76; artorious ArtoriusProductCard.tsx:107-118; compactor CompactorProductCard.tsx:99; cristinarotondaro product.tsx:34 — 4 of 5',\n ),\n s(\n 'productCard',\n 'imageOverlay',\n 'over the image; the container is relative, content positions itself',\n PRODUCT_CARD_CONTEXT,\n 'pulse PulseProductCard.tsx:40-44; artorious ArtoriusProductCard.tsx:67-92 — 3 of 5',\n ),\n s(\n 'productCard',\n 'underPrice',\n 'under the price row',\n PRODUCT_CARD_CONTEXT,\n 'compactor CompactorProductCard.tsx:104 (Pix + installment lines); config.payments.terms already exists for it',\n ),\n x('productCard', 'top', 'above the image, full card width', PRODUCT_CARD_CONTEXT),\n s(\n 'catalog',\n 'beforeHeading',\n 'above the catalog heading',\n CATALOG_CONTEXT,\n 'cristinarotondaro-shop/src/storefront/customization.tsx:414-426 (category hero)',\n ),\n s(\n 'catalog',\n 'beforeGrid',\n 'between the heading and the grid',\n CATALOG_CONTEXT,\n 'cristinarotondaro-shop/src/storefront/customization.tsx:427-429 (statement band)',\n ),\n x('catalog', 'afterFilters', 'inside the filter column, under the filters', CATALOG_CONTEXT),\n s(\n 'catalog',\n 'afterGrid',\n 'under the product grid',\n CATALOG_CONTEXT,\n 'cristinarotondaro-shop/src/storefront/customization.tsx:442-450 (bespoke empty state)',\n ),\n x('cart', 'beforeLines', 'above the cart line items', CART_CONTEXT),\n x('cart', 'beforeSummary', 'between the lines and the totals', CART_CONTEXT),\n s(\n 'cart',\n 'afterSummary',\n 'under the totals, around the checkout button',\n CART_CONTEXT,\n 'artorious-shop/docs/TODO.md:167-179; the CartDrawerFooterExtra contract exists for it',\n ),\n x('checkout', 'beforeForm', 'above the checkout form', CHECKOUT_CONTEXT),\n x('checkout', 'afterPaymentMethods', 'under the payment method selector', CHECKOUT_CONTEXT),\n x('checkout', 'afterForm', 'under the form, around the place-order button', CHECKOUT_CONTEXT),\n x('header', 'beforeActions', 'left of the account and cart icons', []),\n x('header', 'afterActions', 'right of the cart icon', []),\n x('header', 'belowNav', 'a full-width strip under the whole header', []),\n x('footer', 'before', 'above the footer columns', []),\n x('footer', 'after', 'under the footer columns, above the credit line', []),\n]\n\n/** A slot with proven demand. */\nfunction s(\n area: StorefrontSlotArea,\n name: string,\n position: string,\n provides: readonly string[],\n evidence: string,\n): SlotDescriptor {\n return { area, name, id: `${area}.${name}`, position, provides, stability: 'stable', evidence }\n}\n\n/** A plausible position with no proven demand yet. */\nfunction x(\n area: StorefrontSlotArea,\n name: string,\n position: string,\n provides: readonly string[],\n): SlotDescriptor {\n return { area, name, id: `${area}.${name}`, position, provides, stability: 'experimental' }\n}\n\nexport interface ListSlotsOptions {\n area?: StorefrontSlotArea\n /** Keep only slots a store has actually proven it needs. */\n stableOnly?: boolean\n}\n\n/** The slot inventory, optionally narrowed. */\nexport function listSlots(\n areaOrOptions?: StorefrontSlotArea | ListSlotsOptions,\n): readonly SlotDescriptor[] {\n const options: ListSlotsOptions =\n typeof areaOrOptions === 'string' ? { area: areaOrOptions } : areaOrOptions ?? {}\n return STOREFRONT_SLOTS.filter(\n (slot) =>\n (!options.area || slot.area === options.area) &&\n (!options.stableOnly || slot.stability === 'stable'),\n )\n}\n\n/** The slots a store's config actually fills, with their stability. */\nexport function usedSlots(slots: StorefrontSlots | undefined): readonly SlotDescriptor[] {\n if (!slots) return []\n return STOREFRONT_SLOTS.filter((slot) => {\n const area = slots[slot.area] as Record<string, SlotBlocks> | undefined\n return Boolean(area?.[slot.name]?.length)\n })\n}\n\n// --- Runtime ------------------------------------------------------------------\n\nconst SlotContext = createContext<Record<string, unknown> | null>(null)\n\n/**\n * The context the surrounding slot provides.\n *\n * The type parameter is the caller's assertion about which area it is rendering\n * in, which is as much as a registry-resolved block can be given: the block is\n * looked up by string, so nothing at the call site knows its area statically.\n * Returns null outside a slot, so a block can work both in a slot and in a page.\n */\nexport function useSlotContext<A extends StorefrontSlotArea>(): StorefrontSlotContextMap[A] | null {\n return useContext(SlotContext) as StorefrontSlotContextMap[A] | null\n}\n\nexport interface SlotProps<A extends StorefrontSlotArea> {\n area: A\n name: string\n context?: StorefrontSlotContextMap[A]\n}\n\n/**\n * Render the blocks a store put in one slot.\n *\n * The slot reads its own content out of the config rather than being handed it,\n * so a page places `<Slot area=\"productDetail\" name=\"afterPrice\" />` without\n * threading `config.slots` down to every position. That matters because there\n * are two dozen of these call sites and every threaded prop is a chance to wire\n * one to the wrong slot.\n *\n * Renders nothing — not even a wrapper — when the slot is empty, which is the\n * overwhelmingly common case. An always-present wrapper would change the layout\n * of every page for every store that uses no slots at all.\n */\nexport function Slot<A extends StorefrontSlotArea>({ area, name, context }: SlotProps<A>) {\n const config = useStorefrontConfigOptional()\n const page = useStorefrontPageOptional()\n const blocks = (config?.slots?.[area] as Record<string, SlotBlocks> | undefined)?.[name]\n // Same forced-layout repair as StorefrontPage: a slot tree that lost a\n // required child gets it back before rendering (I7).\n const nodes = useMemo(\n () => (blocks?.length ? repairBlockTree(toBlockNodes(blocks)).nodes : null),\n [blocks],\n )\n const value = useMemo(() => (context ?? {}) as Record<string, unknown>, [context])\n if (!nodes) return null\n // A slot tree resolves its data needs like a page tree (M3): its own scope,\n // nested under the page's, so needs the page already resolved are reused and\n // `$param` bindings see the surrounding page's route params.\n return (\n <SlotContext.Provider value={value}>\n <PageDataScope nodes={nodes} params={page?.params}>\n {renderBlocks(nodes, `presentation.slots.${area}.${name}`)}\n </PageDataScope>\n </SlotContext.Provider>\n )\n}\n","import { clearExtensionPoints, defineExtensionPoint, runEscapeValve, runExtensionPoint } from '@fayz-ai/core'\nimport type { Product } from '@fayz-ai/shop/types'\nimport type { CartLine } from '../stores/cart.store'\n\n// ---------------------------------------------------------------------------\n// The storefront's extension points — spine M7, deliberately FEW.\n//\n// WooCommerce's ExtendSchema discipline is the model: of hundreds of possible\n// seams, only the ones where extension is legitimate are extensible, each with\n// a validated schema, and extension data lands under a namespaced key. Our\n// four many-handler points cover the four asks the fleet has actually made\n// (annotate a cart line, stamp data on an order, badge a product card, add a\n// checkout field), plus exactly ONE escape valve on the one irreversible\n// operation (order creation — I4). Everything else stays closed until a real\n// second consumer exists; adding a point here is an API decision, not a\n// convenience.\n// ---------------------------------------------------------------------------\n\nexport const CART_LINE_ANNOTATION_POINT = 'cart.lineAnnotation'\nexport const ORDER_METADATA_POINT = 'order.metadata'\nexport const PRODUCT_CARD_BADGE_POINT = 'product.cardBadge'\nexport const CHECKOUT_FIELD_POINT = 'checkout.field'\nexport const BEFORE_PLACE_ORDER_VALVE = 'checkout.beforePlaceOrder'\n\n// --- Wire shapes (each mirrors its point's JSON Schema 1:1) -------------------\n\n/** Input of cart.lineAnnotation — one cart line, serializable. */\nexport interface CartLineAnnotationInput {\n productId: string\n name: string\n quantity: number\n unitPrice: number\n slug?: string\n optionsLabel?: string\n}\n\n/** Output of cart.lineAnnotation — one annotation chip under the line. */\nexport interface CartLineAnnotation {\n /** Stable machine key (namespacing is the handler id; this keys within it). */\n key: string\n /** Shopper-facing text. */\n label: string\n /** Optional machine value carried alongside the label. */\n value?: string\n}\n\nexport interface OrderMetadataInput {\n items: Array<{ productId: string; quantity: number; unitPrice: number }>\n subtotal: number\n customerEmail?: string\n}\n\nexport interface ProductCardBadgeInput {\n id: string\n slug: string\n name: string\n price: number\n inventoryCount: number\n compareAtPrice?: number | null\n}\n\nexport interface ProductCardBadge {\n text: string\n tone?: 'default' | 'accent' | 'warning'\n}\n\nexport interface CheckoutFieldInput {\n customerEmail?: string\n}\n\n/** Output of checkout.field — one extra field the checkout form renders. The\n * captured value lands in the order metadata under the handler's namespace. */\nexport interface CheckoutFieldContribution {\n id: string\n label: string\n type: 'text' | 'checkbox'\n required?: boolean\n placeholder?: string\n}\n\n/** Input of the beforePlaceOrder escape valve — the serializable placement\n * intent, BEFORE the default provider path runs. */\nexport interface BeforePlaceOrderContext {\n items: Array<{ productId: string; variantId?: string; quantity: number; optionsLabel?: string }>\n customer: { name: string; email: string }\n currency?: string\n discountCode?: string\n shippingTotal?: number\n notes?: string\n customerId?: string\n}\n\nlet registered = false\n\n/** Test seam — clears the whole extension registry (declarations AND\n * handlers) and re-arms registration, so one suite cannot leak handlers into\n * the next. Pairs with core's clearExtensionPoints. */\nexport function resetStorefrontExtensionPoints(): void {\n clearExtensionPoints()\n registered = false\n}\n\n/** Declare the storefront extension points. Idempotent; called wherever blocks\n * are registered, so describeStore and the runtime always agree on the set. */\nexport function registerStorefrontExtensionPoints(): void {\n if (registered) return\n registered = true\n\n defineExtensionPoint({\n id: CART_LINE_ANNOTATION_POINT,\n description:\n 'Annotate one cart line (gift wrap, engraving, availability note). Handlers see the line, return one annotation; annotations render under the line in the cart drawer.',\n source: 'sdk',\n since: '0.10',\n input: {\n type: 'object',\n properties: {\n productId: { type: 'string', minLength: 1 },\n name: { type: 'string' },\n quantity: { type: 'integer', minimum: 1 },\n unitPrice: { type: 'number', minimum: 0 },\n slug: { type: 'string' },\n optionsLabel: { type: 'string' },\n },\n required: ['productId', 'name', 'quantity', 'unitPrice'],\n additionalProperties: false,\n },\n output: {\n type: 'object',\n properties: {\n key: { type: 'string', minLength: 1 },\n label: { type: 'string', minLength: 1 },\n value: { type: 'string' },\n },\n required: ['key', 'label'],\n additionalProperties: false,\n },\n })\n\n defineExtensionPoint({\n id: ORDER_METADATA_POINT,\n description:\n 'Contribute machine-readable metadata to an order at placement. Each handler returns an object; contributions land on the order namespaced by handler id, so two extensions can never collide.',\n source: 'sdk',\n since: '0.10',\n input: {\n type: 'object',\n properties: {\n items: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n productId: { type: 'string' },\n quantity: { type: 'integer', minimum: 1 },\n unitPrice: { type: 'number', minimum: 0 },\n },\n required: ['productId', 'quantity', 'unitPrice'],\n },\n },\n subtotal: { type: 'number', minimum: 0 },\n customerEmail: { type: 'string' },\n },\n required: ['items', 'subtotal'],\n additionalProperties: false,\n },\n output: { type: 'object' },\n })\n\n defineExtensionPoint({\n id: PRODUCT_CARD_BADGE_POINT,\n description:\n 'Badge a product card (\"Novo\", \"Últimas unidades\", \"Frete grátis\"). Handlers see a product summary and return a badge; badges render next to the built-in sale/sold-out chips.',\n source: 'sdk',\n since: '0.10',\n input: {\n type: 'object',\n properties: {\n id: { type: 'string', minLength: 1 },\n slug: { type: 'string' },\n name: { type: 'string' },\n price: { type: 'number' },\n inventoryCount: { type: 'integer' },\n compareAtPrice: { type: ['number', 'null'] },\n },\n required: ['id', 'name', 'price'],\n additionalProperties: false,\n },\n output: {\n type: 'object',\n properties: {\n text: { type: 'string', minLength: 1, maxLength: 24 },\n tone: { type: 'string', enum: ['default', 'accent', 'warning'] },\n },\n required: ['text'],\n additionalProperties: false,\n },\n })\n\n defineExtensionPoint({\n id: CHECKOUT_FIELD_POINT,\n description:\n 'Contribute one extra field to the checkout form (CPF/CNPJ, gift message, marketing opt-in). The captured value is stored on the order metadata under the handler id.',\n source: 'sdk',\n since: '0.10',\n input: {\n type: 'object',\n properties: { customerEmail: { type: 'string' } },\n additionalProperties: false,\n },\n output: {\n type: 'object',\n properties: {\n id: { type: 'string', minLength: 1 },\n label: { type: 'string', minLength: 1 },\n type: { type: 'string', enum: ['text', 'checkbox'] },\n required: { type: 'boolean' },\n placeholder: { type: 'string' },\n },\n required: ['id', 'label', 'type'],\n additionalProperties: false,\n },\n })\n\n // The ONE escape valve on the storefront's one irreversible operation (I4).\n // WooCommerce's policy, adopted verbatim: always nullable, non-null return\n // short-circuits the default order creation. The registry enforces the\n // single-registrant rule, so this can never rot into a hook graph.\n defineExtensionPoint({\n id: BEFORE_PLACE_ORDER_VALVE,\n description:\n 'THE escape valve for order creation. One registrant maximum. Return null to take the default placeOrder path; return an Order to replace order creation entirely (external OMS, quote-first flows).',\n source: 'sdk',\n since: '0.10',\n mode: 'escape',\n input: {\n type: 'object',\n properties: {\n items: {\n type: 'array',\n minItems: 1,\n items: {\n type: 'object',\n properties: {\n productId: { type: 'string', minLength: 1 },\n variantId: { type: 'string' },\n quantity: { type: 'integer', minimum: 1 },\n optionsLabel: { type: 'string' },\n },\n required: ['productId', 'quantity'],\n },\n },\n customer: {\n type: 'object',\n properties: { name: { type: 'string' }, email: { type: 'string', minLength: 3 } },\n required: ['name', 'email'],\n },\n currency: { type: 'string' },\n discountCode: { type: 'string' },\n shippingTotal: { type: 'number' },\n notes: { type: 'string' },\n customerId: { type: 'string' },\n },\n required: ['items', 'customer'],\n additionalProperties: false,\n },\n // An Order is a rich provider shape; the valve's contract pins what the\n // storefront actually needs to continue (an id and totals) and lets the\n // rest of the Order shape ride along.\n output: {\n type: 'object',\n properties: {\n id: { type: 'string', minLength: 1 },\n total: { type: 'number' },\n },\n required: ['id'],\n },\n })\n}\n\n// --- Consumption helpers (the storefront's own use of its points) -------------\n\n/** Run cart.lineAnnotation for one line → its annotations, handler-ordered. */\nexport async function getCartLineAnnotations(line: CartLine): Promise<CartLineAnnotation[]> {\n registerStorefrontExtensionPoints()\n const input: CartLineAnnotationInput = {\n productId: line.productId,\n name: line.name,\n quantity: line.quantity,\n unitPrice: line.unitPrice,\n ...(line.slug ? { slug: line.slug } : {}),\n ...(line.optionsLabel ? { optionsLabel: line.optionsLabel } : {}),\n }\n const contributions = await runExtensionPoint<CartLineAnnotationInput, CartLineAnnotation>(\n CART_LINE_ANNOTATION_POINT,\n input,\n )\n return contributions.map((c) => c.value)\n}\n\n/** Run product.cardBadge for one product → its badges, handler-ordered. */\nexport async function getProductCardBadges(product: Product): Promise<ProductCardBadge[]> {\n registerStorefrontExtensionPoints()\n const input: ProductCardBadgeInput = {\n id: product.id,\n slug: product.slug,\n name: product.name,\n price: product.price,\n inventoryCount: product.inventoryCount,\n compareAtPrice: product.compareAtPrice,\n }\n const contributions = await runExtensionPoint<ProductCardBadgeInput, ProductCardBadge>(\n PRODUCT_CARD_BADGE_POINT,\n input,\n )\n return contributions.map((c) => c.value)\n}\n\n/** Run checkout.field → the extra fields a checkout form should render. */\nexport async function getCheckoutFieldContributions(input: CheckoutFieldInput = {}): Promise<\n Array<CheckoutFieldContribution & { handlerId: string }>\n> {\n registerStorefrontExtensionPoints()\n const contributions = await runExtensionPoint<CheckoutFieldInput, CheckoutFieldContribution>(\n CHECKOUT_FIELD_POINT,\n input,\n )\n return contributions.map((c) => ({ ...c.value, handlerId: c.handlerId }))\n}\n\n/**\n * Run order.metadata → the namespaced metadata object for a new order, or\n * undefined when nothing contributed. Namespacing by handler id is the\n * WooCommerce ExtendSchema rule: two extensions cannot clobber each other.\n */\nexport async function collectOrderMetadata(input: OrderMetadataInput): Promise<Record<string, unknown> | undefined> {\n registerStorefrontExtensionPoints()\n const contributions = await runExtensionPoint<OrderMetadataInput, Record<string, unknown>>(\n ORDER_METADATA_POINT,\n input,\n )\n if (contributions.length === 0) return undefined\n return Object.fromEntries(contributions.map((c) => [c.handlerId, c.value]))\n}\n\n/** Run the beforePlaceOrder valve. Null → take the default path. */\nexport async function runBeforePlaceOrderValve<TOrder extends { id: string }>(\n ctx: BeforePlaceOrderContext,\n): Promise<TOrder | null> {\n registerStorefrontExtensionPoints()\n return runEscapeValve<BeforePlaceOrderContext, TOrder>(BEFORE_PLACE_ORDER_VALVE, ctx)\n}\n","import React from 'react'\nimport { ShoppingBag } from 'lucide-react'\nimport { useStorefrontConfig } from '../../document/config'\nimport { Link, navigateTo } from '../../app/router'\nimport { getProductOptionGroups } from '../../data/product-options'\nimport { Price } from '../Price'\nimport { PaymentTerms } from '../PaymentTerms'\nimport { TID } from '../../lib/testids'\nimport { productCardComponentContract } from '../../extend/component-selectors'\nimport { useStorefrontActions } from '../../hooks/use-storefront-actions'\nimport type { ProductImage } from '@fayz-ai/shop/types'\nimport type { ProductCardImageOrder, ProductCardProps } from '../../extend/component-contracts'\nimport { SmoothImage } from '../SmoothImage'\nimport { productPlaceholder } from '../../blocks/sections'\nimport { Slot } from '../../extend/slots'\nimport { getProductCardBadges, type ProductCardBadge } from '../../extend/extension-points'\n\nconst BADGE_TONE_CLASSES: Record<NonNullable<ProductCardBadge['tone']> | 'default', string> = {\n default: 'bg-gray-900/80 text-white',\n accent: 'bg-primary text-primary-foreground',\n warning: 'bg-amber-500 text-white',\n}\n\n/** Badges contributed through the product.cardBadge extension point (spine\n * M7). Async because handlers may be; renders nothing until they answer. */\nfunction useExtensionBadges(product: ProductCardProps['product']): ProductCardBadge[] {\n const [badges, setBadges] = React.useState<ProductCardBadge[]>([])\n React.useEffect(() => {\n let cancelled = false\n getProductCardBadges(product).then((next) => {\n // Skip the state write when nothing contributed — the common case — so\n // a store with no badge handlers re-renders zero extra times.\n if (!cancelled && next.length > 0) setBadges(next)\n })\n return () => {\n cancelled = true\n }\n }, [product.id, product.price, product.inventoryCount])\n return badges\n}\n\n/**\n * The card's photo, per the declared rule (see {@link ProductCardImageOrder}).\n *\n * Exported and pure for the same reason `orderGalleryImages` is: this single\n * choice is what a store used to replace the whole card for. `position` breaks\n * ties by image id too, so a catalog with duplicate sort orders still renders\n * the same photo on every load — the nondeterminism IS the bug.\n */\nexport function pickProductCardImage(\n images: ProductImage[],\n order: ProductCardImageOrder = 'primary',\n): ProductImage | undefined {\n if (images.length === 0) return undefined\n if (order === 'position') {\n return [...images].sort(\n (a, b) => (a.sortOrder ?? 0) - (b.sortOrder ?? 0) || String(a.id).localeCompare(String(b.id)),\n )[0]\n }\n return images.find((i) => i.isPrimary) ?? images[0]\n}\n\nexport function ProductCard({ product, config: providedConfig, actions: providedActions, imageOrder = 'primary' }: ProductCardProps) {\n const runtimeConfig = useStorefrontConfig()\n const runtimeActions = useStorefrontActions()\n const config = providedConfig ?? runtimeConfig\n const actions = providedActions ?? runtimeActions\n const hasOptions = getProductOptionGroups(product).length > 0\n const soldOut = product.inventoryCount <= 0\n const onSale = product.compareAtPrice != null && product.compareAtPrice > product.price\n const image = pickProductCardImage(product.images, imageOrder)\n const cardStyle = config.theme?.productCard?.style ?? 'card'\n const extensionBadges = useExtensionBadges(product)\n const aspect = config.theme?.productCard?.imageAspect === 'portrait' ? 'aspect-[3/4]' : 'aspect-square'\n const purchaseMode = config.commerceMode === 'checkout'\n\n // Every card provides its own product, so a slot rendered once per card in a\n // grid still describes the right one.\n const cardSlotContext = { product, soldOut, onSale, hasOptions }\n\n return (\n <div\n {...productCardComponentContract.root}\n data-slug={product.slug}\n className={`group flex flex-col overflow-hidden transition-all duration-300 ${\n cardStyle === 'editorial'\n ? 'hover:-translate-y-1'\n : 'border bg-card hover:-translate-y-1 hover:shadow-lg'\n }`}\n style={{ borderRadius: 'var(--sf-radius-card)' }}\n >\n <Slot area=\"productCard\" name=\"top\" context={cardSlotContext} />\n\n <div\n className={`relative ${aspect} overflow-hidden bg-muted`}\n style={{ borderRadius: cardStyle === 'editorial' ? 'var(--sf-radius-card)' : undefined }}\n >\n <Link to={`/product/${product.slug}`} className=\"block h-full w-full\">\n {/* A product with no photo used to render an empty box. It now renders\n a generated mark, so a store built before the photo shoot still\n looks like a store. */}\n <SmoothImage\n src={image?.url ?? productPlaceholder(product.name)}\n alt={image?.altText ?? product.name}\n className=\"h-full w-full object-cover transition-transform duration-300 group-hover:scale-105\"\n loading=\"lazy\"\n />\n <div className=\"absolute left-3 top-3 flex gap-2\">\n {onSale && !soldOut && (\n <span\n data-testid={TID.badgeSale}\n className=\"rounded-full bg-red-600 px-2.5 py-0.5 text-xs font-semibold text-white\"\n >\n Oferta\n </span>\n )}\n {soldOut && (\n <span\n data-testid={TID.badgeSoldout}\n className=\"rounded-full bg-gray-900/80 px-2.5 py-0.5 text-xs font-semibold text-white\"\n >\n Esgotado\n </span>\n )}\n {extensionBadges.map((badge) => (\n <span\n key={badge.text}\n data-extension-badge={badge.text}\n className={`rounded-full px-2.5 py-0.5 text-xs font-semibold ${BADGE_TONE_CLASSES[badge.tone ?? 'default']}`}\n >\n {badge.text}\n </span>\n ))}\n </div>\n </Link>\n {/* A sibling of the anchor, not a child: the container is `relative`, so\n overlay content positions itself with `absolute`. Three stores wanted\n a chip or a ribbon here and each forked the card to get it. */}\n <Slot area=\"productCard\" name=\"imageOverlay\" context={cardSlotContext} />\n </div>\n\n <div className={`flex flex-1 flex-col gap-1 ${cardStyle === 'editorial' ? 'px-1 py-3' : 'p-4'}`}>\n <span className=\"text-xs text-muted-foreground\">{product.categoryName}</span>\n <Link\n to={`/product/${product.slug}`}\n {...productCardComponentContract.name}\n className=\"font-medium leading-snug hover:underline\"\n >\n {product.name}\n </Link>\n\n <Slot area=\"productCard\" name=\"afterName\" context={cardSlotContext} />\n\n <div className=\"mt-auto flex items-center justify-between gap-3 pt-2\">\n {purchaseMode ? (\n // The terms sit under the price rather than beside it: they are two\n // more lines of the same statement, and the add button stays put.\n // Renders nothing unless the store configured `payments.terms`.\n <div className=\"min-w-0\">\n <Price\n value={product.price}\n compareAt={product.compareAtPrice}\n testId={productCardComponentContract.priceTestId}\n />\n <PaymentTerms price={product.price} metadata={product.metadata} variant=\"card\" />\n </div>\n ) : (\n <span data-testid={productCardComponentContract.priceTestId} className=\"text-sm text-muted-foreground\">\n {config.commerceMode === 'enquiry' ? config.enquiry.label : 'Ver detalhes'}\n </span>\n )}\n <button\n type=\"button\"\n {...productCardComponentContract.addButton}\n disabled={purchaseMode && soldOut}\n aria-label={\n purchaseMode\n ? hasOptions\n ? `Escolher opções de ${product.name}`\n : `Adicionar ${product.name} ao carrinho`\n : `${config.enquiry.label} ${product.name}`\n }\n onClick={() => {\n if (!purchaseMode) {\n navigateTo(`/product/${product.slug}`)\n return\n }\n // Products with variants (size/color) must pick an option on the PDP\n // — quick-adding would create an option-less line. Others add inline\n // (addItem auto-opens the cart drawer).\n if (hasOptions) {\n navigateTo(`/product/${product.slug}`)\n return\n }\n actions.addToCart(product)\n }}\n className=\"rounded-full border bg-background/90 p-2.5 text-foreground shadow-sm transition-all duration-200 hover:scale-110 hover:bg-primary hover:text-primary-foreground hover:shadow disabled:cursor-not-allowed disabled:opacity-40 lg:translate-y-1 lg:opacity-0 lg:group-hover:translate-y-0 lg:group-hover:opacity-100 lg:disabled:opacity-0 lg:group-hover:disabled:opacity-40\"\n >\n <ShoppingBag className=\"h-4 w-4\" />\n </button>\n </div>\n\n <Slot area=\"productCard\" name=\"underPrice\" context={cardSlotContext} />\n </div>\n </div>\n )\n}\n","import type { ComponentType } from 'react'\n\n// ---------------------------------------------------------------------------\n// Overrides that are not all-or-nothing.\n//\n// `components: { ProductDetail: MyDetail }` means \"I own this page and its\n// maintenance debt forever\". Four of our five customizing stores took that deal\n// on ProductCard, and every one of them lost something in the process: the sale\n// badge, the variant guard that keeps quick-add from creating an option-less\n// line, `commerceMode` gating, `theme.productCard` honouring. None of them\n// wanted to reinvent the card — they wanted two or three things about it.\n//\n// So an override may now supply props instead of a component. Lesson taken\n// directly from FastStore's `getOverriddenSection({ Section, components })`,\n// where the granularity is a sub-component rather than the whole section.\n// ---------------------------------------------------------------------------\n\n/**\n * Either the whole component (what stores write today), or an adjustment.\n *\n * `{ props }` alone keeps the SDK component and forces some of its props.\n * `{ component, props }` replaces it and pre-binds props — useful for a wrapper\n * that needs a couple of fixed values.\n */\nexport type ComponentOverride<P> =\n | ComponentType<P>\n | {\n component?: ComponentType<P>\n /** Props forced on the component, overriding what the page passes. */\n props?: Partial<P>\n }\n\n/**\n * True for anything React will render as a component.\n *\n * The `$$typeof` branch is not defensive noise: `React.memo(X)` and\n * `React.forwardRef(X)` return OBJECTS, not functions. Without it, a store\n * writing `ProductCard: memo(MyCard)` would be read as the `{component, props}`\n * form with neither key present, and the SDK would silently render its own card\n * while the store believed its override was live.\n */\nfunction isComponentLike<P>(value: unknown): value is ComponentType<P> {\n if (typeof value === 'function') return true\n return typeof value === 'object' && value !== null && '$$typeof' in value\n}\n\nexport interface ResolvedOverride<P> {\n Component: ComponentType<P>\n /** Props to apply last, so an override wins over what the page computed. */\n props: Partial<P>\n /** True when the store replaced the component rather than adjusting it. */\n replaced: boolean\n}\n\n/**\n * Normalize both override forms against the SDK's own component.\n *\n * Override props are applied AFTER the page's, deliberately: an override that\n * could not win over a computed prop would be unable to change the thing the\n * store is overriding it for.\n */\nexport function resolveOverride<P>(\n override: ComponentOverride<P> | undefined,\n fallback: ComponentType<P>,\n): ResolvedOverride<P> {\n if (!override) return { Component: fallback, props: {}, replaced: false }\n if (isComponentLike<P>(override)) return { Component: override, props: {}, replaced: true }\n const { component, props } = override\n return {\n Component: component ?? fallback,\n props: props ?? {},\n replaced: component != null,\n }\n}\n\n/**\n * The component an override resolves to, or undefined when the store only\n * adjusted props. Lets a page keep its existing `if (Override) …` branch, which\n * exists because replacing a page body is structurally different from tweaking\n * one of its props.\n */\nexport function overrideComponent<P>(override: ComponentOverride<P> | undefined): ComponentType<P> | undefined {\n if (!override) return undefined\n if (isComponentLike<P>(override)) return override\n return override.component\n}\n\n/** The props an override forces, whether or not it also replaces the component. */\nexport function overrideProps<P>(override: ComponentOverride<P> | undefined): Partial<P> {\n if (!override || isComponentLike<P>(override)) return {}\n return override.props ?? {}\n}\n","import React from 'react'\nimport type { BlockNode, RegistryMeta } from '@fayz-ai/core'\nimport type { Product } from '@fayz-ai/shop/types'\nimport { getStorefrontComponents, useStorefrontConfig } from '../../document/config'\nimport { useStorefrontActions } from '../../hooks/use-storefront-actions'\nimport { BlockDataError, useBlockData } from '../../blocks/page-data'\nimport { ProductCard } from './ProductCard'\nimport { Reveal } from '../../lib/motion'\nimport { Link } from '../../app/router'\nimport { TID } from '../../lib/testids'\nimport { resolveOverride } from '../../extend/component-override'\n\nexport function ProductRail({\n title,\n subtitle,\n eyebrow,\n filter = 'all',\n limit = 4,\n node,\n}: {\n title: string\n subtitle?: string\n eyebrow?: string\n filter?: 'sale' | 'new' | 'all'\n limit?: number\n /** The block node, when rendered from a tree — carries instance `data` overrides. */\n node?: BlockNode\n}) {\n const config = useStorefrontConfig()\n const actions = useStorefrontActions()\n const components = getStorefrontComponents(config)\n const { Component: ProductCardComponent, props: cardOverrideProps } = resolveOverride(components.ProductCard, ProductCard)\n // The block's declared need (`productsBlockMeta.data`), resolved once per\n // page by the page-level resolver and deduped with every block asking the\n // same question. Used as plain JSX (no node), the fallback resolves the same\n // loader directly — the read goes through the provider port either way (I11).\n const { status, data, error, loader } = useBlockData<Product[]>(node, 'products', {\n loader: 'products.list',\n params: { filter, limit },\n })\n if (status === 'error') return <BlockDataError loader={loader} message={error} />\n const loading = status !== 'ready'\n const visible = data ?? []\n\n if (!loading && visible.length === 0) return null\n\n return (\n <section data-testid={TID.productRail} className=\"mx-auto max-w-7xl px-4 py-14 sm:px-6\">\n <Reveal className=\"mb-10 text-center\">\n {eyebrow && (\n <p className=\"mb-2 text-xs font-semibold uppercase tracking-[0.2em] text-primary\">{eyebrow}</p>\n )}\n <h2 className=\"sf-heading text-3xl font-bold tracking-tight\">{title}</h2>\n {subtitle && <p className=\"mt-2 text-muted-foreground\">{subtitle}</p>}\n </Reveal>\n {loading ? (\n <div className=\"grid grid-cols-2 gap-5 md:grid-cols-4\">\n {Array.from({ length: limit }, (_, i) => (\n <div key={i} className=\"aspect-[3/4] animate-pulse bg-muted\" style={{ borderRadius: 'var(--sf-radius-card)' }} />\n ))}\n </div>\n ) : (\n <div className=\"grid grid-cols-2 gap-5 md:grid-cols-4\">\n {visible.map((p, i) => (\n <Reveal key={p.id} delay={i * 90}>\n <ProductCardComponent\n product={p}\n config={config}\n commerceMode={config.commerceMode}\n actions={actions}\n {...cardOverrideProps}\n />\n </Reveal>\n ))}\n </div>\n )}\n <Reveal className=\"mt-10 text-center\" delay={200}>\n <Link\n to={config.catalogPath}\n className=\"sf-cta inline-block border border-foreground/30 px-7 py-2.5 text-sm font-semibold transition-all hover:-translate-y-0.5 hover:bg-foreground hover:text-background hover:shadow\"\n style={{ borderRadius: 'var(--sf-radius-button)' }}\n >\n Ver tudo\n </Link>\n </Reveal>\n </section>\n )\n}\n\nexport const productsBlockMeta = {\n label: 'Product rail',\n description: 'Grid of product cards drawn from the catalog by a filter, with an optional heading.',\n settings: [\n { id: 'title', type: 'text', label: 'Title', required: true },\n { id: 'subtitle', type: 'text', label: 'Subtitle', help: 'One line under the title. Optional.' },\n {\n id: 'eyebrow',\n type: 'text',\n label: 'Eyebrow',\n help: \"Small caps label above the title, e.g. 'curadoria'.\",\n },\n {\n id: 'filter',\n type: 'select',\n label: 'Which products',\n help: \"sale = only products with a compare-at price above the current price; new = newest first; all = catalog order. 'sale' renders nothing when no product is discounted.\",\n options: [\n { value: 'all', label: 'All products' },\n { value: 'new', label: 'New arrivals' },\n { value: 'sale', label: 'On sale' },\n ],\n default: 'all',\n },\n {\n id: 'limit',\n type: 'number',\n label: 'How many',\n help: 'Rendered in a 4-column grid, so multiples of 4 fill the last row.',\n min: 1,\n max: 24,\n default: 4,\n },\n ],\n presets: [\n {\n name: 'Featured products',\n props: {\n eyebrow: 'curadoria',\n title: 'Destaques',\n subtitle: 'Uma seleção do que temos de melhor.',\n filter: 'all',\n limit: 4,\n },\n },\n {\n name: 'New arrivals',\n props: { title: 'Novidades', subtitle: 'As últimas peças que chegaram à loja.', filter: 'new', limit: 8 },\n },\n ],\n // 'product' included: an unfiltered rail below a product is the usual\n // \"you may also like\" surface.\n enabledOn: ['home', 'catalog', 'collection', 'product', 'content'],\n // The declared read (M3): resolved once per page, deduped with every other\n // block asking the same question. `$prop` bindings keep the declaration and\n // the rendered block in agreement — setting defaults fill unset props.\n data: {\n products: {\n loader: 'products.list',\n params: { filter: { $prop: 'filter' }, limit: { $prop: 'limit' } },\n },\n },\n} satisfies Omit<RegistryMeta, 'propsSchema'>\n","import React, { useEffect, useRef, useState } from 'react'\nimport { ChevronLeft, ChevronRight } from 'lucide-react'\nimport { Link } from '../../app/router'\nimport { TID } from '../../lib/testids'\nimport { prefersReducedMotion } from '../../lib/motion'\nimport type { RegistryMeta } from '@fayz-ai/core'\nimport type { MediaCarouselItem } from '../../blocks/sections'\n// `image` is required here and the component has no fallback, so the presets\n// generate one — an inserted carousel must never land as a blank slab.\nimport { bannerPlaceholder } from '../../blocks/sections'\nimport { useStorefrontConfig } from '../../document/config'\n\nexport interface MediaCarouselProps {\n items: MediaCarouselItem[]\n height?: 'medium' | 'tall' | 'screen'\n autoplayMs?: number\n overlay?: 'dark' | 'soft' | 'none'\n className?: string\n}\n\nconst heightClass = {\n medium: 'h-[58vh] min-h-[420px]',\n tall: 'h-[74vh] min-h-[520px]',\n screen: 'min-h-[calc(100vh-64px)]',\n}\n\nconst alignClass = {\n start: 'items-start text-left',\n center: 'items-center text-center',\n end: 'items-end text-right',\n}\n\nexport function MediaCarousel({\n // Empty rather than absent: an inserted block has no content yet, and a\n // section that throws on missing props takes the whole page with it.\n items = [],\n height = 'tall',\n autoplayMs = 7000,\n overlay = 'dark',\n className = '',\n}: MediaCarouselProps) {\n const [index, setIndex] = useState(0)\n const [loadedItems, setLoadedItems] = useState<Record<number, boolean>>({})\n const config = useStorefrontConfig()\n const interacted = useRef(false)\n const revealImages = config.imageLoading.mode !== 'none'\n const revealStyle = (loaded: boolean): React.CSSProperties | undefined =>\n revealImages\n ? {\n filter: config.imageLoading.blur && !loaded ? 'blur(10px)' : 'blur(0px)',\n transition: `opacity 700ms ease, filter ${config.imageLoading.durationMs}ms ${config.imageLoading.easing}`,\n }\n : undefined\n\n useEffect(() => {\n if (items.length < 2 || autoplayMs <= 0 || prefersReducedMotion()) return\n const timer = setInterval(() => {\n if (!interacted.current) setIndex((i) => (i + 1) % items.length)\n }, autoplayMs)\n return () => clearInterval(timer)\n }, [autoplayMs, items.length])\n\n if (items.length === 0) return null\n\n const active = items[Math.min(index, items.length - 1)]!\n const goTo = (next: number) => {\n interacted.current = true\n setIndex((next + items.length) % items.length)\n }\n const overlayClass =\n overlay === 'dark'\n ? 'bg-gradient-to-r from-black/70 via-black/25 to-black/25'\n : overlay === 'soft'\n ? 'bg-gradient-to-t from-black/45 via-black/10 to-transparent'\n : ''\n\n return (\n <section data-testid={TID.mediaCarousel} className={`relative isolate overflow-hidden ${heightClass[height]} ${className}`}>\n {items.map((item, i) => (\n <img\n key={`${item.title}-${i}`}\n src={item.image}\n alt={item.imageAlt ?? item.title}\n aria-hidden={i !== index}\n loading={i === 0 ? 'eager' : 'lazy'}\n decoding=\"async\"\n onLoad={() => setLoadedItems((current) => ({ ...current, [i]: true }))}\n style={revealStyle(Boolean(loadedItems[i]))}\n className={`absolute inset-0 -z-10 h-full w-full object-cover transition-opacity duration-700 ${\n i === index && (!revealImages || loadedItems[i]) ? 'opacity-100' : 'opacity-0'\n }`}\n />\n ))}\n <div className={`absolute inset-0 -z-10 ${overlayClass}`} />\n <div className={`flex h-full px-5 py-16 sm:px-10 lg:px-16 ${alignClass[active.align ?? 'start']}`}>\n <div className=\"my-auto max-w-2xl text-white drop-shadow-md\">\n {active.eyebrow && (\n <p className=\"mb-4 text-xs font-semibold uppercase tracking-[0.24em] text-white/80\">{active.eyebrow}</p>\n )}\n <h1 className=\"sf-heading text-5xl font-normal leading-[0.95] sm:text-7xl lg:text-8xl\">{active.title}</h1>\n {active.subtitle && <p className=\"mt-5 max-w-xl text-base leading-8 text-white/88 sm:text-lg\">{active.subtitle}</p>}\n {active.cta && (\n <Link\n to={active.href ?? '/catalog'}\n className=\"mt-8 inline-flex border border-white/75 px-6 py-3 text-xs font-semibold uppercase tracking-[0.18em] text-white transition hover:bg-white hover:text-black\"\n >\n {active.cta}\n </Link>\n )}\n </div>\n </div>\n {items.length > 1 && (\n <>\n <button\n type=\"button\"\n aria-label=\"Previous slide\"\n data-testid={TID.mediaCarouselPrev}\n onClick={() => goTo(index - 1)}\n className=\"absolute left-4 top-1/2 inline-flex h-10 w-10 -translate-y-1/2 items-center justify-center border border-white/60 bg-black/20 text-white backdrop-blur transition hover:bg-white hover:text-black\"\n >\n <ChevronLeft className=\"h-5 w-5\" />\n </button>\n <button\n type=\"button\"\n aria-label=\"Next slide\"\n data-testid={TID.mediaCarouselNext}\n onClick={() => goTo(index + 1)}\n className=\"absolute right-4 top-1/2 inline-flex h-10 w-10 -translate-y-1/2 items-center justify-center border border-white/60 bg-black/20 text-white backdrop-blur transition hover:bg-white hover:text-black\"\n >\n <ChevronRight className=\"h-5 w-5\" />\n </button>\n <div className=\"absolute bottom-5 left-1/2 flex -translate-x-1/2 gap-2\">\n {items.map((item, i) => (\n <button\n key={`${item.title}-dot-${i}`}\n type=\"button\"\n aria-label={`Go to slide ${i + 1}`}\n onClick={() => goTo(i)}\n className={`h-2 rounded-full transition-all ${i === index ? 'w-8 bg-white' : 'w-2 bg-white/55 hover:bg-white'}`}\n />\n ))}\n </div>\n </>\n )}\n </section>\n )\n}\n\nexport const mediaCarouselBlockMeta = {\n label: 'Media carousel',\n description: 'Editorial full-bleed image carousel with oversized headline, eyebrow and link.',\n settings: [\n {\n id: 'items',\n type: 'list',\n label: 'Slides',\n help: 'Every slide needs an image — it is the background, there is no fallback. A single slide renders as a static banner (no arrows, no autoplay).',\n required: true,\n of: [\n { id: 'image', type: 'image', label: 'Background image', help: 'Wide landscape art; the copy sits over it.', required: true },\n { id: 'imageAlt', type: 'text', label: 'Image alt text', help: 'Falls back to the title when empty.' },\n { id: 'eyebrow', type: 'text', label: 'Eyebrow', help: 'Small uppercase label above the headline.' },\n { id: 'title', type: 'text', label: 'Headline', help: 'Rendered very large — a few words read best.', required: true },\n { id: 'subtitle', type: 'text', label: 'Subtitle' },\n { id: 'cta', type: 'text', label: 'Button label', help: 'Leave empty to render no button.' },\n { id: 'href', type: 'url', label: 'Button link', help: 'Defaults to /catalog.' },\n {\n id: 'align',\n type: 'select',\n label: 'Copy alignment',\n help: 'Where the copy sits horizontally over the image — move it off the subject of the photo.',\n default: 'start',\n options: [\n { value: 'start', label: 'Left' },\n { value: 'center', label: 'Center' },\n { value: 'end', label: 'Right' },\n ],\n },\n ],\n },\n {\n id: 'height',\n type: 'select',\n label: 'Height',\n default: 'tall',\n options: [\n { value: 'medium', label: 'Medium' },\n { value: 'tall', label: 'Tall' },\n { value: 'screen', label: 'Full screen' },\n ],\n },\n {\n id: 'autoplayMs',\n type: 'number',\n label: 'Autoplay interval (ms)',\n help: 'Set 0 to disable autoplay. Autoplay also stops after the first visitor interaction, with a single slide, or under reduced-motion.',\n default: 7000,\n min: 0,\n max: 30000,\n },\n {\n id: 'overlay',\n type: 'select',\n label: 'Image overlay',\n help: 'The copy is always white — keep dark or soft unless the images are already dark enough to read over.',\n default: 'dark',\n options: [\n { value: 'dark', label: 'Dark' },\n { value: 'soft', label: 'Soft' },\n { value: 'none', label: 'None' },\n ],\n },\n ],\n presets: [\n {\n name: 'Media carousel',\n props: {\n height: 'tall',\n overlay: 'dark',\n autoplayMs: 7000,\n items: [\n {\n eyebrow: 'nova coleção',\n title: 'Feito para durar',\n subtitle: 'Peças autorais, produção limitada e acabamento à mão.',\n cta: 'Ver coleção',\n href: '/catalog',\n align: 'start',\n image: bannerPlaceholder('Feito para durar', 210, 250),\n },\n {\n eyebrow: 'seleção',\n title: 'Os favoritos da casa',\n subtitle: 'O que nossos clientes mais levam.',\n cta: 'Explorar',\n href: '/catalog',\n align: 'start',\n image: bannerPlaceholder('Os favoritos da casa', 30, 12),\n },\n ],\n },\n },\n ],\n // Full-bleed and typographically loud: an opener, not something to drop above a\n // product's buy box.\n enabledOn: ['home', 'collection', 'content'],\n} satisfies Omit<RegistryMeta, 'propsSchema'>\n","import React, { useRef } from 'react'\nimport type { BlockNode, RegistryMeta } from '@fayz-ai/core'\nimport type { Product } from '@fayz-ai/shop/types'\nimport { ChevronLeft, ChevronRight } from 'lucide-react'\nimport { getStorefrontComponents, useStorefrontConfig } from '../../document/config'\nimport { useStorefrontActions } from '../../hooks/use-storefront-actions'\nimport { BlockDataError, useBlockData } from '../../blocks/page-data'\nimport { ProductCard } from './ProductCard'\nimport { Link } from '../../app/router'\nimport { TID } from '../../lib/testids'\nimport { resolveOverride } from '../../extend/component-override'\nimport { toFacetMap, type CatalogFacetEntry } from '../../data/facets'\n\nexport interface ProductSliderProps {\n title: string\n subtitle?: string\n eyebrow?: string\n filter?: 'sale' | 'new' | 'all'\n categoryName?: string\n collection?: string\n /**\n * Arbitrary `product.metadata` refinements, the same model the catalogue\n * page uses. A rail for a store's own discovery axis needs no SDK change.\n * Authored as rows (`[{ key: 'purpose', value: 'presentear' }]`) or as a map\n * in hand-written config; both normalise.\n */\n facets?: Record<string, string> | readonly CatalogFacetEntry[]\n limit?: number\n cta?: string\n href?: string\n className?: string\n /** The block node, when rendered from a tree — carries instance `data` overrides. */\n node?: BlockNode\n}\n\nexport function ProductSlider({\n title,\n subtitle,\n eyebrow,\n filter = 'all',\n categoryName,\n collection,\n facets,\n limit = 10,\n cta = 'View all',\n href,\n className = '',\n node,\n}: ProductSliderProps) {\n const config = useStorefrontConfig()\n const actions = useStorefrontActions()\n const viewportRef = useRef<HTMLDivElement>(null)\n const components = getStorefrontComponents(config)\n const { Component: ProductCardComponent, props: cardOverrideProps } = resolveOverride(components.ProductCard, ProductCard)\n // The block's declared need, resolved once per page and deduped with every\n // block asking the same question. A document instance may rebind a param\n // (e.g. `category: { $param: 'slug' }`) and this hook follows the rebound\n // declaration; used as plain JSX, the fallback resolves the same loader\n // directly. Either way the read goes through the provider port (I11).\n const { status, data, error, loader } = useBlockData<Product[]>(node, 'products', {\n loader: 'products.list',\n params: { filter, category: categoryName, collection, facets: toFacetMap(facets), limit },\n })\n const loading = status !== 'ready'\n const visible = data ?? []\n\n const scroll = (direction: -1 | 1) => {\n viewportRef.current?.scrollBy({ left: direction * Math.max(320, viewportRef.current.clientWidth * 0.75), behavior: 'smooth' })\n }\n\n if (status === 'error') return <BlockDataError loader={loader} message={error} />\n if (!loading && visible.length === 0) return null\n\n return (\n <section data-testid={TID.productSlider} className={`mx-auto max-w-7xl px-4 py-14 sm:px-6 ${className}`}>\n <div className=\"mb-8 flex flex-col gap-5 sm:flex-row sm:items-end sm:justify-between\">\n <div className=\"max-w-2xl\">\n {eyebrow && <p className=\"mb-2 text-xs font-semibold uppercase tracking-[0.2em] text-primary\">{eyebrow}</p>}\n <h2 className=\"sf-heading text-3xl font-normal leading-tight tracking-normal sm:text-5xl\">{title}</h2>\n {subtitle && <p className=\"mt-3 leading-7 text-muted-foreground\">{subtitle}</p>}\n </div>\n <div className=\"flex items-center gap-2\">\n <button\n type=\"button\"\n aria-label=\"Previous products\"\n data-testid={TID.productSliderPrev}\n onClick={() => scroll(-1)}\n className=\"inline-flex h-10 w-10 items-center justify-center border border-border bg-background transition hover:bg-foreground hover:text-background\"\n >\n <ChevronLeft className=\"h-5 w-5\" />\n </button>\n <button\n type=\"button\"\n aria-label=\"Next products\"\n data-testid={TID.productSliderNext}\n onClick={() => scroll(1)}\n className=\"inline-flex h-10 w-10 items-center justify-center border border-border bg-background transition hover:bg-foreground hover:text-background\"\n >\n <ChevronRight className=\"h-5 w-5\" />\n </button>\n </div>\n </div>\n <div\n ref={viewportRef}\n data-testid={TID.productSliderViewport}\n className=\"flex snap-x gap-5 overflow-x-auto pb-5 [scrollbar-width:thin]\"\n >\n {loading\n ? Array.from({ length: Math.min(limit, 6) }, (_, i) => (\n <div key={i} className=\"h-[360px] min-w-[260px] snap-start animate-pulse bg-muted\" />\n ))\n : visible.map((product) => (\n <div key={product.id} className=\"min-w-[260px] max-w-[300px] flex-[0_0_72vw] snap-start sm:flex-[0_0_300px]\">\n <ProductCardComponent\n product={product}\n config={config}\n commerceMode={config.commerceMode}\n actions={actions}\n {...cardOverrideProps}\n />\n </div>\n ))}\n </div>\n {cta && (\n <Link\n to={href ?? config.catalogPath}\n className=\"mt-4 inline-flex border border-foreground/30 px-6 py-3 text-xs font-semibold uppercase tracking-[0.16em] transition hover:bg-foreground hover:text-background\"\n >\n {cta}\n </Link>\n )}\n </section>\n )\n}\n\nexport const productSliderBlockMeta = {\n label: 'Product slider',\n description: 'Side-scrolling carousel of product cards, for a catalog too long to show as a grid.',\n settings: [\n { id: 'title', type: 'text', label: 'Title', required: true },\n { id: 'subtitle', type: 'text', label: 'Subtitle', help: 'One line under the title. Optional.' },\n {\n id: 'eyebrow',\n type: 'text',\n label: 'Eyebrow',\n help: \"Small caps label above the title, e.g. 'novidades'.\",\n },\n {\n id: 'filter',\n type: 'select',\n label: 'Which products',\n help: 'sale = only products with a compare-at price above the current price; new = newest first; all = catalog order. Applied before the category and collection filters.',\n options: [\n { value: 'all', label: 'All products' },\n { value: 'new', label: 'New arrivals' },\n { value: 'sale', label: 'On sale' },\n ],\n default: 'all',\n },\n {\n id: 'categoryName',\n // A real catalog entity backs this, so the author gets a picker — but the\n // component matches `product.categoryName`, so the value must be the\n // category's NAME, not its id.\n type: 'category',\n label: 'Limit to category',\n help: \"Category name, matched exactly against the product's category name (not the category id). Leave empty for the whole catalog.\",\n },\n {\n id: 'collection',\n // Deliberately not the `collection` control: there is no collection\n // entity in the catalog to pick from — this matches the free-form\n // `metadata.collection` tag stored on each product.\n type: 'text',\n label: 'Limit to collection',\n help: \"Matched against each product's `metadata.collection` value. This is a free-form tag set per product, not a catalog entity — leave empty unless the store already uses it.\",\n },\n {\n id: 'facets',\n type: 'list',\n label: 'Metadata refinements',\n help: \"The store's own discovery axis over product.metadata — e.g. purpose = presentear. Every row must match. An array-valued metadata field matches if it contains the value. `collection` above is the named shorthand for one of these.\",\n of: [\n { id: 'key', type: 'text', label: 'Metadata field', help: \"The product.metadata key, e.g. 'purpose'.\", required: true },\n { id: 'value', type: 'text', label: 'Value', help: \"The value to match, e.g. 'presentear'.\", required: true },\n ],\n },\n {\n id: 'limit',\n type: 'number',\n label: 'How many',\n help: 'Cards in the horizontal track. Anything past the viewport is reached by scrolling or the arrows.',\n min: 1,\n max: 24,\n default: 10,\n },\n { id: 'cta', type: 'text', label: 'Link text', help: 'Empty hides the link below the slider.', default: 'View all' },\n {\n id: 'href',\n type: 'url',\n label: 'Link target',\n help: \"Where the link goes. Defaults to the store's catalog page.\",\n },\n ],\n presets: [\n {\n name: 'New arrivals',\n props: {\n eyebrow: 'novidades',\n title: 'Acabou de chegar',\n subtitle: 'As peças mais recentes do nosso catálogo.',\n filter: 'new',\n limit: 10,\n cta: 'Ver tudo',\n },\n },\n {\n name: 'You may also like',\n props: { title: 'Você também pode gostar', filter: 'all', limit: 12, cta: 'Ver tudo' },\n },\n ],\n enabledOn: ['home', 'catalog', 'collection', 'product', 'content'],\n // The declared read (M3). A document instance may override a binding — e.g.\n // a category landing page binds `category` to the route:\n // data: { products: { loader: 'products.list',\n // params: { category: { $param: 'slug' } } } }\n data: {\n products: {\n loader: 'products.list',\n params: {\n filter: { $prop: 'filter' },\n category: { $prop: 'categoryName' },\n collection: { $prop: 'collection' },\n limit: { $prop: 'limit' },\n },\n },\n },\n} satisfies Omit<RegistryMeta, 'propsSchema'>\n","import React from 'react'\nimport type { Product } from '@fayz-ai/shop/types'\nimport { ProductCard } from '../product/ProductCard'\nimport { getStorefrontComponents, useStorefrontConfig } from '../../document/config'\nimport { useStorefrontActions } from '../../hooks/use-storefront-actions'\nimport { TID } from '../../lib/testids'\nimport { resolveOverride } from '../../extend/component-override'\n\nexport function ProductGrid({ products, loading }: { products: Product[]; loading: boolean }) {\n const config = useStorefrontConfig()\n const actions = useStorefrontActions()\n const components = getStorefrontComponents(config)\n const { Component: ProductCardComponent, props: cardOverrideProps } = resolveOverride(components.ProductCard, ProductCard)\n\n if (loading) {\n return (\n <div data-testid={TID.productGrid} className=\"grid grid-cols-2 gap-5 md:grid-cols-3 xl:grid-cols-4\">\n {Array.from({ length: 8 }, (_, i) => (\n <div key={i} className=\"aspect-[3/4] animate-pulse rounded-xl bg-muted\" />\n ))}\n </div>\n )\n }\n if (products.length === 0) {\n return (\n <div data-testid={TID.productGrid} className=\"py-20 text-center text-muted-foreground\">\n Nenhum produto encontrado.\n </div>\n )\n }\n return (\n <div data-testid={TID.productGrid} className=\"grid grid-cols-2 gap-5 md:grid-cols-3 xl:grid-cols-4\">\n {products.map((p) => (\n <ProductCardComponent\n key={p.id}\n product={p}\n config={config}\n commerceMode={config.commerceMode}\n actions={actions}\n {...cardOverrideProps}\n />\n ))}\n </div>\n )\n}\n","import { useLoader } from '../blocks/page-data'\nimport type { Category } from '@fayz-ai/shop/types'\n\n/**\n * Every catalog category, in store order.\n *\n * Reads through the declared `categories.list` loader instead of calling\n * `getShopProvider().listCategories()` from an effect. Same provider, same\n * query, same result — but a read that goes through the port is deduped with\n * any block on the page asking the same question, and it can be resolved ahead\n * of render. That second property is why the change matters: the footer's\n * category column is on every page of every store, and a read that only exists\n * inside an effect is permanently empty in a headless render (M8) and in any\n * future SSR pass (L4). A read that reaches the provider directly can be\n * neither deduped nor pre-resolved.\n */\nexport function useCategories(): { categories: Category[]; loading: boolean } {\n const { status, data } = useLoader<Category[]>('categories.list', {})\n return { categories: data ?? [], loading: status === 'loading' || status === 'idle' }\n}\n","import React from 'react'\nimport { useCatalogStore } from '../../stores/catalog.store'\nimport type { CatalogSort } from '../../stores/catalog.store'\nimport { useCategories } from '../../hooks/use-categories'\nimport { useStorefrontConfig } from '../../document/config'\nimport { TID } from '../../lib/testids'\n\n/**\n * A declarative refinement over `product.metadata`, rendered as its own filter\n * group. `swatch` turns a value into a colour chip instead of a text row, which\n * is what a colour filter has to be — a list reading \"Preto / Cobre / Prata\" is\n * not how anyone shops for colour.\n */\nexport interface CatalogFacetConfig {\n /** The `product.metadata` key this refines. */\n key: string\n label: string\n values: readonly { value: string; label?: string; swatch?: string }[]\n}\n\nexport function FiltersPanel() {\n const { categories } = useCategories()\n const catalog = useCatalogStore()\n const facets = useStorefrontConfig().catalogFacets ?? []\n\n return (\n <aside className=\"w-full shrink-0 space-y-6 lg:w-56\">\n {/* Sort */}\n <div className=\"space-y-2\">\n <h3 className=\"text-sm font-semibold\">Ordenar por</h3>\n <select\n data-testid={TID.sortSelect}\n value={catalog.sort}\n onChange={(e) => catalog.setSort(e.target.value as CatalogSort)}\n className=\"w-full rounded-lg border bg-background px-3 py-2 text-sm\"\n >\n <option value=\"newest\">Mais recentes</option>\n <option value=\"price-asc\">Menor preço</option>\n <option value=\"price-desc\">Maior preço</option>\n <option value=\"name\">Nome (A–Z)</option>\n </select>\n </div>\n\n {/* Categories */}\n <div className=\"space-y-2\">\n <h3 className=\"text-sm font-semibold\">Categorias</h3>\n <ul className=\"space-y-1\">\n <li>\n <button\n type=\"button\"\n onClick={() => catalog.setCategoryId(null)}\n className={`w-full rounded-md px-2 py-1.5 text-left text-sm transition-colors ${\n catalog.categoryId === null ? 'bg-primary/10 font-medium text-primary' : 'hover:bg-muted'\n }`}\n >\n Todas\n </button>\n </li>\n {categories.map((c) => (\n <li key={c.id}>\n <button\n type=\"button\"\n data-testid={TID.filterCategory(c.slug)}\n onClick={() => catalog.setCategoryId(catalog.categoryId === c.id ? null : c.id)}\n className={`w-full rounded-md px-2 py-1.5 text-left text-sm transition-colors ${\n catalog.categoryId === c.id ? 'bg-primary/10 font-medium text-primary' : 'hover:bg-muted'\n }`}\n >\n {c.name}\n </button>\n </li>\n ))}\n </ul>\n </div>\n\n {/* Store-declared metadata facets (colour, purpose, brand, …) */}\n {facets.map((facet) => {\n const active = catalog.facets[facet.key]\n const swatched = facet.values.some((v) => v.swatch)\n return (\n <div key={facet.key} className=\"space-y-2\">\n <h3 className=\"text-sm font-semibold\">{facet.label}</h3>\n <div className={swatched ? 'flex flex-wrap gap-2' : 'space-y-1'}>\n {facet.values.map((v) => {\n const on = active === v.value\n const label = v.label ?? v.value\n const toggle = () => catalog.setFacet(facet.key, on ? null : v.value)\n if (v.swatch) {\n return (\n <button\n key={v.value}\n type=\"button\"\n onClick={toggle}\n title={label}\n aria-pressed={on}\n data-testid={`filter-facet-${facet.key}-${v.value}`}\n // 36px hit area around a 20px chip: a colour swatch is\n // still a touch target.\n className={`grid h-9 w-9 place-items-center rounded-md transition-colors ${\n on ? 'bg-primary/10 ring-1 ring-primary' : 'hover:bg-muted'\n }`}\n >\n <span className=\"sr-only\">{label}</span>\n <span\n aria-hidden\n className=\"h-5 w-5 rounded-full ring-1 ring-inset ring-black/20\"\n style={{ background: v.swatch }}\n />\n </button>\n )\n }\n return (\n <button\n key={v.value}\n type=\"button\"\n onClick={toggle}\n aria-pressed={on}\n data-testid={`filter-facet-${facet.key}-${v.value}`}\n className={`w-full rounded-md px-2 py-1.5 text-left text-sm transition-colors ${\n on ? 'bg-primary/10 font-medium text-primary' : 'hover:bg-muted'\n }`}\n >\n {label}\n </button>\n )\n })}\n </div>\n </div>\n )\n })}\n\n {/* Price range */}\n <div className=\"space-y-2\">\n <h3 className=\"text-sm font-semibold\">Preço</h3>\n <div className=\"flex items-center gap-2\">\n <input\n data-testid={TID.filterPriceMin}\n type=\"number\"\n placeholder=\"Mín\"\n min={0}\n value={catalog.priceMin ?? ''}\n onChange={(e) => catalog.setPriceMin(e.target.value === '' ? null : Number(e.target.value))}\n className=\"w-full rounded-lg border bg-background px-2.5 py-1.5 text-sm\"\n />\n <span className=\"text-muted-foreground\">–</span>\n <input\n data-testid={TID.filterPriceMax}\n type=\"number\"\n placeholder=\"Máx\"\n min={0}\n value={catalog.priceMax ?? ''}\n onChange={(e) => catalog.setPriceMax(e.target.value === '' ? null : Number(e.target.value))}\n className=\"w-full rounded-lg border bg-background px-2.5 py-1.5 text-sm\"\n />\n </div>\n </div>\n\n {/* Availability */}\n <label className=\"flex cursor-pointer items-center gap-2 text-sm\">\n <input\n data-testid={TID.filterInstock}\n type=\"checkbox\"\n checked={catalog.inStockOnly}\n onChange={(e) => catalog.setInStockOnly(e.target.checked)}\n className=\"h-4 w-4 rounded border\"\n />\n Somente em estoque\n </label>\n\n <button\n type=\"button\"\n data-testid={TID.filtersClear}\n onClick={() => catalog.reset()}\n className=\"text-sm text-muted-foreground underline-offset-2 hover:text-foreground hover:underline\"\n >\n Limpar filtros\n </button>\n </aside>\n )\n}\n","import { useEffect } from 'react'\nimport { currentStaticRenderPass } from '../app/static-render'\nimport type { StaticHeadInput } from '../app/static-render'\n\n/**\n * Minimal per-route head manager: sets document.title and meta description so\n * each storefront page (product, catalog, account, checkout) has its own title\n * and shareable description instead of one static SPA title. A real SSR/prerender\n * pass (M12) layers OG/canonical on top; this covers the client-rendered baseline.\n *\n * Under a static render (`renderStore`, spine M8) there is no document and no\n * effect phase, so the same declaration is reported to the render pass instead.\n * That is how headless HTML gets the title THIS route sets, rather than a title\n * the renderer guessed by re-deriving the routing table on the server.\n *\n * Canonical, image, type and JSON-LD are static-render only by design: they\n * matter to a crawler reading the served HTML, and a client-side page that\n * injected them after hydration would be describing a URL that, under hash\n * addressing, is not its own anyway.\n */\nexport function useStorefrontHead(input: StaticHeadInput): void {\n const { title, description } = input\n currentStaticRenderPass()?.head(input)\n\n useEffect(() => {\n if (title) document.title = title\n }, [title])\n\n useEffect(() => {\n if (!description) return\n let tag = document.head.querySelector<HTMLMetaElement>('meta[name=\"description\"]')\n if (!tag) {\n tag = document.createElement('meta')\n tag.setAttribute('name', 'description')\n document.head.appendChild(tag)\n }\n tag.setAttribute('content', description.slice(0, 160))\n }, [description])\n}\n","import React, { useEffect, useMemo, useRef } from 'react'\nimport { X } from 'lucide-react'\nimport type { Product } from '@fayz-ai/shop/types'\nimport { useCatalogStore, type CatalogSort } from '../stores/catalog.store'\nimport { useLoader } from '../blocks/page-data'\nimport { ProductGrid } from '../components/collection/ProductGrid'\nimport { FiltersPanel } from '../components/collection/FiltersPanel'\nimport { useStorefrontConfig } from '../document/config'\nimport { useStorefrontHead } from '../hooks/use-storefront-head'\nimport { matchPath, useRoutePath, useRouterAdapter } from '../app/router'\nimport { Slot } from '../extend/slots'\n\nconst SORTS: CatalogSort[] = ['newest', 'price-asc', 'price-desc', 'name']\n\n/** Query params the catalog owns itself; anything else is a metadata facet. */\nconst RESERVED_PARAMS = new Set(['search', 'q', 'category', 'sort', 'stock', 'min', 'max'])\n\n/**\n * Two-way sync between catalog filters and the URL hash query, so a filtered/\n * searched catalog is shareable, bookmarkable, and survives a refresh. Uses\n * history.replaceState (no navigation / no scroll jump).\n */\nfunction useCatalogUrlSync(searchParam: 'search' | 'q') {\n const hydrated = useRef(false)\n const adapter = useRouterAdapter()\n const catalog = useCatalogStore()\n\n useEffect(() => {\n if (hydrated.current) return\n hydrated.current = true\n const q = adapter.getCurrentPath().split('?')[1]\n if (!q) return\n const p = new URLSearchParams(q)\n const s = useCatalogStore.getState()\n // Accept both spellings on the way in: a shopper can land on `?q=…` from an\n // ad or an old bookmark and on `?search=…` from a shared filter. Only the\n // write side has to pick one.\n if (p.has('q')) s.setSearch(p.get('q') ?? '')\n else if (p.has('search')) s.setSearch(p.get('search') ?? '')\n if (p.get('category')) s.setCategoryId(p.get('category'))\n // Every non-reserved param is a metadata facet, so a store can add a\n // discovery axis by linking to it — `?purpose=estudar`, `?brand=schneider`\n // — without the SDK knowing the axis exists.\n for (const [key, value] of p.entries()) {\n if (!RESERVED_PARAMS.has(key) && value) s.setFacet(key, value)\n }\n const sort = p.get('sort')\n if (sort && (SORTS as string[]).includes(sort)) s.setSort(sort as CatalogSort)\n if (p.get('stock') === '1') s.setInStockOnly(true)\n if (p.has('min')) s.setPriceMin(Number(p.get('min')) || null)\n if (p.has('max')) s.setPriceMax(Number(p.get('max')) || null)\n }, [])\n\n useEffect(() => {\n const p = new URLSearchParams()\n if (catalog.search) p.set(searchParam, catalog.search)\n if (catalog.categoryId) p.set('category', catalog.categoryId)\n for (const [key, value] of Object.entries(catalog.facets)) p.set(key, value)\n if (catalog.sort !== 'newest') p.set('sort', catalog.sort)\n if (catalog.inStockOnly) p.set('stock', '1')\n if (catalog.priceMin != null) p.set('min', String(catalog.priceMin))\n if (catalog.priceMax != null) p.set('max', String(catalog.priceMax))\n // Through the adapter, so the same sync works under either addressing\n // scheme; `replace` keeps typing in the search box out of the back button.\n const base = adapter.getCurrentPath().split('?')[0] || '/catalog'\n const qs = p.toString()\n const next = qs ? `${base}?${qs}` : base\n if (next !== adapter.getCurrentPath()) adapter.replace(next)\n }, [\n catalog.search,\n catalog.categoryId,\n catalog.facets,\n catalog.sort,\n catalog.inStockOnly,\n catalog.priceMin,\n catalog.priceMax,\n searchParam,\n ])\n}\n\nexport function CatalogPage() {\n const config = useStorefrontConfig()\n const catalog = useCatalogStore()\n // On the results page the search term stays spelled `q`, because that is the\n // URL the store's ads and inbound links already carry — rewriting it to\n // `?search=` on the first render would break every one of them.\n const path = useRoutePath()\n const onResultsPage = Boolean(matchPath(config.search.resultsPath, path))\n useCatalogUrlSync(onResultsPage ? 'q' : 'search')\n useStorefrontHead({\n title: catalog.search ? `“${catalog.search}” — ${config.name}` : `${config.name} — Loja`,\n })\n\n // The catalog read goes through the `products.list` loader. With the default\n // state (sort 'newest', no filters) the params match catalogBody's declared\n // need, so the page-level resolver has already answered it; every filter\n // interaction after that is a fresh read through the same loader.\n // Facets go to the loader, not a post-filter: a rail asking for the same\n // refinement has to get the same answer, and the read is then deduped and\n // pre-resolvable like every other declared read.\n const { status, data, error, reload } = useLoader<Product[]>('products.list', {\n sort: catalog.sort,\n category: catalog.categoryId ?? undefined,\n search: catalog.search || undefined,\n facets: Object.keys(catalog.facets).length > 0 ? catalog.facets : undefined,\n })\n const products = data ?? []\n const loading = status !== 'ready' && status !== 'error'\n\n // Price range + availability stay client-side refinements over the fetched\n // set: they narrow what is already loaded and would only fragment the cache\n // key for no change in the fetched rows.\n const filtered = useMemo(\n () =>\n products.filter((p) => {\n if (catalog.priceMin != null && p.price < catalog.priceMin) return false\n if (catalog.priceMax != null && p.price > catalog.priceMax) return false\n if (catalog.inStockOnly && p.inventoryCount <= 0) return false\n return true\n }),\n [products, catalog.priceMin, catalog.priceMax, catalog.inStockOnly],\n )\n\n const slotContext = { products: filtered, loading }\n\n return (\n <div className=\"mx-auto max-w-7xl px-4 py-8 sm:px-6\">\n <Slot area=\"catalog\" name=\"beforeHeading\" context={slotContext} />\n <div className=\"mb-8\">\n <h1 className=\"text-2xl font-bold tracking-tight\">{config.name}</h1>\n <p className=\"mt-1 text-muted-foreground\">\n {catalog.search\n ? `Resultados para “${catalog.search}”`\n : 'Produtos selecionados com qualidade e entrega rápida.'}\n </p>\n {/* Facet filters arrive from a landing page CTA or a home tile, not\n * from the filters panel, so each needs its own way out — otherwise\n * the shopper is stuck inside the refinement with no visible cause. */}\n {Object.keys(catalog.facets).length > 0 && (\n <div className=\"mt-3 flex flex-wrap gap-2\">\n {Object.entries(catalog.facets).map(([key, value]) => (\n <button\n key={key}\n type=\"button\"\n data-testid={`catalog-facet-clear-${key}`}\n onClick={() => catalog.setFacet(key, null)}\n className=\"inline-flex items-center gap-2 rounded-full border px-3 py-1.5 text-sm font-medium capitalize transition hover:bg-muted\"\n >\n {value}\n <X className=\"h-3.5 w-3.5\" aria-hidden />\n <span className=\"sr-only\">Remover filtro {key}</span>\n </button>\n ))}\n </div>\n )}\n </div>\n <Slot area=\"catalog\" name=\"beforeGrid\" context={slotContext} />\n <div className=\"flex flex-col gap-8 lg:flex-row\">\n <div>\n <FiltersPanel />\n <Slot area=\"catalog\" name=\"afterFilters\" context={slotContext} />\n </div>\n <div className=\"flex-1\">\n {error ? (\n <div className=\"rounded-2xl border bg-card py-16 text-center\">\n <p className=\"text-muted-foreground\">Não foi possível carregar os produtos.</p>\n <button\n type=\"button\"\n onClick={reload}\n className=\"mt-4 rounded-lg border px-4 py-2 text-sm font-semibold transition hover:bg-muted\"\n >\n Tentar novamente\n </button>\n </div>\n ) : (\n <ProductGrid products={filtered} loading={loading} />\n )}\n </div>\n </div>\n <Slot area=\"catalog\" name=\"afterGrid\" context={slotContext} />\n </div>\n )\n}\n","import type { Product } from '@fayz-ai/shop/types'\nimport { useLoader } from '../blocks/page-data'\n\n/**\n * One active product by slug — the `products.bySlug` loader, by hook.\n *\n * On a composed product page the page-level resolver already answered this\n * (productBody declares `{ slug: { $param: 'slug' } }`), so the hook consumes\n * the resolved entry and no second request happens. Anywhere else it resolves\n * the loader itself, through the same provider port (I11).\n */\nexport function useProduct(slug: string): {\n product: Product | null\n loading: boolean\n error: string | null\n} {\n const { status, data, error } = useLoader<Product | null>('products.bySlug', { slug })\n return {\n product: data ?? null,\n loading: status === 'loading' || status === 'idle',\n error,\n }\n}\n","import { breadcrumbJsonLd, seoOrigin } from '@fayz-ai/core'\nimport { currentStaticRenderPass } from '../app/static-render'\nimport type { Product } from '@fayz-ai/shop/types'\nimport type { ResolvedStorefrontConfig } from '../document/config'\nimport type { StaticHeadInput } from '../app/static-render'\n\n// ---------------------------------------------------------------------------\n// What a storefront route should tell a crawler about itself.\n//\n// Pure builders returning a head declaration, so the page that knows what it is\n// rendering also declares its own SEO — rather than a renderer re-deriving the\n// routing table on the server to guess. Same reason `useStorefrontHead` reports\n// the title instead of letting `renderStore` infer it.\n//\n// Absolute URLs need an origin the store does not know at build time. Callers\n// pass one explicitly (a server render knows the request host); in a browser it\n// falls back to the live origin. Without either, canonical and OG URLs are\n// omitted rather than emitted relative, because a relative canonical is ignored\n// by search engines and a relative og:image renders as a broken share.\n// ---------------------------------------------------------------------------\n\nexport interface StorefrontSeoContext {\n config: ResolvedStorefrontConfig\n /** In-app path, e.g. '/product/pork-ribs'. */\n path: string\n /** Absolute origin, e.g. 'https://loja.example.com'. */\n origin?: string\n}\n\nfunction absolute(ctx: StorefrontSeoContext, path = ctx.path): string | undefined {\n // Explicit wins, then the origin the static render was told about, then the\n // live browser origin. A page never has to know which of the three it is in.\n const origin = (ctx.origin ?? currentStaticRenderPass()?.origin ?? seoOrigin()).replace(/\\/$/, '')\n if (!origin) return undefined\n return `${origin}${path.startsWith('/') ? path : `/${path}`}`\n}\n\n/** Primary image, falling back to the first — how product cards pick one. */\nexport function primaryImageUrl(product: Product): string | undefined {\n return (product.images?.find((i) => i.isPrimary) ?? product.images?.[0])?.url\n}\n\n/**\n * schema.org Product. Availability is derived from inventory rather than\n * declared, because a rich result advertising an in-stock product that is not\n * is worse than no rich result.\n */\nexport function productJsonLd(\n product: Product,\n ctx: StorefrontSeoContext,\n): Record<string, unknown> {\n const url = absolute(ctx)\n const image = primaryImageUrl(product)\n return {\n '@context': 'https://schema.org',\n '@type': 'Product',\n name: product.name,\n ...(product.description ? { description: product.description } : {}),\n ...(product.sku ? { sku: product.sku } : {}),\n ...(image ? { image: [image] } : {}),\n offers: {\n '@type': 'Offer',\n ...(url ? { url } : {}),\n price: product.price,\n priceCurrency: product.currency ?? ctx.config.currency,\n availability:\n (product.inventoryCount ?? 0) > 0\n ? 'https://schema.org/InStock'\n : 'https://schema.org/OutOfStock',\n },\n }\n}\n\n/** The head declaration for a product page. */\nexport function productSeo(product: Product, ctx: StorefrontSeoContext): StaticHeadInput {\n const url = absolute(ctx)\n const home = absolute(ctx, '/')\n const catalog = absolute(ctx, ctx.config.catalogPath)\n return {\n title: `${product.name} — ${ctx.config.name}`,\n description: product.description?.slice(0, 160),\n canonical: url,\n image: primaryImageUrl(product),\n type: 'product',\n jsonLd: [\n productJsonLd(product, ctx),\n ...(home && catalog && url\n ? [\n breadcrumbJsonLd([\n { name: ctx.config.name, url: home },\n { name: 'Loja', url: catalog },\n { name: product.name, url },\n ]),\n ]\n : []),\n ],\n }\n}\n\n/** The head declaration for any non-product route: canonical only. */\nexport function pageSeo(\n ctx: StorefrontSeoContext,\n input: { title: string; description?: string | null },\n): StaticHeadInput {\n return { ...input, canonical: absolute(ctx), type: 'website' }\n}\n","import React from 'react'\nimport { Minus, Plus } from 'lucide-react'\n\nexport interface QuantityInputProps {\n value: number\n onChange(next: number): void\n min?: number\n max?: number\n testId?: string\n incTestId?: string\n decTestId?: string\n}\n\nexport function QuantityInput({ value, onChange, min = 1, max, testId, incTestId, decTestId }: QuantityInputProps) {\n const clamp = (n: number) => Math.max(min, max != null ? Math.min(n, max) : n)\n // 44px de alvo no celular. Medido: -/+ tinham 34x26 e o botao de APAGAR ao\n // lado tinha 28x28 — diminuir a quantidade e apagar a linha ficavam a um erro\n // de dedo um do outro, e um deles nao tem volta.\n return (\n <div className=\"inline-flex items-center rounded-lg border\">\n <button\n type=\"button\"\n data-testid={decTestId}\n aria-label=\"Diminuir quantidade\"\n onClick={() => onChange(clamp(value - 1))}\n className=\"min-h-11 min-w-11 px-2.5 py-1.5 text-muted-foreground hover:text-foreground disabled:opacity-40 sm:min-h-0 sm:min-w-0 grid place-items-center\"\n disabled={value <= min}\n >\n <Minus className=\"h-3.5 w-3.5\" />\n </button>\n <input\n data-testid={testId}\n type=\"number\"\n value={value}\n min={min}\n max={max}\n onChange={(e) => {\n const n = parseInt(e.target.value, 10)\n if (!isNaN(n)) onChange(clamp(n))\n }}\n className=\"h-11 w-12 border-x bg-transparent py-1.5 text-center text-sm [appearance:textfield] [&::-webkit-inner-spin-button]:appearance-none [&::-webkit-outer-spin-button]:appearance-none sm:h-auto\"\n />\n <button\n type=\"button\"\n data-testid={incTestId}\n aria-label=\"Aumentar quantidade\"\n onClick={() => onChange(clamp(value + 1))}\n className=\"min-h-11 min-w-11 px-2.5 py-1.5 text-muted-foreground hover:text-foreground disabled:opacity-40 sm:min-h-0 sm:min-w-0 grid place-items-center\"\n disabled={max != null && value >= max}\n >\n <Plus className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n )\n}\n","import React from 'react'\nimport type { ProductOptionGroup, ProductOptionSelection } from '../../data/product-options'\nimport { TID } from '../../lib/testids'\n\nexport interface ProductOptionSelectorProps {\n groups: ProductOptionGroup[]\n value: ProductOptionSelection\n onChange: (value: ProductOptionSelection) => void\n}\n\nexport function ProductOptionSelector({ groups, value, onChange }: ProductOptionSelectorProps) {\n if (groups.length === 0) return null\n\n return (\n <div className=\"mt-6 space-y-4\">\n {groups.map((group) => (\n <div key={group.id} data-testid={TID.productOptionGroup(group.id)}>\n <div className=\"mb-2 flex items-center justify-between gap-3\">\n <p className=\"text-sm font-medium\">{group.label}</p>\n {value[group.label] && (\n <p className=\"truncate text-xs text-muted-foreground\">{value[group.label]}</p>\n )}\n </div>\n <div className=\"flex flex-wrap gap-2\">\n {group.values.map((option) => {\n const selected = value[group.label] === option\n return (\n <button\n key={option}\n type=\"button\"\n data-testid={TID.productOptionValue(group.id, option)}\n aria-pressed={selected}\n onClick={() => onChange({ ...value, [group.label]: option })}\n className={[\n 'min-h-10 rounded-full border px-4 text-sm font-medium transition-colors',\n selected\n ? 'border-primary bg-primary text-primary-foreground'\n : 'border-border bg-background text-foreground hover:border-primary/60',\n ].join(' ')}\n >\n {option}\n </button>\n )\n })}\n </div>\n </div>\n ))}\n </div>\n )\n}\n","import React from 'react'\nimport type { Product } from '@fayz-ai/shop/types'\nimport { useStorefrontConfig } from '../../document/config'\n\n// Metadata keys that drive the option selector (size/color) are excluded here so\n// specs don't duplicate the picker; the rest are internal SDK/seed/overlay keys\n// that aren't customer-facing specs.\nconst EXCLUDED_KEYS = new Set([\n 'options', 'sizes', 'colors',\n 'fayzStoreCategory', 'source', 'storeKey', 'storeName', 'tenantId', 'slug',\n // Discovery facets and payment-rule fields: the SDK gives these meaning\n // elsewhere (filter chips, rails, the price block), so listing them as specs\n // showed the shopper rows like \"Pix Price — 227.92\".\n 'collection', 'purpose', 'pixPrice', 'salePrice', 'compareAtPrice',\n])\n\n// Internal namespaced keys (fayz*, _*) are never shown as specs.\nfunction isInternalKey(key: string, extra?: ReadonlySet<string>): boolean {\n return EXCLUDED_KEYS.has(key) || extra?.has(key) === true || key.startsWith('_') || key.startsWith('fayz')\n}\n\n// Friendly PT-BR labels for common metadata keys; unknown keys are humanized.\nconst LABELS: Record<string, string> = {\n colorway: 'Cor',\n color: 'Cor',\n subcategory: 'Subcategoria',\n fit: 'Caimento',\n material: 'Material',\n vintage: 'Safra',\n region: 'Região',\n grape: 'Uva',\n pairing: 'Harmonização',\n abv: 'Teor alcoólico',\n volume: 'Volume',\n brand: 'Marca',\n origin: 'Origem',\n warranty: 'Garantia',\n dimensions: 'Dimensões',\n}\n\nfunction humanize(key: string, extra?: Readonly<Record<string, string>>): string {\n if (extra?.[key]) return extra[key]!\n if (LABELS[key]) return LABELS[key]\n const spaced = key.replace(/([a-z0-9])([A-Z])/g, '$1 $2').replace(/[_-]+/g, ' ').trim()\n return spaced.charAt(0).toUpperCase() + spaced.slice(1)\n}\n\nfunction scalarToString(value: unknown): string | null {\n if (typeof value === 'string') return value.trim() || null\n if (typeof value === 'number') return String(value)\n if (typeof value === 'boolean') return value ? 'Sim' : 'Não'\n return null\n}\n\n/** Real product specs from standard fields + scalar metadata. Renders nothing\n * when there's nothing to show. No invented data. */\nexport function ProductSpecs({ product }: { product: Product }) {\n const config = useStorefrontConfig()\n // Stores put their own bookkeeping in metadata too. `productSpecs.exclude`\n // hides it and `productSpecs.labels` names what is left, without every store\n // having to fork this component.\n const extraExcluded = React.useMemo(\n () => new Set(config.productSpecs?.exclude ?? []),\n [config.productSpecs?.exclude],\n )\n const extraLabels = config.productSpecs?.labels\n\n const rows: Array<[string, string]> = []\n if (product.sku) rows.push(['SKU', product.sku])\n if (product.categoryName) rows.push(['Categoria', product.categoryName])\n if (product.weight != null) rows.push(['Peso', `${product.weight} ${product.weightUnit}`])\n for (const [key, value] of Object.entries(product.metadata ?? {})) {\n if (isInternalKey(key, extraExcluded)) continue\n const str = scalarToString(value)\n if (str) rows.push([humanize(key, extraLabels), str])\n }\n if (rows.length === 0) return null\n\n return (\n <section className=\"mt-14\">\n <h2 className=\"sf-heading text-xl font-semibold tracking-tight\">Especificações</h2>\n <dl className=\"mt-5 grid gap-x-12 sm:grid-cols-2\">\n {rows.map(([label, value]) => (\n <div key={label} className=\"flex items-center justify-between gap-4 border-b py-3 text-sm\">\n <dt className=\"text-muted-foreground\">{label}</dt>\n <dd className=\"text-right font-medium\">{value}</dd>\n </div>\n ))}\n </dl>\n </section>\n )\n}\n","import React from 'react'\nimport { Star } from 'lucide-react'\nimport type { Product } from '@fayz-ai/shop/types'\nimport { useStorefrontConfig } from '../../document/config'\n\n/**\n * Product reviews.\n *\n * There is no reviews table in the shop schema yet, so this renders whatever\n * the store supplies through `config.reviews` and nothing else. It deliberately\n * does NOT invent ratings: a storefront that shows \"4.8 ★ (127 avaliações)\"\n * with no reviews behind it is lying to the shopper, and a replatform inherits\n * the merchant's reputation, it doesn't manufacture one.\n *\n * With no reviews for a product the block renders an honest empty state, which\n * is also the seam a real reviews backend plugs into later.\n */\n\nexport interface ProductReview {\n id: string\n /** Product slug or SKU this review is about. */\n product: string\n rating: number\n author: string\n /** ISO date. */\n date?: string\n title?: string\n body: string\n /** Verified purchase — shown as a badge when true. */\n verified?: boolean\n}\n\nexport interface StorefrontReviewsConfig {\n /** Every review the store has, across products. */\n items?: readonly ProductReview[]\n /** Hide the section entirely (default true when `items` is set). */\n enabled?: boolean\n /** Copy for the empty state. */\n emptyText?: string\n}\n\nfunction reviewsFor(product: Product, all: readonly ProductReview[]): ProductReview[] {\n return all.filter((r) => r.product === product.slug || r.product === product.sku)\n}\n\nfunction average(list: readonly ProductReview[]): number {\n if (list.length === 0) return 0\n return list.reduce((sum, r) => sum + r.rating, 0) / list.length\n}\n\nfunction Stars({ value, label }: { value: number; label?: string }) {\n return (\n <span className=\"inline-flex items-center gap-0.5\" role=\"img\" aria-label={label ?? `${value.toFixed(1)} de 5`}>\n {[1, 2, 3, 4, 5].map((n) => (\n <Star\n key={n}\n aria-hidden\n className=\"h-4 w-4\"\n // Half stars would need a clip path; rounding to the nearest whole\n // star is honest enough at this size and keeps the markup plain.\n fill={n <= Math.round(value) ? 'currentColor' : 'none'}\n strokeWidth={1.6}\n />\n ))}\n </span>\n )\n}\n\nexport function ProductReviews({ product }: { product: Product }) {\n const config = useStorefrontConfig()\n const reviews = config.reviews\n if (!reviews || reviews.enabled === false) return null\n\n const list = reviewsFor(product, reviews.items ?? [])\n const avg = average(list)\n // 5 → 1, so the bar chart reads top-down like every store's does.\n const buckets = [5, 4, 3, 2, 1].map((star) => ({\n star,\n count: list.filter((r) => Math.round(r.rating) === star).length,\n }))\n\n return (\n <section className=\"mt-14 border-t pt-10\" data-testid=\"product-reviews\">\n <h2 className=\"sf-heading text-xl font-semibold tracking-tight\">Avaliações</h2>\n\n {list.length === 0 ? (\n <p className=\"mt-4 text-sm text-muted-foreground\">\n {reviews.emptyText ?? 'Este produto ainda não recebeu avaliações. Compre e seja o primeiro a avaliar.'}\n </p>\n ) : (\n <>\n <div className=\"mt-5 flex flex-col gap-6 sm:flex-row sm:items-center sm:gap-10\">\n <div className=\"shrink-0\">\n <p className=\"text-4xl font-bold leading-none\" data-testid=\"reviews-average\">\n {avg.toFixed(1)}\n </p>\n <div className=\"mt-2 text-primary\">\n <Stars value={avg} />\n </div>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n {list.length} {list.length === 1 ? 'avaliação' : 'avaliações'}\n </p>\n </div>\n\n <dl className=\"min-w-0 flex-1 space-y-1\">\n {buckets.map(({ star, count }) => (\n <div key={star} className=\"flex items-center gap-3 text-xs\">\n <dt className=\"w-8 shrink-0 text-muted-foreground\">{star}★</dt>\n <dd className=\"h-2 flex-1 overflow-hidden rounded-full bg-muted\">\n <div\n className=\"h-full rounded-full bg-primary\"\n style={{ width: `${list.length ? (count / list.length) * 100 : 0}%` }}\n />\n </dd>\n <span className=\"w-6 shrink-0 text-right text-muted-foreground\">{count}</span>\n </div>\n ))}\n </dl>\n </div>\n\n <ul className=\"mt-8 space-y-6\">\n {list.map((r) => (\n <li key={r.id} className=\"border-b pb-6 last:border-b-0\">\n <div className=\"flex flex-wrap items-center gap-x-3 gap-y-1\">\n <span className=\"text-primary\">\n <Stars value={r.rating} />\n </span>\n <span className=\"text-sm font-semibold\">{r.author}</span>\n {r.verified && (\n <span className=\"rounded-full bg-emerald-50 px-2 py-0.5 text-[11px] font-semibold text-emerald-700\">\n Compra verificada\n </span>\n )}\n {r.date && (\n <time dateTime={r.date} className=\"text-xs text-muted-foreground\">\n {new Date(r.date).toLocaleDateString(config.locale)}\n </time>\n )}\n </div>\n {r.title && <p className=\"mt-2 text-sm font-semibold\">{r.title}</p>}\n <p className=\"mt-1 text-sm leading-relaxed text-muted-foreground\">{r.body}</p>\n </li>\n ))}\n </ul>\n </>\n )}\n </section>\n )\n}\n","import { useEffect, useState } from 'react'\nimport { getShopProvider } from '@fayz-ai/shop/runtime'\nimport type { Product, ListProductsOptions } from '@fayz-ai/shop/types'\n\nexport function useProducts(opts: ListProductsOptions): {\n products: Product[]\n loading: boolean\n error: string | null\n reload: () => void\n} {\n const [products, setProducts] = useState<Product[]>([])\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n const [nonce, setNonce] = useState(0)\n const key = JSON.stringify(opts)\n\n useEffect(() => {\n let cancelled = false\n setLoading(true)\n getShopProvider()\n .listProducts(JSON.parse(key) as ListProductsOptions)\n .then((data) => {\n if (cancelled) return\n setProducts(data)\n setError(null)\n })\n .catch((e: unknown) => {\n if (!cancelled) setError(e instanceof Error ? e.message : String(e))\n })\n .finally(() => {\n if (!cancelled) setLoading(false)\n })\n return () => {\n cancelled = true\n }\n }, [key, nonce])\n\n return { products, loading, error, reload: () => setNonce((n) => n + 1) }\n}\n","import React, { useState } from 'react'\nimport { Mail, MessageCircle, Send } from 'lucide-react'\nimport { getShopProvider } from '@fayz-ai/shop/runtime'\nimport type { Product } from '@fayz-ai/shop/types'\nimport { useStorefrontConfig } from '../../document/config'\nimport { storefrontComponentContracts } from '../../extend/component-selectors'\nimport { TID } from '../../lib/testids'\n\nexport interface ProductEnquiryFormProps {\n product: Product\n onSuccess?: () => void\n}\n\nfunction defaultSubject(prefix: string, product: Product): string {\n return `${prefix}: ${product.name}`\n}\n\nfunction buildWhatsAppHref(url: string, product: Product): string {\n const text = encodeURIComponent(`Hello, I would like more information about ${product.name}.`)\n const sep = url.includes('?') ? '&' : '?'\n return `${url}${sep}text=${text}`\n}\n\nexport function ProductEnquiryForm({ product, onSuccess }: ProductEnquiryFormProps) {\n const config = useStorefrontConfig()\n const [customerName, setCustomerName] = useState('')\n const [customerEmail, setCustomerEmail] = useState('')\n const [customerPhone, setCustomerPhone] = useState('')\n const [subject, setSubject] = useState(defaultSubject(config.enquiry.subjectPrefix, product))\n const [message, setMessage] = useState(`I would like more information about ${product.name}.`)\n const [status, setStatus] = useState<'idle' | 'submitting' | 'success' | 'error'>('idle')\n const [error, setError] = useState<string | null>(null)\n\n const submit = async (event: React.FormEvent) => {\n event.preventDefault()\n setStatus('submitting')\n setError(null)\n try {\n const provider = getShopProvider()\n if (provider.createProductEnquiry) {\n await provider.createProductEnquiry({\n productId: product.id,\n productName: product.name,\n productSlug: product.slug,\n customerName,\n customerEmail,\n customerPhone: customerPhone || undefined,\n subject,\n message,\n sourceUrl: typeof window === 'undefined' ? undefined : window.location.href,\n metadata: { sku: product.sku, categoryName: product.categoryName },\n })\n } else if (config.enquiry.email) {\n window.location.href = `mailto:${config.enquiry.email}?subject=${encodeURIComponent(subject)}&body=${encodeURIComponent(message)}`\n }\n setStatus('success')\n onSuccess?.()\n } catch (e) {\n setStatus('error')\n setError(e instanceof Error ? e.message : String(e))\n }\n }\n\n return (\n <form\n {...storefrontComponentContracts.productDetail.enquiryForm}\n onSubmit={submit}\n className=\"space-y-4\"\n >\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <label className=\"space-y-1.5 text-sm font-medium\">\n <span>Your name</span>\n <input\n data-testid={TID.enquiryName}\n required\n value={customerName}\n onChange={(e) => setCustomerName(e.target.value)}\n className=\"w-full border bg-background px-3 py-2 outline-none focus:border-primary\"\n style={{ borderRadius: 'var(--sf-radius-input)' }}\n />\n </label>\n <label className=\"space-y-1.5 text-sm font-medium\">\n <span>Your email</span>\n <input\n data-testid={TID.enquiryEmail}\n required\n type=\"email\"\n value={customerEmail}\n onChange={(e) => setCustomerEmail(e.target.value)}\n className=\"w-full border bg-background px-3 py-2 outline-none focus:border-primary\"\n style={{ borderRadius: 'var(--sf-radius-input)' }}\n />\n </label>\n </div>\n <label className=\"block space-y-1.5 text-sm font-medium\">\n <span>Phone{config.enquiry.requirePhone ? '' : ' (optional)'}</span>\n <input\n data-testid={TID.enquiryPhone}\n required={config.enquiry.requirePhone}\n value={customerPhone}\n onChange={(e) => setCustomerPhone(e.target.value)}\n className=\"w-full border bg-background px-3 py-2 outline-none focus:border-primary\"\n style={{ borderRadius: 'var(--sf-radius-input)' }}\n />\n </label>\n <label className=\"block space-y-1.5 text-sm font-medium\">\n <span>Subject</span>\n <input\n data-testid={TID.enquirySubject}\n required\n value={subject}\n onChange={(e) => setSubject(e.target.value)}\n className=\"w-full border bg-background px-3 py-2 outline-none focus:border-primary\"\n style={{ borderRadius: 'var(--sf-radius-input)' }}\n />\n </label>\n <label className=\"block space-y-1.5 text-sm font-medium\">\n <span>Message</span>\n <textarea\n data-testid={TID.enquiryMessage}\n required\n rows={5}\n value={message}\n onChange={(e) => setMessage(e.target.value)}\n className=\"w-full resize-none border bg-background px-3 py-2 outline-none focus:border-primary\"\n style={{ borderRadius: 'var(--sf-radius-input)' }}\n />\n </label>\n <div className=\"flex flex-wrap items-center gap-3\">\n <button\n data-testid={TID.enquirySubmit}\n type=\"submit\"\n disabled={status === 'submitting'}\n className=\"sf-cta inline-flex items-center gap-2 bg-primary px-5 py-3 font-semibold text-primary-foreground disabled:cursor-wait disabled:opacity-60\"\n style={{ borderRadius: 'var(--sf-radius-button)' }}\n >\n <Send className=\"h-4 w-4\" />\n {status === 'submitting' ? 'Sending...' : 'Send enquiry'}\n </button>\n {config.enquiry.whatsappUrl && (\n <a\n href={buildWhatsAppHref(config.enquiry.whatsappUrl, product)}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"inline-flex items-center gap-2 border px-5 py-3 text-sm font-semibold transition-colors hover:bg-muted\"\n style={{ borderRadius: 'var(--sf-radius-button)' }}\n >\n <MessageCircle className=\"h-4 w-4\" />\n WhatsApp\n </a>\n )}\n {config.enquiry.email && (\n <a\n href={`mailto:${config.enquiry.email}?subject=${encodeURIComponent(subject)}&body=${encodeURIComponent(message)}`}\n className=\"inline-flex items-center gap-2 border px-5 py-3 text-sm font-semibold transition-colors hover:bg-muted\"\n style={{ borderRadius: 'var(--sf-radius-button)' }}\n >\n <Mail className=\"h-4 w-4\" />\n Email\n </a>\n )}\n </div>\n {status === 'success' && (\n <p data-testid={TID.enquirySuccess} className=\"text-sm font-medium text-emerald-600\">\n {config.enquiry.successMessage}\n </p>\n )}\n {error && (\n <p data-testid={TID.enquiryError} className=\"text-sm font-medium text-red-600\">\n {error}\n </p>\n )}\n </form>\n )\n}\n","import React, { useEffect, useRef, useState } from 'react'\nimport type { ProductImage } from '@fayz-ai/shop/types'\nimport type { ProductGalleryProps } from '../../extend/component-contracts'\nimport { SmoothImage } from '../SmoothImage'\nimport { productPlaceholder } from '../../blocks/sections'\nimport { TID } from '../../lib/testids'\nimport { storefrontComponentContracts } from '../../extend/component-selectors'\n\n/**\n * Product gallery: one framed image, hover-to-zoom, and a thumbnail strip when\n * the product has more than one photo.\n *\n * It replaces a bare <img> that rendered only the primary image. Three things\n * were wrong with that:\n *\n * · the frame was a grid child with the default `stretch`, so it grew to the\n * height of the (much taller) details column and left a slab of empty dark\n * box under a square photo;\n * · `plg_shop_product_images` has always been a collection with sort_order and\n * is_primary, and every extra photo a merchant uploaded was invisible;\n * · zooming is table stakes for anything sold by its looks — food especially.\n *\n * Zoom is pointer-driven: the transform origin follows the cursor, so the part\n * under the pointer is the part magnified. Disabled on coarse pointers, where\n * there is no hover and a stuck 2× would just be a broken image.\n */\nexport function ProductGallery({ product, images, primaryImage, order = 'primary' }: ProductGalleryProps) {\n const ordered = orderGalleryImages(images, primaryImage, order)\n const [index, setIndex] = useState(0)\n const [zoom, setZoom] = useState<{ x: number; y: number } | null>(null)\n const frameRef = useRef<HTMLDivElement>(null)\n const canHover = useCanHover()\n\n // A different product (client-side navigation) must not keep the previous\n // product's selected slide.\n useEffect(() => { setIndex(0); setZoom(null) }, [product.id])\n\n const current = ordered[Math.min(index, ordered.length - 1)]\n\n function trackPointer(event: React.MouseEvent<HTMLDivElement>) {\n if (!canHover) return\n const frame = frameRef.current\n if (!frame) return\n const rect = frame.getBoundingClientRect()\n setZoom({\n x: ((event.clientX - rect.left) / rect.width) * 100,\n y: ((event.clientY - rect.top) / rect.height) * 100,\n })\n }\n\n function step(delta: number) {\n if (ordered.length < 2) return\n setIndex((current) => (current + delta + ordered.length) % ordered.length)\n setZoom(null)\n }\n\n return (\n <div className=\"flex flex-col gap-3 self-start\">\n <div\n {...storefrontComponentContracts.productDetail.gallery}\n ref={frameRef}\n // `self-start` above and a fixed aspect here: the frame is sized by the\n // image, never by whatever the column beside it happens to contain.\n className=\"group relative aspect-square w-full overflow-hidden border bg-muted\"\n style={{ borderRadius: 'var(--sf-radius-card)' }}\n onMouseMove={trackPointer}\n onMouseLeave={() => setZoom(null)}\n onKeyDown={(event) => {\n if (event.key === 'ArrowRight') step(1)\n if (event.key === 'ArrowLeft') step(-1)\n }}\n tabIndex={ordered.length > 1 ? 0 : -1}\n role={ordered.length > 1 ? 'group' : undefined}\n aria-label={ordered.length > 1 ? `Imagens de ${product.name}` : undefined}\n >\n {/*\n The transform lives on a wrapper, not on the image: SmoothImage writes\n its own inline `transition` for the load fade (SmoothImage.tsx:52,\n spread AFTER any style passed in), which would have stretched the zoom\n to 420ms and left it visibly lagging the cursor.\n */}\n {/* A product with no images at all renders the generated mark rather\n than an empty frame — same fallback the card uses, so the PDP and\n the grid agree about what a photoless product looks like. */}\n <div\n className=\"h-full w-full transition-transform duration-150 ease-out\"\n style={zoom\n ? { transform: 'scale(2)', transformOrigin: `${zoom.x}% ${zoom.y}%` }\n : { transform: 'scale(1)' }}\n >\n <SmoothImage\n key={current?.id ?? 'placeholder'}\n src={current?.url ?? productPlaceholder(product.name)}\n alt={current?.altText ?? product.name}\n data-testid={TID.pdpGalleryImage}\n className=\"h-full w-full object-cover\"\n />\n </div>\n\n {ordered.length > 1 && (\n <>\n <GalleryArrow side=\"left\" onClick={() => step(-1)} canHover={canHover} />\n <GalleryArrow side=\"right\" onClick={() => step(1)} canHover={canHover} />\n <span className=\"pointer-events-none absolute bottom-3 right-3 rounded-full bg-black/60 px-2 py-0.5 text-[11px] font-medium text-white\">\n {index + 1}/{ordered.length}\n </span>\n </>\n )}\n </div>\n\n {ordered.length > 1 && (\n <ul data-testid={TID.pdpGalleryThumbs} className=\"flex gap-2 overflow-x-auto pb-1\">\n {ordered.map((image, position) => (\n <li key={image.id}>\n <button\n type=\"button\"\n data-testid={TID.pdpGalleryThumb}\n data-index={position}\n aria-label={`Imagem ${position + 1} de ${ordered.length}`}\n aria-current={position === index}\n onClick={() => { setIndex(position); setZoom(null) }}\n className={`h-16 w-16 shrink-0 overflow-hidden rounded-lg border transition ${\n position === index ? 'border-primary ring-2 ring-primary/20' : 'border-border opacity-70 hover:opacity-100'\n }`}\n >\n <img src={image.url} alt=\"\" className=\"h-full w-full object-cover\" loading=\"lazy\" />\n </button>\n </li>\n ))}\n </ul>\n )}\n </div>\n )\n}\n\n/**\n * Gallery ordering, per the declared rule (see ProductGalleryOrder).\n *\n * Exported and pure: this one function is what a store used to fork the whole\n * gallery for — artorious cloned all 158 lines to flip it to sort_order\n * descending. Nothing is ever dropped; only who leads changes.\n *\n * \"Nothing is ever dropped\" was not true: `primary` was consulted only when\n * `images` was EMPTY, so a caller that computed a primary outside the list —\n * the shot for a chosen variant, a hero image resolved elsewhere — handed it\n * over and watched it vanish. It is now prepended when it isn't already there.\n */\nexport function orderGalleryImages(\n images: ProductImage[],\n primary?: ProductImage,\n order: NonNullable<ProductGalleryProps['order']> = 'primary',\n): ProductImage[] {\n const missingPrimary =\n primary != null && !images.some((i) => i.id === primary.id || i.url === primary.url)\n const all = missingPrimary ? [primary!, ...images] : images.length > 0 ? images : primary ? [primary] : []\n return [...all].sort((a, b) => {\n if (order === 'newest') return (b.sortOrder ?? 0) - (a.sortOrder ?? 0)\n if (order === 'primary' && a.isPrimary !== b.isPrimary) return a.isPrimary ? -1 : 1\n return (a.sortOrder ?? 0) - (b.sortOrder ?? 0)\n })\n}\n\n/**\n * Whether the device actually has a hover-capable pointer. On a phone every\n * element is permanently \"hovered\" by some emulations, which would leave the\n * photo stuck at 2× with no way back.\n */\nfunction useCanHover(): boolean {\n const [canHover, setCanHover] = useState(false)\n useEffect(() => {\n const query = window.matchMedia?.('(hover: hover) and (pointer: fine)')\n if (!query) return\n setCanHover(query.matches)\n const onChange = (event: MediaQueryListEvent) => setCanHover(event.matches)\n query.addEventListener?.('change', onChange)\n return () => query.removeEventListener?.('change', onChange)\n }, [])\n return canHover\n}\n\n/**\n * Reveal-on-hover is a HOVER affordance, so it may only hide the control where\n * hover exists. `opacity-0 group-hover:opacity-100` with no coarse-pointer\n * branch left both arrows permanently invisible on every phone — a\n * multi-photo gallery with no discoverable way to reach photo 2 (the thumbnail\n * strip is the only other route, and it is below the fold on a phone).\n *\n * artorious hit this, fixed it in its own gallery clone, and lost the fix when\n * the component was promoted into the SDK — it then had to re-patch it with\n * local CSS (`@media (hover: none) { [data-testid=\"pdp-gallery\"] > button }`).\n * That CSS is deleted; the rule lives here now.\n *\n * `canHover` is FALSE until the effect in useCanHover proves otherwise, so\n * server markup and the first client paint always ship visible arrows and the\n * fade-out only happens where hovering can bring them back.\n */\nfunction GalleryArrow({ side, onClick, canHover }: { side: 'left' | 'right'; onClick: () => void; canHover: boolean }) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n aria-label={side === 'left' ? 'Imagem anterior' : 'Próxima imagem'}\n className={`absolute top-1/2 z-10 flex h-9 w-9 -translate-y-1/2 items-center justify-center rounded-full bg-background/80 shadow-md backdrop-blur transition hover:bg-background ${\n canHover ? 'opacity-0 focus:opacity-100 group-hover:opacity-100' : 'opacity-100'\n } ${side === 'left' ? 'left-3' : 'right-3'}`}\n >\n <span aria-hidden className=\"text-lg leading-none\">{side === 'left' ? '‹' : '›'}</span>\n </button>\n )\n}\n","import React from 'react'\nimport type { ListProductsOptions, Product } from '@fayz-ai/shop/types'\nimport { useProducts } from '../../hooks/use-products'\nimport { getStorefrontComponents, useStorefrontConfig } from '../../document/config'\nimport { useStorefrontActions } from '../../hooks/use-storefront-actions'\nimport { ProductCard } from './ProductCard'\nimport { resolveOverride } from '../../extend/component-override'\n\n/** \"Você também pode gostar\" — products from the same category, excluding the\n * current one. Renders through the store's configured card component for visual\n * consistency with the catalog. Hidden when there's nothing relevant. */\nexport function RelatedProducts({ product }: { product: Product }) {\n const config = useStorefrontConfig()\n const actions = useStorefrontActions()\n const components = getStorefrontComponents(config)\n const { Component: Card, props: cardOverrideProps } = resolveOverride(components.ProductCard, ProductCard)\n const opts: ListProductsOptions = product.categoryId\n ? { categoryId: product.categoryId, status: 'active', limit: 5 }\n : { status: 'active', limit: 5 }\n const { products, loading } = useProducts(opts)\n const related = products.filter((p) => p.id !== product.id).slice(0, 4)\n\n if (loading || related.length === 0) return null\n\n return (\n <section className=\"mt-16\">\n <h2 className=\"sf-heading text-xl font-semibold tracking-tight\">Você também pode gostar</h2>\n <div className=\"mt-6 grid grid-cols-2 gap-5 md:grid-cols-4\">\n {related.map((p) => (\n <Card\n key={p.id}\n product={p}\n config={config}\n commerceMode={config.commerceMode}\n actions={actions}\n {...cardOverrideProps}\n />\n ))}\n </div>\n </section>\n )\n}\n","import React, { useState } from 'react'\nimport { MapPin, Truck } from 'lucide-react'\nimport { formatPostalCode } from '@fayz-ai/core'\nimport { useDeliveryStore, resolveOptionRate } from '../../stores/delivery.store'\nimport { useCartStore, selectSubtotal } from '../../stores/cart.store'\nimport { useStorefrontConfig } from '../../document/config'\nimport { formatMoney } from '../../lib/format'\nimport { TID } from '../../lib/testids'\n\n/**\n * \"Do you deliver to me, for how much, and when\" — asked on the product page,\n * before the shopper has invested anything in a cart.\n *\n * The CEP is kept in the delivery store, so the answer follows them to the cart\n * and lands at checkout with street/district/city/UF already filled. That is\n * the actual payoff: the buyer types a house number instead of an address.\n *\n * `subtotal` is the PRE-discount cart subtotal, the same number shop_place_order\n * uses to resolve free-above thresholds. Quoting against anything else is how\n * the cart and the order end up disagreeing (see migration 0017).\n */\nexport function DeliveryEstimator({ compact = false }: { compact?: boolean }) {\n const config = useStorefrontConfig()\n const cart = useCartStore()\n const delivery = useDeliveryStore()\n const [draft, setDraft] = useState(() => formatPostalCode(delivery.postalCode))\n\n const subtotal = selectSubtotal(cart)\n const money = (value: number) => formatMoney(value, config.currency, config.locale)\n const loading = delivery.status === 'loading'\n // Once a CEP has quoted successfully, the input/submit form is redundant\n // with the address + options already shown below — hide it in favor of\n // that summary. \"Trocar CEP\" (below) calls delivery.clear(), which resets\n // status away from 'served' and brings the form back.\n const resolved = delivery.status === 'served'\n\n async function submit(event: React.FormEvent) {\n event.preventDefault()\n await delivery.resolve(draft, subtotal)\n }\n\n function eta(option: { etaMinDays?: number; etaMaxDays?: number }): string | null {\n const { etaMinDays: min, etaMaxDays: max } = option\n if (min == null && max == null) return null\n if (min === 0 && (max === 0 || max === 1)) return 'hoje ou amanhã'\n if (min != null && max != null && min !== max) return `${min} a ${max} dias úteis`\n return `${max ?? min} dia(s) útil(eis)`\n }\n\n return (\n <section\n data-testid={TID.deliveryEstimator}\n className={compact ? 'rounded-lg border p-3' : 'mt-6 rounded-lg border p-4'}\n >\n {!resolved && (\n <>\n <div className=\"flex items-center gap-2 text-sm font-semibold\">\n <Truck className=\"h-4 w-4 text-primary\" />\n Calcular entrega\n </div>\n\n <form onSubmit={submit} className=\"mt-3 flex gap-2\">\n <input\n data-testid={TID.deliveryCepInput}\n aria-label=\"CEP\"\n inputMode=\"numeric\"\n autoComplete=\"postal-code\"\n placeholder=\"00000-000\"\n value={draft}\n onChange={(event) => setDraft(formatPostalCode(event.target.value))}\n className=\"min-w-0 flex-1 rounded-lg border bg-background px-3 py-2 text-sm outline-none transition focus:border-primary focus:ring-2 focus:ring-primary/10\"\n />\n <button\n type=\"submit\"\n data-testid={TID.deliveryCepSubmit}\n disabled={loading}\n className=\"shrink-0 rounded-lg bg-primary px-4 py-2 text-sm font-semibold text-primary-foreground transition hover:opacity-90 disabled:opacity-50\"\n >\n {loading ? '...' : 'Calcular'}\n </button>\n </form>\n </>\n )}\n\n {/* Shown whenever there is one, including alongside a price: the range\n may be covered even though the CEP itself was mistyped. */}\n {delivery.error && (\n <p data-testid={TID.deliveryError} className=\"mt-3 text-sm text-destructive\">\n {delivery.error}\n </p>\n )}\n\n {delivery.address && (\n <p data-testid={TID.deliveryAddress} className=\"mt-3 flex items-start gap-1.5 text-xs text-muted-foreground\">\n <MapPin className=\"mt-0.5 h-3.5 w-3.5 shrink-0\" />\n <span>\n {[delivery.address.street, delivery.address.district].filter(Boolean).join(', ')}\n {delivery.address.street || delivery.address.district ? ' — ' : ''}\n {delivery.address.city}/{delivery.address.state}\n </span>\n </p>\n )}\n\n {delivery.status === 'served' && (\n <ul className=\"mt-3 space-y-2\">\n {delivery.options.map((option) => {\n const selected = delivery.selectedZoneId === option.zoneId\n const label = eta(option)\n // Resolved for the cart as it stands right now, not for whatever it\n // held when the CEP was typed — the same rule the server applies.\n const rate = resolveOptionRate(option, subtotal)\n return (\n <li key={option.zoneId}>\n <button\n type=\"button\"\n data-testid={TID.deliveryOption}\n data-zone={option.zoneId}\n data-rate={rate.toFixed(2)}\n aria-pressed={selected}\n onClick={() => delivery.selectZone(option.zoneId)}\n className={`flex w-full items-center justify-between gap-3 rounded-lg border px-3 py-2 text-left text-sm transition ${\n selected ? 'border-primary bg-primary/5' : 'border-border hover:bg-muted/40'\n }`}\n >\n <span className=\"min-w-0\">\n <span className=\"block truncate font-medium\">\n {option.carrier ? `${option.carrier} · ${option.name}` : option.name}\n </span>\n {label && <span className=\"block text-xs text-muted-foreground\">{label}</span>}\n </span>\n <span className=\"shrink-0 font-semibold\">\n {rate === 0 ? 'Grátis' : money(rate)}\n </span>\n </button>\n </li>\n )\n })}\n </ul>\n )}\n\n {/*\n No options for a valid address. For a store that configured zones this\n means \"outside our delivery area\" and checkout will refuse the order, so\n it is said plainly here rather than at the end of the funnel. A store\n with no zones at all never reaches this state — it quotes nothing and\n keeps its flat rate.\n */}\n {delivery.status === 'unserved' && (\n <p data-testid={TID.deliveryUnserved} className=\"mt-3 text-sm text-destructive\">\n Ainda não entregamos nesse CEP.\n </p>\n )}\n\n {delivery.postalCode && (\n <button\n type=\"button\"\n data-testid={TID.deliveryClear}\n onClick={() => { delivery.clear(); setDraft('') }}\n className=\"mt-3 py-1 text-xs text-muted-foreground underline-offset-2 hover:underline\"\n >\n Trocar CEP\n </button>\n )}\n </section>\n )\n}\n","import React, { useEffect, useState } from 'react'\nimport { ChevronLeft, RefreshCcw, ShieldCheck, Truck } from 'lucide-react'\nimport { useProduct } from '../hooks/use-product'\nimport { useCartStore } from '../stores/cart.store'\nimport { getStorefrontComponents, useStorefrontConfig } from '../document/config'\nimport { useStorefrontHead } from '../hooks/use-storefront-head'\nimport { productSeo } from '../lib/seo'\nimport { useStorefrontActions } from '../hooks/use-storefront-actions'\nimport { Link, useRoutePath } from '../app/router'\nimport { Price } from '../components/Price'\nimport { QuantityInput } from '../components/cart/QuantityInput'\nimport { ProductOptionSelector } from '../components/product/ProductOptionSelector'\nimport { ProductSpecs } from '../components/product/ProductSpecs'\nimport { PaymentTerms } from '../components/PaymentTerms'\nimport { ProductReviews } from '../components/product/ProductReviews'\nimport { RelatedProducts } from '../components/product/RelatedProducts'\nimport { ProductEnquiryForm } from '../components/product/ProductEnquiryForm'\nimport { SmoothImage } from '../components/SmoothImage'\nimport { ProductGallery } from '../components/product/ProductGallery'\nimport { DeliveryEstimator } from '../components/checkout/DeliveryEstimator'\nimport { getProductOptionGroups, type ProductOptionSelection } from '../data/product-options'\nimport { storefrontComponentContracts } from '../extend/component-selectors'\nimport { Slot } from '../extend/slots'\nimport { TID } from '../lib/testids'\nimport { overrideComponent, overrideProps, resolveOverride } from '../extend/component-override'\n\nexport function ProductDetailPage({ slug }: { slug: string }) {\n const config = useStorefrontConfig()\n const actions = useStorefrontActions()\n const { product, loading } = useProduct(slug)\n const addItem = useCartStore((s) => s.addItem)\n const [qty, setQty] = useState(1)\n const [selectedOptions, setSelectedOptions] = useState<ProductOptionSelection>({})\n\n const optionGroups = product ? getProductOptionGroups(product) : []\n // A product page is the store's most valuable SEO surface, so it declares the\n // full descriptor — canonical, share image, Product + BreadcrumbList JSON-LD —\n // not just a title.\n const path = useRoutePath()\n useStorefrontHead(\n product\n ? productSeo(product, { config, path })\n : { title: config.name },\n )\n\n useEffect(() => {\n if (!product) return\n const defaults = Object.fromEntries(\n getProductOptionGroups(product).map((group) => [group.label, group.values[0] ?? '']),\n )\n setSelectedOptions(defaults)\n }, [product?.id])\n\n if (loading) {\n return (\n <div className=\"mx-auto max-w-5xl px-4 py-8 sm:px-6\">\n <div className=\"grid animate-pulse gap-10 md:grid-cols-2\">\n <div className=\"aspect-square rounded-2xl bg-muted\" />\n <div className=\"space-y-4 py-4\">\n <div className=\"h-8 w-3/4 rounded bg-muted\" />\n <div className=\"h-6 w-1/3 rounded bg-muted\" />\n <div className=\"h-24 rounded bg-muted\" />\n </div>\n </div>\n </div>\n )\n }\n\n if (!product) {\n return (\n // Carries the not-found marker: a product URL whose product is gone is a\n // missing page, not a page about a missing product. Without it a headless\n // render reports `found`, a prerender writes the file, and the store\n // publishes a soft 404 at a real URL for every deleted product.\n <div\n data-storefront-page=\"not-found\"\n className=\"mx-auto max-w-5xl px-4 py-20 text-center sm:px-6\"\n >\n <p className=\"text-lg text-muted-foreground\">Produto não encontrado.</p>\n <Link to=\"/\" className=\"mt-4 inline-block text-primary underline\">Voltar à loja</Link>\n </div>\n )\n }\n\n const soldOut = product.inventoryCount <= 0\n const lowStock = !soldOut && product.inventoryCount <= 5\n const image = product.images.find((i) => i.isPrimary) ?? product.images[0]\n const components = getStorefrontComponents(config)\n // Only a REPLACED component takes over the page. A props-only override has no\n // page to take over — it keeps the SDK body — so this stays a plain lookup\n // rather than going through resolveOverride with a self-referential fallback.\n const ProductDetailComponent = overrideComponent(components.ProductDetail)\n const detailOverrideProps = overrideProps(components.ProductDetail)\n // Honours the ProductGallery override contract, which has existed in\n // component-contracts.ts since before any component implemented it.\n const { Component: GalleryComponent, props: galleryOverrideProps } = resolveOverride(\n components.ProductGallery,\n ProductGallery,\n )\n const addToCart = () => addItem(product, qty, selectedOptions)\n const openEnquiry = () => {\n document.getElementById('storefront-product-enquiry')?.scrollIntoView({ behavior: 'smooth', block: 'start' })\n }\n const discountPct =\n product.compareAtPrice && product.compareAtPrice > product.price\n ? Math.round((1 - product.price / product.compareAtPrice) * 100)\n : 0\n\n // One object for all nine PDP slots. Blocks inside them read it through\n // useSlotContext, which is what lets a slot say something about THIS product\n // instead of holding static copy.\n const slotContext = { product, soldOut, lowStock, discountPct }\n\n if (ProductDetailComponent) {\n return (\n <ProductDetailComponent\n product={product}\n config={config}\n commerceMode={config.commerceMode}\n primaryImage={image}\n optionGroups={optionGroups}\n selectedOptions={selectedOptions}\n setSelectedOptions={setSelectedOptions}\n quantity={qty}\n setQuantity={setQty}\n soldOut={soldOut}\n lowStock={lowStock}\n actions={actions}\n addToCart={addToCart}\n openEnquiry={openEnquiry}\n {...detailOverrideProps}\n />\n )\n }\n\n return (\n <div {...storefrontComponentContracts.productDetail.root} className=\"mx-auto max-w-5xl px-4 py-8 sm:px-6\">\n <Link to=\"/\" className=\"mb-6 inline-flex items-center gap-1 text-sm text-muted-foreground hover:text-foreground\">\n <ChevronLeft className=\"h-4 w-4\" /> Continuar comprando\n </Link>\n\n <div className=\"grid animate-fade-up grid-cols-1 gap-10 md:grid-cols-2\">\n <div>\n <GalleryComponent\n product={product}\n images={product.images}\n primaryImage={image}\n config={config}\n commerceMode={config.commerceMode}\n {...galleryOverrideProps}\n />\n <Slot area=\"productDetail\" name=\"afterGallery\" context={slotContext} />\n </div>\n\n <div className=\"flex flex-col py-2 lg:sticky lg:top-24 lg:self-start\">\n <nav className=\"mb-3 flex flex-wrap items-center gap-1.5 text-xs text-muted-foreground\">\n <Link to=\"/\" className=\"transition-colors hover:text-foreground\">Início</Link>\n {product.categoryName && (\n <>\n <span aria-hidden>/</span>\n <span>{product.categoryName}</span>\n </>\n )}\n <span aria-hidden>/</span>\n <span className=\"text-foreground\">{product.name}</span>\n </nav>\n\n <Slot area=\"productDetail\" name=\"beforeTitle\" context={slotContext} />\n\n <h1 data-testid={TID.pdpName} className=\"sf-heading text-3xl font-bold tracking-tight\">\n {product.name}\n </h1>\n\n <Slot area=\"productDetail\" name=\"afterTitle\" context={slotContext} />\n\n {config.commerceMode === 'checkout' && (\n <div className=\"mt-3 flex items-center gap-3\">\n <div className=\"text-xl\">\n <Price\n value={product.price}\n compareAt={product.compareAtPrice}\n testId={TID.pdpPrice}\n compareTestId={TID.pdpComparePrice}\n />\n </div>\n {discountPct > 0 && (\n <span className=\"rounded-full bg-primary/10 px-2.5 py-1 text-xs font-bold text-primary\">\n −{discountPct}%\n </span>\n )}\n </div>\n )}\n\n {/* The PDP is where the Brazilian shopper decides, so the Pix price\n and the instalment belong next to the price, not only on the card. */}\n {config.commerceMode === 'checkout' && (\n <PaymentTerms price={product.price} metadata={product.metadata} variant=\"detail\" />\n )}\n\n <Slot area=\"productDetail\" name=\"afterPrice\" context={slotContext} />\n\n <p data-testid={TID.pdpDescription} className=\"mt-5 leading-relaxed text-muted-foreground\">\n {product.description}\n </p>\n\n <Slot area=\"productDetail\" name=\"afterDescription\" context={slotContext} />\n\n {config.commerceMode === 'checkout' && (\n <div className=\"mt-4 flex flex-wrap items-center gap-x-3 gap-y-1 text-sm\">\n {soldOut ? (\n <span className=\"inline-flex items-center gap-2 font-medium text-muted-foreground\">\n <span className=\"h-2 w-2 rounded-full bg-muted-foreground\" /> Sem estoque\n </span>\n ) : lowStock ? (\n <span className=\"inline-flex items-center gap-2 font-semibold text-amber-600\">\n <span className=\"h-2 w-2 animate-pulse rounded-full bg-amber-500\" />\n Últimas unidades — só {product.inventoryCount} restantes\n </span>\n ) : (\n <span className=\"inline-flex items-center gap-2 font-medium text-emerald-600\">\n <span className=\"h-2 w-2 rounded-full bg-emerald-500\" /> Em estoque\n </span>\n )}\n {product.sku && <span className=\"text-muted-foreground\">SKU: {product.sku}</span>}\n </div>\n )}\n\n <ProductOptionSelector\n groups={optionGroups}\n value={selectedOptions}\n onChange={setSelectedOptions}\n />\n\n {/* Where trust seals go. Three of our stores wanted something here and\n two of them rewrote the page to get it. */}\n <Slot area=\"productDetail\" name=\"beforeAddToCart\" context={slotContext} />\n\n <div {...storefrontComponentContracts.productDetail.actions} className=\"mt-8\">\n {config.commerceMode === 'checkout' ? (\n <div className=\"flex items-center gap-4\">\n <QuantityInput\n value={qty}\n onChange={setQty}\n max={soldOut ? 1 : product.inventoryCount}\n testId={TID.pdpQtyInput}\n />\n <button\n type=\"button\"\n data-testid={TID.pdpAddToCart}\n disabled={soldOut}\n onClick={addToCart}\n className=\"sf-cta flex-1 bg-primary py-3.5 font-semibold text-primary-foreground shadow-md transition-all hover:-translate-y-0.5 hover:shadow-lg disabled:cursor-not-allowed disabled:opacity-40 disabled:shadow-none disabled:hover:translate-y-0\"\n style={{ borderRadius: 'var(--sf-radius-button)' }}\n >\n {soldOut ? 'Esgotado' : 'Adicionar ao carrinho'}\n </button>\n </div>\n ) : config.commerceMode === 'enquiry' ? (\n <button\n type=\"button\"\n {...storefrontComponentContracts.productDetail.enquiryButton}\n onClick={openEnquiry}\n className=\"sf-cta w-full bg-primary py-3.5 font-semibold text-primary-foreground shadow-md transition-all hover:-translate-y-0.5 hover:shadow-lg\"\n style={{ borderRadius: 'var(--sf-radius-button)' }}\n >\n {config.enquiry.label}\n </button>\n ) : (\n <Link\n to={config.catalogPath}\n className=\"inline-flex border px-5 py-3 text-sm font-semibold transition-colors hover:bg-muted\"\n style={{ borderRadius: 'var(--sf-radius-button)' }}\n >\n Voltar ao catálogo\n </Link>\n )}\n </div>\n\n <Slot area=\"productDetail\" name=\"afterAddToCart\" context={slotContext} />\n\n {/* Asked here, before the cart exists: \"do you deliver to me and for\n how much\" is the question that decides whether this page converts,\n and it used to be answerable only at the end of checkout. */}\n {config.commerceMode === 'checkout' && product.isPhysical !== false && <DeliveryEstimator />}\n\n {config.commerceMode === 'checkout' && (\n <div className=\"mt-6 grid grid-cols-3 gap-3 border-t pt-6 text-center\">\n <div className=\"flex flex-col items-center gap-1.5 text-[11px] font-medium text-muted-foreground\">\n <Truck className=\"h-5 w-5 text-primary\" /> Envio rápido\n </div>\n <div className=\"flex flex-col items-center gap-1.5 text-[11px] font-medium text-muted-foreground\">\n <RefreshCcw className=\"h-5 w-5 text-primary\" /> Troca fácil\n </div>\n <div className=\"flex flex-col items-center gap-1.5 text-[11px] font-medium text-muted-foreground\">\n <ShieldCheck className=\"h-5 w-5 text-primary\" /> Pagamento seguro\n </div>\n </div>\n )}\n </div>\n </div>\n\n {config.commerceMode === 'enquiry' && (\n <section id=\"storefront-product-enquiry\" className=\"mt-12 border-t pt-10\">\n <div className=\"mx-auto max-w-3xl\">\n <h2 className=\"sf-heading text-2xl font-semibold\">Need more information?</h2>\n <p className=\"mt-2 text-muted-foreground\">Send an enquiry about this product.</p>\n <div className=\"mt-6\">\n <ProductEnquiryForm product={product} />\n </div>\n </div>\n </section>\n )}\n\n <Slot area=\"productDetail\" name=\"beforeSpecs\" context={slotContext} />\n\n <ProductSpecs product={product} />\n <ProductReviews product={product} />\n <RelatedProducts product={product} />\n\n <Slot area=\"productDetail\" name=\"afterDetail\" context={slotContext} />\n </div>\n )\n}\n","import React, { useState } from 'react'\nimport type { RegistryMeta } from '@fayz-ai/core'\nimport type { CreateProductEnquiryInput } from '@fayz-ai/shop/types'\nimport { useEnquiry } from '../../hooks/use-enquiry'\nimport { TID } from '../../lib/testids'\n\n// ---------------------------------------------------------------------------\n// Form block — a schema'd fields list that submits through the EXISTING\n// enquiry write path (provider.createProductEnquiry). No new backend: the\n// submission lands where product enquiries already land, tagged with the\n// form's subject, so the store owner reads one inbox.\n//\n// This absorbs the hand-written contact forms in the fleet (cristinarotondaro\n// wrote a 70-line AtelierContactForm against the same provider call): the\n// form's IDENTITY fields map onto the enquiry contract by reserved semantics,\n// and everything else folds into the message body as \"Label: value\" lines.\n// ---------------------------------------------------------------------------\n\nexport type FormBlockFieldType = 'text' | 'email' | 'phone' | 'textarea' | 'select'\n\nexport interface FormBlockField {\n id: string\n label: string\n type?: FormBlockFieldType\n required?: boolean\n placeholder?: string\n /** `select` only. */\n options?: readonly { value: string; label: string }[]\n}\n\nexport interface FormBlockProps {\n eyebrow?: string\n title?: string\n subtitle?: string\n /** Enquiry subject — how this form's submissions are recognized in the inbox. */\n subject?: string\n fields?: readonly FormBlockField[]\n submitLabel?: string\n successMessage?: string\n}\n\n/**\n * Fold submitted values into the enquiry contract.\n *\n * Reserved semantics (documented in the block's settings help):\n * · the first `email` field → customerEmail\n * · the first `phone` field → customerPhone\n * · a field with id 'name', else the first plain text field → customerName\n * · every remaining field → a \"Label: value\" line of the message\n *\n * Pure and exported so the mapping — the part that silently eats data when it\n * is wrong — is unit-testable without a DOM.\n */\nexport function buildEnquiryFromForm(\n fields: readonly FormBlockField[],\n values: Record<string, string>,\n subject: string,\n sourceUrl?: string,\n): CreateProductEnquiryInput {\n const emailField = fields.find((f) => f.type === 'email')\n const phoneField = fields.find((f) => f.type === 'phone')\n const nameField =\n fields.find((f) => f.id === 'name') ??\n fields.find((f) => (f.type ?? 'text') === 'text' && f !== emailField && f !== phoneField)\n\n const identity = new Set([emailField?.id, phoneField?.id, nameField?.id])\n const lines = fields\n .filter((f) => !identity.has(f.id))\n .map((f) => ({ field: f, value: (values[f.id] ?? '').trim() }))\n .filter((entry) => entry.value)\n .map(({ field, value }) => (field.type === 'textarea' ? value : `${field.label}: ${value}`))\n\n return {\n productName: subject,\n customerName: (nameField && values[nameField.id]?.trim()) || 'Visitante',\n customerEmail: (emailField && values[emailField.id]?.trim()) || '',\n customerPhone: (phoneField && values[phoneField.id]?.trim()) || undefined,\n subject,\n message: lines.join('\\n') || '(sem mensagem)',\n sourceUrl,\n metadata: { form: subject, values },\n }\n}\n\nconst INPUT_CLASS =\n 'w-full border bg-background px-3 py-2 text-sm outline-none focus:border-primary'\n\nfunction Field({\n field,\n value,\n onChange,\n}: {\n field: FormBlockField\n value: string\n onChange: (value: string) => void\n}) {\n const common = {\n 'data-testid': TID.formBlockField(field.id),\n required: field.required,\n value,\n placeholder: field.placeholder,\n className: INPUT_CLASS,\n style: { borderRadius: 'var(--sf-radius-input)' },\n }\n return (\n <label className={`space-y-1.5 text-sm font-medium ${field.type === 'textarea' ? 'block' : ''}`}>\n <span>\n {field.label}\n {field.required ? '' : ' (opcional)'}\n </span>\n {field.type === 'textarea' ? (\n <textarea {...common} rows={5} onChange={(e) => onChange(e.target.value)} className={`${INPUT_CLASS} resize-none`} />\n ) : field.type === 'select' ? (\n <select {...common} onChange={(e) => onChange(e.target.value)}>\n <option value=\"\">—</option>\n {(field.options ?? []).map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n ) : (\n <input\n {...common}\n type={field.type === 'email' ? 'email' : field.type === 'phone' ? 'tel' : 'text'}\n onChange={(e) => onChange(e.target.value)}\n />\n )}\n </label>\n )\n}\n\nexport function FormBlock({\n eyebrow,\n title,\n subtitle,\n subject = 'Contato',\n fields = [],\n submitLabel = 'Enviar',\n successMessage = 'Recebemos sua mensagem. Obrigado!',\n}: FormBlockProps) {\n const { createProductEnquiry } = useEnquiry()\n const [values, setValues] = useState<Record<string, string>>({})\n const [status, setStatus] = useState<'idle' | 'submitting' | 'success' | 'error'>('idle')\n const [error, setError] = useState<string | null>(null)\n\n if (fields.length === 0) return null\n\n const submit = async (event: React.FormEvent) => {\n event.preventDefault()\n setStatus('submitting')\n setError(null)\n try {\n await createProductEnquiry(\n buildEnquiryFromForm(\n fields,\n values,\n subject,\n typeof window === 'undefined' ? undefined : window.location.href,\n ),\n )\n setStatus('success')\n setValues({})\n } catch (e) {\n setStatus('error')\n setError(e instanceof Error ? e.message : String(e))\n }\n }\n\n return (\n <section data-testid={TID.formBlock} className=\"mx-auto max-w-2xl px-4 py-14 sm:px-6\">\n {(eyebrow || title || subtitle) && (\n <div className=\"mb-8 text-center\">\n {eyebrow && (\n <p className=\"mb-2 text-xs font-semibold uppercase tracking-[0.25em] text-muted-foreground\">{eyebrow}</p>\n )}\n {title && <h2 className=\"sf-heading text-3xl font-bold\">{title}</h2>}\n {subtitle && <p className=\"mt-2 text-muted-foreground\">{subtitle}</p>}\n </div>\n )}\n {status === 'success' ? (\n <p data-testid={TID.formBlockSuccess} className=\"text-center font-medium text-emerald-600\">\n {successMessage}\n </p>\n ) : (\n <form onSubmit={submit} className=\"space-y-4\">\n {fields.map((field) => (\n <Field\n key={field.id}\n field={field}\n value={values[field.id] ?? ''}\n onChange={(value) => setValues((prev) => ({ ...prev, [field.id]: value }))}\n />\n ))}\n <button\n data-testid={TID.formBlockSubmit}\n type=\"submit\"\n disabled={status === 'submitting'}\n className=\"sf-cta w-full bg-primary px-5 py-3 font-semibold text-primary-foreground disabled:cursor-wait disabled:opacity-60 sm:w-auto\"\n style={{ borderRadius: 'var(--sf-radius-button)' }}\n >\n {status === 'submitting' ? 'Enviando...' : submitLabel}\n </button>\n {error && (\n <p data-testid={TID.formBlockError} className=\"text-sm font-medium text-red-600\">\n {error}\n </p>\n )}\n </form>\n )}\n </section>\n )\n}\n\nexport const formBlockMeta = {\n label: 'Form',\n description:\n 'Contact/request form with a declared fields list. Submissions go through the store\\'s enquiry channel (the same inbox as product enquiries), tagged with the form subject.',\n settings: [\n { id: 'eyebrow', type: 'text', label: 'Eyebrow', help: 'Small uppercase label above the title.' },\n { id: 'title', type: 'text', label: 'Title' },\n { id: 'subtitle', type: 'text', label: 'Subtitle' },\n {\n id: 'subject',\n type: 'text',\n label: 'Subject',\n help: 'How this form\\'s submissions are identified in the enquiry inbox, e.g. \"Contato do ateliê\".',\n default: 'Contato',\n },\n {\n id: 'fields',\n type: 'list',\n label: 'Fields',\n required: true,\n help:\n 'Reserved semantics: the first email field becomes the sender address, the first phone field the sender phone, and the field with id \"name\" (or the first text field) the sender name. Every other field lands in the message as \"Label: value\".',\n of: [\n { id: 'id', type: 'text', label: 'Field id', help: 'Stable key, e.g. \"name\", \"email\", \"message\".', required: true },\n { id: 'label', type: 'text', label: 'Label', required: true },\n {\n id: 'type',\n type: 'select',\n label: 'Type',\n default: 'text',\n options: [\n { value: 'text', label: 'Text' },\n { value: 'email', label: 'E-mail' },\n { value: 'phone', label: 'Phone' },\n { value: 'textarea', label: 'Long text' },\n { value: 'select', label: 'Choice' },\n ],\n },\n { id: 'required', type: 'boolean', label: 'Required', default: false },\n { id: 'placeholder', type: 'text', label: 'Placeholder' },\n {\n id: 'options',\n type: 'list',\n label: 'Choices',\n help: 'Only for type \"select\".',\n of: [\n { id: 'value', type: 'text', label: 'Value', required: true },\n { id: 'label', type: 'text', label: 'Label', required: true },\n ],\n },\n ],\n },\n { id: 'submitLabel', type: 'text', label: 'Submit label', default: 'Enviar' },\n {\n id: 'successMessage',\n type: 'text',\n label: 'Success message',\n default: 'Recebemos sua mensagem. Obrigado!',\n },\n ],\n presets: [\n {\n name: 'Contact form',\n props: {\n title: 'Fale com a gente',\n subtitle: 'Respondemos em até um dia útil.',\n subject: 'Contato',\n fields: [\n { id: 'name', label: 'Seu nome', type: 'text', required: true },\n { id: 'email', label: 'Seu e-mail', type: 'email', required: true },\n { id: 'phone', label: 'Telefone', type: 'phone' },\n { id: 'message', label: 'Mensagem', type: 'textarea', required: true },\n ],\n },\n },\n ],\n // A form is a destination, not merchandising — editorial pages and the home.\n enabledOn: ['home', 'catalog', 'collection', 'content'],\n} satisfies Omit<RegistryMeta, 'propsSchema'>\n","import React from 'react'\nimport { hasEntityDeclaration, resolveEntityDeclaration } from '@fayz-ai/core'\nimport type { BlockNode, EntityDeclaration, EntityField, RegistryMeta } from '@fayz-ai/core'\nimport type { EntityRecord } from '@fayz-ai/shop/entities'\nimport { BlockDataError, useBlockData } from '../../blocks/page-data'\nimport { Reveal } from '../../lib/motion'\nimport { TID } from '../../lib/testids'\n\n// ---------------------------------------------------------------------------\n// entityList — the generic block over declared entities (spine M4).\n//\n// One block renders ANY defineEntity kind: its data need goes through the\n// entity.list loader (the only read path, I11), and what it shows per record\n// is the declaration's display fields — or the subset the block instance\n// picks. The block never guesses at shapes: every field it renders is typed by\n// the declaration, so an image field is an <img> and a url field is a link,\n// for store_location today and whatever an app declares tomorrow.\n// ---------------------------------------------------------------------------\n\nfunction fieldValue(field: EntityField, value: unknown): React.ReactNode {\n if (value === null || value === undefined || value === '') return null\n switch (field.type) {\n case 'image':\n return (\n <img\n src={String(value)}\n alt=\"\"\n loading=\"lazy\"\n className=\"h-40 w-full object-cover\"\n style={{ borderRadius: 'var(--sf-radius-card)' }}\n />\n )\n case 'url':\n return (\n <a href={String(value)} className=\"text-primary underline-offset-2 hover:underline\" target=\"_blank\" rel=\"noreferrer\">\n {String(value)}\n </a>\n )\n case 'point': {\n const point = value as { lat?: number; lng?: number }\n return typeof point.lat === 'number' && typeof point.lng === 'number' ? `${point.lat}, ${point.lng}` : null\n }\n case 'boolean':\n return value === true ? '✓' : null\n case 'json':\n // A shape only the app understands; a generic block printing raw JSON at\n // a shopper would always be wrong. Custom rendering is a component\n // override, not this block's guess.\n return null\n default:\n return String(value)\n }\n}\n\nfunction EntityCard({ declaration, record, fields }: { declaration: EntityDeclaration; record: EntityRecord; fields: readonly string[] }) {\n const titleField = declaration.titleField\n const title = titleField ? record.data[titleField] : undefined\n const detailFields = fields.filter((name) => name !== titleField)\n return (\n <div\n className=\"border border-foreground/10 bg-background p-5\"\n style={{ borderRadius: 'var(--sf-radius-card)' }}\n data-entity-record={record.slug ?? record.id}\n >\n {typeof title === 'string' && title && <h3 className=\"sf-heading mb-2 text-lg font-semibold\">{title}</h3>}\n <dl className=\"space-y-1.5\">\n {detailFields.map((name) => {\n const field = declaration.fields[name]\n if (!field) return null\n const rendered = fieldValue(field, record.data[name])\n if (rendered === null) return null\n return (\n <div key={name}>\n <dt className=\"text-[11px] font-semibold uppercase tracking-wide text-muted-foreground\">\n {field.label ?? name}\n </dt>\n <dd className=\"text-sm text-foreground/90\">{rendered}</dd>\n </div>\n )\n })}\n </dl>\n </div>\n )\n}\n\nexport function EntityListBlock({\n entity,\n title,\n subtitle,\n fields,\n limit = 12,\n node,\n}: {\n /** The defineEntity key this block lists. */\n entity: string\n title?: string\n subtitle?: string\n /** Fields to show per record; empty falls back to the declaration's displayFields. */\n fields?: Array<{ field: string }>\n limit?: number\n node?: BlockNode\n}) {\n const { status, data, error, loader } = useBlockData<EntityRecord[]>(node, 'records', {\n loader: 'entity.list',\n params: { entity, limit },\n })\n if (status === 'error') return <BlockDataError loader={loader} message={error} />\n // An undeclared entity always errors through the loader above; the guard only\n // covers the loading render, which shows skeletons and reads no declaration.\n const declaration = entity && hasEntityDeclaration(entity) ? resolveEntityDeclaration(entity) : null\n const loading = status !== 'ready' || !declaration\n const records = data ?? []\n const shownFields =\n fields && fields.length > 0\n ? fields.map((entry) => entry.field).filter(Boolean)\n : declaration?.displayFields ?? []\n\n if (!loading && records.length === 0) return null\n\n return (\n <section data-testid={TID.entityList} className=\"mx-auto max-w-7xl px-4 py-14 sm:px-6\">\n {(title || subtitle) && (\n <Reveal className=\"mb-10 text-center\">\n {title && <h2 className=\"sf-heading text-3xl font-bold tracking-tight\">{title}</h2>}\n {subtitle && <p className=\"mt-2 text-muted-foreground\">{subtitle}</p>}\n </Reveal>\n )}\n <div className=\"grid gap-5 sm:grid-cols-2 lg:grid-cols-3\">\n {loading\n ? Array.from({ length: Math.min(limit, 6) }, (_, i) => (\n <div key={i} className=\"h-36 animate-pulse bg-muted\" style={{ borderRadius: 'var(--sf-radius-card)' }} />\n ))\n : records.map((record, i) => (\n <Reveal key={record.id} delay={i * 60}>\n <EntityCard declaration={declaration} record={record} fields={shownFields} />\n </Reveal>\n ))}\n </div>\n </section>\n )\n}\n\nexport const entityListBlockMeta = {\n label: 'Entity list',\n description:\n 'Cards of records from a declared custom entity (defineEntity) — store locations, consultants, events. Shows the declared display fields.',\n settings: [\n {\n id: 'entity',\n type: 'entity',\n label: 'Entity',\n help: \"The defineEntity key to list, e.g. 'store_location'. Unknown keys fail validation naming the declared set.\",\n required: true,\n },\n { id: 'title', type: 'text', label: 'Title' },\n { id: 'subtitle', type: 'text', label: 'Subtitle', help: 'One line under the title. Optional.' },\n {\n id: 'fields',\n type: 'list',\n label: 'Fields to show',\n help: \"Per-record fields, in order. Empty shows the entity's declared display fields.\",\n of: [{ id: 'field', type: 'text', label: 'Field name', required: true }],\n },\n {\n id: 'limit',\n type: 'number',\n label: 'How many',\n help: 'Rendered in a 3-column grid on desktop.',\n min: 1,\n max: 48,\n default: 12,\n },\n ],\n presets: [\n {\n // The pilot shape (spine M4): a store-locator section over the\n // store_location entity. Inserting it into a store WITHOUT that entity\n // fails validation naming the declared set — which is the correct nudge.\n name: 'Store locator',\n props: { entity: 'store_location', title: 'Nossas lojas', limit: 12 },\n },\n ],\n enabledOn: ['home', 'catalog', 'collection', 'product', 'content'],\n // The declared read (M3): resolved once per page through entity.list; the\n // $prop bindings keep the block instance and its need in agreement.\n data: {\n records: {\n loader: 'entity.list',\n params: { entity: { $prop: 'entity' }, limit: { $prop: 'limit' } },\n },\n },\n} satisfies Omit<RegistryMeta, 'propsSchema'>\n","import React, { useState } from 'react'\nimport { ChevronDown } from 'lucide-react'\nimport type { RegistryMeta } from '@fayz-ai/core'\nimport { Link } from '../../app/router'\nimport { Reveal } from '../../lib/motion'\nimport { SmoothImage } from '../SmoothImage'\n\n// ---------------------------------------------------------------------------\n// Editorial blocks promoted from the fleet (spine M2 \"promote the 8 stranded\n// store blocks\"). Each one existed as an app-registered block in exactly one\n// store, invisible to every other store and to the agent's catalog:\n//\n// seals ← artorious `artorius-seals` (ringed stat badges)\n// storyQuote ← artorious `artorius-story` (serif quote + attribution + image)\n// imageTiles ← compactor `purpose-grid` (photo tiles linking into the catalog)\n// faq ← figurinhas `fx-faq` (collapsible Q&A)\n//\n// What was promoted is the MECHANISM; the store branding stayed behind: the\n// originals hardcoded their DS variables (--coal-950, --gold-400), their asset\n// manifests and their copy. These render from the shared theme tokens\n// (primary/accent/card/--sf-*) and take everything else as settings.\n// ---------------------------------------------------------------------------\n\n// --- seals -------------------------------------------------------------------\n\nexport interface SealItem {\n top?: string\n value: string\n bottom?: string\n tone?: 'primary' | 'accent'\n}\n\nexport function SealsBand({ items = [] }: { items?: SealItem[] }) {\n if (items.length === 0) return null\n return (\n <section data-testid=\"seals-band\" className=\"border-y bg-card\">\n <div className=\"mx-auto flex max-w-5xl flex-wrap items-center justify-center gap-8 px-4 py-10 sm:px-6\">\n {items.map((seal, i) => {\n const color = seal.tone === 'accent' ? 'hsl(var(--sf-accent, var(--primary)))' : 'hsl(var(--primary))'\n return (\n <Reveal key={i} delay={i * 100}>\n <div\n className=\"flex h-28 w-28 flex-col items-center justify-center rounded-full border-2 text-center\"\n style={{ borderColor: color, color }}\n >\n {seal.top && <span className=\"text-[10px] font-semibold uppercase tracking-[0.14em] opacity-80\">{seal.top}</span>}\n <span className=\"sf-heading text-3xl font-bold leading-none\">{seal.value}</span>\n {seal.bottom && <span className=\"text-[10px] font-semibold uppercase tracking-[0.14em] opacity-80\">{seal.bottom}</span>}\n </div>\n </Reveal>\n )\n })}\n </div>\n </section>\n )\n}\n\nexport const sealsBlockMeta = {\n label: 'Seals band',\n description: 'Row of ringed stat badges — \"pronto em 15 minutos\", \"12h na brasa\". Proof, at a glance.',\n settings: [\n {\n id: 'items',\n type: 'list',\n label: 'Seals',\n required: true,\n help: 'Three or four read best. Each seal is top line / big value / bottom line.',\n of: [\n { id: 'top', type: 'text', label: 'Top line', help: 'e.g. \"Pronto em\".' },\n { id: 'value', type: 'text', label: 'Value', help: 'The big number or word, e.g. \"15\".', required: true },\n { id: 'bottom', type: 'text', label: 'Bottom line', help: 'e.g. \"minutos\".' },\n {\n id: 'tone',\n type: 'select',\n label: 'Tone',\n default: 'primary',\n options: [\n { value: 'primary', label: 'Primary' },\n { value: 'accent', label: 'Accent' },\n ],\n },\n ],\n },\n ],\n presets: [\n {\n name: 'Seals band',\n props: {\n items: [\n { top: 'Feito em', value: '48h', bottom: 'sob demanda', tone: 'primary' },\n { top: 'Mais de', value: '1.000', bottom: 'clientes', tone: 'accent' },\n { top: 'Garantia', value: '30', bottom: 'dias', tone: 'primary' },\n ],\n },\n },\n ],\n enabledOn: ['home', 'catalog', 'collection', 'content'],\n} satisfies Omit<RegistryMeta, 'propsSchema'>\n\n// --- storyQuote --------------------------------------------------------------\n\nexport interface StoryQuoteProps {\n eyebrow?: string\n quote: string\n attribution?: string\n image?: string\n}\n\nexport function StoryQuote({ eyebrow, quote, attribution, image }: StoryQuoteProps) {\n return (\n <section data-testid=\"story-quote\" className=\"bg-card\">\n <div\n className={`mx-auto grid max-w-6xl items-center gap-12 px-4 py-16 sm:px-6 ${image ? 'md:grid-cols-2' : ''}`}\n >\n <Reveal>\n {eyebrow && (\n <p className=\"mb-4 text-xs font-semibold uppercase tracking-[0.25em] text-muted-foreground\">{eyebrow}</p>\n )}\n <blockquote\n className=\"text-2xl italic leading-snug sm:text-3xl\"\n style={{ fontFamily: 'var(--sf-font-serif, var(--sf-font-heading, inherit))' }}\n >\n “{quote}”\n </blockquote>\n {attribution && (\n <p className=\"mt-5 text-xs font-semibold uppercase tracking-[0.18em] text-primary\">— {attribution}</p>\n )}\n </Reveal>\n {image && (\n <div className=\"overflow-hidden shadow-lg\" style={{ borderRadius: 'var(--sf-radius-card)' }}>\n <SmoothImage src={image} alt={attribution ?? ''} className=\"h-80 w-full object-cover\" loading=\"lazy\" />\n </div>\n )}\n </div>\n </section>\n )\n}\n\nexport const storyQuoteBlockMeta = {\n label: 'Story quote',\n description: 'Editorial split: a large serif quote with attribution, beside an optional photo.',\n settings: [\n { id: 'eyebrow', type: 'text', label: 'Eyebrow', help: 'Small uppercase label above the quote, e.g. \"A casa\".' },\n { id: 'quote', type: 'richtext', label: 'Quote', help: 'One or two sentences of brand voice — no surrounding quotation marks.', required: true },\n { id: 'attribution', type: 'text', label: 'Attribution', help: 'Who says it, e.g. the founder or the house itself.' },\n { id: 'image', type: 'image', label: 'Photo', help: 'Optional — without it the quote goes full width.' },\n ],\n presets: [\n {\n name: 'Story quote',\n props: {\n eyebrow: 'Nossa casa',\n quote: 'Fazemos pouco, e fazemos bem — cada peça passa pelas mesmas mãos, do primeiro esboço à embalagem.',\n attribution: 'O ateliê',\n },\n },\n ],\n enabledOn: ['home', 'collection', 'content'],\n} satisfies Omit<RegistryMeta, 'propsSchema'>\n\n// --- imageTiles --------------------------------------------------------------\n\nexport interface ImageTile {\n image: string\n label: string\n href?: string\n}\n\nexport interface ImageTilesProps {\n title?: string\n eyebrow?: string\n tiles?: ImageTile[]\n columns?: number\n aspect?: 'portrait' | 'square' | 'wide'\n}\n\nconst TILE_ASPECT: Record<NonNullable<ImageTilesProps['aspect']>, string> = {\n portrait: 'aspect-[4/5]',\n square: 'aspect-square',\n wide: 'aspect-[16/9]',\n}\n\nexport function ImageTiles({ title, eyebrow, tiles = [], columns = 4, aspect = 'portrait' }: ImageTilesProps) {\n if (tiles.length === 0) return null\n const lgCols = columns === 2 ? 'lg:grid-cols-2' : columns === 3 ? 'lg:grid-cols-3' : 'lg:grid-cols-4'\n return (\n <section data-testid=\"image-tiles\" className=\"mx-auto max-w-7xl px-4 py-12 sm:px-6 sm:py-16\">\n {eyebrow && <p className=\"mb-2 text-center text-xs font-semibold uppercase tracking-[0.2em] text-primary\">{eyebrow}</p>}\n {title && <h2 className=\"sf-heading mb-8 text-center text-2xl font-bold sm:text-3xl\">{title}</h2>}\n <div className={`grid grid-cols-2 gap-3 sm:gap-4 ${lgCols}`}>\n {tiles.map((tile) => {\n const content = (\n <div className={`relative ${TILE_ASPECT[aspect] ?? TILE_ASPECT.portrait}`}>\n <img\n src={tile.image}\n alt=\"\"\n loading=\"lazy\"\n className=\"h-full w-full object-cover transition-transform duration-500 ease-out group-hover:scale-[1.04]\"\n />\n {/* Bottom-weighted scrim only: lifestyle shots keep their subject\n * in the upper two thirds; a full overlay buys contrast the\n * photo does not need. */}\n <div\n aria-hidden\n className=\"absolute inset-x-0 bottom-0 h-2/5\"\n style={{ background: 'linear-gradient(180deg, transparent, rgba(0,0,0,0.72))' }}\n />\n <span className=\"sf-heading absolute inset-x-0 bottom-0 p-3 text-base font-bold text-white drop-shadow sm:p-4 sm:text-lg\">\n {tile.label}\n </span>\n </div>\n )\n const style = { borderRadius: 'var(--sf-radius-card)' }\n return tile.href ? (\n <Link key={tile.label} to={tile.href} className=\"group relative block overflow-hidden\" style={style}>\n {content}\n </Link>\n ) : (\n <div key={tile.label} className=\"group relative overflow-hidden\" style={style}>\n {content}\n </div>\n )\n })}\n </div>\n </section>\n )\n}\n\nexport const imageTilesBlockMeta = {\n label: 'Image tiles',\n description:\n 'Grid of photo tiles with a label and a link — shop-by-purpose, collections, lookbook chapters. The discovery axis a category tree does not give you.',\n settings: [\n { id: 'eyebrow', type: 'text', label: 'Eyebrow' },\n { id: 'title', type: 'text', label: 'Title' },\n {\n id: 'tiles',\n type: 'list',\n label: 'Tiles',\n required: true,\n of: [\n { id: 'image', type: 'image', label: 'Photo', required: true },\n { id: 'label', type: 'text', label: 'Label', required: true },\n { id: 'href', type: 'url', label: 'Link', help: 'Usually a filtered catalog url, e.g. /catalog?purpose=estudo.' },\n ],\n },\n { id: 'columns', type: 'number', label: 'Columns (desktop)', min: 2, max: 4, default: 4 },\n {\n id: 'aspect',\n type: 'select',\n label: 'Tile aspect',\n default: 'portrait',\n options: [\n { value: 'portrait', label: 'Portrait (4:5)' },\n { value: 'square', label: 'Square' },\n { value: 'wide', label: 'Wide (16:9)' },\n ],\n },\n ],\n presets: [\n {\n name: 'Image tiles',\n props: {\n title: 'Compre por ocasião',\n tiles: [\n { image: 'https://images.example/dia-a-dia.jpg', label: 'Dia a dia', href: '/catalog' },\n { image: 'https://images.example/presente.jpg', label: 'Para presentear', href: '/catalog' },\n { image: 'https://images.example/festa.jpg', label: 'Ocasiões especiais', href: '/catalog' },\n { image: 'https://images.example/novidades.jpg', label: 'Novidades', href: '/catalog' },\n ],\n },\n },\n ],\n enabledOn: ['home', 'catalog', 'collection', 'content'],\n} satisfies Omit<RegistryMeta, 'propsSchema'>\n\n// --- faq ---------------------------------------------------------------------\n\nexport interface FaqItem {\n q: string\n a: string\n}\n\nexport function FaqSection({ title, subtitle, items = [] }: { title?: string; subtitle?: string; items?: FaqItem[] }) {\n const [open, setOpen] = useState<number | null>(0)\n if (items.length === 0) return null\n return (\n <section data-testid=\"faq-section\" className=\"mx-auto max-w-7xl px-4 py-16 sm:px-6\">\n {(title || subtitle) && (\n <div className=\"mb-10 text-center\">\n {title && <h2 className=\"sf-heading text-3xl font-bold tracking-tight\">{title}</h2>}\n {subtitle && <p className=\"mt-2 text-muted-foreground\">{subtitle}</p>}\n </div>\n )}\n <div className=\"mx-auto max-w-3xl divide-y border bg-card\" style={{ borderRadius: 'var(--sf-radius-card)' }}>\n {items.map((item, i) => {\n const isOpen = open === i\n return (\n <div key={item.q}>\n <button\n type=\"button\"\n onClick={() => setOpen(isOpen ? null : i)}\n aria-expanded={isOpen}\n className=\"flex w-full items-center justify-between gap-4 px-5 py-4 text-left font-semibold hover:text-primary\"\n >\n {item.q}\n <ChevronDown\n className={`h-5 w-5 shrink-0 text-primary transition-transform ${isOpen ? 'rotate-180' : ''}`}\n />\n </button>\n {isOpen && <p className=\"px-5 pb-5 text-sm leading-relaxed text-muted-foreground\">{item.a}</p>}\n </div>\n )\n })}\n </div>\n </section>\n )\n}\n\nexport const faqBlockMeta = {\n label: 'FAQ',\n description: 'Collapsible questions and answers. One open at a time; the first starts open.',\n settings: [\n { id: 'title', type: 'text', label: 'Title', default: 'Perguntas frequentes' },\n { id: 'subtitle', type: 'text', label: 'Subtitle' },\n {\n id: 'items',\n type: 'list',\n label: 'Questions',\n required: true,\n of: [\n { id: 'q', type: 'text', label: 'Question', required: true },\n { id: 'a', type: 'richtext', label: 'Answer', required: true },\n ],\n },\n ],\n presets: [\n {\n name: 'FAQ',\n props: {\n title: 'Perguntas frequentes',\n items: [\n { q: 'Qual o prazo de entrega?', a: 'Enviamos em até 2 dias úteis; o prazo depende do CEP e aparece no fechamento do pedido.' },\n { q: 'Posso trocar ou devolver?', a: 'Sim — você tem 7 dias após o recebimento para solicitar troca ou devolução.' },\n { q: 'Quais as formas de pagamento?', a: 'PIX e cartão de crédito. O pedido é confirmado assim que o pagamento é aprovado.' },\n ],\n },\n },\n ],\n // Objection-handling is welcome wherever the decision happens.\n enabledOn: ['home', 'catalog', 'product', 'collection', 'content'],\n} satisfies Omit<RegistryMeta, 'propsSchema'>\n","import React, { useEffect, useState } from 'react'\nimport { getLucideIcon } from '@fayz-ai/ui/icons'\nimport type { RegistryMeta } from '@fayz-ai/core'\nimport { Link } from '../../app/router'\n\n// ---------------------------------------------------------------------------\n// Conversion blocks promoted from the fleet (spine M2):\n//\n// steps ← figurinhas `fx-steps` (numbered how-it-works strip)\n// countdown ← figurinhas `fx-countdown` (live countdown to a milestone list)\n// tiers ← figurinhas `fx-wholesale` (volume/pricing tier cards + CTA)\n//\n// The originals hardcoded Copa-2026 copy, a WhatsApp number and a blue\n// gradient. The mechanism — numbered steps, the \"next future milestone\"\n// countdown rule, a highlighted tier card — is generic; everything branded\n// became a setting, and color comes from the theme's primary token.\n// ---------------------------------------------------------------------------\n\n// --- steps -------------------------------------------------------------------\n\nexport interface StepItem {\n /** Lucide icon name in PascalCase; unknown names render no icon. */\n icon?: string\n title: string\n text?: string\n}\n\nexport function StepsSection({\n title,\n subtitle,\n items = [],\n}: {\n title?: string\n subtitle?: string\n items?: StepItem[]\n}) {\n if (items.length === 0) return null\n const cols = items.length >= 4 ? 'lg:grid-cols-4' : items.length === 3 ? 'lg:grid-cols-3' : 'lg:grid-cols-2'\n return (\n <section data-testid=\"steps-section\" className=\"mx-auto max-w-7xl px-4 py-16 sm:px-6\">\n {(title || subtitle) && (\n <div className=\"mb-10 text-center\">\n {title && <h2 className=\"sf-heading text-3xl font-bold tracking-tight\">{title}</h2>}\n {subtitle && <p className=\"mt-2 text-muted-foreground\">{subtitle}</p>}\n </div>\n )}\n <div className={`grid gap-6 sm:grid-cols-2 ${cols}`}>\n {items.map((step, i) => {\n const Icon = step.icon ? getLucideIcon(step.icon) : null\n return (\n <div key={step.title} className=\"relative border bg-card p-6\" style={{ borderRadius: 'var(--sf-radius-card)' }}>\n <div className=\"flex items-center gap-3\">\n <span className=\"flex h-11 w-11 items-center justify-center rounded-full bg-primary font-bold text-primary-foreground\">\n {i + 1}\n </span>\n {Icon && <Icon className=\"h-6 w-6 text-primary\" />}\n </div>\n <h3 className=\"mt-4 text-lg font-bold\">{step.title}</h3>\n {step.text && <p className=\"mt-1.5 text-sm text-muted-foreground\">{step.text}</p>}\n </div>\n )\n })}\n </div>\n </section>\n )\n}\n\nexport const stepsBlockMeta = {\n label: 'Steps',\n description: 'Numbered how-it-works cards — order, receive, resell. Three or four steps.',\n settings: [\n { id: 'title', type: 'text', label: 'Title', default: 'Como funciona' },\n { id: 'subtitle', type: 'text', label: 'Subtitle' },\n {\n id: 'items',\n type: 'list',\n label: 'Steps',\n required: true,\n help: 'Numbered automatically, in order.',\n of: [\n { id: 'icon', type: 'text', label: 'Icon', help: 'Lucide icon name in PascalCase, e.g. ShoppingCart, Truck, Repeat.' },\n { id: 'title', type: 'text', label: 'Title', required: true },\n { id: 'text', type: 'text', label: 'Detail' },\n ],\n },\n ],\n presets: [\n {\n name: 'Steps',\n props: {\n title: 'Como funciona',\n items: [\n { icon: 'Search', title: 'Escolha', text: 'Monte seu pedido no catálogo.' },\n { icon: 'ShoppingCart', title: 'Peça', text: 'Feche o carrinho em poucos cliques.' },\n { icon: 'Truck', title: 'Receba', text: 'Entrega rápida para todo o Brasil.' },\n ],\n },\n },\n ],\n enabledOn: ['home', 'catalog', 'collection', 'content'],\n} satisfies Omit<RegistryMeta, 'propsSchema'>\n\n// --- countdown ---------------------------------------------------------------\n\nexport interface CountdownMilestone {\n /** ISO date-time with offset, e.g. '2026-06-11T13:00:00-03:00'. */\n date: string\n /** Heading shown while this milestone is the next one, e.g. 'A Copa começa em'. */\n label: string\n}\n\nfunction useCountdown(target: number) {\n const [now, setNow] = useState(() => Date.now())\n useEffect(() => {\n const id = window.setInterval(() => setNow(Date.now()), 1000)\n return () => window.clearInterval(id)\n }, [])\n const diff = Math.max(0, target - now)\n const s = Math.floor(diff / 1000)\n return {\n days: Math.floor(s / 86400),\n hours: Math.floor((s % 86400) / 3600),\n minutes: Math.floor((s % 3600) / 60),\n seconds: s % 60,\n }\n}\n\n/** The milestone the timer should count to: the next future one, else the last. */\nexport function nextMilestone(\n milestones: readonly CountdownMilestone[],\n now: number,\n): CountdownMilestone | undefined {\n return milestones.find((m) => new Date(m.date).getTime() > now) ?? milestones[milestones.length - 1]\n}\n\nexport function CountdownBand({\n eyebrow,\n milestones = [],\n note,\n}: {\n eyebrow?: string\n milestones?: CountdownMilestone[]\n note?: string\n}) {\n const next = nextMilestone(milestones, Date.now())\n const target = next ? new Date(next.date).getTime() : Date.now()\n const t = useCountdown(target)\n if (!next) return null\n const cells: Array<[number, string]> = [\n [t.days, 'dias'],\n [t.hours, 'horas'],\n [t.minutes, 'min'],\n [t.seconds, 'seg'],\n ]\n return (\n <section data-testid=\"countdown-band\" className=\"bg-primary text-primary-foreground\">\n <div className=\"mx-auto max-w-4xl px-4 py-14 text-center sm:px-6\">\n {eyebrow && <p className=\"text-xs font-bold uppercase tracking-[0.22em] opacity-80\">{eyebrow}</p>}\n <h2 className=\"sf-heading mt-2 text-2xl font-bold sm:text-3xl\">{next.label}</h2>\n <div className=\"mt-8 flex justify-center gap-3 sm:gap-5\">\n {cells.map(([value, unit]) => (\n <div\n key={unit}\n className=\"min-w-[68px] bg-white/15 px-3 py-4 backdrop-blur sm:min-w-[92px]\"\n style={{ borderRadius: 'var(--sf-radius-card)' }}\n >\n <div className=\"text-3xl font-extrabold tabular-nums sm:text-5xl\">{String(value).padStart(2, '0')}</div>\n <div className=\"mt-1 text-[11px] font-semibold uppercase tracking-wider opacity-80\">{unit}</div>\n </div>\n ))}\n </div>\n {note && <p className=\"mt-6 text-sm opacity-80\">{note}</p>}\n </div>\n </section>\n )\n}\n\nexport const countdownBlockMeta = {\n label: 'Countdown',\n description:\n 'Live countdown to the next milestone in a list — a launch, an event, a season. Always ticks toward the next FUTURE date; after the last one it shows zeros.',\n settings: [\n { id: 'eyebrow', type: 'text', label: 'Eyebrow', default: 'Contagem regressiva' },\n {\n id: 'milestones',\n type: 'list',\n label: 'Milestones',\n required: true,\n help: 'Ordered by date. The heading changes as each milestone passes.',\n of: [\n { id: 'date', type: 'text', label: 'Date', help: \"ISO date-time with offset, e.g. '2026-06-11T13:00:00-03:00'.\", required: true },\n { id: 'label', type: 'text', label: 'Heading', help: 'Shown while this milestone is the next one.', required: true },\n ],\n },\n { id: 'note', type: 'text', label: 'Note', help: 'One line under the timer, e.g. \"Garanta antes do lançamento.\"' },\n ],\n presets: [\n {\n name: 'Countdown',\n props: {\n eyebrow: 'Contagem regressiva',\n milestones: [{ date: '2026-12-01T00:00:00-03:00', label: 'A nova coleção chega em' }],\n note: 'Garanta antes do lançamento.',\n },\n },\n ],\n enabledOn: ['home', 'catalog', 'collection', 'content'],\n} satisfies Omit<RegistryMeta, 'propsSchema'>\n\n// --- tiers -------------------------------------------------------------------\n\nexport interface TierItem {\n name: string\n /** What qualifies a buyer for this tier, e.g. 'Packs e caixas fechadas'. */\n qualifier?: string\n /** What the tier gets, e.g. '10% OFF com o cupom REVENDA10'. */\n detail?: string\n highlight?: boolean\n /** Badge on the highlighted card, e.g. 'Mais popular'. */\n badge?: string\n}\n\nexport function TierCards({\n eyebrow,\n title,\n subtitle,\n tiers = [],\n ctaLabel,\n ctaHref,\n}: {\n eyebrow?: string\n title?: string\n subtitle?: string\n tiers?: TierItem[]\n ctaLabel?: string\n ctaHref?: string\n}) {\n if (tiers.length === 0) return null\n const external = ctaHref ? /^[a-z]+:/.test(ctaHref) : false\n return (\n <section data-testid=\"tier-cards\" className=\"bg-muted/50\">\n <div className=\"mx-auto max-w-7xl px-4 py-16 sm:px-6\">\n {(eyebrow || title || subtitle) && (\n <div className=\"mb-10 max-w-2xl\">\n {eyebrow && <p className=\"text-xs font-bold uppercase tracking-[0.2em] text-primary\">{eyebrow}</p>}\n {title && <h2 className=\"sf-heading mt-2 text-3xl font-bold tracking-tight\">{title}</h2>}\n {subtitle && <p className=\"mt-3 text-muted-foreground\">{subtitle}</p>}\n </div>\n )}\n <div className=\"grid gap-5 md:grid-cols-3\">\n {tiers.map((tier) => (\n <div\n key={tier.name}\n className={`border p-6 ${tier.highlight ? 'border-primary bg-primary/5 ring-1 ring-primary' : 'bg-card'}`}\n style={{ borderRadius: 'var(--sf-radius-card)' }}\n >\n {tier.highlight && tier.badge && (\n <span className=\"mb-2 inline-block rounded-full bg-primary px-3 py-1 text-xs font-bold uppercase tracking-wide text-primary-foreground\">\n {tier.badge}\n </span>\n )}\n <h3 className=\"text-xl font-bold\">{tier.name}</h3>\n {tier.qualifier && <p className=\"mt-1 text-sm font-medium text-primary\">{tier.qualifier}</p>}\n {tier.detail && <p className=\"mt-3 text-sm text-muted-foreground\">{tier.detail}</p>}\n </div>\n ))}\n </div>\n {ctaLabel && ctaHref && (\n <div className=\"mt-10\">\n {external ? (\n <a\n href={ctaHref}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"sf-cta inline-flex items-center gap-2 bg-primary px-8 py-3.5 text-sm font-bold text-primary-foreground shadow-lg transition-all hover:-translate-y-0.5 hover:shadow-xl\"\n style={{ borderRadius: 'var(--sf-radius-button)' }}\n >\n {ctaLabel}\n </a>\n ) : (\n <Link\n to={ctaHref}\n className=\"sf-cta inline-flex items-center gap-2 bg-primary px-8 py-3.5 text-sm font-bold text-primary-foreground shadow-lg transition-all hover:-translate-y-0.5 hover:shadow-xl\"\n style={{ borderRadius: 'var(--sf-radius-button)' }}\n >\n {ctaLabel}\n </Link>\n )}\n </div>\n )}\n </div>\n </section>\n )\n}\n\nexport const tiersBlockMeta = {\n label: 'Tier cards',\n description:\n 'Volume/pricing tiers as cards — varejo, revenda, atacado — with one optionally highlighted and a call to action. The block figurinhas needed to sell wholesale.',\n settings: [\n { id: 'eyebrow', type: 'text', label: 'Eyebrow' },\n { id: 'title', type: 'text', label: 'Title' },\n { id: 'subtitle', type: 'text', label: 'Subtitle' },\n {\n id: 'tiers',\n type: 'list',\n label: 'Tiers',\n required: true,\n of: [\n { id: 'name', type: 'text', label: 'Name', required: true },\n { id: 'qualifier', type: 'text', label: 'Qualifier', help: 'What gets a buyer into this tier.' },\n { id: 'detail', type: 'text', label: 'Detail', help: 'What the tier gets.' },\n { id: 'highlight', type: 'boolean', label: 'Highlight', default: false },\n { id: 'badge', type: 'text', label: 'Badge', help: 'Shown on a highlighted card, e.g. \"Mais popular\".' },\n ],\n },\n { id: 'ctaLabel', type: 'text', label: 'CTA label' },\n { id: 'ctaHref', type: 'url', label: 'CTA link', help: 'Internal path or an external url (e.g. a WhatsApp link) — external opens a new tab.' },\n ],\n presets: [\n {\n name: 'Tier cards',\n props: {\n eyebrow: 'Atacado',\n title: 'Condições por volume',\n subtitle: 'Quanto maior o pedido, melhor o preço por unidade.',\n tiers: [\n { name: 'Varejo', qualifier: 'A partir de 1 unidade', detail: 'Preço de tabela, entrega rápida.' },\n { name: 'Revenda', qualifier: 'Caixas fechadas', detail: 'Desconto progressivo e reposição garantida.', highlight: true, badge: 'Mais popular' },\n { name: 'Atacado', qualifier: 'Grandes volumes', detail: 'Preço negociado e prazo dedicado.' },\n ],\n ctaLabel: 'Quero ser parceiro',\n ctaHref: '/catalog',\n },\n },\n ],\n enabledOn: ['home', 'catalog', 'collection', 'content'],\n} satisfies Omit<RegistryMeta, 'propsSchema'>\n","import React from 'react'\nimport { Check } from 'lucide-react'\nimport type { BlockNode, RegistryMeta } from '@fayz-ai/core'\nimport type { Product } from '@fayz-ai/shop/types'\nimport { useStorefrontConfig } from '../../document/config'\nimport { BlockDataError, useBlockData } from '../../blocks/page-data'\nimport { useStorefrontPageOptional } from '../../views/StorefrontPage'\nimport { bannerPlaceholder } from '../../blocks/sections'\nimport { formatMoney } from '../../lib/format'\nimport { Reveal } from '../../lib/motion'\nimport { Link } from '../../app/router'\nimport { TID } from '../../lib/testids'\nimport { SmoothImage } from '../SmoothImage'\n\n// ---------------------------------------------------------------------------\n// Collection blocks — the generic anatomy of a campaign page.\n//\n// Brand/collab landing pages converge on the same four parts: a co-branded\n// hero, a run of product spotlights alternating sides, a decorative motif\n// between them, and a closing CTA into the filtered catalog. These blocks are\n// that anatomy and nothing more — the palette, the motif, the copy and the\n// order all arrive as data from the app.\n//\n// They are ordinary registered blocks, so a campaign page is a `pages.content`\n// entry with a `theme` overlay, not a parallel page system with its own route.\n// The page's own slug is what a CTA defaults to filtering on, read from page\n// context so a page's data does not repeat its slug on every block.\n// ---------------------------------------------------------------------------\n\n/** The collection this block is rendering for: an explicit prop, else the\n * content page's slug. Null on the home page, where there is no collection. */\nfunction useCollectionSlug(explicit?: string): string | null {\n const page = useStorefrontPageOptional()\n if (explicit) return explicit\n if (page?.kind === 'content' || page?.kind === 'collection') return page.params.slug ?? null\n return null\n}\n\nfunction catalogFilterHref(catalogPath: string, slug: string | null): string {\n return slug ? `${catalogPath}?collection=${encodeURIComponent(slug)}` : catalogPath\n}\n\n// --- collectionHero ----------------------------------------------------------\n\nexport interface CollectionHeroProps {\n title: string\n eyebrow?: string\n tagline?: string\n /** Background art. Falls back to a gradient derived from `hue`. */\n image?: string\n imageAlt?: string\n hue?: number\n /** Brand lockup marks shown above the title (store logo + collection logo). */\n logos?: Array<{ src: string; alt: string }>\n cta?: string\n href?: string\n /** Collection tag the CTA filters on. Defaults to the page's own slug. */\n collection?: string\n align?: 'center' | 'start'\n /** Scrim strength over the art. Default 'dark'. */\n overlay?: 'dark' | 'soft' | 'none'\n height?: 'medium' | 'tall'\n}\n\nconst OVERLAY_CLASS = {\n dark: 'bg-gradient-to-t from-black/75 via-black/45 to-black/25',\n soft: 'bg-gradient-to-t from-black/45 via-black/20 to-transparent',\n none: '',\n} as const\n\nexport function CollectionHero({\n title,\n eyebrow,\n tagline,\n image,\n imageAlt,\n hue = 340,\n logos,\n cta,\n href,\n collection,\n align = 'center',\n overlay = 'dark',\n height = 'tall',\n}: CollectionHeroProps) {\n const config = useStorefrontConfig()\n const slug = useCollectionSlug(collection)\n const target = href ?? catalogFilterHref(config.catalogPath, slug)\n const centered = align === 'center'\n\n return (\n <section data-testid={TID.collectionHero} className=\"relative overflow-hidden\">\n <SmoothImage\n src={image ?? bannerPlaceholder(title, hue, hue + 40, 1600, 800)}\n alt={imageAlt ?? title}\n className={`w-full object-cover ${height === 'tall' ? 'h-[68vh] min-h-[420px]' : 'h-[46vh] min-h-[320px]'}`}\n />\n <div\n className={`absolute inset-0 flex flex-col justify-center p-6 text-white sm:p-12 ${OVERLAY_CLASS[overlay]} ${\n centered ? 'items-center text-center' : 'items-start text-left'\n }`}\n >\n <Reveal className={centered ? 'max-w-3xl' : 'max-w-2xl'}>\n {logos && logos.length > 0 && (\n <div className={`mb-6 flex items-center gap-5 ${centered ? 'justify-center' : ''}`}>\n {logos.map((logo, i) => (\n <React.Fragment key={logo.src}>\n {i > 0 && <span className=\"text-2xl font-light opacity-60\" aria-hidden>×</span>}\n <img src={logo.src} alt={logo.alt} className=\"h-10 w-auto object-contain sm:h-14\" />\n </React.Fragment>\n ))}\n </div>\n )}\n {eyebrow && (\n <p className=\"mb-3 text-xs font-semibold uppercase tracking-[0.28em] text-white/80\">{eyebrow}</p>\n )}\n <h1 className=\"sf-heading text-4xl font-bold leading-tight drop-shadow sm:text-6xl\">{title}</h1>\n {tagline && <p className=\"mt-4 max-w-xl text-lg leading-relaxed text-white/90\">{tagline}</p>}\n {cta && (\n <Link\n to={target}\n data-testid={TID.collectionHeroCta}\n className=\"sf-cta mt-8 inline-block bg-white px-9 py-3.5 font-semibold text-gray-900 shadow-lg transition-all hover:-translate-y-0.5 hover:shadow-xl\"\n style={{ borderRadius: 'var(--sf-radius-button)' }}\n >\n {cta}\n </Link>\n )}\n </Reveal>\n </div>\n </section>\n )\n}\n\nexport const collectionHeroBlockMeta = {\n label: 'Collection hero',\n description:\n 'Full-bleed campaign hero: co-branded lockup, title, tagline and one CTA into the collection.',\n settings: [\n { id: 'title', type: 'text', label: 'Title', required: true },\n { id: 'eyebrow', type: 'text', label: 'Eyebrow', help: 'Small caps label above the title, e.g. the drop name.' },\n { id: 'tagline', type: 'text', label: 'Tagline', help: 'One line under the title. Optional.' },\n { id: 'image', type: 'image', label: 'Background art', help: 'Wide shot, 1600×800 or larger. A generated gradient stands in while there is none.' },\n { id: 'imageAlt', type: 'text', label: 'Image alt text', help: 'Defaults to the title.' },\n { id: 'hue', type: 'number', label: 'Placeholder hue', help: 'Only used for the generated gradient, 0–360.', min: 0, max: 360, default: 340 },\n {\n id: 'logos',\n type: 'list',\n label: 'Brand lockup',\n help: 'Marks shown above the title, separated by ×. Usually the store logo and the collection logo.',\n of: [\n { id: 'src', type: 'image', label: 'Logo', required: true },\n { id: 'alt', type: 'text', label: 'Alt text', required: true },\n ],\n },\n { id: 'cta', type: 'text', label: 'Button text', help: 'Empty hides the button.' },\n {\n id: 'href',\n type: 'url',\n label: 'Button target',\n help: \"Defaults to the catalog filtered by this page's collection.\",\n },\n {\n id: 'collection',\n type: 'text',\n label: 'Collection tag',\n help: \"Matched against each product's `metadata.collection`. Defaults to this page's own slug — set it only when the page name and the tag differ.\",\n },\n {\n id: 'align',\n type: 'select',\n label: 'Alignment',\n options: [\n { value: 'center', label: 'Centered' },\n { value: 'start', label: 'Left' },\n ],\n default: 'center',\n },\n {\n id: 'overlay',\n type: 'select',\n label: 'Scrim',\n help: 'How much the art is darkened so the type stays readable. Use none only on art that is already dark.',\n options: [\n { value: 'dark', label: 'Dark' },\n { value: 'soft', label: 'Soft' },\n { value: 'none', label: 'None' },\n ],\n default: 'dark',\n },\n {\n id: 'height',\n type: 'select',\n label: 'Height',\n options: [\n { value: 'tall', label: 'Tall (68vh)' },\n { value: 'medium', label: 'Medium (46vh)' },\n ],\n default: 'tall',\n },\n ],\n presets: [\n {\n name: 'Campaign hero',\n props: {\n eyebrow: 'coleção',\n title: 'A nova coleção chegou',\n tagline: 'Peças desenhadas para durar mais de uma estação.',\n cta: 'Ver a coleção',\n align: 'center',\n overlay: 'dark',\n height: 'tall',\n },\n },\n ],\n enabledOn: ['home', 'collection', 'content'],\n} satisfies Omit<RegistryMeta, 'propsSchema'>\n\n// --- productSpotlight --------------------------------------------------------\n\nexport interface ProductSpotlightProps {\n title: string\n eyebrow?: string\n description?: string\n /** Feature bullets rendered with a check mark. */\n features?: readonly string[]\n image?: string\n imageAlt?: string\n hue?: number\n /** Which side the art sits on. Alternate these down the page. */\n side?: 'left' | 'right'\n /**\n * The product this spotlights, by URL slug. When set, the block resolves the\n * live product to show its price and link straight to the PDP — so a\n * spotlight can never advertise a price the catalog no longer charges, or\n * point at a product that isn't there.\n */\n productSlug?: string\n cta?: string\n href?: string\n /** Tint behind the art. Defaults to the page's own surface. */\n background?: string\n /** The block node, when rendered from a tree — carries instance `data` overrides. */\n node?: BlockNode\n}\n\nexport function ProductSpotlight({\n title,\n eyebrow,\n description,\n features,\n image,\n imageAlt,\n hue = 200,\n side = 'left',\n productSlug,\n cta,\n href,\n background,\n node,\n}: ProductSpotlightProps) {\n const config = useStorefrontConfig()\n // The declared read, through the same loader the product page uses — so a\n // spotlight shows the catalog's current price rather than a copy of it that\n // silently goes stale. A document instance may rebind the slug to a route\n // param like any other block need.\n const { status, data, error, loader } = useBlockData<Product | null>(node, 'product', {\n loader: 'products.bySlug',\n params: { slug: productSlug },\n })\n const product = productSlug ? (data ?? null) : null\n\n const target = product ? `/product/${product.slug}` : href\n const art = image ?? product?.images?.[0]?.url ?? bannerPlaceholder(title, hue, hue + 45, 1200, 1200)\n const label = cta ?? (productSlug ? 'Comprar' : undefined)\n const artFirst = side === 'left'\n\n if (productSlug && status === 'error') return <BlockDataError loader={loader} message={error} />\n\n return (\n <section\n data-testid={TID.productSpotlight}\n data-product-slug={productSlug}\n className=\"py-14 sm:py-20\"\n style={background ? { background } : undefined}\n >\n <div className=\"mx-auto grid max-w-6xl items-center gap-10 px-4 sm:px-6 md:grid-cols-2 md:gap-16\">\n <Reveal className={artFirst ? 'md:order-1' : 'md:order-2'}>\n <SmoothImage\n src={art}\n alt={imageAlt ?? product?.name ?? title}\n className=\"aspect-square w-full object-cover\"\n style={{ borderRadius: 'var(--sf-radius-card)' }}\n />\n </Reveal>\n <Reveal delay={120} className={artFirst ? 'md:order-2' : 'md:order-1'}>\n {eyebrow && (\n <p className=\"mb-2 text-xs font-semibold uppercase tracking-[0.22em] text-primary\">{eyebrow}</p>\n )}\n <h2 className=\"sf-heading text-3xl font-bold leading-tight sm:text-4xl\">{title}</h2>\n {description && <p className=\"mt-4 leading-7 text-muted-foreground\">{description}</p>}\n {features && features.length > 0 && (\n <ul className=\"mt-6 space-y-2.5\">\n {features.map((feature) => (\n <li key={feature} className=\"flex items-start gap-2.5\">\n <Check className=\"mt-0.5 h-5 w-5 shrink-0 text-primary\" aria-hidden />\n <span className=\"leading-6\">{feature}</span>\n </li>\n ))}\n </ul>\n )}\n {product && (\n <p className=\"mt-6 text-2xl font-bold\">\n {formatMoney(product.price, config.currency, config.locale)}\n </p>\n )}\n {label && target && (\n <Link\n to={target}\n data-testid={TID.productSpotlightCta}\n className=\"sf-cta mt-6 inline-block bg-primary px-8 py-3 font-semibold text-primary-foreground shadow-sm transition-all hover:-translate-y-0.5 hover:shadow-md\"\n style={{ borderRadius: 'var(--sf-radius-button)' }}\n >\n {label}\n </Link>\n )}\n </Reveal>\n </div>\n </section>\n )\n}\n\nexport const productSpotlightBlockMeta = {\n label: 'Product spotlight',\n description:\n 'One product argued at length: art on one side, copy and feature bullets on the other, with the live price and a link to its page.',\n settings: [\n { id: 'title', type: 'text', label: 'Title', required: true },\n { id: 'eyebrow', type: 'text', label: 'Eyebrow', help: 'Small caps label above the title.' },\n { id: 'description', type: 'richtext', label: 'Description', help: 'A paragraph on why this product is worth the page.' },\n {\n id: 'features',\n type: 'list',\n label: 'Feature bullets',\n help: 'Short claims, each rendered with a check mark.',\n of: [{ id: 'text', type: 'text', label: 'Bullet', required: true }],\n },\n {\n id: 'productSlug',\n // A real catalog entity backs this, so the author gets a picker. The\n // value is the product's URL slug — the same one products.bySlug reads.\n type: 'product',\n label: 'Product',\n help: \"The product's URL slug. Setting it makes the block show the catalog's current price and link to the product page; leave it empty for a purely editorial panel.\",\n },\n { id: 'image', type: 'image', label: 'Art', help: \"Defaults to the product's first photo, then to a generated gradient.\" },\n { id: 'imageAlt', type: 'text', label: 'Image alt text', help: 'Defaults to the product name, then the title.' },\n { id: 'hue', type: 'number', label: 'Placeholder hue', help: 'Only used for the generated gradient, 0–360.', min: 0, max: 360, default: 200 },\n {\n id: 'side',\n type: 'select',\n label: 'Art side',\n help: 'Alternate this down the page so consecutive spotlights do not read as one column.',\n options: [\n { value: 'left', label: 'Left' },\n { value: 'right', label: 'Right' },\n ],\n default: 'left',\n },\n { id: 'cta', type: 'text', label: 'Button text', help: \"Defaults to 'Comprar' when a product is set.\" },\n { id: 'href', type: 'url', label: 'Button target', help: 'Only used when no product is set — with one, the button goes to its page.' },\n { id: 'background', type: 'color', label: 'Background tint', help: 'Behind the whole band. Empty keeps the page surface.' },\n ],\n presets: [\n {\n name: 'Product spotlight',\n props: {\n eyebrow: 'destaque',\n title: 'O produto da coleção',\n description: 'Por que esta peça existe, e para quem.',\n side: 'left',\n },\n },\n ],\n enabledOn: ['home', 'collection', 'content'],\n // The declared read (M3). An instance may rebind the slug to a route param:\n // data: { product: { loader: 'products.bySlug', params: { slug: { $param: 'slug' } } } }\n data: { product: { loader: 'products.bySlug' } },\n} satisfies Omit<RegistryMeta, 'propsSchema'>\n\n// --- motifStrip --------------------------------------------------------------\n\nexport interface MotifStripProps {\n /** Repeated mark — an emoji, or an image URL when `src` is set. */\n symbol?: string\n src?: string\n alt?: string\n /** How many times the mark repeats across the strip. Default 12. */\n count?: number\n background?: string\n height?: 'thin' | 'regular'\n}\n\n/**\n * A decorative band between spotlights. Purely ornamental, so the whole strip\n * is hidden from assistive tech rather than read out as a row of symbols.\n */\nexport function MotifStrip({\n symbol,\n src,\n alt,\n count = 12,\n background,\n height = 'regular',\n}: MotifStripProps) {\n const marks = Array.from({ length: Math.max(1, Math.min(count, 40)) })\n return (\n <div\n data-testid={TID.motifStrip}\n aria-hidden\n className={`flex items-center justify-center gap-5 overflow-hidden ${\n height === 'thin' ? 'py-4' : 'py-7'\n }`}\n style={background ? { background } : undefined}\n >\n {marks.map((_, i) =>\n src ? (\n <img key={i} src={src} alt={alt ?? ''} className=\"h-8 w-auto shrink-0 object-contain opacity-80 sm:h-10\" />\n ) : (\n <span key={i} className=\"shrink-0 text-2xl opacity-80 sm:text-3xl\">\n {symbol ?? '●'}\n </span>\n ),\n )}\n </div>\n )\n}\n\nexport const motifStripBlockMeta = {\n label: 'Motif strip',\n description: 'A decorative band of a repeated mark, for breathing room between spotlights.',\n settings: [\n { id: 'symbol', type: 'text', label: 'Symbol', help: 'A single character or emoji. Ignored when an image is set.', default: '●' },\n { id: 'src', type: 'image', label: 'Mark image', help: 'Use instead of a symbol — a small logo or icon.' },\n { id: 'alt', type: 'text', label: 'Image alt text', help: 'Usually empty: the strip is decoration and is hidden from screen readers.' },\n { id: 'count', type: 'number', label: 'Repeats', help: 'How many marks across the strip. Capped at 40.', min: 1, max: 40, default: 12 },\n { id: 'background', type: 'color', label: 'Background', help: 'Empty keeps the page surface.' },\n {\n id: 'height',\n type: 'select',\n label: 'Height',\n options: [\n { value: 'regular', label: 'Regular' },\n { value: 'thin', label: 'Thin' },\n ],\n default: 'regular',\n },\n ],\n presets: [{ name: 'Motif strip', props: { symbol: '●', count: 12, height: 'regular' } }],\n enabledOn: ['home', 'collection', 'content'],\n} satisfies Omit<RegistryMeta, 'propsSchema'>\n\n// --- collectionCta -----------------------------------------------------------\n\nexport interface CollectionCtaProps {\n title: string\n subtitle?: string\n eyebrow?: string\n cta?: string\n href?: string\n /** Collection tag the CTA filters on. Defaults to the page's own slug. */\n collection?: string\n background?: string\n}\n\n/**\n * The closing band. Defaults to this collection's own catalog filter, which is\n * the point of serving the page from the store: the CTA stays inside the same\n * session and cart instead of handing the shopper off to another site.\n */\nexport function CollectionCta({\n title,\n subtitle,\n eyebrow,\n cta,\n href,\n collection,\n background,\n}: CollectionCtaProps) {\n const config = useStorefrontConfig()\n const slug = useCollectionSlug(collection)\n const target = href ?? catalogFilterHref(config.catalogPath, slug)\n\n return (\n <section\n data-testid={TID.collectionCta}\n className=\"bg-primary py-16 text-primary-foreground\"\n style={background ? { background } : undefined}\n >\n <Reveal className=\"mx-auto max-w-2xl px-4 text-center sm:px-6\">\n {eyebrow && (\n <p className=\"mb-3 text-xs font-semibold uppercase tracking-[0.28em] opacity-80\">{eyebrow}</p>\n )}\n <h2 className=\"sf-heading text-3xl font-bold sm:text-4xl\">{title}</h2>\n {subtitle && <p className=\"mt-3 opacity-90\">{subtitle}</p>}\n <Link\n to={target}\n data-testid={TID.collectionCtaButton}\n className=\"sf-cta mt-8 inline-block bg-background px-9 py-3.5 font-semibold text-foreground shadow-lg transition-all hover:-translate-y-0.5 hover:shadow-xl\"\n style={{ borderRadius: 'var(--sf-radius-button)' }}\n >\n {cta ?? 'Ver a coleção'}\n </Link>\n </Reveal>\n </section>\n )\n}\n\nexport const collectionCtaBlockMeta = {\n label: 'Collection CTA',\n description:\n \"The closing band of a campaign page — one button into the catalog filtered by this collection, so the shopper never leaves the store's own cart and session.\",\n settings: [\n { id: 'title', type: 'text', label: 'Title', required: true },\n { id: 'subtitle', type: 'text', label: 'Subtitle', help: 'One line under the title. Optional.' },\n { id: 'eyebrow', type: 'text', label: 'Eyebrow', help: 'Small caps label above the title.' },\n { id: 'cta', type: 'text', label: 'Button text', default: 'Ver a coleção' },\n {\n id: 'href',\n type: 'url',\n label: 'Button target',\n help: \"Defaults to the catalog filtered by this page's collection — which is the point of the block. Override only to send the shopper somewhere else.\",\n },\n {\n id: 'collection',\n type: 'text',\n label: 'Collection tag',\n help: \"Matched against each product's `metadata.collection`. Defaults to this page's own slug.\",\n },\n { id: 'background', type: 'color', label: 'Background', help: \"Empty uses the page theme's primary colour.\" },\n ],\n presets: [\n {\n name: 'Collection CTA',\n props: { title: 'Leve a coleção inteira', subtitle: 'Todas as peças, em um lugar só.', cta: 'Ver a coleção' },\n },\n ],\n enabledOn: ['home', 'collection', 'content'],\n} satisfies Omit<RegistryMeta, 'propsSchema'>\n","import React, { useState } from 'react'\nimport { getLucideIcon } from '@fayz-ai/ui/icons'\nimport type { RegistryMeta } from '@fayz-ai/core'\nimport { bannerPlaceholder } from '../../blocks/sections'\nimport { Reveal } from '../../lib/motion'\nimport { Link } from '../../app/router'\nimport { TID } from '../../lib/testids'\nimport { SmoothImage } from '../SmoothImage'\n\nfunction Icon({ name, className }: { name: string; className?: string }) {\n const C = getLucideIcon(name)\n return C ? <C className={className} /> : null\n}\n\nexport interface BenefitItem {\n /** Lucide icon name in PascalCase. Ignored when `image` is set. */\n icon?: string\n /** Drawn/brand artwork instead of an icon glyph — the reason compactor forked\n * this block: their four benefit marks are illustrations, and swapping them\n * for outline glyphs would have quietly changed the brand. */\n image?: string\n title: string\n text?: string\n}\n\n// Array props default to empty throughout this file. A block inserted from the\n// editor arrives before its content does, and `items.slice()` on undefined\n// throws — taking down the whole page, not just the section.\nexport function BenefitsRow({\n items = [],\n layout = 'grid',\n}: {\n items?: BenefitItem[]\n layout?: 'grid' | 'strip'\n}) {\n if (items.length === 0) return null\n\n const mark = (item: BenefitItem) =>\n item.image ? (\n <img src={item.image} alt=\"\" loading=\"lazy\" className=\"h-6 w-auto shrink-0\" />\n ) : (\n <span className=\"flex h-12 w-12 shrink-0 items-center justify-center rounded-full bg-primary/10\">\n <Icon name={item.icon ?? ''} className=\"h-6 w-6 text-primary\" />\n </span>\n )\n\n if (layout === 'strip') {\n // Scrolls horizontally under ~640px rather than wrapping into cramped\n // rows — a strip is a glance, not a reading task (compactor's layout).\n return (\n <section data-testid={TID.benefits} className=\"border-y bg-card\">\n <ul className=\"mx-auto flex max-w-7xl snap-x gap-6 overflow-x-auto px-4 py-4 sm:gap-8 sm:px-6 md:justify-center md:overflow-visible\">\n {items.map((item) => (\n <li key={item.title} className=\"flex shrink-0 snap-start items-center gap-3\">\n {mark(item)}\n <div className=\"min-w-0\">\n <p className=\"whitespace-nowrap text-sm font-semibold leading-tight\">{item.title}</p>\n {item.text && (\n <p className=\"whitespace-nowrap text-xs leading-tight text-muted-foreground\">{item.text}</p>\n )}\n </div>\n </li>\n ))}\n </ul>\n </section>\n )\n }\n\n return (\n <section data-testid={TID.benefits} className=\"border-y bg-card\">\n <div className=\"mx-auto grid max-w-7xl grid-cols-1 gap-6 px-4 py-9 sm:grid-cols-3 sm:px-6\">\n {items.slice(0, 4).map((item, i) => (\n <Reveal key={i} delay={i * 120} className=\"flex items-center justify-center gap-3 text-center sm:text-left\">\n {mark(item)}\n <div>\n <p className=\"font-semibold\">{item.title}</p>\n {item.text && <p className=\"text-sm text-muted-foreground\">{item.text}</p>}\n </div>\n </Reveal>\n ))}\n </div>\n </section>\n )\n}\n\nexport const benefitsBlockMeta = {\n label: 'Benefits row',\n description: 'Compact row of trust badges — shipping, payment, guarantees.',\n settings: [\n {\n id: 'items',\n type: 'list',\n label: 'Benefits',\n help: 'Three reads best (the grid renders at most four); the strip layout scrolls and renders all.',\n required: true,\n of: [\n {\n id: 'icon',\n type: 'text',\n label: 'Icon',\n help: 'Lucide icon name in PascalCase, e.g. Truck, ShieldCheck, CreditCard, RotateCcw, Leaf. An unknown name simply renders no icon.',\n },\n {\n id: 'image',\n type: 'image',\n label: 'Icon image',\n help: 'Brand artwork instead of an icon glyph — wins over the icon name when set.',\n },\n { id: 'title', type: 'text', label: 'Title', help: 'The promise itself, e.g. \"Frete grátis acima de R$ 199\".', required: true },\n { id: 'text', type: 'text', label: 'Detail', help: 'One short qualifying line under the title.' },\n ],\n },\n {\n id: 'layout',\n type: 'select',\n label: 'Layout',\n default: 'grid',\n help: 'Grid centres up to four; strip is a single horizontally-scrolling line, right under a hero.',\n options: [\n { value: 'grid', label: 'Grid' },\n { value: 'strip', label: 'Strip' },\n ],\n },\n ],\n presets: [\n {\n name: 'Benefits row',\n props: {\n items: [\n { icon: 'Truck', title: 'Frete para todo o Brasil', text: 'Envio em até 48h' },\n { icon: 'CreditCard', title: 'Parcele em até 10x', text: 'Ou 5% off no PIX' },\n { icon: 'ShieldCheck', title: 'Compra segura', text: 'Seus dados protegidos' },\n ],\n },\n },\n ],\n // Reassurance is welcome on every surface, and it is small enough to repeat.\n enabledOn: ['home', 'catalog', 'product', 'collection', 'content'],\n} satisfies Omit<RegistryMeta, 'propsSchema'>\n\nexport function PromoBanner({\n title,\n subtitle,\n eyebrow,\n cta,\n href,\n image,\n hue = 160,\n}: {\n title: string\n subtitle?: string\n eyebrow?: string\n cta?: string\n href?: string\n image?: string\n hue?: number\n}) {\n return (\n <section data-testid={TID.promoBanner} className=\"group relative my-12 overflow-hidden\">\n <SmoothImage\n src={image ?? bannerPlaceholder(title, hue, hue + 50, 1600, 420)}\n alt={title}\n className=\"h-80 w-full object-cover transition-transform duration-700 ease-out group-hover:scale-105\"\n />\n <div className=\"absolute inset-0 flex flex-col items-center justify-center bg-gradient-to-t from-black/65 via-black/35 to-black/20 p-6 text-center text-white\">\n <Reveal>\n {eyebrow && (\n <p className=\"mb-2 text-xs font-semibold uppercase tracking-[0.25em] text-white/80\">{eyebrow}</p>\n )}\n <h2 className=\"sf-heading text-3xl font-bold drop-shadow sm:text-5xl\">{title}</h2>\n {subtitle && <p className=\"mt-3 max-w-lg text-white/90\">{subtitle}</p>}\n {cta && (\n <Link\n to={href ?? '/catalog'}\n className=\"sf-cta mt-6 inline-block bg-white px-8 py-3 font-semibold text-gray-900 shadow-lg transition-all hover:-translate-y-0.5 hover:shadow-xl\"\n style={{ borderRadius: 'var(--sf-radius-button)' }}\n >\n {cta}\n </Link>\n )}\n </Reveal>\n </div>\n </section>\n )\n}\n\nexport const bannerBlockMeta = {\n label: 'Promo banner',\n description: 'Wide image banner with centred copy and a single call to action.',\n settings: [\n { id: 'eyebrow', type: 'text', label: 'Eyebrow', help: 'Small uppercase label above the title, e.g. \"oferta da semana\".' },\n { id: 'title', type: 'text', label: 'Title', help: 'Also used as the image alt text.', required: true },\n { id: 'subtitle', type: 'text', label: 'Subtitle' },\n { id: 'cta', type: 'text', label: 'Button label', help: 'Leave empty to render no button.' },\n { id: 'href', type: 'url', label: 'Button link', help: 'Defaults to /catalog.' },\n {\n id: 'image',\n type: 'image',\n label: 'Background image',\n help: 'Optional — a gradient generated from the hue below is used when empty.',\n },\n {\n id: 'hue',\n type: 'number',\n label: 'Placeholder hue',\n help: 'Colour of the generated gradient, 0–360. Ignored once an image is set.',\n min: 0,\n max: 360,\n default: 160,\n },\n ],\n presets: [\n {\n name: 'Promo banner',\n props: {\n eyebrow: 'oferta da semana',\n title: 'Até 25% off na seleção',\n subtitle: 'Peças escolhidas a dedo, estoque limitado.',\n cta: 'Conferir',\n href: '/catalog',\n hue: 340,\n },\n },\n ],\n // A merchandising interruption between sections — it competes with the buy box\n // on a product page.\n enabledOn: ['home', 'catalog', 'collection', 'content'],\n} satisfies Omit<RegistryMeta, 'propsSchema'>\n\nexport function ManifestoBlock({ title, text }: { title?: string; text: string }) {\n return (\n <section data-testid={TID.manifesto} className=\"mx-auto max-w-3xl px-4 py-14 text-center sm:px-6\">\n {title && <h2 className=\"sf-heading mb-5 text-2xl font-bold\">{title}</h2>}\n <p className=\"sf-heading text-xl leading-relaxed text-muted-foreground sm:text-2xl\">{text}</p>\n </section>\n )\n}\n\nexport const manifestoBlockMeta = {\n label: 'Manifesto',\n description: 'Centred brand statement — a paragraph of voice between two commercial sections.',\n settings: [\n { id: 'title', type: 'text', label: 'Title', help: 'Optional heading above the statement, e.g. \"Nossa história\".' },\n {\n id: 'text',\n type: 'richtext',\n label: 'Statement',\n help: 'Two or three sentences about what the brand stands for. Rendered large and centred, so keep it under ~40 words.',\n required: true,\n },\n ],\n presets: [\n {\n name: 'Manifesto',\n props: {\n title: 'Nossa história',\n text: 'Acreditamos em fazer pouco e fazer bem: ingredientes honestos, produção em pequena escala e cuidado em cada detalhe — do primeiro esboço à caixa que chega na sua casa.',\n },\n },\n ],\n // Brand voice: belongs where someone is still deciding, not on the buy page.\n enabledOn: ['home', 'collection', 'content'],\n} satisfies Omit<RegistryMeta, 'propsSchema'>\n\nexport function Testimonials({\n title,\n items = [],\n}: {\n title?: string\n items?: Array<{ quote: string; author: string }>\n}) {\n if (items.length === 0) return null\n return (\n <section data-testid={TID.testimonials} className=\"bg-muted/50 py-14\">\n <div className=\"mx-auto max-w-7xl px-4 sm:px-6\">\n {title && (\n <Reveal>\n <h2 className=\"sf-heading mb-10 text-center text-3xl font-bold\">{title}</h2>\n </Reveal>\n )}\n <div className=\"grid gap-6 md:grid-cols-3\">\n {items.slice(0, 3).map((t, i) => (\n <Reveal key={i} delay={i * 130}>\n <figure\n className=\"h-full bg-card p-7 shadow-sm transition-shadow hover:shadow-md\"\n style={{ borderRadius: 'var(--sf-radius-card)' }}\n >\n <div className=\"mb-3 text-primary\" aria-hidden>★★★★★</div>\n <blockquote className=\"leading-relaxed\">“{t.quote}”</blockquote>\n <figcaption className=\"mt-4 text-sm font-semibold text-muted-foreground\">— {t.author}</figcaption>\n </figure>\n </Reveal>\n ))}\n </div>\n </div>\n </section>\n )\n}\n\nexport const testimonialsBlockMeta = {\n label: 'Testimonials',\n description: 'Three customer quotes as cards, with a five-star mark.',\n settings: [\n { id: 'title', type: 'text', label: 'Title', help: 'Optional heading above the cards, e.g. \"O que dizem sobre nós\".' },\n {\n id: 'items',\n type: 'list',\n label: 'Quotes',\n help: 'Three fill the grid; only the first three are rendered.',\n required: true,\n of: [\n {\n id: 'quote',\n type: 'text',\n label: 'Quote',\n help: 'One or two sentences, no surrounding quotation marks — the block adds them.',\n required: true,\n },\n { id: 'author', type: 'text', label: 'Author', help: 'Name as it should appear, e.g. \"Mariana C.\".', required: true },\n ],\n },\n ],\n presets: [\n {\n name: 'Testimonials',\n props: {\n title: 'O que dizem sobre nós',\n items: [\n { quote: 'Acabamento perfeito, superou a expectativa.', author: 'Mariana C.' },\n { quote: 'Atendimento impecável do pedido à entrega.', author: 'Jorge L.' },\n { quote: 'Virou minha loja favorita para presentes.', author: 'Paula R.' },\n ],\n },\n },\n ],\n // Social proof helps most where the decision happens, including the product page.\n enabledOn: ['home', 'catalog', 'product', 'collection', 'content'],\n} satisfies Omit<RegistryMeta, 'propsSchema'>\n\nexport function NewsletterBand({ title, subtitle }: { title?: string; subtitle?: string }) {\n const [email, setEmail] = useState('')\n const [done, setDone] = useState(false)\n return (\n <section data-testid={TID.newsletter} className=\"bg-primary py-16 text-primary-foreground\">\n <Reveal className=\"mx-auto max-w-xl px-4 text-center sm:px-6\">\n <h2 className=\"sf-heading text-3xl font-bold\">{title ?? 'Receba nossas novidades'}</h2>\n {subtitle && <p className=\"mt-2 opacity-90\">{subtitle}</p>}\n {done ? (\n <p data-testid={TID.newsletterDone} className=\"mt-6 font-medium\">Inscrição confirmada! 🎉</p>\n ) : (\n <form\n className=\"mt-6 flex gap-2\"\n onSubmit={(e) => {\n e.preventDefault()\n if (email.trim()) setDone(true)\n }}\n >\n <input\n data-testid={TID.newsletterEmail}\n type=\"email\"\n required\n placeholder=\"Seu e-mail\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n className=\"flex-1 border-0 bg-white/95 px-4 py-3 text-sm text-gray-900 outline-none\"\n style={{ borderRadius: 'var(--sf-radius-input)' }}\n />\n <button\n type=\"submit\"\n data-testid={TID.newsletterSubmit}\n className=\"sf-cta bg-foreground px-6 py-3 text-sm font-semibold text-background\"\n style={{ borderRadius: 'var(--sf-radius-button)' }}\n >\n Assinar\n </button>\n </form>\n )}\n </Reveal>\n </section>\n )\n}\n\nexport const newsletterBlockMeta = {\n label: 'Newsletter band',\n description: 'Full-width e-mail capture band in the primary colour.',\n settings: [\n {\n id: 'title',\n type: 'text',\n label: 'Title',\n help: 'Falls back to \"Receba nossas novidades\" when empty.',\n default: 'Receba nossas novidades',\n },\n {\n id: 'subtitle',\n type: 'text',\n label: 'Subtitle',\n help: 'One line on what subscribers actually get — omit it and only the title shows.',\n },\n ],\n presets: [\n {\n name: 'Newsletter band',\n props: {\n title: 'Receba nossas novidades',\n subtitle: 'Lançamentos, histórias e cupons — direto no seu e-mail.',\n },\n },\n ],\n // A closing band: no layout demands and useful at the bottom of any page.\n enabledOn: ['home', 'catalog', 'product', 'collection', 'content'],\n} satisfies Omit<RegistryMeta, 'propsSchema'>\n","import React from 'react'\nimport type { RegistryMeta } from '@fayz-ai/core'\nimport { CatalogPage } from '../../views/CatalogPage'\nimport { ProductDetailPage } from '../../views/ProductDetailPage'\nimport { useStorefrontPage } from '../../views/StorefrontPage'\n\n// ---------------------------------------------------------------------------\n// The native page bodies, as blocks.\n//\n// This is the whole point of Fase 2: `catalogBody` and `productBody` are what a\n// store composes AROUND. Before this, adding a banner above the catalog grid\n// meant reimplementing the catalog page and permanently forfeiting SDK updates\n// to it. Now the grid is a block in a list, and the SDK keeps maintaining it.\n//\n// Shopify calls this section `main` and requires it in every template; VTEX\n// ships `product-details` for the same reason. Neither lets a theme add\n// something above the fold by taking ownership of the fold.\n//\n// Neither block takes settings. That is a real answer, not an omission: the\n// catalog's behaviour is driven by the catalog store (filters, sort, search, all\n// URL-synced) and the product's by the route slug. A setting here would be a\n// second, competing source of truth for state the page already owns.\n// ---------------------------------------------------------------------------\n\nexport function CatalogBodyBlock() {\n return <CatalogPage />\n}\n\nexport const catalogBodyBlockMeta = {\n label: 'Product list',\n description:\n 'The catalog page itself — filters, sort and the product grid. Place blocks before or after it to frame the list without owning it.',\n settings: [],\n presets: [{ name: 'Product list' }],\n enabledOn: ['catalog'],\n // The catalog's INITIAL read (default sort, no filters), declared so the\n // page resolver answers it before the grid asks. Interactive refinements\n // (search, category, sort changes) are runtime state, fetched by the page\n // through the same loader as they happen — moving those into declarations\n // is the M9 rewire.\n data: { products: { loader: 'products.list', params: { sort: 'newest' } } },\n} satisfies Omit<RegistryMeta, 'propsSchema'>\n\nexport function ProductBodyBlock() {\n // The slug comes from the route, through page context — not from a prop the\n // store would have to thread through every block above this one.\n const { params } = useStorefrontPage()\n return <ProductDetailPage slug={params.slug ?? ''} />\n}\n\nexport const productBodyBlockMeta = {\n label: 'Product detail',\n description:\n 'The product page itself — gallery, price, options and the buy button. Place blocks before or after it to add store-specific content around the buying decision.',\n settings: [],\n presets: [{ name: 'Product detail' }],\n enabledOn: ['product'],\n // The product read, bound to the route: the resolver answers it and\n // `useProduct(slug)` inside the page consumes the same key, so the page\n // renders from one fetch. Related products / everything else the detail\n // page reads stays internal until the M9 rewire.\n data: { product: { loader: 'products.bySlug', params: { slug: { $param: 'slug' } } } },\n} satisfies Omit<RegistryMeta, 'propsSchema'>\n","import { defineBlock } from '@fayz-ai/core'\nimport type { BlockNode } from '@fayz-ai/core'\nimport type { StorefrontSection } from './sections'\nimport { registerStorefrontLoaders } from '../data/loaders'\nimport { HeroSection, heroBlockMeta } from '../components/marketing/HeroSection'\nimport { CategoryShowcase, categoriesBlockMeta } from '../components/collection/CategoryShowcase'\nimport { ProductRail, productsBlockMeta } from '../components/product/ProductRail'\nimport { MediaCarousel, mediaCarouselBlockMeta } from '../components/marketing/MediaCarousel'\nimport { ProductSlider, productSliderBlockMeta } from '../components/product/ProductSlider'\nimport {\n CatalogBodyBlock,\n catalogBodyBlockMeta,\n ProductBodyBlock,\n productBodyBlockMeta,\n} from '../components/layout/PageBodyBlocks'\nimport { FormBlock, formBlockMeta } from '../components/marketing/FormBlock'\nimport { EntityListBlock, entityListBlockMeta } from '../components/marketing/EntityList'\nimport {\n SealsBand,\n sealsBlockMeta,\n StoryQuote,\n storyQuoteBlockMeta,\n ImageTiles,\n imageTilesBlockMeta,\n FaqSection,\n faqBlockMeta,\n} from '../components/marketing/EditorialSections'\nimport {\n StepsSection,\n stepsBlockMeta,\n CountdownBand,\n countdownBlockMeta,\n TierCards,\n tiersBlockMeta,\n} from '../components/marketing/ConversionSections'\nimport {\n CollectionHero,\n collectionHeroBlockMeta,\n ProductSpotlight,\n productSpotlightBlockMeta,\n MotifStrip,\n motifStripBlockMeta,\n CollectionCta,\n collectionCtaBlockMeta,\n} from '../components/marketing/CollectionSections'\nimport {\n BenefitsRow,\n benefitsBlockMeta,\n PromoBanner,\n bannerBlockMeta,\n ManifestoBlock,\n manifestoBlockMeta,\n Testimonials,\n testimonialsBlockMeta,\n NewsletterBand,\n newsletterBlockMeta,\n} from '../components/marketing/MiscSections'\n\n// ---------------------------------------------------------------------------\n// Storefront blocks — the section components registered into the universal\n// block registry. This replaces HomePage's hardcoded switch: a home page is now\n// a block tree (`{ type, props }[]`) resolved through the registry, identical\n// to how admin pages will compose. Section prop shapes are unchanged, so the\n// components are registered directly.\n// ---------------------------------------------------------------------------\n\nlet registered = false\n\nexport function registerStorefrontBlocks(): void {\n if (registered) return\n registered = true\n // The SDK blocks declare data needs against the SDK loaders, so the two\n // registries are one registration surface: wherever blocks exist, the\n // loaders their needs name exist too (I2 would report them otherwise).\n registerStorefrontLoaders()\n // Each block's schema lives WITH its component (`<name>BlockMeta`), not here.\n // Colocation is what keeps the two from drifting: a prop added to the section\n // and a setting describing it are then one file apart, not two directories.\n defineBlock('hero', HeroSection, { source: 'sdk', ...heroBlockMeta })\n defineBlock('mediaCarousel', MediaCarousel, { source: 'sdk', ...mediaCarouselBlockMeta })\n defineBlock('categories', CategoryShowcase, { source: 'sdk', ...categoriesBlockMeta })\n defineBlock('products', ProductRail, { source: 'sdk', ...productsBlockMeta })\n defineBlock('productSlider', ProductSlider, { source: 'sdk', ...productSliderBlockMeta })\n defineBlock('benefits', BenefitsRow, { source: 'sdk', ...benefitsBlockMeta })\n defineBlock('banner', PromoBanner, { source: 'sdk', ...bannerBlockMeta })\n defineBlock('manifesto', ManifestoBlock, { source: 'sdk', ...manifestoBlockMeta })\n defineBlock('testimonials', Testimonials, { source: 'sdk', ...testimonialsBlockMeta })\n defineBlock('newsletter', NewsletterBand, { source: 'sdk', ...newsletterBlockMeta })\n defineBlock('form', FormBlock, { source: 'sdk', ...formBlockMeta })\n // The generic block over declared entities (M4): one block, any defineEntity\n // kind, reading through entity.list — never a per-entity component fork.\n defineBlock('entityList', EntityListBlock, { source: 'sdk', ...entityListBlockMeta })\n // Blocks promoted from the fleet (M2): each existed as an app-local block in\n // one store; the mechanism is now shared and the branding stayed behind.\n defineBlock('seals', SealsBand, { source: 'sdk', ...sealsBlockMeta })\n defineBlock('storyQuote', StoryQuote, { source: 'sdk', ...storyQuoteBlockMeta })\n defineBlock('imageTiles', ImageTiles, { source: 'sdk', ...imageTilesBlockMeta })\n defineBlock('faq', FaqSection, { source: 'sdk', ...faqBlockMeta })\n defineBlock('steps', StepsSection, { source: 'sdk', ...stepsBlockMeta })\n defineBlock('countdown', CountdownBand, { source: 'sdk', ...countdownBlockMeta })\n defineBlock('tiers', TierCards, { source: 'sdk', ...tiersBlockMeta })\n // The anatomy of a campaign page. A collection is a `pages.content` entry\n // with a theme overlay, so these are ordinary blocks on an ordinary page —\n // not a second page system with its own route.\n defineBlock('collectionHero', CollectionHero, { source: 'sdk', ...collectionHeroBlockMeta })\n defineBlock('productSpotlight', ProductSpotlight, { source: 'sdk', ...productSpotlightBlockMeta })\n defineBlock('motifStrip', MotifStrip, { source: 'sdk', ...motifStripBlockMeta })\n defineBlock('collectionCta', CollectionCta, { source: 'sdk', ...collectionCtaBlockMeta })\n // The native page bodies. A store composes AROUND these rather than replacing\n // the page they live on — see page-blocks.ts.\n defineBlock('catalogBody', CatalogBodyBlock, { source: 'sdk', ...catalogBodyBlockMeta })\n defineBlock('productBody', ProductBodyBlock, { source: 'sdk', ...productBodyBlockMeta })\n}\n\n// Registration happens in initStorefrontRuntime (both the scaffold and\n// createStorefront call it) so importing this module stays side-effect-free.\n\n/** Convert the typed storefront section blueprint into a generic block tree. */\nexport function sectionsToBlocks(sections: readonly StorefrontSection[]): BlockNode[] {\n return sections.map((section, i) => {\n const { type, ...props } = section\n return { type, id: `${type}-${i}`, props: props as Record<string, unknown> }\n })\n}\n","import React from 'react'\nimport { getShopProvider } from '@fayz-ai/shop/runtime'\nimport { setShopCarrierQuotesResolver } from '@fayz-ai/sdk/shop'\nimport type { StoreSettings } from '@fayz-ai/shop/types'\nimport { StorefrontConfigProvider, type ResolvedStorefrontConfig } from './config'\n\n// ---------------------------------------------------------------------------\n// The merchant's policy, arriving at the shopper's browser\n// ---------------------------------------------------------------------------\n// A storefront's config is CODE: `createStorefrontApp({ payments: { methods:\n// [...] } })`, evaluated at build time. That made every commercial decision in\n// the store the property of whoever last deployed it — a merchant could not\n// change what the checkout offered, and the settings screens in the admin wrote\n// to nothing anybody read.\n//\n// This closes that loop from the other end. plg_shop_settings is read ONCE at\n// boot through shop_store_settings() (anon, published-only) and overlaid on the\n// resolved config, so every component that already reads `config.payments\n// .methods` or `config.currency` starts obeying the merchant with no change of\n// its own.\n//\n// OVERLAY, not replace, and that asymmetry is the whole compatibility story:\n// only a field the merchant actually DECIDED wins. `undefined` — which is what\n// every column is until a settings screen is saved — leaves the app's own\n// declaration standing. Eight live storefronts share this pool and none of them\n// may change behaviour on the day this ships.\n\n/**\n * Merge a store's saved policy over its declared config.\n *\n * Pure and exported for its own sake: this is the function that decides what a\n * shopper is offered, and it should be testable without a provider, a network or\n * a React tree.\n */\nexport function applyStoreSettings(\n config: ResolvedStorefrontConfig,\n settings: StoreSettings | null | undefined,\n): ResolvedStorefrontConfig {\n if (!settings) return config\n\n const next: ResolvedStorefrontConfig = { ...config, policy: settings }\n\n if (settings.currency) next.currency = settings.currency\n if (settings.locale) next.locale = settings.locale\n\n // An EMPTY list is not a decision to offer nothing — the column treats\n // empty as undecided (see the 0045 header), and the provider maps it to\n // `undefined`, so this branch only ever sees a real choice. Belt and braces:\n // a storefront offering zero payment methods is a checkout nobody can\n // complete, and it must not be reachable through a config merge.\n if (settings.paymentMethods?.length) {\n next.payments = { ...config.payments, methods: settings.paymentMethods }\n }\n\n if (settings.discountsEnabled !== undefined) {\n next.features = { ...config.features, discounts: settings.discountsEnabled }\n }\n\n // Requiring an account is the storefront's side of the server rule: the 0045\n // trigger refuses a guest order outright, so a checkout that still offered\n // guest purchase would collect a whole form and then fail at the last click.\n if (settings.guestCheckout === false) {\n next.features = { ...next.features, accounts: true }\n }\n\n return next\n}\n\n/**\n * Boot-time read of the store's policy, wrapped around the config provider.\n *\n * Renders the DECLARED config immediately and re-renders with the merchant's\n * policy when it lands. Deliberately not a blocking await: a storefront must\n * paint its catalogue without waiting on a settings round trip, and the fields\n * this can change (currency symbol, which payment chips the checkout shows) are\n * not on the first-paint path of the home page.\n *\n * A provider without `getPublicStoreSettings`, an unpublished store, or a failed\n * request all resolve to the same thing: the declared config, unchanged. There\n * is no error state, because there is nothing for a shopper to do about it.\n */\nexport function StorefrontConfigHost({\n config,\n children,\n}: {\n config: ResolvedStorefrontConfig\n children: React.ReactNode\n}) {\n const [policy, setPolicy] = React.useState<StoreSettings | null>(null)\n\n React.useEffect(() => {\n let cancelled = false\n let provider\n try {\n provider = config.provider ?? getShopProvider()\n } catch {\n return // no runtime initialized (SSR/prerender)\n }\n if (typeof provider.getPublicStoreSettings !== 'function') return\n void provider\n .getPublicStoreSettings()\n .then((settings) => {\n if (cancelled) return\n setPolicy(settings)\n // A cotação roda DENTRO de uma chamada de rede, longe de qualquer\n // render, então ela não lê contexto — recebe a política por um\n // resolvedor, como o carrinho. Sem esta linha, \"eu mesmo calculo o\n // frete\" era uma opção que o lojista marcava e o checkout ignorava.\n setShopCarrierQuotesResolver(() => settings?.carrierQuotes)\n })\n .catch(() => { /* declared config stands */ })\n return () => { cancelled = true }\n }, [config])\n\n const resolved = React.useMemo(() => applyStoreSettings(config, policy), [config, policy])\n\n return <StorefrontConfigProvider value={resolved}>{children}</StorefrontConfigProvider>\n}\n","import React, { useEffect } from 'react'\n\n// ---------------------------------------------------------------------------\n// StorefrontTheme — the storefront counterpart of SaasTheme.\n// Personalizes colors (HSL token triplets), typography (Google Fonts pairing),\n// radius and layout properties via CSS custom properties, so every @fayz-ai/ui\n// token class (bg-background, text-primary, ...) picks the brand up for free.\n//\n// Derived from the Nuvemshop template research (docs/archive/storefront-templates-research.md):\n// the personalization axes are palette, font pairing, radius, header treatment,\n// hero style and product-card style.\n// ---------------------------------------------------------------------------\n\nexport type StorefrontRadius = 'none' | 'soft' | 'round' | 'pill'\nexport type HeaderVariant = 'classic' | 'centered' | 'search' | 'minimal'\nexport type HeroVariant = 'banner' | 'split' | 'slider'\nexport type CardStyle = 'card' | 'editorial'\n\nexport interface StorefrontThemeColors {\n /** HSL triplets, e.g. '40 20% 94%' — same convention as SaasTheme */\n background?: string\n foreground?: string\n primary?: string\n primaryForeground?: string\n card?: string\n cardForeground?: string\n muted?: string\n mutedForeground?: string\n border?: string\n /** Header treatment — dark headers (Brasília) set these */\n headerBackground?: string\n headerForeground?: string\n /** Announcement bar */\n announcementBackground?: string\n announcementForeground?: string\n /** Secondary brand accent (e.g. a gourmet gold beside the primary). Emitted\n * as `--sf-accent` / `--sf-accent-foreground` and the `accent` tailwind token. */\n accent?: string\n accentForeground?: string\n}\n\nexport interface StorefrontThemeFont {\n /** Display font for headings, e.g. 'Marcellus' */\n heading: string\n /** Body font, e.g. 'Rubik' */\n body: string\n /** Optional oversized display face for hero words (emitted as `--sf-font-display`). */\n display?: string\n /** Optional serif accent for quotes/editorial (emitted as `--sf-font-serif`). */\n serif?: string\n /** Google Fonts families to load (defaults to heading+body+display+serif) */\n googleFonts?: string[]\n /** Fallback stack — default sans-serif; use 'serif' for editorial themes */\n fallback?: 'sans-serif' | 'serif'\n}\n\nexport interface StorefrontTheme {\n name: string\n colors?: StorefrontThemeColors\n font?: StorefrontThemeFont\n radius?: StorefrontRadius\n /** Layout personality */\n header?: {\n variant?: HeaderVariant\n /** Uppercase nav links (premium retail tone) */\n uppercaseNav?: boolean\n /** Show category shortcuts after primary nav links. Default true. */\n showCategories?: boolean\n /** Show the storefront search in the header. Default true. */\n showSearch?: boolean\n /** Header search presentation: a full input ('full', default) or a compact\n * icon button that expands into an input on click ('icon'). */\n searchStyle?: 'full' | 'icon'\n }\n productCard?: {\n style?: CardStyle\n imageAspect?: 'square' | 'portrait'\n }\n /** Uppercase CTA buttons with letter-spacing (Uyuni/Flex tone) */\n uppercaseButtons?: boolean\n /**\n * Brand token scales — the schema'd half of the token surface (spine M2).\n * Each map is emitted as namespaced CSS custom properties, so blocks and\n * store CSS consume the brand's rhythm instead of hardcoding magic numbers:\n *\n * spacing `--sf-space-<key>` e.g. { sm: '8px', md: '16px', lg: '32px' }\n * typeScale `--sf-text-<key>` e.g. { body: '1rem', h2: 'clamp(24px,3vw,34px)' }\n * breakpoints `--sf-breakpoint-<key>` e.g. { md: '768px', lg: '1080px' } — CSS\n * custom properties cannot drive media queries; these document the\n * grid for JS consumers and generated styles.\n * motion `--sf-motion-<key>` e.g. { fast: '150ms', reveal: 'cubic-bezier(0.22,1,0.36,1)' }\n *\n * Keys are validated (slug-like) and values must be strings; the free-form\n * escape hatch stays `tokens` below.\n */\n spacing?: Record<string, string>\n typeScale?: Record<string, string>\n breakpoints?: Record<string, string>\n motion?: Record<string, string>\n /** Brand-token passthrough. Each entry is emitted verbatim as a `--<key>` CSS\n * custom property, so a store can add gradients, glows, extra colors, or\n * letter-spacing the fixed schema doesn't enumerate — without editing the SDK.\n * e.g. { 'grad-ember': 'linear-gradient(...)', 'glow-ember': '0 0 0 1px ...' }. */\n tokens?: Record<string, string>\n}\n\nconst RADIUS_MAP: Record<StorefrontRadius, { button: string; card: string; input: string }> = {\n none: { button: '0px', card: '0px', input: '0px' },\n soft: { button: '6px', card: '10px', input: '6px' },\n round: { button: '10px', card: '16px', input: '10px' },\n pill: { button: '999px', card: '20px', input: '999px' },\n}\n\nconst COLOR_VAR_MAP: Record<keyof StorefrontThemeColors, string> = {\n background: '--background',\n foreground: '--foreground',\n primary: '--primary',\n primaryForeground: '--primary-foreground',\n card: '--card',\n cardForeground: '--card-foreground',\n muted: '--muted',\n mutedForeground: '--muted-foreground',\n border: '--border',\n headerBackground: '--sf-header-bg',\n headerForeground: '--sf-header-fg',\n announcementBackground: '--sf-announcement-bg',\n announcementForeground: '--sf-announcement-fg',\n accent: '--sf-accent',\n accentForeground: '--sf-accent-foreground',\n}\n\n/** The schema'd scale fields and the CSS custom-property prefix each emits. */\nexport const THEME_SCALE_VAR_PREFIX = {\n spacing: '--sf-space',\n typeScale: '--sf-text',\n breakpoints: '--sf-breakpoint',\n motion: '--sf-motion',\n} as const\n\nexport type ThemeScaleField = keyof typeof THEME_SCALE_VAR_PREFIX\n\nexport const THEME_SCALE_FIELDS = Object.keys(THEME_SCALE_VAR_PREFIX) as readonly ThemeScaleField[]\n\nexport interface ThemeCssOptions {\n /** CSS selector the custom properties are emitted under. Defaults to `:root`.\n * A page-scoped theme (a campaign page) passes something like\n * `[data-page=\"verao\"]` so its palette does not leak to the shell. */\n selector?: string\n}\n\nexport function themeToCss(theme: StorefrontTheme, options: ThemeCssOptions = {}): string {\n const selector = options.selector ?? ':root'\n const scoped = selector !== ':root'\n const lines: string[] = []\n\n for (const [key, cssVar] of Object.entries(COLOR_VAR_MAP) as [keyof StorefrontThemeColors, string][]) {\n const value = theme.colors?.[key]\n if (value) lines.push(`${cssVar}: ${value};`)\n }\n // Header defaults to the page background unless the theme sets one\n if (!theme.colors?.headerBackground && theme.colors?.background) {\n lines.push(`--sf-header-bg: ${theme.colors.background};`)\n }\n if (!theme.colors?.headerForeground && theme.colors?.foreground) {\n lines.push(`--sf-header-fg: ${theme.colors.foreground};`)\n }\n\n if (theme.font) {\n const fallback = theme.font.fallback ?? 'sans-serif'\n lines.push(`--font-family: '${theme.font.body}', ${fallback};`)\n lines.push(`--sf-font-heading: '${theme.font.heading}', ${fallback};`)\n if (theme.font.display) lines.push(`--sf-font-display: '${theme.font.display}', ${fallback};`)\n if (theme.font.serif) lines.push(`--sf-font-serif: '${theme.font.serif}', serif;`)\n }\n\n // Schema'd brand scales → namespaced custom properties.\n for (const [field, prefix] of Object.entries(THEME_SCALE_VAR_PREFIX) as [ThemeScaleField, string][]) {\n for (const [key, value] of Object.entries(theme[field] ?? {})) {\n lines.push(`${prefix}-${key}: ${value};`)\n }\n }\n\n // Brand-token passthrough — emit each entry as a raw CSS custom property.\n for (const [key, value] of Object.entries(theme.tokens ?? {})) {\n const name = key.startsWith('--') ? key : `--${key}`\n lines.push(`${name}: ${value};`)\n }\n\n const radius = RADIUS_MAP[theme.radius ?? 'soft']\n lines.push(`--button-radius: ${radius.button};`)\n lines.push(`--card-radius: ${radius.card};`)\n lines.push(`--input-radius: ${radius.input};`)\n lines.push(`--sf-radius-button: ${radius.button};`)\n lines.push(`--sf-radius-card: ${radius.card};`)\n lines.push(`--sf-radius-input: ${radius.input};`)\n\n // Scoped themes hang their rules off the wrapper element instead of `body`,\n // and prefix every descendant rule, so the page's palette and type stay\n // inside it. `:root` keeps the original global emission verbatim.\n const root = scoped ? selector : 'body'\n const at = (sel: string) => (scoped ? `${selector} ${sel}` : sel)\n\n let css = `${selector} {\\n ${lines.join('\\n ')}\\n}\\n`\n css += `${root} { font-family: var(--font-family); }\\n`\n css += `${['h1', 'h2', 'h3', 'h4', '.sf-heading'].map(at).join(', ')} { font-family: var(--sf-font-heading, var(--font-family)); }\\n`\n if (theme.uppercaseButtons) {\n css += `${at('.sf-cta')} { text-transform: uppercase; letter-spacing: 0.08em; }\\n`\n }\n if (theme.header?.uppercaseNav) {\n css += `${at('.sf-nav-link')} { text-transform: uppercase; letter-spacing: 0.06em; font-size: 0.8rem; }\\n`\n }\n return css\n}\n\nfunction googleFontsHref(theme: StorefrontTheme): string | null {\n if (!theme.font) return null\n const families =\n theme.font.googleFonts ??\n [theme.font.heading, theme.font.body, theme.font.display, theme.font.serif].filter(\n (f): f is string => Boolean(f),\n )\n const unique = [...new Set(families)]\n const params = unique\n .map((f) => `family=${encodeURIComponent(f).replace(/%20/g, '+')}:wght@300;400;500;600;700`)\n .join('&')\n return `https://fonts.googleapis.com/css2?${params}&display=swap`\n}\n\n/** Injects theme CSS variables + Google Fonts. Mount once inside the app root\n * for the store theme; a page-scoped theme mounts another instance with its\n * own `selector`. */\nexport function StorefrontThemeStyle({\n theme,\n selector,\n}: {\n theme: StorefrontTheme\n /** Emit under this selector instead of `:root`. See `themeToCss`. */\n selector?: string\n}) {\n const fontsHref = googleFontsHref(theme)\n // A scoped theme gets its own <link>: sharing the shell's id would have the\n // campaign page's font set replace the store's for the whole document, and\n // unmounting it would leave the store with no fonts at all.\n const linkId = selector ? `sf-theme-fonts-${slugifyToken(selector)}` : 'sf-theme-fonts'\n\n useEffect(() => {\n if (!fontsHref) return\n let link = document.getElementById(linkId) as HTMLLinkElement | null\n if (!link) {\n link = document.createElement('link')\n link.id = linkId\n link.rel = 'stylesheet'\n document.head.appendChild(link)\n }\n link.href = fontsHref\n // Only a scoped theme cleans up — the store theme's fonts live as long as\n // the app does, and removing them on a re-render would flash unstyled text.\n if (!selector) return\n return () => {\n document.getElementById(linkId)?.remove()\n }\n }, [fontsHref, linkId, selector])\n\n return React.createElement(\n 'style',\n { 'data-sf-theme': theme.name },\n themeToCss(theme, { selector }),\n )\n}\n\nfunction slugifyToken(value: string): string {\n return value.replace(/[^a-zA-Z0-9]+/g, '-').replace(/^-|-$/g, '').toLowerCase()\n}\n","import React, { useEffect, useMemo, useRef, useState } from 'react'\nimport { Search, X } from 'lucide-react'\nimport type { Product } from '@fayz-ai/shop/types'\nimport { useStorefrontConfig } from '../../document/config'\nimport { useProducts } from '../../hooks/use-products'\nimport { useCatalogStore } from '../../stores/catalog.store'\nimport { navigateTo } from '../../app/router'\nimport { Price } from '../Price'\nimport { PaymentTerms } from '../PaymentTerms'\nimport { SmoothImage } from '../SmoothImage'\nimport { TID } from '../../lib/testids'\n\n/**\n * Search as a focused moment: the page dims, the field takes the caret, and a\n * few real products answer under it. The shopper either recognises what they\n * wanted — one click to the PDP — or commits to the full result page.\n *\n * The suggestion list is deliberately short. It exists to confirm the store\n * *has* the thing, not to be a second catalogue.\n */\nexport function SearchOverlay({ onClose }: { onClose: () => void }) {\n const config = useStorefrontConfig()\n const { search: searchConfig } = config\n const setCatalogSearch = useCatalogStore((s) => s.setSearch)\n const [term, setTerm] = useState('')\n const inputRef = useRef<HTMLInputElement>(null)\n\n useEffect(() => {\n inputRef.current?.focus()\n // The page behind must not scroll under the overlay.\n const previous = document.body.style.overflow\n document.body.style.overflow = 'hidden'\n return () => {\n document.body.style.overflow = previous\n }\n }, [])\n\n // Debounced so a fast typist fires one query, not one per keystroke.\n const [query, setQuery] = useState('')\n useEffect(() => {\n const id = setTimeout(() => setQuery(term.trim()), 220)\n return () => clearTimeout(id)\n }, [term])\n\n const active = query.length >= searchConfig.minChars\n const { products, loading } = useProducts(\n active ? { status: 'active', search: query, limit: searchConfig.suggestionsLimit } : { status: 'active', limit: 0 },\n )\n const suggestions = useMemo(\n () => (active ? products.slice(0, searchConfig.suggestionsLimit) : []),\n [active, products, searchConfig.suggestionsLimit],\n )\n\n const submit = (value: string) => {\n const q = value.trim()\n if (!q) return\n // Seed the store too, so the results page paints filtered on first frame\n // instead of flashing the whole catalogue and then narrowing.\n setCatalogSearch(q)\n navigateTo(`${searchConfig.resultsPath}?q=${encodeURIComponent(q)}`)\n onClose()\n }\n\n return (\n <div\n data-testid={TID.searchOverlay}\n className=\"fixed inset-0 z-[60] flex flex-col\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Buscar produtos\"\n >\n <button\n type=\"button\"\n aria-label=\"Fechar busca\"\n data-testid={TID.searchOverlayClose}\n onClick={onClose}\n className=\"absolute inset-0 cursor-default bg-black/50 backdrop-blur-[2px]\"\n />\n\n <div className=\"relative w-full border-b bg-background shadow-xl\">\n <div className=\"mx-auto flex max-w-5xl items-center gap-3 px-4 py-4 sm:px-6\">\n <Search className=\"h-5 w-5 shrink-0 opacity-60\" aria-hidden />\n <input\n ref={inputRef}\n data-testid={TID.searchOverlayInput}\n type=\"search\"\n value={term}\n placeholder={searchConfig.placeholder}\n onChange={(e) => setTerm(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Escape') onClose()\n if (e.key === 'Enter') submit(term)\n }}\n className=\"min-w-0 flex-1 bg-transparent text-base outline-none placeholder:opacity-50\"\n />\n <button\n type=\"button\"\n aria-label=\"Fechar busca\"\n onClick={onClose}\n className=\"rounded-full p-2 transition-opacity hover:opacity-60\"\n >\n <X className=\"h-5 w-5\" aria-hidden />\n </button>\n </div>\n\n {active && (\n <div className=\"mx-auto max-w-5xl px-4 pb-4 sm:px-6\">\n {loading && suggestions.length === 0 ? (\n <div className=\"grid gap-4 pb-2 sm:grid-cols-2 lg:grid-cols-4\">\n {Array.from({ length: Math.min(searchConfig.suggestionsLimit, 4) }).map((_, i) => (\n <div key={i} className=\"h-40 animate-pulse rounded-xl bg-muted\" />\n ))}\n </div>\n ) : suggestions.length === 0 ? (\n <p className=\"py-6 text-center text-sm text-muted-foreground\">\n {searchConfig.emptyLabel} “{query}”.\n </p>\n ) : (\n <>\n <div className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n {suggestions.map((product) =>\n searchConfig.renderSuggestion ? (\n <React.Fragment key={product.id}>\n {searchConfig.renderSuggestion(product)}\n </React.Fragment>\n ) : (\n <SuggestionCard key={product.id} product={product} onNavigate={onClose} />\n ),\n )}\n </div>\n <button\n type=\"button\"\n data-testid={TID.searchOverlayCta}\n onClick={() => submit(term)}\n className=\"mt-4 w-full rounded-lg bg-primary py-3 text-sm font-semibold text-primary-foreground transition-opacity hover:opacity-90\"\n >\n {searchConfig.ctaLabel}\n </button>\n </>\n )}\n </div>\n )}\n </div>\n </div>\n )\n}\n\nfunction SuggestionCard({ product, onNavigate }: { product: Product; onNavigate: () => void }) {\n const image = product.images.find((i) => i.isPrimary) ?? product.images[0]\n return (\n <button\n type=\"button\"\n data-testid={TID.searchSuggestion}\n data-slug={product.slug}\n onClick={() => {\n navigateTo(`/product/${product.slug}`)\n onNavigate()\n }}\n className=\"group flex flex-col rounded-xl border bg-card p-3 text-left transition-shadow hover:shadow-md\"\n >\n <div className=\"mb-3 aspect-square w-full overflow-hidden rounded-lg bg-muted\">\n {image && (\n <SmoothImage\n src={image.url}\n alt={image.altText ?? product.name}\n className=\"h-full w-full object-contain transition-transform duration-300 group-hover:scale-105\"\n />\n )}\n </div>\n <p className=\"line-clamp-2 text-sm font-medium\">{product.name}</p>\n <div className=\"mt-2 sf-price\">\n <Price value={product.price} compareAt={product.compareAtPrice ?? undefined} />\n <PaymentTerms price={product.price} metadata={product.metadata} variant=\"card\" />\n </div>\n </button>\n )\n}\n","import React, { useState } from 'react'\nimport { CreditCard, LogOut, Mail, Menu, Package, Phone, Search, ShoppingBag, User, UserCircle, X } from 'lucide-react'\nimport { signOutCustomer } from '../../data/auth'\nimport { useCartStore, selectCount } from '../../stores/cart.store'\nimport { useCatalogStore } from '../../stores/catalog.store'\nimport { useSessionStore } from '../../stores/session.store'\nimport { useCategories } from '../../hooks/use-categories'\nimport { useStorefrontConfig } from '../../document/config'\nimport { useScrolled, usePopOnChange } from '../../lib/motion'\nimport { Link, navigateTo, useHashPath } from '../../app/router'\nimport { SearchOverlay } from './SearchOverlay'\nimport { TID } from '../../lib/testids'\nimport { Slot } from '../../extend/slots'\n\n// Header tokens come from the theme (--sf-header-bg/fg) so dark headers\n// (Brasília pattern) work without component changes. Dividers derive from the\n// header FOREGROUND (not the page --border token, which is light and shows as\n// white lines on dark headers).\nconst headerStyle: React.CSSProperties = {\n backgroundColor: 'hsl(var(--sf-header-bg, var(--background)))',\n color: 'hsl(var(--sf-header-fg, var(--foreground)))',\n borderColor: 'hsl(var(--sf-header-fg, var(--foreground)) / 0.14)',\n}\n\nconst headerDivider: React.CSSProperties = {\n borderColor: 'hsl(var(--sf-header-fg, var(--foreground)) / 0.14)',\n}\n\nconst ANNOUNCEMENT_KEY = 'fayz.storefront.announcement.dismissed'\n\nfunction AnnouncementBar() {\n const config = useStorefrontConfig()\n const [dismissed, setDismissed] = useState(() => {\n try {\n return localStorage.getItem(ANNOUNCEMENT_KEY) === config.announcement\n } catch {\n return false\n }\n })\n if (!config.announcement || dismissed) return null\n\n const dismiss = () => {\n setDismissed(true)\n try {\n localStorage.setItem(ANNOUNCEMENT_KEY, config.announcement ?? '')\n } catch {\n /* storage unavailable — dismiss for this session only */\n }\n }\n\n return (\n <div\n data-testid={TID.announcementBar}\n className=\"relative px-4 py-2 text-center text-xs font-semibold tracking-wide\"\n style={{\n backgroundColor: 'hsl(var(--sf-announcement-bg, var(--primary)))',\n color: 'hsl(var(--sf-announcement-fg, var(--primary-foreground)))',\n }}\n >\n {config.announcement}\n <button\n type=\"button\"\n aria-label=\"Fechar aviso\"\n onClick={dismiss}\n className=\"absolute right-2 top-1/2 -translate-y-1/2 rounded-full p-1 opacity-70 transition-opacity hover:opacity-100\"\n >\n <X className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n )\n}\n\n/** Slim utility strip (Flex pattern): contact on the left, social on the right. */\nfunction UtilityBar() {\n const config = useStorefrontConfig()\n const contact = config.footer?.contact\n const social = config.footer?.social\n if (!contact?.phone && !contact?.email && !social?.length) return null\n return (\n <div className=\"hidden border-b text-xs opacity-80 md:block\" style={headerDivider}>\n <div className=\"mx-auto flex h-8 max-w-7xl items-center gap-5 px-4 sm:px-6\">\n {contact?.phone && (\n <span className=\"inline-flex items-center gap-1.5\">\n <Phone className=\"h-3 w-3\" /> {contact.phone}\n </span>\n )}\n {contact?.email && (\n <span className=\"inline-flex items-center gap-1.5\">\n <Mail className=\"h-3 w-3\" /> {contact.email}\n </span>\n )}\n <span className=\"ml-auto flex items-center gap-4\">\n {social?.map((s) => (\n <a key={s.href} href={s.href} target=\"_blank\" rel=\"noreferrer\" className=\"hover:underline\">\n {s.label}\n </a>\n ))}\n </span>\n </div>\n </div>\n )\n}\n\nfunction SearchInput({ className, iconOnly = false }: { className?: string; iconOnly?: boolean }) {\n const config = useStorefrontConfig()\n const search = useCatalogStore((s) => s.search)\n const setSearch = useCatalogStore((s) => s.setSearch)\n const path = useHashPath()\n const [open, setOpen] = useState(false)\n const [overlay, setOverlay] = useState(false)\n\n // Overlay mode: the field is only ever a trigger. Rendering it as a real\n // input too would put two carets on the page once the overlay opens.\n if (config.search.mode === 'overlay') {\n return (\n <>\n {iconOnly ? (\n <button\n type=\"button\"\n aria-label=\"Buscar produtos\"\n data-testid={TID.headerSearchToggle}\n onClick={() => setOverlay(true)}\n className=\"rounded-full p-2.5 transition-opacity hover:opacity-70\"\n >\n <Search className=\"h-5 w-5\" />\n </button>\n ) : (\n <button\n type=\"button\"\n data-testid={TID.headerSearchToggle}\n onClick={() => setOverlay(true)}\n className={`relative flex items-center gap-2 border px-3 py-2 text-left text-sm opacity-80 transition-opacity hover:opacity-100 ${className ?? ''}`}\n style={{\n borderRadius: 'var(--sf-radius-input)',\n borderColor: 'hsl(var(--sf-header-fg, var(--foreground)) / 0.25)',\n }}\n >\n <Search className=\"h-4 w-4 shrink-0 opacity-60\" aria-hidden />\n <span className=\"truncate\">{search || config.search.placeholder}</span>\n </button>\n )}\n {overlay && <SearchOverlay onClose={() => setOverlay(false)} />}\n </>\n )\n }\n\n // Icon-only: a compact search button that expands into the input on click and\n // collapses again on Escape / blur-when-empty.\n if (iconOnly && !open) {\n return (\n <button\n type=\"button\"\n aria-label=\"Buscar produtos\"\n data-testid={TID.headerSearchToggle}\n onClick={() => setOpen(true)}\n className=\"rounded-full p-2.5 transition-opacity hover:opacity-70\"\n >\n <Search className=\"h-5 w-5\" />\n </button>\n )\n }\n\n return (\n <div className={`relative ${iconOnly ? 'w-full max-w-xs' : (className ?? '')}`}>\n <Search className=\"pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 opacity-60\" />\n <input\n data-testid={TID.headerSearch}\n type=\"search\"\n placeholder={config.search.placeholder}\n value={search}\n autoFocus={iconOnly}\n onChange={(e) => {\n setSearch(e.target.value)\n if (path !== config.catalogPath) navigateTo(config.catalogPath)\n }}\n onKeyDown={(e) => {\n if (e.key === 'Escape' && iconOnly) setOpen(false)\n }}\n onBlur={() => {\n if (iconOnly && !search) setOpen(false)\n }}\n className=\"w-full border bg-white/10 py-2 pl-9 pr-4 text-sm outline-none transition-colors placeholder:opacity-60 focus:border-primary focus:bg-white focus:text-gray-900\"\n style={{\n borderRadius: 'var(--sf-radius-input)',\n borderColor: 'hsl(var(--sf-header-fg, var(--foreground)) / 0.25)',\n }}\n />\n </div>\n )\n}\n\nfunction HeaderActions({ onMenuClick }: { onMenuClick?: () => void }) {\n const config = useStorefrontConfig()\n const count = useCartStore(selectCount)\n const openDrawer = useCartStore((s) => s.openDrawer)\n const session = useSessionStore()\n const [accountOpen, setAccountOpen] = useState(false)\n const accountRef = React.useRef<HTMLDivElement>(null)\n const pop = usePopOnChange(count)\n const firstName = session.name?.split(/\\s+/)[0]\n const initial = (firstName ?? session.email ?? 'C').slice(0, 1).toUpperCase()\n\n // `pointerdown`, not `click`: a menu item that navigates unmounts the target\n // before the click bubbles, so the listener would never run.\n React.useEffect(() => {\n if (!accountOpen) return\n const onPointerDown = (event: PointerEvent) => {\n if (!accountRef.current?.contains(event.target as Node)) setAccountOpen(false)\n }\n const onKey = (event: KeyboardEvent) => {\n if (event.key === 'Escape') setAccountOpen(false)\n }\n document.addEventListener('pointerdown', onPointerDown)\n document.addEventListener('keydown', onKey)\n return () => {\n document.removeEventListener('pointerdown', onPointerDown)\n document.removeEventListener('keydown', onKey)\n }\n }, [accountOpen])\n\n return (\n <nav className=\"flex items-center gap-1\">\n <Slot area=\"header\" name=\"beforeActions\" />\n {config.features.accounts && (\n <div ref={accountRef} className=\"relative\">\n {session.email ? (\n <button\n type=\"button\"\n data-testid={TID.accountLink}\n aria-label=\"Abrir menu da conta\"\n aria-expanded={accountOpen}\n onClick={() => setAccountOpen((open) => !open)}\n className=\"flex items-center gap-1.5 rounded-full p-1.5 transition-opacity hover:opacity-80\"\n >\n <span className=\"flex h-8 w-8 items-center justify-center rounded-full bg-primary text-sm font-bold text-primary-foreground\">\n {initial}\n </span>\n {firstName && (\n <span data-testid={TID.accountName} className=\"hidden max-w-24 truncate text-sm font-medium lg:inline\">\n {firstName}\n </span>\n )}\n </button>\n ) : (\n <Link\n to=\"/account\"\n data-testid={TID.accountLink}\n aria-label=\"Minhas compras\"\n className=\"flex items-center gap-1.5 rounded-full p-2.5 transition-opacity hover:opacity-70\"\n >\n <User className=\"h-5 w-5\" />\n </Link>\n )}\n {accountOpen && session.email && (\n <div\n data-testid={TID.accountDropdown}\n className=\"absolute right-0 top-full z-50 mt-3 w-72 overflow-hidden rounded-xl border bg-background text-foreground shadow-xl\"\n >\n <div className=\"border-b p-4\">\n <p className=\"font-semibold\">{session.name || firstName || 'Cliente'}</p>\n <p className=\"truncate text-sm text-muted-foreground\">{session.email}</p>\n </div>\n <div className=\"p-2\" onClick={() => setAccountOpen(false)}>\n <Link to=\"/account\" className=\"flex items-center gap-3 rounded-lg px-3 py-2.5 text-sm font-semibold hover:bg-muted\">\n <UserCircle className=\"h-4 w-4\" />\n Perfil\n </Link>\n <Link to=\"/account\" className=\"flex items-center gap-3 rounded-lg px-3 py-2.5 text-sm font-semibold hover:bg-muted\">\n <Package className=\"h-4 w-4\" />\n Meus pedidos\n </Link>\n <Link to=\"/account\" className=\"flex items-center gap-3 rounded-lg px-3 py-2.5 text-sm font-semibold hover:bg-muted\">\n <CreditCard className=\"h-4 w-4\" />\n Pagamentos\n </Link>\n <button\n type=\"button\"\n onClick={() => {\n setAccountOpen(false)\n void signOutCustomer()\n }}\n className=\"flex w-full items-center gap-3 rounded-lg px-3 py-2.5 text-left text-sm font-semibold hover:bg-muted\"\n >\n <LogOut className=\"h-4 w-4\" />\n Sair\n </button>\n </div>\n </div>\n )}\n </div>\n )}\n {config.features.cart && (\n <button\n type=\"button\"\n data-testid={TID.cartButton}\n aria-label=\"Carrinho\"\n onClick={openDrawer}\n className=\"relative rounded-full p-2.5 transition-opacity hover:opacity-70\"\n >\n <ShoppingBag className=\"h-5 w-5\" />\n {count > 0 && (\n <span\n data-testid={TID.cartCount}\n className={`absolute -right-0.5 -top-0.5 flex h-5 min-w-5 items-center justify-center rounded-full bg-primary px-1 text-xs font-semibold text-primary-foreground ${\n pop ? 'animate-badge-pop' : ''\n }`}\n >\n {count}\n </span>\n )}\n </button>\n )}\n {onMenuClick && (\n <button\n type=\"button\"\n aria-label=\"Abrir menu\"\n onClick={onMenuClick}\n className=\"relative rounded-full p-2.5 transition-opacity hover:opacity-70 md:hidden\"\n >\n <Menu className=\"h-5 w-5\" />\n </button>\n )}\n <Slot area=\"header\" name=\"afterActions\" />\n </nav>\n )\n}\n\nfunction NavLinks({ className }: { className?: string }) {\n const config = useStorefrontConfig()\n const { categories } = useCategories()\n const setCategoryId = useCatalogStore((s) => s.setCategoryId)\n const showCategories = config.theme?.header?.showCategories !== false\n\n const goCategory = (categoryId: string) => {\n useCatalogStore.getState().reset()\n setCategoryId(categoryId)\n navigateTo(config.catalogPath)\n }\n\n return (\n <nav className={`flex min-w-max items-center gap-6 ${className ?? ''}`}>\n {config.nav.map((link) => (\n <Link\n key={link.to}\n to={link.to}\n data-testid={TID.navLink(link.label)}\n className=\"sf-nav-link text-sm font-medium transition-opacity hover:opacity-70\"\n >\n {link.label}\n </Link>\n ))}\n {showCategories &&\n categories.slice(0, 6).map((c) => (\n <button\n key={c.id}\n type=\"button\"\n data-testid={TID.navCategory(c.slug)}\n onClick={() => goCategory(c.id)}\n className=\"sf-nav-link group relative hidden text-sm font-medium transition-opacity hover:opacity-80 lg:inline\"\n >\n {c.name}\n <span className=\"absolute -bottom-1 left-0 h-0.5 w-0 bg-primary transition-all duration-300 group-hover:w-full\" />\n </button>\n ))}\n </nav>\n )\n}\n\nfunction MobileMenuDrawer({ open, onClose }: { open: boolean; onClose: () => void }) {\n const config = useStorefrontConfig()\n const { categories } = useCategories()\n const setCategoryId = useCatalogStore((s) => s.setCategoryId)\n const showCategories = config.theme?.header?.showCategories !== false\n\n const goCategory = (categoryId: string) => {\n useCatalogStore.getState().reset()\n setCategoryId(categoryId)\n navigateTo(config.catalogPath)\n onClose()\n }\n\n // a11y: close on Escape\n React.useEffect(() => {\n if (!open) return\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose()\n }\n document.addEventListener('keydown', onKey)\n return () => document.removeEventListener('keydown', onKey)\n }, [open, onClose])\n\n if (!open) return null\n\n return (\n <div className=\"fixed inset-0 z-50 md:hidden\">\n <div\n className=\"absolute inset-0 animate-fade-in bg-black/40\"\n aria-hidden\n onClick={onClose}\n />\n <div\n data-testid=\"mobile-menu-drawer\"\n role=\"dialog\"\n aria-label=\"Menu Principal\"\n className=\"absolute right-0 top-0 flex h-full w-full max-w-[280px] animate-slide-in-from-right flex-col bg-background shadow-2xl\"\n >\n <div className=\"flex items-center justify-between border-b px-5 py-4\">\n <h2 className=\"text-lg font-semibold\">Menu</h2>\n <button\n type=\"button\"\n aria-label=\"Fechar menu\"\n onClick={onClose}\n className=\"rounded-full p-1.5 hover:bg-muted\"\n >\n <X className=\"h-5 w-5\" />\n </button>\n </div>\n <div className=\"flex-1 overflow-y-auto p-5\">\n <nav className=\"flex flex-col gap-4\">\n {config.nav.map((link) => (\n <Link\n key={link.to}\n to={link.to}\n onClick={onClose}\n className=\"text-base font-semibold transition-opacity hover:opacity-70\"\n >\n {link.label}\n </Link>\n ))}\n {showCategories && categories.length > 0 && (\n <>\n <div className=\"my-2 border-t\" />\n <div className=\"mb-2 text-xs font-bold uppercase tracking-wider text-muted-foreground\">\n Categorias\n </div>\n {categories.map((c) => (\n <button\n key={c.id}\n type=\"button\"\n onClick={() => goCategory(c.id)}\n className=\"text-left text-sm font-medium transition-opacity hover:opacity-80\"\n >\n {c.name}\n </button>\n ))}\n </>\n )}\n </nav>\n </div>\n </div>\n </div>\n )\n}\n\nexport function StorefrontHeader() {\n const config = useStorefrontConfig()\n const variant = config.theme?.header?.variant ?? 'classic'\n const scrolled = useScrolled()\n const showSearch = config.theme?.header?.showSearch !== false\n const iconSearch = config.theme?.header?.searchStyle === 'icon'\n const [mobileMenuOpen, setMobileMenuOpen] = useState(false)\n const logo = (\n <Link to=\"/\" className=\"sf-heading shrink-0 text-xl font-bold tracking-tight\">\n {config.logo ?? config.name}\n </Link>\n )\n\n return (\n <header\n className={`sticky top-0 z-40 border-b transition-shadow duration-300 ${scrolled ? 'shadow-md' : ''}`}\n style={headerStyle}\n >\n <AnnouncementBar />\n <UtilityBar />\n\n {variant === 'centered' ? (\n // Rio/Flex pattern: centered logo row, nav row below\n <>\n <div className=\"mx-auto grid h-16 max-w-7xl grid-cols-[1fr_auto_1fr] items-center px-4 sm:px-6\">\n {showSearch ? <SearchInput iconOnly={iconSearch} className=\"hidden w-full max-w-xs sm:block\" /> : <div />}\n <div className=\"text-center\">{logo}</div>\n <div className=\"justify-self-end\">\n <HeaderActions />\n </div>\n </div>\n <div className=\"flex overflow-x-auto border-t py-2.5 sm:justify-center\" style={headerDivider}>\n <NavLinks />\n </div>\n </>\n ) : variant === 'search' ? (\n // Brasília pattern: prominent search left, logo center, actions right; nav row below\n <>\n <div className=\"mx-auto grid h-16 max-w-7xl grid-cols-[1fr_auto_1fr] items-center gap-6 px-4 sm:px-6\">\n {showSearch ? <SearchInput iconOnly={iconSearch} className=\"hidden w-full max-w-sm sm:block\" /> : <div />}\n <div className=\"text-center\">{logo}</div>\n <div className=\"justify-self-end\">\n <HeaderActions />\n </div>\n </div>\n <div className=\"overflow-x-auto border-t\" style={headerDivider}>\n <div className=\"mx-auto max-w-7xl px-4 py-2.5 sm:px-6\">\n <NavLinks />\n </div>\n </div>\n </>\n ) : variant === 'minimal' ? (\n // Uyuni pattern: nav left, centered logo, actions right — single compact row\n <div className=\"mx-auto grid h-16 max-w-7xl grid-cols-[1fr_auto_1fr] items-center px-4 sm:px-6\">\n <div className=\"flex items-center gap-5\">\n <NavLinks className=\"hidden sm:flex\" />\n </div>\n <div className=\"text-center\">{logo}</div>\n <div className=\"flex items-center justify-end gap-3\">\n {showSearch && <SearchInput iconOnly={iconSearch} className=\"hidden w-44 lg:block\" />}\n <HeaderActions />\n </div>\n </div>\n ) : (\n // classic: logo left, nav, then a right-aligned search + actions cluster.\n // NavLinks is hidden below md in the primary row (no room for it there) —\n // below md a hamburger opens MobileMenuDrawer instead, otherwise mobile\n // has no way to reach nav/category links at all.\n <>\n <div className=\"mx-auto flex h-16 max-w-7xl items-center gap-6 px-4 sm:px-6\">\n {logo}\n <NavLinks className=\"hidden md:flex\" />\n <div className=\"ml-auto flex items-center gap-2 sm:gap-3\">\n {showSearch && <SearchInput iconOnly={iconSearch} className={iconSearch ? '' : 'hidden w-full max-w-sm sm:block'} />}\n <HeaderActions onMenuClick={() => setMobileMenuOpen(true)} />\n </div>\n </div>\n <MobileMenuDrawer open={mobileMenuOpen} onClose={() => setMobileMenuOpen(false)} />\n </>\n )}\n <Slot area=\"header\" name=\"belowNav\" />\n </header>\n )\n}\n","import React from 'react'\nimport { useStorefrontConfig } from '../../document/config'\nimport { useCategories } from '../../hooks/use-categories'\nimport { useCatalogStore } from '../../stores/catalog.store'\nimport { Link, navigateTo } from '../../app/router'\nimport { Slot } from '../../extend/slots'\n\nexport function StorefrontFooter() {\n const config = useStorefrontConfig()\n const { categories } = useCategories()\n const visibleCategories = categories.slice(0, 8)\n const hiddenCategoryCount = Math.max(categories.length - visibleCategories.length, 0)\n const labels = {\n categories: 'Departamentos',\n navigation: 'Navegação',\n contact: 'Contato',\n viewAll: 'Ver todos',\n purchases: 'Minhas compras',\n privacy: 'Privacidade',\n terms: 'Termos',\n returns: 'Trocas e devoluções',\n ...config.footer?.labels,\n }\n\n const goCategory = (categoryId: string) => {\n useCatalogStore.getState().reset()\n useCatalogStore.getState().setCategoryId(categoryId)\n navigateTo(config.catalogPath)\n }\n\n return (\n <footer className=\"mt-16 border-t bg-card\">\n <Slot area=\"footer\" name=\"before\" />\n <div className=\"mx-auto grid max-w-7xl gap-10 px-4 py-12 sm:grid-cols-2 sm:px-6 lg:grid-cols-4\">\n <div>\n <p className=\"sf-heading text-lg font-bold\">{config.name}</p>\n {config.footer?.about && (\n <p className=\"mt-3 text-sm leading-relaxed text-muted-foreground\">{config.footer.about}</p>\n )}\n </div>\n\n <div>\n <h3 className=\"mb-3 text-sm font-semibold uppercase tracking-wide text-muted-foreground\">{labels.categories}</h3>\n <ul className=\"space-y-2 text-sm\">\n {visibleCategories.map((c) => (\n <li key={c.id}>\n <button\n type=\"button\"\n onClick={() => goCategory(c.id)}\n className=\"max-w-full truncate text-left transition-opacity hover:opacity-70\"\n >\n {c.name}\n </button>\n </li>\n ))}\n {hiddenCategoryCount > 0 && (\n <li>\n <Link to={config.catalogPath} className=\"font-medium underline-offset-2 transition-opacity hover:underline\">\n {labels.viewAll} ({categories.length})\n </Link>\n </li>\n )}\n </ul>\n </div>\n\n <div>\n <h3 className=\"mb-3 text-sm font-semibold uppercase tracking-wide text-muted-foreground\">{labels.navigation}</h3>\n <ul className=\"space-y-2 text-sm\">\n {config.nav.map((link) => (\n <li key={link.to}>\n <Link to={link.to} className=\"transition-opacity hover:opacity-70\">{link.label}</Link>\n </li>\n ))}\n {config.features.accounts && (\n <li>\n <Link to=\"/account\" className=\"transition-opacity hover:opacity-70\">{labels.purchases}</Link>\n </li>\n )}\n </ul>\n </div>\n\n <div>\n <h3 className=\"mb-3 text-sm font-semibold uppercase tracking-wide text-muted-foreground\">{labels.contact}</h3>\n <ul className=\"space-y-2 text-sm text-muted-foreground\">\n {config.footer?.contact?.phone && <li>{config.footer.contact.phone}</li>}\n {config.footer?.contact?.email && <li>{config.footer.contact.email}</li>}\n {config.footer?.contact?.address && <li>{config.footer.contact.address}</li>}\n {config.footer?.social?.map((s) => (\n <li key={s.href}>\n <a href={s.href} target=\"_blank\" rel=\"noreferrer\" className=\"transition-opacity hover:opacity-70\">\n {s.label}\n </a>\n </li>\n ))}\n </ul>\n </div>\n </div>\n <Slot area=\"footer\" name=\"after\" />\n <div className=\"border-t\">\n <div className=\"mx-auto flex max-w-7xl flex-col items-center gap-3 px-4 py-5 text-xs text-muted-foreground sm:flex-row sm:justify-between sm:px-6\">\n <nav className=\"flex flex-wrap items-center justify-center gap-x-5 gap-y-2\">\n <Link to=\"/privacy\" className=\"transition-colors hover:text-foreground\">{labels.privacy}</Link>\n <Link to=\"/terms\" className=\"transition-colors hover:text-foreground\">{labels.terms}</Link>\n <Link to=\"/refunds\" className=\"transition-colors hover:text-foreground\">{labels.returns}</Link>\n </nav>\n <p className=\"text-center\">\n {config.footer?.credit ?? <>© {config.name} — powered by Fayz</>}\n </p>\n </div>\n </div>\n </footer>\n )\n}\n","import { useCallback } from 'react'\nimport { validateDiscount } from '@fayz-ai/shop'\nimport {\n discountToPromotion,\n previewCouponPercent,\n storefrontDiscountToPromotion,\n} from '@fayz-ai/shop/rules'\nimport type { Promotion, RuleCartSnapshot } from '@fayz-ai/shop/rules'\nimport { useStorefrontConfig } from '../document/config'\nimport { useCartStore } from '../stores/cart.store'\n\nexport interface DiscountValidation {\n valid: boolean\n percent: number\n message?: string\n}\n\nconst REASON_MESSAGE: Record<string, string> = {\n expired: 'Cupom expirado.',\n not_started: 'Cupom ainda não está ativo.',\n usage_limit: 'Cupom esgotado.',\n not_found: 'Cupom inválido ou expirado.',\n inactive: 'Cupom inválido ou expirado.',\n rules_not_matched: 'Este cupom não se aplica ao seu carrinho.',\n unsupported: 'Este cupom não é suportado na loja.',\n}\n\n/** The live cart as the rule engine's snapshot — what eligibility rules\n * (minimum subtotal, product scoping) evaluate against in the preview. */\nfunction cartSnapshot(): RuleCartSnapshot {\n const lines = useCartStore.getState().lines\n return {\n items: lines.map((line) => ({\n id: line.lineId ?? line.productId,\n productId: line.productId,\n quantity: line.quantity,\n unitPrice: line.unitPrice,\n })),\n }\n}\n\n/**\n * Storefront coupon validator, backed by the RULE ENGINE (spine M6): a store's\n * `{code, percent}` config entries and its document `promotions` section are\n * both Promotions — one eligibility rule on `code` plus an application method\n * — gated by the same evaluator path the server mirrors. The hardcoded\n * \"trust config.discounts directly\" branch this hook used to carry is retired.\n *\n * Codes the local document does not know still go through the provider-backed\n * validateDiscount primitive (status/date-window/usage-limit on the discount\n * table), translated through the same adapter. The storefront cart models a\n * discount as a percentage, so non-percentage codes are rejected for\n * client-side preview — the server still honors them at checkout.\n */\nexport function useDiscountValidator(): (code: string) => Promise<DiscountValidation> {\n const config = useStorefrontConfig()\n return useCallback(async (code: string) => {\n const normalized = code.trim().toUpperCase()\n if (!normalized) return { valid: false, percent: 0, message: 'Informe um cupom.' }\n\n // Everything the store itself declares, as promotions (pure data).\n const local: Promotion[] = [\n ...(config.promotions ?? []),\n ...(config.discounts ?? []).map(storefrontDiscountToPromotion),\n ]\n const localPreview = previewCouponPercent(local, normalized, cartSnapshot())\n if (localPreview.valid) return { valid: true, percent: localPreview.percent }\n if (localPreview.reason !== 'not_found') {\n return { valid: false, percent: 0, message: REASON_MESSAGE[localPreview.reason ?? 'not_found'] ?? 'Cupom inválido.' }\n }\n\n // Unknown locally → the provider's discount table, through the same engine.\n const validation = await validateDiscount({ code: normalized })\n if (!validation.valid) {\n return { valid: false, percent: 0, message: REASON_MESSAGE[validation.reason ?? 'not_found'] ?? 'Cupom inválido ou expirado.' }\n }\n if (validation.type !== 'percentage') {\n return { valid: false, percent: 0, message: REASON_MESSAGE.unsupported }\n }\n const promotion = discountToPromotion({\n id: `provider:${normalized}`,\n tenantId: 'storefront',\n title: normalized,\n code: validation.code ?? normalized,\n type: 'percentage',\n method: 'code',\n value: validation.value,\n usageLimit: null,\n oncePerCustomer: false,\n minSubtotal: null,\n appliesTo: 'all',\n productIds: [],\n categoryIds: [],\n startsAt: '1970-01-01T00:00:00Z',\n endsAt: null,\n status: 'active',\n timesUsed: 0,\n createdAt: '1970-01-01T00:00:00Z',\n updatedAt: '1970-01-01T00:00:00Z',\n })\n const preview = promotion ? previewCouponPercent([promotion], normalized, cartSnapshot()) : null\n if (!preview?.valid) {\n return { valid: false, percent: 0, message: REASON_MESSAGE[preview?.reason ?? 'not_found'] ?? 'Cupom inválido.' }\n }\n return { valid: true, percent: preview.percent }\n }, [config.discounts, config.promotions])\n}\n","import { create } from 'zustand'\n\nexport type ToastVariant = 'success' | 'error' | 'info'\n\nexport interface Toast {\n id: string\n title: string\n description?: string\n variant: ToastVariant\n durationMs: number\n}\n\ninterface ToastState {\n toasts: Toast[]\n push(input: { title: string; description?: string; variant?: ToastVariant; durationMs?: number }): string\n dismiss(id: string): void\n}\n\nlet seq = 0\n\nexport const useToastStore = create<ToastState>((set) => ({\n toasts: [],\n push: (input) => {\n const id = `toast-${++seq}-${Date.now()}`\n const toast: Toast = {\n id,\n title: input.title,\n description: input.description,\n variant: input.variant ?? 'info',\n durationMs: input.durationMs ?? 3400,\n }\n set((s) => ({ toasts: [...s.toasts, toast] }))\n return id\n },\n dismiss: (id) => set((s) => ({ toasts: s.toasts.filter((t) => t.id !== id) })),\n}))\n\n/** Imperative toast API — callable from components, store actions, or workflows. */\nexport const toast = {\n success: (title: string, description?: string) => useToastStore.getState().push({ title, description, variant: 'success' }),\n error: (title: string, description?: string) => useToastStore.getState().push({ title, description, variant: 'error' }),\n info: (title: string, description?: string) => useToastStore.getState().push({ title, description, variant: 'info' }),\n}\n","import React, { useEffect, useState } from 'react'\nimport { X, Trash2 } from 'lucide-react'\nimport {\n useCartStore,\n selectSubtotal,\n selectDiscountTotal,\n selectShipping,\n selectRequiresShipping,\n selectTotal,\n} from '../../stores/cart.store'\nimport { useDiscountValidator } from '../../hooks/use-discount-validator'\nimport { toast } from '../../stores/toast.store'\nimport { getStorefrontComponents, useStorefrontConfig } from '../../document/config'\nimport { navigateTo } from '../../app/router'\nimport { formatMoney } from '../../lib/format'\nimport { QuantityInput } from './QuantityInput'\nimport { formatPostalCode } from '@fayz-ai/core'\nimport { useDeliveryStore } from '../../stores/delivery.store'\nimport { DeliveryEstimator } from '../checkout/DeliveryEstimator'\nimport { TID } from '../../lib/testids'\nimport { SmoothImage } from '../SmoothImage'\nimport { Slot } from '../../extend/slots'\nimport { overrideComponent, overrideProps } from '../../extend/component-override'\nimport { getCartLineAnnotations, type CartLineAnnotation } from '../../extend/extension-points'\nimport type { CartLine } from '../../stores/cart.store'\n\n/** Annotations contributed through the cart.lineAnnotation extension point\n * (spine M7) — rendered under the line's options label. */\nfunction CartLineAnnotations({ line }: { line: CartLine }) {\n const [annotations, setAnnotations] = useState<CartLineAnnotation[]>([])\n useEffect(() => {\n let cancelled = false\n getCartLineAnnotations(line).then((next) => {\n if (!cancelled && next.length > 0) setAnnotations(next)\n })\n return () => {\n cancelled = true\n }\n }, [line.lineId ?? line.productId, line.quantity])\n if (annotations.length === 0) return null\n return (\n <>\n {annotations.map((annotation) => (\n <span key={annotation.key} data-line-annotation={annotation.key} className=\"text-xs text-muted-foreground\">\n {annotation.label}\n </span>\n ))}\n </>\n )\n}\n\nexport function CartDrawer() {\n const config = useStorefrontConfig()\n const cart = useCartStore()\n const components = getStorefrontComponents(config)\n // No SDK default exists for this one, so a props-only override has nothing to\n // adjust — it is component-or-nothing.\n const FooterExtra = overrideComponent(components.CartDrawerFooterExtra)\n const footerExtraProps = overrideProps(components.CartDrawerFooterExtra)\n const validate = useDiscountValidator()\n const [code, setCode] = useState('')\n const [discountError, setDiscountError] = useState<string | null>(null)\n const [applying, setApplying] = useState(false)\n\n // a11y: close on Escape while the drawer is open.\n useEffect(() => {\n if (!cart.isOpen) return\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') cart.closeDrawer()\n }\n document.addEventListener('keydown', onKey)\n return () => document.removeEventListener('keydown', onKey)\n }, [cart.isOpen, cart.closeDrawer])\n\n // Subscribed, not just read: selectShipping consults this store through\n // getState(), which does not subscribe, so without this hook a fresh quote\n // would change the price and leave the drawer showing the old one.\n const delivery = useDeliveryStore()\n\n const subtotal = selectSubtotal(cart)\n const discountTotal = selectDiscountTotal(cart)\n const shipping = selectShipping(cart, config)\n\n const total = selectTotal(cart, config)\n const money = (v: number) => formatMoney(v, config.currency, config.locale)\n\n const cartSlotContext = { lines: cart.lines, subtotal }\n\n async function applyCode() {\n setApplying(true)\n setDiscountError(null)\n try {\n const result = await validate(code)\n if (result.valid) {\n const applied = code.trim().toUpperCase()\n cart.applyDiscount(applied, result.percent)\n setCode('')\n toast.success('Cupom aplicado!', `${applied} • ${result.percent}% de desconto`)\n } else {\n setDiscountError(result.message ?? 'Cupom inválido.')\n toast.error('Cupom inválido', result.message ?? 'Verifique o código e tente novamente.')\n }\n } catch (err) {\n // Sem este catch o cupom falhava EM SILÊNCIO: a validação estourava (era\n // 401 na tabela de cupons), nada era mostrado e o botão voltava ao\n // normal. O comprador clicava e não acontecia nada.\n setDiscountError('Não conseguimos validar esse cupom agora.')\n toast.error('Não conseguimos validar o cupom', 'Tente de novo em alguns instantes.')\n console.warn('[cart] falha ao validar cupom', err)\n } finally {\n setApplying(false)\n }\n }\n\n if (!cart.isOpen) return null\n\n // Free-shipping nudge: how far from the threshold this cart is\n const freeAbove = config.shipping.freeAbove\n const missingForFree = freeAbove != null && subtotal < freeAbove ? freeAbove - subtotal : 0\n const progress = freeAbove != null ? Math.min(100, (subtotal / freeAbove) * 100) : 0\n\n return (\n <div className=\"fixed inset-0 z-50\">\n <div\n className=\"absolute inset-0 animate-fade-in bg-black/40\"\n aria-hidden\n onClick={cart.closeDrawer}\n />\n {/* One column at every width. The desktop 2-column variant was removed:\n it split the cart into two panels and pushed the items away from the\n total. */}\n <div\n data-testid={TID.cartDrawer}\n role=\"dialog\"\n aria-label=\"Carrinho\"\n className=\"absolute right-0 top-0 flex h-full w-full max-w-md animate-slide-in-from-right flex-col bg-background shadow-2xl\"\n >\n <div className=\"flex items-center justify-between border-b px-5 py-4\">\n <h2 className=\"text-lg font-semibold\">Carrinho</h2>\n <button\n type=\"button\"\n aria-label=\"Fechar carrinho\"\n onClick={cart.closeDrawer}\n className=\"grid min-h-11 min-w-11 place-items-center rounded-full p-1.5 hover:bg-muted sm:min-h-0 sm:min-w-0\"\n >\n <X className=\"h-5 w-5\" />\n </button>\n </div>\n\n {cart.lines.length === 0 ? (\n <div data-testid={TID.cartEmpty} className=\"flex flex-1 items-center justify-center p-8 text-center text-muted-foreground\">\n Seu carrinho está vazio.\n </div>\n ) : (\n <>\n {freeAbove != null && (\n <div data-testid={TID.shippingProgress} className=\"border-b bg-muted/40 px-5 py-3\">\n <p className=\"text-xs font-medium\">\n {missingForFree > 0 ? (\n <>Faltam <strong>{money(missingForFree)}</strong> para frete grátis 🚚</>\n ) : (\n <>🎉 Você ganhou <strong>frete grátis</strong>!</>\n )}\n </p>\n <div className=\"mt-2 h-1.5 overflow-hidden rounded-full bg-border\">\n <div\n className=\"h-full rounded-full bg-primary transition-all duration-500 ease-out\"\n style={{ width: `${progress}%` }}\n />\n </div>\n </div>\n )}\n <div\n data-testid={TID.cartLinesList}\n className=\"flex-1 space-y-4 overflow-y-auto py-4 pl-5 pr-6\"\n style={{ scrollbarGutter: 'stable' }}\n >\n <Slot area=\"cart\" name=\"beforeLines\" context={cartSlotContext} />\n {cart.lines.map((line) => (\n <div\n key={line.lineId ?? line.productId}\n data-testid={TID.cartLine}\n data-product-id={line.productId}\n data-line-id={line.lineId ?? line.productId}\n className={`flex animate-fade-up gap-3 rounded-lg p-1.5 transition-all hover:bg-muted/40 ${\n (line.lineId ?? line.productId) === cart.justAddedLineId\n ? 'bg-primary/5 ring-1 ring-primary/30'\n : ''\n }`}\n >\n {line.imageUrl && (\n <SmoothImage src={line.imageUrl} alt={line.name} className=\"h-20 w-20 shrink-0 rounded-lg border object-cover\" />\n )}\n <div className=\"flex flex-1 flex-col\">\n <div className=\"flex items-start justify-between gap-2\">\n <span className=\"text-sm font-medium leading-snug\">{line.name}</span>\n <button\n type=\"button\"\n data-testid={TID.lineRemove}\n aria-label={`Remover ${line.name}`}\n onClick={() => cart.removeItem(line.lineId ?? line.productId)}\n className=\"-m-1.5 grid min-h-11 min-w-11 place-items-center p-1.5 text-muted-foreground hover:text-destructive sm:min-h-0 sm:min-w-0\"\n >\n <Trash2 className=\"h-4 w-4\" />\n </button>\n </div>\n <span className=\"text-xs text-muted-foreground\">{line.sku}</span>\n {line.optionsLabel && (\n <span className=\"text-xs text-muted-foreground\">{line.optionsLabel}</span>\n )}\n <CartLineAnnotations line={line} />\n <div className=\"mt-auto flex items-center justify-between pt-2\">\n <QuantityInput\n value={line.quantity}\n max={line.maxQuantity || undefined}\n onChange={(n) => cart.setQuantity(line.lineId ?? line.productId, n)}\n testId={TID.lineQty}\n incTestId={TID.lineInc}\n decTestId={TID.lineDec}\n />\n <span\n className=\"text-sm font-semibold\"\n data-price={(line.unitPrice * line.quantity).toFixed(2)}\n >\n {money(line.unitPrice * line.quantity)}\n </span>\n </div>\n </div>\n </div>\n ))}\n </div>\n\n <div\n data-testid={TID.cartFooter}\n className=\"space-y-3 border-t px-5 py-4\"\n >\n {config.features.discounts && (\n <div className=\"space-y-1\">\n <div className=\"flex gap-2\">\n <input\n data-testid={TID.discountInput}\n type=\"text\"\n placeholder=\"Cupom de desconto\"\n value={code}\n onChange={(e) => setCode(e.target.value)}\n className=\"flex-1 rounded-lg border bg-background px-3 py-2 text-sm uppercase\"\n />\n <button\n type=\"button\"\n data-testid={TID.discountApply}\n onClick={applyCode}\n disabled={applying || !code.trim()}\n className=\"rounded-lg border px-3 py-2 text-sm font-medium hover:bg-muted disabled:opacity-50\"\n >\n Aplicar\n </button>\n </div>\n {discountError && (\n <p data-testid={TID.discountError} className=\"text-xs text-destructive\">\n {discountError}\n </p>\n )}\n </div>\n )}\n\n <Slot area=\"cart\" name=\"beforeSummary\" context={cartSlotContext} />\n\n {/* Second chance to give a CEP for anyone who added to cart from\n the catalogue and never opened a product page. Absent when\n nothing in the cart travels: asking a buyer of downloads for a\n postcode is asking for an answer nobody uses. */}\n {selectRequiresShipping(cart) && (\n <div className=\"mb-3\">\n <DeliveryEstimator compact />\n </div>\n )}\n\n <dl className=\"space-y-1.5 text-sm\">\n <div className=\"flex justify-between\">\n <dt className=\"text-muted-foreground\">Subtotal</dt>\n <dd data-testid={TID.cartSubtotal} data-price={subtotal.toFixed(2)}>{money(subtotal)}</dd>\n </div>\n {discountTotal > 0 && (\n <div className=\"flex justify-between text-emerald-700\" data-testid={TID.discountRow}>\n <dt>\n Desconto{' '}\n <button\n type=\"button\"\n onClick={cart.clearDiscount}\n className=\"inline-block py-1 text-xs text-muted-foreground underline\"\n >\n ({cart.discountCode} ✕)\n </button>\n </dt>\n <dd data-price={discountTotal.toFixed(2)}>−{money(discountTotal)}</dd>\n </div>\n )}\n <div className=\"flex justify-between\">\n <dt className=\"text-muted-foreground\">\n Frete\n {delivery.status === 'served' && delivery.postalCode && (\n <span className=\"ml-1 text-xs\">\n · {formatPostalCode(delivery.postalCode)}\n </span>\n )}\n </dt>\n <dd data-testid={TID.cartShipping} data-price={shipping.toFixed(2)}>\n {shipping === 0 ? 'Grátis' : money(shipping)}\n </dd>\n </div>\n <div className=\"flex justify-between border-t pt-2 text-base font-semibold\">\n <dt>Total</dt>\n <dd data-testid={TID.cartTotal} data-price={total.toFixed(2)}>{money(total)}</dd>\n </div>\n </dl>\n\n <button\n type=\"button\"\n data-testid={TID.goCheckout}\n onClick={() => {\n cart.closeDrawer()\n navigateTo('/checkout')\n }}\n className=\"sf-cta w-full bg-primary py-3.5 font-semibold text-primary-foreground shadow-md transition-all hover:-translate-y-0.5 hover:shadow-lg\"\n style={{ borderRadius: 'var(--sf-radius-button)' }}\n >\n Finalizar compra\n </button>\n\n <Slot area=\"cart\" name=\"afterSummary\" context={cartSlotContext} />\n\n {FooterExtra && (\n <FooterExtra cart={cart} config={config} commerceMode={config.commerceMode} {...footerExtraProps} />\n )}\n </div>\n </>\n )}\n </div>\n </div>\n )\n}\n","import React from 'react'\nimport { useStorefrontConfig } from '../document/config'\nimport { useStorefrontHead } from '../hooks/use-storefront-head'\nimport type { StorefrontContentPageConfig } from '../blocks/page-blocks'\nimport { mergePageTheme, pageThemeSelector } from '../blocks/page-blocks'\nimport { StorefrontThemeStyle } from '../lib/theme'\nimport { StorefrontPage } from './StorefrontPage'\n\n// ---------------------------------------------------------------------------\n// An editorial page: title in the head, blocks on the page, store chrome\n// around it — and nothing else. The commerce pages assume a body block\n// (catalogBody/productBody); a content page deliberately assumes nothing, so\n// \"biography\", \"philosophy\" or \"press\" is a document entry instead of a\n// hand-written custom route.\n//\n// A page may also carry its own palette (`page.theme`), which is what turns\n// this into the campaign/collection page too. The overlay is emitted scoped to\n// the wrapper's `data-page`, so nothing it declares reaches the shell.\n// ---------------------------------------------------------------------------\n\nfunction titleFromSlug(slug: string): string {\n return slug\n .split('-')\n .filter(Boolean)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(' ')\n}\n\nexport interface ContentPageProps {\n slug: string\n page: StorefrontContentPageConfig\n /** Params matched from the page's path pattern (`/categoria/:slug`). They\n * win over the page's own slug, so a pattern's `:slug` means the URL's. */\n params?: Record<string, string>\n}\n\nexport function ContentPage({ slug, page, params }: ContentPageProps) {\n const config = useStorefrontConfig()\n const title = page.title ?? titleFromSlug(slug)\n useStorefrontHead({ title: `${title} — ${config.name}` })\n\n const theme = page.theme ? mergePageTheme(config.theme, page.theme) : undefined\n const body = <StorefrontPage kind=\"content\" page={page} params={{ slug, ...params }} />\n if (!theme) return body\n\n return (\n <div data-page={slug} data-testid=\"content-page-themed\">\n <StorefrontThemeStyle theme={theme} selector={pageThemeSelector(slug)} />\n {body}\n </div>\n )\n}\n","import type { ShopProvider } from '@fayz-ai/shop/provider'\nimport { matchPath } from './router'\nimport { matchContentPage } from '../blocks/page-blocks'\nimport { resolveConfig } from '../document/config'\nimport type { StorefrontConfig, ResolvedStorefrontConfig } from '../document/config'\n\n// ---------------------------------------------------------------------------\n// How a store is served, once its pages have URLs of their own.\n//\n// Two questions a host has to answer that the shell cannot: which paths exist\n// at all (what to prerender, what to put in a sitemap), and which of them are\n// the same for every visitor (what a shared cache may hold). Both are\n// properties of the route, so they are decided here rather than by each host\n// re-deriving them — and the second one has a failure mode a CDN makes\n// invisible: cache a cart or an order confirmation once and it is served to the\n// next shopper.\n// ---------------------------------------------------------------------------\n\nexport type StorefrontRouteMatch =\n | { kind: 'custom'; route: NonNullable<ResolvedStorefrontConfig['routes']>[number]; params: Record<string, string> }\n | { kind: 'product'; params: Record<string, string> }\n | { kind: 'order'; params: Record<string, string> }\n | { kind: 'checkout' }\n | { kind: 'account' }\n | { kind: 'catalog' }\n | { kind: 'searchResults' }\n | { kind: 'policy'; policy: 'privacy' | 'terms' | 'returns' }\n | { kind: 'content'; slug: string; params: Record<string, string> }\n | { kind: 'home' }\n | { kind: 'notFound' }\n\n/**\n * What a path means, resolved once.\n *\n * The shell renders from this, cacheability is derived from it, and a host\n * framework asks it whether a URL exists at all before choosing a status code.\n * Those three answering separately is how a page ends up rendered as one thing\n * and cached or statused as another.\n *\n * The query string is stripped first: it addresses state WITHIN a page, so\n * `/?utm_source=instagram` is the home page — the single most common shape of\n * inbound marketing link, and a 404 for it is a silent, expensive bug.\n */\nexport function resolveStorefrontRoute(\n config: StorefrontConfig | ResolvedStorefrontConfig,\n rawPath: string,\n): StorefrontRouteMatch {\n const resolved = ensureResolved(config)\n const path = rawPath.split('?')[0] || '/'\n\n for (const route of resolved.routes ?? []) {\n const params = matchPath(route.path, path)\n if (params) return { kind: 'custom', route, params }\n }\n\n const product = matchPath('/product/:slug', path)\n if (product?.slug) return { kind: 'product', params: product }\n\n const order = matchPath('/order/:id', path)\n if (order?.id) return { kind: 'order', params: order }\n\n // Matched regardless of the feature flag: a disabled checkout still owns its\n // URL rather than falling through to an unrelated page.\n if (matchPath('/checkout', path)) return { kind: 'checkout' }\n if (matchPath('/account', path)) return { kind: 'account' }\n if (matchPath('/catalog', path)) return { kind: 'catalog' }\n if (resolved.search.mode === 'overlay' && matchPath(resolved.search.resultsPath, path)) {\n return { kind: 'searchResults' }\n }\n if (matchPath('/privacy', path)) return { kind: 'policy', policy: 'privacy' }\n if (matchPath('/terms', path)) return { kind: 'policy', policy: 'terms' }\n if (matchPath('/refunds', path)) return { kind: 'policy', policy: 'returns' }\n\n const content = matchContentPage(resolved.pages, path)\n if (content) return { kind: 'content', slug: content.slug, params: content.params }\n\n if (path === '/' || path === '') return { kind: 'home' }\n return { kind: 'notFound' }\n}\n\n/** Whether a URL exists at all — what a host needs before choosing a status. */\nexport function isKnownPath(\n config: StorefrontConfig | ResolvedStorefrontConfig,\n path: string,\n): boolean {\n return resolveStorefrontRoute(config, path).kind !== 'notFound'\n}\n\n/** Paths whose HTML is per-shopper and must never enter a shared cache. */\nconst PRIVATE_PATTERNS = ['/checkout', '/account', '/order/:id'] as const\n\n/** Paths the SDK serves that exist without knowing any product. */\nconst STATIC_PATTERNS = ['/', '/catalog', '/privacy', '/terms', '/refunds'] as const\n\nfunction ensureResolved(config: StorefrontConfig | ResolvedStorefrontConfig): ResolvedStorefrontConfig {\n return 'features' in config && 'pages' in config\n ? (config as ResolvedStorefrontConfig)\n : resolveConfig(config)\n}\n\n/**\n * Whether `path`'s HTML is identical for every visitor.\n *\n * Conservative by construction: a store's own route is private unless it says\n * otherwise, because guessing \"public\" is the direction that leaks one\n * shopper's page to another.\n */\nexport function isPublicPath(\n config: StorefrontConfig | ResolvedStorefrontConfig,\n path: string,\n): boolean {\n const match = resolveStorefrontRoute(config, path)\n switch (match.kind) {\n case 'checkout':\n case 'account':\n case 'order':\n return false\n case 'custom':\n return (\n match.route.kind !== 'checkout' &&\n match.route.kind !== 'account' &&\n match.route.chrome !== 'focused'\n )\n default:\n return true\n }\n}\n\n/**\n * Every path worth prerendering, and the same list a sitemap should carry.\n *\n * Product URLs come from the catalogue rather than the route table, so the\n * provider is asked rather than guessed at. Custom routes with parameters are\n * skipped: the SDK cannot know what values a store's own route accepts, and\n * emitting `/colecao/:slug` into a sitemap is worse than omitting it.\n */\nexport async function storefrontPaths(input: {\n config: StorefrontConfig | ResolvedStorefrontConfig\n provider: ShopProvider\n /** Include per-shopper routes. Off by default — they are not prerenderable. */\n includePrivate?: boolean\n}): Promise<string[]> {\n const resolved = ensureResolved(input.config)\n const paths = [...STATIC_PATTERNS] as string[]\n\n for (const route of resolved.routes ?? []) {\n if (!route.path.includes(':')) paths.push(route.path)\n }\n\n const products = await input.provider.listProducts({ status: 'active' })\n for (const product of products) paths.push(`/product/${product.slug}`)\n\n const unique = Array.from(new Set(paths))\n return input.includePrivate ? unique : unique.filter((p) => isPublicPath(resolved, p))\n}\n","// ---------------------------------------------------------------------------\n// Os pedidos que ESTE navegador fez.\n//\n// Existe por causa de 0055. \"Minhas compras\" listava pedidos chamando\n// `shop_list_orders(customer_id)` — e essa função deixava um chamador anônimo\n// ler o histórico de qualquer cliente, com endereço de entrega, a partir de um\n// id que saía de sondar um e-mail. A trava foi corrigida, e com ela caiu a\n// única forma que um convidado tinha de rever a própria compra.\n//\n// A reposição não reabre o buraco: em vez de PERGUNTAR ao servidor \"o que é\n// deste cliente?\", o navegador lembra os ids que ele mesmo criou e busca um a\n// um por `shop_get_order(uuid)`. O uuid v4 é a credencial — o mesmo desenho que\n// já sustenta a página de confirmação — e ninguém consegue listar o que não\n// fez.\n//\n// Some quando o comprador limpa o navegador, e isso é honesto: quem quer\n// histórico que atravessa aparelhos precisa de conta de verdade.\n// ---------------------------------------------------------------------------\n\nconst KEY = 'fayz.storefront.orders.v1'\n/** O bastante para a página de conta; mais que isso é caso de criar conta. */\nconst MAX = 25\n\nfunction read(): string[] {\n try {\n const raw = globalThis.localStorage?.getItem(KEY)\n const parsed = raw ? JSON.parse(raw) : []\n return Array.isArray(parsed) ? parsed.filter((id) => typeof id === 'string') : []\n } catch {\n // Modo privado, storage cheio, JSON corrompido — nenhum deles é motivo para\n // derrubar a loja.\n return []\n }\n}\n\nexport function rememberLocalOrder(orderId: string): void {\n if (!orderId) return\n try {\n const next = [orderId, ...read().filter((id) => id !== orderId)].slice(0, MAX)\n globalThis.localStorage?.setItem(KEY, JSON.stringify(next))\n } catch {\n /* ver acima */\n }\n}\n\n/** Mais recente primeiro, que é a ordem em que foram lembrados. */\nexport function listLocalOrderIds(): string[] {\n return read()\n}\n\nexport function forgetLocalOrders(): void {\n try {\n globalThis.localStorage?.removeItem(KEY)\n } catch {\n /* ver acima */\n }\n}\n","/**\n * The message inside a thrown value.\n *\n * `err instanceof Error` is not enough here: the Supabase provider rethrows\n * PostgrestError, a plain object with `message`, so every `instanceof` check in\n * the storefront fell through to a generic sentence and lost what the server said.\n */\nexport function errorMessage(err: unknown): string {\n if (err instanceof Error) return err.message\n if (err && typeof err === 'object' && typeof (err as { message?: unknown }).message === 'string') {\n return (err as { message: string }).message\n }\n return ''\n}\n","import { getShopProvider } from '@fayz-ai/shop/runtime'\nimport type { Order, ShippingAddressInput, PaymentMethodKind } from '@fayz-ai/shop/types'\nimport { establishCustomerSession } from '../data/auth'\nimport { collectOrderMetadata, runBeforePlaceOrderValve } from '../extend/extension-points'\nimport type { ResolvedStorefrontConfig } from '../document/config'\nimport type { CartState } from '../stores/cart.store'\nimport { selectShipping } from '../stores/cart.store'\nimport type { SessionState } from '../stores/session.store'\nimport { rememberLocalOrder } from '../data/local-orders'\nimport { errorMessage } from '../lib/errors'\n\nexport interface StorefrontCheckoutCustomer {\n email: string\n name: string\n}\n\nexport interface StorefrontCheckoutAddress {\n street?: string\n city?: string\n zip?: string\n notes?: string\n}\n\nexport interface PlaceStorefrontOrderInput {\n config: ResolvedStorefrontConfig\n cart: Pick<CartState, 'lines' | 'discountCode' | 'discountPercent'>\n session?: Pick<SessionState, 'customerId' | 'email'>\n customer: StorefrontCheckoutCustomer\n address?: StorefrontCheckoutAddress\n /** Structured address; without it the order keeps only the free-text note. */\n shippingAddress?: ShippingAddressInput\n paymentMethod?: PaymentMethodKind\n markPaid?: boolean\n}\n\nexport interface PlaceStorefrontOrderResult {\n order: Order\n customerId: string\n}\n\n/**\n * `notes` is the buyer's free-text message to the store — nothing else.\n *\n * It used to double as the delivery address, from back when the order had\n * nowhere structured to put one. Now that the address is a real snapshot plus a\n * row in the address book, repeating it here only creates a second copy that\n * can disagree with the first (it did: it dropped number and district). When a\n * structured address is present, notes carries only what the customer wrote.\n */\nfunction formatDeliveryNotes(\n address: StorefrontCheckoutAddress | undefined,\n shippingAddress?: ShippingAddressInput,\n): string | undefined {\n if (address?.notes?.trim()) return address.notes.trim()\n\n // Structured address present → the order already knows where to deliver.\n if (shippingAddress) return undefined\n\n if (!address) return undefined\n const parts = [address.street, address.city, address.zip]\n .map((part) => part?.trim())\n .filter(Boolean)\n\n return parts.length > 0 ? `Entrega: ${parts.join(', ')}` : undefined\n}\n\n/** shop_place_order's three refusals of a customer id we sent (all 42501). */\nfunction isStaleCustomerError(err: unknown): boolean {\n const message = errorMessage(err).toLowerCase()\n return message.includes('customer email mismatch')\n || message.includes('customer does not belong to this store')\n || message.includes('customer belongs to another account')\n}\n\n/**\n * Storefront checkout primitive for custom/generated checkout screens.\n * It owns the order payload math and customer-session handshake so app-owned\n * routes can customize UX without copying provider/business logic.\n */\nexport async function placeStorefrontOrder({\n config,\n cart,\n session,\n customer,\n address,\n shippingAddress,\n paymentMethod,\n markPaid = false,\n}: PlaceStorefrontOrderInput): Promise<PlaceStorefrontOrderResult> {\n const email = customer.email.trim().toLowerCase()\n const name = customer.name.trim()\n const provider = getShopProvider()\n\n let customerId = session?.customerId ?? null\n // Normalized on both sides: the session email is stored as the buyer typed it,\n // so \"Vini@Gmail.com\" vs \"vini@gmail.com\" used to re-resolve on every order.\n if (!customerId || session?.email?.trim().toLowerCase() !== email) {\n const established = await establishCustomerSession(email, { name })\n customerId = established.customerId\n }\n\n const notes = formatDeliveryNotes(address, shippingAddress)\n const items = cart.lines.map((line) => ({\n productId: line.productId,\n // The variant the shopper picked (spine M5): the server prices the line\n // from it and decrements ITS stock, so two sizes never share a counter.\n variantId: line.variantId || undefined,\n quantity: line.quantity,\n optionsLabel: line.optionsLabel || undefined,\n }))\n const shippingTotal = selectShipping(cart, config)\n\n // THE escape valve (spine I4, M7): exactly one registrant may replace the\n // entire default order creation — external OMS, quote-first flows. Null (or\n // no registrant, the overwhelmingly common case) takes the default path.\n const replaced = await runBeforePlaceOrderValve<Order>({\n items,\n customer: { name, email },\n currency: config.currency,\n discountCode: cart.discountCode ?? undefined,\n shippingTotal,\n notes,\n customerId: customerId ?? undefined,\n })\n if (replaced) return { order: replaced, customerId: customerId ?? replaced.customerId ?? '' }\n\n // Extension contributions (spine M7's order.metadata point), namespaced by\n // handler id so two extensions can never collide on a key.\n const metadata = await collectOrderMetadata({\n items: cart.lines.map((line) => ({\n productId: line.productId,\n quantity: line.quantity,\n unitPrice: line.unitPrice,\n })),\n subtotal: cart.lines.reduce((sum, line) => sum + line.unitPrice * line.quantity, 0),\n customerEmail: email,\n })\n\n // Trusted placement: send only product ids + quantities. The provider\n // (shop_place_order RPC on Supabase, in-memory provider in mock) re-reads\n // prices, validates the discount, and decrements inventory server-side.\n const place = (withCustomerId: string | undefined) => provider.placeOrder({\n customerId: withCustomerId,\n customer: { name, email },\n currency: config.currency,\n notes,\n discountCode: cart.discountCode ?? undefined,\n shippingTotal,\n // Structured address + method are what populate public.addresses and the\n // transactions ledger. `notes` stays for backwards compatibility with\n // checkouts that have not been updated yet.\n shippingAddress,\n paymentMethod,\n metadata,\n items,\n })\n\n let order: Order\n try {\n order = await place(customerId ?? undefined)\n } catch (err) {\n // The customer id lives in localStorage, shared by every store on the\n // origin and never re-verified, so it can point at a row that is not this\n // buyer's (another tenant, another account, an email edited since). The\n // server is right to refuse it — but the id is ours, not a credential, so\n // dropping it and letting the RPC resolve the customer from the typed email\n // is the fix. Without this the buyer is stuck on a raw 42501 forever: the\n // stale id survives every reload.\n if (!customerId || !isStaleCustomerError(err)) throw err\n customerId = null\n order = await place(undefined)\n }\n\n if (markPaid) {\n // Prefer the RPC seam — anon storefronts have no UPDATE grant on the\n // orders table, so a direct updateOrder 401s on pool backends.\n if (provider.confirmPayment) await provider.confirmPayment(order.id)\n else await provider.updateOrder(order.id, { financialStatus: 'paid' })\n }\n\n // Guardado localmente para que \"Minhas compras\" funcione sem que o servidor\n // precise responder \"o que é deste cliente?\" — ver data/local-orders.ts.\n rememberLocalOrder(order.id)\n\n return { order, customerId: customerId ?? order.customerId ?? '' }\n}\n","import React, { useEffect, useState } from 'react'\nimport { Lock, X } from 'lucide-react'\nimport { establishCustomerSession } from '../../data/auth'\nimport { useSessionStore } from '../../stores/session.store'\nimport { Link } from '../../app/router'\n\ninterface SignInModalProps {\n /** Prefill the email field (e.g. from a checkout contact field). */\n defaultEmail?: string\n onClose: () => void\n /** Called after a successful sign-in, with the resolved session. */\n onSignedIn?: (session: { email: string | null; name: string | null }) => void\n}\n\n/**\n * Customer sign-in as a focused modal dialog. Used from checkout (\"Já tem\n * conta? Entrar\") so a returning buyer can authenticate without leaving the\n * page. Auth goes through the shared establishCustomerSession path.\n */\nexport function SignInModal({ defaultEmail = '', onClose, onSignedIn }: SignInModalProps) {\n const [email, setEmail] = useState(defaultEmail)\n const [password, setPassword] = useState('')\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n useEffect(() => {\n const onKey = (event: KeyboardEvent) => { if (event.key === 'Escape') onClose() }\n document.addEventListener('keydown', onKey)\n return () => document.removeEventListener('keydown', onKey)\n }, [onClose])\n\n async function submit(event: React.FormEvent) {\n event.preventDefault()\n if (!email.trim() || !password) return\n setBusy(true)\n setError(null)\n try {\n await establishCustomerSession(email, { password })\n const session = useSessionStore.getState()\n onSignedIn?.({ email: session.email, name: session.name })\n onClose()\n } catch {\n setError('Não foi possível entrar. Verifique seu e-mail e senha.')\n } finally {\n setBusy(false)\n }\n }\n\n return (\n <div\n className=\"fixed inset-0 z-[60] flex items-center justify-center p-4\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Entrar na sua conta\"\n >\n <div className=\"absolute inset-0 animate-fade-in bg-foreground/40 backdrop-blur-sm\" onClick={onClose} />\n <div\n className=\"relative z-10 w-full max-w-sm animate-fade-up border bg-card p-6 shadow-2xl\"\n style={{ borderRadius: 'var(--sf-radius-card)' }}\n >\n <button\n type=\"button\"\n onClick={onClose}\n aria-label=\"Fechar\"\n className=\"absolute right-4 top-4 rounded-full p-1 text-muted-foreground transition hover:bg-muted hover:text-foreground\"\n >\n <X className=\"h-5 w-5\" />\n </button>\n\n <div className=\"flex items-center gap-2\">\n <span className=\"flex h-9 w-9 items-center justify-center rounded-full bg-primary/10 text-primary\">\n <Lock className=\"h-4 w-4\" />\n </span>\n <div>\n <h2 className=\"sf-heading text-lg font-semibold leading-tight\">Entrar na sua conta</h2>\n <p className=\"text-xs text-muted-foreground\">Use seus dados salvos e acompanhe pedidos.</p>\n </div>\n </div>\n\n <form onSubmit={submit} className=\"mt-5 space-y-3\">\n <input\n type=\"email\"\n required\n autoFocus\n placeholder=\"voce@exemplo.com\"\n value={email}\n onChange={(event) => setEmail(event.target.value)}\n className=\"w-full border bg-background px-3 py-2.5 text-sm outline-none transition focus:border-primary focus:ring-2 focus:ring-primary/10\"\n style={{ borderRadius: 'var(--sf-radius-input)' }}\n />\n <input\n type=\"password\"\n required\n placeholder=\"Senha\"\n value={password}\n onChange={(event) => setPassword(event.target.value)}\n className=\"w-full border bg-background px-3 py-2.5 text-sm outline-none transition focus:border-primary focus:ring-2 focus:ring-primary/10\"\n style={{ borderRadius: 'var(--sf-radius-input)' }}\n />\n {error && <p className=\"text-sm text-destructive\">{error}</p>}\n <button\n type=\"submit\"\n disabled={busy}\n className=\"sf-cta w-full bg-primary py-3 font-semibold text-primary-foreground shadow-md transition-all hover:-translate-y-0.5 hover:shadow-lg disabled:opacity-60\"\n style={{ borderRadius: 'var(--sf-radius-button)' }}\n >\n {busy ? 'Entrando…' : 'Entrar'}\n </button>\n </form>\n\n <p className=\"mt-4 text-center text-sm text-muted-foreground\">\n Não tem conta?{' '}\n <Link to=\"/account\" onClick={onClose} className=\"font-semibold text-primary hover:underline\">\n Criar conta\n </Link>\n </p>\n </div>\n </div>\n )\n}\n","import React from 'react'\nimport { Check } from 'lucide-react'\nimport { TID } from '../../lib/testids'\n\n// ---------------------------------------------------------------------------\n// Onde a pessoa está, e para onde ela pode voltar.\n//\n// Antes isto era três palavras soltas (\"Informações / Entrega / Pagamento\") que\n// nunca mudavam: um enfeite que dizia sempre a mesma coisa enquanto o formulário\n// inteiro estava numa página só. Agora é o mapa do que já ficou pronto.\n//\n// Passo concluído é CLICÁVEL e o que vem à frente não é — voltar para corrigir o\n// endereço é normal; pular para o pagamento sem endereço não existe.\n// ---------------------------------------------------------------------------\n\nexport type CheckoutStep = 1 | 2 | 3 | 4\n\nconst LABELS: Record<CheckoutStep, string> = {\n 1: 'Dados',\n 2: 'Entrega',\n 3: 'Pagamento',\n 4: 'Pronto',\n}\n\nexport interface CheckoutStepsProps {\n current: CheckoutStep\n /** Ausente no passo 4: depois de pago não há para onde voltar. */\n onGoBackTo?: (step: CheckoutStep) => void\n}\n\nexport function CheckoutSteps({ current, onGoBackTo }: CheckoutStepsProps) {\n const steps: CheckoutStep[] = [1, 2, 3, 4]\n\n return (\n <nav data-testid={TID.checkoutSteps} aria-label=\"Etapas do checkout\" className=\"mb-8\">\n <ol className=\"flex items-center gap-1.5 sm:gap-2\">\n {steps.map((step, index) => {\n const done = step < current\n const active = step === current\n const canGoBack = done && !!onGoBackTo\n const Tag = canGoBack ? 'button' : 'div'\n\n return (\n <li key={step} className=\"flex min-w-0 flex-1 items-center gap-1.5 sm:gap-2\">\n <Tag\n {...(canGoBack\n ? { type: 'button' as const, onClick: () => onGoBackTo(step) }\n : {})}\n data-testid={TID.checkoutStep(step)}\n data-state={done ? 'done' : active ? 'current' : 'pending'}\n aria-current={active ? 'step' : undefined}\n className={[\n 'flex min-w-0 items-center gap-2 rounded-lg px-2 py-1.5 text-left transition',\n canGoBack ? 'hover:bg-muted' : '',\n active ? 'text-foreground' : done ? 'text-foreground' : 'text-muted-foreground',\n ].join(' ')}\n >\n <span\n className={[\n 'grid h-7 w-7 shrink-0 place-items-center rounded-full border text-xs font-semibold',\n done\n ? 'border-primary bg-primary text-primary-foreground'\n : active\n // Contornado, não preenchido: em andamento não é concluído.\n // Foi o mesmo engano na linha do tempo do pedido, onde um\n // pagamento pendente exibia um tique.\n ? 'border-primary bg-background text-primary'\n : 'border-muted-foreground/30 bg-background',\n ].join(' ')}\n >\n {done ? <Check className=\"h-3.5 w-3.5\" /> : step}\n </span>\n <span className={`hidden truncate text-sm sm:inline ${active ? 'font-semibold' : ''}`}>\n {LABELS[step]}\n </span>\n </Tag>\n {index < steps.length - 1 && (\n <span aria-hidden className={`h-px flex-1 ${done ? 'bg-primary' : 'bg-border'}`} />\n )}\n </li>\n )\n })}\n </ol>\n {/* No celular o rótulo do passo some para o traço caber; sem esta linha a\n pessoa vê números sem saber o que eles são. */}\n <p className=\"mt-2 text-sm font-semibold sm:hidden\">\n {current}. {LABELS[current]}\n </p>\n </nav>\n )\n}\n","import React from 'react'\n\n// Local, not @fayz-ai/ui's Skeleton: the checkout views live in the main entry,\n// which keeps the design system out of its module graph (see ui.ts).\n\nexport interface SkeletonProps {\n className?: string\n style?: React.CSSProperties\n}\n\n/** One bar, circle or square. Put it inside a `SkeletonGroup`. */\nexport function Skeleton({ className = '', style }: SkeletonProps) {\n // No pulse of its own — the group pulses the whole block in phase.\n return <span aria-hidden className={`block rounded bg-muted ${className}`} style={style} />\n}\n\nexport interface SkeletonGroupProps extends React.HTMLAttributes<HTMLDivElement> {\n /** What is loading, for screen readers. */\n label: string\n}\n\nexport function SkeletonGroup({ label, className = '', children, ...rest }: SkeletonGroupProps) {\n return (\n <div\n role=\"status\"\n aria-busy=\"true\"\n className={`animate-pulse motion-reduce:animate-none ${className}`}\n {...rest}\n >\n <span className=\"sr-only\">{label}</span>\n {children}\n </div>\n )\n}\n\n/** The waiting beat for places a skeleton cannot go — inside a button, beside text. */\nexport function PulseDot({ className = '' }: { className?: string }) {\n return (\n <span aria-hidden className={`relative flex h-2.5 w-2.5 shrink-0 ${className}`}>\n <span className=\"absolute inset-0 animate-ping rounded-full bg-current opacity-60 motion-reduce:animate-none\" />\n <span className=\"relative inline-flex h-2.5 w-2.5 rounded-full bg-current\" />\n </span>\n )\n}\n","import React, { useCallback, useEffect, useRef, useState } from 'react'\nimport { Check, Copy, QrCode } from 'lucide-react'\nimport { getShopProvider } from '@fayz-ai/shop/runtime'\nimport type { CheckoutSessionInput, PaymentCharge } from '@fayz-ai/shop/types'\nimport { TID } from '../../lib/testids'\nimport { toast } from '../../stores/toast.store'\nimport { PulseDot, Skeleton, SkeletonGroup } from '../Skeleton'\n\n// ---------------------------------------------------------------------------\n// O passo 3, e a razão de ele existir.\n//\n// O pedido NÃO existe enquanto esta tela estiver aberta. O que existe é uma\n// sessão de checkout: o servidor congelou o carrinho com os preços que ele mesmo\n// recalculou e abriu a cobrança. Quando o provedor diz que o dinheiro entrou, é\n// o SERVIDOR quem cria o pedido a partir desse congelado — e só então a tela\n// avança.\n//\n// Isso é o oposto do que a loja fazia: criar o pedido, comemorar com confete, e\n// esperar que alguém pagasse depois.\n// ---------------------------------------------------------------------------\n\n/** Curto o bastante para parecer vivo, longo o bastante para não brigar com a\n * rede nem com o limite do provedor. */\nconst POLL_MS = 3_000\n\nexport interface CheckoutPaymentProps {\n input: CheckoutSessionInput\n /** Chamado uma vez, com o pedido que o servidor criou. */\n onPaid: (orderId: string) => void\n onBack: () => void\n money: (value: number) => string\n /**\n * A loja não tem adquirente — não é um erro do comprador, e ele não pode\n * fazer nada a respeito. Quem sabe disso é o servidor, então em vez de pintar\n * um erro na tela avisamos o checkout para oferecer o pedido sem cobrança.\n */\n onUnavailable?: () => void\n}\n\ntype Phase = 'opening' | 'waiting' | 'settling' | 'error'\n\nexport function CheckoutPayment({ input, onPaid, onBack, money, onUnavailable }: CheckoutPaymentProps) {\n const [phase, setPhase] = useState<Phase>('opening')\n const [charge, setCharge] = useState<PaymentCharge | null>(null)\n const [total, setTotal] = useState<number | null>(null)\n const [sessionId, setSessionId] = useState<string | null>(null)\n /** Quem abriu a cobrança. A consulta tem que bater na função DESTE gateway —\n * reler os ajustes agora perguntaria ao adquirente novo por uma transação\n * que está no antigo. */\n const [provider, setProvider] = useState<string | null>(null)\n const [error, setError] = useState<string | null>(null)\n const [copied, setCopied] = useState(false)\n /** \"Já paguei\" em andamento — a consulta que a pessoa pediu, não a do relógio. */\n const [checking, setChecking] = useState(false)\n const settled = useRef(false)\n // A sessão é aberta UMA vez. Sem esta trava, qualquer re-render com um objeto\n // de entrada novo abriria uma segunda cobrança para o mesmo carrinho.\n const opened = useRef(false)\n\n const open = useCallback(async () => {\n const shop = getShopProvider()\n if (!shop.openCheckoutSession) {\n setError('Esta loja ainda não recebe pagamento online.')\n setPhase('error')\n return\n }\n setPhase('opening')\n setError(null)\n try {\n const session = await shop.openCheckoutSession(input)\n setSessionId(session.sessionId)\n setProvider(session.provider ?? input.provider ?? null)\n setTotal(session.total)\n setCharge(session.charge)\n setPhase(session.charge ? 'waiting' : 'error')\n if (!session.charge) setError('Não conseguimos abrir a cobrança agora.')\n } catch (err) {\n // 404 aqui é \"esta loja não cobra online\", não uma falha da cobrança.\n if ((err as { status?: number })?.status === 404) {\n onUnavailable?.()\n return\n }\n setError(err instanceof Error ? err.message : 'Não conseguimos abrir a cobrança agora.')\n setPhase('error')\n }\n }, [input, onUnavailable])\n\n useEffect(() => {\n if (opened.current) return\n opened.current = true\n void open()\n }, [open])\n\n /**\n * Pergunta ao servidor se o dinheiro entrou.\n *\n * A MESMA consulta serve ao relógio e ao botão \"Já paguei\" — duas portas para\n * a única pergunta que importa. `settled` garante que a resposta só vale uma\n * vez, mesmo que as duas cheguem juntas.\n */\n const check = useCallback(async (): Promise<boolean> => {\n if (!sessionId || settled.current) return false\n const shop = getShopProvider()\n if (!shop.settleCheckoutSession) return false\n try {\n const result = await shop.settleCheckoutSession(sessionId, provider)\n if (settled.current) return false\n if (result.state === 'paid' && result.orderId) {\n settled.current = true\n setPhase('settling')\n onPaid(result.orderId)\n return true\n }\n if (result.state === 'failed' || result.state === 'expired') {\n setError(\n result.reason\n ?? (result.state === 'expired'\n ? 'O código expirou. Gere um novo para continuar.'\n : 'O pagamento não foi concluído.'),\n )\n setPhase('error')\n }\n return false\n } catch {\n // Uma consulta que falhou não é um pagamento que falhou. Segue tentando.\n return false\n }\n }, [sessionId, provider, onPaid])\n\n useEffect(() => {\n if (phase !== 'waiting' || !sessionId) return\n let stopped = false\n const timer = setInterval(() => { if (!stopped) void check() }, POLL_MS)\n return () => { stopped = true; clearInterval(timer) }\n }, [phase, sessionId, check])\n\n async function confirmPaid() {\n setChecking(true)\n const paid = await check()\n // Só devolve o botão se NÃO pagou: se pagou, a tela já está indo embora e\n // um \"confirmando…\" que vira \"já paguei\" outra vez pisca à toa.\n if (!paid) setChecking(false)\n }\n\n async function copy() {\n if (!charge?.emv) return\n try {\n await navigator.clipboard.writeText(charge.emv)\n setCopied(true)\n setTimeout(() => setCopied(false), 2400)\n } catch {\n toast.error('Copie o código manualmente')\n }\n }\n\n if (phase === 'opening') {\n return (\n // Same layout as the charge below, so nothing jumps when it arrives.\n <SkeletonGroup\n label=\"Preparando seu pagamento\"\n data-testid={TID.checkoutPayment}\n className=\"rounded-xl border bg-card p-6\"\n >\n <div className=\"flex items-center gap-2\">\n <Skeleton className=\"h-5 w-5 rounded-md\" />\n <Skeleton className=\"h-5 w-64 max-w-[70%]\" />\n </div>\n <Skeleton className=\"mt-2 h-3.5 w-full max-w-sm\" />\n <div className=\"mt-5 grid gap-5 sm:grid-cols-[auto_minmax(0,1fr)] sm:items-start\">\n <Skeleton className=\"mx-auto h-44 w-44 rounded-lg\" />\n <div className=\"min-w-0\">\n <Skeleton className=\"h-4 w-32\" />\n <Skeleton className=\"mt-4 h-3 w-28\" />\n <Skeleton className=\"mt-1 h-16 w-full rounded-lg\" />\n <div className=\"mt-3 flex flex-wrap items-center gap-3\">\n <Skeleton className=\"h-11 w-40 rounded-lg\" />\n <Skeleton className=\"h-11 w-32 rounded-lg\" />\n </div>\n </div>\n </div>\n </SkeletonGroup>\n )\n }\n\n if (phase === 'error') {\n return (\n <div data-testid={TID.checkoutPayment} className=\"space-y-3 rounded-xl border bg-card p-6\">\n <p data-testid={TID.checkoutError} className=\"rounded-lg border border-destructive/30 bg-destructive/5 px-3 py-2 text-sm text-destructive\">\n {error ?? 'Não conseguimos abrir a cobrança agora.'}\n </p>\n <div className=\"flex gap-2\">\n <button\n type=\"button\"\n onClick={() => { opened.current = false; void open() }}\n className=\"rounded-lg bg-primary px-4 py-2.5 text-sm font-semibold text-primary-foreground transition hover:opacity-90\"\n >\n Tentar de novo\n </button>\n <button\n type=\"button\"\n onClick={onBack}\n className=\"rounded-lg border px-4 py-2.5 text-sm font-medium transition hover:bg-muted\"\n >\n Voltar\n </button>\n </div>\n </div>\n )\n }\n\n return (\n <div data-testid={TID.checkoutPayment} className=\"space-y-4\" aria-live=\"polite\">\n <div className=\"rounded-xl border bg-card p-6\">\n <div className=\"flex items-center gap-2\">\n <QrCode className=\"h-5 w-5 text-primary\" />\n <h2 className=\"text-lg font-semibold\">Pague com Pix para fechar o pedido</h2>\n </div>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n {/* Dito antes de a pessoa esperar, não depois: é isto que diferencia\n este checkout do anterior, onde o pedido já existia. */}\n Seu pedido é criado assim que o pagamento entrar. Pode deixar esta tela aberta.\n </p>\n\n <div className=\"mt-5 grid gap-5 sm:grid-cols-[auto_minmax(0,1fr)] sm:items-start\">\n {charge?.qrcodeBase64 && (\n <img\n src={`data:image/png;base64,${charge.qrcodeBase64}`}\n alt=\"QR code do Pix\"\n className=\"mx-auto h-44 w-44 rounded-lg border bg-white p-2\"\n />\n )}\n <div className=\"min-w-0\">\n {total != null && (\n <p className=\"text-sm\">\n Valor: <strong data-testid={TID.checkoutPaymentTotal}>{money(total)}</strong>\n </p>\n )}\n <p className=\"mt-3 text-xs font-medium uppercase tracking-wide text-muted-foreground\">\n Pix copia e cola\n </p>\n <p\n data-testid={TID.pixCode}\n className=\"mt-1 max-h-24 overflow-y-auto break-all rounded-lg border bg-muted/40 p-3 font-mono text-xs\"\n >\n {charge?.emv}\n </p>\n {/* \"Já paguei\" confirms nothing — it only hurries the same poll the\n screen already runs; the bank still answers. */}\n <div className=\"mt-3 flex flex-wrap items-center gap-3\">\n <button\n type=\"button\"\n onClick={copy}\n data-testid={TID.pixCopy}\n className=\"inline-flex min-h-11 items-center gap-2 rounded-lg bg-primary px-4 py-2.5 text-sm font-medium text-primary-foreground transition hover:opacity-90\"\n >\n {copied ? <Check className=\"h-4 w-4\" /> : <Copy className=\"h-4 w-4\" />}\n {copied ? 'Código copiado' : 'Copiar código'}\n </button>\n <button\n type=\"button\"\n onClick={() => { void confirmPaid() }}\n disabled={checking || phase === 'settling'}\n data-testid={TID.pixConfirm}\n className=\"inline-flex min-h-11 items-center gap-2 rounded-lg border border-primary px-4 py-2.5 text-sm font-semibold text-primary transition hover:bg-primary/5 disabled:opacity-60\"\n >\n {checking || phase === 'settling'\n ? <PulseDot />\n : <Check className=\"h-4 w-4\" />}\n {phase === 'settling' ? 'Confirmando…' : checking ? 'Verificando…' : 'Já paguei'}\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <button\n type=\"button\"\n onClick={onBack}\n className=\"text-sm text-muted-foreground underline hover:text-foreground\"\n >\n Voltar e revisar o pedido\n </button>\n </div>\n )\n}\n","import React from 'react'\nimport { prefersReducedMotion } from '../../lib/motion'\n\nconst CONFETTI_COLORS = ['hsl(var(--primary))', '#f59e0b', '#10b981', '#3b82f6', '#ec4899']\n\n/**\n * A comemoração, e o cuidado que ela exige: só aparece quando o dinheiro entrou.\n *\n * Vive aqui porque duas telas a usam — o último passo do checkout e a página do\n * pedido pago. Uma cópia em cada uma foi como a página do pedido acabou\n * jogando confete para um pedido `pending`.\n */\nexport function SuccessMark() {\n const reduced = prefersReducedMotion()\n return (\n <div className=\"relative mx-auto h-24 w-24\">\n {!reduced &&\n Array.from({ length: 14 }, (_, i) => (\n <span\n key={i}\n aria-hidden\n className=\"absolute h-2 w-2 animate-confetti-fall rounded-sm\"\n style={{\n left: `${(i * 7.3) % 100}%`,\n top: '-4px',\n backgroundColor: CONFETTI_COLORS[i % CONFETTI_COLORS.length],\n animationDelay: `${200 + (i % 7) * 90}ms`,\n }}\n />\n ))}\n <span className={`absolute inset-0 rounded-full bg-emerald-100 ${reduced ? '' : 'animate-pop-in'}`} />\n <svg viewBox=\"0 0 48 48\" className=\"absolute inset-0 h-full w-full p-6\" aria-hidden>\n <path\n d=\"M10 25 L20 35 L38 14\"\n fill=\"none\"\n stroke=\"rgb(5 150 105)\"\n strokeWidth=\"5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeDasharray=\"48\"\n className={reduced ? '' : 'animate-draw-check'}\n />\n </svg>\n </div>\n )\n}\n","import React, { useEffect, useState } from 'react'\nimport { CreditCard, Lock, ShieldCheck } from 'lucide-react'\nimport { getShopProvider } from '@fayz-ai/shop/runtime'\nimport { documentDigits, formatDocument, isChargeableProvider, isValidDocument } from '@fayz-ai/shop'\nimport { formatPostalCode, normalizePostalCode, lookupPostalCode } from '@fayz-ai/core'\nimport type { CustomerAddress, PaymentMethodKind } from '@fayz-ai/shop/types'\nimport { prefersReducedMotion } from '../lib/motion'\nimport {\n useCartStore,\n selectSubtotal,\n selectDiscountTotal,\n selectShipping,\n selectRequiresShipping,\n selectTotal,\n} from '../stores/cart.store'\nimport { useSessionStore } from '../stores/session.store'\nimport { useDeliveryStore } from '../stores/delivery.store'\nimport { useStorefrontConfig } from '../document/config'\nimport { Link, navigateTo } from '../app/router'\nimport { formatMoney } from '../lib/format'\nimport { TID } from '../lib/testids'\nimport { useDiscountValidator } from '../hooks/use-discount-validator'\nimport { toast } from '../stores/toast.store'\nimport { useStorefrontHead } from '../hooks/use-storefront-head'\nimport { SignInModal } from '../components/account/SignInModal'\nimport { SmoothImage } from '../components/SmoothImage'\nimport { Slot } from '../extend/slots'\nimport { placeStorefrontOrder } from '../workflows/checkout'\nimport { CheckoutSteps, type CheckoutStep } from '../components/checkout/CheckoutSteps'\nimport { CheckoutPayment } from '../components/checkout/CheckoutPayment'\nimport { SuccessMark } from '../components/order/SuccessMark'\nimport { Skeleton, SkeletonGroup } from '../components/Skeleton'\nimport { errorMessage } from '../lib/errors'\n\ninterface CheckoutForm {\n email: string\n name: string\n phone: string\n document: string\n street: string\n city: string\n zip: string\n number: string\n complement: string\n district: string\n state: string\n}\n\ntype AddressMode = 'saved' | 'new'\n\n/**\n * There is no payment service provider connected, so the checkout does not ask\n * for a card number. It used to, prefilled with 4242 4242 4242 4242, and the\n * digits were validated and then thrown away — a PAN typed into React state\n * that reaches no processor is a liability with no upside. The buyer states how\n * they intend to pay; the order stays `pending` until the merchant confirms the\n * money arrived (shop_confirm_payment, which since 0019 only they can call).\n */\nconst PAYMENT_LABELS: Record<PaymentMethodKind, { label: string; hint: string }> = {\n pix: { label: 'Pix', hint: 'Você recebe a chave para pagar após confirmar o pedido' },\n credit_card: { label: 'Cartão de crédito', hint: 'Maquininha na entrega' },\n debit_card: { label: 'Cartão de débito', hint: 'Maquininha na entrega' },\n boleto: { label: 'Boleto', hint: 'Enviado por e-mail após a confirmação' },\n cash: { label: 'Dinheiro', hint: 'Pagamento na entrega' },\n other: { label: 'Combinar com a loja', hint: 'A loja entra em contato para acertar o pagamento' },\n}\n\n/**\n * What the buyer reads when shop_place_order refuses.\n *\n * The RPC's messages are written for whoever reads the logs (\"shop_place_order:\n * customer email mismatch\", prefix and all), and PostgrestError is not an Error\n * instance, so the old check showed nothing useful either way.\n */\nfunction placeOrderMessage(err: unknown): string {\n const message = errorMessage(err)\n if (/customer (email mismatch|does not belong|belongs to another)/i.test(message)) {\n return 'Sua sessão ficou presa a outro cadastro. Recarregue a página e tente de novo.'\n }\n if (/out of stock|insufficient|estoque/i.test(message)) {\n return 'Um item do carrinho ficou sem estoque. Revise o carrinho e tente de novo.'\n }\n if (/delivery not available|postal code/i.test(message)) {\n return 'Ainda não entregamos nesse CEP. Tente outro endereço.'\n }\n return message.replace(/^shop_[a-z_]+:\\s*/i, '') || 'Não foi possível concluir o pedido.'\n}\n\nfunction field(\n label: string,\n testId: string,\n value: string,\n onChange: (value: string) => void,\n props?: React.InputHTMLAttributes<HTMLInputElement>,\n) {\n return (\n <label className=\"block\">\n <span className=\"sr-only\">{label}</span>\n <input\n data-testid={testId}\n aria-label={label}\n value={value}\n onChange={(event) => onChange(event.target.value)}\n className=\"w-full rounded-lg border bg-background px-3.5 py-3 text-sm outline-none transition focus:border-primary focus:ring-2 focus:ring-primary/10\"\n {...props}\n />\n </label>\n )\n}\n\nexport function CheckoutPage() {\n const config = useStorefrontConfig()\n const cart = useCartStore()\n const session = useSessionStore()\n const delivery = useDeliveryStore()\n const validateDiscount = useDiscountValidator()\n useStorefrontHead({ title: `Checkout — ${config.name}` })\n\n const paymentMethods = config.payments.methods\n\n /**\n * The merchant's checkout policy, if they have saved one.\n *\n * `requiresAccount` is the storefront half of a rule the SERVER enforces\n * (0045's trigger refuses a guest order outright), which is why it gates the\n * button rather than merely hiding the \"entrar\" link: collecting a whole form\n * and failing at the last click is the worst possible way to tell someone they\n * need an account.\n *\n * The optional fields default to VISIBLE-AND-OPTIONAL when nothing is saved,\n * which is exactly how the form behaved before this policy existed.\n */\n const policy = config.policy\n const requiresAccount = policy?.guestCheckout === false\n const fieldPolicy = policy?.checkoutFields ?? {}\n type OptionalField = 'phone' | 'complement' | 'document'\n /**\n * A connected acquirer needs the buyer's CPF to mint the charge, so with a\n * gateway on, \"document\" stops being the merchant's preference: hiding it\n * would only move the failure to the gateway's opaque rejection.\n *\n * Either signal counts. `paymentProvider` is what the merchant picks in\n * Pagamentos and is the only one they can actually change; `mode` is written\n * into the app's own store document and no screen edits it.\n */\n const gatewayCheckout = config.payments.mode === 'gateway' || !!policy?.paymentProvider\n /**\n * `document` defaults to HIDDEN, unlike every other optional field.\n *\n * The others default to visible because they always were. This one is new, and\n * \"visible unless turned off\" would have made a CPF box appear on every\n * storefront in the fleet the moment this shipped — a product change no\n * merchant asked for. It shows when the store opts in, or when a gateway makes\n * it unavoidable.\n */\n const shows = (key: OptionalField) =>\n key === 'document'\n ? gatewayCheckout || fieldPolicy.document?.visible === true\n : fieldPolicy[key]?.visible !== false\n const requires = (key: OptionalField) =>\n key === 'document'\n ? gatewayCheckout || (fieldPolicy.document?.visible === true && fieldPolicy.document?.required === true)\n : fieldPolicy[key]?.visible !== false && fieldPolicy[key]?.required === true\n\n const [selectedAddressId, setSelectedAddressId] = useState('new')\n const [savedAddresses, setSavedAddresses] = useState<CustomerAddress[]>([])\n // False by default: a guest has no address book to wait for.\n const [addressesLoading, setAddressesLoading] = useState(false)\n // 'new' until the address book actually loads: an empty book must show an\n // empty form, never a placeholder address belonging to nobody.\n const [addressMode, setAddressMode] = useState<AddressMode>('new')\n const [paymentMethod, setPaymentMethod] = useState<PaymentMethodKind>(paymentMethods[0] ?? 'pix')\n const [form, setForm] = useState<CheckoutForm>({\n email: session.email ?? '',\n name: session.name ?? '',\n phone: '',\n document: '',\n street: '',\n city: '',\n zip: '',\n number: '',\n complement: '',\n district: '',\n state: '',\n })\n /**\n * Em que passo a pessoa está.\n *\n * O checkout era uma página só: todos os campos de uma vez, um botão\n * \"Comprar agora\" no fim, e a animação de sucesso disparando antes de existir\n * pagamento. Agora são quatro — dados, entrega, pagamento, pronto — e o\n * quarto só chega quando o dinheiro entrou.\n */\n const [step, setStep] = useState<CheckoutStep>(1)\n const [paidOrderId, setPaidOrderId] = useState<string | null>(null)\n const [error, setError] = useState<string | null>(null)\n const [discountCode, setDiscountCode] = useState('')\n const [discountError, setDiscountError] = useState<string | null>(null)\n const [discountSuccess, setDiscountSuccess] = useState<string | null>(null)\n const [applyingDiscount, setApplyingDiscount] = useState(false)\n const [showSignin, setShowSignin] = useState(false)\n const [placing, setPlacing] = useState(false)\n /**\n * Um pedido foi criado e a tela está indo embora — ver a guarda do carrinho\n * vazio. É um REF, não estado: `cart.clear()` re-renderiza pela assinatura do\n * zustand, fora do lote do React, então um `setState` aqui ainda não teria\n * sido aplicado quando a guarda rodasse — e o comprador ia parar no catálogo\n * com o pedido feito.\n */\n const leaving = React.useRef(false)\n const [zipLookup, setZipLookup] = useState<'idle' | 'loading' | 'found' | 'not-found'>('idle')\n\n const subtotal = selectSubtotal(cart)\n const discountTotal = selectDiscountTotal(cart)\n const shipping = selectShipping(cart, config)\n const total = selectTotal(cart, config)\n\n const checkoutSlotContext = { subtotal, total }\n\n /**\n * Só existe cobrança quando há adquirente E o método escolhido é um que ele\n * sabe cobrar. Hoje isso é Pix: o cartão da AbacatePay não é transparente\n * (o /transparents/create recusa `CARD` com 422), então prometer cartão aqui\n * seria vender um caminho que termina em erro.\n *\n * \"Há adquirente\" olha PRIMEIRO para o que o lojista escolheu em Pagamentos\n * (`paymentProvider`) e só depois para o `mode` do documento da loja. O modo\n * é escrito no arquivo do app e nenhuma tela o edita — quem colasse a chave\n * do provedor veria absolutamente nada mudar, que é um beco sem saída.\n */\n /** O que a sessão de checkout congela. Memoizado porque `CheckoutPayment`\n * abre a cobrança UMA vez e um objeto novo a cada render abriria outra. */\n const checkoutSessionInput = React.useMemo(() => ({\n items: cart.lines.map((line) => ({\n productId: line.productId,\n variantId: line.variantId ?? null,\n quantity: line.quantity,\n optionsLabel: line.optionsLabel ?? null,\n })),\n customer: { name: form.name.trim(), email: form.email.trim() },\n shippingAddress: {\n postalCode: form.zip.trim(),\n street: form.street.trim(),\n number: form.number.trim() || undefined,\n complement: form.complement.trim() || undefined,\n district: form.district.trim() || undefined,\n city: form.city.trim(),\n state: form.state.trim().toUpperCase(),\n phone: form.phone.trim() || undefined,\n document: documentDigits(form.document) || undefined,\n },\n discountCode: cart.discountCode ?? null,\n paymentMethod,\n // Qual adquirente cobra. Sai dos ajustes da loja e não de uma escolha do\n // comprador — a função reconfere de qualquer forma, mas mandar daqui é o\n // que faz o clique bater na função do gateway que a loja realmente conectou.\n provider: policy?.paymentProvider ?? null,\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }), [cart.lines, cart.discountCode, form, paymentMethod, policy?.paymentProvider])\n\n /**\n * Quem sabe se a loja cobra é o SERVIDOR, e a resposta dele é o que vale.\n *\n * Antes isto dependia de duas configurações que o lojista tinha que acertar\n * em telas diferentes — o modo no documento do app e o provedor em\n * Pagamentos. Ele conectava a AbacatePay, voltava à loja e nada acontecia,\n * sem nenhuma pista do porquê. Agora o checkout TENTA abrir a cobrança e o\n * servidor responde; se não houver adquirente, ele avisa e a tela oferece o\n * pedido sem cobrança.\n *\n * A única configuração que ainda manda é a explícita: se o lojista nomeou um\n * provedor que a função não sabe cobrar, respeitamos a escolha dele.\n */\n const [acquirerMissing, setAcquirerMissing] = useState(false)\n const chargesOnline =\n paymentMethod === 'pix'\n && !acquirerMissing\n // A lista deixou de morar aqui: cada adquirente tem UM par de funções, e a\n // tabela que diz qual é qual vive no @fayz-ai/shop, ao lado de quem as chama.\n // Duas cópias eram uma vitrine que oferece QR para um gateway que o provider\n // não sabe acionar, ou o contrário.\n && (!policy?.paymentProvider || isChargeableProvider(policy.paymentProvider))\n const money = (value: number) => formatMoney(value, config.currency, config.locale)\n\n useEffect(() => {\n // Os dois desfechos esvaziam o carrinho de propósito — o passo 4 e o pedido\n // sem cobrança — e sem esta guarda o comprador era mandado ao catálogo no\n // instante em que a compra deu certo, em vez da tela do pedido dele.\n if (cart.lines.length === 0 && !paidOrderId && !leaving.current) navigateTo(config.catalogPath)\n }, [cart.lines.length, config.catalogPath, paidOrderId])\n\n\n /**\n * Editar qualquer campo apaga o erro na hora.\n *\n * Sem isto a mensagem sobrevivia ao conserto: o CEP preenchia a UF sozinho e\n * \"Informe a UF com duas letras\" continuava em vermelho embaixo de um campo\n * escrito SP, até a pessoa clicar em continuar de novo para descobrir que já\n * estava certo.\n */\n const set = (key: keyof CheckoutForm) => (value: string) => {\n setError(null)\n setForm((current) => ({ ...current, [key]: value }))\n }\n\n /**\n * Editing the CEP re-fetches the address and refills what the postal service\n * knows, leaving number and complement alone — those are the buyer's and must\n * survive a correction to the postcode.\n *\n * Only what the lookup can supply is overwritten. Silently keeping a stale\n * street from a previous CEP is worse than an empty one: the parcel goes to\n * the wrong place and everything on screen looks filled in.\n */\n async function setZip(value: string) {\n const masked = formatPostalCode(value)\n setError(null)\n setForm((current) => ({ ...current, zip: masked }))\n if (normalizePostalCode(masked).length !== 8) {\n setZipLookup('idle')\n return\n }\n setZipLookup('loading')\n // Pergunta à loja se ela entrega aí, e não só ao serviço postal.\n //\n // O checkout apenas LIA a resposta que o simulador da vitrine tinha deixado\n // no caminho — quem digitava o CEP direto aqui passava batido pelo aviso e\n // só descobria a recusa no fim, quando o servidor negava o pedido. É a\n // mesma pergunta que a loja já faz na página do produto, feita no momento\n // em que a pessoa escreve o endereço.\n void delivery.resolve(masked, subtotal)\n try {\n const found = await lookupPostalCode(masked)\n if (!found) {\n setZipLookup('not-found')\n return\n }\n setZipLookup('found')\n setForm((current) => ({\n ...current,\n street: found.street || current.street,\n district: found.district || current.district,\n city: found.city,\n state: found.state,\n }))\n } catch {\n // Offline or the provider is down — the buyer can still type it out.\n setZipLookup('idle')\n }\n }\n\n async function applyDiscountCode() {\n setApplyingDiscount(true)\n setDiscountError(null)\n setDiscountSuccess(null)\n try {\n const appliedCode = discountCode.trim().toUpperCase()\n const result = await validateDiscount(discountCode)\n if (result.valid) {\n cart.applyDiscount(appliedCode, result.percent)\n setDiscountCode(appliedCode)\n setDiscountSuccess(`${appliedCode} aplicado: ${result.percent}% de desconto.`)\n toast.success('Cupom aplicado!', `${appliedCode} • ${result.percent}% de desconto`)\n } else {\n setDiscountError(result.message ?? 'Cupom inválido.')\n toast.error('Cupom inválido', result.message ?? 'Verifique o código e tente novamente.')\n }\n } finally {\n setApplyingDiscount(false)\n }\n }\n\n function clearDiscountCode() {\n cart.clearDiscount()\n setDiscountCode('')\n setDiscountSuccess(null)\n setDiscountError(null)\n }\n\n // The signed-in shopper's real address book. RLS scopes it to them, so a\n // guest (or a customer whose account was never linked to an auth identity)\n // simply gets nothing back and types their address.\n useEffect(() => {\n const customerId = session.customerId\n if (!customerId) {\n setSavedAddresses([])\n setAddressMode('new')\n setAddressesLoading(false)\n return\n }\n let cancelled = false\n const provider = getShopProvider()\n // Checked before showing the skeleton: `?.` short-circuits the whole chain,\n // so a provider without an address book would never reach `.finally`.\n const listAddresses = provider.listCustomerAddresses?.bind(provider)\n if (!listAddresses) {\n setAddressesLoading(false)\n return\n }\n setAddressesLoading(true)\n void listAddresses(customerId)\n .then((addresses) => {\n if (cancelled || addresses.length === 0) return\n setSavedAddresses(addresses)\n applySavedAddress(addresses[0]!)\n })\n .catch(() => {})\n .finally(() => {\n if (!cancelled) setAddressesLoading(false)\n })\n return () => {\n cancelled = true\n }\n }, [session.customerId])\n\n /**\n * The CEP given back on the product page lands here.\n *\n * This is the payoff of the whole delivery flow: street, district, city and\n * UF arrive filled and the buyer types a house number. It only fires when no\n * saved address was selected — a signed-in shopper's own address book still\n * wins over a postcode lookup, because it also knows their number and\n * complement, which no postal service can supply.\n */\n useEffect(() => {\n if (addressMode !== 'new') return\n const looked = delivery.address\n if (!looked) return\n setForm((current) => {\n if (current.zip.trim() || current.street.trim()) return current\n return {\n ...current,\n zip: formatPostalCode(looked.postalCode),\n street: looked.street,\n district: looked.district,\n city: looked.city,\n state: looked.state,\n }\n })\n }, [delivery.address, addressMode])\n\n function applySavedAddress(address: CustomerAddress) {\n setAddressMode('saved')\n setSelectedAddressId(address.id)\n setForm((current) => ({\n ...current,\n street: address.street,\n city: address.city,\n zip: address.postalCode,\n number: address.number ?? '',\n complement: address.complement ?? '',\n district: address.district ?? '',\n state: address.state,\n // Kept from the book when it has one, and NOT cleared when it does not:\n // a shopper who just typed their phone should not lose it by picking a\n // saved address that predates the field.\n phone: address.phone ?? current.phone,\n }))\n }\n\n function selectAddress(addressId: string) {\n const address = savedAddresses.find((item) => item.id === addressId)\n if (address) applySavedAddress(address)\n }\n\n function addNewAddress() {\n setAddressMode('new')\n setSelectedAddressId('new')\n setForm((current) => ({ ...current, street: '', city: '', zip: '', number: '', complement: '', district: '', state: '' }))\n }\n\n /**\n * Diz o que está errado E leva o comprador até lá.\n *\n * A mensagem sozinha não bastava: num formulário desta altura o campo com\n * problema fica fora da tela (medido: o e-mail em y=-139 com o erro visível\n * embaixo), e o foco ficava no `body`. A pessoa lia \"informe um e-mail\n * válido\" e tinha que caçar qual campo. É a regra de focus-management do\n * WCAG, e aqui ela é a diferença entre corrigir e desistir.\n */\n function fail(message: string, testId?: string): false {\n setError(message)\n if (testId) {\n const field = document.querySelector<HTMLElement>(`[data-testid=\"${testId}\"]`)\n field?.scrollIntoView({ block: 'center', behavior: prefersReducedMotion() ? 'auto' : 'smooth' })\n field?.focus({ preventScroll: true })\n }\n return false\n }\n\n /**\n * O passo 1 valida só o que o passo 1 pede.\n *\n * Antes tudo era validado no último clique, então quem errava o e-mail\n * descobria depois de preencher o endereço inteiro. Cada passo agora responde\n * pelo que ele mesmo coletou — e `validate()` continua rodando inteiro antes\n * de cobrar, porque o servidor não confia na navegação.\n */\n function validateContact(): boolean {\n setError(null)\n if (requiresAccount && !session.customerId) {\n setShowSignin(true)\n return fail('Esta loja pede uma conta para finalizar a compra. Entre ou crie a sua.')\n }\n if (!form.email.trim() || !/.+@.+\\..+/.test(form.email)) {\n return fail('Informe um e-mail válido.', TID.checkoutEmail)\n }\n if (!form.name.trim()) return fail('Informe seu nome completo.', TID.checkoutName)\n if (requires('phone') && !form.phone.trim()) {\n return fail('Informe um telefone de contato.', 'checkout-phone')\n }\n if (requires('document') && !isValidDocument(form.document)) {\n return fail(\n form.document.trim() ? 'CPF ou CNPJ inválido — confira os números.' : 'Informe o CPF ou CNPJ do comprador.',\n TID.checkoutDocument,\n )\n }\n return true\n }\n\n /** O passo 2: para onde vai, e se a loja entrega lá. */\n function validateDelivery(): boolean {\n setError(null)\n if (!selectRequiresShipping(cart)) return true\n if (!form.street.trim() || !form.city.trim() || !form.zip.trim() || !form.district.trim()) {\n return fail('Preencha ou selecione o endereço de entrega.', TID.checkoutStreet)\n }\n if (!form.number.trim()) return fail('Falta o número do endereço.', 'checkout-number')\n if (requires('complement') && !form.complement.trim()) {\n return fail('Informe o complemento (apto, bloco).', 'checkout-complement')\n }\n if (!/^[A-Za-z]{2}$/.test(form.state.trim())) {\n return fail('Informe a UF com duas letras (ex.: RJ).', 'checkout-state')\n }\n if (\n delivery.status === 'unserved'\n && delivery.postalCode === normalizePostalCode(form.zip)\n ) {\n return fail(\n delivery.refusedZone\n ? 'Esta loja não entrega nesse endereço. Tente outro.'\n : 'Ainda não entregamos nesse CEP. Tente outro endereço.',\n TID.checkoutZip,\n )\n }\n return true\n }\n\n function goToStep(next: CheckoutStep) {\n setError(null)\n setStep(next)\n // O topo, sempre: o passo seguinte começa onde os olhos já estão.\n if (typeof window !== 'undefined') window.scrollTo({ top: 0, behavior: 'smooth' })\n }\n\n function advance() {\n if (step === 1 && validateContact()) goToStep(2)\n else if (step === 2 && validateDelivery()) goToStep(3)\n }\n\n /**\n * O pedido sem cobrança online.\n *\n * Não é um caminho de segunda: é o de quase toda a frota — dinheiro na\n * entrega, maquininha do entregador, \"combinar com a loja\". O pedido nasce\n * `pending` e ninguém comemora; quem confirma que o dinheiro entrou é o\n * lojista, na tela dele.\n */\n async function confirmWithoutCharge() {\n if (!validate()) return\n setPlacing(true)\n try {\n const { order, customerId } = await placeStorefrontOrder({\n config,\n cart,\n session,\n customer: { email: form.email, name: form.name },\n address: { street: form.street, city: form.city, zip: form.zip },\n shippingAddress: {\n postalCode: form.zip.trim(),\n street: form.street.trim(),\n number: form.number.trim() || undefined,\n complement: form.complement.trim() || undefined,\n district: form.district.trim() || undefined,\n city: form.city.trim(),\n state: form.state.trim().toUpperCase(),\n phone: form.phone.trim() || undefined,\n // Viaja no endereço porque a assinatura do shop_place_order não pode\n // ganhar parâmetro sem DROP (0050); uma trigger o levanta para a\n // coluna e o tira do jsonb, então nunca vira linha de endereço.\n document: documentDigits(form.document) || undefined,\n },\n paymentMethod,\n })\n // placeStorefrontOrder resolve/cria o cliente mas não guarda a sessão —\n // sem isto \"Minhas compras\" logo depois consulta por e-mail, que anon não\n // lê sob RLS, e volta vazio.\n if (customerId) session.setSession({ customerId, email: form.email, name: form.name })\n leaving.current = true\n cart.clear()\n navigateTo(`/order/${order.id}`)\n } catch (err) {\n setError(placeOrderMessage(err))\n setPlacing(false)\n }\n }\n\n function validate(): boolean {\n setError(null)\n // Checked FIRST: it is the only refusal the server will also make, so\n // finding it out here saves the shopper a completed form and a raw SQL error.\n if (requiresAccount && !session.customerId) {\n setShowSignin(true)\n return fail('Esta loja pede uma conta para finalizar a compra. Entre ou crie a sua.')\n }\n if (!form.email.trim() || !/.+@.+\\..+/.test(form.email)) {\n return fail('Informe um e-mail válido.', TID.checkoutEmail)\n }\n if (requires('phone') && !form.phone.trim()) {\n return fail('Informe um telefone de contato.', 'checkout-phone')\n }\n if (!form.name.trim()) {\n return fail('Informe seu nome completo.', TID.checkoutName)\n }\n // Checked here rather than at the gateway: a wrong CPF comes back from the\n // acquirer as a generic decline, and the buyer has no way to know which\n // field to fix.\n if (requires('document') && !isValidDocument(form.document)) {\n return fail(\n form.document.trim()\n ? 'CPF ou CNPJ inválido — confira os números.'\n : 'Informe o CPF ou CNPJ do comprador.',\n TID.checkoutDocument,\n )\n }\n // Number and district are required because a courier cannot deliver without\n // them; the old form collected only street/city/CEP and logistics had to guess.\n if (!form.street.trim() || !form.city.trim() || !form.zip.trim() || !form.district.trim()) {\n return fail('Preencha ou selecione o endereço de entrega.', TID.checkoutStreet)\n }\n // Called out on its own: with the CEP filling everything else, the number is\n // usually the only thing missing, and \"preencha o endereço\" sent people\n // hunting through fields that were already correct.\n if (!form.number.trim()) {\n return fail('Falta o número do endereço.', 'checkout-number')\n }\n if (requires('complement') && !form.complement.trim()) {\n return fail('Informe o complemento (apto, bloco).', 'checkout-complement')\n }\n // UF is required now: 117 of the 266 addresses already in the pool have no\n // state, and a carrier cannot quote or ship without one.\n if (form.state.trim().length !== 2) {\n return fail('Informe a UF com duas letras (ex.: RJ).', 'checkout-state')\n }\n // Coverage. shop_place_order refuses an unserved postal code anyway (0021),\n // so this only turns a raw SQL error into a sentence the buyer can act on —\n // the rule itself lives on the server, not here.\n // A cart that ships nothing never quotes, so \"unserved\" here means \"nobody\n // asked\", not \"we don't go there\". Refusing the order on it would make a\n // store of downloads undeliverable to every address in Brazil.\n if (\n selectRequiresShipping(cart) &&\n delivery.status === 'unserved' &&\n delivery.postalCode === normalizePostalCode(form.zip)\n ) {\n // An EXCLUDED region reads differently on purpose (0048): \"ainda não\" is a\n // promise about the future, and a store that deliberately refuses a region\n // is not making it. The shopper who reads \"ainda não\" tries again tomorrow.\n return fail(\n delivery.refusedZone\n ? 'Esta loja não entrega nesse endereço. Tente outro.'\n : 'Ainda não entregamos nesse CEP. Tente outro endereço.',\n TID.checkoutZip,\n )\n }\n return true\n }\n\n\n return (\n <main className=\"min-h-screen bg-background\">\n <Slot area=\"checkout\" name=\"beforeForm\" context={checkoutSlotContext} />\n {showSignin && !session.email && (\n <SignInModal\n defaultEmail={form.email}\n onClose={() => setShowSignin(false)}\n onSignedIn={(signed) =>\n setForm((current) => ({ ...current, email: signed.email ?? current.email, name: signed.name || current.name }))\n }\n />\n )}\n <header className=\"border-b bg-background\">\n <div className=\"mx-auto flex max-w-6xl items-center justify-between gap-4 px-4 py-6 sm:px-6\">\n <Link to={config.catalogPath} className=\"text-sm text-muted-foreground hover:text-foreground\">\n Voltar à loja\n </Link>\n <div className=\"text-center\">\n <div className=\"sf-heading text-2xl font-bold tracking-tight\">{config.logo ?? config.name}</div>\n <div className=\"mt-2 flex items-center justify-center gap-2 text-xs text-muted-foreground\">\n <Lock className=\"h-3.5 w-3.5\" />\n Checkout seguro\n </div>\n </div>\n <a href=\"mailto:suporte@example.com\" className=\"text-sm text-muted-foreground hover:text-foreground\">\n Ajuda\n </a>\n </div>\n </header>\n\n <div className=\"mx-auto grid max-w-6xl grid-cols-1 gap-8 px-4 py-8 sm:px-6 lg:grid-cols-5 lg:px-6\">\n <section className=\"lg:col-span-3 lg:pr-10\">\n <CheckoutSteps\n current={step}\n onGoBackTo={step === 4 ? undefined : (target) => goToStep(target)}\n />\n\n {/* Um <form> de verdade: é ele que faz o Enter num campo avançar o\n passo, em vez de não fazer nada. O passo 3 não submete — quem manda\n ali é a cobrança. */}\n <form\n className=\"space-y-8\"\n onSubmit={(event) => {\n event.preventDefault()\n advance()\n }}\n >\n {step === 1 && (\n <section>\n <div className=\"mb-3 flex items-center justify-between gap-4\">\n <h1 className=\"text-xl font-semibold tracking-tight\">Informações de contato</h1>\n {session.email ? (\n <span className=\"text-sm text-muted-foreground\">Conectado como {session.email}</span>\n ) : (\n <button\n type=\"button\"\n onClick={() => setShowSignin((value) => !value)}\n className=\"text-sm font-medium text-primary hover:underline\"\n >\n Já tem conta? Entrar\n </button>\n )}\n </div>\n <div className=\"grid gap-3 sm:grid-cols-2\">\n {field('E-mail', TID.checkoutEmail, form.email, set('email'), {\n type: 'email',\n placeholder: 'E-mail',\n })}\n {field('Nome completo', TID.checkoutName, form.name, set('name'), {\n placeholder: 'Nome completo',\n })}\n {shows('phone') && field('Telefone', 'checkout-phone', form.phone, set('phone'), {\n type: 'tel',\n autoComplete: 'tel',\n placeholder: requires('phone') ? 'Telefone' : 'Telefone (opcional)',\n })}\n {shows('document') && field(\n 'CPF ou CNPJ',\n TID.checkoutDocument,\n form.document,\n (value) => {\n setError(null)\n setForm((current) => ({ ...current, document: formatDocument(value) }))\n },\n {\n // `inputMode` and not `type=\"number\"`: the mask writes dots\n // and a dash, which a number input silently refuses to hold.\n inputMode: 'numeric',\n autoComplete: 'off',\n placeholder: requires('document') ? 'CPF ou CNPJ' : 'CPF ou CNPJ (opcional)',\n },\n )}\n </div>\n {requiresAccount && !session.customerId && (\n <p className=\"mt-3 rounded-lg border border-primary/30 bg-primary/5 px-3 py-2 text-sm\">\n Esta loja pede uma conta para finalizar a compra.{' '}\n <button\n type=\"button\"\n onClick={() => setShowSignin(true)}\n className=\"font-semibold text-primary hover:underline\"\n >\n Entrar ou criar conta\n </button>\n </p>\n )}\n </section>\n )}\n\n {step === 2 && (\n <section>\n <h2 className=\"mb-3 text-xl font-semibold tracking-tight\">Endereço de entrega</h2>\n <div className=\"mb-3 grid gap-3\">\n {addressesLoading && savedAddresses.length === 0 && (\n <SkeletonGroup label=\"Buscando seus endereços salvos\" className=\"grid gap-3\">\n {[0, 1].map((row) => (\n <div key={row} className=\"rounded-lg border p-3\">\n <Skeleton className=\"h-4 w-28\" />\n <Skeleton className=\"mt-2 h-3 w-3/4\" />\n <Skeleton className=\"mt-1.5 h-3 w-1/2\" />\n </div>\n ))}\n </SkeletonGroup>\n )}\n {savedAddresses.map((address) => (\n <div\n key={address.id}\n className={`group relative rounded-lg border p-3 pr-11 text-left text-sm transition hover:bg-muted/40 ${\n selectedAddressId === address.id ? 'border-primary bg-primary/5' : 'border-border bg-background'\n }`}\n >\n <button type=\"button\" onClick={() => selectAddress(address.id)} className=\"block w-full text-left\">\n <span className=\"flex items-center justify-between gap-3 font-semibold\">\n {address.label}\n {addressMode === 'saved' && selectedAddressId === address.id && (\n <span className=\"rounded-full bg-primary/10 px-2 py-0.5 text-[11px] font-bold text-primary\">Selecionado</span>\n )}\n </span>\n <span className=\"mt-1 block text-muted-foreground\">\n {[address.street, address.number].filter(Boolean).join(', ')}\n {address.complement ? ` — ${address.complement}` : ''}\n </span>\n <span className=\"block text-muted-foreground\">\n {[address.district, address.city, address.state].filter(Boolean).join(' · ')} — {address.postalCode}\n </span>\n </button>\n </div>\n ))}\n <button\n type=\"button\"\n onClick={addNewAddress}\n className={`rounded-lg border border-dashed p-3 text-left text-sm transition hover:bg-muted/40 ${\n addressMode === 'new' ? 'border-primary bg-primary/5' : 'border-border bg-muted/20'\n }`}\n >\n <span className=\"block font-semibold text-primary\">\n {savedAddresses.length > 0 ? '+ Adicionar novo endereço' : 'Informe o endereço de entrega'}\n </span>\n <span className=\"mt-1 block text-muted-foreground\">Preencher outro endereço para esta compra</span>\n </button>\n </div>\n {addressMode === 'new' && (\n <div className=\"grid gap-3\">\n {/* CEP first, because it FILLS the fields below it. With it at\n the bottom the buyer typed street, district, city and UF by\n hand and only then reached the one field that would have\n supplied all four — and editing it later has to refill\n them, which reads as the form rewriting itself. */}\n <div className=\"grid gap-1 sm:grid-cols-[200px_1fr] sm:items-center\">\n {field('CEP', TID.checkoutZip, form.zip, setZip, {\n placeholder: 'CEP',\n inputMode: 'numeric',\n autoComplete: 'postal-code',\n })}\n {zipLookup === 'loading' ? (\n <SkeletonGroup label=\"Buscando o endereço deste CEP\" className=\"grid gap-1.5 px-1\">\n <Skeleton className=\"h-2.5 w-40\" />\n <Skeleton className=\"h-2.5 w-24\" />\n </SkeletonGroup>\n ) : (\n <p className=\"px-1 text-xs text-muted-foreground\">\n {zipLookup === 'not-found'\n ? 'CEP não encontrado — preencha o endereço à mão.'\n : 'Preenchemos o endereço para você.'}\n </p>\n )}\n </div>\n {field('Endereço', TID.checkoutStreet, form.street, set('street'), { placeholder: 'Rua, avenida…' })}\n <div className=\"grid grid-cols-2 gap-3\">\n {field('Número', 'checkout-number', form.number, set('number'), { placeholder: 'Número' })}\n {shows('complement') && field('Complemento', 'checkout-complement', form.complement, set('complement'), {\n placeholder: requires('complement') ? 'Apto, bloco' : 'Apto, bloco (opcional)',\n })}\n </div>\n <div className=\"grid grid-cols-2 gap-3\">\n {field('Bairro', 'checkout-district', form.district, set('district'), { placeholder: 'Bairro' })}\n {field('UF', 'checkout-state', form.state, set('state'), { placeholder: 'UF' })}\n </div>\n {field('Cidade', TID.checkoutCity, form.city, set('city'), { placeholder: 'Cidade' })}\n </div>\n )}\n </section>\n )}\n\n {/* While the server creates the order, the screen is the shape of the\n order page it is about to land on. */}\n {step === 3 && placing && (\n <section>\n <h2 className=\"mb-3 text-xl font-semibold tracking-tight\">Confirmando seu pedido</h2>\n <SkeletonGroup label=\"Criando seu pedido\" className=\"rounded-xl border bg-card p-6 sm:p-8\">\n <div className=\"grid gap-6 border-b pb-6 sm:grid-cols-[120px_minmax(0,1fr)]\">\n <Skeleton className=\"mx-auto h-24 w-24 rounded-full\" />\n <div>\n <Skeleton className=\"h-7 w-56 max-w-full\" />\n <Skeleton className=\"mt-2 h-3.5 w-full max-w-sm\" />\n <Skeleton className=\"mt-4 h-5 w-40\" />\n </div>\n </div>\n <div className=\"mt-6 grid gap-4 rounded-xl border bg-muted/20 p-4 sm:grid-cols-3\">\n {[0, 1, 2].map((column) => (\n <div key={column}>\n <Skeleton className=\"h-3 w-16\" />\n <Skeleton className=\"mt-2 h-4 w-24\" />\n </div>\n ))}\n </div>\n <div className=\"mt-8 space-y-3\">\n {cart.lines.slice(0, 3).map((line) => (\n <div key={line.lineId ?? line.productId} className=\"flex items-center gap-3\">\n <Skeleton className=\"h-12 w-12 rounded-lg\" />\n <Skeleton className=\"h-3.5 flex-1\" />\n <Skeleton className=\"h-3.5 w-16\" />\n </div>\n ))}\n </div>\n </SkeletonGroup>\n <p className=\"mt-3 text-center text-sm text-muted-foreground\">\n Não feche esta página — estamos registrando seu pedido na loja.\n </p>\n </section>\n )}\n\n {step === 3 && !placing && (\n <section>\n <h2 className=\"mb-3 text-xl font-semibold tracking-tight\">Pagamento</h2>\n <div className=\"mb-3 grid gap-3\" role=\"radiogroup\" aria-label=\"Forma de pagamento\">\n {paymentMethods.map((method) => {\n const copy = PAYMENT_LABELS[method]\n const selected = paymentMethod === method\n return (\n // Cada forma de pagamento abre o que ELA pede, embaixo dela\n // mesma. Antes o painel do Pix ficava no fim da lista, longe\n // do cartão escolhido, e escolher parecia não fazer nada.\n <div key={method}>\n <button\n type=\"button\"\n role=\"radio\"\n aria-checked={selected}\n data-testid={`checkout-payment-${method}`}\n onClick={() => setPaymentMethod(method)}\n className={`w-full rounded-lg border p-3 text-left text-sm transition hover:bg-muted/40 ${\n selected ? 'border-primary bg-primary/5' : 'border-border bg-background'\n }`}\n >\n <span className=\"flex items-center justify-between gap-3 font-semibold\">\n <span className=\"flex items-center gap-2\"><CreditCard className=\"h-4 w-4\" />{copy.label}</span>\n {selected && (\n <span className=\"rounded-full bg-primary/10 px-2 py-0.5 text-[11px] font-bold text-primary\">Selecionado</span>\n )}\n </span>\n <span className=\"mt-1 block text-muted-foreground\">{copy.hint}</span>\n </button>\n {selected && chargesOnline && (\n <div className=\"mt-3\">\n <CheckoutPayment\n input={checkoutSessionInput}\n money={money}\n onBack={() => goToStep(2)}\n onUnavailable={() => setAcquirerMissing(true)}\n onPaid={(orderId) => {\n // O ref ANTES do clear: `paidOrderId` é estado do\n // React e o carrinho re-renderiza fora do lote,\n // então a guarda podia mandar para o catálogo\n // alguém que acabou de pagar.\n leaving.current = true\n setPaidOrderId(orderId)\n goToStep(4)\n cart.clear()\n }}\n />\n </div>\n )}\n </div>\n )\n })}\n </div>\n <Slot area=\"checkout\" name=\"afterPaymentMethods\" context={checkoutSlotContext} />\n\n {/* Loja que NÃO cobra online — dinheiro na entrega, maquininha,\n combinar com a loja. Ela é a maioria da frota, e abrir uma\n cobrança aqui só produziria \"esta loja não recebe pagamento\n online\" no lugar do botão de comprar. O pedido nasce pendente,\n como sempre nasceu, e a tela do pedido diz isso com todas as\n letras em vez de comemorar. */}\n {!chargesOnline && (\n <div className=\"mt-5\">\n <button\n type=\"button\"\n data-testid={TID.placeOrder}\n disabled={placing}\n onClick={() => { void confirmWithoutCharge() }}\n className=\"min-h-12 w-full rounded-xl bg-primary px-6 py-3 font-semibold text-primary-foreground transition hover:opacity-90 disabled:opacity-60\"\n >\n {`Fazer pedido - ${money(total)}`}\n </button>\n <p className=\"mt-2 text-center text-xs text-muted-foreground\">\n O pedido fica aguardando pagamento até a loja confirmar.\n </p>\n </div>\n )}\n\n </section>\n )}\n\n {step === 4 && paidOrderId && (\n <section data-testid={TID.checkoutDone} className=\"rounded-xl border bg-card p-8 text-center\">\n <SuccessMark />\n <h2 className=\"mt-4 text-2xl font-bold tracking-tight\">Pagamento confirmado!</h2>\n <p className=\"mt-2 text-muted-foreground\">\n Seu pedido foi criado e a loja já foi avisada.\n </p>\n <button\n type=\"button\"\n onClick={() => navigateTo(`/order/${paidOrderId}`)}\n className=\"mt-6 inline-flex min-h-11 items-center rounded-lg bg-primary px-6 py-3 text-sm font-semibold text-primary-foreground transition hover:opacity-90\"\n >\n Ver meu pedido\n </button>\n </section>\n )}\n\n {error && (\n <p data-testid={TID.checkoutError} className=\"rounded-lg border border-destructive/30 bg-destructive/5 px-3 py-2 text-sm text-destructive\">\n {error}\n </p>\n )}\n\n {/* Embaixo do formulário, onde a mão já está — e dentro do <form>,\n para que Enter em qualquer campo avance o passo. Digitar o CEP e\n apertar Enter é o gesto natural; antes ele não fazia nada e o\n botão estava do outro lado da tela. */}\n {(step === 1 || step === 2) && (\n <div className=\"grid gap-3 border-t pt-5\">\n <button\n type=\"submit\"\n data-testid={TID.checkoutContinue}\n className=\"min-h-12 rounded-lg bg-primary px-6 py-4 text-sm font-bold text-primary-foreground transition hover:opacity-90\"\n >\n {step === 1 ? 'Continuar para a entrega' : `Ir para o pagamento - ${money(total)}`}\n </button>\n {step === 2 && (\n <button\n type=\"button\"\n data-testid={TID.checkoutBack}\n onClick={() => goToStep(1)}\n className=\"min-h-11 rounded-lg border px-6 py-3 text-sm font-medium transition hover:bg-muted\"\n >\n Voltar aos dados\n </button>\n )}\n <Link to={config.catalogPath} className=\"text-center text-sm text-muted-foreground hover:text-foreground\">\n Voltar ao carrinho\n </Link>\n </div>\n )}\n\n </form>\n\n <footer className=\"mt-10 flex flex-wrap gap-4 border-t pt-5 text-xs text-muted-foreground\">\n <Link to=\"/privacy\" className=\"hover:text-foreground\">Privacidade</Link>\n <Link to=\"/terms\" className=\"hover:text-foreground\">Termos</Link>\n <Link to=\"/refunds\" className=\"hover:text-foreground\">Trocas e devoluções</Link>\n </footer>\n </section>\n\n <aside className=\"rounded-xl border bg-muted/20 p-5 lg:sticky lg:top-6 lg:col-span-2 lg:self-start\">\n <h2 className=\"sr-only\">Resumo do pedido</h2>\n <ul className=\"space-y-4\">\n {cart.lines.map((line) => (\n <li key={line.lineId ?? line.productId} className=\"flex gap-3 text-sm\">\n <div className=\"relative h-16 w-16 flex-none overflow-hidden rounded-lg border bg-background\">\n {line.imageUrl && <SmoothImage src={line.imageUrl} alt={line.name} className=\"h-full w-full object-cover\" />}\n <span className=\"absolute -right-1 -top-1 flex h-5 min-w-5 items-center justify-center rounded-full bg-muted-foreground px-1.5 text-[10px] font-bold text-background\">\n {line.quantity}\n </span>\n </div>\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate font-medium\">{line.name}</p>\n {line.sku && <p className=\"text-xs text-muted-foreground\">{line.sku}</p>}\n {line.optionsLabel && <p className=\"text-xs text-muted-foreground\">{line.optionsLabel}</p>}\n </div>\n <span data-price={(line.unitPrice * line.quantity).toFixed(2)}>\n {money(line.unitPrice * line.quantity)}\n </span>\n </li>\n ))}\n </ul>\n {config.features.discounts && (\n <div className=\"mt-5 space-y-2 border-t pt-5\">\n <div className=\"flex gap-2\">\n <input\n data-testid={TID.discountInput}\n type=\"text\"\n placeholder=\"Cupom de desconto\"\n value={discountCode}\n onChange={(event) => {\n setDiscountCode(event.target.value)\n setDiscountSuccess(null)\n setDiscountError(null)\n }}\n className=\"min-w-0 flex-1 rounded-lg border bg-background px-3 py-2 text-sm uppercase\"\n />\n <button\n type=\"button\"\n data-testid={TID.discountApply}\n onClick={applyDiscountCode}\n disabled={applyingDiscount || !discountCode.trim()}\n className=\"rounded-lg border px-3 py-2 text-sm font-semibold hover:bg-muted disabled:opacity-50\"\n >\n Aplicar\n </button>\n </div>\n {discountError && (\n <p data-testid={TID.discountError} className=\"text-xs text-destructive\">\n {discountError}\n </p>\n )}\n {discountSuccess && (\n <p className=\"text-xs font-semibold text-emerald-700\">\n {discountSuccess}\n </p>\n )}\n </div>\n )}\n <dl className=\"mt-8 space-y-3 border-t pt-6 text-sm\">\n <div className=\"flex justify-between\">\n <dt className=\"text-muted-foreground\">Subtotal</dt>\n <dd data-price={subtotal.toFixed(2)}>{money(subtotal)}</dd>\n </div>\n {discountTotal > 0 && (\n <div className=\"flex justify-between text-emerald-700\" data-testid={TID.discountRow}>\n <dt>\n Desconto{' '}\n <button\n type=\"button\"\n onClick={clearDiscountCode}\n className=\"text-xs text-muted-foreground underline\"\n >\n ({cart.discountCode} ×)\n </button>\n </dt>\n <dd data-price={discountTotal.toFixed(2)}>-{money(discountTotal)}</dd>\n </div>\n )}\n <div className=\"flex justify-between\">\n <dt className=\"text-muted-foreground\">Entrega</dt>\n <dd data-price={shipping.toFixed(2)}>{shipping === 0 ? 'Grátis' : money(shipping)}</dd>\n </div>\n <div className=\"flex justify-between border-t pt-5 text-lg font-bold\">\n <dt>Total</dt>\n <dd data-price={total.toFixed(2)}>{money(total)}</dd>\n </div>\n </dl>\n <div className=\"mt-6 flex items-center gap-2 text-xs text-muted-foreground\">\n <ShieldCheck className=\"h-4 w-4 text-primary\" />\n Compra protegida e dados criptografados.\n </div>\n {/* O botão de avançar NÃO mora aqui — ele vive embaixo do formulário,\n onde a mão está. O resumo é o que a pessoa confere, não onde ela\n age; a distância entre o último campo e o botão do outro lado da\n tela era uma travessia a cada passo. */}\n <div className=\"mt-6 border-t pt-5\">\n <Slot area=\"checkout\" name=\"afterForm\" context={checkoutSlotContext} />\n </div>\n </aside>\n </div>\n </main>\n )\n}\n","import type { FinancialStatus } from '@fayz-ai/shop/types'\n\ntype Tone = 'positive' | 'pending' | 'negative'\n\nconst FINANCIAL: Record<FinancialStatus, { label: string; tone: Tone }> = {\n pending: { label: 'Pendente', tone: 'pending' },\n paid: { label: 'Pago', tone: 'positive' },\n partially_paid: { label: 'Parcialmente pago', tone: 'pending' },\n partially_refunded: { label: 'Parcialmente reembolsado', tone: 'negative' },\n refunded: { label: 'Reembolsado', tone: 'negative' },\n voided: { label: 'Cancelado', tone: 'negative' },\n}\n\nconst TONE_CLASS: Record<Tone, string> = {\n positive: 'bg-emerald-100 text-emerald-800',\n pending: 'bg-amber-100 text-amber-800',\n negative: 'bg-rose-100 text-rose-800',\n}\n\n/** One source of truth for a financial-status pill — label + color by status,\n * so a pending or refunded order never renders inside a green \"success\" pill. */\nexport function financialStatusBadge(status: FinancialStatus): { label: string; className: string } {\n const entry = FINANCIAL[status] ?? { label: status, tone: 'pending' as Tone }\n return { label: entry.label, className: TONE_CLASS[entry.tone] }\n}\n\nexport function isPaid(status: FinancialStatus): boolean {\n return status === 'paid' || status === 'partially_paid'\n}\n\nexport function isRefunded(status: FinancialStatus): boolean {\n return status === 'refunded' || status === 'partially_refunded'\n}\n","import React from 'react'\nimport { Check, Clock, PackageCheck, RotateCcw, Truck, XCircle } from 'lucide-react'\nimport type { Order } from '@fayz-ai/shop/types'\nimport { isPaid, isRefunded } from '../../data/order-status'\nimport { TID } from '../../lib/testids'\n\ntype TrackingState = 'complete' | 'current' | 'pending' | 'cancelled'\n\ninterface TrackingStep {\n id: string\n label: string\n description: string\n state: TrackingState\n icon: React.ComponentType<{ className?: string }>\n}\n\nfunction orderTrackingSteps(order: Order): TrackingStep[] {\n const received: TrackingStep = {\n id: 'received',\n label: 'Pedido recebido',\n description: `#${order.orderNumber}`,\n state: 'complete',\n icon: Check,\n }\n\n // Terminal states short-circuit the happy path.\n if (order.status === 'cancelled' || order.financialStatus === 'voided') {\n return [\n received,\n { id: 'payment', label: 'Pedido cancelado', description: 'Este pedido foi cancelado', state: 'cancelled', icon: XCircle },\n ]\n }\n if (isRefunded(order.financialStatus)) {\n return [\n received,\n { id: 'payment', label: 'Pagamento aprovado', description: 'Compra confirmada', state: 'complete', icon: Check },\n {\n id: 'refund',\n label: order.financialStatus === 'refunded' ? 'Reembolsado' : 'Reembolso parcial',\n description: 'Valor devolvido ao cliente',\n state: 'cancelled',\n icon: RotateCcw,\n },\n ]\n }\n\n const paid = isPaid(order.financialStatus)\n const partiallyFulfilled = order.fulfillmentStatus === 'partially_fulfilled'\n const fulfilled = order.fulfillmentStatus === 'fulfilled'\n\n return [\n received,\n {\n id: 'payment',\n label: paid ? 'Pagamento aprovado' : 'Aguardando pagamento',\n // \"Processando\" descrevia um pagamento que ninguém iniciou.\n description: paid ? 'Compra confirmada' : 'Ainda não recebemos',\n state: paid ? 'complete' : 'current',\n icon: paid ? Check : Clock,\n },\n {\n id: 'preparing',\n label: 'Preparando envio',\n description: paid ? 'Separando produtos' : 'Começa após o pagamento',\n state: fulfilled || partiallyFulfilled ? 'complete' : paid ? 'current' : 'pending',\n icon: PackageCheck,\n },\n {\n id: 'delivery',\n label: fulfilled ? 'Pedido enviado' : partiallyFulfilled ? 'Envio parcial' : 'Entrega',\n description: fulfilled ? 'A caminho do cliente' : partiallyFulfilled ? 'Parte do pedido saiu' : 'Próxima etapa',\n state: fulfilled ? 'complete' : partiallyFulfilled ? 'current' : 'pending',\n icon: fulfilled || partiallyFulfilled ? Truck : Clock,\n },\n ]\n}\n\nconst GRID_COLS: Record<number, string> = {\n 2: 'sm:grid-cols-2',\n 3: 'sm:grid-cols-3',\n 4: 'sm:grid-cols-4',\n}\n\nexport function OrderTrackingTimeline({ order, compact = false }: { order: Order; compact?: boolean }) {\n const steps = orderTrackingSteps(order)\n\n return (\n <ol\n data-testid={TID.orderTracking}\n className={`grid ${compact ? 'gap-2' : 'gap-3'} ${GRID_COLS[steps.length] ?? 'sm:grid-cols-4'}`}\n aria-label=\"Acompanhamento do pedido\"\n >\n {steps.map((step) => {\n const Icon = step.icon\n const cancelled = step.state === 'cancelled'\n const done = step.state === 'complete'\n // `current` is IN PROGRESS, not finished. Both used to render as the\n // same solid badge with a checkmark, so an unpaid order showed\n // \"Aguardando pagamento ✓\" — the tick said done about the one thing\n // that had not happened.\n const current = step.state === 'current'\n const active = done || current\n return (\n <li\n key={step.id}\n data-testid={TID.orderTrackingStep(step.id)}\n data-state={step.state}\n className={[\n 'relative min-w-0 rounded-xl border p-3',\n cancelled\n ? 'border-rose-200 bg-rose-50 text-rose-700'\n : active\n ? 'border-primary/35 bg-primary/5'\n : 'bg-muted/20 text-muted-foreground',\n compact ? 'text-xs' : 'text-sm',\n ].join(' ')}\n >\n <div className=\"flex items-start gap-2\">\n <span\n className={[\n 'grid h-7 w-7 shrink-0 place-items-center rounded-full border',\n cancelled\n ? 'border-rose-300 bg-rose-500 text-white'\n : done\n ? 'border-primary bg-primary text-primary-foreground'\n : current\n ? 'border-primary bg-background text-primary'\n : 'border-muted-foreground/30 bg-background',\n ].join(' ')}\n aria-hidden\n >\n <Icon className=\"h-3.5 w-3.5\" />\n </span>\n <span className=\"min-w-0\">\n {/* Wrap instead of truncate: \"Aguardando pagamento\" became\n \"Aguardando pag…\", which is the one label a buyer must read\n in full. */}\n <span className=\"block font-semibold leading-snug text-foreground\">{step.label}</span>\n <span className=\"mt-0.5 block leading-snug text-muted-foreground\">{step.description}</span>\n </span>\n </div>\n </li>\n )\n })}\n </ol>\n )\n}\n","// The account area's section lives in the URL, not in component state.\n//\n// It used to be a `useState` inside MyPurchasesPage, which meant `#/account`\n// could only ever open on \"Meus pedidos\": the header's \"Perfil\" and\n// \"Pagamentos\" links, a bookmark, a browser Back — none of them could name a\n// section. It also left CustomerAccountShell dependent on a callback prop, so\n// any page that mounted the shell without one rendered four buttons that did\n// nothing (that is what happened on the order confirmation page).\n\nexport type AccountSection = 'profile' | 'orders' | 'addresses' | 'payments'\n\nexport const ACCOUNT_SECTIONS: readonly AccountSection[] = [\n 'profile',\n 'orders',\n 'addresses',\n 'payments',\n]\n\n/** The section shown when the URL names none, or names one that doesn't exist. */\nexport const DEFAULT_ACCOUNT_SECTION: AccountSection = 'orders'\n\nfunction isAccountSection(value: string): value is AccountSection {\n return (ACCOUNT_SECTIONS as readonly string[]).includes(value)\n}\n\n/**\n * Read the section out of an in-app path such as `/account?section=addresses`.\n *\n * Parsed by hand rather than with URLSearchParams because the value arrives as\n * a router path, not a URL, and an unknown or absent section must degrade to\n * the default instead of throwing at a shopper.\n */\nexport function parseAccountSection(path: string): AccountSection {\n const query = path.split('?')[1]\n if (!query) return DEFAULT_ACCOUNT_SECTION\n for (const pair of query.split('&')) {\n const [key, raw = ''] = pair.split('=')\n if (key !== 'section') continue\n const value = decodeURIComponent(raw)\n return isAccountSection(value) ? value : DEFAULT_ACCOUNT_SECTION\n }\n return DEFAULT_ACCOUNT_SECTION\n}\n\n/** The addressable path for a section — what the account menu links to. */\nexport function accountSectionPath(section: AccountSection): string {\n return `/account?section=${section}`\n}\n","import React from 'react'\nimport { CreditCard, LogOut, MapPin, Package, ShieldCheck, User } from 'lucide-react'\nimport { signOutCustomer } from '../../data/auth'\nimport { useStorefrontConfig } from '../../document/config'\nimport { Link } from '../../app/router'\nimport { useSessionStore } from '../../stores/session.store'\nimport { TID } from '../../lib/testids'\nimport { accountSectionPath, type AccountSection } from './section'\n\nexport type { AccountSection }\n\ninterface CustomerAccountShellProps {\n title: string\n subtitle?: string\n active: AccountSection\n /**\n * Switch the active section in-place instead of navigating. Optional, and\n * omitting it is the normal case: the menu is made of real links to\n * `/account?section=…`, so it works on any page that mounts this shell.\n */\n onSelect?: (section: AccountSection) => void\n children: React.ReactNode\n}\n\nconst menuItems = [\n { id: 'profile', label: 'Perfil', icon: User },\n { id: 'orders', label: 'Meus pedidos', icon: Package },\n { id: 'addresses', label: 'Endereços', icon: MapPin },\n { id: 'payments', label: 'Pagamentos', icon: CreditCard },\n] as const\n\nexport function CustomerAccountShell({ title, subtitle, active, onSelect, children }: CustomerAccountShellProps) {\n const config = useStorefrontConfig()\n const session = useSessionStore()\n const displayName = session.name || session.email?.split('@')[0] || 'Cliente'\n const displayEmail = session.email || 'Conta criada no checkout'\n\n return (\n <main data-testid={TID.customerAccountShell} className=\"mx-auto max-w-6xl px-4 py-8 sm:px-6\">\n <div className=\"mb-6 flex flex-wrap items-center justify-between gap-4\">\n <div>\n <p className=\"text-sm font-medium text-muted-foreground\">{config.name}</p>\n <h1 className=\"sf-heading text-3xl font-bold tracking-tight\">{title}</h1>\n {subtitle && <p className=\"mt-1 text-sm text-muted-foreground\">{subtitle}</p>}\n </div>\n <Link to={config.catalogPath} className=\"rounded-lg border px-4 py-2 text-sm font-semibold hover:bg-muted\">\n Voltar à loja\n </Link>\n </div>\n\n <div className=\"grid gap-6 lg:grid-cols-[260px_minmax(0,1fr)]\">\n <aside className=\"h-fit rounded-xl border bg-card p-4\">\n <div className=\"flex items-center gap-3 border-b pb-4\">\n <div className=\"flex h-11 w-11 items-center justify-center rounded-full bg-primary/10 font-bold text-primary\">\n {displayName.slice(0, 1).toUpperCase()}\n </div>\n <div className=\"min-w-0\">\n <p className=\"truncate font-semibold\">{displayName}</p>\n <p className=\"truncate text-xs text-muted-foreground\">{displayEmail}</p>\n </div>\n </div>\n\n <nav data-testid={TID.customerAccountMenu} className=\"mt-4 space-y-1\" aria-label=\"Área do cliente\">\n {menuItems.map((item) => {\n const Icon = item.icon\n const selected = item.id === active\n return (\n <Link\n key={item.id}\n to={accountSectionPath(item.id)}\n data-section={item.id}\n aria-current={selected ? 'page' : undefined}\n // A real href always, so the menu still works when the page\n // that mounted the shell has no in-place handler to offer.\n onClick={(event) => {\n if (!onSelect) return\n event.preventDefault()\n onSelect(item.id)\n }}\n className={`flex w-full items-center gap-3 rounded-lg px-3 py-2.5 text-left text-sm font-semibold transition ${\n selected ? 'bg-primary/10 text-primary' : 'text-muted-foreground hover:bg-muted hover:text-foreground'\n }`}\n >\n <Icon className=\"h-4 w-4\" />\n {item.label}\n </Link>\n )\n })}\n </nav>\n\n <div className=\"mt-4 rounded-lg bg-muted/40 p-3 text-xs text-muted-foreground\">\n <div className=\"flex items-center gap-2 font-semibold text-foreground\">\n <ShieldCheck className=\"h-4 w-4 text-primary\" />\n Conta protegida\n </div>\n <p className=\"mt-1\">Pedidos, pagamentos e endereços ficam organizados para próximas compras.</p>\n </div>\n\n <button\n type=\"button\"\n data-testid={TID.signout}\n onClick={() => void signOutCustomer()}\n className=\"mt-4 flex w-full items-center gap-3 rounded-lg px-3 py-2.5 text-sm font-semibold text-muted-foreground transition hover:bg-muted hover:text-foreground\"\n >\n <LogOut className=\"h-4 w-4\" />\n Sair\n </button>\n </aside>\n\n <section className=\"min-w-0\">{children}</section>\n </div>\n </main>\n )\n}\n","import React, { useEffect, useState } from 'react'\nimport { getShopProvider } from '@fayz-ai/shop/runtime'\nimport { prefersReducedMotion } from '../lib/motion'\nimport type { Order } from '@fayz-ai/shop/types'\nimport { useStorefrontConfig } from '../document/config'\nimport { Link, navigateTo } from '../app/router'\nimport { formatMoney } from '../lib/format'\nimport { TID } from '../lib/testids'\nimport { CustomerAccountShell } from '../components/account/CustomerAccountShell'\nimport { OrderTrackingTimeline } from '../components/order/OrderTrackingTimeline'\nimport { financialStatusBadge, isPaid } from '../data/order-status'\nimport { useStorefrontHead } from '../hooks/use-storefront-head'\nimport { SmoothImage } from '../components/SmoothImage'\nimport { SuccessMark } from '../components/order/SuccessMark'\nimport { Skeleton, SkeletonGroup } from '../components/Skeleton'\n\n/** O contrário do SuccessMark: um pedido que existe e ainda não é uma compra. */\nfunction PendingMark() {\n return (\n <div className=\"relative mx-auto h-24 w-24\">\n <span className=\"absolute inset-0 rounded-full bg-amber-100\" />\n <svg viewBox=\"0 0 48 48\" className=\"absolute inset-0 h-full w-full p-6\" aria-hidden>\n <circle cx=\"24\" cy=\"24\" r=\"17\" fill=\"none\" stroke=\"rgb(180 83 9)\" strokeWidth=\"4\" />\n <path d=\"M24 14 L24 25 L31 29\" fill=\"none\" stroke=\"rgb(180 83 9)\" strokeWidth=\"4\"\n strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </div>\n )\n}\n\nexport function OrderConfirmationPage({ orderId }: { orderId: string }) {\n const config = useStorefrontConfig()\n const [order, setOrder] = useState<Order | null>(null)\n const [loading, setLoading] = useState(true)\n const money = (v: number) => formatMoney(v, config.currency, config.locale)\n useStorefrontHead({ title: order ? `Pedido #${order.orderNumber} — ${config.name}` : config.name })\n\n const reload = React.useCallback(() => {\n let cancelled = false\n getShopProvider()\n .getOrder(orderId)\n .then((o) => {\n if (!cancelled) setOrder(o)\n })\n .finally(() => {\n if (!cancelled) setLoading(false)\n })\n return () => {\n cancelled = true\n }\n }, [orderId])\n\n useEffect(() => reload(), [reload])\n\n if (loading) {\n // Inside the real shell, so the store never blinks out and back for someone\n // who just paid.\n return (\n <CustomerAccountShell title=\"Detalhe do pedido\" active=\"orders\">\n <SkeletonGroup label=\"Carregando seu pedido\" className=\"rounded-xl border bg-card p-6 sm:p-8\">\n <div className=\"grid gap-6 border-b pb-6 sm:grid-cols-[120px_minmax(0,1fr)]\">\n <Skeleton className=\"mx-auto h-24 w-24 rounded-full\" />\n <div>\n <Skeleton className=\"h-8 w-64 max-w-full\" />\n <Skeleton className=\"mt-2 h-3.5 w-full max-w-md\" />\n <Skeleton className=\"mt-4 h-6 w-48\" />\n </div>\n </div>\n\n <div className=\"mt-6 grid gap-4 rounded-xl border bg-muted/20 p-4 sm:grid-cols-3\">\n {[0, 1, 2].map((column) => (\n <div key={column}>\n <Skeleton className=\"h-3 w-16\" />\n <Skeleton className=\"mt-2 h-4 w-28\" />\n <Skeleton className=\"mt-1.5 h-3 w-20\" />\n </div>\n ))}\n </div>\n\n <div className=\"mt-6\">\n <Skeleton className=\"h-3 w-32\" />\n <div className=\"mt-3 flex items-center gap-2\">\n {[0, 1, 2, 3].map((node) => (\n <React.Fragment key={node}>\n <Skeleton className=\"h-7 w-7 shrink-0 rounded-full\" />\n {node < 3 && <Skeleton className=\"h-px flex-1\" />}\n </React.Fragment>\n ))}\n </div>\n </div>\n\n <div className=\"mt-8 space-y-3\">\n {[0, 1].map((row) => (\n <div key={row} className=\"flex items-center gap-3\">\n <Skeleton className=\"h-12 w-12 rounded-lg\" />\n <Skeleton className=\"h-3.5 flex-1\" />\n <Skeleton className=\"h-3.5 w-16\" />\n </div>\n ))}\n </div>\n\n <div className=\"mt-4 space-y-2 border-t pt-4\">\n <Skeleton className=\"h-3.5 w-full max-w-xs\" />\n <Skeleton className=\"h-3.5 w-full max-w-[14rem]\" />\n <Skeleton className=\"h-5 w-40\" />\n </div>\n </SkeletonGroup>\n </CustomerAccountShell>\n )\n }\n if (!order) {\n return (\n <main className=\"mx-auto max-w-2xl px-4 py-20 text-center\">\n <p className=\"text-muted-foreground\">Pedido não encontrado.</p>\n <Link to=\"/\" className=\"mt-4 inline-block text-primary underline\">Voltar à loja</Link>\n </main>\n )\n }\n\n const paid = isPaid(order.financialStatus)\n\n return (\n <CustomerAccountShell\n title=\"Detalhe do pedido\"\n subtitle={paid ? 'Compra confirmada e vinculada à sua conta.' : 'Pedido guardado, aguardando o pagamento.'}\n active=\"orders\"\n // Sem isto os quatro botões do menu da conta eram BOTÕES MORTOS nesta\n // tela: o shell chama `onSelect?.(id)` e ninguém passava um. A conta é\n // outra rota, então aqui a escolha navega em vez de trocar de aba.\n onSelect={(section) => navigateTo(`/account?section=${section}`)}\n >\n {/* O Pix NÃO mora mais aqui.\n Esta tela abria uma cobrança sobre um pedido que já existia — o\n desenho antigo, em que o pedido nascia antes do dinheiro. Quando o\n adquirente não estava conectado, o que o comprador via era \"Não\n conseguimos abrir o Pix agora\" logo abaixo de \"Falta o pagamento\":\n uma tela que cobra e falha ao mesmo tempo, sem saída. O recebimento\n acontece no passo 3 do checkout, antes de existir pedido. */}\n\n <article data-testid={TID.orderDetail} className=\"animate-fade-up rounded-xl border bg-card p-6 sm:p-8\">\n <div className=\"grid gap-6 border-b pb-6 sm:grid-cols-[120px_minmax(0,1fr)]\">\n {/* Confete só quando o dinheiro entrou. A página comemorava\n \"Pedido confirmado!\" para um pedido `pending` — um comprador que\n ainda não pagou saía daqui achando que tinha comprado, e o lojista\n recebia a cobrança de um pedido que ninguém pagou. */}\n {paid ? <SuccessMark /> : <PendingMark />}\n <div className=\"text-center sm:text-left\">\n <h2 className=\"sf-heading text-3xl font-bold tracking-tight\">\n {paid ? 'Pedido confirmado!' : 'Falta o pagamento'}\n </h2>\n <p className=\"mt-1 text-muted-foreground\">\n {paid\n ? `Obrigado pela compra, ${order.customerName ?? 'cliente'}. A loja já está preparando seu pedido.`\n : `Guardamos seu pedido, ${order.customerName ?? 'cliente'}. Ele só é preparado depois que o pagamento entrar.`}\n </p>\n <p className=\"mt-4 text-lg\">\n Pedido <span data-testid={TID.orderNumber} className=\"font-semibold\">#{order.orderNumber}</span>{' '}\n <span\n data-testid={TID.orderStatus}\n className={`ml-2 inline-flex rounded-full px-2.5 py-0.5 text-sm font-medium ${financialStatusBadge(order.financialStatus).className}`}\n >\n {financialStatusBadge(order.financialStatus).label}\n </span>\n </p>\n </div>\n </div>\n\n <div className=\"mt-6 grid gap-4 rounded-xl border bg-muted/20 p-4 text-sm sm:grid-cols-3\">\n <div>\n <p className=\"text-muted-foreground\">Cliente</p>\n <p className=\"mt-1 font-semibold\">{order.customerName ?? 'Cliente'}</p>\n <p className=\"text-muted-foreground\">{order.customerEmail}</p>\n </div>\n <div>\n <p className=\"text-muted-foreground\">Entrega</p>\n {/* \"Preparando envio\" era dito para um pedido que ninguém pagou —\n a loja não separa nada antes do dinheiro entrar. */}\n <p className=\"mt-1 font-semibold\">\n {order.fulfillmentStatus === 'fulfilled'\n ? 'Enviado'\n : paid ? 'Preparando envio' : 'Aguardando pagamento'}\n </p>\n <p className=\"text-muted-foreground\">{order.notes ?? 'Endereço salvo no pedido'}</p>\n </div>\n <div>\n <p className=\"text-muted-foreground\">Pagamento</p>\n <p className=\"mt-1 font-semibold\">{financialStatusBadge(order.financialStatus).label}</p>\n {/* Nada é \"processado no checkout\" enquanto não há cobrança paga. */}\n <p className=\"text-muted-foreground\">\n {paid ? 'Recebido pela loja' : 'Ainda não recebido'}\n </p>\n </div>\n </div>\n\n <div className=\"mt-6\">\n <h3 className=\"mb-3 text-sm font-semibold uppercase text-muted-foreground\">\n Acompanhamento\n </h3>\n <OrderTrackingTimeline order={order} />\n\n {/* The code itself, under the timeline that says a box exists. Until\n 0052 the buyer could see \"enviado\" and had no way to learn it. */}\n {(order.shipments ?? []).filter((s) => s.trackingCode).map((shipment) => (\n <div\n key={shipment.id}\n data-testid={TID.orderTracking + '-code'}\n className=\"mt-4 flex flex-wrap items-center gap-x-3 gap-y-1 rounded-lg border bg-muted/30 px-4 py-3 text-sm\"\n >\n <span className=\"text-muted-foreground\">\n {shipment.carrier ? `Enviado por ${shipment.carrier}` : 'Enviado'}\n </span>\n {shipment.trackingUrl ? (\n <a\n href={shipment.trackingUrl}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"font-mono font-medium text-primary hover:underline\"\n >\n {shipment.trackingCode}\n </a>\n ) : (\n <span className=\"font-mono font-medium\">{shipment.trackingCode}</span>\n )}\n </div>\n ))}\n </div>\n\n <ul className=\"mt-8 space-y-3 text-left\">\n {order.items.map((item) => (\n <li key={item.id} className=\"flex items-center gap-3 text-sm\">\n {item.imageUrl && <SmoothImage src={item.imageUrl} alt={item.name} className=\"h-12 w-12 rounded-lg border object-cover\" />}\n <span className=\"flex-1\">\n {item.name} <span className=\"text-muted-foreground\">× {item.quantity}</span>\n </span>\n <span data-price={item.total.toFixed(2)}>{money(item.total)}</span>\n </li>\n ))}\n </ul>\n\n <dl className=\"mt-4 space-y-1.5 border-t pt-4 text-left text-sm\">\n <div className=\"flex justify-between\">\n <dt className=\"text-muted-foreground\">Subtotal</dt>\n <dd data-price={order.subtotal.toFixed(2)}>{money(order.subtotal)}</dd>\n </div>\n {order.discountTotal > 0 && (\n <div className=\"flex justify-between text-emerald-700\">\n <dt>Desconto {order.discountCode ? `(${order.discountCode})` : ''}</dt>\n <dd data-price={order.discountTotal.toFixed(2)}>−{money(order.discountTotal)}</dd>\n </div>\n )}\n <div className=\"flex justify-between\">\n <dt className=\"text-muted-foreground\">Frete</dt>\n <dd data-price={order.shippingTotal.toFixed(2)}>\n {order.shippingTotal === 0 ? 'Grátis' : money(order.shippingTotal)}\n </dd>\n </div>\n <div className=\"flex justify-between border-t pt-2 text-base font-semibold\">\n <dt>Total</dt>\n <dd data-testid={TID.orderTotal} data-price={order.total.toFixed(2)}>{money(order.total)}</dd>\n </div>\n </dl>\n\n <div className=\"mt-8 flex flex-wrap gap-3\">\n <Link\n to=\"/account\"\n data-testid={TID.viewPurchases}\n className=\"rounded-xl bg-primary px-5 py-2.5 font-semibold text-primary-foreground hover:opacity-90\"\n >\n Minhas compras\n </Link>\n <Link to=\"/\" className=\"rounded-xl border px-5 py-2.5 font-semibold hover:bg-muted\">\n Continuar comprando\n </Link>\n </div>\n </article>\n </CustomerAccountShell>\n )\n}\n","import { useCallback, useEffect, useState } from 'react'\nimport { getShopProvider } from '@fayz-ai/shop/runtime'\nimport type { Order } from '@fayz-ai/shop/types'\nimport { useSessionStore } from '../stores/session.store'\nimport { listLocalOrderIds } from '../data/local-orders'\n\nexport function useMyOrders(): { orders: Order[]; loading: boolean; refresh: () => void } {\n const customerId = useSessionStore((s) => s.customerId)\n const email = useSessionStore((s) => s.email)\n const [orders, setOrders] = useState<Order[]>([])\n const [loading, setLoading] = useState(true)\n const [tick, setTick] = useState(0)\n\n const refresh = useCallback(() => setTick((t) => t + 1), [])\n\n useEffect(() => {\n let cancelled = false\n // Um convidado não tem sessão de verdade, então o servidor recusa listar\n // por cliente (0055) — e recusa CERTO. O que ele consegue ver é o que este\n // navegador criou.\n const local = listLocalOrderIds()\n if (!customerId && !email) {\n if (local.length === 0) {\n setOrders([])\n setLoading(false)\n return\n }\n }\n setLoading(true)\n // Scope by customerId (RLS-enforced to the owner on Supabase) when available;\n // fall back to email only for legacy sessions without a linked customer.\n const query = customerId ? { customerId, limit: 50 } : { customerEmail: email!, limit: 50 }\n getShopProvider()\n .listOrders(query)\n .then((data) => {\n if (!cancelled) setOrders(data)\n })\n .catch(async () => {\n // 42501 aqui é a trava de 0055 fazendo o trabalho dela: quem não entrou\n // não lista o histórico de ninguém. Cai para os pedidos deste\n // navegador, buscados um a um pelo uuid — que é a credencial.\n const mine = await Promise.all(\n listLocalOrderIds().map((id) => getShopProvider().getOrder(id).catch(() => null)),\n )\n if (!cancelled) setOrders(mine.filter((o): o is Order => !!o))\n })\n .finally(() => {\n if (!cancelled) setLoading(false)\n })\n return () => {\n cancelled = true\n }\n }, [customerId, email, tick])\n\n return { orders, loading, refresh }\n}\n","import React, { useState } from 'react'\nimport { CreditCard, MapPin, Package, QrCode } from 'lucide-react'\nimport { getShopProvider } from '@fayz-ai/shop/runtime'\nimport { useSessionStore } from '../stores/session.store'\nimport { establishCustomerSession, signUpCustomer, EmailConfirmationRequiredError } from '../data/auth'\nimport { useMyOrders } from '../hooks/use-my-orders'\nimport { useStorefrontConfig } from '../document/config'\nimport { Link, useRoutePath } from '../app/router'\nimport { formatMoney } from '../lib/format'\nimport { TID } from '../lib/testids'\nimport { CustomerAccountShell } from '../components/account/CustomerAccountShell'\nimport { parseAccountSection, type AccountSection } from '../components/account/section'\nimport { OrderTrackingTimeline } from '../components/order/OrderTrackingTimeline'\nimport { financialStatusBadge } from '../data/order-status'\nimport { useStorefrontHead } from '../hooks/use-storefront-head'\nimport { SmoothImage } from '../components/SmoothImage'\nimport { Skeleton, SkeletonGroup } from '../components/Skeleton'\n\nfunction AuthForm() {\n const [mode, setMode] = useState<'signin' | 'signup'>('signin')\n const [email, setEmail] = useState('')\n const [password, setPassword] = useState('')\n const [name, setName] = useState('')\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const [notice, setNotice] = useState<string | null>(null)\n\n async function submit(e: React.FormEvent) {\n e.preventDefault()\n setError(null)\n setNotice(null)\n if (!email.trim() || !password) return\n if (mode === 'signup' && !name.trim()) {\n setError('Informe seu nome.')\n return\n }\n setBusy(true)\n try {\n if (mode === 'signup') await signUpCustomer(email, password, name.trim())\n else await establishCustomerSession(email, { password })\n } catch (err) {\n if (err instanceof EmailConfirmationRequiredError) {\n setNotice('Cadastro realizado! Confirme seu e-mail para continuar.')\n } else {\n setError(err instanceof Error ? err.message : 'Não foi possível entrar. Verifique seus dados.')\n }\n } finally {\n setBusy(false)\n }\n }\n\n const tab = (id: 'signin' | 'signup', label: string, testId: string) => (\n <button\n type=\"button\"\n data-testid={testId}\n onClick={() => {\n setMode(id)\n setError(null)\n setNotice(null)\n }}\n className={`flex-1 border-b-2 pb-2.5 text-sm font-semibold transition-colors ${\n mode === id ? 'border-primary text-primary' : 'border-transparent text-muted-foreground hover:text-foreground'\n }`}\n >\n {label}\n </button>\n )\n\n return (\n <div className=\"mx-auto max-w-sm animate-fade-up border bg-card p-7\" style={{ borderRadius: 'var(--sf-radius-card)' }}>\n <h2 className=\"sf-heading text-xl font-semibold\">Minha conta</h2>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n Acompanhe pedidos e acelere seus próximos checkouts.\n </p>\n <div className=\"mt-5 flex gap-2\">\n {tab('signin', 'Entrar', TID.authTabSignin)}\n {tab('signup', 'Criar conta', TID.authTabSignup)}\n </div>\n <form className=\"mt-5 space-y-3\" onSubmit={submit}>\n {mode === 'signup' && (\n <input\n data-testid={TID.signinName}\n type=\"text\"\n required\n placeholder=\"Nome completo\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n className=\"w-full border bg-background px-3 py-2.5 text-sm\"\n style={{ borderRadius: 'var(--sf-radius-input)' }}\n />\n )}\n <input\n data-testid={TID.signinEmail}\n type=\"email\"\n required\n placeholder=\"voce@exemplo.com\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n className=\"w-full border bg-background px-3 py-2.5 text-sm\"\n style={{ borderRadius: 'var(--sf-radius-input)' }}\n />\n <input\n data-testid={TID.signinPassword}\n type=\"password\"\n required\n placeholder=\"Senha\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n className=\"w-full border bg-background px-3 py-2.5 text-sm\"\n style={{ borderRadius: 'var(--sf-radius-input)' }}\n />\n {notice && (\n <p data-testid={TID.authNotice} className=\"text-sm font-medium text-emerald-700\">{notice}</p>\n )}\n {error && (\n <p data-testid={TID.authError} className=\"text-sm text-destructive\">{error}</p>\n )}\n <button\n type=\"submit\"\n data-testid={TID.signinSubmit}\n disabled={busy}\n className=\"sf-cta w-full bg-primary py-3 font-semibold text-primary-foreground shadow-md transition-all hover:-translate-y-0.5 hover:shadow-lg disabled:opacity-60\"\n style={{ borderRadius: 'var(--sf-radius-button)' }}\n >\n {busy ? 'Entrando…' : mode === 'signup' ? 'Criar conta' : 'Entrar'}\n </button>\n </form>\n </div>\n )\n}\n\nfunction OrdersPanel() {\n const config = useStorefrontConfig()\n const { orders, loading } = useMyOrders()\n const money = (v: number) => formatMoney(v, config.currency, config.locale)\n\n if (loading) {\n return (\n <SkeletonGroup label=\"Carregando seus pedidos\" className=\"space-y-4\">\n {[0, 1].map((row) => (\n <div key={row} className=\"rounded-2xl border bg-card p-5\">\n <div className=\"flex items-center justify-between\">\n <Skeleton className=\"h-4 w-32\" />\n <Skeleton className=\"h-5 w-24 rounded-full\" />\n </div>\n <Skeleton className=\"mt-2 h-3 w-20\" />\n <div className=\"mt-4 flex items-center gap-2\">\n {[0, 1, 2, 3].map((node) => (\n <React.Fragment key={node}>\n <Skeleton className=\"h-6 w-6 shrink-0 rounded-full\" />\n {node < 3 && <Skeleton className=\"h-px flex-1\" />}\n </React.Fragment>\n ))}\n </div>\n <div className=\"mt-4 flex flex-wrap gap-2\">\n <Skeleton className=\"h-7 w-32 rounded-lg\" />\n <Skeleton className=\"h-7 w-24 rounded-lg\" />\n </div>\n <div className=\"mt-3 flex items-center justify-between border-t pt-3\">\n <Skeleton className=\"h-4 w-24\" />\n <Skeleton className=\"h-4 w-20\" />\n </div>\n </div>\n ))}\n </SkeletonGroup>\n )\n }\n if (orders.length === 0) {\n return (\n <div data-testid={TID.purchasesEmpty} className=\"rounded-2xl border bg-card py-16 text-center\">\n <Package className=\"mx-auto h-10 w-10 text-muted-foreground\" />\n <p className=\"mt-3 text-muted-foreground\">Você ainda não tem pedidos.</p>\n <Link to=\"/\" className=\"mt-4 inline-block text-primary underline\">Explorar a loja</Link>\n </div>\n )\n }\n return (\n <ul data-testid={TID.purchasesList} className=\"space-y-4\">\n {orders.map((order) => (\n <li\n key={order.id}\n data-testid={TID.purchaseItem}\n data-order-number={order.orderNumber}\n className=\"rounded-2xl border bg-card p-5\"\n >\n <div className=\"flex items-center justify-between\">\n <span className=\"font-semibold\">Pedido #{order.orderNumber}</span>\n <span className={`inline-flex rounded-full px-2.5 py-0.5 text-xs font-medium ${financialStatusBadge(order.financialStatus).className}`}>\n {financialStatusBadge(order.financialStatus).label}\n </span>\n </div>\n <p className=\"mt-0.5 text-xs text-muted-foreground\">\n {new Date(order.createdAt).toLocaleDateString(config.locale)}\n </p>\n <div className=\"mt-4\">\n <OrderTrackingTimeline order={order} compact />\n </div>\n <ul className=\"mt-3 flex flex-wrap gap-2\">\n {order.items.map((item) => (\n <li key={item.id} className=\"flex items-center gap-2 rounded-lg border px-2 py-1 text-xs\">\n {item.imageUrl && <SmoothImage src={item.imageUrl} alt={item.name} className=\"h-6 w-6 rounded object-cover\" />}\n {item.name} × {item.quantity}\n </li>\n ))}\n </ul>\n <div className=\"mt-3 flex items-center justify-between border-t pt-3 text-sm\">\n <Link to={`/order/${order.id}`} className=\"font-medium text-primary hover:underline\">\n Ver detalhes\n </Link>\n <span>\n <span className=\"mr-2 text-muted-foreground\">Total</span>\n <span className=\"font-semibold\" data-price={order.total.toFixed(2)}>{money(order.total)}</span>\n </span>\n </div>\n </li>\n ))}\n </ul>\n )\n}\n\nfunction ProfilePanel() {\n const session = useSessionStore()\n const [name, setName] = useState(session.name ?? '')\n const [saving, setSaving] = useState(false)\n const [saved, setSaved] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n async function save(e: React.FormEvent) {\n e.preventDefault()\n const trimmed = name.trim()\n if (!trimmed) return\n setSaving(true)\n setSaved(false)\n setError(null)\n try {\n if (session.customerId) {\n const parts = trimmed.split(/\\s+/).filter(Boolean)\n await getShopProvider().updateCustomer(session.customerId, {\n firstName: parts[0] ?? trimmed,\n lastName: parts.slice(1).join(' '),\n })\n }\n // Only after the write landed: mirroring the new name locally on a failed\n // save is how this looked like it worked while the record never changed.\n useSessionStore.setState({ name: trimmed })\n setSaved(true)\n } catch {\n setError('Não foi possível salvar seu nome agora. Tente novamente em instantes.')\n } finally {\n setSaving(false)\n }\n }\n\n return (\n <form onSubmit={save} className=\"max-w-md rounded-2xl border bg-card p-6\">\n <h2 className=\"sf-heading text-lg font-semibold\">Perfil</h2>\n <p className=\"mt-1 text-sm text-muted-foreground\">Seus dados para os próximos checkouts.</p>\n <label className=\"mt-5 block text-sm font-medium\">\n Nome completo\n <input\n value={name}\n onChange={(e) => { setName(e.target.value); setSaved(false) }}\n className=\"mt-1 w-full rounded-lg border bg-background px-3 py-2.5 text-sm\"\n placeholder=\"Seu nome\"\n />\n </label>\n <label className=\"mt-4 block text-sm font-medium\">\n E-mail\n <input\n value={session.email ?? ''}\n readOnly\n className=\"mt-1 w-full cursor-not-allowed rounded-lg border bg-muted/40 px-3 py-2.5 text-sm text-muted-foreground\"\n />\n </label>\n <div className=\"mt-5 flex items-center gap-3\">\n <button\n type=\"submit\"\n disabled={saving}\n className=\"sf-cta rounded-lg bg-primary px-5 py-2.5 text-sm font-semibold text-primary-foreground disabled:opacity-60\"\n >\n {saving ? 'Salvando…' : 'Salvar'}\n </button>\n {saved && <span className=\"text-sm font-medium text-emerald-700\">Salvo</span>}\n </div>\n {error && <p className=\"mt-3 text-sm text-destructive\">{error}</p>}\n </form>\n )\n}\n\nfunction AddressesPanel() {\n return (\n <div className=\"rounded-2xl border bg-card p-6\">\n <div className=\"flex items-center gap-2\">\n <MapPin className=\"h-5 w-5 text-primary\" />\n <h2 className=\"sf-heading text-lg font-semibold\">Endereços</h2>\n </div>\n <p className=\"mt-2 text-sm text-muted-foreground\">\n Você informa o endereço de entrega no checkout. Em breve será possível salvar endereços para reutilizar\n nas próximas compras.\n </p>\n <Link to=\"/\" className=\"mt-4 inline-block text-sm font-semibold text-primary underline\">\n Continuar comprando\n </Link>\n </div>\n )\n}\n\nfunction PaymentsPanel() {\n return (\n <div className=\"rounded-2xl border bg-card p-6\">\n <div className=\"flex items-center gap-2\">\n <CreditCard className=\"h-5 w-5 text-primary\" />\n <h2 className=\"sf-heading text-lg font-semibold\">Pagamentos</h2>\n </div>\n <p className=\"mt-2 text-sm text-muted-foreground\">\n Os pagamentos são processados com segurança no checkout — nenhum dado de pagamento fica salvo nesta conta.\n </p>\n <div className=\"mt-4 flex items-center gap-2 rounded-lg bg-muted/40 px-3 py-2.5 text-sm\">\n <QrCode className=\"h-4 w-4 text-primary\" />\n <span>Pix e cartão via Mercado Pago no momento da compra.</span>\n </div>\n </div>\n )\n}\n\nconst SECTION_SUBTITLE: Record<AccountSection, string> = {\n profile: 'Seus dados de contato.',\n orders: 'Acompanhe seus pedidos e entregas.',\n addresses: 'Endereços de entrega.',\n payments: 'Como você paga na loja.',\n}\n\nexport function MyPurchasesPage() {\n const config = useStorefrontConfig()\n const session = useSessionStore()\n const section = parseAccountSection(useRoutePath())\n useStorefrontHead({ title: `Minha conta — ${config.name}` })\n\n if (!session.email) {\n return (\n <main className=\"mx-auto max-w-3xl px-4 py-12 sm:px-6\">\n <AuthForm />\n </main>\n )\n }\n\n return (\n <CustomerAccountShell\n title=\"Minha conta\"\n subtitle={SECTION_SUBTITLE[section]}\n active={section}\n >\n {section === 'profile' && <ProfilePanel />}\n {section === 'orders' && <OrdersPanel />}\n {section === 'addresses' && <AddressesPanel />}\n {section === 'payments' && <PaymentsPanel />}\n </CustomerAccountShell>\n )\n}\n","import { setShopShippingItemsResolver } from '@fayz-ai/sdk/shop'\nimport { useCartStore } from '../stores/cart.store'\n\n/**\n * Tells the freight quote what is in the cart.\n *\n * `setShopShippingItemsResolver` shipped with FAY-1301 and NOTHING installed\n * it: the quote function received `items: []` on every call and fell through to\n * a default box for every store on the platform. The box was 4×16×20cm at\n * 0,3kg — the floor Correios accepts — so a costela and an e-book were priced\n * as the same parcel, and the difference between the quote and the label came\n * out of the merchant's margin.\n *\n * A resolver rather than an argument because `delivery.store.resolve(cep,\n * subtotal)` has had that signature since before any carrier existed, and every\n * storefront in the wild calls it that way. Installed once, here, exactly like\n * `setShopAccessTokenResolver` in data/auth.ts.\n *\n * Read through `getState()` and not a hook: this runs inside a network call,\n * not a render.\n */\nexport function initShippingItems(): void {\n setShopShippingItemsResolver(() =>\n useCartStore.getState().lines.map((line) => ({\n quantity: line.quantity,\n weight: line.weight ?? null,\n weightUnit: line.weightUnit ?? null,\n height: line.heightCm ?? null,\n width: line.widthCm ?? null,\n length: line.lengthCm ?? null,\n packageId: line.packageId ?? null,\n // Undefined is a line added before this existed. Treated as physical:\n // freight wrongly charged is a complaint, freight wrongly skipped is a\n // parcel the merchant pays for.\n isPhysical: line.requiresShipping !== false,\n productId: line.productId,\n variantId: line.variantId,\n name: line.name,\n sku: line.sku,\n })),\n )\n}\n","import React from 'react'\nimport { Link } from '../app/router'\nimport { useStorefrontConfig } from '../document/config'\nimport { useStorefrontHead } from '../hooks/use-storefront-head'\n\n/** Fallback for unknown routes. Previously these silently rendered the home/catalog page with a 200. */\nexport function NotFoundPage() {\n const config = useStorefrontConfig()\n useStorefrontHead({ title: `Página não encontrada — ${config.name}` })\n return (\n // `data-storefront-page` is how a headless render (renderStore, M8) reports\n // that a path did not resolve, without re-deriving the routing table on the\n // server: the page that knows it is a 404 says so in the markup, once.\n <main\n data-storefront-page=\"not-found\"\n className=\"mx-auto flex min-h-[60vh] max-w-2xl flex-col items-center justify-center px-4 py-16 text-center\"\n >\n <p className=\"sf-heading text-5xl font-bold tracking-tight text-primary\">404</p>\n <h1 className=\"mt-3 text-xl font-semibold\">Página não encontrada</h1>\n <p className=\"mt-2 text-sm text-muted-foreground\">\n O endereço que você tentou acessar não existe ou foi movido.\n </p>\n <Link\n to={config.catalogPath}\n className=\"mt-6 rounded-lg bg-primary px-5 py-2.5 text-sm font-semibold text-primary-foreground transition hover:opacity-90\"\n >\n Ir para a loja\n </Link>\n </main>\n )\n}\n","import React from 'react'\nimport { Link } from '../app/router'\nimport { useStorefrontConfig } from '../document/config'\nimport { useStorefrontHead } from '../hooks/use-storefront-head'\n\nconst TITLES = {\n privacy: 'Política de Privacidade',\n terms: 'Termos de Uso',\n returns: 'Trocas e Devoluções',\n} as const\n\nexport type PolicyKind = keyof typeof TITLES\n\n/** Institutional/legal pages. Content comes from config.legal; absent pages show\n * a placeholder so the routes + footer links exist (no 404) before the store\n * publishes its policy — a payment-processor / go-live requirement. */\nexport function PolicyPage({ kind }: { kind: PolicyKind }) {\n const config = useStorefrontConfig()\n const title = TITLES[kind]\n const content = config.legal?.[kind]\n const email = config.footer?.contact?.email\n useStorefrontHead({ title: `${title} — ${config.name}` })\n\n return (\n <main className=\"mx-auto max-w-3xl px-4 py-12 sm:px-6\">\n <Link to={config.catalogPath} className=\"text-sm text-muted-foreground transition-colors hover:text-foreground\">\n ← Voltar à loja\n </Link>\n <h1 className=\"sf-heading mt-4 text-3xl font-bold tracking-tight\">{title}</h1>\n <div className=\"mt-6 space-y-4 leading-relaxed text-muted-foreground\">\n {content ? (\n content.split('\\n').filter((line) => line.trim()).map((paragraph, i) => <p key={i}>{paragraph}</p>)\n ) : (\n <>\n <p>O conteúdo desta política ainda será publicado pela loja.</p>\n {email && (\n <p>\n Em caso de dúvidas, fale com a gente em{' '}\n <a href={`mailto:${email}`} className=\"text-primary underline\">{email}</a>.\n </p>\n )}\n </>\n )}\n </div>\n </main>\n )\n}\n","import React from 'react'\nimport { Link } from '../../app/router'\n\ninterface Props {\n children: React.ReactNode\n}\n\ninterface State {\n error: Error | null\n}\n\n/**\n * Catches render/runtime errors in the storefront tree so a single thrown\n * error (e.g. a provider failure) shows a recoverable fallback instead of a\n * blank white screen. Key it by route to auto-clear on navigation.\n */\nexport class StorefrontErrorBoundary extends React.Component<Props, State> {\n state: State = { error: null }\n\n static getDerivedStateFromError(error: Error): State {\n return { error }\n }\n\n componentDidCatch(error: Error, info: React.ErrorInfo): void {\n // eslint-disable-next-line no-console\n console.error('[storefront] render error:', error, info.componentStack)\n }\n\n render(): React.ReactNode {\n if (!this.state.error) return this.props.children\n return (\n <div className=\"flex min-h-[60vh] flex-col items-center justify-center gap-4 px-4 py-16 text-center\">\n <h1 className=\"sf-heading text-xl font-semibold\">Algo deu errado</h1>\n <p className=\"max-w-md text-sm text-muted-foreground\">\n Ocorreu um erro ao carregar esta parte da loja. Tente recarregar a página.\n </p>\n <div className=\"flex flex-wrap justify-center gap-3\">\n <button\n type=\"button\"\n onClick={() => window.location.reload()}\n className=\"rounded-lg bg-primary px-5 py-2.5 text-sm font-semibold text-primary-foreground transition hover:opacity-90\"\n >\n Recarregar\n </button>\n <Link to=\"/\" className=\"rounded-lg border px-5 py-2.5 text-sm font-semibold transition hover:bg-muted\">\n Voltar ao início\n </Link>\n </div>\n </div>\n )\n }\n}\n","import React, { useEffect } from 'react'\nimport { AlertCircle, Check, Info, X } from 'lucide-react'\nimport { useToastStore, type Toast } from '../../stores/toast.store'\n\nconst ICON: Record<Toast['variant'], React.ComponentType<{ className?: string }>> = {\n success: Check,\n error: AlertCircle,\n info: Info,\n}\n\nconst ACCENT: Record<Toast['variant'], string> = {\n success: 'bg-emerald-500/10 text-emerald-600',\n error: 'bg-destructive/10 text-destructive',\n info: 'bg-primary/10 text-primary',\n}\n\nfunction ToastCard({ toast }: { toast: Toast }) {\n const dismiss = useToastStore((s) => s.dismiss)\n const Icon = ICON[toast.variant]\n\n useEffect(() => {\n const timer = window.setTimeout(() => dismiss(toast.id), toast.durationMs)\n return () => window.clearTimeout(timer)\n }, [toast.id, toast.durationMs, dismiss])\n\n return (\n <div\n role=\"status\"\n className=\"pointer-events-auto flex w-80 max-w-[calc(100vw-2rem)] animate-slide-in-from-right items-start gap-3 rounded-xl border bg-card p-3.5 shadow-lg\"\n >\n <span className={`grid h-8 w-8 shrink-0 place-items-center rounded-full ${ACCENT[toast.variant]}`}>\n <Icon className=\"h-4 w-4\" />\n </span>\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-semibold leading-tight\">{toast.title}</p>\n {toast.description && <p className=\"mt-0.5 text-xs text-muted-foreground\">{toast.description}</p>}\n </div>\n <button\n type=\"button\"\n aria-label=\"Fechar\"\n onClick={() => dismiss(toast.id)}\n className=\"text-muted-foreground transition-colors hover:text-foreground\"\n >\n <X className=\"h-4 w-4\" />\n </button>\n </div>\n )\n}\n\nexport function Toaster() {\n const toasts = useToastStore((s) => s.toasts)\n if (toasts.length === 0) return null\n return (\n <div className=\"pointer-events-none fixed bottom-4 right-4 z-[70] flex flex-col gap-2\">\n {toasts.map((t) => (\n <ToastCard key={t.id} toast={t} />\n ))}\n </div>\n )\n}\n","import React from 'react'\nimport { defineEntity } from '@fayz-ai/core'\nimport { setShopProvider, getShopProvider } from '@fayz-ai/shop/runtime'\nimport { createMockShopProvider } from '@fayz-ai/shop/mock'\nimport type { MockShopSeed } from '@fayz-ai/shop/mock'\nimport type { Discount } from '@fayz-ai/shop/types'\nimport type { ShopProvider } from '@fayz-ai/shop/provider'\nimport { initCustomerAuth, resolveAuthAdapter } from '../data/auth'\nimport { initShippingItems } from '../data/shipping-items'\nimport { registerStorefrontBlocks } from '../blocks/registry'\nimport { getStorefrontComponents, StorefrontConfigProvider, resolveConfig, useStorefrontConfig } from '../document/config'\nimport { StorefrontConfigHost } from '../document/store-policy'\nimport type { StorefrontConfig, StorefrontDiscountConfig } from '../document/config'\nimport type { StorefrontComponents } from '../extend/component-contracts'\nimport type { StorefrontSection } from '../blocks/sections'\nimport {\n matchPath,\n useRoutePath,\n useRouterAdapter,\n useScrollToTopOnNavigate,\n shellRouterAdapter,\n StorefrontRouterProvider,\n} from './router'\nimport { defaultRouterAdapter } from '@fayz-ai/core'\nimport type { RouterAdapter } from '@fayz-ai/core'\nimport { useCartStore } from '../stores/cart.store'\nimport { StorefrontThemeStyle } from '../lib/theme'\nimport { StorefrontHeader } from '../components/layout/StorefrontHeader'\nimport { StorefrontFooter } from '../components/layout/StorefrontFooter'\nimport { CartDrawer } from '../components/cart/CartDrawer'\nimport { StorefrontPage } from '../views/StorefrontPage'\nimport { ContentPage } from '../views/ContentPage'\nimport { matchContentPage } from '../blocks/page-blocks'\nimport { resolveStorefrontRoute } from './serving'\nimport { overrideComponent, overrideProps, resolveOverride } from '../extend/component-override'\nimport { CheckoutPage } from '../views/CheckoutPage'\nimport { OrderConfirmationPage } from '../views/OrderConfirmationPage'\nimport { MyPurchasesPage } from '../views/MyPurchasesPage'\nimport { NotFoundPage } from '../views/NotFoundPage'\nimport { PolicyPage } from '../views/PolicyPage'\nimport { StorefrontErrorBoundary } from '../components/layout/StorefrontErrorBoundary'\nimport { Toaster } from '../components/layout/Toaster'\n\nfunction isFocusedRoute(config: ReturnType<typeof useStorefrontConfig>, path: string): boolean {\n const match = resolveStorefrontRoute(config, path)\n if (match.kind === 'custom') {\n return match.route.chrome === 'focused' || match.route.kind === 'checkout'\n }\n return match.kind === 'checkout'\n}\n\nfunction RouteSwitch({ path }: { path: string }) {\n const config = useStorefrontConfig()\n // One route table (serving.ts), shared with cacheability, prerender path\n // enumeration and any host asking whether a URL exists. Resolving separately\n // here is how a page gets rendered as one thing and cached as another.\n const match = resolveStorefrontRoute(config, path)\n\n switch (match.kind) {\n case 'custom': {\n const CustomRoute = match.route.component\n return <CustomRoute path={path} params={match.params} config={config} />\n }\n case 'product':\n return <StorefrontPage kind=\"product\" page={config.pages.product} params={match.params} />\n case 'order':\n return <OrderConfirmationPage orderId={match.params.id!} />\n // A disabled feature owns its URL but renders nothing behind it, rather\n // than leaking to an unrelated page.\n case 'checkout':\n return config.features.checkout ? <CheckoutPage /> : <NotFoundPage />\n case 'account':\n return config.features.accounts ? <MyPurchasesPage /> : <NotFoundPage />\n case 'catalog':\n // The search results page IS the catalog, filtered — where the overlay's\n // CTA lands, carrying `?q=`.\n case 'searchResults':\n return <StorefrontPage kind=\"catalog\" page={config.pages.catalog} />\n case 'policy':\n return <PolicyPage kind={match.policy} />\n case 'content': {\n const content = matchContentPage(config.pages, path)\n return content ? (\n <ContentPage slug={content.slug} page={content.page} params={content.params} />\n ) : (\n <NotFoundPage />\n )\n }\n // Root renders home, or the catalog when there is no home page.\n case 'home':\n return config.pages.home ? (\n <StorefrontPage kind=\"home\" page={config.pages.home} />\n ) : (\n <StorefrontPage kind=\"catalog\" page={config.pages.catalog} />\n )\n case 'notFound':\n return <NotFoundPage />\n }\n}\n\n/**\n * Side-effect runtime init shared by the factory and the manifest scaffold:\n * wires customer auth and the shop provider. Idempotent and safe to call once\n * before first render. Provider resolution: explicit > catalog mock > empty mock.\n */\n/**\n * config.discounts are simple {code, percent} entries the UI validator trusts\n * (useDiscountValidator). They must ALSO be seeded into the provider, or\n * placeOrder won't find the code server-side and will charge full price — the\n * shopper sees a discounted total but is billed the undiscounted one.\n */\nfunction storefrontDiscountToSeed(discount: StorefrontDiscountConfig): Discount {\n const ts = new Date().toISOString()\n return {\n id: `cfg-discount-${discount.code.trim().toLowerCase()}`,\n tenantId: 'mock',\n title: discount.title ?? `${discount.percent}% off`,\n code: discount.code.trim().toUpperCase(),\n type: 'percentage',\n method: 'code',\n value: discount.percent,\n usageLimit: null,\n oncePerCustomer: false,\n minSubtotal: null,\n appliesTo: 'all',\n productIds: [],\n categoryIds: [],\n startsAt: ts,\n endsAt: null,\n status: 'active',\n timesUsed: 0,\n createdAt: ts,\n updatedAt: ts,\n }\n}\n\nfunction buildMockSeed(config: StorefrontConfig): MockShopSeed | undefined {\n const configDiscounts = (config.discounts ?? []).map(storefrontDiscountToSeed)\n const promotions = [...(config.catalog?.promotions ?? []), ...(config.promotions ?? [])]\n if (!config.catalog && configDiscounts.length === 0 && promotions.length === 0) return undefined\n // Config-level codes win over catalog seeds sharing the same code.\n const catalogDiscounts = (config.catalog?.discounts ?? []).filter(\n (cd) => !configDiscounts.some((cfg) => (cd.code ?? '').toUpperCase() === cfg.code),\n )\n return {\n ...config.catalog,\n discounts: [...catalogDiscounts, ...configDiscounts],\n // Document/config promotions reach the mock provider, so evaluatePromotions\n // answers from the same data the promotions section carries — no DB.\n promotions,\n }\n}\n\n/**\n * Register the config's declared entities.\n *\n * They register BEFORE the provider exists: the mock provider's entity stores\n * validate their seed against these declarations, and the `entity.*` loaders\n * resolve them at read time (I2 for unknown keys). Shared with the headless\n * renderer so a preview of an entity-backed page reads the same declarations\n * the live store does.\n */\nexport function registerStorefrontEntities(config: StorefrontConfig): void {\n for (const [key, declaration] of Object.entries(config.entities ?? {})) {\n defineEntity(key, declaration, { source: 'app' })\n }\n}\n\n/**\n * The shop provider a config implies: its explicit provider, or a mock seeded\n * from its catalog, discounts and declared promotions.\n *\n * Extracted so `renderStore` binds the SAME provider the browser runtime would\n * — a headless render that invented its own data source would preview a store\n * nobody ships.\n */\nexport function resolveStorefrontProvider(config: StorefrontConfig): ShopProvider {\n return config.provider ?? createMockShopProvider(buildMockSeed(config))\n}\n\nexport function initStorefrontRuntime(config: StorefrontConfig): void {\n registerStorefrontBlocks()\n registerStorefrontEntities(config)\n if (resolveConfig(config).features.accounts) {\n initCustomerAuth(resolveAuthAdapter(config.auth, {\n supabaseUrl: config.supabaseUrl,\n supabaseAnonKey: config.supabaseAnonKey,\n }))\n }\n\n setShopProvider(resolveStorefrontProvider(config))\n\n // The freight quote asks the cart what it is carrying. Registered here rather\n // than lazily at the first quote because the resolver has to be in place\n // before the product page's first postcode, which happens without a click.\n initShippingItems()\n\n // Drop any persisted cart line the active backend can't resolve (e.g. a cart\n // built in an earlier mock-mode session, whose ids don't exist live) so stale\n // ids never reach checkout and 400 the order. Keeps a line on any error so a\n // transient failure never discards a valid item. Runs AFTER the persisted cart\n // has hydrated — zustand/persist rehydrates asynchronously, so reconciling at\n // init would see an empty cart and no-op.\n const reconcileCart = () => {\n const provider = getShopProvider()\n void useCartStore.getState().reconcile(async (line) => {\n const product = await provider.getProduct(line.productId)\n return product != null\n })\n }\n // Browser-only, and guarded twice on purpose. A persisted cart is per-shopper\n // state that must never be established in a shared server process, and\n // zustand does not attach the `persist` API at all when no storage backend\n // exists — so on a server this line threw before it could do anything wrong.\n // That made `initStorefrontRuntime` uncallable from a universal entry, which\n // is exactly where an SSR host has to call it.\n if (typeof window !== 'undefined' && useCartStore.persist) {\n if (useCartStore.persist.hasHydrated()) reconcileCart()\n else useCartStore.persist.onFinishHydration(reconcileCart)\n }\n\n if (config.supabaseUrl || config.supabaseAnonKey) {\n console.warn(\n '@fayz-ai/shop: supabaseUrl/supabaseAnonKey are legacy fields. Pass an explicit provider/adapter or use the Fayz SDK broker path.',\n )\n }\n}\n\nexport interface StorefrontShellProps {\n /**\n * Addressing scheme and history owner. Omitted → hash addressing in a\n * browser, or a static adapter bound to `path` when one is given. Supply one\n * to serve the store at real URLs, or to hand history to a host router.\n */\n router?: RouterAdapter\n /**\n * Render this path instead of the live hash location.\n *\n * The headless seam (spine M8): `renderStore` and the preview server drive\n * the shell by path, so a static render never depends on a global\n * `window.location` and one process can render many paths — including\n * concurrently, which a location-mutating renderer could not.\n */\n path?: string\n}\n\n/** The inner storefront UI. Reads everything from the config context, so it is\n * shared by createStorefrontApp and the manifest-driven StorefrontScaffold. */\nexport function StorefrontShell({ path: pathOverride, router }: StorefrontShellProps = {}) {\n const live = useRouterAdapter()\n // `router` and `path` answer different questions and must both be honoured:\n // the adapter owns addressing and history (how a link is written, where a\n // click goes), while `path` owns WHICH page renders. Letting the adapter win\n // both made `path` dead whenever a host supplied a router — so a host that\n // asked for the not-found page got the page for the URL in the address bar\n // instead, rendered with no data, i.e. a skeleton that never resolves.\n const adapter = router ?? shellRouterAdapter(pathOverride, live)\n return (\n <StorefrontRouterProvider value={adapter}>\n <StorefrontShellBody pathOverride={pathOverride} />\n </StorefrontRouterProvider>\n )\n}\n\nfunction StorefrontShellBody({ pathOverride }: { pathOverride?: string }) {\n const config = useStorefrontConfig()\n const livePath = useRoutePath()\n const path = pathOverride ?? livePath\n useScrollToTopOnNavigate(path)\n const focused = isFocusedRoute(config, path)\n const components = getStorefrontComponents(config)\n const chromeProps = { config, commerceMode: config.commerceMode }\n const header = resolveOverride(components.Header, StorefrontHeader)\n const footer = resolveOverride(components.Footer, StorefrontFooter)\n // The Shell has no SDK default — the plain wrapper below is not a component —\n // so it is component-or-nothing rather than a resolveOverride fallback.\n const Shell = overrideComponent(components.Shell)\n const shellProps = overrideProps(components.Shell)\n\n const body = (\n <>\n {config.theme && <StorefrontThemeStyle theme={config.theme} />}\n {!focused && <header.Component {...chromeProps} {...header.props} />}\n <StorefrontErrorBoundary key={path}>\n <RouteSwitch path={path} />\n </StorefrontErrorBoundary>\n {!focused && config.features.cart && <CartDrawer />}\n {!focused && <footer.Component {...chromeProps} {...footer.props} />}\n <Toaster />\n </>\n )\n\n if (Shell) {\n return (\n <Shell {...chromeProps} {...shellProps}>\n {body}\n </Shell>\n )\n }\n\n return (\n <div className=\"min-h-screen bg-background text-foreground\">\n {body}\n </div>\n )\n}\n\n/**\n * Declarative storefront factory — the customer-facing counterpart of\n * createSaasApp. Sugar over the manifest path: it is equivalent to\n * renderApp(defineStorefront(config)), sharing initStorefrontRuntime +\n * StorefrontShell with the scaffold.\n *\n * const App = createStorefrontApp({ name: 'Aurora Goods', currency: 'BRL' })\n */\nexport function createStorefrontApp(config: StorefrontConfig): React.ComponentType {\n const resolved = resolveConfig(config)\n initStorefrontRuntime(config)\n\n // Built once, not per render: an adapter owns its subscriber list, so a fresh\n // instance each render would bind a new listener and orphan the old one.\n const router = defaultRouterAdapter(resolved.routing ?? 'hash')\n\n function StorefrontApp() {\n return (\n <StorefrontConfigHost config={resolved}>\n <StorefrontShell router={router} />\n </StorefrontConfigHost>\n )\n }\n StorefrontApp.displayName = 'StorefrontApp'\n return StorefrontApp\n}\n\nexport interface CreateStorefrontOptions {\n config: StorefrontConfig\n provider?: ShopProvider\n components?: StorefrontComponents\n routes?: StorefrontConfig['routes']\n pages?: StorefrontConfig['routes']\n sections?: readonly StorefrontSection[]\n}\n\nexport function createStorefront(options: CreateStorefrontOptions): React.ComponentType {\n const routes = [...(options.pages ?? []), ...(options.routes ?? [])]\n const config: StorefrontConfig = {\n ...options.config,\n provider: options.provider ?? options.config.provider,\n components: {\n ...options.config.components,\n ...options.components,\n },\n routes: routes.length > 0 ? routes : options.config.routes,\n home: options.sections\n ? { ...(options.config.home ?? { sections: [] }), sections: options.sections }\n : options.config.home,\n }\n\n return createStorefrontApp(config)\n}\n","import type { EntityDeclarationInput, JsonSchema } from '@fayz-ai/core'\nimport type { PaymentMethodKind } from '@fayz-ai/shop/types'\nimport type { MockShopSeed } from '@fayz-ai/shop/mock'\nimport type { Promotion } from '@fayz-ai/shop/rules'\nimport type {\n StorefrontCommerceMode,\n StorefrontConfig,\n StorefrontDiscountConfig,\n StorefrontEnquiryConfig,\n StorefrontImageLoadingConfig,\n StorefrontRouteChrome,\n StorefrontRouteKind,\n StorefrontSearchConfig,\n} from './config'\nimport type { StorefrontTheme } from '../lib/theme'\nimport type { HomeConfig, NavLink, FooterConfig } from '../blocks/sections'\nimport type { StorefrontPagesConfig } from '../blocks/page-blocks'\nimport type { StorefrontSlots } from '../extend/slots'\nimport type { StorefrontAuthConfig } from '../data/auth'\n\n// ---------------------------------------------------------------------------\n// Store Document v1 — the section vocabulary.\n//\n// `fayz.store.json` is the serializable form of a whole storefront: every\n// StorefrontConfig field either lives in a section here as data, or is\n// referenced from the `code` section by a registered handle name. The document\n// plus the handle registry reconstitutes the store; nothing is restored from\n// an in-memory side channel.\n//\n// Per-SECTION schema version, following WooCommerce Blueprint's\n// `get_schema(int $version)` (packages/php/blueprint/src/Steps/Step.php:24-36):\n// each top-level section carries its own `version`, so the commerce section\n// can evolve without invalidating a stored theme section and vice versa. A\n// version this module does not know is a hard error naming the supported set.\n//\n// This is a LEAF module: types, field specs and enum vocabularies only, so the\n// exporter, the validator and the describer can all import it without cycles.\n// ---------------------------------------------------------------------------\n\nexport const STORE_DOCUMENT_KIND = 'fayz.store'\n\n// --- Enum vocabularies, as runtime values -------------------------------------\n// Each mirrors a type union elsewhere; the `satisfies` + exhaustiveness pair\n// makes it a compile error for the two to drift.\n\nexport const STORE_COMMERCE_MODES = ['checkout', 'catalog', 'enquiry'] as const satisfies readonly StorefrontCommerceMode[]\ntype MissingCommerceMode = Exclude<StorefrontCommerceMode, (typeof STORE_COMMERCE_MODES)[number]>\nconst _commerceModesExhaustive: [MissingCommerceMode] extends [never] ? true : never = true\nvoid _commerceModesExhaustive\n\n// Same exhaustiveness guard as the commerce modes above: this list is what the\n// document validator accepts, and it had already drifted once — a mode the type\n// allows but this array omits is rejected at load with no useful message.\ntype StorePaymentMode = NonNullable<NonNullable<StorefrontConfig['payments']>['mode']>\nexport const STORE_PAYMENT_MODES = ['mock', 'pix-mercadopago', 'gateway'] as const satisfies readonly StorePaymentMode[]\ntype MissingPaymentMode = Exclude<StorePaymentMode, (typeof STORE_PAYMENT_MODES)[number]>\nconst _paymentModesExhaustive: [MissingPaymentMode] extends [never] ? true : never = true\nvoid _paymentModesExhaustive\nexport const STORE_PAYMENT_METHOD_KINDS = [\n 'pix',\n 'credit_card',\n 'debit_card',\n 'boleto',\n 'cash',\n 'other',\n] as const satisfies readonly PaymentMethodKind[]\ntype MissingPaymentKind = Exclude<PaymentMethodKind, (typeof STORE_PAYMENT_METHOD_KINDS)[number]>\nconst _paymentKindsExhaustive: [MissingPaymentKind] extends [never] ? true : never = true\nvoid _paymentKindsExhaustive\n\ntype ConfiguredBackendProvider = NonNullable<NonNullable<StorefrontConfig['backend']>['provider']>\nexport const STORE_BACKEND_PROVIDERS = ['mock', 'fayz-api', 'fayz-shop', 'custom'] as const satisfies readonly ConfiguredBackendProvider[]\ntype MissingBackendProvider = Exclude<ConfiguredBackendProvider, (typeof STORE_BACKEND_PROVIDERS)[number]>\nconst _backendProvidersExhaustive: [MissingBackendProvider] extends [never] ? true : never = true\nvoid _backendProvidersExhaustive\n\nexport const STORE_ROUTE_KINDS = [\n 'home',\n 'catalog',\n 'product',\n 'checkout',\n 'account',\n 'order',\n 'custom',\n] as const satisfies readonly StorefrontRouteKind[]\ntype MissingRouteKind = Exclude<StorefrontRouteKind, (typeof STORE_ROUTE_KINDS)[number]>\nconst _routeKindsExhaustive: [MissingRouteKind] extends [never] ? true : never = true\nvoid _routeKindsExhaustive\n\nexport const STORE_ROUTE_CHROMES = ['default', 'focused'] as const satisfies readonly StorefrontRouteChrome[]\ntype MissingRouteChrome = Exclude<StorefrontRouteChrome, (typeof STORE_ROUTE_CHROMES)[number]>\nconst _routeChromesExhaustive: [MissingRouteChrome] extends [never] ? true : never = true\nvoid _routeChromesExhaustive\n\nexport const STORE_THEME_RADII = ['none', 'soft', 'round', 'pill'] as const\n\n// --- Section shapes -----------------------------------------------------------\n\ninterface StoreSectionBase {\n /** This section's own schema version — sections evolve independently. */\n version: number\n}\n\n/** Identity: who the store is. The only mandatory section. */\nexport interface StoreIdentitySection extends StoreSectionBase {\n name: string\n /** ISO 4217 — default 'BRL'. */\n currency?: string\n /** Intl locale — default 'pt-BR'. */\n locale?: string\n}\n\n/** Visual identity — StorefrontTheme, spread into the section. */\nexport interface StoreThemeSection extends StoreSectionBase, StorefrontTheme {}\n\n/** Commercial behavior: mode, money, offers. */\nexport interface StoreCommerceSection extends StoreSectionBase {\n commerceMode?: StorefrontCommerceMode\n shipping?: StorefrontConfig['shipping']\n payments?: StorefrontConfig['payments']\n discounts?: StorefrontDiscountConfig[]\n enquiry?: StorefrontEnquiryConfig\n features?: StorefrontConfig['features']\n}\n\n/** What the shopper sees: composed pages, slots, chrome. `footer` here holds\n * only the serializable part — a non-string `credit` node moves to\n * `code.footerCredit`. */\nexport interface StorePresentationSection extends StoreSectionBase {\n announcement?: string\n /** Text logo. A JSX logo is code — it lives at `code.logo`. */\n logo?: string\n home?: HomeConfig\n pages?: StorefrontPagesConfig\n slots?: StorefrontSlots\n nav?: NavLink[]\n footer?: FooterConfig\n imageLoading?: StorefrontImageLoadingConfig\n catalogFacets?: StorefrontConfig['catalogFacets']\n productSpecs?: StorefrontConfig['productSpecs']\n /** Header search knobs. `renderSuggestion` is code — it lives at\n * `code.searchRenderSuggestion`. */\n search?: Omit<StorefrontSearchConfig, 'renderSuggestion'>\n}\n\n/** Long-form content: legal/institutional pages and store-supplied reviews. */\nexport interface StoreContentSection extends StoreSectionBase {\n legal?: StorefrontConfig['legal']\n reviews?: StorefrontConfig['reviews']\n}\n\n/** The mock catalog seed (products/categories/discounts). */\nexport interface StoreCatalogSection extends StoreSectionBase, MockShopSeed {}\n\n/** Rule-engine promotions (spine M6): serializable Promotion values —\n * eligibility rules + application method, attributes drawn from the\n * rule_attribute vocabulary. \"Buy 3 pay 2\" and \"REVENDA10 = 10% off\" are\n * both entries here, as pure data. */\nexport interface StorePromotionsSection extends StoreSectionBase {\n promotions?: Promotion[]\n}\n\n/** Custom entity declarations (spine M4): the defineEntity inputs, keyed by\n * entity key. Pure data — hydration re-declares them through defineEntity,\n * which re-derives the schema, storage, RLS and loaders from the same input. */\nexport interface StoreEntitiesSection extends StoreSectionBase {\n definitions?: Record<string, EntityDeclarationInput>\n}\n\n/** Backend descriptor. The deprecated supabase fields ride along so a legacy\n * config still round-trips losslessly; new stores use `auth.supabase`. */\nexport interface StoreBackendSection extends StoreSectionBase {\n provider?: ConfiguredBackendProvider\n url?: string\n /** @deprecated legacy StorefrontConfig field, kept for lossless round-trip. */\n supabaseUrl?: string\n /** @deprecated legacy StorefrontConfig field, kept for lossless round-trip. */\n supabaseAnonKey?: string\n}\n\n/** Customer auth, when it is expressible as data ('mock' / 'supabase' + urls).\n * An auth config carrying code (an AuthAdapter object, a supabase client)\n * moves whole to `code.auth`. */\nexport interface StoreAuthSection extends StoreSectionBase, StorefrontAuthConfig {}\n\n/** A custom route whose component is referenced by handle name. */\nexport interface StoreCodeRouteRef {\n id: string\n path: string\n kind?: StorefrontRouteKind\n chrome?: StorefrontRouteChrome\n /** Handle name of the route component. */\n component: string\n}\n\n/**\n * The code sidecar: every config field that holds code, referenced by the\n * handle NAME it was registered under. Hydration resolves these through the\n * handle registry — an unknown name is a hard error naming the valid set (I2),\n * never a silent drop.\n */\nexport interface StoreCodeSection extends StoreSectionBase {\n /** Handle → React.ReactNode (JSX logo). */\n logo?: string\n /** Handle → ShopProvider. */\n provider?: string\n /** Handle → StorefrontAuthConfig carrying code. */\n auth?: string\n /** Handle → React.ReactNode rendered as the footer credit line. */\n footerCredit?: string\n /** Handle → the `(product) => ReactNode` renderer for a search suggestion. */\n searchRenderSuggestion?: string\n /** Component-slot name → handle of its ComponentOverride. */\n components?: Record<string, string>\n routes?: StoreCodeRouteRef[]\n}\n\n/** Store Document v1 — the serializable form of a whole storefront. */\nexport interface StoreDocument {\n $kind: typeof STORE_DOCUMENT_KIND\n store: StoreIdentitySection\n theme?: StoreThemeSection\n commerce?: StoreCommerceSection\n presentation?: StorePresentationSection\n content?: StoreContentSection\n catalog?: StoreCatalogSection\n entities?: StoreEntitiesSection\n promotions?: StorePromotionsSection\n backend?: StoreBackendSection\n auth?: StoreAuthSection\n code?: StoreCodeSection\n}\n\nexport type StoreSectionName = Exclude<keyof StoreDocument, '$kind'>\n\n// --- Field specs: one declaration → validator + JSON Schema -------------------\n// Same pattern as block `settings` → `propsSchema` (block-schema.ts): the spec\n// is authored once and compiled, so the validator and the schema an agent reads\n// cannot drift apart. Coarse on purpose — deep shapes (theme colors, block\n// trees) are checked by the dedicated validators, not restated here.\n\n/**\n * A field that is on its way out (spine I10).\n *\n * The section VERSION is what makes this mechanical rather than advisory:\n * while the section is at a version below `removedAtVersion` the field is\n * accepted and the store keeps working; a document that has been through the\n * codemod carries the higher version, and at that version the field is a hard\n * validation error naming `replacement` (I2). That is what lets one SDK serve\n * both a migrated and an unmigrated fleet without a flag.\n */\nexport interface StoreFieldDeprecation {\n /** Row id in @fayz-ai/sdk's deprecation registry — the single source of the\n * version window, the shim prose and the codemod id. */\n id: string\n /** Section version at which this field stops being accepted. */\n removedAtVersion: number\n /** Document path to write instead. */\n replacement: string\n}\n\nexport interface StoreFieldSpec {\n type: 'string' | 'number' | 'boolean' | 'object' | 'array'\n description: string\n required?: boolean\n enum?: readonly string[]\n /** Present when the field is deprecated. See {@link StoreFieldDeprecation}. */\n deprecated?: StoreFieldDeprecation\n}\n\nexport interface StoreSectionSpec {\n description: string\n /** Versions of this section this SDK understands, ascending. */\n versions: readonly number[]\n fields: Record<string, StoreFieldSpec>\n}\n\nconst f = (\n type: StoreFieldSpec['type'],\n description: string,\n extra: Partial<StoreFieldSpec> = {},\n): StoreFieldSpec => ({ type, description, ...extra })\n\nexport const STORE_SECTIONS: Record<StoreSectionName, StoreSectionSpec> = {\n store: {\n description: 'Store identity: name, currency, locale.',\n versions: [1],\n fields: {\n name: f('string', 'Store display name (header, page title).', { required: true }),\n currency: f('string', \"ISO 4217 currency code — default 'BRL'.\"),\n locale: f('string', \"Intl locale for money/date formatting — default 'pt-BR'.\"),\n },\n },\n theme: {\n description: 'Visual identity: colors, fonts, radius, header/card personality.',\n versions: [1],\n fields: {\n name: f('string', 'Theme name.', { required: true }),\n colors: f('object', 'HSL token triplets (background, primary, …).'),\n font: f('object', 'Google Fonts pairing (heading, body, display, serif).'),\n radius: f('string', 'Corner radius scale.', { enum: STORE_THEME_RADII }),\n header: f('object', 'Header treatment (variant, uppercaseNav, search).'),\n productCard: f('object', 'Card style and image aspect.'),\n uppercaseButtons: f('boolean', 'Uppercase CTA buttons with letter-spacing.'),\n spacing: f('object', \"Spacing scale (key → CSS length), emitted as --sf-space-<key>. e.g. {sm:'8px', md:'16px'}.\"),\n typeScale: f('object', \"Type scale (key → CSS font-size), emitted as --sf-text-<key>. e.g. {body:'1rem', h1:'clamp(40px,6vw,66px)'}.\"),\n breakpoints: f('object', \"Layout breakpoints (key → CSS length), emitted as --sf-breakpoint-<key> for JS/generated-style consumers.\"),\n motion: f('object', \"Motion tokens (key → duration or easing), emitted as --sf-motion-<key>. e.g. {fast:'150ms', reveal:'cubic-bezier(0.22,1,0.36,1)'}.\"),\n tokens: f('object', 'Free-form brand-token passthrough, emitted verbatim as CSS custom properties.'),\n },\n },\n commerce: {\n description: 'Commercial behavior: mode, shipping, payments, discounts, enquiry, feature toggles.',\n // v2 = the legacy `discounts` coupon list has been migrated onto the rule\n // engine (codemod commerce.discounts-to-promotions). Both versions are\n // understood, which is the whole point: the fleet migrates store by store.\n versions: [1, 2],\n fields: {\n commerceMode: f('string', 'Checkout-first, catalog-only browsing, or product enquiry.', {\n enum: STORE_COMMERCE_MODES,\n }),\n shipping: f('object', 'Flat rate and free-above threshold.'),\n payments: f('object', 'Payment mode and offered methods.'),\n discounts: f('array', 'DEPRECATED — store-level discount codes ({code, percent, title?}). Use promotions.promotions.', {\n deprecated: {\n id: 'storefront.commerce.discounts',\n removedAtVersion: 2,\n replacement: 'promotions.promotions',\n },\n }),\n enquiry: f('object', 'Product enquiry behavior for catalog/enquiry stores.'),\n features: f('object', 'Feature toggles (discounts, accounts, cart, checkout).'),\n },\n },\n presentation: {\n description: 'What the shopper sees: composed pages, slots, nav, footer, chrome.',\n versions: [1],\n fields: {\n announcement: f('string', 'Promo message above the header.'),\n logo: f('string', 'Text logo. A JSX logo is code and lives at code.logo.'),\n home: f('object', 'Home page blueprint (legacy short form of pages.home).'),\n pages: f('object', 'Pages composed from blocks, keyed by page kind.'),\n slots: f('object', 'Blocks grafted into named positions inside SDK pages.'),\n nav: f('array', 'Header nav links ({label, to}).'),\n footer: f('object', 'Footer content (about, contact, social, labels).'),\n imageLoading: f('object', 'Global image reveal behavior.'),\n catalogFacets: f(\n 'array',\n 'Catalog refinements over product.metadata ({key, label, values[]}), rendered in the filters panel and mirrored into ?<key>=<value>.',\n ),\n productSpecs: f(\n 'object',\n 'PDP specification table rules: `exclude` hides metadata keys, `labels` renames the rest.',\n ),\n search: f(\n 'object',\n \"Header search: mode ('inline' live filter, the default, or 'overlay'), plus placeholder, resultsPath, suggestionsLimit, minChars and labels. A custom suggestion renderer is code and lives at code.searchRenderSuggestion.\",\n ),\n },\n },\n content: {\n description: 'Long-form content: legal/institutional pages, product reviews.',\n versions: [1],\n fields: {\n legal: f('object', 'Privacy / terms / returns page text.'),\n reviews: f(\n 'object',\n 'Store-supplied product reviews ({items, enabled, emptyText}). Nothing is invented — with no items the PDP renders an honest empty state.',\n ),\n },\n },\n catalog: {\n description: 'Mock catalog seed for stores without a live backend.',\n versions: [1],\n fields: {\n products: f('array', 'Seed products.'),\n categories: f('array', 'Seed categories.'),\n discounts: f('array', 'Seed discounts.'),\n promotions: f('array', 'Seed rule-engine promotions for the mock provider. Prefer the top-level promotions section.'),\n },\n },\n entities: {\n description: 'Custom entity declarations (defineEntity inputs), keyed by entity key.',\n versions: [1],\n fields: {\n definitions: f('object', 'Entity key → declaration ({fields, scope, access, indexes, …}).'),\n },\n },\n promotions: {\n description: 'Rule-engine promotions: eligibility rules + application method, as pure data (spine M6).',\n versions: [1],\n fields: {\n promotions: f('array', 'Promotions ({id, code?, isAutomatic?, rules?, applicationMethod}). Rule attributes come from the rule_attribute vocabulary.'),\n },\n },\n backend: {\n description: 'Backend descriptor: which provider serves the store.',\n // v2 = the legacy supabaseUrl/supabaseAnonKey pair has moved to\n // auth.supabase (codemod backend.supabase-to-auth).\n versions: [1, 2],\n fields: {\n provider: f('string', 'Backend provider family.', { enum: STORE_BACKEND_PROVIDERS }),\n url: f('string', 'Backend URL, when the provider needs one.'),\n supabaseUrl: f('string', 'DEPRECATED legacy field, kept for lossless round-trip. Use auth.supabase.url.', {\n deprecated: {\n id: 'storefront.backend.supabaseUrl',\n removedAtVersion: 2,\n replacement: 'auth.supabase.url',\n },\n }),\n supabaseAnonKey: f('string', 'DEPRECATED legacy field, kept for lossless round-trip. Use auth.supabase.anonKey.', {\n deprecated: {\n id: 'storefront.backend.supabaseAnonKey',\n removedAtVersion: 2,\n replacement: 'auth.supabase.anonKey',\n },\n }),\n },\n },\n auth: {\n description: 'Customer auth, when expressible as data. Code-bearing auth lives at code.auth.',\n versions: [1],\n fields: {\n adapter: f('string', \"Adapter id ('mock' | 'supabase').\"),\n provider: f('string', \"Provider id ('mock' | 'supabase').\"),\n routes: f('object', 'Auth route overrides.'),\n supabase: f('object', 'Supabase connection (url, anonKey, callback urls).'),\n },\n },\n code: {\n description: 'The code sidecar: config fields that hold code, referenced by registered handle name.',\n versions: [1],\n fields: {\n logo: f('string', 'Handle of the JSX logo node.'),\n provider: f('string', 'Handle of the explicit ShopProvider.'),\n auth: f('string', 'Handle of a code-bearing auth config.'),\n footerCredit: f('string', 'Handle of the footer credit node.'),\n searchRenderSuggestion: f('string', 'Handle of the custom search-suggestion renderer.'),\n components: f('object', 'Component-slot name → handle of its override.'),\n routes: f('array', 'Custom routes; each component is a handle name.'),\n },\n },\n}\n\nexport const STORE_SECTION_NAMES = Object.keys(STORE_SECTIONS) as StoreSectionName[]\n\n/** Compile a section's field spec to JSON Schema — the same one-declaration\n * principle as `settingsToJsonSchema` (I1). */\nexport function sectionToJsonSchema(name: StoreSectionName): JsonSchema {\n const spec = STORE_SECTIONS[name]\n const properties: Record<string, JsonSchema> = {\n version: {\n type: 'integer',\n description: `Schema version of the ${name} section. Supported: ${spec.versions.join(', ')}.`,\n enum: [...spec.versions],\n },\n }\n const required: string[] = ['version']\n for (const [field, fieldSpec] of Object.entries(spec.fields)) {\n const node: JsonSchema = { type: fieldSpec.type, description: fieldSpec.description }\n if (fieldSpec.enum) node.enum = [...fieldSpec.enum]\n if (fieldSpec.deprecated) {\n // `deprecated` is the JSON Schema 2019-09 keyword, so generic tooling\n // understands it; the x- pair carries the registry id and the exact\n // replacement path, which is what an agent needs to fix it (I2).\n node.deprecated = true\n node['x-fayz-deprecation'] = fieldSpec.deprecated.id\n node['x-fayz-replacement'] = fieldSpec.deprecated.replacement\n node['x-fayz-removed-at-section-version'] = fieldSpec.deprecated.removedAtVersion\n }\n properties[field] = node\n if (fieldSpec.required) required.push(field)\n }\n return {\n type: 'object',\n description: spec.description,\n properties,\n required,\n }\n}\n\n// --- Shared helpers -----------------------------------------------------------\n\n/**\n * True when a value survives JSON serialization unchanged: the test that\n * routes a config field into a data section versus the code sidecar. React\n * elements (`$$typeof`), functions, class instances (providers, adapters,\n * supabase clients) all fail it.\n */\nexport function isJsonValue(value: unknown): boolean {\n if (value === null) return true\n const t = typeof value\n if (t === 'string' || t === 'number' || t === 'boolean') return true\n if (Array.isArray(value)) return value.every(isJsonValue)\n if (t === 'object') {\n const record = value as Record<string, unknown>\n if ('$$typeof' in record) return false // React element\n const proto = Object.getPrototypeOf(record)\n if (proto !== Object.prototype && proto !== null) return false // class instance\n // `undefined` property values are allowed: JSON drops the key, which is\n // semantically the same config.\n return Object.values(record).every((v) => v === undefined || isJsonValue(v))\n }\n return false\n}\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\n/** Copy of `obj` without `undefined`-valued keys, so a document holds exactly\n * what JSON can carry and object equality means what it looks like. */\nexport function compact<T extends Record<string, unknown>>(obj: T): T {\n const out: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(obj)) {\n if (value !== undefined) out[key] = value\n }\n return out as T\n}\n","import type React from 'react'\nimport type { Category, CreateProductEnquiryInput, Product, ProductEnquiry, ProductImage } from '@fayz-ai/shop/types'\nimport type { ProductOptionGroup, ProductOptionSelection } from '../data/product-options'\nimport type { ResolvedStorefrontConfig, StorefrontCommerceMode } from '../document/config'\nimport type { MediaCarouselItem } from '../blocks/sections'\nimport type { CartState } from '../stores/cart.store'\nimport type { ComponentOverride } from './component-override'\n\nexport interface StorefrontComponentBaseProps {\n config: ResolvedStorefrontConfig\n commerceMode: StorefrontCommerceMode\n className?: string\n testId?: string\n}\n\nexport interface StorefrontActions {\n navigateTo: (to: string) => void\n addToCart: (product: Product, quantity?: number, options?: ProductOptionSelection) => void\n openCart: () => void\n closeCart: () => void\n createProductEnquiry: (input: CreateProductEnquiryInput) => Promise<ProductEnquiry>\n}\n\n/**\n * Which photo the CARD shows — the grid-side counterpart of\n * {@link ProductGalleryOrder}.\n *\n * primary the first `is_primary` row, else the first row (the default;\n * byte-identical to what the card has always done)\n * position the lowest `sortOrder`, ties broken by image id\n *\n * `position` exists because `is_primary` is not a unique constraint: artorious\n * carries products with TWO primary rows, which made the card's pick depend on\n * PostgREST's tie order — the same card could show a different photo between\n * two loads. The gallery got `order` in M2; the card had no equivalent and a\n * store fork was the only way to sort by position.\n */\nexport type ProductCardImageOrder = 'primary' | 'position'\n\nexport interface ProductCardProps extends StorefrontComponentBaseProps {\n product: Product\n actions: Pick<StorefrontActions, 'navigateTo' | 'addToCart' | 'openCart'>\n /** Defaults to 'primary' — see {@link ProductCardImageOrder}. */\n imageOrder?: ProductCardImageOrder\n}\n\nexport interface ProductDetailProps extends StorefrontComponentBaseProps {\n product: Product\n primaryImage?: ProductImage\n optionGroups: ProductOptionGroup[]\n selectedOptions: ProductOptionSelection\n setSelectedOptions: React.Dispatch<React.SetStateAction<ProductOptionSelection>>\n quantity: number\n setQuantity: React.Dispatch<React.SetStateAction<number>>\n soldOut: boolean\n lowStock: boolean\n actions: Pick<StorefrontActions, 'addToCart' | 'createProductEnquiry' | 'navigateTo'>\n addToCart: () => void\n openEnquiry: () => void\n}\n\n/**\n * Which photo leads the gallery.\n *\n * primary the merchant's pick: isPrimary first, then sortOrder ascending (default)\n * position sortOrder ascending, ignoring the primary flag\n * newest sortOrder descending — the most recently added photo leads\n *\n * `newest` exists because of a real fork: artorious reimplemented the entire\n * 158-line gallery to change ONLY this rule (its Supabase rows carried two\n * conflicting is_primary flags, so sort_order was the only trustworthy signal).\n * A props-only override (`components.ProductGallery.props.order`) now does it.\n */\nexport type ProductGalleryOrder = 'primary' | 'position' | 'newest'\n\nexport interface ProductGalleryProps extends StorefrontComponentBaseProps {\n product: Product\n images: ProductImage[]\n primaryImage?: ProductImage\n order?: ProductGalleryOrder\n}\n\nexport interface ProductPriceProps extends StorefrontComponentBaseProps {\n product: Product\n value: number\n compareAt?: number | null\n}\n\nexport interface ProductActionsProps extends StorefrontComponentBaseProps {\n product: Product\n quantity: number\n setQuantity: React.Dispatch<React.SetStateAction<number>>\n soldOut: boolean\n actions: Pick<StorefrontActions, 'addToCart' | 'createProductEnquiry' | 'navigateTo'>\n addToCart: () => void\n openEnquiry: () => void\n}\n\nexport interface ProductEnquiryFormContractProps extends StorefrontComponentBaseProps {\n product: Product\n onSuccess?: () => void\n}\n\nexport interface CategoryCardProps extends StorefrontComponentBaseProps {\n category: Category\n actions: Pick<StorefrontActions, 'navigateTo'>\n}\n\nexport interface CollectionSectionProps extends StorefrontComponentBaseProps {\n title: string\n subtitle?: string\n products: Product[]\n category?: Category\n children?: React.ReactNode\n}\n\nexport interface HeroSectionContractProps extends StorefrontComponentBaseProps {\n title: string\n subtitle?: string\n eyebrow?: string\n image?: string\n cta?: string\n href?: string\n children?: React.ReactNode\n}\n\nexport interface MediaCarouselProps extends StorefrontComponentBaseProps {\n items: MediaCarouselItem[]\n height?: 'medium' | 'tall' | 'screen'\n autoplayMs?: number\n overlay?: 'dark' | 'soft' | 'none'\n}\n\nexport interface ProductSliderProps extends StorefrontComponentBaseProps {\n title: string\n subtitle?: string\n eyebrow?: string\n filter?: 'sale' | 'new' | 'all'\n categoryName?: string\n collection?: string\n limit?: number\n cta?: string\n href?: string\n}\n\nexport interface StorefrontChromeProps extends StorefrontComponentBaseProps {\n children?: React.ReactNode\n}\n\nexport interface StorefrontStateProps extends StorefrontComponentBaseProps {\n title?: string\n message?: string\n children?: React.ReactNode\n}\n\n/**\n * Extra content rendered inside CartDrawer's footer, right after the\n * \"Finalizar compra\" button — e.g. an alternative checkout path like\n * \"Finalizar via WhatsApp\". Unlike every other entry in\n * StorefrontComponents, this isn't a whole-component replacement:\n * CartDrawer is always the SDK's own, this only adds optional content\n * inside it. Only rendered when the cart has lines (same condition as the\n * checkout button itself).\n */\nexport interface CartDrawerFooterExtraProps extends StorefrontComponentBaseProps {\n cart: CartState\n}\n\n/**\n * Code-level component replacements.\n *\n * Each entry accepts either the component (what stores write today) or\n * `{ component?, props? }`. Passing only `props` keeps the SDK component and\n * forces some of its props — which is what four of five customizing stores\n * actually wanted when they replaced a whole card instead.\n *\n * Every field takes the union rather than only the two surfaces stores have\n * overridden so far: \"why can I pass props to ProductCard but not CategoryCard\"\n * is a worse surface than one extra type.\n */\nexport interface StorefrontComponents {\n ProductCard?: ComponentOverride<ProductCardProps>\n ProductDetail?: ComponentOverride<ProductDetailProps>\n ProductGallery?: ComponentOverride<ProductGalleryProps>\n ProductPrice?: ComponentOverride<ProductPriceProps>\n ProductActions?: ComponentOverride<ProductActionsProps>\n ProductEnquiryForm?: ComponentOverride<ProductEnquiryFormContractProps>\n CategoryCard?: ComponentOverride<CategoryCardProps>\n CollectionSection?: ComponentOverride<CollectionSectionProps>\n HeroSection?: ComponentOverride<HeroSectionContractProps>\n MediaCarousel?: ComponentOverride<MediaCarouselProps>\n ProductSlider?: ComponentOverride<ProductSliderProps>\n Header?: ComponentOverride<StorefrontChromeProps>\n Footer?: ComponentOverride<StorefrontChromeProps>\n Shell?: ComponentOverride<StorefrontChromeProps>\n EmptyState?: ComponentOverride<StorefrontStateProps>\n LoadingState?: ComponentOverride<StorefrontStateProps>\n ErrorState?: ComponentOverride<StorefrontStateProps>\n CartDrawerFooterExtra?: ComponentOverride<CartDrawerFooterExtraProps>\n}\n\n/**\n * The override surface as a runtime value, for validators and catalogs: a\n * store document referencing an unknown component slot must be told the valid\n * set (I2), and a type alone cannot say it at runtime. The `satisfies` +\n * exhaustiveness pair keeps this list impossible to leave stale when a key is\n * added to {@link StorefrontComponents}.\n */\nexport const STOREFRONT_COMPONENT_KEYS = [\n 'ProductCard',\n 'ProductDetail',\n 'ProductGallery',\n 'ProductPrice',\n 'ProductActions',\n 'ProductEnquiryForm',\n 'CategoryCard',\n 'CollectionSection',\n 'HeroSection',\n 'MediaCarousel',\n 'ProductSlider',\n 'Header',\n 'Footer',\n 'Shell',\n 'EmptyState',\n 'LoadingState',\n 'ErrorState',\n 'CartDrawerFooterExtra',\n] as const satisfies readonly (keyof StorefrontComponents)[]\ntype MissingComponentKey = Exclude<keyof StorefrontComponents, (typeof STOREFRONT_COMPONENT_KEYS)[number]>\nconst _componentKeysExhaustive: [MissingComponentKey] extends [never] ? true : never = true\nvoid _componentKeysExhaustive\n","import {\n blockRegistry,\n checkBlockConstraints,\n getBlockMeta,\n listHandles,\n hasHandle,\n loaderRegistry,\n listLoaders,\n isLoaderParamRef,\n isLoaderPropRef,\n ENTITY_FIELD_TYPES,\n RESERVED_ENTITY_FIELDS,\n listEntityDeclarations,\n} from '@fayz-ai/core'\nimport type { BlockSetting } from '@fayz-ai/core'\nimport {\n APPLICATION_METHOD_ALLOCATIONS,\n APPLICATION_METHOD_TARGET_TYPES,\n APPLICATION_METHOD_TYPES,\n PROMOTION_STATUSES,\n PROMOTION_TYPES,\n RULE_OPERATORS,\n hasRuleAttribute,\n listRuleAttributeKeys,\n resolveRuleAttribute,\n} from '@fayz-ai/shop/rules'\nimport { registerStorefrontBlocks } from '../blocks/registry'\nimport { routePathParams, toBlockNodes } from '../blocks/page-blocks'\nimport type { StorefrontBlockLike } from '../blocks/page-blocks'\nimport { THEME_SCALE_FIELDS, THEME_SCALE_VAR_PREFIX } from '../lib/theme'\nimport { STOREFRONT_COMPONENT_KEYS } from '../extend/component-contracts'\nimport { STOREFRONT_SLOTS } from '../extend/slots'\nimport type { StorefrontSlotArea } from '../extend/slots'\nimport {\n STORE_DOCUMENT_KIND,\n STORE_SECTIONS,\n STORE_SECTION_NAMES,\n STORE_PAYMENT_MODES,\n STORE_PAYMENT_METHOD_KINDS,\n STORE_ROUTE_KINDS,\n STORE_ROUTE_CHROMES,\n isRecord,\n} from './sections'\nimport type { StoreSectionName } from './sections'\n\n// ---------------------------------------------------------------------------\n// validateStore — the gate between an authored document and a rendered store.\n//\n// I2 everywhere: an unknown id — section, field, page kind, block type, block\n// setting, slot, handle, component slot — is a hard error that NAMES the valid\n// set. The report is machine-readable on purpose: the AI corrects on `valid`,\n// not on prose. Silent failure is the single most expensive property for\n// AI-generated configuration, because the agent gets no signal to correct on\n// (spine doc §2, the Medusa widget-drop evidence).\n//\n// Errors only, no warnings channel: everything reported here misdescribes the\n// store. Advisory findings (a block placed off its declared surface, a missing\n// page body) stay with `checkPageBlocks`/`auditBlocks`, which already own the\n// warning vocabulary.\n// ---------------------------------------------------------------------------\n\nexport interface StoreValidationError {\n /** Dotted path into the document ('presentation.pages.home.blocks[2].type'). */\n path: string\n /** Stable machine-readable code ('unknown-block', 'unsupported-section-version', …). */\n code: string\n message: string\n /** The valid set, present on every unknown-id error — what the AI corrects on. */\n valid?: string[]\n}\n\nexport interface StoreValidationReport {\n ok: boolean\n errors: StoreValidationError[]\n}\n\nexport const STOREFRONT_PAGE_KINDS = ['home', 'catalog', 'product', 'collection', 'content'] as const\n\nconst STRUCTURAL_BLOCK_KEYS = new Set(['type', 'id', 'props', 'children', 'data'])\n\n/** The whole of a `data` need — what page-data reads, and therefore the whole\n * of what an author may write there. */\nconst DATA_NEED_KEYS = ['loader', 'params']\n\n/** The whole of a `code.routes[]` entry — what hydrateStore reads back. */\nconst CODE_ROUTE_KEYS = ['id', 'path', 'kind', 'chrome', 'component']\n\nconst SLOT_AREAS = [...new Set(STOREFRONT_SLOTS.map((slot) => slot.area))]\n\nfunction slotNamesFor(area: string): string[] {\n return STOREFRONT_SLOTS.filter((slot) => slot.area === area).map((slot) => slot.name)\n}\n\n/** Route params available to each singular page kind's `$param` bindings.\n * Content pages declare their own through their path pattern. */\nconst PAGE_KIND_PARAMS: Record<string, readonly string[]> = {\n home: [],\n catalog: [],\n product: ['slug'],\n collection: ['slug'],\n}\n\n/** Route params a slot AREA's trees may bind: slots render inside a page, so\n * only areas pinned to a param-carrying page see its params. */\nconst SLOT_AREA_PARAMS: Record<string, readonly string[]> = {\n productDetail: ['slug'],\n}\n\ntype Errors = StoreValidationError[]\n\n// The entity vocabulary the CURRENT validateStore call checks `entity`-typed\n// values against: everything registered (the app's defineEntity calls) plus\n// everything the document itself declares — a document is allowed to declare\n// an entity and place a block over it in the same file. Module state is safe\n// because validation is synchronous and reset on entry.\nlet knownEntities: Set<string> = new Set()\n\nfunction checkEntityRef(errors: Errors, path: string, value: unknown): void {\n if (typeof value !== 'string' || !value) return // type errors are reported by the generic leg\n if (!knownEntities.has(value)) {\n push(\n errors,\n path,\n 'unknown-entity',\n `entity \"${value}\" is not declared (defineEntity or the entities section)`,\n [...knownEntities].sort(),\n )\n }\n}\n\nfunction push(errors: Errors, path: string, code: string, message: string, valid?: readonly string[]): void {\n errors.push(valid ? { path, code, message, valid: [...valid] } : { path, code, message })\n}\n\n/** Prop keys of one authored block entry, honouring both authoring forms\n * (nested `{type, props}` and the flat StorefrontSection shape). */\nfunction blockPropKeys(entry: Record<string, unknown>): string[] {\n if ('props' in entry) {\n const props = entry.props\n return isRecord(props) ? Object.keys(props) : []\n }\n return Object.keys(entry).filter((key) => !STRUCTURAL_BLOCK_KEYS.has(key))\n}\n\n/** Who declares the settings a value is being judged against — so one walk can\n * speak the block vocabulary ('block \"seals\" declares no setting …') and the\n * loader vocabulary ('loader \"products.list\" declares no param …') without\n * either growing a second error style. */\ninterface SettingOwner {\n /** Message subject, already quoted: `block \"seals\"`, `loader \"products.list\"`. */\n subject: string\n /** What the owner declares: `setting` / `param`. */\n noun: string\n /** The unknown-key code this owner's top-level check already uses. */\n code: string\n}\n\n/**\n * Prop values against their declared settings, at EVERY depth.\n *\n * A `list` setting declares its item shape in `of`, and an item is just another\n * settings level: an unknown key inside one drops exactly like an unknown key\n * at the top — the block renders without it and nothing tells the author why.\n * That is the silent-drop failure the validator exists to end (I2), so the same\n * error is reported there, naming the valid set of THAT position, all the way\n * down through lists of lists.\n *\n * `labelPrefix` builds the dotted setting position the message names\n * (`items[].tone`), matching how `auditBlocks` already talks about `of:` items.\n * `valuesPath` stays the document path, so the report points at the offending\n * key and not at the declaration.\n */\nfunction validateSettingValues(\n errors: Errors,\n valuesPath: string,\n settings: readonly BlockSetting[],\n values: Record<string, unknown>,\n owner: SettingOwner,\n labelPrefix = '',\n): void {\n for (const setting of settings) {\n const value = values[setting.id]\n if (value === undefined) continue\n const valuePath = `${valuesPath}.${setting.id}`\n const label = `${labelPrefix}${setting.id}`\n if (setting.type === 'entity') {\n checkEntityRef(errors, valuePath, value)\n continue\n }\n // A list with no declared item shape accepts anything — the same rule\n // `settingsToJsonSchema` compiles. Nothing to name, so nothing to reject.\n if (setting.type !== 'list' || !setting.of?.length || !Array.isArray(value)) continue\n const of = setting.of\n const declared = collectSettingIds(of)\n value.forEach((item, index) => {\n // A non-object item is a type error, not an unknown key: prop TYPES are\n // not this validator's leg at any depth, so it stays out of the report.\n if (!isRecord(item)) return\n const itemPath = `${valuePath}[${index}]`\n for (const key of Object.keys(item)) {\n if (!declared.has(key)) {\n push(\n errors,\n `${itemPath}.${key}`,\n owner.code,\n `${owner.subject} declares no ${owner.noun} \"${label}[].${key}\"`,\n [...declared].sort(),\n )\n }\n }\n validateSettingValues(errors, itemPath, of, item, owner, `${label}[].`)\n })\n }\n}\n\n/**\n * A literal loader-param value against its declared setting. Bindings are\n * checked by the caller; this is the \"document-level constant\" leg.\n */\nfunction checkLiteralParam(\n errors: Errors,\n path: string,\n containerPath: string,\n loaderId: string,\n setting: BlockSetting,\n value: unknown,\n): void {\n const expected =\n setting.type === 'number' ? 'number' : setting.type === 'boolean' ? 'boolean' : setting.type === 'list' ? 'array' : 'string'\n const actual = Array.isArray(value) ? 'array' : typeof value\n if (actual !== expected) {\n push(\n errors,\n path,\n 'invalid-value',\n `loader \"${loaderId}\" param \"${setting.id}\" expects ${expected}, got ${actual}`,\n )\n return\n }\n if (setting.type === 'select' && setting.options?.length && typeof value === 'string') {\n const allowed = setting.options.map((option) => option.value)\n if (!allowed.includes(value)) {\n push(errors, path, 'invalid-value', `\"${value}\" is not a valid ${setting.id}`, allowed)\n }\n }\n if (setting.type === 'entity') checkEntityRef(errors, path, value)\n // A list-shaped param has the same nested position a block's list prop does,\n // so it gets the same walk — an unknown key inside a param's items is named\n // rather than dropped.\n if (setting.type === 'list') {\n validateSettingValues(\n errors,\n containerPath,\n [setting],\n { [setting.id]: value },\n { subject: `loader \"${loaderId}\"`, noun: 'param', code: 'unknown-loader-param' },\n )\n }\n}\n\n/**\n * One block entry's `data` declaration (I2 everywhere): the loader must exist,\n * every param must be declared by the loader's schema, every `$param` binding\n * must name a route param the page declares, every `$prop` binding a setting\n * the block declares, and every literal must fit the param's type.\n */\nfunction validateDataNeeds(\n errors: Errors,\n entryPath: string,\n blockType: string,\n value: unknown,\n declaredParams: readonly string[],\n): void {\n if (!isRecord(value)) {\n push(errors, `${entryPath}.data`, 'invalid-value', '`data` maps need names to {loader, params?}')\n return\n }\n const blockSettings = getBlockMeta(blockType)?.settings\n for (const [name, need] of Object.entries(value)) {\n const needPath = `${entryPath}.data.${name}`\n if (!isRecord(need) || typeof need.loader !== 'string' || !need.loader) {\n push(errors, needPath, 'invalid-value', 'a data need is {loader: string, params?: object}')\n continue\n }\n if (!loaderRegistry.has(need.loader)) {\n push(errors, `${needPath}.loader`, 'unknown-loader', `loader \"${need.loader}\" is not registered`, listLoaders())\n continue\n }\n // The need object itself is a CLOSED shape — page-data reads `loader` and\n // `params` and nothing else. A misspelt `parms` therefore drops the whole\n // param set and the block loads everything, which is the same silent drop\n // an unknown key anywhere else in the document is.\n for (const key of Object.keys(need)) {\n if (!DATA_NEED_KEYS.includes(key)) {\n push(errors, `${needPath}.${key}`, 'unknown-field', `a data need has no field \"${key}\"`, DATA_NEED_KEYS)\n }\n }\n if (need.params === undefined) continue\n if (!isRecord(need.params)) {\n push(errors, `${needPath}.params`, 'invalid-value', 'loader params are an object')\n continue\n }\n const loaderSettings = loaderRegistry.getEntry(need.loader)?.meta.settings\n const declaredLoaderParams = loaderSettings ? collectSettingIds(loaderSettings) : null\n for (const [param, paramValue] of Object.entries(need.params)) {\n const paramPath = `${needPath}.params.${param}`\n const setting = loaderSettings?.find((s) => s.id === param)\n if (declaredLoaderParams && !declaredLoaderParams.has(param)) {\n push(\n errors,\n paramPath,\n 'unknown-loader-param',\n `loader \"${need.loader}\" declares no param \"${param}\"`,\n [...declaredLoaderParams].sort(),\n )\n continue\n }\n if (isLoaderParamRef(paramValue)) {\n if (!declaredParams.includes(paramValue.$param)) {\n push(\n errors,\n paramPath,\n 'unbound-route-param',\n declaredParams.length\n ? `$param \"${paramValue.$param}\" is not a route param of this page`\n : `$param \"${paramValue.$param}\" cannot bind — this page declares no route params`,\n declaredParams,\n )\n }\n continue\n }\n if (isLoaderPropRef(paramValue)) {\n const settingIds = blockSettings ? collectSettingIds(blockSettings) : null\n if (settingIds && !settingIds.has(paramValue.$prop)) {\n push(\n errors,\n paramPath,\n 'unknown-prop-binding',\n `$prop \"${paramValue.$prop}\" is not a setting of block \"${blockType}\"`,\n [...settingIds].sort(),\n )\n }\n continue\n }\n if (setting) {\n checkLiteralParam(errors, paramPath, `${needPath}.params`, need.loader, setting, paramValue)\n }\n }\n }\n}\n\nfunction validateBlockList(\n errors: Errors,\n path: string,\n value: unknown,\n declaredParams: readonly string[],\n): void {\n if (!Array.isArray(value)) {\n push(errors, path, 'invalid-value', `expected an array of blocks, got ${typeof value}`)\n return\n }\n value.forEach((entry, index) => {\n const entryPath = `${path}[${index}]`\n if (!isRecord(entry)) {\n push(errors, entryPath, 'invalid-value', 'a block entry must be an object with a `type`')\n return\n }\n const type = entry.type\n if (typeof type !== 'string' || !type) {\n push(errors, `${entryPath}.type`, 'invalid-value', 'a block entry must declare a string `type`')\n return\n }\n if (!blockRegistry.has(type)) {\n push(\n errors,\n `${entryPath}.type`,\n 'unknown-block',\n `block \"${type}\" is not registered`,\n blockRegistry.ids().sort(),\n )\n return\n }\n const settings = getBlockMeta(type)?.settings\n if (settings) {\n const declared = collectSettingIds(settings)\n for (const key of blockPropKeys(entry)) {\n if (!declared.has(key)) {\n push(\n errors,\n `${entryPath}.props.${key}`,\n 'unknown-setting',\n `block \"${type}\" declares no setting \"${key}\"`,\n [...declared].sort(),\n )\n }\n }\n // Below the top level: `entity`-typed settings are semantic ids (I2) — a\n // block naming an undeclared entity WILL fail at render — and every\n // `list` item is judged against its declared `of` shape, so an unknown\n // key inside an item is named instead of silently dropped.\n const props = isRecord(entry.props) ? entry.props : entry\n validateSettingValues(errors, `${entryPath}.props`, settings, props, {\n subject: `block \"${type}\"`,\n noun: 'setting',\n code: 'unknown-setting',\n })\n }\n if ('data' in entry && entry.data !== undefined) {\n validateDataNeeds(errors, entryPath, type, entry.data, declaredParams)\n }\n if ('children' in entry && entry.children !== undefined) {\n validateBlockList(errors, `${entryPath}.children`, entry.children, declaredParams)\n }\n })\n}\n\n/**\n * One authored block tree: per-entry checks plus composition constraints.\n *\n * Constraints (parent, ancestor, allowMultiple) are a property of the WHOLE\n * tree, so they run once here — over the same normalized nodes the renderer\n * sees — and never inside the per-entry recursion, which would judge a child\n * list without its ancestry. Structural violations are errors: the renderer\n * will keep the block off the shopper's page, which means the document\n * misdescribes the store. Advisory findings (context) stay with\n * checkPageBlocks, which owns the warning vocabulary.\n */\nfunction validateBlockTree(\n errors: Errors,\n path: string,\n value: unknown,\n declaredParams: readonly string[] = [],\n): void {\n validateBlockList(errors, path, value, declaredParams)\n if (!Array.isArray(value)) return\n const nodes = toBlockNodes(value as StorefrontBlockLike[])\n for (const violation of checkBlockConstraints(nodes)) {\n push(errors, `${path}${violation.path}`, violation.rule, violation.detail, violation.valid)\n }\n}\n\nfunction collectSettingIds(settings: readonly BlockSetting[]): Set<string> {\n return new Set(settings.map((setting) => setting.id))\n}\n\n// --- Section validators -------------------------------------------------------\n\n// A token key must survive as a CSS custom-property suffix (`--sf-space-<key>`),\n// so it is slug-shaped. The value side stays a free string: CSS is the schema\n// there, and restating it would be a worse validator than the browser's.\nconst TOKEN_KEY = /^[a-zA-Z][a-zA-Z0-9-]*$/\n\nfunction validateTheme(errors: Errors, section: Record<string, unknown>): void {\n for (const field of THEME_SCALE_FIELDS) {\n const scale = section[field]\n if (scale === undefined) continue\n if (!isRecord(scale)) continue // wrong type already reported by the envelope\n for (const [key, value] of Object.entries(scale)) {\n const path = `theme.${field}.${key}`\n if (!TOKEN_KEY.test(key)) {\n push(\n errors,\n path,\n 'invalid-token-key',\n `\"${key}\" cannot become the CSS custom property ${THEME_SCALE_VAR_PREFIX[field]}-${key} — token keys match ${TOKEN_KEY}`,\n )\n }\n if (typeof value !== 'string') {\n push(errors, path, 'invalid-value', `a ${field} token is a CSS value string, got ${typeof value}`)\n }\n }\n }\n}\n\nfunction validateSectionEnvelope(\n errors: Errors,\n name: StoreSectionName,\n section: Record<string, unknown>,\n): boolean {\n const spec = STORE_SECTIONS[name]\n const version = section.version\n if (typeof version !== 'number' || !spec.versions.includes(version)) {\n push(\n errors,\n `${name}.version`,\n 'unsupported-section-version',\n `section \"${name}\" declares version ${JSON.stringify(version)}, which this SDK does not understand`,\n spec.versions.map(String),\n )\n return false\n }\n const fieldNames = Object.keys(spec.fields)\n for (const key of Object.keys(section)) {\n if (key === 'version') continue\n const fieldSpec = spec.fields[key]\n if (!fieldSpec) {\n push(errors, `${name}.${key}`, 'unknown-field', `section \"${name}\" has no field \"${key}\"`, fieldNames)\n continue\n }\n // A deprecated field is ACCEPTED while the section is below the version\n // that retires it — that is the shim (I10). At or past that version the\n // document has been through the codemod, so the field being back is a\n // hard error that names where it moved to (I2). One SDK therefore serves a\n // migrated and an unmigrated store without a flag.\n const deprecated = fieldSpec.deprecated\n if (deprecated && version >= deprecated.removedAtVersion) {\n push(\n errors,\n `${name}.${key}`,\n 'removed-field',\n `field \"${name}.${key}\" was removed at ${name} version ${deprecated.removedAtVersion} ` +\n `(deprecation ${deprecated.id}); this section declares version ${version}`,\n [deprecated.replacement],\n )\n continue\n }\n const value = section[key]\n const actual = Array.isArray(value) ? 'array' : typeof value\n if (actual !== fieldSpec.type) {\n push(\n errors,\n `${name}.${key}`,\n 'invalid-value',\n `field \"${name}.${key}\" expects ${fieldSpec.type}, got ${actual}`,\n )\n continue\n }\n if (fieldSpec.enum && typeof value === 'string' && !fieldSpec.enum.includes(value)) {\n push(\n errors,\n `${name}.${key}`,\n 'invalid-value',\n `\"${value}\" is not a valid ${name}.${key}`,\n fieldSpec.enum,\n )\n }\n }\n for (const [field, fieldSpec] of Object.entries(spec.fields)) {\n if (fieldSpec.required && section[field] === undefined) {\n push(errors, `${name}.${field}`, 'missing-field', `section \"${name}\" requires \"${field}\"`)\n }\n }\n return true\n}\n\nfunction validateCommerce(errors: Errors, section: Record<string, unknown>): void {\n const payments = section.payments\n if (isRecord(payments)) {\n if (payments.mode !== undefined) {\n if (typeof payments.mode !== 'string' || !(STORE_PAYMENT_MODES as readonly string[]).includes(payments.mode)) {\n push(\n errors,\n 'commerce.payments.mode',\n 'invalid-value',\n `\"${String(payments.mode)}\" is not a payment mode`,\n STORE_PAYMENT_MODES,\n )\n }\n }\n if (payments.methods !== undefined) {\n if (!Array.isArray(payments.methods)) {\n push(errors, 'commerce.payments.methods', 'invalid-value', 'payments.methods must be an array')\n } else {\n payments.methods.forEach((method, index) => {\n if (typeof method !== 'string' || !(STORE_PAYMENT_METHOD_KINDS as readonly string[]).includes(method)) {\n push(\n errors,\n `commerce.payments.methods[${index}]`,\n 'invalid-value',\n `\"${String(method)}\" is not a payment method`,\n STORE_PAYMENT_METHOD_KINDS,\n )\n }\n })\n }\n }\n }\n const discounts = section.discounts\n if (Array.isArray(discounts)) {\n discounts.forEach((discount, index) => {\n if (!isRecord(discount) || typeof discount.code !== 'string' || typeof discount.percent !== 'number') {\n push(\n errors,\n `commerce.discounts[${index}]`,\n 'invalid-value',\n 'a discount is {code: string, percent: number, title?: string}',\n )\n }\n })\n }\n}\n\n// A content-page slug becomes its default route (`/<slug>`), so it is url-shaped.\nconst CONTENT_SLUG = /^[a-z0-9][a-z0-9-]*$/\n\nfunction validateContentPages(errors: Errors, basePath: string, value: unknown): void {\n if (!isRecord(value)) {\n push(errors, basePath, 'invalid-value', 'pages.content maps slugs to {title?, path?, blocks: [...]}')\n return\n }\n const pathOwners = new Map<string, string>()\n for (const [slug, page] of Object.entries(value)) {\n const pagePath = `${basePath}.${slug}`\n if (!CONTENT_SLUG.test(slug)) {\n push(\n errors,\n pagePath,\n 'invalid-value',\n `\"${slug}\" cannot become the route \"/${slug}\" — content slugs match ${CONTENT_SLUG}`,\n )\n }\n if (!isRecord(page) || page.blocks === undefined) {\n push(errors, pagePath, 'invalid-value', 'a content page is {title?, path?, blocks: [...]}')\n continue\n }\n if (page.title !== undefined && typeof page.title !== 'string') {\n push(errors, `${pagePath}.title`, 'invalid-value', `title expects string, got ${typeof page.title}`)\n }\n let routePath = `/${slug}`\n if (page.path !== undefined) {\n if (typeof page.path !== 'string' || !page.path.startsWith('/')) {\n push(errors, `${pagePath}.path`, 'invalid-value', `path is an absolute route ('/${slug}'), got ${JSON.stringify(page.path)}`)\n } else {\n routePath = page.path\n }\n }\n // Two pages resolving to one route means one of them silently never\n // renders — exactly the class of failure this validator exists to end.\n const owner = pathOwners.get(routePath)\n if (owner) {\n push(\n errors,\n `${pagePath}.path`,\n 'duplicate-content-path',\n `content pages \"${owner}\" and \"${slug}\" both resolve to \"${routePath}\" — one of them can never render`,\n )\n } else {\n pathOwners.set(routePath, slug)\n }\n // A content page's path pattern is its param declaration (M3): blocks on\n // '/categoria/:slug' may bind { $param: 'slug' }; a param-less page's\n // blocks may bind nothing.\n validateBlockTree(errors, `${pagePath}.blocks`, page.blocks, routePathParams(routePath))\n }\n}\n\nfunction validatePresentation(errors: Errors, section: Record<string, unknown>): void {\n const home = section.home\n if (isRecord(home) && home.sections !== undefined) {\n validateBlockTree(errors, 'presentation.home.sections', home.sections)\n }\n\n const pages = section.pages\n if (isRecord(pages)) {\n const validKinds = [...STOREFRONT_PAGE_KINDS]\n for (const [kind, page] of Object.entries(pages)) {\n const pagePath = `presentation.pages.${kind}`\n if (!(validKinds as string[]).includes(kind)) {\n push(errors, pagePath, 'unknown-page-kind', `\"${kind}\" is not a composable page kind`, validKinds)\n continue\n }\n // `content` holds a MAP of editorial pages, not one page.\n if (kind === 'content') {\n validateContentPages(errors, pagePath, page)\n continue\n }\n if (!isRecord(page) || page.blocks === undefined) {\n push(errors, pagePath, 'invalid-value', 'a composed page is {blocks: [...]}')\n continue\n }\n validateBlockTree(errors, `${pagePath}.blocks`, page.blocks, PAGE_KIND_PARAMS[kind] ?? [])\n }\n }\n\n const slots = section.slots\n if (isRecord(slots)) {\n for (const [area, areaSlots] of Object.entries(slots)) {\n const areaPath = `presentation.slots.${area}`\n if (!(SLOT_AREAS as string[]).includes(area)) {\n push(errors, areaPath, 'unknown-slot-area', `\"${area}\" is not a slot area`, SLOT_AREAS)\n continue\n }\n if (!isRecord(areaSlots)) {\n push(errors, areaPath, 'invalid-value', 'a slot area maps slot names to block lists')\n continue\n }\n const validNames = slotNamesFor(area as StorefrontSlotArea)\n for (const [slotName, blocks] of Object.entries(areaSlots)) {\n const slotPath = `${areaPath}.${slotName}`\n if (!validNames.includes(slotName)) {\n push(errors, slotPath, 'unknown-slot', `\"${area}.${slotName}\" is not a slot`, validNames)\n continue\n }\n validateBlockTree(errors, slotPath, blocks, SLOT_AREA_PARAMS[area] ?? [])\n }\n }\n }\n}\n\nconst ENTITY_KEY_RE = /^[a-z][a-z0-9_]*$/\nconst ENTITY_FIELD_RE = /^[a-z][a-z0-9_]*$/\n\n/**\n * The entities section holds defineEntity INPUTS as data. Validation mirrors\n * what defineEntity enforces at registration — same rules, same valid sets —\n * so a document that validates clean is a document whose hydration cannot\n * throw. I2 on every id: field types, access levels, field references.\n */\nfunction validateEntitiesSection(errors: Errors, section: Record<string, unknown>): void {\n const definitions = section.definitions\n if (definitions === undefined || !isRecord(definitions)) return // envelope reported the type\n for (const [key, declaration] of Object.entries(definitions)) {\n const path = `entities.definitions.${key}`\n if (!ENTITY_KEY_RE.test(key)) {\n push(errors, path, 'invalid-value', `\"${key}\" is not a valid entity key — keys are snake_case`)\n }\n if (!isRecord(declaration) || !isRecord(declaration.fields) || Object.keys(declaration.fields).length === 0) {\n push(errors, path, 'invalid-value', 'an entity declaration is {fields: {<name>: {type, …}}, scope?, access?, indexes?}')\n continue\n }\n const fields = declaration.fields\n const fieldNames = Object.keys(fields)\n for (const [name, field] of Object.entries(fields)) {\n const fieldPath = `${path}.fields.${name}`\n if (!ENTITY_FIELD_RE.test(name)) {\n push(errors, fieldPath, 'invalid-value', `\"${name}\" is not a valid field name — fields are snake_case`)\n }\n if ((RESERVED_ENTITY_FIELDS as readonly string[]).includes(name)) {\n push(errors, fieldPath, 'invalid-value', `\"${name}\" is a structural record column`, RESERVED_ENTITY_FIELDS)\n continue\n }\n if (!isRecord(field) || typeof field.type !== 'string') {\n push(errors, fieldPath, 'invalid-value', 'a field is {type: <entity field type>, label?, required?, …}')\n continue\n }\n if (!(ENTITY_FIELD_TYPES as readonly string[]).includes(field.type)) {\n push(errors, `${fieldPath}.type`, 'unknown-entity-field-type', `\"${field.type}\" is not an entity field type`, ENTITY_FIELD_TYPES)\n continue\n }\n if (field.type === 'ref') {\n if (typeof field.entity !== 'string' || !field.entity) {\n push(errors, fieldPath, 'invalid-value', `a ref field names its target: {type: 'ref', entity: '<key>'}`)\n } else {\n checkEntityRef(errors, `${fieldPath}.entity`, field.entity)\n }\n }\n }\n const scope = declaration.scope\n if (scope !== undefined && scope !== 'tenant') {\n push(errors, `${path}.scope`, 'invalid-value', `\"${String(scope)}\" is not an entity scope`, ['tenant'])\n }\n const access = declaration.access\n if (access !== undefined) {\n if (!isRecord(access)) {\n push(errors, `${path}.access`, 'invalid-value', \"access is {read: 'public'|'staff', write: 'staff'}\")\n } else {\n if (access.read !== undefined && access.read !== 'public' && access.read !== 'staff') {\n push(errors, `${path}.access.read`, 'invalid-value', `\"${String(access.read)}\" is not a read access level`, ['public', 'staff'])\n }\n if (access.write !== undefined && access.write !== 'staff') {\n push(errors, `${path}.access.write`, 'invalid-value', `\"${String(access.write)}\" is not a write access level — shopper writes go through actions (M7), not RLS`, ['staff'])\n }\n }\n }\n const references = (where: string, name: unknown): void => {\n if (typeof name !== 'string' || !fieldNames.includes(name)) {\n push(errors, `${path}.${where}`, 'invalid-value', `${where} references undeclared field \"${String(name)}\"`, fieldNames)\n }\n }\n if (Array.isArray(declaration.indexes)) {\n declaration.indexes.forEach((tuple, i) => {\n if (!Array.isArray(tuple)) {\n push(errors, `${path}.indexes[${i}]`, 'invalid-value', 'an index is an array of declared field names')\n return\n }\n for (const name of tuple) references(`indexes[${i}]`, name)\n })\n }\n if (declaration.titleField !== undefined) references('titleField', declaration.titleField)\n if (Array.isArray(declaration.displayFields)) {\n for (const name of declaration.displayFields) references('displayFields', name)\n }\n }\n}\n\n/**\n * One rule (`{attribute, operator, values}`) against the rule_attribute\n * vocabulary (I9/I2): an unknown attribute names the registered keys, an\n * operator the attribute does not support names the supported subset. The\n * vocabulary is read at validation time, so attributes widened by context\n * providers (defineRuleContextProvider) validate exactly like core ones.\n */\nfunction validatePromotionRule(errors: Errors, path: string, rule: unknown): void {\n if (!isRecord(rule) || typeof rule.attribute !== 'string' || typeof rule.operator !== 'string') {\n push(errors, path, 'invalid-value', 'a rule is {attribute, operator, values: [...]}')\n return\n }\n if (!hasRuleAttribute(rule.attribute)) {\n push(\n errors,\n `${path}.attribute`,\n 'unknown-rule-attribute',\n `\"${rule.attribute}\" is not in the rule attribute vocabulary`,\n listRuleAttributeKeys(),\n )\n return\n }\n if (!(RULE_OPERATORS as readonly string[]).includes(rule.operator)) {\n push(errors, `${path}.operator`, 'unknown-rule-operator', `\"${rule.operator}\" is not a rule operator`, RULE_OPERATORS)\n return\n }\n const attribute = resolveRuleAttribute(rule.attribute)\n if (!(attribute.operators as readonly string[]).includes(rule.operator)) {\n push(\n errors,\n `${path}.operator`,\n 'unsupported-rule-operator',\n `attribute \"${rule.attribute}\" does not support operator \"${rule.operator}\"`,\n attribute.operators,\n )\n }\n if (!Array.isArray(rule.values) || rule.values.length === 0) {\n push(errors, `${path}.values`, 'invalid-value', 'rule values are a non-empty array of scalars')\n return\n }\n rule.values.forEach((value, index) => {\n const t = typeof value\n if (t !== 'string' && t !== 'number' && t !== 'boolean') {\n push(errors, `${path}.values[${index}]`, 'invalid-value', `a rule value is a JSON scalar, got ${t}`)\n }\n })\n}\n\nfunction validateRuleList(errors: Errors, path: string, value: unknown): void {\n if (value === undefined) return\n if (!Array.isArray(value)) {\n push(errors, path, 'invalid-value', `expected an array of rules, got ${typeof value}`)\n return\n }\n value.forEach((rule, index) => validatePromotionRule(errors, `${path}[${index}]`, rule))\n}\n\nfunction validatePromotionsSection(errors: Errors, section: Record<string, unknown>): void {\n const promotions = section.promotions\n if (promotions === undefined || !Array.isArray(promotions)) return // envelope reported the type\n promotions.forEach((promotion, index) => {\n const path = `promotions.promotions[${index}]`\n if (!isRecord(promotion) || typeof promotion.id !== 'string' || !promotion.id) {\n push(errors, path, 'invalid-value', 'a promotion is {id, code?, isAutomatic?, rules?, applicationMethod}')\n return\n }\n if (promotion.type !== undefined && !(PROMOTION_TYPES as readonly string[]).includes(promotion.type as string)) {\n push(errors, `${path}.type`, 'invalid-value', `\"${String(promotion.type)}\" is not a promotion type`, PROMOTION_TYPES)\n }\n if (promotion.status !== undefined && !(PROMOTION_STATUSES as readonly string[]).includes(promotion.status as string)) {\n push(errors, `${path}.status`, 'invalid-value', `\"${String(promotion.status)}\" is not a promotion status`, PROMOTION_STATUSES)\n }\n if (promotion.code === undefined && promotion.isAutomatic !== true) {\n push(\n errors,\n `${path}.code`,\n 'invalid-value',\n 'a promotion needs a code or isAutomatic: true — otherwise nothing can ever trigger it',\n )\n }\n validateRuleList(errors, `${path}.rules`, promotion.rules)\n const method = promotion.applicationMethod\n if (!isRecord(method)) {\n push(errors, `${path}.applicationMethod`, 'invalid-value', 'a promotion carries an applicationMethod ({type, value, targetType, …})')\n return\n }\n const methodPath = `${path}.applicationMethod`\n if (typeof method.type !== 'string' || !(APPLICATION_METHOD_TYPES as readonly string[]).includes(method.type)) {\n push(errors, `${methodPath}.type`, 'invalid-value', `\"${String(method.type)}\" is not an application method type`, APPLICATION_METHOD_TYPES)\n }\n if (typeof method.value !== 'number' || method.value < 0) {\n push(errors, `${methodPath}.value`, 'invalid-value', 'applicationMethod.value is a non-negative number')\n }\n if (typeof method.targetType !== 'string' || !(APPLICATION_METHOD_TARGET_TYPES as readonly string[]).includes(method.targetType)) {\n push(errors, `${methodPath}.targetType`, 'invalid-value', `\"${String(method.targetType)}\" is not a target type`, APPLICATION_METHOD_TARGET_TYPES)\n }\n if (method.allocation !== undefined && !(APPLICATION_METHOD_ALLOCATIONS as readonly string[]).includes(method.allocation as string)) {\n push(errors, `${methodPath}.allocation`, 'invalid-value', `\"${String(method.allocation)}\" is not an allocation`, APPLICATION_METHOD_ALLOCATIONS)\n }\n for (const field of ['maxQuantity', 'applyToQuantity', 'buyRulesMinQuantity'] as const) {\n const value = method[field]\n if (value !== undefined && value !== null && (typeof value !== 'number' || value < 1)) {\n push(errors, `${methodPath}.${field}`, 'invalid-value', `${field} is a positive integer when set`)\n }\n }\n validateRuleList(errors, `${methodPath}.targetRules`, method.targetRules)\n validateRuleList(errors, `${methodPath}.buyRules`, method.buyRules)\n })\n}\n\nfunction validateHandleRef(errors: Errors, path: string, name: unknown): void {\n if (typeof name !== 'string' || !name) {\n push(errors, path, 'invalid-value', 'a code reference is a registered handle name (string)')\n return\n }\n if (!hasHandle(name)) {\n push(errors, path, 'unknown-handle', `handle \"${name}\" is not registered`, listHandles())\n }\n}\n\nfunction validateCode(errors: Errors, section: Record<string, unknown>): void {\n for (const field of ['logo', 'provider', 'auth', 'footerCredit'] as const) {\n if (section[field] !== undefined) validateHandleRef(errors, `code.${field}`, section[field])\n }\n\n const components = section.components\n if (isRecord(components)) {\n for (const [slot, handle] of Object.entries(components)) {\n const slotPath = `code.components.${slot}`\n if (!(STOREFRONT_COMPONENT_KEYS as readonly string[]).includes(slot)) {\n push(\n errors,\n slotPath,\n 'unknown-component-slot',\n `\"${slot}\" is not an overridable storefront component`,\n STOREFRONT_COMPONENT_KEYS,\n )\n continue\n }\n validateHandleRef(errors, slotPath, handle)\n }\n }\n\n const routes = section.routes\n if (Array.isArray(routes)) {\n routes.forEach((route, index) => {\n const routePath = `code.routes[${index}]`\n if (!isRecord(route)) {\n push(errors, routePath, 'invalid-value', 'a route is {id, path, kind?, chrome?, component}')\n return\n }\n for (const required of ['id', 'path'] as const) {\n if (typeof route[required] !== 'string' || !route[required]) {\n push(errors, `${routePath}.${required}`, 'missing-field', `route requires a string \"${required}\"`)\n }\n }\n // Closed shape, same reasoning as a data need: hydrateStore rebuilds a\n // route from exactly these five keys, so anything else the author wrote\n // is discarded without a word.\n for (const key of Object.keys(route)) {\n if (!CODE_ROUTE_KEYS.includes(key)) {\n push(errors, `${routePath}.${key}`, 'unknown-field', `a route has no field \"${key}\"`, CODE_ROUTE_KEYS)\n }\n }\n if (route.kind !== undefined && !(STORE_ROUTE_KINDS as readonly string[]).includes(route.kind as string)) {\n push(\n errors,\n `${routePath}.kind`,\n 'invalid-value',\n `\"${String(route.kind)}\" is not a route kind`,\n STORE_ROUTE_KINDS,\n )\n }\n if (\n route.chrome !== undefined &&\n !(STORE_ROUTE_CHROMES as readonly string[]).includes(route.chrome as string)\n ) {\n push(\n errors,\n `${routePath}.chrome`,\n 'invalid-value',\n `\"${String(route.chrome)}\" is not a route chrome`,\n STORE_ROUTE_CHROMES,\n )\n }\n validateHandleRef(errors, `${routePath}.component`, route.component)\n })\n }\n}\n\n// --- The gate -----------------------------------------------------------------\n\n/**\n * Validate a Store Document against the registries and section schemas.\n *\n * Self-sufficient: registers the SDK blocks before checking, so \"unknown\n * block\" always names the true valid set. App-local blocks and handles must be\n * registered by the app's own modules before this runs — which is the same\n * precondition rendering has.\n */\nexport function validateStore(doc: unknown): StoreValidationReport {\n registerStorefrontBlocks()\n const errors: Errors = []\n\n // The entity vocabulary for THIS document: registered declarations plus the\n // document's own entities section, collected before any block is judged so\n // an entityList above the section in file order still validates.\n knownEntities = new Set(listEntityDeclarations())\n if (isRecord(doc)) {\n const entitiesSection = (doc as Record<string, unknown>).entities\n if (isRecord(entitiesSection) && isRecord(entitiesSection.definitions)) {\n for (const key of Object.keys(entitiesSection.definitions)) knownEntities.add(key)\n }\n }\n\n if (!isRecord(doc)) {\n push(errors, '', 'invalid-document', `a store document is an object, got ${doc === null ? 'null' : typeof doc}`)\n return { ok: false, errors }\n }\n\n if (doc.$kind !== STORE_DOCUMENT_KIND) {\n push(\n errors,\n '$kind',\n 'invalid-document',\n `expected $kind \"${STORE_DOCUMENT_KIND}\", got ${JSON.stringify(doc.$kind)}`,\n [STORE_DOCUMENT_KIND],\n )\n }\n\n if (doc.store === undefined) {\n push(errors, 'store', 'missing-section', 'the \"store\" section (name/currency/locale) is required', [\n ...STORE_SECTION_NAMES,\n ])\n }\n\n for (const [name, section] of Object.entries(doc)) {\n if (name === '$kind') continue\n if (!(STORE_SECTION_NAMES as string[]).includes(name)) {\n push(errors, name, 'unknown-section', `\"${name}\" is not a document section`, STORE_SECTION_NAMES)\n continue\n }\n if (!isRecord(section)) {\n push(errors, name, 'invalid-value', `section \"${name}\" must be an object with a version`)\n continue\n }\n const sectionName = name as StoreSectionName\n // A version this SDK does not understand makes the section's contents\n // unjudgeable — skip the deep checks rather than reporting noise against\n // the wrong schema.\n if (!validateSectionEnvelope(errors, sectionName, section)) continue\n if (sectionName === 'theme') validateTheme(errors, section)\n if (sectionName === 'entities') validateEntitiesSection(errors, section)\n if (sectionName === 'promotions') validatePromotionsSection(errors, section)\n if (sectionName === 'commerce') validateCommerce(errors, section)\n if (sectionName === 'presentation') validatePresentation(errors, section)\n if (sectionName === 'code') validateCode(errors, section)\n }\n\n return { ok: errors.length === 0, errors }\n}\n","import type { ComponentType } from 'react'\nimport { handleNameFor, registerHandle, resolveHandle } from '@fayz-ai/core'\nimport type { ShopProvider } from '@fayz-ai/shop/provider'\nimport type {\n StorefrontConfig,\n StorefrontRouteDefinition,\n StorefrontRouteComponentProps,\n StorefrontSearchConfig,\n} from './config'\nimport type { StorefrontComponents } from '../extend/component-contracts'\nimport type { StorefrontAuthConfig } from '../data/auth'\nimport type { StorefrontTheme } from '../lib/theme'\nimport type { FooterConfig } from '../blocks/sections'\nimport { STORE_DOCUMENT_KIND, compact, isJsonValue } from './sections'\nimport type { StoreCodeRouteRef, StoreCodeSection, StoreDocument } from './sections'\nimport { validateStore } from './validate'\n\n// ---------------------------------------------------------------------------\n// exportStore / hydrateStoreDocument — the round-trip.\n//\n// Export is a first-class operation (spine §3 L0): if a live store cannot be\n// serialized, the agent cannot read one before changing it. The acceptance\n// test for this module is exact: defineStorefront(config) → exportStore() →\n// hydrate → resolveConfig deep-equals the original resolved config, with code\n// fields compared by handle name.\n//\n// Code never enters the document. A code-valued field is serialized as the\n// handle NAME it is registered under (reverse lookup), and hydration resolves\n// the name through the handle registry — where an unknown name is a hard\n// error naming the valid set (I2). This replaces the in-memory config Map the\n// scaffold used to keep, which could only reconstitute a store inside the\n// session that authored it.\n// ---------------------------------------------------------------------------\n\nexport function slugifyStoreName(name: string): string {\n return name.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '') || 'app'\n}\n\nexport interface ExportStoreOptions {\n /** Namespace for auto-registered handles. Default: slug of the store name. */\n appId?: string\n /**\n * Register a deterministic handle (`<appId>.<config-path>`) for any code\n * value that has none, instead of failing. `defineStorefront` turns this on\n * so a store written today keeps working; a store that names its own handles\n * (registerHandle) keeps its names — explicit registration always wins the\n * reverse lookup.\n */\n registerMissingHandles?: boolean\n}\n\ninterface CodeRefContext {\n appId: string\n autoRegister: boolean\n}\n\n/** The handle name for a code value, auto-registering when allowed. */\nfunction codeRef(value: unknown, configPath: string, handleSuffix: string, ctx: CodeRefContext): string {\n const existing = handleNameFor(value)\n if (existing) return existing\n const name = `${ctx.appId}.${handleSuffix}`\n if (!ctx.autoRegister) {\n throw new Error(\n `exportStore: config.${configPath} holds code that is not a registered handle. ` +\n `Call registerHandle('${name}', value) before exporting, or export with ` +\n `{ registerMissingHandles: true } (defineStorefront does).`,\n )\n }\n registerHandle(\n name,\n value,\n { description: `Auto-registered from config.${configPath}`, source: 'app' },\n // The app re-declaring its config (module re-evaluation, HMR) re-derives\n // the same name for a fresh value; replacing is the correct semantics.\n { replace: true },\n )\n return name\n}\n\n/** First path inside `value` that is not JSON-representable, or null. */\nfunction findNonJsonPath(value: unknown, path: string): string | null {\n if (value === null || value === undefined) return null\n const t = typeof value\n if (t === 'string' || t === 'number' || t === 'boolean') return null\n if (Array.isArray(value)) {\n for (let i = 0; i < value.length; i++) {\n const found = findNonJsonPath(value[i], `${path}[${i}]`)\n if (found) return found\n }\n return null\n }\n if (t === 'object') {\n const record = value as Record<string, unknown>\n if ('$$typeof' in record) return path\n const proto = Object.getPrototypeOf(record)\n if (proto !== Object.prototype && proto !== null) return path\n for (const [key, child] of Object.entries(record)) {\n const found = findNonJsonPath(child, `${path}.${key}`)\n if (found) return found\n }\n return null\n }\n return path\n}\n\nfunction hasContent(section: Record<string, unknown>): boolean {\n return Object.keys(section).some((key) => key !== 'version')\n}\n\n/**\n * Serialize a defined/live store to Store Document v1.\n *\n * Data fields map to sections verbatim (the authored block form is preserved,\n * flat or nested — both are data). Code fields become handle names in the\n * `code` section. A data field smuggling code (JSX inside a page tree) is a\n * hard error naming the offending path rather than a document that lies.\n */\nexport function exportStore(config: StorefrontConfig, options: ExportStoreOptions = {}): StoreDocument {\n const ctx: CodeRefContext = {\n appId: options.appId ?? slugifyStoreName(config.name),\n autoRegister: options.registerMissingHandles ?? false,\n }\n\n const code: StoreCodeSection = { version: 1 }\n\n // --- logo: string stays data; anything else is code ------------------------\n let presentationLogo: string | undefined\n if (config.logo !== undefined) {\n if (typeof config.logo === 'string') presentationLogo = config.logo\n else code.logo = codeRef(config.logo, 'logo', 'logo', ctx)\n }\n\n // --- footer: the credit node may be code; the rest is data -----------------\n let footerData: FooterConfig | undefined\n if (config.footer !== undefined) {\n const { credit, ...rest } = config.footer\n if (credit === undefined || typeof credit === 'string') {\n footerData = config.footer\n } else {\n footerData = rest\n code.footerCredit = codeRef(credit, 'footer.credit', 'footer-credit', ctx)\n }\n }\n\n // --- search: the knobs are data, a custom suggestion renderer is code ------\n let searchData: Omit<StorefrontSearchConfig, 'renderSuggestion'> | undefined\n if (config.search !== undefined) {\n const { renderSuggestion, ...rest } = config.search\n searchData = rest\n if (renderSuggestion !== undefined) {\n code.searchRenderSuggestion = codeRef(\n renderSuggestion,\n 'search.renderSuggestion',\n 'search-render-suggestion',\n ctx,\n )\n }\n }\n\n // --- auth: whole value is data or whole value is code ----------------------\n // Split across two sections it would stop being one config object; an auth\n // config carrying ANY code (adapter object, supabase client) moves whole.\n let authData: StorefrontAuthConfig | undefined\n if (config.auth !== undefined) {\n if (isJsonValue(config.auth)) authData = config.auth\n else code.auth = codeRef(config.auth, 'auth', 'auth', ctx)\n }\n\n if (config.provider !== undefined) {\n code.provider = codeRef(config.provider, 'provider', 'provider', ctx)\n }\n\n if (config.components !== undefined) {\n const componentRefs: Record<string, string> = {}\n for (const [key, override] of Object.entries(config.components)) {\n if (override === undefined) continue\n componentRefs[key] = codeRef(override, `components.${key}`, `components.${key}`, ctx)\n }\n if (Object.keys(componentRefs).length > 0) code.components = componentRefs\n }\n\n if (config.routes !== undefined && config.routes.length > 0) {\n code.routes = config.routes.map(\n (route): StoreCodeRouteRef =>\n compact({\n id: route.id,\n path: route.path,\n kind: route.kind,\n chrome: route.chrome,\n component: codeRef(route.component, `routes[${route.id}].component`, `routes.${route.id}`, ctx),\n }),\n )\n }\n\n const sections = {\n store: compact({\n version: 1,\n name: config.name,\n currency: config.currency,\n locale: config.locale,\n }),\n theme: config.theme\n ? { version: 1, ...compact(config.theme as unknown as Record<string, unknown>) }\n : { version: 1 },\n commerce: compact({\n version: 1,\n commerceMode: config.commerceMode,\n shipping: config.shipping,\n payments: config.payments,\n discounts: config.discounts,\n enquiry: config.enquiry,\n features: config.features,\n }),\n presentation: compact({\n version: 1,\n announcement: config.announcement,\n logo: presentationLogo,\n home: config.home,\n pages: config.pages,\n slots: config.slots,\n nav: config.nav,\n footer: footerData,\n imageLoading: config.imageLoading,\n catalogFacets: config.catalogFacets,\n productSpecs: config.productSpecs,\n search: searchData,\n }),\n content: compact({ version: 1, legal: config.legal, reviews: config.reviews }),\n catalog: config.catalog ? { version: 1, ...compact(config.catalog as Record<string, unknown>) } : { version: 1 },\n entities: config.entities ? { version: 1, definitions: config.entities } : { version: 1 },\n promotions: config.promotions ? { version: 1, promotions: config.promotions } : { version: 1 },\n backend: compact({\n version: 1,\n provider: config.backend?.provider,\n url: config.backend?.url,\n supabaseUrl: config.supabaseUrl,\n supabaseAnonKey: config.supabaseAnonKey,\n }),\n auth: authData ? { version: 1, ...compact(authData as Record<string, unknown>) } : { version: 1 },\n code: compact(code as unknown as Record<string, unknown>) as unknown as StoreCodeSection,\n }\n\n // A section rides only when it says something. theme/catalog/auth key off the\n // config field instead of content so an EMPTY configured object (catalog: {})\n // still round-trips as the empty object it is, not as absence.\n const include: Record<string, boolean> = {\n theme: config.theme !== undefined,\n catalog: config.catalog !== undefined,\n entities: config.entities !== undefined,\n promotions: config.promotions !== undefined,\n auth: authData !== undefined,\n commerce: hasContent(sections.commerce),\n presentation: hasContent(sections.presentation),\n content: hasContent(sections.content),\n backend: hasContent(sections.backend),\n code: hasContent(sections.code as unknown as Record<string, unknown>),\n }\n const doc: Record<string, unknown> = { $kind: STORE_DOCUMENT_KIND, store: sections.store }\n for (const name of ['theme', 'commerce', 'presentation', 'content', 'catalog', 'entities', 'promotions', 'backend', 'auth', 'code'] as const) {\n if (include[name]) doc[name] = sections[name]\n }\n\n // The document must be strictly JSON: a page tree or seed catalog smuggling\n // a function/JSX would produce a document that LOOKS complete and cannot be\n // hydrated anywhere else. Fail here, naming the path (I2 spirit).\n for (const [name, section] of Object.entries(doc)) {\n if (name === '$kind') continue\n const offending = findNonJsonPath(section, name)\n if (offending) {\n throw new Error(\n `exportStore: ${offending} holds a non-serializable value. Code belongs in a registered ` +\n `handle (registerHandle) referenced from the document's code section — data sections must be pure JSON.`,\n )\n }\n }\n\n return doc as unknown as StoreDocument\n}\n\nexport interface HydrateStoreOptions {\n /**\n * 'throw' (default): a document that fails validation aborts hydration with\n * an error listing every finding — the authoring-loop contract (I2).\n * 'report': log the findings and hydrate best-effort, dropping unresolvable\n * code refs — the shopper-facing contract (I7: a broken document degrades\n * instead of white-screening the store). The scaffold uses 'report'.\n */\n onError?: 'throw' | 'report'\n}\n\nfunction formatErrors(errors: ReturnType<typeof validateStore>['errors']): string {\n return errors\n .map((e) => ` - ${e.path || '(document)'}: ${e.message}${e.valid ? ` (valid: ${e.valid.join(', ')})` : ''}`)\n .join('\\n')\n}\n\n/**\n * Reconstitute a StorefrontConfig from a Store Document.\n *\n * Every code reference resolves through the handle registry by NAME — the\n * document alone plus the app's registered handles is the whole story; there\n * is no in-memory side channel keyed by app id anymore.\n */\nexport function hydrateStoreDocument(\n input: StoreDocument | Record<string, unknown>,\n options: HydrateStoreOptions = {},\n): StorefrontConfig {\n const onError = options.onError ?? 'throw'\n const report = validateStore(input)\n if (!report.ok) {\n const message = `Store document failed validation:\\n${formatErrors(report.errors)}`\n if (onError === 'throw') throw new Error(message)\n console.error(`[storefront] ${message}`)\n }\n\n const doc = input as unknown as StoreDocument\n const resolve = <T>(name: string, path: string): T | undefined => {\n try {\n return resolveHandle<T>(name)\n } catch (err) {\n if (onError === 'throw') throw err\n console.error(`[storefront] dropping ${path}: ${err instanceof Error ? err.message : String(err)}`)\n return undefined\n }\n }\n\n const config: StorefrontConfig = { name: doc.store?.name ?? '' }\n const set = <K extends keyof StorefrontConfig>(key: K, value: StorefrontConfig[K] | undefined): void => {\n if (value !== undefined) config[key] = value\n }\n\n set('currency', doc.store?.currency)\n set('locale', doc.store?.locale)\n\n if (doc.theme) {\n const { version: _v, ...theme } = doc.theme\n set('theme', theme as StorefrontTheme)\n }\n\n if (doc.commerce) {\n set('commerceMode', doc.commerce.commerceMode)\n set('shipping', doc.commerce.shipping)\n set('payments', doc.commerce.payments)\n set('discounts', doc.commerce.discounts)\n set('enquiry', doc.commerce.enquiry)\n set('features', doc.commerce.features)\n }\n\n if (doc.presentation) {\n set('announcement', doc.presentation.announcement)\n set('home', doc.presentation.home)\n set('pages', doc.presentation.pages)\n set('slots', doc.presentation.slots)\n set('nav', doc.presentation.nav)\n set('imageLoading', doc.presentation.imageLoading)\n set('catalogFacets', doc.presentation.catalogFacets)\n set('productSpecs', doc.presentation.productSpecs)\n set('search', doc.presentation.search)\n if (doc.presentation.logo !== undefined) set('logo', doc.presentation.logo)\n }\n\n if (doc.content) {\n set('legal', doc.content.legal)\n set('reviews', doc.content.reviews)\n }\n\n if (doc.catalog) {\n const { version: _v, ...seed } = doc.catalog\n set('catalog', seed)\n }\n\n if (doc.entities?.definitions) set('entities', doc.entities.definitions)\n\n if (doc.promotions?.promotions) set('promotions', doc.promotions.promotions)\n\n if (doc.backend) {\n const { provider, url, supabaseUrl, supabaseAnonKey } = doc.backend\n if (provider !== undefined || url !== undefined) set('backend', compact({ provider, url }))\n set('supabaseUrl', supabaseUrl)\n set('supabaseAnonKey', supabaseAnonKey)\n }\n\n if (doc.auth) {\n const { version: _v, ...auth } = doc.auth\n set('auth', auth)\n }\n\n const code = doc.code\n if (code) {\n if (code.logo) set('logo', resolve<StorefrontConfig['logo']>(code.logo, 'code.logo'))\n if (code.provider) set('provider', resolve<ShopProvider>(code.provider, 'code.provider'))\n if (code.auth) set('auth', resolve<StorefrontAuthConfig>(code.auth, 'code.auth'))\n if (code.components) {\n const components: Record<string, unknown> = {}\n for (const [key, handle] of Object.entries(code.components)) {\n const value = resolve(handle, `code.components.${key}`)\n if (value !== undefined) components[key] = value\n }\n if (Object.keys(components).length > 0) set('components', components as StorefrontComponents)\n }\n if (code.routes) {\n const routes: StorefrontRouteDefinition[] = []\n for (const route of code.routes) {\n const component = resolve<ComponentType<StorefrontRouteComponentProps>>(\n route.component,\n `code.routes[${route.id}].component`,\n )\n if (component === undefined) continue\n routes.push(\n compact({\n id: route.id,\n path: route.path,\n kind: route.kind,\n chrome: route.chrome,\n component,\n }) as unknown as StorefrontRouteDefinition,\n )\n }\n if (routes.length > 0) set('routes', routes)\n }\n if (code.searchRenderSuggestion) {\n const renderSuggestion = resolve<NonNullable<StorefrontSearchConfig['renderSuggestion']>>(\n code.searchRenderSuggestion,\n 'code.searchRenderSuggestion',\n )\n if (renderSuggestion !== undefined) {\n set('search', { ...(doc.presentation?.search ?? {}), renderSuggestion })\n }\n }\n if (code.footerCredit) {\n const credit = resolve<FooterConfig['credit']>(code.footerCredit, 'code.footerCredit')\n if (credit !== undefined) {\n set('footer', { ...(doc.presentation?.footer ?? {}), credit })\n }\n }\n }\n if (config.footer === undefined && doc.presentation?.footer !== undefined) {\n set('footer', doc.presentation.footer)\n }\n\n return config\n}\n\n/** Re-export so document consumers need one import. */\nexport { STORE_DOCUMENT_KIND }\n"]}