@kotao/storefront 0.2.7 → 0.2.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/react.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/react/cart.tsx","../src/analytics/anonymous-context.ts","../src/react/analytics.tsx","../src/react/image.tsx","../src/react/media-file.tsx","../src/react/money.tsx","../src/react/pagination.tsx","../src/react/seo.tsx","../src/react/shop-pay-button.tsx","../src/react/theme-settings.tsx","../../smart-cart/src/format.ts","../../smart-cart/src/widgets/add-on.ts","../../smart-cart/src/widgets/reservation-timer.ts","../../smart-cart/src/widgets/upsell-carousel.ts","../../smart-cart/src/widgets/discount-code.ts","../../smart-cart/src/widgets/free-shipping-bar.ts","../../smart-cart/src/widgets/sticky-bubble.ts","../../smart-cart/src/widgets/payment-icons.ts","../../smart-cart/src/widgets/trust-badges.ts","../../smart-cart/src/widgets/index.ts","../../smart-cart/src/element.ts","../../smart-cart/src/interception.ts","../../smart-cart/src/mount.ts","../src/react/cart-drawer-mount.ts","../src/react/cart-drawer-overlay.tsx","../src/react/hydrogen-editor.tsx"],"names":["CartForm","jsx","Fragment","createContext","useContext","formatMoney","css","readMessage","MS_PER_MINUTE","STYLES","struck","useEffect","useSyncExternalStore","useMemo"],"mappings":";;;;;;;;;;;;;;AA4BA,SAAS,oBAAoB,KAAA,EAAmC;AAC9D,EAAA,IAAI,KAAA,KAAU,QAAQ,OAAO,KAAA,KAAU,UAAU,OAAO,IAAA,CAAK,UAAU,KAAK,CAAA;AAC5E,EAAA,OAAO,OAAO,KAAK,CAAA;AACrB;AAEO,IAAM,WAAW,MAAA,CAAO,MAAA;AAAA,EAC7B,SAASA,UAAS,EAAE,MAAA,EAAQ,SAAS,EAAC,EAAG,KAAA,EAAO,QAAA,EAAS,EAAgC;AACvF,IAAA,MAAM,UAAU,UAAA,EAAoB;AACpC,IAAA,MAAM,mBAAmB,OAAO,QAAA,KAAa,UAAA,GAAa,QAAA,CAAS,OAAO,CAAA,GAAI,QAAA;AAC9E,IAAA,MAAM,YAAA,GAAe,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,CAAE,OAAA;AAAA,MAAQ,CAAC,CAAC,IAAA,EAAM,KAAK,MAC/D,KAAA,IAAS,IAAA,GACL,EAAC,GACD,qBAAE,OAAA,EAAA,EAAiB,IAAA,EAAK,UAAS,IAAA,EAAY,KAAA,EAAO,oBAAoB,KAAK,CAAA,EAAA,EAAhE,IAAmE,CAAE;AAAA,KACxF;AACA,IAAA,MAAM,aAAa,KAAA,KAAU,MAAA,GAAY,EAAC,GAAI,EAAE,QAAQ,KAAA,EAAM;AAC9D,IAAA,4BACG,OAAA,CAAQ,IAAA,EAAR,EAAa,MAAA,EAAO,MAAA,EAAQ,GAAG,UAAA,EAC9B,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,WAAM,IAAA,EAAK,QAAA,EAAS,IAAA,EAAK,YAAA,EAAa,OAAO,MAAA,EAAQ,CAAA;AAAA,MACrD,YAAA;AAAA,MACA;AAAA,KAAA,EACH,CAAA;AAAA,EAEJ,CAAA;AAAA,EACA,EAAE,OAAA,EAAS,iBAAA,EAAmB,YAAA,EAAc,gBAAA;AAC9C;AAOO,SAAS,eAAA,CAAgB,EAAE,EAAA,EAAI,IAAA,EAAK,EAAuC;AAChF,EAAA,uBAAO,GAAA,CAAC,OAAA,EAAA,EAAM,IAAA,EAAK,QAAA,EAAS,IAAA,EAAM,CAAA,eAAA,EAAkB,EAAE,CAAA,CAAA,EAAI,KAAA,EAAO,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA,EAAG,CAAA;AACzF;AAEO,SAAS,kBAAqB,GAAA,EAA+C;AAClF,EAAA,OAAO,MAAA;AACT;;;ACxDO,SAAS,oBAAA,CACd,cACA,UAAA,EAC2B;AAC3B,EAAA,IAAI,CAAC,YAAA,IAAgB,CAAC,UAAA,SAAmB,EAAC;AAE1C,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,UAAU,CAAA;AAClC,IAAA,MAAM,SAAA,GAAY,IAAI,GAAA,CAAI,YAAA,EAAc,OAAO,CAAA;AAC/C,IAAA,IAAI,CAAC,CAAC,OAAA,EAAS,QAAQ,CAAA,CAAE,SAAS,OAAA,CAAQ,QAAQ,CAAA,EAAG,OAAO,EAAC;AAC7D,IAAA,IAAI,CAAC,CAAC,OAAA,EAAS,QAAQ,CAAA,CAAE,SAAS,SAAA,CAAU,QAAQ,CAAA,EAAG,OAAO,EAAC;AAC/D,IAAA,IAAI,SAAA,CAAU,MAAA,KAAW,OAAA,CAAQ,MAAA,SAAe,EAAC;AAEjD,IAAA,MAAM,QAAA,GAAW,sBAAsB,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA,GAC1D,WAAA,GACA,UAAU,QAAA,IAAY,GAAA;AAC1B,IAAA,OAAO,EAAE,GAAA,EAAK,CAAA,EAAG,UAAU,MAAM,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAG;AAAA,EACjD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAC;AAAA,EACV;AACF;ACCA,IAAM,UAAA,GAAwB,CAAC,QAAA,EAAU,IAAA,KAAS;AAChD,EAAA,IAAI,OAAO,SAAA,KAAc,WAAA,IAAe,OAAO,SAAA,CAAU,eAAe,UAAA,EAAY;AAClF,IAAA,IAAI,SAAA,CAAU,UAAA,CAAW,QAAA,EAAU,IAAI,IAAA,CAAK,CAAC,IAAI,CAAA,EAAG,EAAE,IAAA,EAAM,kBAAA,EAAoB,CAAC,CAAA,EAAG;AAAA,EACtF;AACA,EAAA,IAAI,OAAO,UAAU,UAAA,EAAY;AAC/B,IAAA,KAAK,MAAM,QAAA,EAAU;AAAA,MACnB,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA;AAAA,MACA,SAAA,EAAW,IAAA;AAAA,MACX,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA;AAAmB,KAC/C,CAAA;AAAA,EACH;AACF,CAAA;AAWA,IAAM,qBAAA,GAAwB,cAA4C,IAAI,CAAA;AAwBvE,SAAS,kBAAkB,KAAA,EAA6C;AAC7E,EAAA,MAAM,CAAC,OAAA,EAAS,eAAe,CAAA,GAAI,SAAuB,eAAe,CAAA;AACzE,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAS,IAAI,CAAA;AAC3C,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,UAAA,GAAa,OAAqB,OAAO,CAAA;AAC/C,EAAA,UAAA,CAAW,OAAA,GAAU,OAAA;AACrB,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA;AACnC,EAAA,UAAA,CAAW,UAAU,KAAA,CAAM,GAAA;AAE3B,EAAA,MAAM,UAAA,GAAa,MAAA,CAAyB,EAAE,CAAA;AAC9C,EAAA,MAAM,SAAS,KAAA,CAAM,MAAA,IAAU,MAAM,IAAA,EAAM,MAAA,IAAU,MAAM,IAAA,EAAM,YAAA;AACjE,EAAA,MAAM,UAAA,GACJ,OAAO,MAAA,KAAW,WAAA,GACd,UACC,MAAM;AACL,IAAA,IAAI;AACF,MAAA,OAAO,IAAI,GAAA,CAAI,KAAA,CAAM,GAAA,IAAO,MAAA,CAAO,SAAS,IAAA,EAAM,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,CAAE,IAAA;AAAA,IAC1E,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA,CAAM,GAAA;AAAA,IACf;AAAA,EACF,CAAA,GAAG;AACT,EAAA,UAAA,CAAW,OAAA,GAAU;AAAA,IACnB,GAAI,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,KAAW,EAAC;AAAA,IACzC,GAAI,MAAM,GAAA,KAAQ,MAAA,GAAY,EAAE,GAAA,EAAK,KAAA,CAAM,GAAA,EAAI,GAAI,EAAC;AAAA,IACpD,GAAI,UAAA,KAAe,MAAA,GACf,EAAE,KAAK,UAAA,EAAW,GAClB,KAAA,CAAM,GAAA,KAAQ,SACZ,EAAE,GAAA,EAAK,KAAA,CAAM,GAAA,KACb;AAAC,GACT;AAGA,EAAA,MAAM,WAAA,GAAc,MAAA,CAAO,KAAA,CAAM,aAAa,CAAA;AAI9C,EAAA,MAAM,GAAA,GAAM,OAAA;AAAA,IACV,MACE,kBAAA,CAAmB;AAAA,MACjB,WAAW,oBAAA,CAAqB;AAAA,QAC9B,IAAA,EAAM,UAAA;AAAA,QACN,GAAI,YAAY,OAAA,KAAY,MAAA,GAAY,EAAE,QAAA,EAAU,WAAA,CAAY,OAAA,EAAQ,GAAI;AAAC,OAC9E,CAAA;AAAA,MACD,UAAA,EAAY,MAAM,UAAA,CAAW,OAAA;AAAA,MAC7B,qBAAqB,MAAM;AACzB,QAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,EAAC;AAC3C,QAAA,OAAO,oBAAA;AAAA,UACL,UAAA,CAAW,OAAA,IAAW,MAAA,CAAO,QAAA,CAAS,IAAA;AAAA,UACtC,OAAO,QAAA,CAAS;AAAA,SAClB;AAAA,MACF,CAAA;AAAA;AAAA;AAAA,MAGA,YAAY,OAAO;AAAA,QACjB,GAAG,2BAAA;AAAA,UACD,OAAO,MAAA,KAAW,WAAA,IAAe,OAAO,QAAA,KAAa,cACjD,IAAA,GACA;AAAA,YACE,UAAU,QAAA,CAAS,QAAA;AAAA,YACnB,MAAA,EAAQ,OAAO,QAAA,CAAS,MAAA;AAAA,YACxB,GAAI,OAAO,MAAA,CAAO,UAAA,KAAe,aAC7B,EAAE,UAAA,EAAY,CAAC,KAAA,KAAkB,MAAA,CAAO,UAAA,CAAW,KAAK,CAAA,KACxD;AAAC;AACP,SACN;AAAA,QACA,GAAG,UAAA,CAAW;AAAA,OAChB;AAAA,KACD,CAAA;AAAA,IACH;AAAC,GACH;AAGA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,MAAM,MAAA,GAAS,OAAO,QAAA,KAAa,WAAA,GAAc,KAAK,QAAA,CAAS,MAAA;AAC/D,IAAA,IAAI,MAAA,CAAO,QAAA,CAAS,CAAA,EAAG,cAAc,GAAG,CAAA,EAAG;AACzC,MAAA,MAAM,QAAA,GAAW,kBAAkB,MAAM,CAAA;AACzC,MAAA,UAAA,CAAW,OAAA,GAAU,QAAA;AACrB,MAAA,eAAA,CAAgB,QAAQ,CAAA;AACxB,MAAA,UAAA,CAAW,IAAI,CAAA;AAAA,IACjB;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAIL,EAAA,MAAM,UAAA,GAAa,WAAA,CAAY,CAAC,KAAA,KAAiC;AAC/D,IAAA,eAAA,CAAgB,CAAC,IAAA,KAAS;AACxB,MAAA,MAAM,IAAA,GAAO,YAAA,CAAa,IAAA,EAAM,KAAK,CAAA;AACrC,MAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AACrB,MAAA,IAAI,OAAO,QAAA,KAAa,WAAA,EAAa,QAAA,CAAS,MAAA,GAAS,mBAAmB,IAAI,CAAA;AAC9E,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AACD,IAAA,UAAA,CAAW,IAAI,CAAA;AAAA,EACjB,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,GAAA,CAAI,OAAA,CAAQ,aAAA,EAAe,EAAE,CAAA;AAAA,EAC/B,CAAA,EAAG,CAAC,GAAA,EAAK,KAAA,CAAM,GAAG,CAAC,CAAA;AAGnB,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACrC,IAAA,MAAM,MAAA,GAAS,MAAY,GAAA,CAAI,KAAA,EAAM;AACrC,IAAA,QAAA,CAAS,gBAAA,CAAiB,oBAAoB,MAAM,CAAA;AACpD,IAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,kBAAA,EAAoB,MAAM,CAAA;AAAA,EACtE,CAAA,EAAG,CAAC,GAAG,CAAC,CAAA;AAER,EAAA,MAAM,KAAA,GAAQ,OAAA;AAAA,IACZ,OAAO;AAAA,MACL,SAAA,EAAW,IAAI,OAAA,CAAQ,SAAA;AAAA,MACvB,SAAS,GAAA,CAAI,OAAA;AAAA,MACb,OAAA;AAAA,MACA,UAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA,KACF,CAAA;AAAA,IACA,CAAC,GAAA,EAAK,OAAA,EAAS,UAAA,EAAY,SAAS,OAAO;AAAA,GAC7C;AAEA,EAAA,uBACEC,GAAAA,CAAC,qBAAA,CAAsB,UAAtB,EAA+B,KAAA,EAAe,gBAAM,QAAA,EAAS,CAAA;AAElE;AAEO,SAAS,YAAA,GAAsC;AACpD,EAAA,MAAM,KAAA,GAAQ,WAAW,qBAAqB,CAAA;AAC9C,EAAA,IAAI,KAAA,KAAU,IAAA,EAAM,MAAM,IAAI,MAAM,yDAAyD,CAAA;AAC7F,EAAA,OAAO,KAAA;AACT;AAgBO,SAAS,aAAA,CAAc,EAAE,QAAA,EAAS,EAA4C;AAEnF,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,mBAAA,CACP,OACA,OAAA,EACM;AACN,EAAA,MAAM,YAAY,YAAA,EAAa;AAC/B,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,OAAA,KAAY,IAAA,EAAM,SAAA,CAAU,OAAA,CAAQ,OAAO,OAAO,CAAA;AAAA,EACxD,CAAA,EAAG,CAAC,SAAA,EAAW,KAAA,EAAO,OAAO,CAAC,CAAA;AAChC;AASO,SAAS,iBAAA,CAAkB,EAAE,IAAA,EAAK,EAAiC;AACxE,EAAA,MAAM,MAAA,GAAS,IAAA,EAAM,IAAA,EAAM,EAAA,IAAM,MAAM,EAAA,IAAM,MAAA;AAC7C,EAAA,MAAM,OAAA,GAAU,OAAA;AAAA,IACd,MAAO,MAAA,IAAU,IAAA,GAAO,EAAE,MAAA,KAAW,EAAC;AAAA,IACtC,CAAC,MAAM;AAAA,GACT;AACA,EAAA,mBAAA,CAAoB,eAAe,OAAO,CAAA;AAC1C,EAAA,OAAO,IAAA;AACT;AAoBO,SAAS,oBAAA,CAAqB,EAAE,IAAA,EAAK,EAAoC;AAC9E,EAAA,MAAM,OAAA,GAAU,IAAA,EAAM,QAAA,GAAW,CAAC,CAAA;AAClC,EAAA,MAAM,SAAA,GAAY,OAAA,EAAS,SAAA,IAAa,OAAA,EAAS,EAAA,IAAM,IAAA;AACvD,EAAA,MAAM,MAAA,GAAS,SAAS,MAAA,IAAU,MAAA;AAClC,EAAA,MAAM,QAAQ,OAAA,EAAS,KAAA,IAAS,OAAO,MAAA,GAAY,MAAA,CAAO,QAAQ,KAAK,CAAA;AACvE,EAAA,MAAM,OAAA,GAAU,QAAoD,MAAM;AACxE,IAAA,IAAI,SAAA,IAAa,MAAM,OAAO,IAAA;AAC9B,IAAA,OAAO;AAAA,MACL,SAAA;AAAA,MACA,GAAI,MAAA,IAAU,IAAA,GAAO,EAAE,MAAA,KAAW,EAAC;AAAA,MACnC,GAAI,SAAS,SAAA,IAAa,IAAA,GAAO,EAAE,SAAA,EAAW,OAAA,CAAQ,SAAA,EAAU,GAAI,EAAC;AAAA,MACrE,GAAI,SAAS,KAAA,IAAS,IAAA,GAAO,EAAE,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAM,GAAI,EAAC;AAAA,MACzD,GAAI,SAAS,YAAA,IAAgB,IAAA,GAAO,EAAE,YAAA,EAAc,OAAA,CAAQ,YAAA,EAAa,GAAI,EAAC;AAAA,MAC9E,GAAI,SAAS,MAAA,IAAU,IAAA,GAAO,EAAE,MAAA,EAAQ,OAAA,CAAQ,MAAA,EAAO,GAAI,EAAC;AAAA,MAC5D,GAAI,SAAS,GAAA,IAAO,IAAA,GAAO,EAAE,GAAA,EAAK,OAAA,CAAQ,GAAA,EAAI,GAAI,EAAC;AAAA,MACnD,GAAI,KAAA,KAAU,MAAA,IAAa,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,GAAI,EAAE,KAAA,EAAM,GAAI,EAAC;AAAA,MACjE,GAAI,SAAS,QAAA,IAAY,IAAA,GAAO,EAAE,QAAA,EAAU,OAAA,CAAQ,QAAA,EAAS,GAAI,EAAC;AAAA,MAClE,GAAI,SAAS,QAAA,IAAY,IAAA,GAAO,EAAE,QAAA,EAAU,OAAA,CAAQ,QAAA,EAAS,GAAI;AAAC,KACpE;AAAA,EACF,GAAG,CAAC,MAAA,EAAQ,KAAA,EAAO,OAAA,EAAS,SAAS,CAAC,CAAA;AACtC,EAAA,mBAAA,CAAoB,kBAAkB,OAAO,CAAA;AAC7C,EAAA,OAAO,IAAA;AACT;AAWO,SAAS,uBAAA,CAAwB,EAAE,IAAA,EAAK,EAAuC;AACpF,EAAA,MAAM,aAAa,IAAA,EAAM,UAAA;AACzB,EAAA,MAAM,YAAA,GAAe,YAAY,EAAA,IAAM,IAAA;AACvC,EAAA,MAAM,MAAA,GAAS,YAAY,MAAA,IAAU,MAAA;AACrC,EAAA,MAAM,OAAA,GAAU,QAAuD,MAAM;AAC3E,IAAA,IAAI,YAAA,IAAgB,MAAM,OAAO,IAAA;AACjC,IAAA,OAAO;AAAA,MACL,YAAA;AAAA,MACA,GAAI,MAAA,IAAU,IAAA,GAAO,EAAE,MAAA,KAAW;AAAC,KACrC;AAAA,EACF,CAAA,EAAG,CAAC,YAAA,EAAc,MAAM,CAAC,CAAA;AACzB,EAAA,mBAAA,CAAoB,qBAAqB,OAAO,CAAA;AAChD,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,6BAA6B,aAAA,EAA4C;AAChF,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,aAAa,CAAA,SAAU,aAAA,CAAc,MAAA;AACvD,EAAA,IAAI,aAAA,IAAiB,IAAA,IAAQ,OAAO,aAAA,KAAkB,QAAA,EAAU;AAC9D,IAAA,MAAM,QAAS,aAAA,CAA+C,KAAA;AAC9D,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,SAAU,KAAA,CAAM,MAAA;AAAA,EACzC;AACA,EAAA,OAAO,MAAA;AACT;AASO,SAAS,mBAAA,CAAoB,EAAE,IAAA,EAAK,EAAmC;AAC5E,EAAA,MAAM,KAAA,GAAQ,MAAM,UAAA,IAAc,EAAA;AAClC,EAAA,MAAM,WAAA,GAAc,4BAAA,CAA6B,IAAA,EAAM,aAAa,CAAA;AACpE,EAAA,MAAM,OAAA,GAAU,OAAA;AAAA,IACd,OAAO;AAAA,MACL,KAAA;AAAA,MACA,GAAI,WAAA,IAAe,IAAA,GAAO,EAAE,WAAA,KAAgB;AAAC,KAC/C,CAAA;AAAA,IACA,CAAC,OAAO,WAAW;AAAA,GACrB;AACA,EAAA,mBAAA,CAAoB,iBAAiB,OAAO,CAAA;AAC5C,EAAA,OAAO,IAAA;AACT;AAEO,IAAM,SAAA,GAAY,OAAO,MAAA,CAAO;AAAA,EACrC,QAAA,EAAU,iBAAA;AAAA,EACV,QAAA,EAAU,iBAAA;AAAA,EACV,cAAA,EAAgB,uBAAA;AAAA,EAChB,WAAA,EAAa,oBAAA;AAAA,EACb,UAAA,EAAY;AACd,CAAC;AC7UM,SAAS,MAAM,KAAA,EAAiC;AACrD,EAAA,MAAM;AAAA,IACJ,IAAA;AAAA,IACA,GAAA;AAAA,IACA,WAAA;AAAA,IACA,IAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA;AAAA,IACA,YAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA;AAAA,IACA,GAAA;AAAA,IACA,KAAA;AAAA,IACA,GAAG;AAAA,GACL,GAAI,KAAA;AACJ,EAAA,MAAM,YAAA,GAA0B;AAAA,IAC9B,GAAA,EAAK,GAAA,IAAO,IAAA,EAAM,GAAA,IAAO,EAAA;AAAA,IACzB,OAAA,EAAS,GAAA,IAAO,IAAA,EAAM,OAAA,IAAW,EAAA;AAAA,IACjC,GAAI,MAAM,KAAA,IAAS,IAAA,GAAO,EAAE,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM,GAAI,EAAC;AAAA,IACnD,GAAI,MAAM,MAAA,IAAU,IAAA,GAAO,EAAE,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAO,GAAI;AAAC,GACxD;AACA,EAAA,MAAM,EAAE,KAAA,EAAO,WAAA,EAAa,GAAG,QAAA,KAAa,eAAA,CAAgB;AAAA,IAC1D,IAAA,EAAM,YAAA;AAAA,IACN,GAAA;AAAA,IACA,WAAA;AAAA,IACA,IAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA;AAAA,IACA,YAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACD,CAAA;AACD,EAAA,MAAM,WAAA,GAA6B,EAAE,GAAG,WAAA,EAAa,GAAG,KAAA,EAAM;AAC9D,EAAA,uBAAOA,IAAC,KAAA,EAAA,EAAK,GAAG,aAAc,GAAG,QAAA,EAAU,OAAO,WAAA,EAAa,CAAA;AACjE;ACVA,SAAS,kBAAA,CAAmB,MAAwB,GAAA,EAAgC;AAClF,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,IAAS,IAAA,CAAK,YAAA;AAClC,EAAA,IAAI,UAAU,IAAA,EAAM;AAClB,IAAA,OAAO;AAAA,MACL,KAAK,MAAA,CAAO,GAAA;AAAA,MACZ,OAAA,EAAS,GAAA,IAAO,MAAA,CAAO,OAAA,IAAW,KAAK,GAAA,IAAO,EAAA;AAAA,MAC9C,GAAI,OAAO,KAAA,IAAS,IAAA,GAAO,EAAE,KAAA,EAAO,MAAA,CAAO,KAAA,EAAM,GAAI,EAAC;AAAA,MACtD,GAAI,OAAO,MAAA,IAAU,IAAA,GAAO,EAAE,MAAA,EAAQ,MAAA,CAAO,MAAA,EAAO,GAAI;AAAC,KAC3D;AAAA,EACF;AACA,EAAA,IAAI,IAAA,CAAK,GAAA,IAAO,IAAA,EAAM,OAAO,IAAA;AAC7B,EAAA,OAAO,EAAE,KAAK,IAAA,CAAK,GAAA,EAAK,SAAS,GAAA,IAAO,IAAA,CAAK,OAAO,EAAA,EAAG;AACzD;AAEO,SAAS,SAAA,CAAU,EAAE,SAAA,EAAW,IAAA,EAAM,cAAa,EAAwC;AAChG,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,gBAAA,EAAkB,WAAA,EAAY;AACrD,EAAA,IAAI,SAAA,KAAc,OAAA,IAAW,IAAA,CAAK,OAAA,EAAS,MAAA,EAAQ;AACjD,IAAA,MAAM,EAAE,mBAAA,EAAqB,GAAG,cAAa,GAAI,YAAA,EAAc,SAAS,EAAC;AACzE,IAAA,MAAM,SAAS,YAAA,CAAa,MAAA,IAAU,mBAAA,EAAqB,GAAA,IAAO,KAAK,YAAA,EAAc,GAAA;AACrF,IAAA,uBACEA,GAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACE,GAAG,YAAA;AAAA,QACJ,SAAA;AAAA,QACC,GAAI,UAAU,IAAA,IAAQ,MAAA,CAAO,SAAS,CAAA,GAAI,EAAE,MAAA,EAAO,GAAI,EAAC;AAAA,QAExD,eAAK,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,qBACjBA,GAAAA,CAAC,QAAA,EAAA,EAAwB,GAAA,EAAK,MAAA,CAAO,KAAK,IAAA,EAAM,MAAA,CAAO,YAAY,MAAA,EAAA,EAAtD,MAAA,CAAO,GAA0D,CAC/E;AAAA;AAAA,KACH;AAAA,EAEJ;AAEA,EAAA,MAAM,eAAe,YAAA,EAAc,KAAA;AACnC,EAAA,MAAM,SAAA,GAAY,kBAAA,CAAmB,IAAA,EAAM,YAAA,EAAc,GAAG,CAAA;AAC5D,EAAA,IAAI,SAAA,KAAc,MAAM,OAAO,IAAA;AAE/B,EAAA,uBACEA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,IAAA,EAAM,SAAA;AAAA,MACL,GAAI,cAAc,WAAA,IAAe,IAAA,GAAO,EAAE,WAAA,EAAa,YAAA,CAAa,WAAA,EAAY,GAAI,EAAC;AAAA,MACrF,GAAI,cAAc,IAAA,IAAQ,IAAA,GAAO,EAAE,IAAA,EAAM,YAAA,CAAa,IAAA,EAAK,GAAI,EAAC;AAAA,MAChE,GAAI,cAAc,MAAA,IAAU,IAAA,GAAO,EAAE,MAAA,EAAQ,YAAA,CAAa,MAAA,EAAO,GAAI,EAAC;AAAA,MACtE,GAAI,cAAc,MAAA,IAAU,IAAA,GAAO,EAAE,MAAA,EAAQ,YAAA,CAAa,MAAA,EAAO,GAAI,EAAC;AAAA,MACtE,GAAI,cAAc,OAAA,IAAW,IAAA,GAAO,EAAE,OAAA,EAAS,YAAA,CAAa,OAAA,EAAQ,GAAI,EAAC;AAAA,MACzE,GAAI,cAAc,OAAA,IAAW,IAAA,GAAO,EAAE,OAAA,EAAS,YAAA,CAAa,OAAA,EAAQ,GAAI,EAAC;AAAA,MACzE,GAAI,cAAc,KAAA,IAAS,IAAA,GAAO,EAAE,KAAA,EAAO,YAAA,CAAa,KAAA,EAAM,GAAI,EAAC;AAAA,MACnE,GAAI,cAAc,YAAA,IAAgB,IAAA,GAAO,EAAE,YAAA,EAAc,YAAA,CAAa,YAAA,EAAa,GAAI,EAAC;AAAA,MACxF,GAAI,cAAc,KAAA,IAAS,IAAA,GAAO,EAAE,KAAA,EAAO,YAAA,CAAa,KAAA,EAAM,GAAI;AAAC;AAAA,GACtE;AAEJ;AC5EA,SAAS,eAAe,MAAA,EAAiC;AACvD,EAAA,MAAM,GAAG,QAAA,GAAW,EAAE,IAAI,MAAA,CAAO,MAAM,CAAA,CAAE,KAAA,CAAM,GAAG,CAAA;AAClD,EAAA,OAAO,QAAA,CAAS,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA,CAAE,MAAA;AACtC;AAEA,SAAS,YAAA,CAAa,cAAsB,eAAA,EAAoD;AAC9F,EAAA,OACE,IAAI,IAAA,CAAK,YAAA,CAAa,OAAA,EAAS;AAAA,IAC7B,QAAA,EAAU,YAAA;AAAA,IACV,eAAA;AAAA,IACA,KAAA,EAAO;AAAA,GACR,CAAA,CACE,aAAA,CAAc,CAAC,CAAA,CACf,IAAA,CAAK,CAAC,IAAA,KAAS,IAAA,CAAK,IAAA,KAAS,UAAU,CAAA,EAAG,KAAA,IAAS,YAAA;AAE1D;AAEA,SAAS,WAAA,CACP,MAAA,EACA,YAAA,EACA,OAAA,GAAgF,EAAC,EACzE;AACR,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,SAAA,KAAc,IAAA,GAAO,CAAA,GAAI,CAAA;AAChD,EAAA,OAAO,IAAI,IAAA,CAAK,YAAA,CAAa,OAAA,EAAS;AAAA,IACpC,QAAA,EAAU,YAAA;AAAA,IACV,eAAA,EAAiB,QAAQ,eAAA,IAAmB,cAAA;AAAA,IAC5C,uBAAuB,OAAA,CAAQ,SAAA,KAAc,IAAA,GAAO,cAAA,CAAe,MAAM,CAAA,GAAI,MAAA;AAAA,IAC7E,qBAAA,EAAuB,OAAA,CAAQ,SAAA,KAAc,IAAA,GAAO,CAAA,GAAI,MAAA;AAAA,IACxD,KAAA,EAAO;AAAA,GACR,CAAA,CAAE,MAAA,CAAO,MAAM,CAAA;AAClB;AAEA,SAAS,aAAA,CAAc,QAAgB,cAAA,EAAyC;AAC9E,EAAA,MAAM,MAAA,GAAS,eAAe,cAAc,CAAA;AAC5C,EAAA,OAAO,IAAI,IAAA,CAAK,YAAA,CAAa,OAAA,EAAS;AAAA,IACpC,qBAAA,EAAuB,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,CAAC,CAAA;AAAA,IACzC,qBAAA,EAAuB;AAAA,GACxB,CAAA,CAAE,MAAA,CAAO,MAAM,CAAA;AAClB;AAMO,SAAS,SAAS,IAAA,EAAgC;AACvD,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA;AACjC,EAAA,MAAM,eAAe,IAAA,CAAK,YAAA;AAC1B,EAAA,MAAM,YAAA,GACJ,IAAI,IAAA,CAAK,YAAA,CAAa,CAAC,OAAO,CAAA,EAAG,EAAE,IAAA,EAAM,UAAA,EAAY,CAAA,CAAE,EAAA,CAAG,YAAY,CAAA,IAAK,YAAA;AAE7E,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA;AAAA,IAC1B,YAAA;AAAA,IACA,YAAA;AAAA,IACA,oBAAA,EAAsB,YAAA,CAAa,YAAA,EAAc,cAAc,CAAA;AAAA,IAC/D,cAAA,EAAgB,YAAA,CAAa,YAAA,EAAc,QAAQ,CAAA;AAAA,IACnD,eAAA,EAAiB,WAAA,CAAY,MAAA,EAAQ,YAAY,CAAA;AAAA,IACjD,sBAAsB,WAAA,CAAY,MAAA,EAAQ,cAAc,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,IAC3E,+BAAA,EAAiC,aAAA,CAAc,MAAA,EAAQ,IAAA,CAAK,MAAM;AAAA,GACpE;AACF;AAEO,SAAS,KAAA,CAAM;AAAA,EACpB,IAAI,SAAA,GAAY,MAAA;AAAA,EAChB,IAAA;AAAA,EACA,eAAA;AAAA,EACA,oBAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA6B;AAC3B,EAAA,MAAM,OACJ,IAAA,IAAQ,IAAA,GACJ,KACA,eAAA,KAAoB,IAAA,GAClB,SAAS,IAAI,CAAA,CAAE,+BAAA,GACf,oBAAA,KAAyB,OACvB,QAAA,CAAS,IAAI,EAAE,oBAAA,GACf,QAAA,CAAS,IAAI,CAAA,CAAE,eAAA;AACzB,EAAA,uBAAOA,GAAAA,CAAC,SAAA,EAAA,EAAW,GAAG,aAAc,QAAA,EAAA,IAAA,EAAK,CAAA;AAC3C;AC3EO,SAAS,UAAA,CAAoB;AAAA,EAClC,UAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAAqC;AACnC,EAAA,MAAM,IAAA,GAAO,iBAAA;AAAA,IACX,UAAA;AAAA,IACA,UAAA,IAAc,iCAAA;AAAA,IACd,SAAA,IAAa,IAAA,GAAO,EAAE,SAAA,KAAc;AAAC,GACvC;AACA,EAAA,MAAM,eAAe,CAAC,EAAE,UAAU,YAAA,EAAc,GAAG,OAAM,qBACvDA,GAAAA,CAAC,GAAA,EAAA,EAAG,GAAG,KAAA,EAAO,IAAA,EAAM,KAAK,WAAA,IAAe,KAAA,CAAM,MAC3C,QAAA,EAAA,YAAA,EACH,CAAA;AAEF,EAAA,MAAM,WAAW,CAAC,EAAE,UAAU,YAAA,EAAc,GAAG,OAAM,qBACnDA,GAAAA,CAAC,GAAA,EAAA,EAAG,GAAG,KAAA,EAAO,IAAA,EAAM,KAAK,WAAA,IAAe,KAAA,CAAM,MAC3C,QAAA,EAAA,YAAA,EACH,CAAA;AAEF,EAAA,uBACEA,GAAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA,QAAA,CAAS;AAAA,IACR,GAAG,IAAA;AAAA,IACH,SAAA,EAAW,KAAA;AAAA,IACX,KAAA,EAAO,MAAA;AAAA,IACP,YAAA;AAAA,IACA;AAAA,GACD,CAAA,EACH,CAAA;AAEJ;ACnDA,SAAS,gBAAA,CAAiB,YAA2B,GAAA,EAA2B;AAC9E,EAAA,IAAI,OAAA,IAAW,YAAY,uBAAOA,IAAC,OAAA,EAAA,EAAiB,QAAA,EAAA,UAAA,CAAW,SAAjB,GAAuB,CAAA;AACrE,EAAA,IAAI,oBAAoB,UAAA,EAAY;AAGlC,IAAA,uBACEA,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QAEC,IAAA,EAAK,qBAAA;AAAA,QACL,yBAAyB,EAAE,MAAA,EAAQ,gBAAgB,UAAA,CAAW,gBAAgB,CAAC,CAAA;AAAE,OAAA;AAAA,MAF5E;AAAA,KAGP;AAAA,EAEJ;AACA,EAAA,IAAI,aAAa,UAAA,EAAY;AAC3B,IAAA,uBACEA,GAAAA,CAAC,MAAA,EAAA,EAAe,GAAA,EAAK,UAAA,CAAW,GAAA,EAAK,IAAA,EAAM,UAAA,CAAW,IAAA,EAAM,QAAA,EAAU,UAAA,CAAW,QAAA,EAAA,EAAtE,GAAgF,CAAA;AAAA,EAE/F;AACA,EAAA,IAAI,cAAc,UAAA,EAAY;AAC5B,IAAA,uBAAOA,IAAC,MAAA,EAAA,EAAe,QAAA,EAAU,WAAW,QAAA,EAAU,OAAA,EAAS,UAAA,CAAW,OAAA,EAAA,EAAxD,GAAiE,CAAA;AAAA,EACrF;AACA,EAAA,uBAAOA,IAAC,MAAA,EAAA,EAAe,IAAA,EAAM,WAAW,IAAA,EAAM,OAAA,EAAS,UAAA,CAAW,OAAA,EAAA,EAAhD,GAAyD,CAAA;AAC7E;AAOO,SAAS,GAAA,CAAI,EAAE,MAAA,EAAO,EAA2B;AACtD,EAAA,MAAM,OAAA,GAAW,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,GAAI,CAAC,GAAG,MAAM,CAAA,GAAI,CAAC,MAAM,CAAA;AAC9D,EAAA,MAAM,WAAA,GAAc,UAAA,CAAW,GAAG,OAAO,CAAA;AACzC,EAAA,uBAAOA,GAAAA,CAAAC,QAAAA,EAAA,EAAG,QAAA,EAAA,WAAA,CAAY,GAAA,CAAI,CAAC,UAAA,EAAY,KAAA,KAAU,gBAAA,CAAiB,UAAA,EAAY,KAAK,CAAC,CAAA,EAAE,CAAA;AACxF;ACjCA,SAAS,qBAAqB,WAAA,EAA6B;AACzD,EAAA,OAAO,YAAY,OAAA,CAAQ,cAAA,EAAgB,EAAE,CAAA,CAAE,OAAA,CAAQ,QAAQ,EAAE,CAAA;AACnE;AAEA,SAAS,mBAAmB,SAAA,EAA2B;AACrD,EAAA,OAAO,UAAU,KAAA,CAAM,GAAG,CAAA,CAAE,EAAA,CAAG,EAAE,CAAA,IAAK,SAAA;AACxC;AAEO,SAAS,aAAA,CAAc;AAAA,EAC5B,WAAA;AAAA,EACA,KAAA;AAAA,EACA,UAAA;AAAA,EACA,KAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA4C;AAC1C,EAAA,IAAI,WAAA,IAAe,QAAQ,WAAA,CAAY,MAAA,KAAW,KAAK,UAAA,CAAW,MAAA,KAAW,GAAG,OAAO,IAAA;AAEvF,EAAA,MAAM,MAAA,GAAS,qBAAqB,WAAW,CAAA;AAC/C,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,GAAA,CAAI,CAAC,SAAA,KAAc,CAAA,EAAG,kBAAA,CAAmB,SAAS,CAAC,CAAA,EAAA,CAAI,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAC1F,EAAA,MAAM,IAAA,GAAO,CAAA,QAAA,EAAW,MAAM,CAAA,MAAA,EAAS,KAAK,CAAA,iBAAA,CAAA;AAC5C,EAAA,MAAM,cAAc,KAAA,IAAS,IAAA,GAAO,QAAS,EAAE,GAAG,OAAO,KAAA,EAAM;AAE/D,EAAA,uBACED,GAAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MACE,GAAG,KAAA;AAAA,MACJ,YAAA,EAAY,KAAA,CAAM,YAAY,CAAA,IAAK,mBAAA;AAAA,MACnC,IAAA;AAAA,MACA,GAAA,EAAK,KAAA,CAAM,MAAA,KAAW,QAAA,GAAW,eAAe,KAAA,CAAM,GAAA;AAAA,MACtD,KAAA,EAAO,WAAA;AAAA,MACR,QAAA,EAAA;AAAA;AAAA,GAED;AAEJ;ACzBA,IAAM,oBAAA,GAAuBE,cAAyC,IAAI,CAAA;AAOnE,SAAS,qBAAA,CAAsB;AAAA,EACpC,KAAA;AAAA,EACA;AACF,CAAA,EAA6C;AAC3C,EAAA,uBAAOF,GAAAA,CAAC,oBAAA,CAAqB,UAArB,EAA8B,KAAA,EAAO,OAAQ,QAAA,EAAS,CAAA;AAChE;AAEA,SAAS,qBAAA,GAA4C;AACnD,EAAA,MAAM,KAAA,GAAQG,WAAW,oBAAoB,CAAA;AAC7C,EAAA,IAAI,UAAU,IAAA,EAAM;AAClB,IAAA,MAAM,IAAI,MAAM,gEAAgE,CAAA;AAAA,EAClF;AACA,EAAA,OAAO,KAAA;AACT;AAGO,SAAS,gBAAA,GAA0C;AACxD,EAAA,MAAM,QAAQ,qBAAA,EAAsB;AACpC,EAAA,OAAO,qBAAqB,KAAA,CAAM,SAAA,EAAW,KAAA,CAAM,WAAA,EAAa,MAAM,WAAW,CAAA;AACnF;AAGO,SAAS,mBAAmB,UAAA,EAAkD;AACnF,EAAA,OAAO,gBAAA,GAAmB,QAAA,CAAS,IAAA,CAAK,CAAC,OAAA,KAAY,OAAA,CAAQ,EAAA,KAAO,UAAU,CAAA,EAAG,QAAA;AACnF;AAGO,SAAS,oBAAA,GAAyC;AACvD,EAAA,OAAO,kBAAiB,CAAE,MAAA;AAC5B;;;AC7CO,IAAMC,YAAAA,GAAc,CAAC,CAAA,KAAqB;AAM/C,EAAA,IAAI,EAAE,QAAA,KAAa,KAAA,IAAS,OAAO,QAAA,CAAS,CAAA,CAAE,MAAM,CAAA,EAAG;AACrD,IAAA,MAAM,QAAA,GAAW,EAAE,MAAA,GAAS,CAAA;AAC5B,IAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAM,KAAK,GAAA,CAAI,CAAA,CAAE,MAAM,CAAC,CAAA;AACzC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,GAAG,EAC/B,QAAA,EAAS,CACT,OAAA,CAAQ,uBAAA,EAAyB,GAAG,CAAA;AACvC,IAAA,OAAO,CAAA,EAAG,QAAA,GAAW,GAAA,GAAM,EAAE,SAAI,KAAK,CAAA,CAAA,EAAI,MAAA,CAAO,GAAA,GAAM,GAAG,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA;AAAA,EAC9E;AACA,EAAA,IAAI,EAAE,QAAA,IAAY,eAAA,CAAgB,IAAA,CAAK,CAAA,CAAE,QAAQ,CAAA,EAAG;AAClD,IAAA,IAAI;AACF,MAAA,OAAO,IAAI,IAAA,CAAK,YAAA,CAAa,KAAA,CAAA,EAAW;AAAA,QACtC,KAAA,EAAO,UAAA;AAAA,QACP,UAAU,CAAA,CAAE;AAAA,OACb,CAAA,CAAE,MAAA,CAAO,CAAA,CAAE,SAAS,GAAG,CAAA;AAAA,IAC1B,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AACA,EAAA,OAAO,IAAI,IAAA,CAAK,YAAA,CAAa,MAAA,EAAW,EAAE,qBAAA,EAAuB,CAAA,EAAG,CAAA,CAAE,MAAA,CAAO,CAAA,CAAE,MAAA,GAAS,GAAG,CAAA;AAC7F,CAAA;AAIO,IAAM,kBAAA,GAAqB,CAAC,CAAA,KAAqB;AACtD,EAAA,MAAM,SAAA,GAAYA,aAAY,CAAC,CAAA;AAC/B,EAAA,OAAO,OAAO,QAAA,CAAS,CAAA,CAAE,MAAM,CAAA,IAAK,IAAA,CAAK,MAAM,IAAA,CAAK,GAAA,CAAI,EAAE,MAAM,CAAC,IAAI,GAAA,KAAQ,CAAA,GACzE,UAAU,OAAA,CAAQ,gBAAA,EAAkB,EAAE,CAAA,GACtC,SAAA;AACN,CAAA;AAEO,IAAM,aAAa,CAAC,CAAA,KACzB,MAAA,CAAO,CAAA,IAAK,EAAE,CAAA,CAAE,OAAA;AAAA,EACd,UAAA;AAAA,EACA,CAAC,CAAA,KAAA,CAAO,EAAE,GAAA,EAAK,SAAS,GAAA,EAAK,MAAA,EAAQ,GAAA,EAAK,MAAA,EAAQ,GAAA,EAAK,QAAA,EAAU,GAAA,EAAK,OAAA,IAAW,CAAC;AACpF,CAAA;AAIK,IAAM,eAAA,GAAkB,CAAC,EAAA,KAAuB;AACrD,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA,IAAK,EAAA,GAAK,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,GAAI,CAAA,GAAI,CAAA;AACtE,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,EAAE,CAAA;AACrC,EAAA,MAAM,UAAU,KAAA,GAAQ,EAAA;AACxB,EAAA,OAAO,CAAA,EAAG,MAAA,CAAO,OAAO,CAAA,CAAE,SAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA,EAAI,OAAO,OAAO,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA;AAChF,CAAA;;;ACrDO,IAAM,cAAA,GAAiB,cAAA;AACvB,IAAM,gBAAA,GAAmB,GAAA;AAEzB,IAAM,SAAA,GAAY,OAAA;AAGzB,SAAS,cAAc,MAAA,EAAgD;AACrE,EAAA,MAAM,MAAM,MAAA,CAAO,SAAA;AACnB,EAAA,OAAO,OAAO,GAAA,KAAQ,QAAA,IAAY,IAAI,IAAA,EAAK,KAAM,KAAK,GAAA,GAAM,IAAA;AAC9D;AAGA,SAAS,gBAAgB,MAAA,EAAgD;AACvE,EAAA,MAAM,MAAM,MAAA,CAAO,WAAA;AACnB,EAAA,OAAO,OAAO,GAAA,KAAQ,QAAA,IAAY,IAAI,IAAA,EAAK,KAAM,KAAK,GAAA,GAAM,IAAA;AAC9D;AAIA,SAAS,aAAA,CAAc,OAA8B,SAAA,EAAyC;AAC5F,EAAA,IAAI,KAAA,KAAU,MAAM,OAAO,IAAA;AAC3B,EAAA,OAAO,KAAA,CAAM,MAAM,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,SAAA,KAAc,SAAS,CAAA,IAAK,IAAA;AAC/D;AAEA,IAAM,GAAA,GAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAsBZ,IAAM,UAAA,GAAa,CAAA,6OAAA,CAAA;AAkBZ,IAAM,KAAA,GAAyB;AAAA,EACpC,GAAA,EAAK,SAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKL,IAAA,EAAM,QAAA;AAAA,EACN,GAAA;AAAA,EACA,MAAA,CAAO,EAAE,MAAA,EAAQ,KAAA,EAAO,UAAS,EAAG;AAClC,IAAA,MAAM,SAAA,GAAY,cAAc,MAAM,CAAA;AACtC,IAAA,IAAI,SAAA,KAAc,MAAM,OAAO,EAAA;AAE/B,IAAA,MAAM,IAAA,GAAO,aAAA,CAAc,KAAA,EAAO,SAAS,CAAA;AAC3C,IAAA,MAAM,UAAU,IAAA,KAAS,IAAA;AACzB,IAAA,MAAM,QAAA,GAAW,QAAA,EAAU,GAAA,CAAI,SAAS,CAAA;AAExC,IAAA,MAAM,QAAQ,UAAA,CAAW,QAAA,EAAU,YAAA,IAAgB,IAAA,EAAM,SAAS,QAAQ,CAAA;AAE1E,IAAA,MAAM,WAAA,GAAc,eAAA,CAAgB,MAAM,CAAA,IAAK,UAAU,kBAAA,IAAsB,IAAA;AAC/E,IAAA,MAAM,WAAW,WAAA,GACb,CAAA,8BAAA,EAAiC,UAAA,CAAW,WAAW,CAAC,CAAA,OAAA,CAAA,GACxD,EAAA;AAEJ,IAAA,MAAM,UAAA,GAAa,QAAA,EAAU,KAAA,IAAS,IAAA,EAAM,SAAA,IAAa,IAAA;AACzD,IAAA,MAAM,SAAA,GAAY,aACd,CAAA,+BAAA,EAAkC,UAAA,CAAWA,aAAY,UAAU,CAAC,CAAC,CAAA,OAAA,CAAA,GACrE,EAAA;AAEJ,IAAA,MAAM,KAAA,GAAQ,QAAA,EAAU,QAAA,IAAY,IAAA,EAAM,QAAA,IAAY,IAAA;AACtD,IAAA,MAAM,IAAA,GAAO,QACT,CAAA,iCAAA,EAAoC,UAAA,CAAW,KAAK,CAAC,CAAA,gCAAA,CAAA,GACrD,iCAAiC,UAAU,CAAA,OAAA,CAAA;AAE/C,IAAA,MAAM,aAAa,IAAA,GAAO,CAAA,eAAA,EAAkB,WAAW,IAAA,CAAK,EAAE,CAAC,CAAA,CAAA,CAAA,GAAM,EAAA;AACrE,IAAA,MAAM,UAAA,GAAa,UAAU,MAAA,GAAS,OAAA;AAEtC,IAAA,OAAO,wCAAwC,UAAU,CAAA;AAAA,MAAA,EACrD,IAAI;AAAA,mEAAA,EACyD,KAAK,UAAU,QAAQ,CAAA;AAAA,MAAA,EACpF,SAAS;AAAA,kFAAA,EACmE,UAAU,CAAA,cAAA,EAAiB,KAAK,CAAA,gDAAA,EAAmD,UAAA;AAAA,MAC/J;AAAA,KACD,CAAA,gBAAA,EAAmB,UAAU,CAAA,CAAA,EAAI,UAAU,CAAA;AAAA,UAAA,CAAA;AAAA,EAEhD;AACF,CAAA;;;AC9GO,IAAM,eAAA,GAAkB,EAAA;AAC/B,IAAM,aAAA,GAAgB,GAAA;AAItB,IAAM,wBAAQ,IAAI,GAAA,CAAI,CAAC,SAAA,EAAW,MAAM,CAAC,CAAA;AACzC,IAAM,YAAA,GAAe,SAAA;AAGrB,SAAS,YAAY,MAAA,EAAgD;AACnE,EAAA,MAAM,MAAM,MAAA,CAAO,OAAA;AACnB,EAAA,OAAO,OAAO,GAAA,KAAQ,QAAA,IAAY,MAAA,CAAO,QAAA,CAAS,GAAG,CAAA,IAAK,GAAA,GAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,GAAI,IAAA;AACxF;AAIA,SAAS,SAAS,MAAA,EAAyC;AACzD,EAAA,MAAM,MAAM,MAAA,CAAO,IAAA;AACnB,EAAA,OAAO,OAAO,GAAA,KAAQ,QAAA,IAAY,MAAM,GAAA,CAAI,GAAG,IAAI,GAAA,GAAM,YAAA;AAC3D;AAGA,SAAS,YAAY,MAAA,EAAgD;AACnE,EAAA,MAAM,MAAM,MAAA,CAAO,OAAA;AACnB,EAAA,OAAO,OAAO,GAAA,KAAQ,QAAA,IAAY,IAAI,IAAA,EAAK,KAAM,KAAK,GAAA,GAAM,IAAA;AAC9D;AAEA,IAAMC,IAAAA,GAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAsBL,IAAM,gBAAA,GAAoC;AAAA,EAC/C,GAAA,EAAK,kBAAA;AAAA,EACL,IAAA,EAAM,SAAA;AAAA,EACN,GAAA,EAAAA,IAAAA;AAAA,EACA,MAAA,CAAO,EAAE,MAAA,EAAO,EAAG;AACjB,IAAA,MAAM,UAAU,WAAA,CAAY,MAAM,MAAM,MAAA,CAAO,OAAA,KAAY,SAAY,eAAA,GAAkB,IAAA,CAAA;AACzF,IAAA,IAAI,OAAA,KAAY,MAAM,OAAO,EAAA;AAC7B,IAAA,KAAK,SAAS,MAAM,CAAA;AAEpB,IAAA,MAAM,IAAA,GAAO,eAAA,CAAgB,OAAA,GAAU,aAAa,CAAA;AACpD,IAAA,MAAM,OAAA,GAAU,WAAA,CAAY,MAAM,CAAA,IAAK,0BAAA;AAEvC,IAAA,OAAO,CAAA;AAAA,YAAA,EACG,UAAA,CAAW,OAAO,CAAC,CAAA;AAAA,+EAAA,EACgD,IAAI,CAAA;AAAA;AAAA,UAAA,CAAA;AAAA,EAGnF;AACF,CAAA;;;ACjEO,IAAM,UAAA,GAAa,QAAA;AAInB,IAAM,mBAAA,GAAsB,uBAAA;AAGnC,IAAM,qBAAA,GAAwB,eAAA;AAQvB,SAAS,eAAe,MAAA,EAAoD;AACjF,EAAA,MAAM,MAAM,MAAA,CAAO,KAAA;AACnB,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,SAAU,EAAC;AACjC,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,KAAA,MAAW,SAAS,GAAA,EAAK;AACvB,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA,EAAM;AACjD,IAAA,MAAM,YAAa,KAAA,CAAkC,SAAA;AACrD,IAAA,IAAI,OAAO,SAAA,KAAc,QAAA,IAAY,SAAA,CAAU,IAAA,EAAK,KAAM,EAAA,EAAI,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,CAAA;AAAA,EACzF;AACA,EAAA,OAAO,CAAC,GAAG,IAAI,GAAA,CAAI,GAAG,CAAC,CAAA;AACzB;AAGA,SAAS,UAAU,MAAA,EAAyC;AAC1D,EAAA,MAAM,MAAM,MAAA,CAAO,KAAA;AACnB,EAAA,OAAO,OAAO,GAAA,KAAQ,QAAA,IAAY,IAAI,IAAA,EAAK,KAAM,KAAK,GAAA,GAAM,qBAAA;AAC9D;AAIA,SAAS,eAAe,KAAA,EAAmD;AACzE,EAAA,IAAI,KAAA,KAAU,IAAA,EAAM,uBAAO,IAAI,GAAA,EAAI;AACnC,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAY;AAC5B,EAAA,KAAA,MAAW,IAAA,IAAQ,MAAM,KAAA,EAAO;AAC9B,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,UAAA,GAAa,mBAAmB,CAAA;AACjD,IAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,EAAU,GAAA,CAAI,IAAI,GAAG,CAAA;AACxC,IAAA,IAAI,IAAA,CAAK,SAAA,KAAc,IAAA,IAAQ,IAAA,CAAK,SAAA,KAAc,MAAA,EAAW,GAAA,CAAI,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,SAAS,CAAC,CAAA;AAAA,EAC7F;AACA,EAAA,OAAO,GAAA;AACT;AAEA,IAAM,cAAA,GAAiB,CAAA,sLAAA,CAAA;AACvB,IAAM,eAAA,GAAkB,CAAA,qLAAA,CAAA;AAExB,IAAMA,IAAAA,GAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAyCZ,SAAS,IAAA,CACP,OAAA,EACA,QAAA,EACA,QAAA,EACQ;AACR,EAAA,MAAM,IAAA,GAAO,UAAA,CAAW,OAAA,CAAQ,YAAY,CAAA;AAC5C,EAAA,MAAM,GAAA,GACJ,OAAA,CAAQ,QAAA,KAAa,IAAA,GACjB,iCAAiC,UAAA,CAAW,OAAA,CAAQ,QAAQ,CAAC,UAAU,UAAA,CAAW,OAAA,CAAQ,YAAA,IAAgB,EAAE,CAAC,CAAA,mBAAA,CAAA,GAC7G,CAAA,mDAAA,CAAA;AAEN,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAWD,YAAAA,CAAY,EAAE,MAAA,EAAQ,QAAQ,KAAA,CAAM,MAAA,EAAQ,QAAA,EAAU,CAAC,CAAA;AAChF,EAAA,MAAM,WAAA,GACJ,QAAQ,cAAA,KAAmB,IAAA,IAAQ,QAAQ,cAAA,CAAe,MAAA,GAAS,QAAQ,KAAA,CAAM,MAAA;AACnF,EAAA,MAAM,OAAA,GAAU,WAAA,GACZ,CAAA,2BAAA,EAA8B,UAAA,CAAWA,aAAY,EAAE,MAAA,EAAQ,OAAA,CAAQ,cAAA,CAAgB,MAAA,EAAQ,QAAA,EAAU,CAAC,CAAC,CAAA,IAAA,CAAA,GAC3G,EAAA;AACJ,EAAA,MAAM,OAAA,GAAU,cACZ,IAAA,CAAK,KAAA;AAAA,IAAA,CACD,OAAA,CAAQ,eAAgB,MAAA,GAAS,OAAA,CAAQ,MAAM,MAAA,IAAU,OAAA,CAAQ,eAAgB,MAAA,GACjF;AAAA,GACJ,GACA,CAAA;AACJ,EAAA,MAAM,IAAA,GAAO,OAAA,GAAU,CAAA,GAAI,CAAA,oCAAA,EAAuC,OAAO,CAAA,QAAA,CAAA,GAAa,EAAA;AAEtF,EAAA,MAAM,kBAAA,GACJ,OAAA,CAAQ,KAAA,KAAU,IAAA,IAAQ,OAAA,CAAQ,MAAM,IAAA,EAAK,KAAM,EAAA,IAAM,OAAA,CAAQ,KAAA,KAAU,qBAAA;AAI7E,EAAA,MAAM,cACJ,QAAA,KAAa,MAAA,IAAa,SAAS,MAAA,GAAS,CAAA,GACxC,mIAAmI,QAAA,CAChI,GAAA;AAAA,IACC,CAAC,CAAA,KACC,CAAA,eAAA,EAAkB,WAAW,CAAA,CAAE,EAAE,CAAC,CAAA,CAAA,EAAI,CAAA,CAAE,OAAO,OAAA,CAAQ,EAAA,GAAK,cAAc,EAAE,CAAA,CAAA,EAAI,WAAW,CAAA,CAAE,KAAA,IAAS,EAAE,CAAC,CAAA,SAAA;AAAA,GAC7G,CACC,IAAA,CAAK,EAAE,CAAC,CAAA,gBAAA,CAAA,GACX,kBAAA,GACE,CAAA,sDAAA,EAAyD,UAAA,CAAW,OAAA,CAAQ,KAAM,CAAC,CAAA,cAAA,CAAA,GACnF,EAAA;AAER,EAAA,OAAO,CAAA;AAAA,UAAA,EACG,GAAG;AAAA,qCAAA,EACwB,IAAI,CAAA;AAAA,mEAAA,EAC0B,KAAK,CAAA,OAAA,EAAU,OAAO,CAAA,EAAG,IAAI,CAAA;AAAA,UAAA,EACtF,WAAW;AAAA,gGAAA,EAC2E,UAAA,CAAW,OAAA,CAAQ,EAAE,CAAC,qBAAqB,IAAI,CAAA;AAAA,cAAA,CAAA;AAEjJ;AAeO,IAAM,cAAA,GAAkC;AAAA,EAC7C,GAAA,EAAK,UAAA;AAAA,EACL,IAAA,EAAM,aAAA;AAAA,EACN,GAAA,EAAAC,IAAAA;AAAA,EACA,OAAO,EAAE,MAAA,EAAQ,KAAA,EAAO,QAAA,EAAU,iBAAgB,EAAG;AACnD,IAAA,IAAI,QAAA,KAAa,MAAA,IAAa,QAAA,CAAS,IAAA,KAAS,GAAG,OAAO,EAAA;AAC1D,IAAA,MAAM,MAAA,GAAS,eAAe,KAAK,CAAA;AACnC,IAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,MAAM,CAAA,CAChC,MAAA,CAAO,CAAC,EAAA,KAAO,CAAC,MAAA,CAAO,GAAA,CAAI,EAAE,CAAC,CAAA,CAC9B,IAAI,CAAC,EAAA,KAAO,QAAA,CAAS,GAAA,CAAI,EAAE,CAAC,CAAA,CAC5B,MAAA,CAAO,CAAC,OAAA,KAAsC,OAAA,KAAY,MAAS,CAAA,CACnE,GAAA;AAAA,MAAI,CAAC,OAAA,KACJ,IAAA;AAAA,QACE,OAAA;AAAA,QACA,KAAA,EAAO,QAAA,IAAY,OAAA,CAAQ,KAAA,CAAM,QAAA;AAAA,QACjC,QAAQ,aAAA,KAAkB,IAAA,GAAO,iBAAiB,GAAA,CAAI,OAAA,CAAQ,aAAa,CAAA,GAAI;AAAA;AACjF,KACF,CACC,KAAK,EAAE,CAAA;AACV,IAAA,IAAI,KAAA,KAAU,IAAI,OAAO,EAAA;AAEzB,IAAA,OAAO,CAAA;AAAA,+BAAA,EACsB,UAAA,CAAW,SAAA,CAAU,MAAM,CAAC,CAAC,CAAA;AAAA;AAAA,2GAAA,EAE+C,cAAc,CAAA;AAAA,+CAAA,EAC1E,KAAK,CAAA;AAAA,uGAAA,EACmD,eAAe,CAAA;AAAA;AAAA,cAAA,CAAA;AAAA,EAGtH;AACF,CAAA;;;AC3LA,IAAMA,IAAAA,GAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAiBZ,IAAM,UAAA,GAAa,CAAA,4JAAA,CAAA;AAQZ,IAAM,YAAA,GAAgC;AAAA,EAC3C,GAAA,EAAK,cAAA;AAAA,EACL,IAAA,EAAM,QAAA;AAAA,EACN,GAAA,EAAAA,IAAAA;AAAA,EACA,MAAA,CAAO,EAAE,KAAA,EAAM,EAAG;AAChB,IAAA,MAAM,KAAA,GAAQ,KAAA,EAAO,YAAA,IAAgB,EAAC;AAEtC,IAAA,MAAM,SAAA,GACJ,KAAA,CAAM,MAAA,GAAS,CAAA,GACX,oCAAoC,KAAA,CACjC,GAAA;AAAA,MACC,CAAC,IAAA,KACC,CAAA,uCAAA,EAA0C,UAAA,CAAW,IAAI,CAAC,CAAA,0GAAA,EAA6G,UAAA,CAAW,IAAI,CAAC,CAAA,mCAAA,EAAsC,UAAA,CAAW,IAAI,CAAC,KAAK,UAAU,CAAA,gBAAA;AAAA,KAChQ,CACC,IAAA,CAAK,EAAE,CAAC,CAAA,MAAA,CAAA,GACX,EAAA;AAEN,IAAA,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA,QAAA,EAID,SAAA,GAAY;AAAA,EAAA,EAAO,SAAS,KAAK,EAAE;AAAA,MAAA,CAAA;AAAA,EAE3C;AACF,CAAA;;;AChDA,SAAS,cAAc,MAAA,EAAgD;AACrE,EAAA,MAAM,MAAM,MAAA,CAAO,SAAA;AACnB,EAAA,OAAO,OAAO,GAAA,KAAQ,QAAA,IAAY,MAAA,CAAO,QAAA,CAAS,GAAG,CAAA,IAAK,GAAA,GAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,GAAI,IAAA;AACxF;AAEA,SAASC,YAAAA,CACP,QACA,GAAA,EACe;AACf,EAAA,MAAM,GAAA,GAAM,OAAO,GAAG,CAAA;AACtB,EAAA,OAAO,OAAO,GAAA,KAAQ,QAAA,IAAY,IAAI,IAAA,EAAK,KAAM,KAAK,GAAA,GAAM,IAAA;AAC9D;AAKA,SAAS,cAAA,CAAe,UAAkB,MAAA,EAAwB;AAChE,EAAA,OAAO,SACJ,KAAA,CAAM,aAAa,CAAA,CACnB,GAAA,CAAI,CAAC,IAAA,KAAS,UAAA,CAAW,IAAI,CAAC,EAC9B,IAAA,CAAK,CAAA,GAAA,EAAM,UAAA,CAAW,MAAM,CAAC,CAAA,IAAA,CAAM,CAAA;AACxC;AAEA,IAAM,SAAA,GAAY,CAAA,qQAAA,CAAA;AAElB,IAAMD,IAAAA,GAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AA2BL,IAAM,eAAA,GAAmC;AAAA,EAC9C,GAAA,EAAK,iBAAA;AAAA,EACL,IAAA,EAAM,cAAA;AAAA,EACN,GAAA,EAAAA,IAAAA;AAAA,EACA,MAAA,CAAO,EAAE,MAAA,EAAQ,KAAA,EAAM,EAAG;AACxB,IAAA,MAAM,SAAA,GAAY,cAAc,MAAM,CAAA;AACtC,IAAA,IAAI,SAAA,KAAc,IAAA,IAAQ,KAAA,KAAU,IAAA,EAAM,OAAO,EAAA;AAKjD,IAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,aAAA,EAAe,MAAA,IAAU,CAAA;AACrD,IAAA,MAAM,WAAW,IAAA,CAAK,GAAA,CAAI,GAAG,KAAA,CAAM,QAAA,CAAS,SAAS,aAAa,CAAA;AAClE,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,YAAY,QAAQ,CAAA;AAClD,IAAA,MAAM,WAAW,SAAA,KAAc,CAAA;AAC/B,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,CAAI,GAAA,EAAK,KAAK,KAAA,CAAO,QAAA,GAAW,SAAA,GAAa,GAAG,CAAC,CAAA;AAClE,IAAA,MAAM,iBAAiB,kBAAA,CAAmB;AAAA,MACxC,MAAA,EAAQ,SAAA;AAAA,MACR,QAAA,EAAU,MAAM,QAAA,CAAS;AAAA,KAC1B,CAAA;AAED,IAAA,MAAM,cAAA,GAAiBC,YAAAA,CAAY,MAAA,EAAQ,eAAe,CAAA;AAC1D,IAAA,MAAM,aAAA,GAAgBA,YAAAA,CAAY,MAAA,EAAQ,cAAc,CAAA;AAIxD,IAAA,MAAM,UAAU,QAAA,GACZ,aAAA,KAAkB,OAChB,cAAA,CAAe,aAAA,EAAe,cAAc,CAAA,GAC5C,CAAA,8BAAA,CAAA,GACF,cAAA,KAAmB,IAAA,GACjB,eAAe,cAAA,EAAgB,cAAc,IAC7C,CAAA,OAAA,EAAU,UAAA,CAAW,cAAc,CAAC,CAAA,oCAAA,CAAA;AAE1C,IAAA,OAAO,CAAA,mBAAA,EAAsB,QAAA,GAAW,oBAAA,GAAuB,EAAE,CAAA;AAAA,8BAAA,EACrC,OAAO,CAAA;AAAA,2EAAA,EACsC,GAAG,CAAA;AAAA,iCAAA,EAC7C,SAAS,CAAA,MAAA,EAAS,QAAA,GAAW,EAAA,GAAK,YAAK,CAAA;AAAA,UAAA,CAAA;AAAA,EAExE;AACF,CAAA;;;AC7FA,IAAM,4BAAY,IAAI,GAAA,CAAI,CAAC,cAAA,EAAgB,aAAa,CAAC,CAAA;AACzD,IAAM,gBAAA,GAAmB,cAAA;AAGzB,IAAM,yBAAS,IAAI,GAAA,CAAI,CAAC,OAAA,EAAS,SAAS,CAAC,CAAA;AAC3C,IAAM,aAAA,GAAgB,OAAA;AAGtB,SAAS,QAAA,CACP,MAAA,EACA,GAAA,EACA,OAAA,EACA,QAAA,EACQ;AACR,EAAA,MAAM,GAAA,GAAM,OAAO,GAAG,CAAA;AACtB,EAAA,OAAO,OAAO,GAAA,KAAQ,QAAA,IAAY,QAAQ,GAAA,CAAI,GAAG,IAAI,GAAA,GAAM,QAAA;AAC7D;AAGA,SAAS,UAAU,KAAA,EAAgE;AACjF,EAAA,OAAA,CAAQ,KAAA,IAAS,EAAC,EAAG,MAAA,CAAO,CAAC,KAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,QAAA,EAAU,CAAC,CAAA;AAC7D;AAEA,IAAMD,IAAAA,GAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAmBZ,IAAM,SAAA,GAAY,CAAA,kQAAA,CAAA;AASX,IAAM,YAAA,GAAgC;AAAA,EAC3C,GAAA,EAAK,cAAA;AAAA,EACL,SAAA,EAAW,QAAA;AAAA,EACX,GAAA,EAAAA,IAAAA;AAAA,EACA,MAAA,CAAO,EAAE,MAAA,EAAQ,KAAA,EAAM,EAAG;AACxB,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,MAAA,EAAQ,UAAA,EAAY,WAAW,gBAAgB,CAAA;AACzE,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,MAAA,EAAQ,OAAA,EAAS,QAAQ,aAAa,CAAA;AAC7D,IAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,KAAA,EAAO,KAAK,CAAA;AACpC,IAAA,MAAM,KAAA,GAAQ,KAAA,GAAQ,CAAA,GAAI,CAAA,6CAAA,EAAgD,KAAK,CAAA,OAAA,CAAA,GAAY,EAAA;AAC3F,IAAA,OAAO,CAAA;AAAA,4BAAA,EACmB,QAAQ,CAAA,SAAA,EAAY,KAAK,CAAA,EAAA,EAAK,SAAS,GAAG,KAAK,CAAA,SAAA,CAAA;AAAA,EAC3E;AACF,CAAA;;;AC5CO,IAAM,iBAAA,GAA4C;AAAA,EACvD,IAAA,EAAM,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA;AAAA,EAWN,UAAA,EAAY,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA;AAAA,EAQZ,IAAA,EAAM,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA;AAAA,EAQN,OAAA,EAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA;AAAA,EAQT,QAAA,EAAU,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA;AAAA,EAuBV,GAAA,EAAK,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA;AAAA,EA2CL,QAAA,EAAU,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA;AAAA,EAQV,MAAA,EAAQ,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA;AAAA,EAQR,WAAA,EAAa,CAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA;AAAA,EAKb,YAAA,EAAc,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA;AAYhB,CAAA;;;ACzJA,IAAM,aAAa,IAAI,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,iBAAiB,CAAC,CAAA;AAGzD,IAAM,cAAA,GAAoC,CAAC,MAAA,EAAQ,YAAA,EAAc,QAAQ,QAAQ,CAAA;AAOjF,SAAS,WAAW,MAAA,EAAkD;AACpE,EAAA,MAAM,MAAM,MAAA,CAAO,MAAA;AACnB,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,GAAG,GAAG,OAAO,IAAA;AAChC,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,QAAQ,GAAA,EAAK;AACtB,IAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,UAAA,CAAW,GAAA,CAAI,IAAI,CAAA,IAAK,CAAC,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,EAAG;AACvE,MAAA,IAAA,CAAK,IAAI,IAAI,CAAA;AACb,MAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,IACjB;AAAA,EACF;AACA,EAAA,OAAO,KAAA,CAAM,MAAA,GAAS,CAAA,GAAI,KAAA,GAAQ,IAAA;AACpC;AAEA,IAAMA,IAAAA,GAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAeL,IAAM,WAAA,GAA+B;AAAA,EAC1C,GAAA,EAAK,aAAA;AAAA,EACL,IAAA,EAAM,gBAAA;AAAA,EACN,GAAA,EAAAA,IAAAA;AAAA,EACA,MAAA,CAAO,EAAE,MAAA,EAAO,EAAG;AACjB,IAAA,MAAM,MAAA,GAAS,UAAA,CAAW,MAAM,CAAA,IAAK,cAAA;AACrC,IAAA,MAAM,QAAQ,MAAA,CACX,GAAA;AAAA,MACC,CAAC,GAAA,KAAQ,CAAA,uCAAA,EAA0C,GAAG,CAAA,EAAA,EAAK,iBAAA,CAAkB,GAAG,CAAC,CAAA,OAAA;AAAA,KACnF,CACC,KAAK,EAAE,CAAA;AACV,IAAA,OAAO,uBAAuB,KAAK,CAAA,MAAA,CAAA;AAAA,EACrC;AACF,CAAA;;;AC9CO,IAAM,OAAA,GAAsC;AAAA,EACjD,eAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,KAAA;AAAA,EACA,gBAAA;AAAA,EACA,cAAA;AAAA,EACA;AACF,CAAA;;;ACNA,IAAM,GAAA,GAAM,kBAAA;AAGZ,IAAM,qBAAA,GAAwB,kBAAA;AAC9B,IAAM,aAAA,GAAgB,GAAA;AACtB,IAAME,cAAAA,GAAgB,GAAA;AAEtB,IAAM,UAAA,GAAsD;AAAA,EAC1D,MAAA,EAAQ,cAAA;AAAA,EACR,UAAA,EAAY,mBAAA;AAAA,EACZ,OAAA,EAAS,eAAA;AAAA,EACT,IAAA,EAAM,YAAA;AAAA,EACN,UAAA,EAAY,YAAA;AAAA,EACZ,MAAA,EAAQ;AACV,CAAA;AAEA,IAAMC,OAAAA,GAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAuGf,IAAM,SAAA,GAAY,CAAA,4JAAA,CAAA;AAClB,IAAM,SAAA,GAAY,CAAA,mMAAA,CAAA;AAClB,IAAM,OAAA,GAAU,CAAA,uMAAA,CAAA;AAChB,IAAM,OAAA,GAAU,CAAA,6OAAA,CAAA;AAIhB,IAAM,IAAA,GACJ,OAAO,WAAA,KAAgB,WAAA,GAAc,cAAe,MAAM;AAAC,CAAA;AAEtD,IAAM,gBAAA,GAAN,MAAM,iBAAA,SAAyB,IAAA,CAAK;AAAA,EACzC,OAAgB,OAAA,GAAU,GAAA;AAAA,EAC1B,OAAO,QAAA,GAAiB;AACtB,IAAA,IAAI,CAAC,eAAe,GAAA,CAAI,GAAG,GAAG,cAAA,CAAe,MAAA,CAAO,KAAK,iBAAgB,CAAA;AAAA,EAC3E;AAAA,EAEA,QAAA,GAA+B,IAAA;AAAA,EAC/B,cAAA,GAAuC,IAAA;AAAA;AAAA,EAEvC,eAAA,GAA6D,IAAA;AAAA,EAC7D,oBAAA,GAAuB,KAAA;AAAA;AAAA,EAEvB,gBAAA,uBAAuB,GAAA,EAA6C;AAAA,EACpE,wBAAA,uBAA+B,GAAA,EAAY;AAAA;AAAA,EAE3C,UAAA,GAAoC,IAAA;AAAA,EACpC,oBAAA,GAAuB,KAAA;AAAA,EACvB,aAAA,GAAgB,KAAA;AAAA,EAChB,cAAA,GAAiB,KAAA;AAAA,EACjB,gBAAA,GAAmB,KAAA;AAAA,EACnB,YAAA,GAAe,KAAA;AAAA,EACf,KAAA,GAAQ,KAAA;AAAA,EACR,KAAA;AAAA,EACA,WAA4E,EAAC;AAAA,EAC7E,kBAAA,GAAqB,KAAA;AAAA,EACrB,gBAAA,GAA0D,IAAA;AAAA,EAC1D,WAAA,GAA6B,IAAA;AAAA,EAC7B,UAAA,GAAa,CAAC,CAAA,KAA2B;AACvC,IAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,QAAA,EAAU,IAAA,CAAK,KAAA,EAAM;AAAA,EACrC,CAAA;AAAA,EAEA,WAAA,GAAc;AACZ,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,YAAA,CAAa,EAAE,IAAA,EAAM,QAAQ,CAAA;AAC/C,IAAA,IAAA,CAAK,MAAM,SAAA,GAAY;AAAA,aAAA,EACZA,OAAM,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sGAAA,EAMmF,SAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4CAAA,CAAA;AAoB7G,IAAA,IAAA,CAAK,KAAA,CAAM,cAAc,gBAAgB,CAAA,EAAG,iBAAiB,OAAA,EAAS,MAAM,IAAA,CAAK,KAAA,EAAO,CAAA;AACxF,IAAA,IAAA,CAAK,MAAM,aAAA,CAAc,eAAe,GAAG,gBAAA,CAAiB,OAAA,EAAS,CAAC,CAAA,KAAM;AAC1E,MAAA,IAAK,EAAE,MAAA,EAA2B,OAAA,CAAQ,wBAAwB,CAAA,EAAG,KAAK,KAAK,IAAA,EAAK;AAAA,IACtF,CAAC,CAAA;AACD,IAAA,IAAA,CAAK,MAAM,aAAA,CAAc,QAAQ,GAAG,gBAAA,CAAiB,OAAA,EAAS,CAAC,CAAA,KAAM;AACnE,MAAA,MAAM,SAAS,CAAA,CAAE,MAAA;AACjB,MAAA,IAAI,MAAA,EAAQ,OAAA,CAAQ,yBAAyB,CAAA,EAAG;AAC9C,QAAA,IAAA,CAAK,KAAA,EAAM;AACX,QAAA;AAAA,MACF;AACA,MAAA,MAAM,MAAA,GAAS,MAAA,EAAQ,OAAA,CAAQ,2BAA2B,CAAA;AAC1D,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,KAAK,IAAA,CAAK,MAAA,CAAO,MAAA,EAAQ,EAAE,CAAA;AAC3B,QAAA;AAAA,MACF;AACA,MAAA,MAAM,MAAA,GAAS,MAAA,EAAQ,OAAA,CAAQ,2BAA2B,CAAA;AAC1D,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,KAAK,IAAA,CAAK,MAAA,CAAO,MAAA,EAAQ,CAAC,CAAA;AAC1B,QAAA;AAAA,MACF;AACA,MAAA,MAAM,UAAA,GAAa,MAAA,EAAQ,OAAA,CAAQ,+BAA+B,CAAA;AAClE,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,KAAK,IAAA,CAAK,cAAc,UAAU,CAAA;AAClC,QAAA;AAAA,MACF;AACA,MAAA,MAAM,MAAA,GAAS,MAAA,EAAQ,OAAA,CAAQ,gCAAgC,CAAA;AAC/D,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,KAAK,IAAA,CAAK,eAAe,MAAM,CAAA;AAC/B,QAAA;AAAA,MACF;AACA,MAAA,MAAM,SAAA,GAAY,MAAA,EAAQ,OAAA,CAAQ,8BAA8B,CAAA;AAChE,MAAA,IAAI,SAAA,EAAW,KAAK,IAAA,CAAK,YAAA,CAAa,SAAS,CAAA;AAC/C,MAAA,MAAM,YAAY,MAAA,EAAQ,OAAA;AAAA,QACxB;AAAA,OACF;AACA,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,IAAA,CAAK,aAAa,SAAS,CAAA;AAC3B,QAAA;AAAA,MACF;AACA,MAAA,MAAM,aAAA,GAAgB,MAAA,EAAQ,OAAA,CAAQ,kCAAkC,CAAA;AACxE,MAAA,IAAI,aAAA,EAAe;AACjB,QAAA,KAAK,IAAA,CAAK,iBAAiB,aAAa,CAAA;AACxC,QAAA;AAAA,MACF;AACA,MAAA,MAAM,cAAA,GAAiB,MAAA,EAAQ,OAAA,CAAQ,mCAAmC,CAAA;AAC1E,MAAA,IAAI,cAAA,EAAgB,KAAK,IAAA,CAAK,iBAAA,CAAkB,cAAc,CAAA;AAAA,IAChE,CAAC,CAAA;AACD,IAAA,IAAA,CAAK,MAAM,aAAA,CAAc,QAAQ,GAAG,gBAAA,CAAiB,QAAA,EAAU,CAAC,CAAA,KAAM;AACpE,MAAA,MAAM,MAAA,GAAU,CAAA,CAAE,MAAA,EAA2B,OAAA,CAAQ,2BAA2B,CAAA;AAChF,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,KAAK,IAAA,CAAK,iBAAiB,MAAM,CAAA;AACjC,QAAA;AAAA,MACF;AACA,MAAA,MAAM,YAAA,GAAgB,CAAA,CAAE,MAAA,EAA2B,OAAA,CAAQ,kCAAkC,CAAA;AAC7F,MAAA,IAAI,YAAA,EAAc,IAAA,CAAK,sBAAA,CAAuB,YAAY,CAAA;AAAA,IAC5D,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,iBAAA,GAA0B;AAGxB,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,IAAY,CAAC,IAAA,CAAK,gBAAe,EAAG;AAC9C,IAAA,KAAK,IAAA,CAAK,QAAA,CAAS,OAAA,EAAQ,CAAE,IAAA,CAAK,CAAC,KAAA,KAAU,IAAA,CAAK,aAAA,CAAc,KAAK,CAAC,CAAA;AAAA,EACxE;AAAA,EAEA,oBAAA,GAA6B;AAC3B,IAAA,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,IAAA,CAAK,UAAU,CAAA;AACvD,IAAA,IAAI,IAAA,CAAK,qBAAqB,IAAA,EAAM;AAClC,MAAA,aAAA,CAAc,KAAK,gBAAgB,CAAA;AACnC,MAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AAAA,IAC1B;AAAA,EACF;AAAA,EAEA,IAAI,MAAA,GAAkB;AACpB,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA,EAEA,WAAW,OAAA,EAA4B;AACrC,IAAA,IAAA,CAAK,QAAA,GAAW,OAAA;AAAA,EAClB;AAAA;AAAA;AAAA,EAIA,iBAAiB,MAAA,EAA6B;AAC5C,IAAA,IAAA,CAAK,cAAA,GAAiB,MAAA;AAAA,EACxB;AAAA,EAEA,YAAY,QAAA,EAAmC;AAC7C,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,MAAM,KAAK,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,EAAG;AACtD,MAAA,MAAM,KAAA,GAAQ,SAAS,GAA8B,CAAA;AACrD,MAAA,IAAI,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,QAAQ,KAAK,CAAA;AAAA,IACjD;AAAA,EACF;AAAA,EAEA,WACE,OAAA,EACM;AACN,IAAA,IAAA,CAAK,QAAA,GAAW,WAAW,EAAC;AAAA,EAC9B;AAAA,EAEA,MAAM,IAAA,GAAsB;AAC1B,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AACb,IAAA,IAAA,CAAK,YAAA,CAAa,QAAQ,EAAE,CAAA;AAC5B,IAAA,IAAA,CAAK,OAAA,EAAQ,EAAG,YAAA,CAAa,aAAA,EAAe,OAAO,CAAA;AACnD,IAAA,QAAA,CAAS,gBAAA,CAAiB,SAAA,EAAW,IAAA,CAAK,UAAU,CAAA;AACpD,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,QAAA,CAAS,OAAA,EAAQ;AAC3C,MAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,mBAAA,CAAoB,MAAM,CAAA;AACnD,MAAA,IAAA,CAAK,YAAY,KAAK,CAAA;AACtB,MAAA,IAAA,CAAK,cAAc,KAAK,CAAA;AAAA,IAC1B;AAKA,IAAA,KAAK,KAAK,sBAAA,EAAuB,CAAE,KAAK,MAAM,IAAA,CAAK,yBAAyB,CAAA;AAAA,EAC9E;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,cAAA,CACJ,SAAA,EACA,QAAA,EACA,UAAA,EACe;AACf,IAAA,IAAI,KAAK,YAAA,EAAc;AACvB,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,IAAA,IAAI;AACF,MAAA,MAAM,KAAK,IAAA,EAAK;AAChB,MAAA,IAAI,KAAK,QAAA,EAAU;AACjB,QAAA,MAAM,QAAQ,MAAM,IAAA,CAAK,SAAS,OAAA,CAAQ,SAAA,EAAW,UAAU,UAAU,CAAA;AACzE,QAAA,IAAA,CAAK,YAAY,KAAK,CAAA;AACtB,QAAA,IAAA,CAAK,cAAc,KAAK,CAAA;AAAA,MAC1B;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,YAAA,GAAe,KAAA;AAAA,IACtB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,uBAAA,GAAyC;AAC7C,IAAA,MAAM,SAAS,IAAA,CAAK,cAAA;AACpB,IAAA,IAAI,CAAC,MAAA,EAAQ,oBAAA,IAAwB,IAAA,CAAK,eAAe,IAAA,EAAM;AAC/D,IAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAChC,IAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,UAAA,CAAW,KAAA,EAAO;AACxC,MAAA,MAAM,SAAS,IAAA,CAAK,aAAA;AACpB,MAAA,IACE,OAAO,WAAW,QAAA,IAClB,MAAA,CAAO,SAAS,CAAA,IAChB,IAAA,CAAK,iBAAiB,IAAA,IACtB,CAAC,KAAK,gBAAA,CAAiB,GAAA,CAAI,MAAM,CAAA,IACjC,CAAC,KAAK,wBAAA,CAAyB,GAAA,CAAI,MAAM,CAAA,EACzC;AACA,QAAA,OAAA,CAAQ,IAAI,MAAM,CAAA;AAAA,MACpB;AAAA,IACF;AACA,IAAA,KAAA,MAAW,WAAW,IAAA,CAAK,eAAA,EAAiB,MAAA,EAAO,IAAK,EAAC,EAAG;AAC1D,MAAA,MAAM,SAAS,OAAA,CAAQ,aAAA;AACvB,MAAA,IACE,WAAW,IAAA,IACX,MAAA,CAAO,MAAA,GAAS,CAAA,IAChB,CAAC,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,MAAM,KACjC,CAAC,IAAA,CAAK,wBAAA,CAAyB,GAAA,CAAI,MAAM,CAAA,EACzC;AACA,QAAA,OAAA,CAAQ,IAAI,MAAM,CAAA;AAAA,MACpB;AAAA,IACF;AACA,IAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACxB,IAAA,MAAM,OAAA,CAAQ,GAAA;AAAA,MACZ,CAAC,GAAG,OAAO,CAAA,CAAE,GAAA,CAAI,OAAO,MAAA,KAAW;AACjC,QAAA,IAAA,CAAK,wBAAA,CAAyB,IAAI,MAAM,CAAA;AACxC,QAAA,IAAI;AACF,UAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,oBAAA,CAAsB,MAAM,CAAA;AAC1D,UAAA,IAAI,SAAS,MAAA,GAAS,CAAA,OAAQ,gBAAA,CAAiB,GAAA,CAAI,QAAQ,QAAQ,CAAA;AAAA,QACrE,CAAA,SAAE;AACA,UAAA,IAAA,CAAK,wBAAA,CAAyB,OAAO,MAAM,CAAA;AAAA,QAC7C;AAAA,MACF,CAAC;AAAA,KACH;AACA,IAAA,IAAI,IAAA,CAAK,SAAS,IAAA,CAAK,UAAA,KAAe,MAAM,IAAA,CAAK,WAAA,CAAY,KAAK,UAAU,CAAA;AAAA,EAC9E;AAAA;AAAA;AAAA,EAIA,MAAM,iBAAiB,MAAA,EAAgC;AACrD,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,YAAA,EAAc;AACzC,IAAA,IAAI,EAAE,kBAAkB,iBAAA,CAAA,EAAoB;AAC5C,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,YAAA,CAAa,cAAc,CAAA;AACjD,IAAA,MAAM,kBAAkB,MAAA,CAAO,KAAA;AAC/B,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,MAAA,CAAO,YAAA,CAAa,UAAU,CAAC,CAAA;AAClD,IAAA,IAAI,CAAC,MAAA,IAAU,CAAC,eAAA,IAAmB,CAAC,OAAO,QAAA,CAAS,GAAG,CAAA,IAAK,GAAA,IAAO,CAAA,EAAG;AACtE,IAAA,MAAM,IAAA,GAAO,KAAK,UAAA,EAAY,KAAA,CAAM,KAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,MAAM,CAAA;AAC/D,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,IAAA,IAAI;AACF,MAAA,MAAM,KAAK,QAAA,CAAS,OAAA,CAAQ,eAAA,EAAiB,GAAA,EAAK,MAAM,UAAU,CAAA;AAClE,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,QAAA,CAAS,WAAW,MAAM,CAAA;AAClD,MAAA,IAAA,CAAK,YAAY,IAAI,CAAA;AACrB,MAAA,IAAA,CAAK,cAAc,IAAI,CAAA;AAAA,IACzB,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,YAAA,GAAe,KAAA;AAAA,IACtB;AAEA,IAAA,KAAK,KAAK,uBAAA,EAAwB;AAAA,EACpC;AAAA;AAAA,EAGA,iBAAA,GAAuC;AACrC,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,UAAU,CAAA;AACpC,IAAA,IAAI,GAAA,EAAK,OAAA,KAAY,IAAA,EAAM,OAAO,EAAC;AACnC,IAAA,OAAO,eAAe,GAAG,CAAA;AAAA,EAC3B;AAAA;AAAA;AAAA,EAIA,eAAA,GAAiC;AAC/B,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,SAAS,CAAA;AACnC,IAAA,IAAI,GAAA,EAAK,OAAA,KAAY,IAAA,EAAM,OAAO,IAAA;AAClC,IAAA,MAAM,MAAM,GAAA,CAAI,SAAA;AAChB,IAAA,OAAO,OAAO,GAAA,KAAQ,QAAA,IAAY,IAAI,IAAA,EAAK,KAAM,KAAK,GAAA,GAAM,IAAA;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,sBAAA,GAAwC;AAC5C,IAAA,IAAI,CAAC,KAAK,cAAA,EAAgB;AAC1B,IAAA,IAAI,KAAK,eAAA,KAAoB,IAAA,IAAQ,IAAA,CAAK,eAAA,CAAgB,OAAO,CAAA,EAAG;AACpE,IAAA,IAAI,KAAK,oBAAA,EAAsB;AAC/B,IAAA,MAAM,GAAA,GAAM,CAAC,GAAG,IAAA,CAAK,mBAAmB,CAAA;AACxC,IAAA,MAAM,OAAA,GAAU,KAAK,eAAA,EAAgB;AACrC,IAAA,IAAI,OAAA,KAAY,QAAQ,CAAC,GAAA,CAAI,SAAS,OAAO,CAAA,EAAG,GAAA,CAAI,IAAA,CAAK,OAAO,CAAA;AAChE,IAAA,IAAI,GAAA,CAAI,WAAW,CAAA,EAAG;AACtB,IAAA,IAAA,CAAK,oBAAA,GAAuB,IAAA;AAC5B,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,cAAA,CAAe,cAAc,GAAG,CAAA;AAC5D,MAAA,IAAA,CAAK,eAAA,GAAkB,IAAI,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,EAAA,EAAI,CAAC,CAAC,CAAC,CAAA;AAAA,IAC/D,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,oBAAA,GAAuB,KAAA;AAAA,IAC9B;AACA,IAAA,IAAI,IAAA,CAAK,SAAS,IAAA,CAAK,UAAA,KAAe,MAAM,IAAA,CAAK,cAAA,CAAe,KAAK,UAAU,CAAA;AAAA,EACjF;AAAA,EAEA,MAAM,oBAAoB,KAAA,EAAgD;AACxE,IAAA,IAAI,IAAA,CAAK,oBAAA,IAAwB,CAAC,IAAA,CAAK,UAAU,OAAO,KAAA;AAGxD,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA,CAAE,IAAA;AAAA,MACzC,CAAC,CAAA,KACC,CAAA,EAAG,OAAA,KAAY,IAAA,IACd,EAA8B,SAAA,KAAc,IAAA,IAC7C,OAAQ,CAAA,CAA8B,SAAA,KAAc;AAAA,KACxD;AACA,IAAA,IAAI,CAAC,KAAA,EAAO,SAAA,EAAW,OAAO,KAAA;AAE9B,IAAA,IAAA,CAAK,oBAAA,GAAuB,IAAA;AAC5B,IAAA,MAAM,OAAA,GAAU,MAAM,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAA,KAAc,KAAA,CAAM,SAAS,CAAA;AACvE,IAAA,IAAI,SAAS,OAAO,KAAA;AACpB,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,KAAA,CAAM,SAAA,EAAW,CAAA,EAAG,EAAE,CAAC,cAAc,GAAG,gBAAA,EAAkB,CAAA;AAAA,EACzF;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,gBAAgB,MAAM,CAAA;AAC3B,IAAA,IAAA,CAAK,OAAA,EAAQ,EAAG,YAAA,CAAa,aAAA,EAAe,MAAM,CAAA;AAClD,IAAA,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,IAAA,CAAK,UAAU,CAAA;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,sBAAsB,GAAA,EAAqC;AACzD,IAAA,MAAM,OAAO,IAAA,CAAK,UAAA;AAClB,IAAA,MAAM,SAAA,GAAY,KAAK,eAAA,EAAgB;AACvC,IAAA,IAAI,IAAA,KAAS,IAAA,IAAQ,SAAA,KAAc,IAAA,EAAM,OAAO,IAAA;AAChD,IAAA,MAAM,QAAA,GAAW,KAAK,QAAA,CAAS,QAAA;AAC/B,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,eAAA,EAAiB,GAAA,CAAI,SAAS,GAAG,KAAA,IAAS,EAAE,MAAA,EAAQ,CAAY,CAAA;AACnF,MAAA,MAAM,IAAA,GAAsB;AAAA,QAC1B,EAAA,EAAI,wBAAwB,SAAS,CAAA,CAAA;AAAA,QACrC,KAAA,EAAO,EAAA;AAAA,QACP,YAAA,EAAc,IAAA;AAAA,QACd,SAAA;AAAA,QACA,QAAA,EAAU,CAAA;AAAA,QACV,QAAA,EAAU,IAAA;AAAA,QACV,SAAA,EAAW,EAAE,MAAA,EAAQ,KAAA,CAAM,QAAQ,QAAA,EAAS;AAAA,QAC5C,UAAA,EAAY,EAAE,CAAC,cAAc,GAAG,gBAAA;AAAiB,OACnD;AACA,MAAA,OAAO;AAAA,QACL,GAAG,IAAA;AAAA,QACH,KAAA,EAAO,CAAC,GAAG,IAAA,CAAK,OAAO,IAAI,CAAA;AAAA,QAC3B,QAAA,EAAU,EAAE,MAAA,EAAQ,IAAA,CAAK,SAAS,MAAA,GAAS,KAAA,CAAM,QAAQ,QAAA;AAAS,OACpE;AAAA,IACF;AACA,IAAA,MAAM,OAAA,GAAU,KAAK,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,cAAc,SAAS,CAAA;AAChE,IAAA,OAAO;AAAA,MACL,GAAG,IAAA;AAAA,MACH,KAAA,EAAO,KAAK,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,cAAc,SAAS,CAAA;AAAA,MACzD,QAAA,EAAU;AAAA,QACR,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,SAAS,MAAA,IAAU,OAAA,EAAS,SAAA,CAAU,MAAA,IAAU,CAAA,CAAE,CAAA;AAAA,QAC3E;AAAA;AACF,KACF;AAAA,EACF;AAAA,EAEA,MAAM,eAAe,MAAA,EAAgC;AACnD,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,aAAA,EAAe;AAC1C,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,YAAA,CAAa,cAAc,CAAA,KAAM,MAAA;AACxD,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,YAAA,CAAa,cAAc,CAAA;AACjD,IAAA,MAAM,SAAA,GAAY,MAAA,CAAO,YAAA,CAAa,iBAAiB,CAAA;AACvD,IAAA,IAAI,OAAA,GAAU,CAAC,MAAA,GAAS,CAAC,SAAA,EAAW;AAIpC,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,qBAAA,CAAsB,CAAC,OAAO,CAAA;AACtD,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,IAAA,CAAK,YAAY,UAAU,CAAA;AAC3B,MAAA,IAAA,CAAK,cAAc,UAAU,CAAA;AAAA,IAC/B;AAEA,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AACrB,IAAA,IAAI;AACF,MAAA,MAAM,OAAO,OAAA,GACT,MAAM,KAAK,QAAA,CAAS,UAAA,CAAW,MAAO,CAAA,GACtC,MAAM,KAAK,QAAA,CAAS,OAAA,CAAQ,WAAY,CAAA,EAAG,EAAE,CAAC,cAAc,GAAG,kBAAkB,CAAA;AACrF,MAAA,IAAA,CAAK,YAAY,IAAI,CAAA;AACrB,MAAA,IAAA,CAAK,cAAc,IAAI,CAAA;AAAA,IACzB,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,aAAA,GAAgB,KAAA;AAAA,IACvB;AAAA,EACF;AAAA;AAAA,EAGA,aAAa,GAAA,EAAoB;AAC/B,IAAA,MAAM,QAAQ,GAAA,CAAI,OAAA,CAAQ,SAAS,CAAA,EAAG,cAAc,gBAAgB,CAAA;AACpE,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,MAAM,SAAA,GAAY,GAAA,CAAI,YAAA,CAAa,6BAA6B,IAAI,EAAA,GAAK,CAAA;AACzE,IAAA,KAAA,CAAM,QAAA,CAAS,EAAE,IAAA,EAAM,SAAA,GAAY,MAAM,WAAA,EAAa,QAAA,EAAU,UAAU,CAAA;AAAA,EAC5E;AAAA;AAAA;AAAA,EAIA,uBAAuB,MAAA,EAAuB;AAC5C,IAAA,IAAI,EAAE,kBAAkB,iBAAA,CAAA,EAAoB;AAC5C,IAAA,MAAM,SAAS,MAAA,CAAO,OAAA,CAAQ,eAAe,CAAA,EAAG,cAAc,8BAA8B,CAAA;AAC5F,IAAA,IAAI,UAAU,MAAA,CAAO,KAAA,SAAc,YAAA,CAAa,iBAAA,EAAmB,OAAO,KAAK,CAAA;AAAA,EACjF;AAAA,EAEA,MAAM,aAAa,GAAA,EAA6B;AAC9C,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,cAAA,EAAgB;AAC3C,IAAA,MAAM,SAAA,GAAY,GAAA,CAAI,YAAA,CAAa,iBAAiB,CAAA;AACpD,IAAA,IAAI,CAAC,SAAA,EAAW;AAChB,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AACtB,IAAA,IAAI;AACF,MAAA,MAAM,OAAO,MAAM,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,WAAW,CAAA,EAAG;AAAA,QACrD,CAAC,mBAAmB,GAAG;AAAA,OACxB,CAAA;AACD,MAAA,IAAA,CAAK,YAAY,IAAI,CAAA;AACrB,MAAA,IAAA,CAAK,cAAc,IAAI,CAAA;AAAA,IACzB,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,cAAA,GAAiB,KAAA;AAAA,IACxB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,mBAAA,CAAoB,QAAgB,OAAA,EAAwC;AAC1E,IAAA,MAAM,OAAO,IAAA,CAAK,UAAA;AAClB,IAAA,IAAI,IAAA,KAAS,MAAM,OAAO,IAAA;AAC1B,IAAA,MAAM,IAAA,GAAO,KAAK,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,MAAM,CAAA;AACnD,IAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,IAAA,MAAM,QAAA,GAAW,KAAK,QAAA,CAAS,QAAA;AAC/B,IAAA,IAAI,WAAW,CAAA,EAAG;AAChB,MAAA,OAAO;AAAA,QACL,GAAG,IAAA;AAAA,QACH,KAAA,EAAO,KAAK,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,MAAM,CAAA;AAAA,QAC/C,QAAA,EAAU,EAAE,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,QAAA,CAAS,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,MAAM,GAAG,QAAA;AAAS,OAC1F;AAAA,IACF;AACA,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,QAAA,GAAW,CAAA,GAAI,IAAA,CAAK,UAAU,MAAA,GAAS,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,MAAA;AACxF,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,OAAO,CAAA;AAC/C,IAAA,MAAM,MAAA,GAAwB;AAAA,MAC5B,GAAG,IAAA;AAAA,MACH,QAAA,EAAU,OAAA;AAAA,MACV,WAAW,EAAE,MAAA,EAAQ,eAAe,QAAA,EAAU,IAAA,CAAK,UAAU,QAAA,EAAS;AAAA,MACtE,GAAI,IAAA,CAAK,kBAAA,IACP,IAAA,CAAK,WAAW,CAAA,IAAK;AAAA,QACnB,kBAAA,EAAoB;AAAA,UAClB,MAAA,EAAQ,KAAK,KAAA,CAAO,IAAA,CAAK,mBAAmB,MAAA,GAAS,IAAA,CAAK,WAAY,OAAO,CAAA;AAAA,UAC7E,QAAA,EAAU,KAAK,kBAAA,CAAmB;AAAA;AACpC;AACF,KACJ;AACA,IAAA,OAAO;AAAA,MACL,GAAG,IAAA;AAAA,MACH,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,CAAC,MAAO,CAAA,CAAE,EAAA,KAAO,MAAA,GAAS,MAAA,GAAS,CAAE,CAAA;AAAA,MAC3D,QAAA,EAAU;AAAA,QACR,QAAQ,IAAA,CAAK,QAAA,CAAS,MAAA,IAAU,aAAA,GAAgB,KAAK,SAAA,CAAU,MAAA,CAAA;AAAA,QAC/D;AAAA;AACF,KACF;AAAA,EACF;AAAA,EAEA,MAAM,MAAA,CAAO,GAAA,EAAc,KAAA,EAA8B;AACvD,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,YAAA,EAAc;AACzC,IAAA,MAAM,SAAS,GAAA,CAAI,OAAA,CAAQ,gBAAgB,CAAA,EAAG,aAAa,cAAc,CAAA;AACzE,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,GAAA,CAAI,YAAA,CAAa,UAAU,CAAC,CAAA;AACnD,IAAA,IAAI,CAAC,MAAA,IAAU,CAAC,MAAA,CAAO,QAAA,CAAS,OAAO,CAAA,EAAG;AAC1C,IAAA,MAAM,OAAO,OAAA,GAAU,KAAA;AACvB,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,mBAAA,CAAoB,MAAA,EAAQ,IAAI,CAAA;AACxD,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,IAAA,CAAK,YAAY,UAAU,CAAA;AAC3B,MAAA,IAAA,CAAK,cAAc,UAAU,CAAA;AAAA,IAC/B;AACA,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GACJ,IAAA,IAAQ,CAAA,GACJ,MAAM,KAAK,QAAA,CAAS,UAAA,CAAW,MAAM,CAAA,GACrC,MAAM,IAAA,CAAK,QAAA,CAAS,UAAA,CAAW,QAAQ,IAAI,CAAA;AACjD,MAAA,IAAA,CAAK,YAAY,KAAK,CAAA;AACtB,MAAA,IAAA,CAAK,cAAc,KAAK,CAAA;AAAA,IAC1B,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,YAAA,GAAe,KAAA;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,MAAM,cAAc,GAAA,EAA6B;AAC/C,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,YAAA,EAAc;AACzC,IAAA,MAAM,SAAS,GAAA,CAAI,OAAA,CAAQ,gBAAgB,CAAA,EAAG,aAAa,cAAc,CAAA;AACzE,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,mBAAA,CAAoB,MAAA,EAAQ,CAAC,CAAA;AACrD,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,IAAA,CAAK,YAAY,UAAU,CAAA;AAC3B,MAAA,IAAA,CAAK,cAAc,UAAU,CAAA;AAAA,IAC/B;AACA,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,QAAA,CAAS,WAAW,MAAM,CAAA;AACnD,MAAA,IAAA,CAAK,YAAY,KAAK,CAAA;AACtB,MAAA,IAAA,CAAK,cAAc,KAAK,CAAA;AAAA,IAC1B,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,YAAA,GAAe,KAAA;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,MAAM,iBAAiB,QAAA,EAAkC;AACvD,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,gBAAA,EAAkB;AAE7C,IAAA,MAAM,SAAA,GAAY,QAAA,CAAS,OAAA,CAAQ,eAAe,CAAA;AAClD,IAAA,MAAM,KAAA,GAAQ,SAAA,EAAW,aAAA,CAAc,kCAAkC,CAAA;AAIzE,IAAA,MAAM,IAAA,GAAA,CAAQ,KAAA,EAAO,KAAA,IAAS,EAAA,EAAI,IAAA,EAAK;AACvC,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,UAAA,EAAY,YAAA,IAAgB,EAAC;AAClD,IAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AACxB,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,QAAA,CAAS,oBAAoB,CAAC,GAAG,OAAA,EAAS,IAAI,CAAC,CAAA;AACvE,MAAA,IAAA,CAAK,YAAY,IAAI,CAAA;AACrB,MAAA,IAAA,CAAK,cAAc,IAAI,CAAA;AAAA,IACzB,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,gBAAA,GAAmB,KAAA;AAAA,IAC1B;AAAA,EACF;AAAA,EAEA,MAAM,kBAAkB,SAAA,EAAmC;AACzD,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,gBAAA,EAAkB;AAC7C,IAAA,MAAM,IAAA,GAAO,SAAA,CAAU,YAAA,CAAa,WAAW,CAAA;AAC/C,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,UAAA,EAAY,YAAA,IAAgB,EAAC;AAClD,IAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AACxB,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,QAAA,CAAS,mBAAA,CAAoB,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,KAAM,IAAI,CAAC,CAAA;AACtF,MAAA,IAAA,CAAK,YAAY,IAAI,CAAA;AACrB,MAAA,IAAA,CAAK,cAAc,IAAI,CAAA;AAAA,IACzB,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,gBAAA,GAAmB,KAAA;AAAA,IAC1B;AAAA,EACF;AAAA,EAEA,OAAA,GAA0B;AACxB,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,aAAA,CAAc,iBAAiB,CAAA;AAAA,EACnD;AAAA,EAEA,gBAAA,GAAyB;AACvB,IAAA,IAAI,KAAK,kBAAA,EAAoB;AAC7B,IAAA,MAAMH,OAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,GAAG,CAAA,CACjC,MAAA,CAAO,CAAC,CAAA,KAAmB,OAAO,MAAM,QAAA,IAAY,CAAA,CAAE,SAAS,CAAC,CAAA,CAChE,KAAK,IAAI,CAAA;AACZ,IAAA,IAAIA,IAAAA,EAAK;AACP,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,aAAA,CAAc,OAAO,CAAA;AAC9C,MAAA,IAAI,KAAA,QAAa,MAAA,CAAO;AAAA,EAAKA,IAAG,CAAA,CAAE,CAAA;AAAA,IACpC;AACA,IAAA,IAAA,CAAK,kBAAA,GAAqB,IAAA;AAAA,EAC5B;AAAA,EAEA,cAAA,GAA0B;AACxB,IAAA,OAAO,OAAA,CAAQ,IAAA;AAAA,MACb,CAAC,CAAA,KAAA,CAAO,CAAA,CAAE,SAAA,IAAa,MAAA,MAAY,QAAA,IAAY,IAAA,CAAK,QAAA,CAAS,CAAA,CAAE,GAAG,CAAA,EAAG,OAAA,KAAY;AAAA,KACnF;AAAA,EACF;AAAA,EAEA,cAAc,KAAA,EAAoC;AAChD,IAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,aAAA,CAAc,eAAe,CAAA;AACvD,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAA,CAAO,CAAA,CAAE,SAAA,IAAa,MAAA,MAAY,QAAQ,CAAA,CACpE,GAAA,CAAI,CAAC,CAAA,KAAM;AACV,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,CAAA,CAAE,GAAG,CAAA;AAC/B,MAAA,IAAI,GAAA,EAAK,OAAA,KAAY,IAAA,EAAM,OAAO,EAAA;AAClC,MAAA,OAAO,EAAE,MAAA,CAAO;AAAA,QACd,MAAA,EAAQ,GAAA;AAAA,QACR,KAAA;AAAA,QACA,WAAA,EAAAD,YAAAA;AAAA,QACA,GAAI,IAAA,CAAK,eAAA,KAAoB,QAAQ,EAAE,QAAA,EAAU,KAAK,eAAA;AAAgB,OACvE,CAAA;AAAA,IACH,CAAC,CAAA,CACA,IAAA,CAAK,EAAE,CAAA;AACV,IAAA,MAAA,CAAO,SAAA,GAAY,IAAA;AAAA,EACrB;AAAA,EAEA,eAAe,KAAA,EAAoC;AACjD,IAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,IAAA,MAAM,KAAA,uBAAY,GAAA,EAAyB;AAC3C,IAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,KAAA,CAAM,gBAAA,CAAiB,oBAAoB,CAAA,EAAG;AACpE,MAAA,KAAA,CAAM,GAAA,CAAI,IAAA,CAAK,YAAA,CAAa,kBAAkB,GAAiB,IAAI,CAAA;AAAA,IACrE;AAMA,IAAA,MAAM,IAAA,uBAAW,GAAA,EAAwB;AACzC,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,IAAA,CAAK,MAAA,CAAO,SAAA,IAAa,MAAA,MAAY,MAAA,EAAQ;AAC7C,MAAA,IAAI,CAAC,OAAO,IAAA,IAAQ,CAAC,MAAM,GAAA,CAAI,MAAA,CAAO,IAAI,CAAA,EAAG;AAC7C,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,GAAG,CAAA;AACpC,MAAA,IAAI,GAAA,EAAK,YAAY,IAAA,EAAM;AAC3B,MAAA,IAAI,QAAA,GAAW,EAAA;AACf,MAAA,IAAI;AACF,QAAA,QAAA,GAAW,OAAO,MAAA,CAAO;AAAA,UACvB,MAAA,EAAQ,GAAA;AAAA,UACR,KAAA;AAAA,UACA,WAAA,EAAAA,YAAAA;AAAA,UACA,GAAI,IAAA,CAAK,eAAA,KAAoB,QAAQ,EAAE,QAAA,EAAU,KAAK,eAAA,EAAgB;AAAA,UACtE,GAAI,KAAK,gBAAA,CAAiB,IAAA,GAAO,KAAK,EAAE,eAAA,EAAiB,KAAK,gBAAA;AAAiB,SAChF,CAAA;AAAA,MACH,SAAS,GAAA,EAAK;AACZ,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,uCAAA,CAAA,EAA2C,MAAA,CAAO,GAAA,EAAK,GAAG,CAAA;AAAA,MAC1E;AACA,MAAA,IAAA,CAAK,GAAA,CAAI,OAAO,IAAA,EAAA,CAAO,IAAA,CAAK,IAAI,MAAA,CAAO,IAAI,CAAA,IAAK,EAAA,IAAM,QAAQ,CAAA;AAAA,IAChE;AACA,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,IAAI,CAAA,IAAK,KAAA,EAAO;AAChC,MAAA,IAAA,CAAK,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,IAAK,EAAA;AAAA,IACrC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAA,GAAqC;AACnC,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,qBAAqB,CAAA;AAC/C,IAAA,IAAI,GAAA,EAAK,OAAA,KAAY,IAAA,EAAM,OAAO,IAAA;AAClC,IAAA,MAAM,MAAM,GAAA,CAAI,OAAA;AAChB,IAAA,IAAI,GAAA,KAAQ,QAAW,OAAO,eAAA;AAC9B,IAAA,OAAO,OAAO,GAAA,KAAQ,QAAA,IAAY,MAAA,CAAO,QAAA,CAAS,GAAG,CAAA,IAAK,GAAA,GAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,GAAI,IAAA;AAAA,EACxF;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAA,GAA4B;AAC1B,IAAA,IAAI,IAAA,CAAK,gBAAgB,IAAA,EAAM;AAC/B,IAAA,MAAM,OAAA,GAAU,KAAK,mBAAA,EAAoB;AACzC,IAAA,IAAI,YAAY,IAAA,EAAM;AACtB,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA,CAAK,GAAA,EAAI,GAAI,OAAA,GAAUG,cAAAA;AAC1C,IAAA,IAAA,CAAK,mBAAmB,WAAA,CAAY,MAAM,IAAA,CAAK,cAAA,IAAkB,aAAa,CAAA;AAAA,EAChF;AAAA;AAAA,EAGA,cAAA,GAAuB;AACrB,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,aAAA,CAAc,sBAAsB,CAAA;AAC5D,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,IAAI,IAAA,CAAK,gBAAgB,IAAA,EAAM;AAC/B,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,WAAA,GAAc,IAAA,CAAK,KAAK,CAAA;AAC3D,IAAA,IAAI,cAAc,CAAA,EAAG;AACnB,MAAA,IAAA,CAAK,cAAc,IAAA,CAAK,YAAA,CAAa,mBAAmB,CAAA,IAAK,gBAAgB,CAAC,CAAA;AAC9E,MAAA,IAAI,IAAA,CAAK,qBAAqB,IAAA,EAAM;AAClC,QAAA,aAAA,CAAc,KAAK,gBAAgB,CAAA;AACnC,QAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AAAA,MAC1B;AACA,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,WAAA,GAAc,gBAAgB,SAAS,CAAA;AAAA,EAC9C;AAAA;AAAA;AAAA,EAIA,YAAY,CAAA,EAA0B;AACpC,IAAA,MAAM,EAAA,GAAK,UAAA,CAAW,CAAA,CAAE,EAAE,CAAA;AAC1B,IAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,QAAA,GACZ,CAAA,gCAAA,EAAmC,UAAA,CAAW,CAAA,CAAE,QAAQ,CAAC,CAAA,OAAA,EAAU,UAAA,CAAW,CAAA,CAAE,KAAK,CAAC,CAAA,wCAAA,CAAA,GACtF,CAAA,sEAAA,CAAA;AAKJ,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,OAAA,KAAY,CAAA,CAAE,eAAe,CAAC,EAAE,IAAA,EAAM,EAAA,EAAI,KAAA,EAAO,CAAA,CAAE,YAAA,EAAc,IAAI,EAAC,CAAA;AACrF,IAAA,MAAM,MAAA,GAAS,EAAE,aAAA,IAAiB,IAAA;AAClC,IAAA,MAAM,WAAW,MAAA,GAAS,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,MAAM,CAAA,GAAI,MAAA;AAC9D,IAAA,MAAM,WAAA,GAAc,QAAA,KAAa,MAAA,IAAa,QAAA,CAAS,MAAA,GAAS,CAAA;AAChE,IAAA,MAAM,OAAA,GAAU,CAAA,CAAE,OAAA,GAAU,CAAC,GAAG,IAAA,IAAQ,EAAA;AAGxC,IAAA,MAAM,SAAA,GAAA,CAAa,CAAA,CAAE,UAAA,IAAc,EAAC,EAAG,GAAA;AAAA,MACrC,CAAC,CAAA,KACC,CAAA,4BAAA,EAA+B,UAAA,CAAW,CAAA,CAAE,IAAI,CAAC,CAAA,KAAA,EAAQ,UAAA,CAAW,CAAA,CAAE,KAAK,CAAC,CAAA,WAAA;AAAA,KAChF;AACA,IAAA,MAAM,QAAA,GAAW,WAAA,GACb,EAAC,GACD,IAAA,CAAK,GAAA;AAAA,MAAI,CAAC,CAAA,KACR,CAAA,CAAE,OACE,CAAA,4BAAA,EAA+B,UAAA,CAAW,EAAE,IAAI,CAAC,QAAQ,UAAA,CAAW,CAAA,CAAE,KAAK,CAAC,CAAA,WAAA,CAAA,GAC5E,+BAA+B,UAAA,CAAW,CAAA,CAAE,KAAK,CAAC,CAAA,OAAA;AAAA,KACxD;AACJ,IAAA,MAAM,QAAA,GAAW,cACb,CAAA,+BAAA,EAAkC,OAAA,GAAU,SAAS,UAAA,CAAW,OAAO,CAAC,CAAA,QAAA,CAAA,GAAa,EAAE,0EAA0E,EAAE,CAAA,YAAA,EAAe,EAAE,QAAQ,CAAA,cAAA,EAAiB,WAAW,OAAA,IAAW,SAAS,CAAC,CAAA,EAAA,EAAK,QAAA,CAC/O,GAAA;AAAA,MACC,CAAC,CAAA,KACC,CAAA,eAAA,EAAkB,WAAW,CAAA,CAAE,EAAE,CAAC,CAAA,CAAA,EAAI,CAAA,CAAE,UAAU,CAAA,CAAE,YAAA,GAAe,cAAc,EAAE,CAAA,CAAA,EAAI,WAAW,CAAA,CAAE,KAAA,IAAS,EAAE,CAAC,CAAA,SAAA;AAAA,KACpH,CACC,IAAA,CAAK,EAAE,CAAC,CAAA,eAAA,CAAA,GACX,EAAA;AAEJ,IAAA,MAAM,SAAA,GAAY,CAAC,GAAG,SAAA,EAAW,GAAG,QAAA,EAAU,GAAI,QAAA,GAAW,CAAC,QAAQ,CAAA,GAAI,EAAG,CAAA;AAC7E,IAAA,MAAM,IAAA,GAAO,UAAU,MAAA,GAAS,CAAA,4BAAA,EAA+B,UAAU,IAAA,CAAK,EAAE,CAAC,CAAA,MAAA,CAAA,GAAW,EAAA;AAO5F,IAAA,MAAM,eAAA,GAAA,CAAmB,CAAA,CAAE,mBAAA,EAAqB,MAAA,IAAU,CAAA,IAAK,CAAA;AAC/D,IAAA,MAAM,MAAA,GACJ,EAAE,kBAAA,IAAsB,CAAA,CAAE,mBAAmB,MAAA,GAAS,CAAA,CAAE,UAAU,MAAA,GAC9D,CAAA,CAAE,qBACF,eAAA,IAAmB,CAAA,CAAE,qBAAqB,CAAA,CAAE,iBAAA,CAAkB,SAAS,CAAA,CAAE,SAAA,CAAU,MAAA,GACjF,CAAA,CAAE,iBAAA,GACF,MAAA;AACR,IAAA,MAAM,OAAA,GAAU,SACZ,CAAA,gCAAA,EAAmC,UAAA,CAAWH,aAAY,MAAM,CAAC,CAAC,CAAA,OAAA,CAAA,GAClE,EAAA;AACJ,IAAA,MAAM,IAAA,GACJ,MAAA,IAAU,MAAA,CAAO,MAAA,GAAS,CAAA,CAAE,UAAU,MAAA,GAAS,CAAA,GAC3C,CAAA,6BAAA,EAAgC,OAAO,CAAA,SAAA,EAAY,UAAA;AAAA,MACjD,kBAAA,CAAmB;AAAA,QACjB,MAAA,EAAQ,MAAA,CAAO,MAAA,GAAS,CAAA,CAAE,SAAA,CAAU,MAAA;AAAA,QACpC,QAAA,EAAU,EAAE,SAAA,CAAU;AAAA,OACvB;AAAA,KACF,CAAA,OAAA,CAAA,GACD,EAAA;AAKN,IAAA,MAAM,eAAe,CAAA,CAAE,SAAA;AACvB,IAAA,MAAM,eAAe,eAAA,GACjB,CAAA,CACG,mBAAA,CAAqB,GAAA,CAAI,CAAC,CAAA,KAAM;AAC/B,MAAA,MAAM,IAAA,GAAO,UAAA,CAAW,CAAA,CAAE,IAAI,CAAA;AAC9B,MAAA,IAAI,OAAO,CAAA,CAAE,QAAA,KAAa,QAAA,IAAY,CAAA,CAAE,WAAW,CAAA,EAAG;AACpD,QAAA,MAAM,IAAA,GAAO,KAAK,KAAA,CAAA,CAAO,CAAA,CAAE,qBAAqB,CAAA,CAAE,SAAA,EAAW,MAAA,GAAS,CAAA,CAAE,QAAQ,CAAA;AAChF,QAAA,MAAMK,OAAAA,GAAS,UAAA;AAAA,UACbL,YAAAA,CAAY,EAAE,MAAA,EAAQ,IAAA,GAAO,CAAA,CAAE,UAAU,QAAA,EAAU,CAAA,CAAE,SAAA,CAAU,QAAA,EAAU;AAAA,SAC3E;AACA,QAAA,OAAO,mDAA4C,CAAA,CAAE,QAAQ,CAAA,KAAA,EAAK,IAAI,cAASK,OAAM,CAAA,yCAAA,CAAA;AAAA,MACvF;AACA,MAAA,OAAO,CAAA,gDAAA,EAA4C,IAAI,CAAA,OAAA,EAAK,UAAA,CAAWL,aAAY,CAAA,CAAE,MAAM,CAAC,CAAC,CAAA,aAAA,CAAA;AAAA,IAC/F,CAAC,CAAA,CACA,IAAA,CAAK,EAAE,CAAA,GACV,EAAA;AAKJ,IAAA,OAAO,uCAAuC,EAAE,CAAA;AAAA,MAAA,EAC5C,KAAK;AAAA;AAAA;AAAA;AAAA,0CAAA,EAI+B,UAAA,CAAW,CAAA,CAAE,KAAK,CAAC,CAAA;AAAA,YAAA,EACjD,IAAI;AAAA,YAAA,EACJ,YAAY;AAAA;AAAA;AAAA,YAAA,EAGZ,OAAO;AAAA,0CAAA,EACuB,UAAA,CAAWA,YAAAA,CAAY,YAAY,CAAC,CAAC,CAAA;AAAA,YAAA,EACnE,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA,oEAAA,EAKoD,EAAE,QAAQ,CAAA;AAAA,qCAAA,EACzC,EAAE,QAAQ,CAAA;AAAA,oEAAA,EACqB,EAAE,QAAQ,CAAA;AAAA;AAAA,8GAAA,EAEgC,SAAS,CAAA;AAAA;AAAA;AAAA,UAAA,CAAA;AAAA,EAIvH;AAAA,EAEA,YAAY,KAAA,EAA6B;AACvC,IAAA,IAAA,CAAK,UAAA,GAAa,KAAA;AAClB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,aAAA,CAAc,cAAc,CAAA;AACrD,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,aAAA,CAAc,sBAAsB,CAAA;AACpE,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,aAAA,CAAc,sBAAsB,CAAA;AACpE,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,aAAA,CAAc,mBAAmB,CAAA;AAC5D,IAAA,IAAI,CAAC,KAAA,IAAS,CAAC,YAAA,EAAc;AAI7B,IAAA,MAAM,cAAA,GAAiB,KAAK,eAAA,EAAgB;AAC5C,IAAA,MAAM,YAAA,GACJ,cAAA,KAAmB,IAAA,GACf,KAAA,CAAM,KAAA,GACN,KAAA,CAAM,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAA,KAAc,cAAc,CAAA;AAC9D,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,MAAM,KAAA,GAAQ,aAAa,MAAA,CAAO,CAAC,KAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,QAAA,EAAU,CAAC,CAAA;AACjE,MAAA,OAAA,CAAQ,WAAA,GAAc,KAAA,GAAQ,CAAA,GAAI,CAAA,KAAA,EAAK,KAAK,CAAA,CAAA,GAAK,EAAA;AAAA,IACnD;AACA,IAAA,IAAI;AACF,MAAA,IAAI,YAAA,CAAa,WAAW,CAAA,EAAG;AAC7B,QAAA,KAAA,CAAM,SAAA,GAAY,0BAA0B,OAAO,CAAA,0CAAA,CAAA;AACnD,QAAA,YAAA,CAAa,SAAA,GAAY,EAAA;AACzB,QAAA,IAAI,YAAA;AACF,UAAA,YAAA,CAAa,SAAA,GAAY,CAAA,2FAAA,CAAA;AAC3B,QAAA,IAAA,CAAK,eAAe,KAAK,CAAA;AACzB,QAAA,IAAA,CAAK,mBAAA,EAAoB;AACzB,QAAA,IAAA,CAAK,cAAA,EAAe;AACpB,QAAA;AAAA,MACF;AACA,MAAA,KAAA,CAAM,SAAA,GAAY,YAAA,CAAa,GAAA,CAAI,CAAC,CAAA,KAAM,IAAA,CAAK,WAAA,CAAY,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA;AAWtE,MAAA,MAAM,aAAA,GAAuB;AAAA,QAC3B,MAAA,EAAQ,KAAA,CAAM,KAAA,CAAM,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,SAAA,CAAU,MAAA,EAAQ,CAAC,CAAA;AAAA,QAClE,QAAA,EAAU,MAAM,QAAA,CAAS;AAAA,OAC3B;AACA,MAAA,MAAM,cAAA,GACJ,KAAA,CAAM,aAAA,EAAe,MAAA,IACrB,MAAM,mBAAA,EAAqB,MAAA,CAAO,CAAC,GAAA,EAAK,MAAM,GAAA,GAAM,CAAA,CAAE,MAAA,CAAO,MAAA,EAAQ,CAAC,CAAA,IACtE,CAAA;AACF,MAAA,MAAM,YAAA,GAAsB,aAAA;AAC5B,MAAA,MAAM,IAAA,GAAiB;AAAA,QACrB,GAAI,iBAAiB,CAAA,GACjB;AAAA,UACE,CAAA,sFAAA,EAAyF,UAAA,CAAWA,YAAAA,CAAY,EAAE,MAAA,EAAQ,cAAA,EAAgB,QAAA,EAAU,KAAA,CAAM,QAAA,CAAS,QAAA,EAAU,CAAC,CAAC,CAAA,aAAA;AAAA,YAEjL,EAAC;AAAA,QACL,CAAA,iFAAA,EAAoF,UAAA,CAAWA,YAAAA,CAAY,aAAa,CAAC,CAAC,CAAA,aAAA;AAAA,OAC5H;AACA,MAAA,MAAM,UAAA,GAAa,UAAA,CAAWA,YAAAA,CAAY,YAAY,CAAC,CAAA;AACvD,MAAA,YAAA,CAAa,SAAA,GAAY,CAAA,yBAAA,EAA4B,IAAA,CAAK,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,8CAAA,EACxB,UAAA,CAAW,MAAM,WAAW,CAAC,aAAa,UAAA,GAAa,CAAA,QAAA,EAAM,UAAU,CAAA,CAAA,GAAK,EAAE,CAAA,IAAA,CAAA;AACxH,MAAA,IAAI,YAAA;AACF,QAAA,YAAA,CAAa,SAAA,GAAY,CAAA,8FAAA,CAAA;AAAA,IAC7B,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,CAAQ,KAAA,CAAM,oCAAoC,GAAG,CAAA;AAErD,MAAA,YAAA,CAAa,SAAA,GAAY,CAAA,wCAAA,EAA2C,UAAA,CAAW,KAAA,CAAM,WAAW,CAAC,CAAA,cAAA,CAAA;AAAA,IACnG;AACA,IAAA,IAAA,CAAK,eAAe,KAAK,CAAA;AACzB,IAAA,IAAA,CAAK,mBAAA,EAAoB;AACzB,IAAA,IAAA,CAAK,cAAA,EAAe;AAAA,EACtB;AACF,CAAA;;;AC99BO,IAAM,sBAAA,GAA4C;AAAA,EACvD,mBAAA;AAAA,EACA,kBAAA;AAAA,EACA;AACF,CAAA;AAGO,SAAS,qBAAqB,MAAA,EAA2D;AAC9F,EAAA,OAAO,CAAC,mBAAG,IAAI,GAAA,CAAI,CAAC,GAAG,sBAAA,EAAwB,GAAI,MAAA,CAAO,SAAA,IAAa,EAAG,CAAC,CAAC,CAAA;AAC9E;AAGO,SAAS,aAAA,CAAc,QAA4B,SAAA,EAA8B;AACtF,EAAA,IAAI,EAAE,MAAA,YAAkB,OAAA,CAAA,IAAY,SAAA,CAAU,MAAA,KAAW,GAAG,OAAO,KAAA;AACnE,EAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,IAAA,CAAK,GAAG,CAAA;AAChC,EAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,KAAM,IAAA;AACnC;AAGA,IAAM,iBAAA,GAAoB,2BAAA;AAC1B,IAAM,mBAAA,GAAsB,+BAAA;AAcrB,SAAS,kBAAkB,MAAA,EAAoD;AACpF,EAAA,IAAI,EAAE,MAAA,YAAkB,OAAA,CAAA,EAAU,OAAO,IAAA;AACzC,EAAA,MAAM,OAAO,MAAA,CAAO,OAAA,CAAQ,mBAAmB,CAAA,EAAG,QAAQ,iBAAiB,CAAA;AAC3E,EAAA,OAAO,IAAA,YAAgB,kBAAkB,IAAA,GAAO,IAAA;AAClD;AAQO,SAAS,oBAAoB,MAAA,EAAoD;AACtF,EAAA,MAAM,IAAA,GAAO,kBAAkB,MAAM,CAAA;AACrC,EAAA,IAAI,IAAA,KAAS,MAAM,OAAO,IAAA;AAE1B,EAAA,MAAM,IAAA,GAAO,IAAI,QAAA,CAAS,IAAI,CAAA;AAC9B,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA;AAC3B,EAAA,MAAM,YAAY,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,CAAM,MAAK,GAAI,EAAA;AAC7D,EAAA,IAAI,SAAA,KAAc,IAAI,OAAO,IAAA;AAE7B,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,UAAU,CAAC,CAAA;AAC1C,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,IAAK,UAAU,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA,GAAI,CAAA;AAE/E,EAAA,MAAM,aAAqC,EAAC;AAC5C,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,IAAA,CAAK,SAAQ,EAAG;AACzC,IAAA,MAAM,KAAA,GAAQ,sBAAA,CAAuB,IAAA,CAAK,GAAG,CAAA;AAC7C,IAAA,IAAI,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,CAAM,IAAA,EAAK,KAAM,EAAA,EAAI,UAAA,CAAW,KAAA,CAAM,CAAC,CAAE,CAAA,GAAI,KAAA;AAAA,EACzF;AACA,EAAA,OAAO,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA,CAAE,MAAA,GAAS,CAAA,GACpC,EAAE,SAAA,EAAW,QAAA,EAAU,UAAA,EAAW,GAClC,EAAE,WAAW,QAAA,EAAS;AAC5B;;;AC/CO,SAAS,eAAe,IAAA,EAAqC;AAClE,EAAA,gBAAA,CAAiB,QAAA,EAAS;AAC1B,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,IAAQ,QAAA,CAAS,IAAA;AACnC,EAAA,MAAM,EAAA,GAAK,QAAA,CAAS,aAAA,CAAc,gBAAA,CAAiB,OAAO,CAAA;AAC1D,EAAA,EAAA,CAAG,UAAA,CAAW,KAAK,OAAO,CAAA;AAC1B,EAAA,IAAI,IAAA,CAAK,aAAA,EAAe,EAAA,CAAG,gBAAA,CAAiB,KAAK,aAAa,CAAA;AAC9D,EAAA,IAAI,KAAK,MAAA,CAAO,QAAA,KAAa,WAAA,CAAY,IAAA,CAAK,OAAO,QAAQ,CAAA;AAC7D,EAAA,EAAA,CAAG,UAAA,CAAW,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACjC,EAAA,IAAA,CAAK,YAAY,EAAE,CAAA;AAEnB,EAAA,MAAM,SAAA,GAAY,oBAAA,CAAqB,IAAA,CAAK,MAAM,CAAA;AAClD,EAAA,MAAM,OAAA,GAAU,CAAC,KAAA,KAAuB;AAKtC,IAAA,MAAM,SAAA,GAAY,mBAAA,CAAoB,KAAA,CAAM,MAAM,CAAA;AAClD,IAAA,IAAI,cAAc,IAAA,EAAM;AACtB,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,KAAA,CAAM,eAAA,EAAgB;AAOtB,MAAA,MAAM,IAAA,GAAO,iBAAA,CAAkB,KAAA,CAAM,MAAM,CAAA;AAC3C,MAAA,IAAI,IAAA,KAAS,QAAQ,OAAO,IAAA,CAAK,mBAAmB,UAAA,IAAc,CAAC,KAAK,cAAA,EAAe;AACrF,QAAA;AACF,MAAA,KAAK,GAAG,cAAA,CAAe,SAAA,CAAU,WAAW,SAAA,CAAU,QAAA,EAAU,UAAU,UAAU,CAAA;AACpF,MAAA;AAAA,IACF;AACA,IAAA,IAAI,CAAC,aAAA,CAAc,KAAA,CAAM,MAAA,EAAQ,SAAS,CAAA,EAAG;AAC7C,IAAA,KAAA,CAAM,cAAA,EAAe;AACrB,IAAA,KAAA,CAAM,eAAA,EAAgB;AACtB,IAAA,KAAK,GAAG,IAAA,EAAK;AAAA,EACf,CAAA;AACA,EAAA,QAAA,CAAS,gBAAA,CAAiB,OAAA,EAAS,OAAA,EAAS,IAAI,CAAA;AAEhD,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,MAAM,EAAA,CAAG,IAAA,EAAK;AAAA,IACpB,KAAA,EAAO,MAAM,EAAA,CAAG,KAAA,EAAM;AAAA,IACtB,SAAS,MAAM;AACb,MAAA,QAAA,CAAS,mBAAA,CAAoB,OAAA,EAAS,OAAA,EAAS,IAAI,CAAA;AACnD,MAAA,EAAA,CAAG,MAAA,EAAO;AAAA,IACZ;AAAA,GACF;AACF;;;AChEA,IAAI,YAAA,GAAuC,IAAA;AAGpC,SAAS,eAAA,CACd,QACA,OAAA,EACiB;AACjB,EAAA,MAAM,MAAA,GAAS,cAAA,CAAe,EAAE,MAAA,EAAQ,SAAS,CAAA;AACjD,EAAA,YAAA,GAAe,MAAA;AACf,EAAA,OAAO,MAAA;AACT;AAGO,SAAS,gBAAgB,MAAA,EAA+B;AAC7D,EAAA,IAAI,YAAA,KAAiB,QAAQ,YAAA,GAAe,IAAA;AAC5C,EAAA,MAAA,CAAO,OAAA,EAAQ;AACjB;AAGO,SAAS,aAAA,GAAsB;AACpC,EAAA,KAAK,cAAc,IAAA,EAAK;AAC1B;;;ACbO,SAAS,iBAAA,CAAkB,EAAE,MAAA,EAAQ,OAAA,EAAQ,EAAiC;AACnF,EAAAM,UAAU,MAAM;AACd,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACnC,IAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,MAAA,EAAQ,OAAO,CAAA;AAC9C,IAAA,OAAO,MAAM,gBAAgB,MAAM,CAAA;AAAA,EACrC,CAAA,EAAG,CAAC,MAAA,EAAQ,OAAO,CAAC,CAAA;AACpB,EAAA,OAAO,IAAA;AACT;ACgBA,IAAM,0BAAA,GAA6BR,cAAsD,IAAI,CAAA;AAC7F,IAAM,4BAAA,GAA+B,8BAAA;AACrC,IAAM,4BAAA,GAA+B,8BAAA;AACrC,IAAM,2BAAA,GAA8B,6BAAA;AACpC,IAAM,mCAAA,GAAsC,qCAAA;AAE5C,SAAS,8BAA8B,OAAA,EAA6C;AAClF,EAAA,MAAM,QAAA,GAAWS,oBAAAA;AAAA,IACf,CAAC,QAAA,KAAa,OAAA,CAAQ,KAAA,CAAM,UAAU,QAAQ,CAAA;AAAA,IAC9C,MAAM,OAAA,CAAQ,KAAA,CAAM,WAAA,EAAY;AAAA,IAChC,MAAM,OAAA,CAAQ,KAAA,CAAM,WAAA;AAAY,GAClC;AAEA,EAAAD,UAAU,MAAM;AACd,IAAA,IAAI,OAAO,QAAA,KAAa,WAAA,IAAe,OAAO,gBAAgB,WAAA,EAAa;AAC3E,IAAA,MAAM,gBAAgB,MAAY;AAChC,MAAA,QAAA,CAAS,aAAA;AAAA,QACP,IAAI,YAAY,2BAAA,EAA6B;AAAA,UAC3C,MAAA,EAAQ;AAAA,YACN,oBAAoB,QAAA,CAAS,kBAAA;AAAA,YAC7B,mBAAmB,QAAA,CAAS,iBAAA;AAAA,YAC5B,iBAAiB,QAAA,CAAS,eAAA;AAAA,YAC1B,UAAU,QAAA,CAAS;AAAA;AACrB,SACD;AAAA,OACH;AAAA,IACF,CAAA;AACA,IAAA,aAAA,EAAc;AACd,IAAA,QAAA,CAAS,gBAAA,CAAiB,qCAAqC,aAAa,CAAA;AAC5E,IAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,mCAAA,EAAqC,aAAa,CAAA;AAAA,EAC9F,CAAA,EAAG;AAAA,IACD,QAAA,CAAS,iBAAA;AAAA,IACT,QAAA,CAAS,QAAA;AAAA,IACT,QAAA,CAAS,kBAAA;AAAA,IACT,QAAA,CAAS;AAAA,GACV,CAAA;AAED,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,OAAO,QAAA,KAAa,WAAA,IAAe,OAAO,gBAAgB,WAAA,EAAa;AAC3E,IAAA,MAAM,QAAA,GAAW,CAAC,KAAA,KAAuB;AACvC,MAAA,IAAI,EAAE,iBAAiB,WAAA,CAAA,EAAc;AACrC,MAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,oBAAA,CAAqB,KAAA,CAAM,MAAM,CAAA;AACxD,MAAA,QAAA,CAAS,aAAA,CAAc,IAAI,WAAA,CAAY,4BAAA,EAA8B,EAAE,MAAA,EAAQ,MAAA,EAAQ,CAAC,CAAA;AAAA,IAC1F,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,8BAA8B,QAAQ,CAAA;AAChE,IAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,4BAAA,EAA8B,QAAQ,CAAA;AAAA,EAClF,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AACd;AAsBO,SAAS,sBAAA,CAAuB;AAAA,EACrC,QAAA;AAAA,EACA,aAAa,EAAC;AAAA,EACd,UAAA;AAAA,EACA,OAAA;AAAA,EACA,iBAAA;AAAA,EACA,oBAAA,GAAuB,OAAA;AAAA,EACvB,KAAA;AAAA,EACA;AACF,CAAA,EAA8C;AAC5C,EAAA,6BAAA,CAA8B,OAAO,CAAA;AACrC,EAAA,MAAM,KAAA,GAAQE,OAAAA;AAAA,IACZ,OAAO;AAAA,MACL,OAAA;AAAA,MACA,UAAA;AAAA,MACA,GAAI,aAAA,KAAkB,MAAA,GAAY,EAAE,aAAA,KAAkB;AAAC,KACzD,CAAA;AAAA,IACA,CAAC,UAAA,EAAY,OAAA,EAAS,aAAa;AAAA,GACrC;AAEA,EAAAF,UAAU,MAAM;AACd,IAAA,OAAA,CAAQ,SAAA,CAAU,UAAA,EAAY,oBAAA,EAAsB,KAAK,CAAA;AACzD,IAAA,OAAA,CAAQ,KAAA,EAAM;AAAA,EAChB,GAAG,CAAC,UAAA,EAAY,SAAS,iBAAA,EAAmB,oBAAA,EAAsB,KAAK,CAAC,CAAA;AAExE,EAAA,uBACEV,GAAAA,CAAC,0BAAA,CAA2B,QAAA,EAA3B,EAAoC,OAClC,QAAA,EACH,CAAA;AAEJ;AAEA,SAAS,wBAAA,GAA4D;AACnE,EAAA,MAAM,OAAA,GAAUG,WAAW,0BAA0B,CAAA;AACrD,EAAA,IAAI,YAAY,IAAA,EAAM;AACpB,IAAA,MAAM,IAAI,MAAM,sEAAsE,CAAA;AAAA,EACxF;AACA,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,oBAAoB,UAAA,EAA2D;AACtF,EAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,wBAAA,EAAyB;AAC7C,EAAA,OAAOQ,oBAAAA;AAAA,IACL,CAAC,QAAA,KAAa,OAAA,CAAQ,KAAA,CAAM,iBAAA,CAAkB,YAAY,QAAQ,CAAA;AAAA,IAClE,MAAM,OAAA,CAAQ,KAAA,CAAM,mBAAA,CAAoB,UAAU,CAAA;AAAA,IAClD,MAAM,OAAA,CAAQ,KAAA,CAAM,mBAAA,CAAoB,UAAU;AAAA,GACpD;AACF;AAYO,SAAS,yBAAA,CACd,UAAA,EACA,WAAA,GAAiD,EAAC,EACd;AACpC,EAAA,MAAM,EAAE,OAAA,EAAS,aAAA,EAAc,GAAI,wBAAA,EAAyB;AAC5D,EAAA,MAAM,QAAA,GAAW,oBAAoB,UAAU,CAAA;AAC/C,EAAA,OAAOC,QAAQ,MAAM;AACnB,IAAA,IAAI,QAAA,KAAa,MAAM,OAAO,IAAA;AAC9B,IAAA,OAAO;AAAA,MACL,QAAA;AAAA,MACA,OAAO,EAAE,GAAG,WAAA,EAAa,GAAG,SAAS,aAAA,EAAc;AAAA,MACnD,QAAQ,2BAAA,CAA4B,OAAA,CAAQ,QAAA,EAAU,QAAA,CAAS,UAAU,aAAa;AAAA,KACxF;AAAA,EACF,GAAG,CAAC,OAAA,CAAQ,UAAU,QAAA,EAAU,WAAA,EAAa,aAAa,CAAC,CAAA;AAC7D;AAEO,SAAS,qBAAA,CAAsB,kBAA0B,MAAA,EAAmC;AACjG,EAAA,MAAM,QAAA,GAAW,oBAAoB,gBAAgB,CAAA;AACrD,EAAA,OAAO,QAAA,EAAU,gBAAA,CAAiB,MAAM,CAAA,IAAK,EAAC;AAChD;AAcO,SAAS,sBAAA,CAAuB;AAAA,EACrC,iBAAA,GAAoB,IAAA;AAAA,EACpB,QAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA,EAAqD;AACnD,EAAA,MAAM,EAAE,OAAA,EAAS,aAAA,EAAe,oBAAA,KAAyB,wBAAA,EAAyB;AAClF,EAAA,MAAM,QAAA,GAAW,oBAAoB,UAAU,CAAA;AAE/C,EAAAF,SAAAA,CAAU,MAAM,OAAA,CAAQ,gBAAA,CAAiB,UAAU,CAAA,EAAG,CAAC,UAAA,EAAY,OAAO,CAAC,CAAA;AAE3E,EAAA,IAAI,QAAA,KAAa,MAAM,OAAO,IAAA;AAC9B,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,IAAA,CAAK,QAAQ,CAAA;AACpC,EAAA,IAAI,CAAC,cAAA,CAAwC,KAAK,CAAA,EAAG,OAAO,IAAA;AAC5D,EAAA,MAAM,yBAAyB,aAAA,IAAiB,oBAAA;AAChD,EAAA,MAAM,YAAA,GAAe,iBAAA,GAAoB,QAAA,CAAS,aAAA,GAAgB,EAAC;AACnE,EAAA,MAAM,UAAA,GAAa,cAAc,KAAA,CAAM,KAAA,CAAM,KAAK,CAAA,GAAI,KAAA,CAAM,KAAA,CAAM,KAAA,GAAQ,EAAC;AAC3E,EAAA,MAAM,YAAA,GAAe,oBACjB,2BAAA,CAA4B,OAAA,CAAQ,UAAU,QAAA,CAAS,QAAA,EAAU,sBAAsB,CAAA,GACvF,EAAC;AACL,EAAA,MAAM,aAAA,GAAgB,aAAa,KAAA,EAAO;AAAA,IACxC,GAAG,YAAA;AAAA,IACH,GAAI,MAAA,CAAO,IAAA,CAAK,YAAY,CAAA,CAAE,SAAS,CAAA,GACnC,EAAE,KAAA,EAAO,EAAE,GAAG,UAAA,EAAY,GAAG,YAAA,EAAa,KAC1C;AAAC,GACN,CAAA;AACD,EAAA,MAAM,cAAA,GAAiB,SAAS,iBAAA,CAAkB,IAAA,CAAK,CAAC,MAAA,KAAW,MAAA,CAAO,aAAa,UAAU,CAAA;AACjG,EAAA,MAAM,WAAA,GAAc,QAAA,CAAS,SAAA,CAAU,KAAA,CACpC,MAAA;AAAA,IACC,CAAC,OAAA,KACC,OAAA,CAAQ,eAAA,CAAgB,QAAA,CAAS,QAAQ,CAAA,IAAA,CACxC,QAAA,CAAS,QAAA,CAAS,KAAA,CAAM,OAAA,CAAQ,QAAQ,KAAK,OAAA,CAAQ,cAAA,GAAiB,IAAA,KACrE,UAAA,KACD,OAAA,CAAQ,OAAA,KAAY,UACnB,OAAA,CAAQ,OAAA,KAAY,UAAA,IACpB,OAAA,CAAQ,OAAA,KAAY,UAAA;AAAA,GAC1B,CACC,GAAA,CAAI,CAAC,OAAA,MAAa,EAAE,QAAA,EAAU,OAAA,CAAQ,QAAA,EAAU,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAM,CAAE,CAAA;AAC1E,EAAA,MAAM,cAAA,GAAiB,SAAS,SAAA,CAAU,MAAA,CAAO,OAC9C,MAAA,CAAO,CAAC,OAAA,KAAY,CAAC,KAAA,EAAO,QAAA,EAAU,UAAU,SAAA,EAAW,OAAO,EAAE,QAAA,CAAS,OAAA,CAAQ,OAAO,CAAC,CAAA,CAC7F,GAAA,CAAI,CAAC,OAAA,MAAa;AAAA,IACjB,WAAW,OAAA,CAAQ,SAAA;AAAA,IACnB,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,OAAO,OAAA,CAAQ,KAAA;AAAA,IACf,eAAe,OAAA,CAAQ;AAAA,GACzB,CAAE,CAAA;AACJ,EAAA,MAAM,cAAA,GAAiB,CAAC,MAAA,KAAgD;AACtE,IAAA,OAAA,CAAQ,cAAc,UAAU,CAAA;AAAA,EAClC,CAAA;AACA,EAAA,MAAM,cAAA,GAAiB,CAAC,MAAA,KAAgD;AACtE,IAAA,OAAA,CAAQ,cAAc,IAAI,CAAA;AAAA,EAC5B,CAAA;AACA,EAAA,MAAM,OAAA,GAAU,CAAC,KAAA,KAA6C;AAC5D,IAAA,KAAA,CAAM,cAAA,EAAe;AACrB,IAAA,KAAA,CAAM,eAAA,EAAgB;AACtB,IAAA,OAAA,CAAQ,eAAe,UAAU,CAAA;AAAA,EACnC,CAAA;AAEA,EAAA,uBACEV,GAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,gCAAA,EAAgC,QAAA,CAAS,QAAA,GAAW,UAAA,GAAa,WAAA;AAAA,MACjE,kCAAA,EAAkC,QAAA,CAAS,SAAA,CAAU,YAAA,CAAa,KAAK,GAAG,CAAA;AAAA,MAC1E,+BAAA,EAA+B,SAAS,SAAA,CAAU,WAAA;AAAA,MAClD,8BAAA,EAA8B,UAAA;AAAA,MAC9B,kCAAA,EAAkC,IAAA,CAAK,SAAA,CAAU,WAAW,CAAA;AAAA,MAC5D,2BAAA,EAA2B,SAAS,SAAA,CAAU,IAAA;AAAA,MAC9C,qCAAA,EAAqC,IAAA,CAAK,SAAA,CAAU,cAAc,CAAA;AAAA,MAClE,8BAA4B,cAAA,EAAgB,IAAA;AAAA,MAC5C,OAAA;AAAA,MACA,cAAA;AAAA,MACA,cAAA;AAAA,MACA,KAAA,EAAO,EAAE,OAAA,EAAS,UAAA,EAAW;AAAA,MAE5B,QAAA,EAAA;AAAA;AAAA,GACH;AAEJ;AAEA,SAAS,cAAc,KAAA,EAAoE;AACzF,EAAA,OAAO,OAAO,UAAU,QAAA,IAAY,KAAA,KAAU,QAAQ,CAAC,KAAA,CAAM,QAAQ,KAAK,CAAA;AAC5E;AAMA,SAAS,gCAAA,CAAiC;AAAA,EACxC;AACF,CAAA,EAA+D;AAC7D,EAAA,MAAM,EAAE,UAAA,EAAW,GAAI,wBAAA,EAAyB;AAChD,EAAA,MAAM,QAAA,GAAW,0BAA0B,UAAU,CAAA;AACrD,EAAA,IAAI,QAAA,KAAa,MAAM,OAAO,IAAA;AAC9B,EAAA,MAAM,SAAA,GAAY,UAAA,CAAW,QAAA,CAAS,QAAA,CAAS,UAAU,WAAW,CAAA;AACpE,EAAA,IAAI,cAAc,MAAA,EAAW;AAC3B,IAAA,uBACEA,GAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,8BAAA,EAA8B,UAAA;AAAA,QAC9B,4BAAA,EAA2B,gCAAA;AAAA,QAC3B,KAAA,EAAO,EAAE,OAAA,EAAS,UAAA;AAAW;AAAA,KAC/B;AAAA,EAEJ;AACA,EAAA,uBACEA,GAAAA,CAAC,sBAAA,EAAA,EAAuB,mBAAmB,KAAA,EAAO,UAAA,EAC/C,wBAAc,SAAA,EAAW;AAAA,IACxB,UAAA;AAAA,IACA,OAAO,QAAA,CAAS,KAAA;AAAA,IAChB,QAAQ,QAAA,CAAS,MAAA;AAAA,IACjB,KAAA,EAAO,SAAS,QAAA,CAAS,gBAAA;AAAA,IACzB,GAAI,QAAA,CAAS,QAAA,CAAS,QAAA,CAAS,SAAA,KAAc,MAAA,GACzC,EAAE,SAAA,EAAW,QAAA,CAAS,QAAA,CAAS,QAAA,CAAS,SAAA,KACxC;AAAC,GACN,CAAA,EACH,CAAA;AAEJ;AAaO,SAAS,kBAAA,CAAmB;AAAA,EACjC,KAAA,GAAQ,IAAA;AAAA,EACR,mBAAmB,EAAC;AAAA,EACpB,gBAAA;AAAA,EACA;AACF,CAAA,EAA0C;AACxC,EAAA,MAAM,MAAA,GAAS,oBAAoB,gBAAgB,CAAA;AACnD,EAAA,MAAM,WAAA,GAAc,qBAAA,CAAsB,gBAAA,EAAkB,MAAM,CAAA;AAClE,EAAA,MAAM,IAAA,GAAO,QAAQ,SAAA,CAAU,KAAA,CAAM,KAAK,CAAC,SAAA,KAAc,SAAA,CAAU,MAAA,KAAW,MAAM,CAAA;AACpF,EAAA,uBACEA,GAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,0BAAA,EAA0B,MAAA;AAAA,MAC1B,kCAAA,EACE,IAAA,EAAM,OAAA,CAAQ,IAAA,KAAS,KAAA,GAAQ,GAAA,GAAO,IAAA,EAAM,OAAA,CAAQ,YAAA,CAAa,IAAA,CAAK,GAAG,CAAA,IAAK,EAAA;AAAA,MAEhF,kCAAgC,WAAA,CAAY,MAAA;AAAA,MAC5C,oCAAA,EAAoC,MAAM,SAAA,IAAa,OAAA;AAAA,MACvD,gCAAA,EAAgC,MAAM,KAAA,IAAS,MAAA;AAAA,MAC/C,8BAAA,EAA8B,MAAM,YAAA,IAAgB,CAAA;AAAA,MACpD,iCAAA,EAAiC,gBAAA;AAAA,MACjC,KAAA,EAAO,EAAE,OAAA,EAAS,UAAA,EAAW;AAAA,MAE5B,sBAAY,MAAA,KAAW,CAAA,GACpB,QACA,WAAA,CAAY,GAAA,CAAI,CAAC,UAAA,KAAe;AAC9B,QAAA,MAAM,QAAA,GAAW,iBAAiB,UAAU,CAAA;AAC5C,QAAA,OAAO,QAAA,KAAa,MAAA,mBAClBA,GAAAA,CAAC,gCAAA,EAAA,EAAiC,UAAA,EAAA,EAA6B,UAAY,CAAA,mBAE3EA,GAAAA,CAAC,sBAAA,EAAA,EAAuB,UAAA,EACrB,sBADkD,UAErD,CAAA;AAAA,MAEJ,CAAC;AAAA;AAAA,GACP;AAEJ","file":"react.js","sourcesContent":["import React, { type ReactElement, type ReactNode } from 'react'\nimport { useFetcher, type FetcherWithComponents } from 'react-router'\n\nimport { CART_FORM_ACTIONS, type CartFormAction } from '../cart/actions'\nimport { getCartFormInput } from '../cart/CartForm'\nimport type { CartLineInput } from '../cart/types'\nimport type { Cart as StorefrontCart } from '../storefront-api-types'\n\ntype CartFormInputValue = unknown\n\nexport type CartFormFetcher = FetcherWithComponents<unknown>\n\nexport interface CartFormProps {\n readonly action: CartFormAction\n readonly inputs?: Readonly<Record<string, CartFormInputValue>>\n readonly route?: string\n readonly children?: ReactNode | ((fetcher: CartFormFetcher) => ReactNode)\n}\n\nexport type OptimisticCartLineInput = CartLineInput\nexport type OptimisticInputData = Readonly<Record<string, unknown>>\nexport type CartReturn = StorefrontCart\nexport interface CartQueryDataReturn {\n readonly cart: CartReturn\n readonly errors?: readonly unknown[]\n readonly userErrors?: readonly unknown[]\n}\n\nfunction serializeInputValue(value: CartFormInputValue): string {\n if (value !== null && typeof value === 'object') return JSON.stringify(value)\n return String(value)\n}\n\nexport const CartForm = Object.assign(\n function CartForm({ action, inputs = {}, route, children }: CartFormProps): ReactElement {\n const fetcher = useFetcher<unknown>()\n const renderedChildren = typeof children === 'function' ? children(fetcher) : children\n const hiddenInputs = Object.entries(inputs).flatMap(([name, value]) =>\n value == null\n ? []\n : [<input key={name} type=\"hidden\" name={name} value={serializeInputValue(value)} />],\n )\n const routeProps = route === undefined ? {} : { action: route }\n return (\n <fetcher.Form method=\"post\" {...routeProps}>\n <input type=\"hidden\" name=\"cartAction\" value={action} />\n {hiddenInputs}\n {renderedChildren}\n </fetcher.Form>\n )\n },\n { ACTIONS: CART_FORM_ACTIONS, getFormInput: getCartFormInput },\n)\n\nexport interface OptimisticInputProps {\n readonly id: string\n readonly data: OptimisticInputData\n}\n\nexport function OptimisticInput({ id, data }: OptimisticInputProps): ReactElement {\n return <input type=\"hidden\" name={`optimisticData:${id}`} value={JSON.stringify(data)} />\n}\n\nexport function useOptimisticData<T>(_id: string | null | undefined): T | undefined {\n return undefined\n}\n","import type { AnalyticsContext } from './events'\n\nexport type AnonymousAnalyticsContext = Pick<AnalyticsContext, 'url'>\n\n/**\n * Keep the one dimension required by an anonymous page view without exposing attribution data.\n * The candidate must resolve to the current HTTP(S) origin; query, fragment, and credentials are\n * discarded, while checkout session paths are collapsed so their identifiers never reach analytics.\n */\nexport function anonymousPageContext(\n candidateUrl: string | undefined,\n currentUrl: string | undefined,\n): AnonymousAnalyticsContext {\n if (!candidateUrl || !currentUrl) return {}\n\n try {\n const current = new URL(currentUrl)\n const candidate = new URL(candidateUrl, current)\n if (!['http:', 'https:'].includes(current.protocol)) return {}\n if (!['http:', 'https:'].includes(candidate.protocol)) return {}\n if (candidate.origin !== current.origin) return {}\n\n const pathname = /^\\/checkout(?:\\/|$)/.test(candidate.pathname)\n ? '/checkout'\n : candidate.pathname || '/'\n return { url: `${candidate.origin}${pathname}` }\n } catch {\n return {}\n }\n}\n","import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactElement,\n type ReactNode,\n} from 'react'\nimport React from 'react'\n\nimport { anonymousPageContext } from '../analytics/anonymous-context'\nimport { collectAnalyticsAttribution } from '../analytics/attribution'\nimport { createAnalyticsBus, type AnalyticsBus } from '../analytics/analytics-bus'\nimport type { ShopAnalytics } from '../analytics/shop'\nimport {\n buildConsentCookie,\n CONSENT_COOKIE,\n GRANTED_CONSENT,\n mergeConsent,\n readConsentCookie,\n type ConsentState,\n} from '../analytics/consent'\nimport type { AnalyticsEmitter } from '../analytics/emitter'\nimport type { AnalyticsContext, AnalyticsEventMap, AnalyticsEventName } from '../analytics/events'\nimport { createPixelTransport, type PixelSend } from '../analytics/pixel-transport'\n\n/** Browser pixel send: sendBeacon (survives unload, non-blocking) with a keepalive fetch fallback. */\nconst beaconSend: PixelSend = (endpoint, body) => {\n if (typeof navigator !== 'undefined' && typeof navigator.sendBeacon === 'function') {\n if (navigator.sendBeacon(endpoint, new Blob([body], { type: 'application/json' }))) return\n }\n if (typeof fetch === 'function') {\n void fetch(endpoint, {\n method: 'POST',\n body,\n keepalive: true,\n headers: { 'content-type': 'application/json' },\n })\n }\n}\n\ninterface AnalyticsContextValue {\n readonly subscribe: AnalyticsEmitter['subscribe']\n readonly publish: AnalyticsBus['publish']\n readonly consent: ConsentState\n readonly setConsent: (patch: Partial<ConsentState>) => void\n readonly decided: boolean\n readonly mounted: boolean\n}\n\nconst AnalyticsReactContext = createContext<AnalyticsContextValue | null>(null)\n\nexport interface AnalyticsProviderProps {\n readonly cart?: unknown\n readonly consent?: {\n readonly checkoutDomain?: string\n readonly storefrontAccessToken?: string\n readonly withPrivacyBanner?: boolean\n }\n readonly shopId?: string\n readonly shop?: ShopAnalytics\n readonly geo?: AnalyticsContext['geo']\n /** Current page URL; changing it auto-emits `page_viewed` (themes pass it from RR8 navigation). */\n readonly url?: string\n /** Same-origin pixel endpoint (default '/api/storefront/pixel'). */\n readonly pixelEndpoint?: string\n readonly children: ReactNode\n}\n\n/**\n * `<AnalyticsProvider>` (Hydrogen-shaped) — wires the consent-gated analytics bus and exposes it via\n * `useAnalytics`. The visible consent UI is disabled for now; analytics starts granted while the public\n * API remains in place for the replacement flow.\n */\nexport function AnalyticsProvider(props: AnalyticsProviderProps): ReactElement {\n const [consent, setConsentState] = useState<ConsentState>(GRANTED_CONSENT)\n const [decided, setDecided] = useState(true)\n const [mounted, setMounted] = useState(false)\n const consentRef = useRef<ConsentState>(consent)\n consentRef.current = consent\n const pageUrlRef = useRef(props.url)\n pageUrlRef.current = props.url\n // Build without explicit `undefined` (exactOptionalPropertyTypes).\n const contextRef = useRef<AnalyticsContext>({})\n const shopId = props.shopId ?? props.shop?.shopId ?? props.shop?.storefrontId\n const browserUrl =\n typeof window === 'undefined'\n ? undefined\n : (() => {\n try {\n return new URL(props.url ?? window.location.href, window.location.href).href\n } catch {\n return props.url\n }\n })()\n contextRef.current = {\n ...(shopId !== undefined ? { shopId } : {}),\n ...(props.geo !== undefined ? { geo: props.geo } : {}),\n ...(browserUrl !== undefined\n ? { url: browserUrl }\n : props.url !== undefined\n ? { url: props.url }\n : {}),\n }\n\n // The pixel endpoint is static config — captured once so the bus is genuinely stable.\n const endpointRef = useRef(props.pixelEndpoint)\n\n // The bus is created ONCE (empty deps) so navigation/prop changes never drop theme subscribers or the\n // in-flight queue; the ambient context + consent are read through refs so each publish sees the latest.\n const bus = useMemo(\n () =>\n createAnalyticsBus({\n transport: createPixelTransport({\n send: beaconSend,\n ...(endpointRef.current !== undefined ? { endpoint: endpointRef.current } : {}),\n }),\n getConsent: () => consentRef.current,\n getAnonymousContext: () => {\n if (typeof window === 'undefined') return {}\n return anonymousPageContext(\n pageUrlRef.current ?? window.location.href,\n window.location.href,\n )\n },\n // createAnalyticsBus calls this only after an explicit analytics grant. Keep every browser\n // attribution/device read inside this lazy seam so denied visits never evaluate it.\n getContext: () => ({\n ...collectAnalyticsAttribution(\n typeof window === 'undefined' || typeof document === 'undefined'\n ? null\n : {\n referrer: document.referrer,\n search: window.location.search,\n ...(typeof window.matchMedia === 'function'\n ? { matchMedia: (query: string) => window.matchMedia(query) }\n : {}),\n },\n ),\n ...contextRef.current,\n }),\n }),\n [],\n )\n\n // Legacy cookies are ignored while the UI is removed; stale rejections must not suppress scripts.\n useEffect(() => {\n setMounted(true)\n const cookie = typeof document === 'undefined' ? '' : document.cookie\n if (cookie.includes(`${CONSENT_COOKIE}=`)) {\n const existing = readConsentCookie(cookie)\n consentRef.current = existing\n setConsentState(existing)\n setDecided(true)\n }\n }, [])\n\n // Call ONLY from a direct user gesture (a banner action): it persists the choice + dismisses the\n // banner. Never auto-grant on the visitor's behalf — that would defeat the opt-in model.\n const setConsent = useCallback((patch: Partial<ConsentState>) => {\n setConsentState((prev) => {\n const next = mergeConsent(prev, patch)\n consentRef.current = next\n if (typeof document !== 'undefined') document.cookie = buildConsentCookie(next)\n return next\n })\n setDecided(true)\n }, [])\n\n // Auto page_viewed on mount + whenever the URL changes.\n useEffect(() => {\n bus.publish('page_viewed', {})\n }, [bus, props.url])\n\n // Flush the pixel batch when the page is hidden (best-effort, never blocks).\n useEffect(() => {\n if (typeof document === 'undefined') return\n const onHide = (): void => bus.flush()\n document.addEventListener('visibilitychange', onHide)\n return () => document.removeEventListener('visibilitychange', onHide)\n }, [bus])\n\n const value = useMemo<AnalyticsContextValue>(\n () => ({\n subscribe: bus.emitter.subscribe,\n publish: bus.publish,\n consent,\n setConsent,\n decided,\n mounted,\n }),\n [bus, consent, setConsent, decided, mounted],\n )\n\n return (\n <AnalyticsReactContext.Provider value={value}>{props.children}</AnalyticsReactContext.Provider>\n )\n}\n\nexport function useAnalytics(): AnalyticsContextValue {\n const value = useContext(AnalyticsReactContext)\n if (value === null) throw new Error('useAnalytics must be used within an <AnalyticsProvider>')\n return value\n}\n\nexport interface ConsentBannerRenderProps {\n readonly acceptAll: () => void\n readonly rejectAll: () => void\n readonly setConsent: (patch: Partial<ConsentState>) => void\n}\n\nexport interface ConsentBannerProps {\n /** Render-prop for full theme control. Omit for a minimal, unstyled accessible fallback. */\n readonly children?: (api: ConsentBannerRenderProps) => ReactNode\n}\n\n/**\n * Legacy no-op. Kept so existing themes do not fail imports while the consent UI is removed.\n */\nexport function ConsentBanner({ children }: ConsentBannerProps): ReactElement | null {\n void children\n return null\n}\n\nfunction usePublishAnalytics<E extends AnalyticsEventName>(\n event: E,\n payload: AnalyticsEventMap[E] | null,\n): void {\n const analytics = useAnalytics()\n useEffect(() => {\n if (payload !== null) analytics.publish(event, payload)\n }, [analytics, event, payload])\n}\n\nexport interface AnalyticsCartViewProps {\n readonly data?: {\n readonly cart?: { readonly id?: string | null } | null\n readonly id?: string | null\n }\n}\n\nexport function AnalyticsCartView({ data }: AnalyticsCartViewProps): null {\n const cartId = data?.cart?.id ?? data?.id ?? undefined\n const payload = useMemo<AnalyticsEventMap['cart_viewed']>(\n () => (cartId != null ? { cartId } : {}),\n [cartId],\n )\n usePublishAnalytics('cart_viewed', payload)\n return null\n}\n\nexport interface AnalyticsProductViewProps {\n readonly data?: {\n readonly products?: readonly {\n readonly handle?: string | null\n readonly id?: string | null\n readonly price?: number | string | null\n readonly productId?: string | null\n readonly quantity?: number | null\n readonly sku?: string | null\n readonly currency?: string | null\n readonly title?: string | null\n readonly variantId?: string | null\n readonly variantTitle?: string | null\n readonly vendor?: string | null\n }[]\n }\n}\n\nexport function AnalyticsProductView({ data }: AnalyticsProductViewProps): null {\n const product = data?.products?.[0]\n const productId = product?.productId ?? product?.id ?? null\n const handle = product?.handle ?? undefined\n const price = product?.price == null ? undefined : Number(product.price)\n const payload = useMemo<AnalyticsEventMap['product_viewed'] | null>(() => {\n if (productId == null) return null\n return {\n productId,\n ...(handle != null ? { handle } : {}),\n ...(product?.variantId != null ? { variantId: product.variantId } : {}),\n ...(product?.title != null ? { title: product.title } : {}),\n ...(product?.variantTitle != null ? { variantTitle: product.variantTitle } : {}),\n ...(product?.vendor != null ? { vendor: product.vendor } : {}),\n ...(product?.sku != null ? { sku: product.sku } : {}),\n ...(price !== undefined && Number.isFinite(price) ? { price } : {}),\n ...(product?.currency != null ? { currency: product.currency } : {}),\n ...(product?.quantity != null ? { quantity: product.quantity } : {}),\n }\n }, [handle, price, product, productId])\n usePublishAnalytics('product_viewed', payload)\n return null\n}\n\nexport interface AnalyticsCollectionViewProps {\n readonly data?: {\n readonly collection?: {\n readonly handle?: string | null\n readonly id?: string | null\n } | null\n }\n}\n\nexport function AnalyticsCollectionView({ data }: AnalyticsCollectionViewProps): null {\n const collection = data?.collection\n const collectionId = collection?.id ?? null\n const handle = collection?.handle ?? undefined\n const payload = useMemo<AnalyticsEventMap['collection_viewed'] | null>(() => {\n if (collectionId == null) return null\n return {\n collectionId,\n ...(handle != null ? { handle } : {}),\n }\n }, [collectionId, handle])\n usePublishAnalytics('collection_viewed', payload)\n return null\n}\n\nfunction resultCountFromSearchResults(searchResults: unknown): number | undefined {\n if (Array.isArray(searchResults)) return searchResults.length\n if (searchResults != null && typeof searchResults === 'object') {\n const nodes = (searchResults as { readonly nodes?: unknown }).nodes\n if (Array.isArray(nodes)) return nodes.length\n }\n return undefined\n}\n\nexport interface AnalyticsSearchViewProps {\n readonly data?: {\n readonly searchResults?: unknown\n readonly searchTerm?: string | null\n }\n}\n\nexport function AnalyticsSearchView({ data }: AnalyticsSearchViewProps): null {\n const query = data?.searchTerm ?? ''\n const resultCount = resultCountFromSearchResults(data?.searchResults)\n const payload = useMemo<AnalyticsEventMap['search_viewed']>(\n () => ({\n query,\n ...(resultCount != null ? { resultCount } : {}),\n }),\n [query, resultCount],\n )\n usePublishAnalytics('search_viewed', payload)\n return null\n}\n\nexport const Analytics = Object.freeze({\n Provider: AnalyticsProvider,\n CartView: AnalyticsCartView,\n CollectionView: AnalyticsCollectionView,\n ProductView: AnalyticsProductView,\n SearchView: AnalyticsSearchView,\n})\n","import React, { type CSSProperties, type ImgHTMLAttributes, type ReactElement } from 'react'\n\nimport { buildImageAttrs, type ImageAttrsOptions, type ImageData } from '../image/image-attrs'\n\n/** Passthrough `<img>` attributes — the SDK owns the computed ones (src/srcSet/sizes/width/height/loading). */\ntype PassthroughImgProps = Omit<\n ImgHTMLAttributes<HTMLImageElement>,\n 'src' | 'srcSet' | 'sizes' | 'width' | 'height' | 'loading'\n>\n\ntype HydrogenImageData = Omit<ImageData, 'url'> & {\n readonly url?: string | undefined\n}\n\nexport interface ImageProps extends Omit<ImageAttrsOptions, 'data'>, PassthroughImgProps {\n readonly data?: HydrogenImageData | null | undefined\n}\n\n/**\n * Hydrogen-shaped `<Image>` (ADR-0003 §SDK). A thin wrapper: it computes the responsive `<img>`\n * attributes via `buildImageAttrs` (src/srcSet over `/kotao-cdn/*`, CLS-safe via aspect-ratio) and\n * spreads any extra `<img>` props through. All logic lives in `buildImageAttrs` (unit-tested).\n */\nexport function Image(props: ImageProps): ReactElement {\n const {\n data,\n src,\n aspectRatio,\n crop,\n sizes,\n width,\n height,\n loading,\n srcSetWidths,\n format,\n quality,\n alt,\n style,\n ...passthrough\n } = props\n const resolvedData: ImageData = {\n url: src ?? data?.url ?? '',\n altText: alt ?? data?.altText ?? '',\n ...(data?.width != null ? { width: data.width } : {}),\n ...(data?.height != null ? { height: data.height } : {}),\n }\n const { style: aspectStyle, ...imgAttrs } = buildImageAttrs({\n data: resolvedData,\n src,\n aspectRatio,\n crop,\n sizes,\n width,\n height,\n loading,\n srcSetWidths,\n format,\n quality,\n })\n const mergedStyle: CSSProperties = { ...aspectStyle, ...style }\n return <img {...passthrough} {...imgAttrs} style={mergedStyle} />\n}\n","import React, { type ReactElement, type VideoHTMLAttributes } from 'react'\n\nimport type { ImageCrop, ImageData } from '../image/image-attrs'\nimport type { ImageFormat } from '../image/image-url'\nimport { Image } from './image'\n\ninterface ShopifyMediaSource {\n readonly url: string\n readonly mimeType?: string | null\n}\n\ninterface ShopifyMediaData {\n readonly alt?: string | null\n readonly image?: ImageData | null\n readonly mediaContentType?: string | null\n readonly previewImage?: ImageData | null\n readonly sources?: readonly ShopifyMediaSource[] | null\n readonly url?: string | null\n}\n\nexport interface MediaFileImageOptions {\n readonly alt?: string\n readonly aspectRatio?: string\n readonly crop?: ImageCrop\n readonly format?: ImageFormat\n readonly height?: number\n readonly loading?: 'eager' | 'lazy'\n readonly quality?: number\n readonly sizes?: string\n readonly srcSetWidths?: number[]\n readonly width?: number\n}\n\nexport interface MediaFileVideoOptions extends Omit<\n VideoHTMLAttributes<HTMLVideoElement>,\n 'children' | 'className'\n> {\n readonly previewImageOptions?: {\n readonly src?: string\n }\n}\n\nexport interface MediaFileProps {\n readonly className?: string\n readonly data: ShopifyMediaData\n readonly mediaOptions?: {\n readonly image?: MediaFileImageOptions\n readonly video?: MediaFileVideoOptions\n }\n}\n\nfunction imageDataFromMedia(data: ShopifyMediaData, alt?: string): ImageData | null {\n const source = data.image ?? data.previewImage\n if (source != null) {\n return {\n url: source.url,\n altText: alt ?? source.altText ?? data.alt ?? '',\n ...(source.width != null ? { width: source.width } : {}),\n ...(source.height != null ? { height: source.height } : {}),\n }\n }\n if (data.url == null) return null\n return { url: data.url, altText: alt ?? data.alt ?? '' }\n}\n\nexport function MediaFile({ className, data, mediaOptions }: MediaFileProps): ReactElement | null {\n const mediaType = data.mediaContentType?.toUpperCase()\n if (mediaType === 'VIDEO' && data.sources?.length) {\n const { previewImageOptions, ...videoOptions } = mediaOptions?.video ?? {}\n const poster = videoOptions.poster ?? previewImageOptions?.src ?? data.previewImage?.url\n return (\n <video\n {...videoOptions}\n className={className}\n {...(poster != null && poster.length > 0 ? { poster } : {})}\n >\n {data.sources.map((source) => (\n <source key={source.url} src={source.url} type={source.mimeType ?? undefined} />\n ))}\n </video>\n )\n }\n\n const imageOptions = mediaOptions?.image\n const imageData = imageDataFromMedia(data, imageOptions?.alt)\n if (imageData === null) return null\n\n return (\n <Image\n className={className}\n data={imageData}\n {...(imageOptions?.aspectRatio != null ? { aspectRatio: imageOptions.aspectRatio } : {})}\n {...(imageOptions?.crop != null ? { crop: imageOptions.crop } : {})}\n {...(imageOptions?.format != null ? { format: imageOptions.format } : {})}\n {...(imageOptions?.height != null ? { height: imageOptions.height } : {})}\n {...(imageOptions?.loading != null ? { loading: imageOptions.loading } : {})}\n {...(imageOptions?.quality != null ? { quality: imageOptions.quality } : {})}\n {...(imageOptions?.sizes != null ? { sizes: imageOptions.sizes } : {})}\n {...(imageOptions?.srcSetWidths != null ? { srcSetWidths: imageOptions.srcSetWidths } : {})}\n {...(imageOptions?.width != null ? { width: imageOptions.width } : {})}\n />\n )\n}\n","import React, { type ElementType, type ReactElement } from 'react'\n\nexport interface MoneyData {\n readonly amount: string | number\n readonly currencyCode: string\n}\n\nexport interface UseMoneyValue {\n readonly amount: string\n readonly currencyCode: string\n readonly currencyName: string\n readonly currencyNarrowSymbol: string\n readonly currencySymbol: string\n readonly localizedString: string\n readonly withoutTrailingZeros: string\n readonly withoutTrailingZerosAndCurrency: string\n}\n\nexport interface MoneyProps {\n readonly data?: MoneyData | null\n readonly as?: ElementType\n readonly withoutTrailingZeros?: boolean\n readonly withoutCurrency?: boolean\n readonly [prop: string]: unknown\n}\n\nfunction fractionDigits(amount: string | number): number {\n const [, decimals = ''] = String(amount).split('.')\n return decimals.replace(/0+$/u, '').length\n}\n\nfunction currencyPart(currencyCode: string, currencyDisplay: 'symbol' | 'narrowSymbol'): string {\n return (\n new Intl.NumberFormat('en-US', {\n currency: currencyCode,\n currencyDisplay,\n style: 'currency',\n })\n .formatToParts(0)\n .find((part) => part.type === 'currency')?.value ?? currencyCode\n )\n}\n\nfunction formatMoney(\n amount: number,\n currencyCode: string,\n options: { currencyDisplay?: 'symbol' | 'narrowSymbol'; trimZeros?: boolean } = {},\n): string {\n const digits = options.trimZeros === true ? 0 : 2\n return new Intl.NumberFormat('en-US', {\n currency: currencyCode,\n currencyDisplay: options.currencyDisplay ?? 'narrowSymbol',\n maximumFractionDigits: options.trimZeros === true ? fractionDigits(amount) : digits,\n minimumFractionDigits: options.trimZeros === true ? 0 : digits,\n style: 'currency',\n }).format(amount)\n}\n\nfunction formatDecimal(amount: number, originalAmount: string | number): string {\n const digits = fractionDigits(originalAmount)\n return new Intl.NumberFormat('en-US', {\n maximumFractionDigits: Math.max(digits, 0),\n minimumFractionDigits: 0,\n }).format(amount)\n}\n\n/**\n * Hydrogen-shaped money formatter. It is intentionally pure: themes can call it during render without\n * depending on browser APIs beyond `Intl`, and `<Money>` is a thin wrapper over this function.\n */\nexport function useMoney(data: MoneyData): UseMoneyValue {\n const amount = Number(data.amount)\n const currencyCode = data.currencyCode\n const currencyName =\n new Intl.DisplayNames(['en-US'], { type: 'currency' }).of(currencyCode) ?? currencyCode\n\n return {\n amount: String(data.amount),\n currencyCode,\n currencyName,\n currencyNarrowSymbol: currencyPart(currencyCode, 'narrowSymbol'),\n currencySymbol: currencyPart(currencyCode, 'symbol'),\n localizedString: formatMoney(amount, currencyCode),\n withoutTrailingZeros: formatMoney(amount, currencyCode, { trimZeros: true }),\n withoutTrailingZerosAndCurrency: formatDecimal(amount, data.amount),\n }\n}\n\nexport function Money({\n as: Component = 'span',\n data,\n withoutCurrency,\n withoutTrailingZeros,\n ...passthrough\n}: MoneyProps): ReactElement {\n const text =\n data == null\n ? ''\n : withoutCurrency === true\n ? useMoney(data).withoutTrailingZerosAndCurrency\n : withoutTrailingZeros === true\n ? useMoney(data).withoutTrailingZeros\n : useMoney(data).localizedString\n return <Component {...passthrough}>{text}</Component>\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport React, { type AnchorHTMLAttributes, type ReactElement, type ReactNode } from 'react'\n\nimport { getPaginationInfo, type Connection, type PaginationInfo } from '../pagination/pagination'\n\ntype PaginationLinkProps = AnchorHTMLAttributes<HTMLAnchorElement>\n\nexport interface HydrogenPaginationInfo<T = any> extends PaginationInfo<T> {\n readonly isLoading: boolean\n readonly state: 'idle'\n readonly PreviousLink: (props: PaginationLinkProps) => ReactElement\n readonly NextLink: (props: PaginationLinkProps) => ReactElement\n}\n\nexport interface PaginationProps<T = any> {\n connection: Connection<T>\n /** The current request URL. Hydrogen reads it from the router; pass it in to keep this framework-agnostic. */\n currentUrl?: URL | string\n /** Isolates URL params when several paginations share a page. */\n namespace?: string\n children: (state: HydrogenPaginationInfo<T>) => ReactNode\n}\n\n/**\n * Hydrogen-shaped `<Pagination>` (ADR-0003 §SDK). A thin render-props wrapper over `getPaginationInfo`:\n * it hands the theme the current page's `nodes` + ready-built `nextPageUrl`/`prevPageUrl`. All logic\n * lives in `getPaginationInfo` (unit-tested); this just calls the render prop.\n */\nexport function Pagination<T = any>({\n connection,\n currentUrl,\n namespace,\n children,\n}: PaginationProps<T>): ReactElement {\n const info = getPaginationInfo(\n connection,\n currentUrl ?? 'https://storefront.kotao.local/',\n namespace != null ? { namespace } : {},\n )\n const PreviousLink = ({ children: linkChildren, ...props }: PaginationLinkProps) => (\n <a {...props} href={info.prevPageUrl ?? props.href}>\n {linkChildren}\n </a>\n )\n const NextLink = ({ children: linkChildren, ...props }: PaginationLinkProps) => (\n <a {...props} href={info.nextPageUrl ?? props.href}>\n {linkChildren}\n </a>\n )\n return (\n <>\n {children({\n ...info,\n isLoading: false,\n state: 'idle',\n PreviousLink,\n NextLink,\n })}\n </>\n )\n}\n","import React, { type ReactElement } from 'react'\n\nimport { getSeoMeta, serializeJsonLd } from '../seo/get-seo-meta'\nimport type { SeoConfig, SeoDescriptor } from '../seo/types'\n\nexport interface SeoProps {\n /** One or more SEO configs, merged root → leaf (deeper/later wins per field). */\n readonly config: SeoConfig | readonly SeoConfig[]\n}\n\nfunction renderDescriptor(descriptor: SeoDescriptor, key: number): ReactElement {\n if ('title' in descriptor) return <title key={key}>{descriptor.title}</title>\n if ('script:ld+json' in descriptor) {\n // JSON-LD must be injected as raw text; serializeJsonLd escapes `<` so a value containing\n // `</script>` cannot break out (XSS guard). React text children would HTML-escape the JSON instead.\n return (\n <script\n key={key}\n type=\"application/ld+json\"\n dangerouslySetInnerHTML={{ __html: serializeJsonLd(descriptor['script:ld+json']) }}\n />\n )\n }\n if ('tagName' in descriptor) {\n return (\n <link key={key} rel={descriptor.rel} href={descriptor.href} hrefLang={descriptor.hrefLang} />\n )\n }\n if ('property' in descriptor) {\n return <meta key={key} property={descriptor.property} content={descriptor.content} />\n }\n return <meta key={key} name={descriptor.name} content={descriptor.content} />\n}\n\n/**\n * Hydrogen-shaped `<Seo/>` (ADR-0003 §SDK) — renders the head descriptors `getSeoMeta` produces\n * (title, meta, canonical/alternate links, JSON-LD). Themes can use this OR return `getSeoMeta(...)`\n * from a route `meta` export. All merge/emit logic lives in `getSeoMeta` (unit-tested).\n */\nexport function Seo({ config }: SeoProps): ReactElement {\n const configs = (Array.isArray(config) ? [...config] : [config]) as SeoConfig[]\n const descriptors = getSeoMeta(...configs)\n return <>{descriptors.map((descriptor, index) => renderDescriptor(descriptor, index))}</>\n}\n","import React, { type AnchorHTMLAttributes, type CSSProperties, type ReactElement } from 'react'\n\ntype AnchorProps = Omit<AnchorHTMLAttributes<HTMLAnchorElement>, 'href' | 'children'>\n\nexport interface ShopPayButtonProps extends AnchorProps {\n readonly storeDomain?: string\n readonly variantIds: readonly string[]\n readonly width?: CSSProperties['width']\n}\n\nfunction normalizeStoreDomain(storeDomain: string): string {\n return storeDomain.replace(/^https?:\\/\\//, '').replace(/\\/+$/, '')\n}\n\nfunction variantPathSegment(variantId: string): string {\n return variantId.split('/').at(-1) ?? variantId\n}\n\nexport function ShopPayButton({\n storeDomain,\n style,\n variantIds,\n width,\n ...props\n}: ShopPayButtonProps): ReactElement | null {\n if (storeDomain == null || storeDomain.length === 0 || variantIds.length === 0) return null\n\n const domain = normalizeStoreDomain(storeDomain)\n const lines = variantIds.map((variantId) => `${variantPathSegment(variantId)}:1`).join(',')\n const href = `https://${domain}/cart/${lines}?payment=shop_pay`\n const mergedStyle = width == null ? style : ({ ...style, width } satisfies CSSProperties)\n\n return (\n <a\n {...props}\n aria-label={props['aria-label'] ?? 'Buy with Shop Pay'}\n href={href}\n rel={props.target === '_blank' ? 'noreferrer' : props.rel}\n style={mergedStyle}\n >\n Buy with Shop Pay\n </a>\n )\n}\n","import {\n createContext,\n useContext,\n useSyncExternalStore,\n type ReactElement,\n type ReactNode,\n} from 'react'\nimport React from 'react'\n\nimport type { ThemeSettingsStore } from '../settings/store'\nimport type { ResolvedSettings, ThemeSettingsSnapshot } from '../settings/types'\n\n/**\n * React binding for the theme-settings store (#93). Thin over `useSyncExternalStore`: in plain runtime the\n * snapshot is stable (one server render); in the visual editor, live postMessage patches to the store\n * re-render the subscribed sections without a reload. The store (settings/store.ts) holds the logic and is\n * unit-tested; this binding follows the SDK convention of keeping React components as thin wrappers.\n */\nconst ThemeSettingsContext = createContext<ThemeSettingsStore | null>(null)\n\nexport interface ThemeSettingsProviderProps {\n readonly store: ThemeSettingsStore\n readonly children: ReactNode\n}\n\nexport function ThemeSettingsProvider({\n store,\n children,\n}: ThemeSettingsProviderProps): ReactElement {\n return <ThemeSettingsContext.Provider value={store}>{children}</ThemeSettingsContext.Provider>\n}\n\nfunction useThemeSettingsStore(): ThemeSettingsStore {\n const store = useContext(ThemeSettingsContext)\n if (store === null) {\n throw new Error('useThemeSettings must be used within a <ThemeSettingsProvider>')\n }\n return store\n}\n\n/** The merged theme settings; re-renders on live editor patches (`useSyncExternalStore`). */\nexport function useThemeSettings(): ThemeSettingsSnapshot {\n const store = useThemeSettingsStore()\n return useSyncExternalStore(store.subscribe, store.getSnapshot, store.getSnapshot)\n}\n\n/** Merged settings for one section instance (undefined if the instance is absent). */\nexport function useSectionSettings(instanceId: string): ResolvedSettings | undefined {\n return useThemeSettings().sections.find((section) => section.id === instanceId)?.settings\n}\n\n/** The merged global theme tokens (logo, colors, fonts). */\nexport function useGlobalThemeTokens(): ResolvedSettings {\n return useThemeSettings().global\n}\n","import type { Money } from './cart-adapter'\n\n/**\n * Format a Money value as a localised string. When `m.currency` is a valid ISO-4217 code the\n * result is fully currency-formatted (e.g. \"€216.00\"). When it is absent or invalid — which\n * happens on a migrated theme whose `/cart.js` omits the `currency` field — the value degrades\n * gracefully to a plain decimal string (e.g. \"216.00\") rather than throwing a RangeError that\n * would blank the entire drawer.\n */\nexport const formatMoney = (m: Money): string => {\n // EUR is formatted deterministically as \"€1.234,56\" (symbol prefix, dot thousands, comma\n // decimals) — the European display every EUR storefront uses (Shopify's default EUR\n // money_format is `€{{amount_with_comma_separator}}`), independent of the shopper's browser\n // locale. Intl with `undefined` locale would render \"€1,234.56\" on an en-US browser and\n // diverge from the theme's own server-rendered prices.\n if (m.currency === 'EUR' && Number.isFinite(m.amount)) {\n const negative = m.amount < 0\n const abs = Math.round(Math.abs(m.amount))\n const units = Math.floor(abs / 100)\n .toString()\n .replace(/\\B(?=(\\d{3})+(?!\\d))/g, '.')\n return `${negative ? '-' : ''}€${units},${String(abs % 100).padStart(2, '0')}`\n }\n if (m.currency && /^[A-Za-z]{3}$/.test(m.currency)) {\n try {\n return new Intl.NumberFormat(undefined, {\n style: 'currency',\n currency: m.currency,\n }).format(m.amount / 100)\n } catch {\n // Fall through to the plain-number fallback below.\n }\n }\n return new Intl.NumberFormat(undefined, { minimumFractionDigits: 2 }).format(m.amount / 100)\n}\n\n/** Like {@link formatMoney}, but drops the decimals on whole amounts (\"€46\" instead of \"€46,00\") —\n * the original cart app's display for savings amounts and free-shipping progress. */\nexport const formatMoneyCompact = (m: Money): string => {\n const formatted = formatMoney(m)\n return Number.isFinite(m.amount) && Math.round(Math.abs(m.amount)) % 100 === 0\n ? formatted.replace(/[.,]00(?=\\D*$)/, '')\n : formatted\n}\n\nexport const escapeHtml = (s: string | null | undefined): string =>\n String(s ?? '').replace(\n /[&<>\"']/g,\n (c) => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;' })[c]!,\n )\n\n/** Format a remaining-duration in ms as \"mm:ss\" (both zero-padded, floored, clamped at 0) —\n * matching the original cart app's countdown display (\"09:56\"). */\nexport const formatCountdown = (ms: number): string => {\n const total = Number.isFinite(ms) && ms > 0 ? Math.floor(ms / 1000) : 0\n const minutes = Math.floor(total / 60)\n const seconds = total % 60\n return `${String(minutes).padStart(2, '0')}:${String(seconds).padStart(2, '0')}`\n}\n","import { escapeHtml, formatMoney } from '../format'\nimport type { SmartCartLine, SmartCartState } from '../cart-adapter'\nimport type { SmartCartWidget } from './types'\n\n/** The line attribute that flags an add-on line. Shared with the element's toggle handler. */\nexport const ADDON_ATTR_KEY = '_kotao_addon'\nexport const ADDON_ATTR_VALUE = '1'\n/** Config key for the add-on widget (used by the element to resolve the variant's display data). */\nexport const ADDON_KEY = 'addOn'\n\n/** A non-empty variant id string from the passthrough config, or null. */\nfunction readVariantId(config: Record<string, unknown>): string | null {\n const raw = config.variantId\n return typeof raw === 'string' && raw.trim() !== '' ? raw : null\n}\n\n/** Optional merchant subtitle (e.g. \"Protect your order from being lost or damaged.\"); null when unset. */\nfunction readDescription(config: Record<string, unknown>): string | null {\n const raw = config.description\n return typeof raw === 'string' && raw.trim() !== '' ? raw : null\n}\n\n/** Find the add-on line in the cart by its merchandise (variant) id — a reliable round-trip across\n * every adapter, unlike the `_kotao_addon` attribute the migrated `/cart.js` does not echo back. */\nfunction findAddOnLine(state: SmartCartState | null, variantId: string): SmartCartLine | null {\n if (state === null) return null\n return state.lines.find((l) => l.variantId === variantId) ?? null\n}\n\nconst css = `\n .ksc-addon { display: grid; grid-template-columns: auto minmax(0, 1fr) auto auto; align-items: center;\n gap: 2px 12px; padding: 14px 18px; border-top: 1px solid var(--ksc-border); font: inherit; color: var(--ksc-text); }\n .ksc-addon__icon { grid-row: 1 / span 2; width: 44px; height: 44px; display: flex; align-items: center;\n justify-content: center; color: var(--ksc-accent); }\n .ksc-addon__icon svg { width: 34px; height: 34px; }\n .ksc-addon__img { grid-row: 1 / span 2; width: 44px; height: 44px; object-fit: cover; border-radius: 8px;\n background: var(--ksc-border); }\n .ksc-addon__text { grid-column: 2; display: flex; flex-direction: column; gap: 1px; min-width: 0; }\n .ksc-addon__title { font-size: .875rem; font-weight: 600; }\n .ksc-addon__desc { font-size: .76rem; color: var(--ksc-muted); line-height: 1.3; }\n .ksc-addon__price { grid-column: 3; font-size: .875rem; font-weight: 600; white-space: nowrap; }\n .ksc-addon__toggle { grid-column: 4; grid-row: 1 / span 2; width: 42px; height: 24px; padding: 0; border: none;\n border-radius: 999px; background: color-mix(in oklab, var(--ksc-text) 22%, transparent); position: relative;\n cursor: pointer; transition: background .2s ease; flex: 0 0 auto; }\n .ksc-addon__toggle[aria-checked=\"true\"] { background: var(--ksc-accent); }\n .ksc-addon__knob { position: absolute; top: 2px; left: 2px; width: 20px; height: 20px; border-radius: 50%;\n background: #fff; box-shadow: 0 1px 3px rgba(0,0,0,.25); transition: transform .2s ease; }\n .ksc-addon__toggle[aria-checked=\"true\"] .ksc-addon__knob { transform: translateX(18px); }\n @media (prefers-reduced-motion: reduce) { .ksc-addon__toggle, .ksc-addon__knob { transition: none; } }\n`\n\nconst SHIELD_SVG = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M12 3l7 3v5c0 4.6-3 7.8-7 9-4-1.2-7-4.4-7-9V6l7-3z\"/><path d=\"M9 12l2 2 4-4\"/></svg>`\n\n/**\n * Add-on toggle (#1397). Adds/removes a merchant-chosen REAL-product variant as a flagged cart line,\n * rendered as a rich card (icon + title + optional description + price + switch) — mirroring the\n * third-party shipping-protection upsell merchants expect.\n *\n * Reads `variantId` (string, required) and `description` (string, optional) defensively from the\n * passthrough config; renders nothing without a variant id. Title/price/image come from the resolved\n * variant display data (`ctx.variants`, the same `productVariantsByIds` seam the upsell carousel\n * uses) so they show BEFORE the line is added; once the line is in the cart its own data is the\n * fallback, then a generic \"Add-on\". The line is flagged `{ _kotao_addon: '1' }`; the switch is \"on\"\n * when that line is present.\n *\n * The switch only carries intent (data attributes) — the element's delegated panel handler performs\n * the addLine/removeLine mutation and re-renders (widget render() is pure). `defaultOn` (auto-add on\n * first open) is handled by the element, not this widget.\n */\nexport const addOn: SmartCartWidget = {\n key: ADDON_KEY,\n // Footer, not 'after-items': the add-on is a checkout-adjacent offer that must stay pinned above\n // the discount code, NOT scroll away with the upsell carousel. It renders before `discountCode`\n // (WIDGETS registry order) so it sits directly above the code input (#1548 moved the whole\n // 'after-items' zone into the scroll region — only the upsell belongs there).\n zone: 'footer',\n css,\n render({ config, state, variants }) {\n const variantId = readVariantId(config)\n if (variantId === null) return ''\n\n const line = findAddOnLine(state, variantId)\n const checked = line !== null\n const resolved = variants?.get(variantId)\n\n const title = escapeHtml(resolved?.productTitle ?? line?.title ?? 'Add-on')\n // Subtitle: an explicit merchant override wins; otherwise fall back to the product's description.\n const description = readDescription(config) ?? resolved?.productDescription ?? null\n const descHtml = description\n ? `<span class=\"ksc-addon__desc\">${escapeHtml(description)}</span>`\n : ''\n\n const priceMoney = resolved?.price ?? line?.linePrice ?? null\n const priceHtml = priceMoney\n ? `<span class=\"ksc-addon__price\">${escapeHtml(formatMoney(priceMoney))}</span>`\n : ''\n\n const image = resolved?.imageUrl ?? line?.imageUrl ?? null\n const icon = image\n ? `<img class=\"ksc-addon__img\" src=\"${escapeHtml(image)}\" alt=\"\" width=\"34\" height=\"34\">`\n : `<span class=\"ksc-addon__icon\">${SHIELD_SVG}</span>`\n\n const lineIdAttr = line ? ` data-line-id=\"${escapeHtml(line.id)}\"` : ''\n const checkedStr = checked ? 'true' : 'false'\n\n return `<div class=\"ksc-addon\" data-checked=\"${checkedStr}\">\n ${icon}\n <span class=\"ksc-addon__text\"><span class=\"ksc-addon__title\">${title}</span>${descHtml}</span>\n ${priceHtml}\n <button type=\"button\" class=\"ksc-addon__toggle\" role=\"switch\" aria-checked=\"${checkedStr}\" aria-label=\"${title}\" data-smart-cart-addon-toggle data-variant-id=\"${escapeHtml(\n variantId,\n )}\" data-checked=\"${checkedStr}\"${lineIdAttr}><span class=\"ksc-addon__knob\"></span></button>\n </div>`\n },\n}\n","import { escapeHtml, formatCountdown } from '../format'\nimport type { SmartCartWidget } from './types'\n\n/** Default countdown length when `minutes` is absent. */\nexport const DEFAULT_MINUTES = 10\nconst MS_PER_MINUTE = 60_000\n\n/** The two modes. v1 renders both identically — `hold` (real kernel-inventory reservation, #959)\n * is a FOLLOW-UP and is intentionally NOT implemented here. */\nconst MODES = new Set(['display', 'hold'])\nconst DEFAULT_MODE = 'display'\n\n/** A strictly-positive integer minutes value from the passthrough config, or null. */\nfunction readMinutes(config: Record<string, unknown>): number | null {\n const raw = config.minutes\n return typeof raw === 'number' && Number.isFinite(raw) && raw > 0 ? Math.floor(raw) : null\n}\n\n/** Read the `mode` enum defensively; fall back to 'display' when absent/invalid. v1 ignores the\n * distinction for rendering — it is read only so a stored 'hold' config is preserved, not coerced. */\nfunction readMode(config: Record<string, unknown>): string {\n const raw = config.mode\n return typeof raw === 'string' && MODES.has(raw) ? raw : DEFAULT_MODE\n}\n\n/** Optional merchant message shown before the countdown; null when absent/blank. */\nfunction readMessage(config: Record<string, unknown>): string | null {\n const raw = config.message\n return typeof raw === 'string' && raw.trim() !== '' ? raw : null\n}\n\nconst css = `\n .ksc-rt { display: flex; align-items: center; justify-content: center; gap: 4px;\n padding: 9px 16px; font: inherit; font-size: 0.8125rem; font-weight: 400;\n color: var(--ksc-text, #111);\n background: rgb(215, 254, 218); }\n .ksc-rt__count { font-variant-numeric: tabular-nums; font-weight: 700; }\n .ksc-rt__icon { font-size: 0.95em; line-height: 1; }\n @media (prefers-reduced-motion: reduce) { .ksc-rt { transition: none; } }\n`\n\n/**\n * Reservation timer (#1401). Renders a client-side \"expires in m:ss\" countdown in the cart drawer\n * top bar. The widget is pure: it seeds a `[data-ksc-countdown]` span with the initial m:ss (so it\n * is correct before the first tick) and an end-text data attribute; the DRAWER ELEMENT owns the\n * per-second interval and surgically updates the span (widget render() must stay stateless).\n *\n * Reads `minutes` (positive integer, default 10) and `mode` ('display'|'hold', default 'display')\n * defensively from the passthrough config. v1 is `display` only — a pure client countdown with NO\n * real inventory hold, which is what most cart apps ship. `mode:'hold'` renders the SAME display\n * countdown here; the real kernel-inventory reservation (#959) is a follow-up. Renders nothing when\n * `minutes` is invalid. The optional `message` is HTML-escaped; the seed is a trusted numeric format.\n */\nexport const reservationTimer: SmartCartWidget = {\n key: 'reservationTimer',\n zone: 'top-bar',\n css,\n render({ config }) {\n const minutes = readMinutes(config) ?? (config.minutes === undefined ? DEFAULT_MINUTES : null)\n if (minutes === null) return ''\n void readMode(config) // v1: mode does not change rendering; reserved for the #959 follow-up.\n\n const seed = formatCountdown(minutes * MS_PER_MINUTE)\n const message = readMessage(config) ?? 'Your cart will expire in'\n\n return `<div class=\"ksc-rt\">\n <span>${escapeHtml(message)}</span>\n <span class=\"ksc-rt__count\" data-ksc-countdown data-ksc-end-text=\"00:00\">${seed}</span>\n <span class=\"ksc-rt__icon\" aria-hidden=\"true\">⏰</span>\n </div>`\n },\n}\n","import { escapeHtml, formatMoney } from '../format'\nimport type { SmartCartState } from '../cart-adapter'\nimport type { ProductVariantOption, UpsellVariant } from '../variant-lookup'\nimport type { SmartCartWidget } from './types'\n\n/** Widget key — must match the stored config blob + the Workspaces picker (SMART_CART_WIDGET_KEYS). */\nexport const UPSELL_KEY = 'upsell'\n\n/** Line attribute tagging an upsell-added line with the source variant id, so the carousel can\n * hide items already in the cart (and the element can re-render cleanly). */\nexport const UPSELL_VARIANT_ATTR = '_kotao_upsell_variant'\n\n/** Shopify's single-variant sentinel title — noise on a card, so it is not shown as a sub-line. */\nconst DEFAULT_VARIANT_TITLE = 'Default Title'\n\n/**\n * Read the configured variant ids from the upsell passthrough config. The merchant enters ONLY ids\n * (`items: [{ variantId }]`); all display data is fetched live (#1431), never inline. De-duplicates\n * while preserving first-seen order. Tolerates the legacy `{ variantId, title, price, imageUrl }`\n * shape (the extra keys are simply ignored) so older stored blobs keep working without a migration.\n */\nexport function readVariantIds(config: Record<string, unknown>): readonly string[] {\n const raw = config.items\n if (!Array.isArray(raw)) return []\n const ids: string[] = []\n for (const entry of raw) {\n if (typeof entry !== 'object' || entry === null) continue\n const variantId = (entry as { variantId?: unknown }).variantId\n if (typeof variantId === 'string' && variantId.trim() !== '') ids.push(variantId.trim())\n }\n return [...new Set(ids)]\n}\n\n/** Optional merchant section title (e.g. \"BUY 1 GET 1 FREE\"); default mirrors a generic upsell. */\nfunction readTitle(config: Record<string, unknown>): string {\n const raw = config.title\n return typeof raw === 'string' && raw.trim() !== '' ? raw : 'You might also like'\n}\n\n/** Variant ids already represented in the cart — via the upsell tag OR the line's own variant id —\n * so an item the shopper already has is not re-offered. */\nfunction cartVariantIds(state: SmartCartState | null): ReadonlySet<string> {\n if (state === null) return new Set()\n const ids = new Set<string>()\n for (const line of state.lines) {\n const tag = line.attributes?.[UPSELL_VARIANT_ATTR]\n if (typeof tag === 'string') ids.add(tag)\n if (line.variantId !== null && line.variantId !== undefined) ids.add(String(line.variantId))\n }\n return ids\n}\n\nconst ARROW_LEFT_SVG = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M19 12H5M11 6l-6 6 6 6\"/></svg>`\nconst ARROW_RIGHT_SVG = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M5 12h14M13 6l6 6-6 6\"/></svg>`\n\nconst css = `\n .ksc-up { padding: 14px 6px 16px; font: inherit; color: var(--ksc-text); }\n .ksc-up__title { margin: 0 0 10px; font-size: 0.9375rem; font-weight: 700; text-align: center; }\n .ksc-up__row { display: grid; grid-template-columns: 28px minmax(0, 1fr) 28px; align-items: center; gap: 2px; }\n .ksc-up__arrow { display: flex; align-items: center; justify-content: center; width: 28px; height: 28px;\n padding: 0; border: none; background: none; cursor: pointer; color: rgb(52, 64, 84); border-radius: 8px; }\n .ksc-up__arrow:hover { background: var(--ksc-border); }\n .ksc-up__arrow svg { width: 18px; height: 18px; }\n .ksc-up__track { display: flex; gap: 10px; overflow-x: auto; scroll-snap-type: x mandatory;\n scroll-behavior: smooth; -webkit-overflow-scrolling: touch; scrollbar-width: none; }\n .ksc-up__track::-webkit-scrollbar { display: none; }\n .ksc-up__card { scroll-snap-align: start; flex: 0 0 100%; display: grid;\n grid-template-columns: 64px minmax(0, 1fr); gap: 4px 12px; align-items: start;\n border-radius: 12px; padding: 12px; background: rgb(242, 244, 247); box-sizing: border-box; }\n .ksc-up__img { grid-row: 1 / span 4; width: 64px; height: 64px; object-fit: cover; border-radius: 8px;\n background: var(--ksc-surface); }\n .ksc-up__name { font-size: 0.9375rem; font-weight: 700; line-height: 1.25; display: -webkit-box;\n -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }\n .ksc-up__prices { display: flex; align-items: center; flex-wrap: wrap; gap: 6px; font-size: 0.875rem; }\n .ksc-up__price { font-weight: 700; }\n .ksc-up__compare { color: rgb(152, 162, 179); text-decoration: line-through; }\n .ksc-up__save { font-size: 0.75rem; font-weight: 500; color: rgb(7, 148, 85);\n background: rgb(220, 250, 230); padding: 2px 8px; border-radius: 6px; white-space: nowrap; }\n .ksc-up__variant { display: flex; flex-direction: column; gap: 3px; align-items: flex-start;\n font-size: 0.78rem; color: rgb(152, 162, 179); }\n .ksc-up__select { font: inherit; font-size: 0.8125rem; color: var(--ksc-text); padding: 4px 24px 4px 10px;\n border: 1px solid var(--ksc-border); border-radius: 8px; background-color: var(--ksc-surface); cursor: pointer;\n appearance: none; -webkit-appearance: none;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6' fill='none' stroke='%23999' stroke-width='1.5'%3E%3Cpath d='M1 1l4 4 4-4'/%3E%3C/svg%3E\");\n background-repeat: no-repeat; background-position: right 8px center; }\n .ksc-up__add { justify-self: start; margin-top: 6px; padding: 8px 14px; font: inherit; font-size: 0.8125rem;\n font-weight: 600; cursor: pointer; border: none; border-radius: 8px; background: rgb(7, 148, 85);\n color: #fff; transition: opacity .15s ease; }\n .ksc-up__add:hover { opacity: 0.9; }\n .ksc-up__add:focus-visible { outline: 2px solid rgb(7, 148, 85); outline-offset: 2px; }\n @media (prefers-reduced-motion: reduce) { .ksc-up__track { scroll-behavior: auto; } .ksc-up__add { transition: none; } }\n`\n\n/** A single card from live variant data, in the original cart app's horizontal \"layout-1\": image\n * left; title, price row (final bold + struck compare-at + \"You save X%\" badge), an optional\n * size `<select>` over the product's sibling variants, and a green add button on the right. */\nfunction card(\n variant: UpsellVariant,\n currency: string,\n siblings: readonly ProductVariantOption[] | undefined,\n): string {\n const name = escapeHtml(variant.productTitle)\n const img =\n variant.imageUrl !== null\n ? `<img class=\"ksc-up__img\" src=\"${escapeHtml(variant.imageUrl)}\" alt=\"${escapeHtml(variant.imageAltText ?? '')}\" loading=\"lazy\" />`\n : `<div class=\"ksc-up__img\" role=\"presentation\"></div>`\n\n const price = escapeHtml(formatMoney({ amount: variant.price.amount, currency }))\n const showCompare =\n variant.compareAtPrice !== null && variant.compareAtPrice.amount > variant.price.amount\n const compare = showCompare\n ? `<s class=\"ksc-up__compare\">${escapeHtml(formatMoney({ amount: variant.compareAtPrice!.amount, currency }))}</s>`\n : ''\n const savePct = showCompare\n ? Math.round(\n ((variant.compareAtPrice!.amount - variant.price.amount) / variant.compareAtPrice!.amount) *\n 100,\n )\n : 0\n const save = savePct > 0 ? `<span class=\"ksc-up__save\">You save ${savePct}%</span>` : ''\n\n const hasMeaningfulTitle =\n variant.title !== null && variant.title.trim() !== '' && variant.title !== DEFAULT_VARIANT_TITLE\n // A size `<select>` over the product's sibling variants when they have resolved; falls back to\n // the static variant title. The select carries intent only — the element's change handler\n // retargets the sibling add button's data-variant-id.\n const variantHtml =\n siblings !== undefined && siblings.length > 1\n ? `<span class=\"ksc-up__variant\"><span>Size:</span><select class=\"ksc-up__select\" data-smart-cart-upsell-variant aria-label=\"Size\">${siblings\n .map(\n (v) =>\n `<option value=\"${escapeHtml(v.id)}\"${v.id === variant.id ? ' selected' : ''}>${escapeHtml(v.title ?? '')}</option>`,\n )\n .join('')}</select></span>`\n : hasMeaningfulTitle\n ? `<span class=\"ksc-up__variant\"><span>Size:</span><span>${escapeHtml(variant.title!)}</span></span>`\n : ''\n\n return `<div class=\"ksc-up__card\" role=\"listitem\">\n ${img}\n <span class=\"ksc-up__name\">${name}</span>\n <span class=\"ksc-up__prices\"><span class=\"ksc-up__price\">${price}</span>${compare}${save}</span>\n ${variantHtml}\n <button type=\"button\" class=\"ksc-up__add\" data-smart-cart-upsell-add data-variant-id=\"${escapeHtml(variant.id)}\" aria-label=\"Add ${name} to cart\">Add to cart</button>\n </div>`\n}\n\n/**\n * In-cart upsell carousel (#1396). The merchant configures only `items: [{ variantId }]` and an\n * optional section `title`; the card's title, price, image, and parent product are fetched LIVE via\n * the storefront-api `productVariantsByIds` query (#1431) and supplied through `ctx.variants` (the\n * element resolves them async on open and re-renders — widget render stays pure). One card per view\n * with outside prev/next arrows, mirroring the original cart app's layout: the arrows carry intent\n * (`data-smart-cart-upsell-prev/next`); the element's delegated panel handler scrolls the track.\n *\n * Renders nothing until the lookup resolves and at least one configured id resolves to a variant.\n * In-cart filter: a configured id matching a `_kotao_upsell_variant` line attribute OR a line's own\n * variant id is hidden, so the carousel cleanly stops re-offering items already in the cart after\n * re-render. An id whose variant is inactive/unknown (absent from the lookup) is simply skipped.\n */\nexport const upsellCarousel: SmartCartWidget = {\n key: UPSELL_KEY,\n zone: 'after-items',\n css,\n render({ config, state, variants, productVariants }) {\n if (variants === undefined || variants.size === 0) return ''\n const inCart = cartVariantIds(state)\n const cards = readVariantIds(config)\n .filter((id) => !inCart.has(id))\n .map((id) => variants.get(id))\n .filter((variant): variant is UpsellVariant => variant !== undefined)\n .map((variant) =>\n card(\n variant,\n state?.currency ?? variant.price.currency,\n variant.productHandle !== null ? productVariants?.get(variant.productHandle) : undefined,\n ),\n )\n .join('')\n if (cards === '') return ''\n\n return `<section class=\"ksc-up\" aria-label=\"Recommended add-ons\">\n <p class=\"ksc-up__title\">${escapeHtml(readTitle(config))}</p>\n <div class=\"ksc-up__row\">\n <button type=\"button\" class=\"ksc-up__arrow\" data-smart-cart-upsell-prev aria-label=\"Previous item\">${ARROW_LEFT_SVG}</button>\n <div class=\"ksc-up__track\" role=\"list\">${cards}</div>\n <button type=\"button\" class=\"ksc-up__arrow\" data-smart-cart-upsell-next aria-label=\"Next item\">${ARROW_RIGHT_SVG}</button>\n </div>\n </section>`\n },\n}\n","import { escapeHtml } from '../format'\nimport type { SmartCartWidget } from './types'\n\nconst css = `\n .ksc-discount { padding: 10px 20px; display: flex; flex-direction: column; gap: 8px; }\n .ksc-discount__row { display: flex; align-items: center; gap: 6px; padding: 5px 5px 5px 14px;\n border: 1px solid rgb(190, 190, 190); border-radius: 10px; background: var(--ksc-surface); }\n .ksc-discount__row:focus-within { border-color: var(--ksc-text); }\n .ksc-discount__input { flex: 1; min-width: 0; padding: 6px 0; border: none; background: none;\n color: var(--ksc-text); font: inherit; font-size: 0.875rem; outline: none; }\n .ksc-discount__apply { padding: 8px 16px; border: none; border-radius: 8px;\n background: rgb(220, 250, 230); color: var(--ksc-text); font: inherit; font-size: 0.875rem;\n font-weight: 500; cursor: pointer; white-space: nowrap; }\n .ksc-discount__apply:hover { filter: brightness(0.97); }\n .ksc-discount__chips { display: flex; flex-wrap: wrap; gap: 6px; }\n .ksc-discount__chip { display: inline-flex; align-items: center; gap: 5px; padding: 3px 8px 3px 10px; background: rgb(242, 244, 247); border-radius: 999px; font-size: 0.8125rem; color: var(--ksc-text); }\n .ksc-discount__chip-remove { display: inline-flex; align-items: center; justify-content: center; background: none; border: none; cursor: pointer; padding: 2px; color: color-mix(in oklab, var(--ksc-text) 60%, transparent); line-height: 1; font-size: 1rem; }\n .ksc-discount__chip-remove:hover { color: var(--ksc-text); }\n`\n\nconst REMOVE_SVG = `<svg viewBox=\"0 0 16 16\" width=\"12\" height=\"12\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><path d=\"M3 3l10 10M13 3L3 13\"/></svg>`\n\n/**\n * Discount-code input widget (#1398). Renders a text input + apply button, plus a chip for each\n * currently applied code. The chip has a remove button. All mutation intent is carried via data\n * attributes — the element's delegated panel click handler performs the actual `updateDiscountCodes`\n * call and re-renders (widget render is pure / side-effect-free).\n */\nexport const discountCode: SmartCartWidget = {\n key: 'discountCode',\n zone: 'footer',\n css,\n render({ state }) {\n const codes = state?.appliedCodes ?? []\n\n const chipsHtml =\n codes.length > 0\n ? `<div class=\"ksc-discount__chips\">${codes\n .map(\n (code) =>\n `<span class=\"ksc-discount__chip\"><span>${escapeHtml(code)}</span><button type=\"button\" class=\"ksc-discount__chip-remove\" data-smart-cart-discount-remove data-code=\"${escapeHtml(code)}\" aria-label=\"Remove discount code ${escapeHtml(code)}\">${REMOVE_SVG}</button></span>`,\n )\n .join('')}</div>`\n : ''\n\n return `<div class=\"ksc-discount\">\n <div class=\"ksc-discount__row\">\n <input id=\"ksc-discount-input\" class=\"ksc-discount__input\" type=\"text\" placeholder=\"Discount code\" aria-label=\"Discount code\" data-smart-cart-discount-input>\n <button type=\"button\" class=\"ksc-discount__apply\" data-smart-cart-discount-apply aria-label=\"Apply discount code\">Apply</button>\n </div>${chipsHtml ? `\\n ${chipsHtml}` : ''}\n</div>`\n },\n}\n","import { escapeHtml, formatMoneyCompact } from '../format'\nimport type { SmartCartWidget } from './types'\n\n/** A finite, strictly-positive integer threshold (minor units), or null when missing/invalid. */\nfunction readThreshold(config: Record<string, unknown>): number | null {\n const raw = config.threshold\n return typeof raw === 'number' && Number.isFinite(raw) && raw > 0 ? Math.round(raw) : null\n}\n\nfunction readMessage(\n config: Record<string, unknown>,\n key: 'messageBefore' | 'messageAfter',\n): string | null {\n const raw = config[key]\n return typeof raw === 'string' && raw.trim() !== '' ? raw : null\n}\n\n/** Escape a merchant message template, bolding the `{amount}` substitution. The template text is\n * untrusted (escaped); only the widget's own `<b>` wrapper and the formatted amount are emitted\n * as markup. */\nfunction renderTemplate(template: string, amount: string): string {\n return template\n .split(/\\{amount\\}/g)\n .map((part) => escapeHtml(part))\n .join(`<b>${escapeHtml(amount)}</b>`)\n}\n\nconst TRUCK_SVG = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M1 5h14v11H1zM15 9h4l3 3v4h-7z\"/><circle cx=\"6\" cy=\"18.5\" r=\"1.8\"/><circle cx=\"18\" cy=\"18.5\" r=\"1.8\"/></svg>`\n\nconst css = `\n .ksc-fsb { padding: 14px 20px 10px; font: inherit; color: var(--ksc-text); }\n .ksc-fsb__msg { margin: 0 0 10px; font-size: 0.8125rem; text-align: center; }\n .ksc-fsb__msg b { font-weight: 700; }\n .ksc-fsb__track { position: relative; height: 8px; border-radius: 999px;\n background: rgb(234, 236, 240); }\n .ksc-fsb__fill { height: 100%; border-radius: 999px; background: rgb(29, 41, 57);\n transition: width .3s ease; }\n .ksc-fsb__step { position: absolute; right: -2px; top: 50%; transform: translateY(-50%);\n width: 14px; height: 14px; border-radius: 4px; border: 2px solid rgb(29, 41, 57);\n background: var(--ksc-surface); box-sizing: border-box; }\n .ksc-fsb--unlocked .ksc-fsb__step { background: rgb(29, 41, 57); }\n .ksc-fsb__tier { display: flex; flex-direction: column; align-items: flex-end; gap: 1px;\n margin-top: 6px; font-size: 0.78rem; color: rgb(152, 162, 179); }\n .ksc-fsb__tier svg { width: 20px; height: 20px; }\n .ksc-fsb--unlocked .ksc-fsb__tier { color: rgb(29, 41, 57); }\n @media (prefers-reduced-motion: reduce) { .ksc-fsb__fill { transition: none; } }\n`\n\n/**\n * Free-shipping progress bar (#1395), styled to match the original cart app's tiered-promotions\n * bar: a centered message with the remaining amount in bold, a grey track with a dark fill and a\n * square tier marker at the end, and a truck-icon tier label underneath. Reads `threshold`\n * (integer minor units) and optional `messageBefore`/`messageAfter` from its passthrough config\n * (`{amount}` substitutes the formatted remaining amount, rendered bold). Renders nothing without\n * a valid threshold or cart state.\n */\nexport const freeShippingBar: SmartCartWidget = {\n key: 'freeShippingBar',\n zone: 'before-items',\n css,\n render({ config, state }) {\n const threshold = readThreshold(config)\n if (threshold === null || state === null) return ''\n\n // Progress toward free shipping is measured on what the shopper actually PAYS — the discounted\n // total (subtotal minus cart discounts, e.g. a BOGO), not the pre-discount gross. Otherwise a\n // €61 cart (after a €54 BOGO) would wrongly \"unlock\" a €100 threshold on its €115 gross.\n const discountTotal = state.discountTotal?.amount ?? 0\n const subtotal = Math.max(0, state.subtotal.amount - discountTotal)\n const remaining = Math.max(0, threshold - subtotal)\n const unlocked = remaining === 0\n const pct = Math.min(100, Math.round((subtotal / threshold) * 100))\n const remainingMoney = formatMoneyCompact({\n amount: remaining,\n currency: state.subtotal.currency,\n })\n\n const beforeTemplate = readMessage(config, 'messageBefore')\n const afterTemplate = readMessage(config, 'messageAfter')\n\n // Defaults mirror the original cart app's tier texts (\"Add X to unlock Free shipping!\" /\n // \"Free shipping unlocked!\"). A merchant template is escaped with `{amount}` bolded.\n const message = unlocked\n ? afterTemplate !== null\n ? renderTemplate(afterTemplate, remainingMoney)\n : `<b>Free shipping</b> unlocked!`\n : beforeTemplate !== null\n ? renderTemplate(beforeTemplate, remainingMoney)\n : `Add <b>${escapeHtml(remainingMoney)}</b> to unlock <b>Free shipping</b>!`\n\n return `<div class=\"ksc-fsb${unlocked ? ' ksc-fsb--unlocked' : ''}\">\n <p class=\"ksc-fsb__msg\">${message}</p>\n <div class=\"ksc-fsb__track\"><div class=\"ksc-fsb__fill\" style=\"width: ${pct}%\"></div><span class=\"ksc-fsb__step\" aria-hidden=\"true\"></span></div>\n <div class=\"ksc-fsb__tier\">${TRUCK_SVG}<span>${unlocked ? '' : '🔒 '}Free shipping</span></div>\n </div>`\n },\n}\n","import type { SmartCartWidget } from './types'\n\n/** The two anchor positions the bubble supports. */\nconst POSITIONS = new Set(['bottom-right', 'bottom-left'])\nconst DEFAULT_POSITION = 'bottom-right'\n\n/** The two visual styles the bubble supports. */\nconst STYLES = new Set(['solid', 'outline'])\nconst DEFAULT_STYLE = 'solid'\n\n/** Read a known-enum string from the passthrough blob; fall back to `fallback` when absent/invalid. */\nfunction readEnum(\n config: Record<string, unknown>,\n key: string,\n allowed: Set<string>,\n fallback: string,\n): string {\n const raw = config[key]\n return typeof raw === 'string' && allowed.has(raw) ? raw : fallback\n}\n\n/** Total item count = sum of line quantities; 0 when state is null/empty. */\nfunction itemCount(lines: ReadonlyArray<{ quantity: number }> | undefined): number {\n return (lines ?? []).reduce((sum, l) => sum + l.quantity, 0)\n}\n\nconst css = `\n .ksc-sb { position: fixed; z-index: 1; display: inline-flex; align-items: center; justify-content: center;\n width: 56px; height: 56px; border: none; border-radius: 9999px; cursor: pointer;\n background: var(--ksc-accent); color: var(--ksc-accent-text);\n box-shadow: 0 6px 20px rgba(0,0,0,.25); transition: transform .15s ease; font: inherit; }\n .ksc-sb:hover { transform: scale(1.06); }\n .ksc-sb:focus-visible { outline: 2px solid var(--ksc-accent-text); outline-offset: 2px; }\n .ksc-sb--bottom-right { right: 20px; bottom: 20px; }\n .ksc-sb--bottom-left { left: 20px; bottom: 20px; }\n .ksc-sb--outline { background: var(--ksc-surface); color: var(--ksc-accent);\n border: 2px solid var(--ksc-accent); }\n .ksc-sb__icon { width: 24px; height: 24px; display: block; }\n .ksc-sb__badge { position: absolute; top: -4px; right: -4px; min-width: 20px; height: 20px;\n padding: 0 5px; border-radius: 9999px; background: var(--ksc-text); color: var(--ksc-surface);\n font-size: 12px; line-height: 20px; text-align: center; font-weight: 600; }\n @media (prefers-reduced-motion: reduce) { .ksc-sb { transition: none; } .ksc-sb:hover { transform: none; } }\n`\n\n// Inline CC0 cart glyph (trusted constant — not config-derived, so safe to emit unescaped).\nconst CART_ICON = `<svg class=\"ksc-sb__icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><circle cx=\"9\" cy=\"21\" r=\"1\"/><circle cx=\"20\" cy=\"21\" r=\"1\"/><path d=\"M1 1h4l2.68 13.39a2 2 0 0 0 2 1.61h9.72a2 2 0 0 0 2-1.61L23 6H6\"/></svg>`\n\n/**\n * Sticky cart bubble (#1400). A floating button that opens the Smart Cart drawer and shows a live\n * item-count badge. `placement: 'chrome'` — it renders outside `.panel` and stays clickable while\n * the drawer is closed. Reads `position` ('bottom-right'|'bottom-left') and `style` ('solid'|'outline')\n * defensively from the passthrough config; both fall back to a default when absent/invalid. The count\n * is numeric and config only ever selects from known-enum classes, so no value is raw-interpolated.\n */\nexport const stickyBubble: SmartCartWidget = {\n key: 'stickyBubble',\n placement: 'chrome',\n css,\n render({ config, state }) {\n const position = readEnum(config, 'position', POSITIONS, DEFAULT_POSITION)\n const style = readEnum(config, 'style', STYLES, DEFAULT_STYLE)\n const count = itemCount(state?.lines)\n const badge = count > 0 ? `<span class=\"ksc-sb__badge\" data-count-badge>${count}</span>` : ''\n return `<button type=\"button\" data-smart-cart-open aria-label=\"Open cart\"\n class=\"ksc-sb ksc-sb--${position} ksc-sb--${style}\">${CART_ICON}${badge}</button>`\n },\n}\n","/**\n * Payment-method icon SVGs for the Smart Cart trust-badges widget (issue #1399).\n *\n * Copied verbatim from packages/liquid/src/payment-icons.ts — DO NOT import @kotao/liquid here,\n * as that would bundle the full LiquidJS runtime into the smart-cart browser IIFE.\n * Keep this file in sync with the source when new icons are added there.\n *\n * Source: gilbarbara/logos (https://github.com/gilbarbara/logos), license CC0 1.0 Universal\n * (public domain dedication — https://creativecommons.org/publicdomain/zero/1.0/). No attribution\n * is required; this header is courtesy. Each SVG below is vendored from\n * https://raw.githubusercontent.com/gilbarbara/logos/main/logos/<name>.svg with the leading\n * `<?xml …?>` prolog stripped (invalid inside an HTML body) and every internal id namespaced with\n * its icon key (e.g. `linearGradient-1` → `visa-linearGradient-1`). Inline SVGs share ONE document\n * id namespace, so without this rendering several icons together would resolve a later icon’s\n * `url(#…)` / `xlink:href=\"#…\"` reference to the FIRST same-id definition (wrong gradient/clip).\n * The logos are clean static SVGs — no <script> tags and no inline event handlers (verified at\n * vendor time).\n *\n * Keys: visa, mastercard, amex, maestro, discover, jcb, unionpay, paypal, apple-pay, google-pay.\n * (apple-pay / google-pay are vendored from the same liquid source so the badge row can match\n * an original store's wallet icons; neither SVG contains internal ids, so no namespacing needed.)\n */\nexport const PAYMENT_ICON_SVGS: Record<string, string> = {\n visa: `<svg width=\"256px\" height=\"83px\" viewBox=\"0 0 256 83\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" preserveAspectRatio=\"xMidYMid\">\n <defs>\n <linearGradient x1=\"45.9741966%\" y1=\"-2.00617467%\" x2=\"54.8768726%\" y2=\"100%\" id=\"visa-linearGradient-1\">\n <stop stop-color=\"#222357\" offset=\"0%\"></stop>\n <stop stop-color=\"#254AA5\" offset=\"100%\"></stop>\n </linearGradient>\n </defs>\n <g>\n <path d=\"M132.397094,56.2397455 C132.251036,44.7242808 142.65954,38.2977599 150.500511,34.4772086 C158.556724,30.5567233 161.262627,28.0430004 161.231878,24.5376253 C161.17038,19.1719416 154.805357,16.804276 148.847757,16.7120293 C138.454628,16.5505975 132.412467,19.5178668 127.607952,21.7625368 L123.864273,4.24334875 C128.684163,2.02174043 137.609033,0.084559486 146.864453,-7.10542736e-15 C168.588553,-7.10542736e-15 182.802234,10.7236802 182.879107,27.3511501 C182.963666,48.4525854 153.69071,49.6210438 153.890577,59.05327 C153.959762,61.912918 156.688728,64.964747 162.669389,65.7411565 C165.628971,66.133205 173.800493,66.433007 183.0636,62.1665965 L186.699658,79.11693 C181.718335,80.931115 175.314876,82.6684285 167.343223,82.6684285 C146.895202,82.6684285 132.512402,71.798691 132.397094,56.2397455 M221.6381,81.2078555 C217.671491,81.2078555 214.327548,78.8940005 212.836226,75.342502 L181.802894,1.24533061 L203.511621,1.24533061 L207.831842,13.1835926 L234.360459,13.1835926 L236.866494,1.24533061 L256,1.24533061 L239.303345,81.2078555 L221.6381,81.2078555 M224.674554,59.6067505 L230.939643,29.5804456 L213.781755,29.5804456 L224.674554,59.6067505 M106.076031,81.2078555 L88.9642665,1.24533061 L109.650591,1.24533061 L126.754669,81.2078555 L106.076031,81.2078555 M75.473185,81.2078555 L53.941265,26.7822953 L45.2316377,73.059396 C44.2092367,78.2252115 40.1734431,81.2078555 35.6917903,81.2078555 L0.491982464,81.2078555 L0,78.886313 C7.22599245,77.318119 15.4359498,74.7890215 20.409585,72.083118 C23.4537265,70.4303645 24.322383,68.985166 25.3217224,65.0569935 L41.8185094,1.24533061 L63.68098,1.24533061 L97.1972855,81.2078555 L75.473185,81.2078555\" fill=\"url(#visa-linearGradient-1)\" transform=\"translate(128.000000, 41.334214) scale(1, -1) translate(-128.000000, -41.334214) \"></path>\n </g>\n</svg>`,\n mastercard: `<svg width=\"256px\" height=\"199px\" viewBox=\"0 0 256 199\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" preserveAspectRatio=\"xMidYMid\">\n\t<g>\n\t\t<path d=\"M46.5392504,198.011312 L46.5392504,184.839826 C46.5392504,179.790757 43.4659038,176.497885 38.1973096,176.497885 C35.5630125,176.497885 32.7091906,177.375984 30.7334678,180.229806 C29.1967945,177.815034 27.0015469,176.497885 23.7086756,176.497885 C21.513428,176.497885 19.3181804,177.15646 17.5619824,179.571233 L17.5619824,176.936935 L12.9519625,176.936935 L12.9519625,198.011312 L17.5619824,198.011312 L17.5619824,186.3765 C17.5619824,182.644579 19.5377052,180.888381 22.6110518,180.888381 C25.6843984,180.888381 27.2210717,182.864103 27.2210717,186.3765 L27.2210717,198.011312 L31.8310916,198.011312 L31.8310916,186.3765 C31.8310916,182.644579 34.0263392,180.888381 36.880161,180.888381 C39.9535076,180.888381 41.490181,182.864103 41.490181,186.3765 L41.490181,198.011312 L46.5392504,198.011312 L46.5392504,198.011312 Z M114.81145,176.936935 L107.347608,176.936935 L107.347608,170.570717 L102.737589,170.570717 L102.737589,176.936935 L98.566618,176.936935 L98.566618,181.107905 L102.737589,181.107905 L102.737589,190.766995 C102.737589,195.59654 104.713311,198.450362 109.981906,198.450362 C111.957628,198.450362 114.152876,197.791787 115.689549,196.913688 L114.372401,192.962243 C113.055252,193.840341 111.518579,194.059866 110.420955,194.059866 C108.225708,194.059866 107.347608,192.742718 107.347608,190.54747 L107.347608,181.107905 L114.81145,181.107905 L114.81145,176.936935 L114.81145,176.936935 Z M153.886857,176.497885 C151.25256,176.497885 149.496362,177.815034 148.398738,179.571233 L148.398738,176.936935 L143.788718,176.936935 L143.788718,198.011312 L148.398738,198.011312 L148.398738,186.156975 C148.398738,182.644579 149.935411,180.668856 152.789233,180.668856 C153.667332,180.668856 154.764956,180.888381 155.643055,181.107905 L156.960204,176.71741 C156.082105,176.497885 154.764956,176.497885 153.886857,176.497885 L153.886857,176.497885 L153.886857,176.497885 Z M94.834697,178.693133 C92.6394495,177.15646 89.566103,176.497885 86.2732315,176.497885 C81.0046375,176.497885 77.492241,179.132183 77.492241,183.303153 C77.492241,186.81555 80.1265385,188.791272 84.736558,189.449847 L86.931806,189.669371 C89.346578,190.10842 90.6637265,190.766995 90.6637265,191.864619 C90.6637265,193.401292 88.9075285,194.498916 85.834182,194.498916 C82.7608355,194.498916 80.346063,193.401292 78.8093895,192.303668 L76.614142,195.816065 C79.0289145,197.572262 82.321786,198.450362 85.614657,198.450362 C91.7613505,198.450362 95.2737465,195.59654 95.2737465,191.645094 C95.2737465,187.913173 92.4199245,185.937451 88.0294295,185.278876 L85.834182,185.059351 C83.858459,184.839826 82.321786,184.400777 82.321786,183.083629 C82.321786,181.546955 83.858459,180.668856 86.2732315,180.668856 C88.9075285,180.668856 91.5418255,181.76648 92.858974,182.425054 L94.834697,178.693133 L94.834697,178.693133 Z M217.329512,176.497885 C214.695215,176.497885 212.939017,177.815034 211.841393,179.571233 L211.841393,176.936935 L207.231373,176.936935 L207.231373,198.011312 L211.841393,198.011312 L211.841393,186.156975 C211.841393,182.644579 213.378066,180.668856 216.231888,180.668856 C217.109987,180.668856 218.207611,180.888381 219.08571,181.107905 L220.402859,176.71741 C219.52476,176.497885 218.207611,176.497885 217.329512,176.497885 L217.329512,176.497885 L217.329512,176.497885 Z M158.496877,187.474123 C158.496877,193.840341 162.887372,198.450362 169.69264,198.450362 C172.765986,198.450362 174.961234,197.791787 177.156481,196.035589 L174.961234,192.303668 C173.205036,193.620817 171.448838,194.279391 169.473115,194.279391 C165.741194,194.279391 163.106897,191.645094 163.106897,187.474123 C163.106897,183.522678 165.741194,180.888381 169.473115,180.668856 C171.448838,180.668856 173.205036,181.32743 174.961234,182.644579 L177.156481,178.912658 C174.961234,177.15646 172.765986,176.497885 169.69264,176.497885 C162.887372,176.497885 158.496877,181.107905 158.496877,187.474123 L158.496877,187.474123 L158.496877,187.474123 Z M201.08468,187.474123 L201.08468,176.936935 L196.47466,176.936935 L196.47466,179.571233 C194.937987,177.595509 192.742739,176.497885 189.888917,176.497885 C183.961749,176.497885 179.351729,181.107905 179.351729,187.474123 C179.351729,193.840341 183.961749,198.450362 189.888917,198.450362 C192.962264,198.450362 195.157512,197.352737 196.47466,195.377015 L196.47466,198.011312 L201.08468,198.011312 L201.08468,187.474123 Z M184.181274,187.474123 C184.181274,183.742202 186.596046,180.668856 190.547492,180.668856 C194.279413,180.668856 196.91371,183.522678 196.91371,187.474123 C196.91371,191.206044 194.279413,194.279391 190.547492,194.279391 C186.596046,194.059866 184.181274,191.206044 184.181274,187.474123 L184.181274,187.474123 Z M129.080559,176.497885 C122.933866,176.497885 118.543371,180.888381 118.543371,187.474123 C118.543371,194.059866 122.933866,198.450362 129.300084,198.450362 C132.373431,198.450362 135.446777,197.572262 137.861549,195.59654 L135.666302,192.303668 C133.910104,193.620817 131.714856,194.498916 129.519609,194.498916 C126.665787,194.498916 123.811965,193.181768 123.153391,189.449847 L138.739648,189.449847 L138.739648,187.693648 C138.959173,180.888381 135.007727,176.497885 129.080559,176.497885 L129.080559,176.497885 L129.080559,176.497885 Z M129.080559,180.449331 C131.934381,180.449331 133.910104,182.20553 134.349153,185.498401 L123.372916,185.498401 C123.811965,182.644579 125.787688,180.449331 129.080559,180.449331 L129.080559,180.449331 Z M243.452958,187.474123 L243.452958,168.594995 L238.842938,168.594995 L238.842938,179.571233 C237.306265,177.595509 235.111017,176.497885 232.257196,176.497885 C226.330027,176.497885 221.720007,181.107905 221.720007,187.474123 C221.720007,193.840341 226.330027,198.450362 232.257196,198.450362 C235.330542,198.450362 237.52579,197.352737 238.842938,195.377015 L238.842938,198.011312 L243.452958,198.011312 L243.452958,187.474123 Z M226.549552,187.474123 C226.549552,183.742202 228.964324,180.668856 232.91577,180.668856 C236.647691,180.668856 239.281988,183.522678 239.281988,187.474123 C239.281988,191.206044 236.647691,194.279391 232.91577,194.279391 C228.964324,194.059866 226.549552,191.206044 226.549552,187.474123 L226.549552,187.474123 Z M72.443172,187.474123 L72.443172,176.936935 L67.833152,176.936935 L67.833152,179.571233 C66.2964785,177.595509 64.101231,176.497885 61.247409,176.497885 C55.3202405,176.497885 50.7102205,181.107905 50.7102205,187.474123 C50.7102205,193.840341 55.3202405,198.450362 61.247409,198.450362 C64.3207555,198.450362 66.5160035,197.352737 67.833152,195.377015 L67.833152,198.011312 L72.443172,198.011312 L72.443172,187.474123 Z M55.3202405,187.474123 C55.3202405,183.742202 57.735013,180.668856 61.6864585,180.668856 C65.4183795,180.668856 68.0526765,183.522678 68.0526765,187.474123 C68.0526765,191.206044 65.4183795,194.279391 61.6864585,194.279391 C57.735013,194.059866 55.3202405,191.206044 55.3202405,187.474123 Z\" fill=\"#000000\"></path>\n\t\t<rect fill=\"#FF5F00\" x=\"93.2980455\" y=\"16.9034088\" width=\"69.1502985\" height=\"124.251009\"></rect>\n\t\t<path d=\"M97.688519,79.0288935 C97.688519,53.783546 109.542856,31.3920209 127.763411,16.9033869 C114.3724,6.3661985 97.468994,-1.94737475e-05 79.0289145,-1.94737475e-05 C35.3434877,-1.94737475e-05 1.7258174e-06,35.3434665 1.7258174e-06,79.0288935 C1.7258174e-06,122.71432 35.3434877,158.057806 79.0289145,158.057806 C97.468994,158.057806 114.3724,151.691588 127.763411,141.1544 C109.542856,126.88529 97.688519,104.274241 97.688519,79.0288935 Z\" fill=\"#EB001B\"></path>\n\t\t<path d=\"M255.746345,79.0288935 C255.746345,122.71432 220.402859,158.057806 176.717432,158.057806 C158.277352,158.057806 141.373945,151.691588 127.982936,141.1544 C146.423015,126.665766 158.057827,104.274241 158.057827,79.0288935 C158.057827,53.783546 146.20349,31.3920209 127.982936,16.9033869 C141.373945,6.3661985 158.277352,-1.94737475e-05 176.717432,-1.94737475e-05 C220.402859,-1.94737475e-05 255.746345,35.5629913 255.746345,79.0288935 Z\" fill=\"#F79E1B\"></path>\n\t</g>\n</svg>`,\n amex: `<svg width=\"256px\" height=\"256px\" viewBox=\"0 0 256 256\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" preserveAspectRatio=\"xMidYMid\">\n <title>AMEX</title>\n <g>\n <path d=\"M256,138.547884 L256,0 L0,0 L0,256 L256,256 L256,181.309577 C255.429844,181.309577 256,138.547884 256,138.547884\" fill=\"#006FCF\"></path>\n <path d=\"M224.641425,124.293987 L244.026726,124.293987 L244.026726,79.2516704 L222.930958,79.2516704 L222.930958,85.5233853 L218.939866,79.2516704 L200.694878,79.2516704 L200.694878,87.233853 L197.273942,79.2516704 L163.634744,79.2516704 C162.494432,79.2516704 161.35412,79.8218263 160.213808,79.8218263 C159.073497,79.8218263 158.503341,80.3919822 157.363029,80.9621381 C156.222717,81.532294 155.652561,81.532294 154.512249,82.1024499 L154.512249,79.2516704 L58.155902,79.2516704 L55.3051225,86.6636971 L52.454343,79.2516704 L29.6481069,79.2516704 L29.6481069,87.233853 L26.2271715,79.2516704 L7.98218263,79.2516704 L0,98.636971 L0,124.293987 L13.1135857,124.293987 L15.3942094,118.022272 L19.9554566,118.022272 L22.2360802,124.293987 L122.583519,124.293987 L122.583519,118.592428 L126.57461,124.293987 L154.512249,124.293987 L154.512249,120.873051 C155.082405,121.443207 156.222717,121.443207 156.792873,122.013363 C157.363029,122.583519 158.503341,122.583519 159.073497,123.153675 C160.213808,123.723831 161.35412,123.723831 162.494432,123.723831 L183.020045,123.723831 L185.300668,117.452116 L189.861915,117.452116 L192.142539,123.723831 L220.080178,123.723831 L220.080178,118.022272 L224.641425,124.293987 L224.641425,124.293987 Z M256,181.309577 L256,139.11804 L99.2071269,139.11804 L95.2160356,144.819599 L91.2249443,139.11804 L45.6124722,139.11804 L45.6124722,184.160356 L91.2249443,184.160356 L95.2160356,178.458797 L99.2071269,184.160356 L127.714922,184.160356 L127.714922,174.467706 L126.57461,174.467706 C130.565702,174.467706 133.986637,173.89755 136.837416,172.757238 L136.837416,184.730512 L157.363029,184.730512 L157.363029,179.028953 L161.35412,184.730512 L246.30735,184.730512 C249.728285,183.5902 253.14922,183.020045 256,181.309577 L256,181.309577 Z\" fill=\"#FFFFFF\"></path>\n <path d=\"M246.30735,170.476615 L230.91314,170.476615 L230.91314,176.74833 L245.737194,176.74833 C252.008909,176.74833 256,172.757238 256,167.055679 C256,161.35412 252.579065,158.503341 246.877506,158.503341 L240.035635,158.503341 C238.325167,158.503341 237.184855,157.363029 237.184855,155.652561 C237.184855,153.942094 238.325167,152.801782 240.035635,152.801782 L253.14922,152.801782 L256,146.530067 L240.605791,146.530067 C234.334076,146.530067 230.342984,150.521158 230.342984,155.652561 C230.342984,161.35412 233.76392,164.2049 239.465479,164.2049 L246.30735,164.2049 C248.017817,164.2049 249.158129,165.345212 249.158129,167.055679 C249.728285,169.336303 248.587973,170.476615 246.30735,170.476615 L246.30735,170.476615 Z M218.36971,170.476615 L202.975501,170.476615 L202.975501,176.74833 L217.799555,176.74833 C224.071269,176.74833 228.062361,172.757238 228.062361,167.055679 C228.062361,161.35412 224.641425,158.503341 218.939866,158.503341 L212.097996,158.503341 C210.387528,158.503341 209.247216,157.363029 209.247216,155.652561 C209.247216,153.942094 210.387528,152.801782 212.097996,152.801782 L225.211581,152.801782 L228.062361,146.530067 L212.668151,146.530067 C206.396437,146.530067 202.405345,150.521158 202.405345,155.652561 C202.405345,161.35412 205.826281,164.2049 211.52784,164.2049 L218.36971,164.2049 C220.080178,164.2049 221.22049,165.345212 221.22049,167.055679 C221.790646,169.336303 220.080178,170.476615 218.36971,170.476615 L218.36971,170.476615 Z M198.414254,152.231626 L198.414254,145.959911 L174.467706,145.959911 L174.467706,176.178174 L198.414254,176.178174 L198.414254,169.906459 L181.309577,169.906459 L181.309577,163.634744 L197.844098,163.634744 L197.844098,157.363029 L181.309577,157.363029 L181.309577,151.66147 L198.414254,151.66147 L198.414254,152.231626 L198.414254,152.231626 Z M159.643653,152.231626 C162.494432,152.231626 163.634744,153.942094 163.634744,155.652561 C163.634744,157.363029 162.494432,159.073497 159.643653,159.073497 L151.091314,159.073497 L151.091314,151.66147 L159.643653,152.231626 L159.643653,152.231626 Z M151.091314,165.345212 L154.512249,165.345212 L163.634744,176.178174 L172.187082,176.178174 L161.924276,164.775056 C167.055679,163.634744 169.906459,160.213808 169.906459,155.652561 C169.906459,149.951002 165.915367,145.959911 159.643653,145.959911 L143.679287,145.959911 L143.679287,176.178174 L150.521158,176.178174 L151.091314,165.345212 Z M132.846325,156.222717 C132.846325,158.503341 131.706013,160.213808 128.855234,160.213808 L119.732739,160.213808 L119.732739,152.231626 L128.285078,152.231626 C131.135857,152.231626 132.846325,153.942094 132.846325,156.222717 L132.846325,156.222717 Z M112.890869,145.959911 L112.890869,176.178174 L119.732739,176.178174 L119.732739,165.915367 L128.855234,165.915367 C135.126949,165.915367 139.688196,161.924276 139.688196,155.652561 C139.688196,149.951002 135.697105,145.389755 129.42539,145.389755 L112.890869,145.959911 L112.890869,145.959911 Z M102.628062,176.178174 L111.180401,176.178174 L99.2071269,160.783964 L111.180401,145.959911 L102.628062,145.959911 L95.2160356,155.652561 L87.8040089,145.959911 L79.2516704,145.959911 L91.2249443,160.783964 L79.2516704,175.608018 L87.8040089,175.608018 L95.2160356,165.915367 L102.628062,176.178174 L102.628062,176.178174 Z M76.9710468,152.231626 L76.9710468,145.959911 L53.0244989,145.959911 L53.0244989,176.178174 L76.9710468,176.178174 L76.9710468,169.906459 L59.8663697,169.906459 L59.8663697,163.634744 L76.4008909,163.634744 L76.4008909,157.363029 L59.8663697,157.363029 L59.8663697,151.66147 L76.9710468,151.66147 L76.9710468,152.231626 L76.9710468,152.231626 Z M215.518931,98.636971 L227.492205,116.88196 L236.044543,116.88196 L236.044543,86.6636971 L229.202673,86.6636971 L229.202673,106.619154 L227.492205,103.768374 L216.659243,86.6636971 L207.536748,86.6636971 L207.536748,116.88196 L214.378619,116.88196 L214.378619,96.3563474 L215.518931,98.636971 L215.518931,98.636971 Z M185.870824,98.0668151 L188.151448,91.7951002 L190.432071,98.0668151 L193.282851,104.908686 L183.020045,104.908686 L185.870824,98.0668151 L185.870824,98.0668151 Z M197.844098,116.88196 L205.256125,116.88196 L192.142539,86.6636971 L183.020045,86.6636971 L169.906459,116.88196 L177.318486,116.88196 L180.169265,110.610245 L194.993318,110.610245 L197.844098,116.88196 L197.844098,116.88196 Z M165.915367,116.88196 L168.766147,110.610245 L167.055679,110.610245 C161.924276,110.610245 159.073497,107.18931 159.073497,102.057906 L159.073497,101.487751 C159.073497,96.3563474 161.924276,92.935412 167.055679,92.935412 L174.467706,92.935412 L174.467706,86.6636971 L166.485523,86.6636971 C157.363029,86.6636971 152.231626,92.935412 152.231626,101.487751 L152.231626,102.057906 C152.231626,111.180401 157.363029,116.88196 165.915367,116.88196 Z M140.258352,116.88196 L147.100223,116.88196 L147.100223,87.233853 L140.258352,87.233853 L140.258352,116.88196 Z M125.434298,92.935412 C128.285078,92.935412 129.42539,94.6458797 129.42539,96.3563474 C129.42539,98.0668151 128.285078,99.7772829 125.434298,99.7772829 L116.88196,99.7772829 L116.88196,92.3652561 L125.434298,92.935412 L125.434298,92.935412 Z M116.88196,106.048998 L120.302895,106.048998 L129.42539,116.88196 L137.977728,116.88196 L127.714922,105.478842 C132.846325,104.33853 135.697105,100.917595 135.697105,96.3563474 C135.697105,90.6547884 131.706013,86.6636971 125.434298,86.6636971 L109.469933,86.6636971 L109.469933,116.88196 L116.311804,116.88196 L116.88196,106.048998 Z M104.33853,92.935412 L104.33853,86.6636971 L80.3919822,86.6636971 L80.3919822,116.88196 L104.33853,116.88196 L104.33853,110.610245 L87.233853,110.610245 L87.233853,104.33853 L103.768374,104.33853 L103.768374,98.0668151 L87.233853,98.0668151 L87.233853,92.3652561 L104.33853,92.3652561 L104.33853,92.935412 L104.33853,92.935412 Z M52.454343,116.88196 L58.7260579,116.88196 L67.2783964,92.3652561 L67.2783964,116.88196 L74.1202673,116.88196 L74.1202673,86.6636971 L62.7171492,86.6636971 L55.8752784,107.18931 L49.0334076,86.6636971 L37.6302895,86.6636971 L37.6302895,116.88196 L44.4721604,116.88196 L44.4721604,92.3652561 L52.454343,116.88196 Z M15.3942094,98.0668151 L17.674833,91.7951002 L19.9554566,98.0668151 L22.8062361,104.908686 L12.5434298,104.908686 L15.3942094,98.0668151 L15.3942094,98.0668151 Z M27.3674833,116.88196 L34.77951,116.88196 L21.6659243,86.6636971 L13.1135857,86.6636971 L0,116.88196 L7.41202673,116.88196 L10.2628062,110.610245 L25.0868597,110.610245 L27.3674833,116.88196 Z\" fill=\"#006FCF\"></path>\n </g>\n</svg>`,\n maestro: `<svg width=\"256px\" height=\"199px\" viewBox=\"0 0 256 199\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" preserveAspectRatio=\"xMidYMid\">\n\t<g>\n\t\t<polygon fill=\"#6C6BBD\" points=\"162.611457 141.314624 93.388935 141.314624 93.388935 16.9132715 162.611457 16.9132715\"></polygon>\n\t\t<path d=\"M97.782719,79.1164824 C97.782719,104.351869 109.598131,126.83083 127.997782,141.317159 C114.542597,151.910287 97.5614005,158.232967 79.1064205,158.232967 C35.4160534,158.232967 -3.86542948e-06,122.811879 -3.86542948e-06,79.1164824 C-3.86542948e-06,35.4210857 35.4160534,-1.5e-06 79.1064205,-1.5e-06 C97.5614005,-1.5e-06 114.542597,6.32267769 127.997782,16.915806 C109.598131,31.4021353 97.782719,53.8810959 97.782719,79.1164824\" fill=\"#D32011\" transform=\"translate(63.998889, 79.116483) scale(1, -1) translate(-63.998889, -79.116483) \"></path>\n\t\t<path d=\"M255.999994,79.1164824 C255.999994,35.4210857 220.583936,-1.5e-06 176.89357,-1.5e-06 C158.43859,-1.5e-06 141.457392,6.32267769 127.997178,16.915806 C146.401859,31.4021353 158.217271,53.8810959 158.217271,79.1164824 C158.217271,104.351869 146.401859,126.83083 127.997178,141.317159 C141.457392,151.910287 158.43859,158.232967 176.89357,158.232967 C220.583936,158.232967 255.999994,122.811879 255.999994,79.1164824\" fill=\"#0099DF\" transform=\"translate(191.998586, 79.116483) scale(1, -1) translate(-191.998586, -79.116483) \"></path>\n\t\t<path d=\"M186.032633,192.824108 C186.953118,192.824108 188.276002,192.648059 189.287027,192.250691 L187.878634,187.945032 C186.912878,188.3424 185.947123,188.47318 185.021607,188.47318 C182.033802,188.47318 180.539899,186.54167 180.539899,183.070986 L180.539899,171.290784 L175.967652,171.290784 L175.967652,192.295961 L180.49463,192.295961 L180.49463,189.745764 C181.681704,191.591765 183.396925,192.824108 186.032633,192.824108 L186.032633,192.824108 Z M169.141975,188.121082 L161.672461,188.121082 L161.672461,178.629518 C161.672461,176.521958 162.416898,175.113565 164.705537,175.113565 C165.892611,175.113565 167.386514,175.510933 168.744607,176.300639 L170.06246,172.392348 C168.613828,171.381323 166.330219,170.762636 164.353439,170.762636 C158.946215,170.762636 157.059974,173.664932 157.059974,178.544008 L157.059974,188.121082 L152.794555,188.121082 L152.794555,192.295961 L157.059974,192.295961 L157.059974,198.66894 L161.672461,198.66894 L161.672461,192.295961 L169.141975,192.295961 L169.141975,188.121082 L169.141975,188.121082 Z M110.64839,183.639374 C111.136298,186.672449 112.977269,188.739768 116.231663,188.739768 C119.174199,188.739768 121.065469,186.893767 121.548347,183.639374 L110.64839,183.639374 Z M126.296644,181.793373 C126.251375,188.3424 122.207274,192.824108 116.317173,192.824108 C110.165513,192.824108 105.859854,188.3424 105.859854,181.793373 C105.859854,175.118595 110.341562,170.767666 116.629032,170.767666 C119.792886,170.767666 122.690152,171.557373 125.24035,173.710202 L122.99698,177.095375 C121.241519,175.686982 118.99815,174.897276 116.89059,174.897276 C113.948055,174.897276 111.267077,176.2604 110.608151,180.037911 L126.206105,180.037911 C126.251375,180.611328 126.296644,181.179715 126.296644,181.793373 L126.296644,181.793373 Z M146.376306,186.934008 C145.103723,187.728744 142.513285,188.739768 139.832308,188.739768 C137.327381,188.739768 135.833477,187.814253 135.833477,186.275081 C135.833477,184.871717 137.41289,184.474349 139.38967,184.212791 L141.5425,183.905962 C146.114747,183.242006 148.881234,181.310495 148.881234,177.618493 C148.881234,173.619663 145.365281,170.762636 139.30416,170.762636 C135.873717,170.762636 132.709863,171.642882 130.204935,173.488883 L132.357764,177.050106 C133.896937,175.863032 136.185576,174.852006 139.34943,174.852006 C142.468015,174.852006 144.137967,175.772492 144.137967,177.402204 C144.137967,178.584248 142.950893,179.248205 140.445965,179.595273 L138.293136,179.902101 C133.590108,180.566058 131.039911,182.673618 131.039911,186.099031 C131.039911,190.273911 134.470354,192.824108 139.787038,192.824108 C143.126942,192.824108 146.160017,192.074643 148.353086,190.62601 L146.376306,186.934008 L146.376306,186.934008 Z M202.737182,188.48324 C201.796576,188.48324 200.92639,188.317251 200.116564,187.990302 C199.311768,187.658324 198.612602,187.195566 198.024094,186.602029 C197.435587,186.008492 196.972829,185.294236 196.635821,184.46429 C196.298812,183.634343 196.132824,182.718888 196.132824,181.722953 C196.132824,180.721988 196.298812,179.811562 196.635821,178.981616 C196.972829,178.15167 197.435587,177.437413 198.024094,176.843876 C198.612602,176.250339 199.311768,175.787581 200.116564,175.455603 C200.92639,175.123625 201.796576,174.962666 202.737182,174.962666 C203.677787,174.962666 204.553002,175.123625 205.357799,175.455603 C206.167624,175.787581 206.871821,176.250339 207.460329,176.843876 C208.058896,177.437413 208.521653,178.15167 208.863692,178.981616 C209.2007,179.811562 209.366689,180.721988 209.366689,181.722953 C209.366689,182.718888 209.2007,183.634343 208.863692,184.46429 C208.521653,185.294236 208.058896,186.008492 207.460329,186.602029 C206.871821,187.195566 206.167624,187.658324 205.357799,187.990302 C204.553002,188.317251 203.677787,188.48324 202.737182,188.48324 L202.737182,188.48324 Z M202.737181,192.824108 C204.366893,192.824108 205.875886,192.54243 207.264159,191.974043 C208.652432,191.410685 209.854596,190.63104 210.865621,189.640134 C211.881676,188.649229 212.671383,187.477245 213.2448,186.129211 C213.818217,184.776148 214.104926,183.307395 214.104926,181.722953 C214.104926,180.13851 213.818217,178.669758 213.2448,177.316695 C212.671383,175.968661 211.881676,174.791647 210.865621,173.800741 C209.854596,172.809836 208.652432,172.03522 207.264159,171.466833 C205.875886,170.903476 204.366893,170.621797 202.737181,170.621797 C201.107469,170.621797 199.598476,170.903476 198.210203,171.466833 C196.82193,172.03522 195.629826,172.809836 194.623831,173.800741 C193.617836,174.791647 192.828129,175.968661 192.254712,177.316695 C191.681295,178.669758 191.394586,180.13851 191.394586,181.722953 C191.394586,183.307395 191.681295,184.776148 192.254712,186.129211 C192.828129,187.477245 193.617836,188.649229 194.623831,189.640134 C195.629826,190.63104 196.82193,191.410685 198.210203,191.974043 C199.598476,192.54243 201.107469,192.824108 202.737181,192.824108 L202.737181,192.824108 Z M83.9492805,181.793373 C83.9492805,185.485375 86.368699,188.51845 90.3222595,188.51845 C94.099771,188.51845 96.6499685,185.616154 96.6499685,181.793373 C96.6499685,177.970591 94.099771,175.073325 90.3222595,175.073325 C86.368699,175.073325 83.9492805,178.101371 83.9492805,181.793373 L83.9492805,181.793373 Z M100.955627,181.793373 L100.955627,192.295961 L96.38841,192.295961 L96.38841,189.745764 C94.934747,191.637034 92.741678,192.824108 89.7538725,192.824108 C83.863771,192.824108 79.2512835,188.211621 79.2512835,181.793373 C79.2512835,175.380154 83.863771,170.762636 89.7538725,170.762636 C92.741678,170.762636 94.934747,171.949711 96.38841,173.840981 L96.38841,171.290784 L100.955627,171.290784 L100.955627,181.793373 Z M75.2071835,171.290784 L75.2071835,184.474349 C75.2071835,189.438935 72.0433285,192.778839 66.9479635,192.824108 C64.2669865,192.869379 61.49547,192.034402 59.5639595,189.086837 C58.1153265,191.415716 55.826688,192.824108 52.6175635,192.824108 C50.3792245,192.824108 48.1811252,192.165182 46.4659035,189.705524 L46.4659035,192.295961 L41.8986858,192.295961 L41.8986858,171.290784 L46.5111733,171.290784 L46.5111733,182.935177 C46.5111733,186.581909 48.5332234,188.51845 51.651808,188.51845 C54.6848835,188.51845 56.224056,186.54167 56.224056,182.980446 L56.224056,171.290784 L60.8365435,171.290784 L60.8365435,182.935177 C60.8365435,186.581909 62.949133,188.51845 65.9771785,188.51845 C69.100793,188.51845 70.594696,186.54167 70.594696,182.980446 L70.594696,171.290784 L75.2071835,171.290784 L75.2071835,171.290784 Z\" fill=\"#110F0D\" transform=\"translate(128.001806, 184.645368) scale(1, -1) translate(-128.001806, -184.645368) \"></path>\n\t</g>\n</svg>`,\n discover: `<svg width=\"512px\" height=\"86px\" viewBox=\"0 0 512 86\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" preserveAspectRatio=\"xMidYMid\">\n <defs>\n <linearGradient x1=\"19.4143743%\" y1=\"9.06316954%\" x2=\"88.6006499%\" y2=\"80.4988417%\" id=\"discover-linearGradient-1\">\n <stop stop-color=\"#F34F26\" offset=\"0%\"></stop>\n <stop stop-color=\"#F69E35\" offset=\"100%\"></stop>\n </linearGradient>\n <path d=\"M270.356257,0.364742204 C246.374007,0.364742204 226.91662,19.0997905 226.91662,42.2224896 C226.91662,66.805636 245.528651,85.1826697 270.356257,85.1826697 C294.56404,85.1826697 313.677606,66.5627539 313.677606,42.7050996 C313.677606,18.9893895 294.69179,0.364742204 270.356257,0.364742204 Z\" id=\"discover-path-2\"></path>\n <filter x=\"-50%\" y=\"-50%\" width=\"200%\" height=\"200%\" filterUnits=\"objectBoundingBox\" id=\"discover-filter-3\">\n <feMorphology radius=\"1\" operator=\"erode\" in=\"SourceAlpha\" result=\"shadowSpreadInner1\"></feMorphology>\n <feGaussianBlur stdDeviation=\"4\" in=\"shadowSpreadInner1\" result=\"shadowBlurInner1\"></feGaussianBlur>\n <feOffset dx=\"3\" dy=\"3\" in=\"shadowBlurInner1\" result=\"shadowOffsetInner1\"></feOffset>\n <feComposite in=\"shadowOffsetInner1\" in2=\"SourceAlpha\" operator=\"arithmetic\" k2=\"-1\" k3=\"1\" result=\"shadowInnerInner1\"></feComposite>\n <feColorMatrix values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.5 0\" type=\"matrix\" in=\"shadowInnerInner1\"></feColorMatrix>\n </filter>\n </defs>\n <g>\n\t\t<g>\n\t\t\t<use fill=\"url(#discover-linearGradient-1)\" fill-rule=\"evenodd\" xlink:href=\"#discover-path-2\"></use>\n\t\t\t<use fill=\"black\" fill-opacity=\"1\" filter=\"url(#discover-filter-3)\" xlink:href=\"#discover-path-2\"></use>\n\t\t</g>\n\t\t<path d=\"M23.7456761,1.8914302 L0.392712098,1.8914302 L0.392712098,83.3452818 L23.6242351,83.3452818 C35.9497171,83.3452818 44.8638087,80.424387 52.6833531,73.947003 C61.9617679,66.2520539 67.4644687,54.6489097 67.4644687,42.6577848 C67.4644687,18.6092946 49.4990731,1.8914302 23.7456761,1.8914302 Z M42.3182772,63.0677739 C37.2966092,67.598946 30.8318426,69.5561979 20.5582417,69.5561979 L16.2904548,69.5561979 L16.2904548,15.6836683 L20.5582417,15.6836683 C30.8318426,15.6836683 37.0489955,17.5179019 42.3182772,22.2761847 C47.8130922,27.1622172 51.0904245,34.7278394 51.0904245,42.5410752 C51.0904245,50.3700827 47.8130922,58.2006673 42.3182772,63.0677739 Z M74.7982489,83.3452818 L90.66918,83.3452818 L90.66918,1.8914302 L74.7982489,1.8914302 L74.7982489,83.3452818 Z M129.525598,33.136488 C119.986952,29.6020791 117.179612,27.271041 117.179612,22.8896988 C117.179612,17.7560527 122.177623,13.8510119 129.028793,13.8510119 C133.791807,13.8510119 137.700002,15.8035322 141.865274,20.430911 L150.159543,9.57849352 C143.32099,3.58056537 135.138699,0.531920849 126.213568,0.531920849 C111.815701,0.531920849 100.815031,10.5515994 100.815031,23.8517646 C100.815031,35.0984713 105.940791,40.8330142 120.846503,46.2205826 C127.079427,48.4080994 130.247935,49.8669696 131.839287,50.8637328 C135.014104,52.9408486 136.60861,55.8617434 136.60861,59.2794427 C136.60861,65.8845763 131.351945,70.762723 124.257894,70.762723 C116.684385,70.762723 110.583942,66.9807005 106.917052,59.8976883 L96.6702625,69.8022343 C103.98354,80.534788 112.779344,85.3135737 124.884025,85.3135737 C141.371624,85.3135737 152.968459,74.3065948 152.968459,58.5555276 C152.968459,45.6070685 147.607703,39.7400445 129.525598,33.136488 Z M157.974356,42.6577848 C157.974356,66.6226858 176.78984,85.1826697 200.980274,85.1826697 C207.818827,85.1826697 213.681119,83.8310461 220.895035,80.424387 L220.895035,61.7271904 C214.534361,68.0847103 208.91495,70.6428591 201.705766,70.6428591 C185.708663,70.6428591 174.342092,59.0365605 174.342092,42.5410752 C174.342092,26.9146035 186.063522,14.5765041 200.980274,14.5765041 C208.541165,14.5765041 214.291478,17.2624025 220.895035,23.735055 L220.895035,5.03943561 C213.933464,1.50818104 208.18315,0.0540422711 201.34302,0.0540422711 C177.275604,0.0540422711 157.974356,18.9893895 157.974356,42.6577848 Z M349.625746,56.6061616 L327.883059,1.8914302 L310.537486,1.8914302 L345.116654,85.4255519 L353.660114,85.4255519 L388.843332,1.8914302 L371.625509,1.8914302 L349.625746,56.6061616 Z M396.065135,83.3452818 L441.130819,83.3452818 L441.130819,69.5561979 L411.942374,69.5561979 L411.942374,47.5548575 L440.014192,47.5548575 L440.014192,33.7626193 L411.942374,33.7626193 L411.942374,15.6836683 L441.130819,15.6836683 L441.130819,1.8914302 L396.065135,1.8914302 L396.065135,83.3452818 Z M504.019955,25.9304575 C504.019955,10.6714633 493.530284,1.8914302 475.19741,1.8914302 L451.62049,1.8914302 L451.62049,83.3452818 L467.515079,83.3452818 L467.515079,50.6082334 L469.595349,50.6082334 L491.569878,83.3452818 L511.114007,83.3452818 L485.447354,49.0342307 C497.435324,46.5833287 504.019955,38.3963067 504.019955,25.9304575 Z M472.137726,39.3820298 L467.515079,39.3820298 L467.515079,14.6995224 L472.391648,14.6995224 C482.307234,14.6995224 487.679032,18.864794 487.679032,26.7915853 C487.679032,34.9691444 482.307234,39.3820298 472.137726,39.3820298 Z\" fill=\"#0B1015\"></path>\n\t</g>\n</svg>`,\n jcb: `<svg width=\"256px\" height=\"198px\" viewBox=\"0 0 256 198\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" preserveAspectRatio=\"xMidYMid\">\n <defs>\n <linearGradient x1=\"-57.5270968%\" y1=\"50.1241953%\" x2=\"232.39121%\" y2=\"50.1241953%\" id=\"jcb-linearGradient-1\">\n <stop stop-color=\"#007940\" offset=\"0%\"></stop>\n <stop stop-color=\"#00873F\" offset=\"22.85%\"></stop>\n <stop stop-color=\"#40A737\" offset=\"74.33%\"></stop>\n <stop stop-color=\"#5CB531\" offset=\"100%\"></stop>\n </linearGradient>\n <linearGradient x1=\"0.182516704%\" y1=\"49.95997%\" x2=\"100.273441%\" y2=\"49.95997%\" id=\"jcb-linearGradient-2\">\n <stop stop-color=\"#007940\" offset=\"0%\"></stop>\n <stop stop-color=\"#00873F\" offset=\"22.85%\"></stop>\n <stop stop-color=\"#40A737\" offset=\"74.33%\"></stop>\n <stop stop-color=\"#5CB531\" offset=\"100%\"></stop>\n </linearGradient>\n <linearGradient x1=\"-62.8015845%\" y1=\"49.8578253%\" x2=\"253.671294%\" y2=\"49.8578253%\" id=\"jcb-linearGradient-3\">\n <stop stop-color=\"#007940\" offset=\"0%\"></stop>\n <stop stop-color=\"#00873F\" offset=\"22.85%\"></stop>\n <stop stop-color=\"#40A737\" offset=\"74.33%\"></stop>\n <stop stop-color=\"#5CB531\" offset=\"100%\"></stop>\n </linearGradient>\n <linearGradient x1=\"0.175556793%\" y1=\"50.0058048%\" x2=\"101.808162%\" y2=\"50.0058048%\" id=\"jcb-linearGradient-4\">\n <stop stop-color=\"#1F286F\" offset=\"0%\"></stop>\n <stop stop-color=\"#004E94\" offset=\"47.51%\"></stop>\n <stop stop-color=\"#0066B1\" offset=\"82.61%\"></stop>\n <stop stop-color=\"#006FBC\" offset=\"100%\"></stop>\n </linearGradient>\n <linearGradient x1=\"-0.575855512%\" y1=\"49.9142191%\" x2=\"98.13299%\" y2=\"49.9142191%\" id=\"jcb-linearGradient-5\">\n <stop stop-color=\"#6C2C2F\" offset=\"0%\"></stop>\n <stop stop-color=\"#882730\" offset=\"17.35%\"></stop>\n <stop stop-color=\"#BE1833\" offset=\"57.31%\"></stop>\n <stop stop-color=\"#DC0436\" offset=\"85.85%\"></stop>\n <stop stop-color=\"#E60039\" offset=\"100%\"></stop>\n </linearGradient>\n </defs>\n\t<g>\n\t\t<path d=\"M256.000001,157.418094 C256.000001,179.325184 238.16137,197.163815 216.254279,197.163815 L-3.43623867e-08,197.163815 L-3.43623867e-08,39.7457218 C-3.43623867e-08,17.8386312 17.8386309,3.69395977e-07 39.7457214,3.69395977e-07 L256.000001,3.69395977e-07 L256.000001,157.418094 Z\" fill=\"#FFFFFF\"></path>\n\t\t<path d=\"M185.584353,117.046455 L202.01467,117.046455 C202.484108,117.046455 203.579463,116.889977 204.048901,116.889977 C207.178485,116.26406 209.838631,113.447434 209.838631,109.535453 C209.838631,105.779952 207.178485,102.963326 204.048901,102.18093 C203.579463,102.024451 202.640588,102.024451 202.01467,102.024451 L185.584353,102.024451 L185.584353,117.046455 Z\" fill=\"url(#jcb-linearGradient-1)\"></path>\n\t\t<path d=\"M200.13692,13.3007339 C184.488999,13.3007339 171.657702,25.9755506 171.657702,41.7799516 L171.657702,71.354524 L211.872861,71.354524 C212.811737,71.354524 213.907092,71.354524 214.689488,71.511003 C223.765282,71.980441 230.493888,76.6748175 230.493888,84.8117365 C230.493888,91.2273845 225.955991,96.7041575 217.506113,97.799512 L217.506113,98.11247 C226.738387,98.738387 233.779952,103.902201 233.779952,111.882641 C233.779952,120.488998 225.955991,126.122251 215.628363,126.122251 L171.501223,126.122251 L171.501223,184.019561 L213.281174,184.019561 C228.929097,184.019561 241.760392,171.344744 241.760392,155.540344 L241.760392,13.3007339 L200.13692,13.3007339 L200.13692,13.3007339 Z\" fill=\"url(#jcb-linearGradient-2)\"></path>\n\t\t<path d=\"M207.804402,86.6894875 C207.804402,82.933986 205.144255,80.4303185 202.01467,79.960881 C201.701713,79.960881 200.919316,79.8044015 200.449879,79.8044015 L185.584353,79.8044015 L185.584353,93.574573 L200.449879,93.574573 C200.919316,93.574573 201.858192,93.574573 202.01467,93.4180935 C205.144255,92.948656 207.804402,90.4449885 207.804402,86.6894875 L207.804402,86.6894875 Z\" fill=\"url(#jcb-linearGradient-3)\"></path>\n\t\t<path d=\"M42.7188266,13.3007339 C27.0709047,13.3007339 14.2396088,25.9755506 14.2396088,41.7799516 L14.2396088,112.03912 C22.2200489,115.951101 30.5134475,118.454768 38.8068461,118.454768 C48.6650368,118.454768 53.9853305,112.508558 53.9853305,104.371639 L53.9853305,71.1980445 L78.3960885,71.1980445 L78.3960885,104.215159 C78.3960885,117.046455 70.415648,127.530563 43.3447434,127.530563 C26.9144255,127.530563 14.0831296,123.931541 14.0831296,123.931541 L14.0831296,183.863082 L55.863081,183.863082 C71.5110025,183.863082 84.3422985,171.188265 84.3422985,155.383864 L84.3422985,13.3007339 L42.7188266,13.3007339 L42.7188266,13.3007339 Z\" fill=\"url(#jcb-linearGradient-4)\"></path>\n\t\t<path d=\"M121.427874,13.3007339 C105.779951,13.3007339 92.9486555,25.9755506 92.9486555,41.7799517 L92.9486555,79.0220055 C100.146699,72.919316 112.665037,69.0073355 132.850856,69.946211 C143.647922,70.4156485 155.227384,73.3887535 155.227384,73.3887535 L155.227384,85.4376535 C149.437654,82.4645485 142.552568,79.8044015 133.633252,79.178485 C118.298289,78.0831305 109.066015,85.594133 109.066015,98.738387 C109.066015,112.03912 118.298289,119.550123 133.633252,118.298289 C142.552568,117.672372 149.437654,114.855746 155.227384,112.03912 L155.227384,124.08802 C155.227384,124.08802 143.804402,127.061126 132.850856,127.530563 C112.665037,128.469438 100.146699,124.557458 92.9486555,118.454768 L92.9486555,184.17604 L134.728607,184.17604 C150.376529,184.17604 163.207824,171.501223 163.207824,155.696822 L163.207824,13.3007339 L121.427874,13.3007339 L121.427874,13.3007339 Z\" fill=\"url(#jcb-linearGradient-5)\"></path>\n\t</g>\n</svg>`,\n unionpay: `<svg width=\"256px\" height=\"160px\" viewBox=\"0 0 256 160\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" preserveAspectRatio=\"xMidYMid\">\n\t<g>\n\t\t<path d=\"M50.041631,0.000667563305 L113.820211,0.000667563305 C122.723127,0.000667563305 128.260438,7.25731345 126.183558,16.1897657 L96.4900715,143.675416 C94.3945365,152.576777 85.480739,159.839641 76.571605,159.839641 L12.7992433,159.839641 C3.908764,159.839641 -1.64098444,152.576777 0.435896208,143.675416 L30.1418186,16.1897657 C32.2186993,7.25731345 41.1278333,0.000667563305 50.041631,0.000667563305\" fill=\"#E21836\"></path>\n\t\t<path d=\"M108.513283,0.000667563305 L181.857018,0.000667563305 C190.758378,0.000667563305 186.744527,7.25731345 184.650546,16.1897657 L154.961724,143.675416 C152.878625,152.576777 153.528427,159.839641 144.608411,159.839641 L71.2646775,159.839641 C62.3446615,159.839641 56.8244495,152.576777 58.919985,143.675416 L88.6072525,16.1897657 C90.715224,7.25731345 99.6057035,0.000667563305 108.513283,0.000667563305\" fill=\"#00447C\"></path>\n\t\t<path d=\"M178.94783,0.000667563305 L242.726409,0.000667563305 C251.641762,0.000667563305 257.179074,7.25731345 255.085093,16.1897657 L225.396271,143.675416 C223.300736,152.576777 214.380719,159.839641 205.466922,159.839641 L141.717879,159.839641 C132.797863,159.839641 127.265215,152.576777 129.354532,143.675416 L159.048017,16.1897657 C161.124899,7.25731345 170.027814,0.000667563305 178.94783,0.000667563305\" fill=\"#007B84\"></path>\n\t\t<path d=\"M66.698338,40.8561434 C60.139686,40.9229891 58.202715,40.8561434 57.5840035,40.7100156 C57.346157,41.8401744 52.920349,62.256098 52.9079125,62.273198 C51.9549725,66.403641 51.261643,69.347961 48.9064975,71.2491775 C47.5695833,72.3544635 46.0088137,72.8876745 44.1993159,72.8876745 C41.2907503,72.8876745 39.5962892,71.4434965 39.3118063,68.704377 L39.2573971,67.7638735 C39.2573971,67.7638735 40.1434913,62.231225 40.1434913,62.200134 C40.1434913,62.200134 44.7884909,43.5952629 45.6201759,41.1359627 C45.6637033,40.9960531 45.6761397,40.9229891 45.6870215,40.8561434 C36.6457507,40.9354255 35.0430082,40.8561434 34.9326351,40.7100156 C34.8720075,40.9105527 34.6481522,42.0640298 34.6481522,42.0640298 L29.9052159,63.0333735 L29.4979234,64.8117805 L28.7097659,70.6289115 C28.7097659,72.3544635 29.0486581,73.762887 29.7233334,74.9536735 C31.8841598,78.729679 38.0479561,79.2955355 41.5348148,79.2955355 C46.0274683,79.2955355 50.241857,78.341041 53.089795,76.598389 C58.0332685,73.677387 59.3266555,69.1116695 60.4801325,65.0542905 L61.014898,62.972746 C61.014898,62.972746 65.7998075,43.6496723 66.6128375,41.1359627 C66.643929,40.9960531 66.656365,40.9229891 66.698338,40.8561434 Z M82.9786885,56.444252 C81.825211,56.444252 79.7172395,56.724071 77.823796,57.6521385 C77.1366845,58.0050215 76.486882,58.412314 75.8013245,58.818052 L76.420036,56.5841615 L76.081144,56.20796 C72.0657375,57.0209905 71.167207,57.129809 67.4580475,57.6521385 L67.147137,57.8588935 C66.7165265,61.4296985 66.3341065,64.1144085 64.7375825,71.133208 C64.129753,73.7199815 63.498605,76.331628 62.8659025,78.912183 L63.036903,79.2401935 C66.8377815,79.0396565 67.9912585,79.0396565 71.29468,79.0940655 L71.562063,78.8033645 C71.981792,76.65342 72.036201,76.1497455 72.965823,71.795447 C73.402652,69.7310025 74.313619,65.1948215 74.7628845,63.579643 C75.588351,63.197223 76.402936,62.8210215 77.1802115,62.8210215 C79.0316825,62.8210215 78.8062725,64.4362005 78.734763,65.079785 C78.655481,66.160198 77.9808055,69.68903 77.2890305,72.7188505 L76.8273285,74.674476 C76.5055365,76.1186545 76.152653,77.522414 75.830861,78.954156 L75.9707705,79.2401935 C79.7172395,79.0396565 80.859835,79.0396565 84.0591015,79.0940655 L84.435303,78.8033645 C85.013596,75.4455335 85.183042,74.547003 86.209046,69.6579385 L86.725157,67.411612 C87.727843,63.0153405 88.2315175,60.786114 87.4728965,58.970398 C86.670748,56.93549 84.7462135,56.444252 82.9786885,56.444252 Z M101.165696,61.047123 C99.1743155,61.429543 97.904247,61.684489 96.6419515,61.8492715 C95.3905375,62.049809 94.1702145,62.2316915 92.24568,62.499074 L92.093334,62.637429 L91.9534245,62.7478025 C91.7528875,64.181099 91.6129775,65.420076 91.3471495,66.876691 C91.1217395,68.383051 90.7750745,70.094612 90.2107725,72.5539125 C89.7739435,74.436474 89.5485335,75.092495 89.299805,75.754734 C89.057295,76.4169725 88.7899125,77.060557 88.298674,78.9120275 L88.413711,79.0830285 L88.510093,79.240038 C90.308709,79.1545375 91.4855045,79.09391 92.6949455,79.0830285 C93.902832,79.039501 95.1542455,79.0830285 97.0912165,79.09391 L97.260663,78.955555 L97.4425455,78.803209 C97.7223645,77.133621 97.7643375,76.6843555 97.935338,75.8697705 C98.104784,74.9961125 98.39704,73.786672 99.113688,70.556314 C99.4525805,69.039072 99.8303365,67.5264935 100.181665,65.97816 C100.546985,64.436045 100.929404,62.9172485 101.293169,61.4000065 L101.23876,61.2165695 L101.165696,61.047123 Z M101.208135,54.841043 C99.3986375,53.7730665 96.222689,54.1119585 94.0851805,55.587228 C91.953891,57.0329605 91.711381,59.0849685 93.5146605,60.166936 C95.293067,61.2053765 98.481452,60.896021 100.600305,59.408315 C102.726932,57.9314915 102.99276,55.898138 101.208135,54.841043 Z M112.151399,79.574733 C115.812368,79.574733 119.565055,78.565829 122.389675,75.571763 C124.562938,73.143554 125.559405,69.5307765 125.904516,68.043071 C127.028457,63.112034 126.153244,60.809743 125.054176,59.407538 C123.384588,57.2700295 120.43405,56.5844725 117.373138,56.5844725 C115.532549,56.5844725 111.148714,56.766355 107.724038,59.923649 C105.264737,62.2010665 104.12836,65.291515 103.442803,68.2544895 C102.751028,71.2734285 101.955097,76.70814 106.95298,78.7306115 C108.495095,79.3928505 110.718104,79.574733 112.151399,79.574733 Z M111.865362,68.4798995 C112.709484,64.7458675 113.705951,61.6118915 116.249197,61.6118915 C118.242132,61.6118915 118.386705,63.943719 117.500611,67.6901875 C117.342047,68.5218725 116.614517,71.6138755 115.630486,72.9305805 C114.943374,73.902175 114.130344,74.49135 113.231813,74.49135 C112.96443,74.49135 111.374124,74.49135 111.349251,72.1299865 C111.336815,70.964073 111.574661,69.7732865 111.865362,68.4798995 Z M135.05616,79.094532 L135.342197,78.803831 C135.747935,76.6538865 135.814781,76.148657 136.713312,71.7959135 C137.162577,69.731469 138.092198,65.195288 138.529028,63.580109 C139.356049,63.196135 140.156643,62.8199335 140.958791,62.8199335 C142.797825,62.8199335 142.57397,64.4351125 142.500907,65.0786965 C142.43406,66.1606645 141.759386,69.6879415 141.055173,72.717762 L140.618345,74.673388 C140.284116,76.1191205 139.920351,77.521326 139.598559,78.9546225 L139.738469,79.24066 C143.497374,79.0401225 144.596441,79.0401225 147.814363,79.094532 L148.203001,78.803831 C148.767303,75.4444455 148.919649,74.5459145 149.976744,69.658405 L150.480419,67.410524 C151.487768,63.0142525 151.99766,60.7865805 151.251476,58.9708645 C150.426009,56.9359565 148.489038,56.4447185 146.746386,56.4447185 C145.591354,56.4447185 143.472501,56.722983 141.589939,57.652605 C140.916819,58.005488 140.242143,58.411226 139.579904,58.8185185 L140.156643,56.584628 L139.847287,56.206872 C135.833436,57.021457 134.91625,57.1302755 131.211754,57.652605 L130.927271,57.85936 C130.478006,61.4301645 130.112686,64.1133205 128.516162,71.1336745 C127.908333,73.720448 127.277185,76.332094 126.646037,78.9126495 L126.815483,79.24066 C130.622579,79.0401225 131.758957,79.0401225 135.05616,79.094532 Z M162.673542,79.2398825 C162.909834,78.0864055 164.313594,71.2494885 164.32603,71.2494885 C164.32603,71.2494885 165.52148,66.232951 165.594545,66.0510685 C165.594545,66.0510685 165.970746,65.5287395 166.346947,65.321984 L166.900367,65.321984 C172.122106,65.321984 178.018519,65.321984 182.6402,61.92218 C185.785058,59.590353 187.935002,56.1470215 188.89416,51.9621695 C189.142889,50.9361655 189.326326,49.7158426 189.326326,48.4955199 C189.326326,46.8927774 189.004534,45.3071349 188.074912,44.0681575 C185.718212,40.770954 181.025022,40.7103265 175.60741,40.6854536 C175.59031,40.6854536 172.93669,40.7103265 172.93669,40.7103265 C166.001837,40.7958268 163.220744,40.770954 162.078149,40.6310444 C161.981767,41.1362735 161.799884,42.0348043 161.799884,42.0348043 C161.799884,42.0348043 159.315711,53.547812 159.315711,53.5664665 C159.315711,53.5664665 153.371107,78.0444325 153.091287,79.1979095 C159.146265,79.124846 161.628884,79.124846 162.673542,79.2398825 Z M167.276569,58.7882045 C167.276569,58.7882045 169.917752,47.2985153 169.905316,47.3420427 L169.990815,46.7528678 L170.028125,46.3036024 L171.083665,46.4124209 C171.083665,46.4124209 176.530813,46.8803409 176.658287,46.8927774 C178.808231,47.7244624 179.694325,49.8681887 179.075614,52.666381 C178.511312,55.223618 176.852606,57.373563 174.721316,58.412003 C172.966227,59.291879 170.816282,59.364943 168.601047,59.364943 L167.167751,59.364943 L167.276569,58.7882045 Z M183.721236,68.692718 C183.023242,71.668129 182.221093,77.102841 187.194103,79.039812 C188.779745,79.714487 190.200605,79.915024 191.644784,79.8419605 C193.169799,79.759569 194.582886,78.99473 195.891818,77.8941075 C195.773673,78.346482 195.655527,78.7988565 195.537381,79.2527855 L195.76279,79.5434865 C199.339813,79.392695 200.449763,79.392695 204.325259,79.4222315 L204.676588,79.1548485 C205.242445,75.8281085 205.775656,72.597751 207.246262,66.2334175 C207.962909,63.184942 208.678003,60.1660035 209.413306,57.1299645 L209.29827,56.795736 C205.296854,57.537257 204.227323,57.6958215 200.378253,58.241469 L200.085998,58.479315 C200.047134,58.788671 200.006716,59.08559 199.969406,59.3825095 C199.370904,58.4155785 198.503465,57.590112 197.164996,57.0755555 C195.453434,56.4024345 191.433365,57.269874 187.977597,60.416286 C185.549388,62.662613 184.383475,65.7406245 183.721236,68.692718 Z M192.12514,68.8746005 C192.981698,65.2074135 193.965729,62.104529 196.515194,62.104529 C198.127263,62.104529 198.976048,63.5922345 198.803493,66.1292625 C198.666693,66.761965 198.51901,67.4288675 198.343345,68.182825 C198.0884,69.2725655 197.811689,70.3529785 197.542752,71.4349465 C197.26915,72.174913 196.950468,72.8729065 196.600694,73.3377175 C195.944673,74.267339 194.383904,74.8440775 193.485373,74.8440775 C193.230426,74.8440775 191.65722,74.8440775 191.602811,72.524687 C191.590374,71.3696555 191.828221,70.1804235 192.12514,68.8746005 Z M236.010903,56.766044 L235.701548,56.413161 C231.742105,57.2153095 231.025456,57.3427825 227.387807,57.834021 L227.120423,58.1014035 C227.107988,58.144931 227.097105,58.211777 227.078451,58.2724045 L227.066014,58.211777 C224.357986,64.459519 224.437268,63.111723 222.232914,68.0303235 C222.220477,67.806468 222.220477,67.6665585 222.208042,67.428712 L221.656175,56.766044 L221.30951,56.413161 C217.161968,57.2153095 217.064031,57.3427825 213.233616,57.834021 L212.935143,58.1014035 C212.893169,58.228877 212.893169,58.3687865 212.868297,58.5211325 L212.893169,58.575542 C213.371971,61.022406 213.256934,60.4767585 213.737291,64.338264 C213.961146,66.233262 214.25962,68.139142 214.483475,70.010822 C214.861232,73.143243 215.072651,74.685358 215.534352,79.4656035 C212.947578,83.7344015 212.335085,85.3495805 209.844694,89.0960495 L209.861794,89.1333585 L208.10826,91.906678 C207.907723,92.198934 207.725841,92.399471 207.470894,92.4849715 C207.191075,92.6233265 206.82731,92.648199 206.32208,92.648199 L205.350486,92.648199 L203.906308,97.451763 L208.860663,97.5372635 C211.769228,97.524827 213.597381,96.1645945 214.581412,94.336442 L217.696733,88.9981125 L217.646987,88.9981125 L217.974998,88.621911 C220.070533,84.110603 236.010903,56.766044 236.010903,56.766044 Z M183.72108,119.853625 L181.619326,119.853625 L189.398302,94.1242455 L191.978857,94.1242455 L192.798105,91.4737355 L192.877387,94.421165 C192.781005,96.243099 194.214302,97.858278 197.979425,97.5908955 L202.333723,97.5908955 L203.832311,92.63654 L202.193814,92.63654 C201.251756,92.63654 200.814927,92.3986935 200.869337,91.888801 L200.790054,88.890071 L192.726596,88.890071 L192.726596,88.9056165 C190.119614,88.960026 182.33442,89.1558995 180.758105,89.5756285 C178.850671,90.0668665 176.840635,91.5125995 176.840635,91.5125995 L177.630347,88.85898 L170.087664,88.85898 L168.516013,94.1242455 L160.632883,120.246927 L159.103204,120.246927 L157.603062,125.165528 L172.626247,125.165528 L172.122572,126.805579 L179.525345,126.805579 L180.016584,125.165528 L182.093465,125.165528 L183.72108,119.853625 Z M177.557284,99.352202 C176.349398,99.6864305 174.101516,100.699998 174.101516,100.699998 L176.100669,94.1242455 L182.093465,94.1242455 L180.647732,98.915373 C180.647732,98.915373 178.796261,99.0241915 177.557284,99.352202 Z M177.672321,108.746356 C177.672321,108.746356 175.789759,108.982648 174.550781,109.262467 C173.330458,109.632451 171.042159,110.798364 171.042159,110.798364 L173.106603,103.955229 L179.13049,103.955229 L177.672321,108.746356 Z M174.31449,119.914253 L168.30304,119.914253 L170.045692,114.139095 L176.038487,114.139095 L174.31449,119.914253 Z M188.791404,103.955229 L197.456474,103.955229 L196.211278,107.987735 L187.431173,107.987735 L186.112912,112.396443 L193.795505,112.396443 L187.978375,120.587374 C187.571082,121.188986 187.205762,121.401959 186.800025,121.571405 C186.392732,121.77816 185.857967,122.02067 185.239255,122.02067 L183.107965,122.02067 L181.643577,126.849107 L187.218198,126.849107 C190.115882,126.849107 191.827443,125.530847 193.091294,123.800631 L197.080273,118.341047 L197.936831,123.884578 C198.118713,124.923017 198.864898,125.530847 199.370127,125.767139 C199.928211,126.046958 200.50495,126.527315 201.319535,126.598824 C202.193192,126.636133 202.82434,126.66567 203.244069,126.66567 L205.983189,126.66567 L207.627904,121.262049 L206.547491,121.262049 C205.927224,121.262049 204.859248,121.157894 204.677366,120.963575 C204.495483,120.727283 204.495483,120.363518 204.397546,119.810098 L203.528552,114.254131 L199.970183,114.254131 L201.530954,112.396443 L210.293959,112.396443 L211.641755,107.987735 L203.528552,107.987735 L204.792402,103.955229 L212.880733,103.955229 L214.380875,98.982219 L190.266674,98.982219 L188.791404,103.955229 Z M115.605924,121.037106 L117.628395,114.309008 L125.940582,114.309008 L127.459378,109.304907 L119.139419,109.304907 L120.409488,105.163582 L128.539791,105.163582 L130.046152,100.318045 L109.703292,100.318045 L108.228023,105.163582 L112.849704,105.163582 L111.616945,109.304907 L106.982827,109.304907 L105.446931,114.394508 L110.067057,114.394508 L107.371465,123.295869 C107.0077,124.474219 107.542466,124.923484 107.881358,125.470686 C108.228023,126.003897 108.579352,126.35678 109.369064,126.557317 C110.183649,126.7392 110.741733,126.848018 111.500354,126.848018 L120.87119,126.848018 L122.540778,121.304488 L118.387016,121.875009 C117.584868,121.875009 115.363414,121.778627 115.605924,121.037106 Z M116.55933,88.8286665 L114.452913,92.635763 C114.002093,93.4674475 113.596355,93.983559 113.231036,94.221405 C112.909244,94.4219425 112.271878,94.505888 111.348474,94.505888 L110.249406,94.505888 L108.780355,99.3762975 L112.430442,99.3762975 C114.18553,99.3762975 115.533326,98.7327135 116.176911,98.410921 C116.868686,98.040938 117.050568,98.252357 117.585334,97.736246 L118.818094,96.668269 L130.216064,96.668269 L131.728643,91.5973225 L123.385365,91.5973225 L124.84198,88.8286665 L116.55933,88.8286665 Z M133.386416,121.134887 C133.192097,120.855067 133.332007,120.362275 133.628926,119.336271 L136.744247,109.024932 L147.826644,109.024932 C149.441823,109.001614 150.607736,108.982959 151.366357,108.92855 C152.180942,108.843049 153.067037,108.552348 154.032413,108.030019 C155.028881,107.482817 155.538773,106.906078 155.969384,106.243839 C156.44974,105.583155 157.220798,104.137422 157.883037,101.908196 L161.798952,88.859291 L150.298381,88.926137 C150.298381,88.926137 146.757113,89.448466 145.197898,90.0252045 C143.624692,90.668789 141.37681,92.4658505 141.37681,92.4658505 L142.415251,88.8888275 L135.31095,88.8888275 L125.364931,121.874854 C125.012048,123.155803 124.775756,124.085425 124.721347,124.643509 C124.702692,125.245121 125.479968,125.840514 125.983643,126.289779 C126.579036,126.739045 127.458911,126.665981 128.303033,126.739045 C129.190682,126.805891 130.452978,126.847863 132.195629,126.847863 L137.655214,126.847863 L139.33102,121.189296 L134.443511,121.650998 C133.921182,121.650998 133.543426,121.371178 133.386416,121.134887 Z M138.754282,102.060541 L150.394763,102.060541 L149.654797,104.379932 C149.550642,104.434341 149.301913,104.264895 148.117345,104.404805 L138.037634,104.404805 L138.754282,102.060541 Z M141.086109,94.2815665 L152.824526,94.2815665 L151.980405,97.075095 C151.980405,97.075095 146.447757,97.020686 145.561663,97.1839135 C141.662847,97.858589 139.38543,99.941688 139.38543,99.941688 L141.086109,94.2815665 Z M149.915339,112.146937 C149.818957,112.493602 149.666611,112.705021 149.453638,112.863585 C149.217345,113.015931 148.834926,113.07034 148.264406,113.07034 L146.605699,113.07034 L146.703636,110.245721 L139.804537,110.245721 L139.524718,124.054801 C139.513836,125.051268 139.610218,125.628007 140.339303,126.089709 C141.068387,126.666447 143.314714,126.739511 146.338316,126.739511 L150.661524,126.739511 L152.222294,121.570628 L148.458724,121.777383 L147.207311,121.850447 C147.03631,121.777383 146.873082,121.710537 146.6912,121.528655 C146.532635,121.371645 146.265253,121.468028 146.30878,120.47156 L146.338316,116.931847 L150.285323,116.768619 C152.416613,116.768619 153.32758,116.075288 154.104855,115.414604 C154.846376,114.781902 155.088886,114.054372 155.368706,113.07034 L156.030945,109.936365 L150.607114,109.936365 L149.915339,112.146937 Z\" fill=\"#FEFEFE\"></path>\n\t</g>\n</svg>`,\n paypal: `<svg width=\"256px\" height=\"302px\" viewBox=\"0 0 256 302\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" preserveAspectRatio=\"xMidYMid\">\n\t<g>\n\t\t<path d=\"M217.168476,23.5070146 C203.234077,7.62479651 178.045612,0.815753338 145.823355,0.815753338 L52.3030619,0.815753338 C45.7104431,0.815753338 40.1083819,5.6103852 39.0762042,12.1114399 L0.136468302,259.076601 C-0.637664968,263.946149 3.13311322,268.357876 8.06925331,268.357876 L65.804612,268.357876 L80.3050438,176.385849 L79.8555471,179.265958 C80.8877248,172.764903 86.4481659,167.970272 93.0324607,167.970272 L120.46841,167.970272 C174.366398,167.970272 216.569147,146.078116 228.897012,82.7490197 C229.263268,80.8761167 229.579581,79.0531577 229.854273,77.2718188 C228.297683,76.4477414 228.297683,76.4477414 229.854273,77.2718188 C233.525163,53.8646924 229.829301,37.9325302 217.168476,23.5070146\" fill=\"#27346A\"></path>\n\t\t<path d=\"M102.396976,68.8395929 C103.936919,68.1070797 105.651665,67.699203 107.449652,67.699203 L180.767565,67.699203 C189.449511,67.699203 197.548776,68.265236 204.948824,69.4555699 C207.071448,69.7968545 209.127479,70.1880831 211.125242,70.6375799 C213.123006,71.0787526 215.062501,71.5781934 216.943728,72.1275783 C217.884341,72.4022708 218.808307,72.6852872 219.715624,72.9849517 C223.353218,74.2002577 226.741092,75.61534 229.854273,77.2718188 C233.525163,53.8563683 229.829301,37.9325302 217.168476,23.5070146 C203.225753,7.62479651 178.045612,0.815753338 145.823355,0.815753338 L52.2947379,0.815753338 C45.7104431,0.815753338 40.1083819,5.6103852 39.0762042,12.1114399 L0.136468302,259.068277 C-0.637664968,263.946149 3.13311322,268.349552 8.0609293,268.349552 L65.804612,268.349552 L95.8875974,77.5798073 C96.5035744,73.6675208 99.0174265,70.4627756 102.396976,68.8395929 Z\" fill=\"#27346A\"></path>\n\t\t<path d=\"M228.897012,82.7490197 C216.569147,146.069792 174.366398,167.970272 120.46841,167.970272 L93.0241367,167.970272 C86.4398419,167.970272 80.8794007,172.764903 79.8555471,179.265958 L61.8174095,293.621258 C61.1431644,297.883153 64.4394738,301.745495 68.7513129,301.745495 L117.421821,301.745495 C123.182038,301.745495 128.084882,297.550192 128.983876,291.864891 L129.458344,289.384335 L138.631407,231.249423 L139.222412,228.036354 C140.121406,222.351053 145.02425,218.15575 150.784467,218.15575 L158.067979,218.15575 C205.215193,218.15575 242.132193,199.002194 252.920115,143.605884 C257.423406,120.456802 255.092683,101.128442 243.181019,87.5519756 C239.568397,83.4399129 235.081754,80.0437153 229.854273,77.2718188 C229.571257,79.0614817 229.263268,80.8761167 228.897012,82.7490197 L228.897012,82.7490197 Z\" fill=\"#2790C3\"></path>\n\t\t<path d=\"M216.952052,72.1275783 C215.070825,71.5781934 213.13133,71.0787526 211.133566,70.6375799 C209.135803,70.1964071 207.071448,69.8051785 204.957148,69.4638939 C197.548776,68.265236 189.457835,67.699203 180.767565,67.699203 L107.457976,67.699203 C105.651665,67.699203 103.936919,68.1070797 102.4053,68.8479169 C99.0174265,70.4710996 96.5118984,73.6675208 95.8959214,77.5881313 L80.3133678,176.385849 L79.8638711,179.265958 C80.8877248,172.764903 86.4481659,167.970272 93.0324607,167.970272 L120.476734,167.970272 C174.374722,167.970272 216.577471,146.078116 228.905336,82.7490197 C229.271592,80.8761167 229.579581,79.0614817 229.862597,77.2718188 C226.741092,75.623664 223.361542,74.2002577 219.723948,72.9932757 C218.816631,72.6936112 217.892665,72.4022708 216.952052,72.1275783\" fill=\"#1F264F\"></path>\n\t</g>\n</svg>`,\n 'apple-pay': `<svg width=\"512px\" height=\"211px\" viewBox=\"0 0 512 211\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" preserveAspectRatio=\"xMidYMid\">\n <g>\n <path d=\"M93.5520633,27.1031049 C87.5513758,34.2039183 77.9502759,39.8045599 68.349176,39.0044683 C67.1490386,29.4033684 71.849577,19.2021998 77.3502072,12.901478 C83.3508946,5.6006416 93.8520976,0.400045829 102.353071,0 C103.353186,10.0011457 99.4527392,19.8022685 93.5520633,27.1031049 Z M102.25306,40.904686 C88.3514675,40.1045943 76.4501041,48.8055911 69.8493479,48.8055911 C63.1485803,48.8055911 53.0474231,41.3047318 42.0461628,41.5047547 C27.7445244,41.7047776 14.4430006,49.8057057 7.14216427,62.7071836 C-7.8595543,88.5101396 3.24171744,126.714516 17.7433787,147.716922 C24.8441922,158.118114 33.345166,169.51942 44.5464492,169.119374 C55.1476637,168.719328 59.3481449,162.218584 72.1496114,162.218584 C85.0510894,162.218584 88.7515133,169.119374 99.9527965,168.919351 C111.554126,168.719328 118.854962,158.51816 125.955775,148.116968 C134.056703,136.315616 137.357081,124.814299 137.557104,124.21423 C137.357081,124.014207 115.154538,115.513233 114.954515,89.9103 C114.754492,68.5078482 132.45652,58.3066795 133.256612,57.7066108 C123.255466,42.9049151 107.653679,41.3047318 102.25306,40.904686 Z M182.56226,11.9013634 L182.56226,167.819225 L206.765033,167.819225 L206.765033,114.513118 L240.268871,114.513118 C270.872377,114.513118 292.37484,93.5107124 292.37484,63.1072295 C292.37484,32.7037465 271.272423,11.9013634 241.068963,11.9013634 L182.56226,11.9013634 Z M206.765033,32.3037007 L234.668229,32.3037007 C255.670635,32.3037007 267.67201,43.5049839 267.67201,63.2072409 C267.67201,82.909498 255.670635,94.2107926 234.568218,94.2107926 L206.765033,94.2107926 L206.765033,32.3037007 Z M336.579904,169.019363 C351.781646,169.019363 365.883261,161.31848 372.283994,149.117083 L372.784052,149.117083 L372.784052,167.819225 L395.186618,167.819225 L395.186618,90.2103344 C395.186618,67.7077565 377.184556,53.2060952 349.481382,53.2060952 C323.778438,53.2060952 304.776261,67.9077794 304.076181,88.1100938 L325.878678,88.1100938 C327.678884,78.5089939 336.579904,72.2082721 348.781302,72.2082721 C363.582998,72.2082721 371.883949,79.1090626 371.883949,91.8105177 L371.883949,100.411503 L341.680488,102.211709 C313.577269,103.911904 298.375528,115.413222 298.375528,135.415513 C298.375528,155.617827 314.077326,169.019363 336.579904,169.019363 Z M343.080649,150.517243 C330.179171,150.517243 321.978231,144.316533 321.978231,134.815444 C321.978231,125.014321 329.879137,119.313668 344.980867,118.413565 L371.883949,116.713371 L371.883949,125.514379 C371.883949,140.116051 359.482528,150.517243 343.080649,150.517243 Z M425.090044,210.224083 C448.692748,210.224083 459.794019,201.223052 469.495131,173.919924 L512,54.7062671 L487.397182,54.7062671 L458.893916,146.816819 L458.393859,146.816819 L429.890594,54.7062671 L404.587695,54.7062671 L445.592392,168.219271 L443.39214,175.120061 C439.691716,186.821402 433.691029,191.321918 422.989803,191.321918 C421.089585,191.321918 417.389162,191.121895 415.88899,190.921872 L415.88899,209.624014 C417.28915,210.02406 423.289838,210.224083 425.090044,210.224083 Z\" fill=\"#000000\"></path>\n </g>\n</svg>`,\n 'google-pay': `<svg width=\"512px\" height=\"204px\" viewBox=\"0 0 512 204\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" preserveAspectRatio=\"xMidYMid\">\n <title>Google Pay</title>\n <g>\n <path d=\"M362.926585,55.0572275 C377.002187,55.0572275 387.878788,58.8960279 396.196189,66.5736286 C404.51359,74.2512294 408.35239,84.4880304 408.35239,97.2840316 L408.35239,158.704838 L390.437988,158.704838 L390.437988,144.629236 L389.798188,144.629236 C382.120587,156.145637 371.243986,161.903838 358.447985,161.903838 C347.571384,161.903838 337.974383,158.704838 330.296782,152.306837 C323.258982,145.908836 318.780381,136.951636 318.780381,127.354635 C318.780381,117.117834 322.619182,108.800433 330.296782,102.402432 C337.974383,96.0044315 348.850984,93.4452313 361.646985,93.4452313 C373.163386,93.4452313 382.120587,95.3646315 389.158388,99.8432319 L389.158388,95.3646315 C389.158388,89.3931642 386.92904,83.421697 382.470345,79.5309543 L381.480787,78.7298298 C376.362387,74.2512294 369.964386,71.6920291 362.926585,71.6920291 C352.049984,71.6920291 343.732584,76.1706296 337.974383,85.1278305 L321.339581,74.8910295 C331.576382,61.4552281 345.012184,55.0572275 362.926585,55.0572275 Z M272.714777,11.5508233 C284.195633,11.5508233 295.105804,15.5456243 303.828346,22.9962452 L305.34458,24.3468245 C314.301781,32.0244253 318.780381,43.5408264 318.780381,55.6970276 C318.780381,67.8532288 314.301781,78.7298298 305.34458,87.0472306 C296.387379,95.3646315 285.510778,99.8432319 272.714777,99.8432319 L242.004374,99.2034318 L242.004374,158.704838 L222.810372,158.704838 L222.810372,11.5508233 L272.714777,11.5508233 Z M365.485786,108.800433 C357.808185,108.800433 351.410184,110.719833 346.291784,114.558633 C341.173383,117.757634 338.614183,122.236234 338.614183,127.994435 C338.614183,133.112835 341.173383,137.591436 345.012184,140.150636 C349.490784,143.349636 354.609185,145.269036 359.727585,145.269036 C366.893346,145.269036 374.059107,142.482352 379.664324,137.429163 L380.840987,136.311835 C387.238988,130.553635 390.437988,123.515834 390.437988,115.838233 C384.679788,111.359633 376.362387,108.800433 365.485786,108.800433 Z M273.994377,29.465225 L242.004374,29.465225 L242.004374,80.64923 L273.994377,80.64923 C281.032177,80.64923 288.069978,78.0900298 292.548579,72.9716293 C302.78538,63.3746283 302.78538,47.3796268 293.188379,37.7826258 L292.548579,37.1428258 C287.430178,32.0244253 281.032177,28.825425 273.994377,29.465225 Z M512,58.2562278 L448.659794,203.490842 L429.465792,203.490842 L453.138394,152.946637 L411.55139,58.8960279 L432.024992,58.8960279 L462.095595,131.193435 L462.735395,131.193435 L492.166198,58.8960279 L512,58.8960279 L512,58.2562278 Z\" fill=\"#5F6368\"></path>\n <g>\n <path d=\"M165.868166,86.4074306 C165.868166,80.64923 165.228366,74.8910295 164.588566,69.1328289 L84.6135583,69.1328289 L84.6135583,101.762632 L130.039363,101.762632 C128.119963,111.999433 122.361762,121.596434 113.404561,127.354635 L113.404561,148.468037 L140.915964,148.468037 C156.910965,133.752635 165.868166,111.999433 165.868166,86.4074306 Z\" fill=\"#4285F4\"></path>\n <path d=\"M84.6135583,168.941639 C107.646361,168.941639 126.840362,161.264038 140.915964,148.468037 L113.404561,127.354635 C105.72696,132.473035 96.1299594,135.672035 84.6135583,135.672035 C62.8603561,135.672035 43.6663543,120.956634 37.2683536,100.483032 L9.11715089,100.483032 L9.11715089,122.236234 C23.8325523,151.027237 52.6235551,168.941639 84.6135583,168.941639 Z\" fill=\"#34A853\"></path>\n <path d=\"M37.2683536,100.483032 C33.4295533,90.246231 33.4295533,78.7298298 37.2683536,67.8532288 L37.2683536,46.1000266 L9.11715089,46.1000266 C-3.0390503,69.772629 -3.0390503,97.9238317 9.11715089,122.236234 L37.2683536,100.483032 Z\" fill=\"#FBBC04\"></path>\n <path d=\"M84.6135583,33.3040254 C96.7697595,33.3040254 108.286161,37.7826258 117.243361,46.1000266 L117.243361,46.1000266 L141.555764,21.7876243 C126.200562,7.71202289 105.72696,-0.60537792 85.2533583,0.0344221425 C53.2633552,0.0344221425 23.8325523,17.9488239 9.75695095,46.7398267 L37.9081537,68.4930288 C43.6663543,48.0194268 62.8603561,33.3040254 84.6135583,33.3040254 Z\" fill=\"#EA4335\"></path>\n </g>\n </g>\n</svg>`,\n}\n","import type { SmartCartWidget } from './types'\nimport { PAYMENT_ICON_SVGS } from './payment-icons'\n\n/** The 8 CC0 card icons available to the widget. */\nconst KNOWN_KEYS = new Set(Object.keys(PAYMENT_ICON_SVGS))\n\n/** Default badge set shown when `badges` is missing, empty, or all-invalid. */\nconst DEFAULT_BADGES: readonly string[] = ['visa', 'mastercard', 'amex', 'paypal']\n\n/**\n * Read `badges` defensively from the passthrough config blob: must be a string[], filtered to\n * known icon keys, with duplicates removed. Returns null when absent/invalid so the caller can\n * fall back to the default set.\n */\nfunction readBadges(config: Record<string, unknown>): string[] | null {\n const raw = config.badges\n if (!Array.isArray(raw)) return null\n const seen = new Set<string>()\n const valid: string[] = []\n for (const item of raw) {\n if (typeof item === 'string' && KNOWN_KEYS.has(item) && !seen.has(item)) {\n seen.add(item)\n valid.push(item)\n }\n }\n return valid.length > 0 ? valid : null\n}\n\nconst css = `\n .ksc-tb { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; justify-content: center;\n padding: 10px 16px 4px; }\n .ksc-tb__icon { display: flex; align-items: center; justify-content: center; width: 38px; height: 26px;\n border: 1px solid rgb(234, 236, 240); border-radius: 5px; background: #fff; box-sizing: border-box; }\n .ksc-tb__icon svg { max-height: 15px; max-width: 28px; width: auto; height: auto; display: block; }\n`\n\n/**\n * Trust-badges / payment-icon row widget (#1399). Renders a flex row of CC0 payment-method SVGs\n * in the cart footer. Badge selection is read defensively from the passthrough `badges` string[],\n * filtered to the 8 known icon keys. Falls back to ['visa','mastercard','amex','paypal'] when\n * the config is missing or all-invalid. SVG strings are trusted constants (only known keys are\n * emitted) — they are NOT HTML-escaped.\n */\nexport const trustBadges: SmartCartWidget = {\n key: 'trustBadges',\n zone: 'below-checkout',\n css,\n render({ config }) {\n const badges = readBadges(config) ?? DEFAULT_BADGES\n const icons = badges\n .map(\n (key) => `<span class=\"ksc-tb__icon\" data-badge=\"${key}\">${PAYMENT_ICON_SVGS[key]}</span>`,\n )\n .join('')\n return `<div class=\"ksc-tb\">${icons}</div>`\n },\n}\n","import { addOn } from './add-on'\nimport { discountCode } from './discount-code'\nimport { freeShippingBar } from './free-shipping-bar'\nimport { reservationTimer } from './reservation-timer'\nimport { stickyBubble } from './sticky-bubble'\nimport { trustBadges } from './trust-badges'\nimport { upsellCarousel } from './upsell-carousel'\nimport type { SmartCartWidget } from './types'\n\n/** First-party widgets, in registration order. */\nexport const WIDGETS: readonly SmartCartWidget[] = [\n freeShippingBar,\n trustBadges,\n stickyBubble,\n addOn,\n reservationTimer,\n upsellCarousel,\n discountCode,\n]\n\nexport type { SmartCartWidget, SmartCartWidgetContext, WidgetZone } from './types'\n","import type { CartAdapter, Money, SmartCartLine, SmartCartState } from './cart-adapter'\nimport type { SmartCartBranding } from './config'\nimport type { ProductVariantOption, UpsellVariant, VariantLookup } from './variant-lookup'\nimport { escapeHtml, formatCountdown, formatMoney, formatMoneyCompact } from './format'\nimport { ADDON_ATTR_KEY, ADDON_ATTR_VALUE, ADDON_KEY } from './widgets/add-on'\nimport { DEFAULT_MINUTES as TIMER_DEFAULT_MINUTES } from './widgets/reservation-timer'\nimport { readVariantIds, UPSELL_KEY, UPSELL_VARIANT_ATTR } from './widgets/upsell-carousel'\nimport { WIDGETS } from './widgets'\nimport type { WidgetZone } from './widgets/types'\n\nexport { escapeHtml, formatMoney } from './format'\n\nconst TAG = 'kotao-smart-cart'\n\n/** Widget key whose enabled config drives the reservation countdown (must match the widget's key). */\nconst RESERVATION_TIMER_KEY = 'reservationTimer'\nconst TIMER_TICK_MS = 1000\nconst MS_PER_MINUTE = 60_000\n\nconst TOKEN_VARS: Record<keyof SmartCartBranding, string> = {\n accent: '--ksc-accent',\n accentText: '--ksc-accent-text',\n surface: '--ksc-surface',\n text: '--ksc-text',\n fontFamily: '--ksc-font',\n radius: '--ksc-radius',\n}\n\nconst STYLES = `\n :host { position: fixed; inset: 0; z-index: 2147483000; pointer-events: none;\n --ksc-accent: #111; --ksc-accent-text: #fff; --ksc-surface: #fff; --ksc-text: #111;\n --ksc-font: system-ui, sans-serif; --ksc-radius: 12px;\n --ksc-positive: #0e9f6e;\n --ksc-muted: color-mix(in oklab, var(--ksc-text) 55%, transparent);\n --ksc-border: color-mix(in oklab, var(--ksc-text) 12%, transparent); }\n .overlay { position: absolute; inset: 0; background: rgba(0,0,0,.45); opacity: 0;\n transition: opacity .25s ease; }\n .panel { position: absolute; top: 0; right: 0; height: 100%; width: min(520px, 100vw);\n background: var(--ksc-surface); color: var(--ksc-text); font-family: var(--ksc-font);\n transform: translateX(100%); transition: transform .25s ease; display: flex; flex-direction: column;\n box-shadow: -8px 0 40px rgba(0,0,0,.14); }\n :host([open]) .overlay { opacity: 1; }\n :host([open]) .panel { transform: translateX(0); }\n :host(:not([open])) { pointer-events: none; }\n :host([open]) { pointer-events: auto; }\n\n /* Header — centered \"My cart · N\" with the close control pinned right (original cart layout). */\n .ksc-head { position: relative; display: flex; align-items: center; justify-content: center;\n gap: 6px; flex: 0 0 auto; padding: 16px 52px; }\n .ksc-head__title { font-size: 1.125rem; font-weight: 600; letter-spacing: .01em; }\n .ksc-head__count { font-weight: 600; font-size: 1.125rem; }\n .ksc-head__close { position: absolute; right: 14px; top: 50%; transform: translateY(-50%);\n display: flex; align-items: center; justify-content: center;\n width: 32px; height: 32px; padding: 0; border: none; background: none; cursor: pointer;\n color: var(--ksc-text); border-radius: 8px; }\n .ksc-head__close:hover { background: var(--ksc-border); }\n .ksc-head__close svg { width: 18px; height: 18px; }\n\n /* Items / line cards */\n .items { flex: 1 1 auto; overflow: auto; }\n .ksc-empty { display: flex; flex-direction: column; align-items: center; justify-content: center;\n gap: 14px; padding: 56px 24px; text-align: center; color: var(--ksc-muted); }\n .ksc-empty svg { width: 44px; height: 44px; opacity: .5; }\n .ksc-empty p { margin: 0; font-size: .95rem; }\n .ksc-line { display: grid; grid-template-columns: 80px 1fr; gap: 14px;\n padding: 14px 20px; }\n .ksc-line + .ksc-line { border-top: 1px solid var(--ksc-border); }\n .ksc-line__img { width: 80px; height: 80px; object-fit: cover; border-radius: 8px;\n background: var(--ksc-border); }\n .ksc-line__img--ph { display: block; }\n .ksc-line__body { display: flex; flex-direction: column; gap: 6px; min-width: 0; }\n .ksc-line__top { display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; }\n .ksc-line__main { display: flex; flex-direction: column; gap: 5px; min-width: 0; }\n .ksc-line__title { font-size: .9375rem; font-weight: 700; line-height: 1.3; }\n .ksc-line__compare { color: rgb(152, 162, 179); text-decoration: line-through;\n font-size: .875rem; white-space: nowrap; }\n .ksc-line__meta { display: flex; flex-direction: column; gap: 3px; }\n .ksc-line__opt { font-size: .8125rem; color: rgb(152, 162, 179); line-height: 1.35;\n overflow: hidden; text-overflow: ellipsis; }\n .ksc-line__opt b { font-weight: 700; color: var(--ksc-text); }\n .ksc-line__variant { display: flex; flex-direction: column; gap: 3px; align-items: flex-start;\n font-size: .8125rem; color: rgb(152, 162, 179); }\n .ksc-line__discount { font-size: .8125rem; font-weight: 500; color: var(--ksc-positive); line-height: 1.35; }\n .ksc-line__discount s { color: rgb(152, 162, 179); text-decoration: line-through; }\n .ksc-line__select { font: inherit; font-size: .8125rem; color: var(--ksc-text); padding: 4px 24px 4px 10px;\n border: 1px solid var(--ksc-border); border-radius: 8px; background: var(--ksc-surface); cursor: pointer;\n appearance: none; -webkit-appearance: none;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6' fill='none' stroke='%23999' stroke-width='1.5'%3E%3Cpath d='M1 1l4 4 4-4'/%3E%3C/svg%3E\");\n background-repeat: no-repeat; background-position: right 8px center; }\n .ksc-line__select:focus { outline: none; border-color: var(--ksc-accent); }\n .ksc-line__bottom { display: flex; align-items: center; justify-content: space-between;\n gap: 10px; margin-top: 4px; }\n .ksc-qty { display: inline-flex; align-items: center; border: 1px solid var(--ksc-border);\n border-radius: 8px; }\n .ksc-qty button { width: 32px; height: 32px; display: flex; align-items: center; justify-content: center;\n padding: 0; border: none; background: none; cursor: pointer; color: var(--ksc-text);\n font-size: 16px; line-height: 1; border-radius: 8px; }\n .ksc-qty button:hover { background: var(--ksc-border); }\n .ksc-qty__n { min-width: 26px; text-align: center; font-size: .875rem; font-variant-numeric: tabular-nums; }\n .ksc-line__prices { display: flex; flex-direction: column; align-items: flex-end; gap: 3px; flex: 0 0 auto; }\n .ksc-line__price { font-size: .9375rem; font-weight: 700; }\n .ksc-line__save { display: inline-flex; align-items: center; gap: 4px; font-size: .75rem;\n font-weight: 500; color: rgb(7, 148, 85); white-space: nowrap;\n background: rgb(220, 250, 230); padding: 3px 8px; border-radius: 6px; }\n .ksc-line__save svg { width: 12px; height: 12px; }\n .ksc-line__remove { display: flex; align-items: center; justify-content: center; width: 32px; height: 32px;\n padding: 0; border: none; background: none; cursor: pointer; color: var(--ksc-muted); border-radius: 8px; }\n .ksc-line__remove:hover { color: var(--ksc-text); background: var(--ksc-border); }\n .ksc-line__remove svg { width: 17px; height: 17px; }\n\n /* Footer / summary / checkout */\n .footer { flex: 0 0 auto; border-top: 1px solid var(--ksc-border); }\n .ksc-summary { display: flex; flex-direction: column; gap: 6px; padding: 12px 20px 2px; }\n .ksc-summary__row { display: flex; align-items: center; justify-content: space-between;\n font-size: .875rem; color: rgb(71, 84, 103); }\n .ksc-summary__row--total { font-size: 1rem; font-weight: 700; color: var(--ksc-text); }\n .checkout { display: block; text-align: center; margin: 10px 20px 0; padding: 16px;\n background: var(--ksc-accent); color: var(--ksc-accent-text); text-decoration: none;\n border-radius: 10px; font-weight: 700; font-size: 1rem; }\n .checkout:hover { opacity: .92; }\n .ksc-continue { display: block; width: 100%; padding: 8px 18px 16px; text-align: center;\n border: none; background: none; cursor: pointer; color: var(--ksc-text); font: inherit;\n font-size: .875rem; font-weight: 700; }\n .ksc-continue:hover { opacity: .7; }\n\n @media (prefers-reduced-motion: reduce) { .overlay, .panel { transition: none; } }\n .chrome { position: absolute; inset: 0; pointer-events: none; }\n .chrome > * { pointer-events: auto; }\n :host([open]) .chrome { display: none; }\n`\n\nconst CLOSE_SVG = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" aria-hidden=\"true\"><path d=\"M6 6l12 12M18 6L6 18\"/></svg>`\nconst TRASH_SVG = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M4 7h16M9 7V4h6v3M7 7l1 13h8l1-13\"/></svg>`\nconst BAG_SVG = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M6 8h12l1 12H5L6 8zM9 8a3 3 0 0 1 6 0\"/></svg>`\nconst TAG_SVG = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M20 13l-7 7-9-9V4h7l9 9z\"/><circle cx=\"7.5\" cy=\"7.5\" r=\"1\" fill=\"currentColor\"/></svg>`\n\n// Guard: HTMLElement is not available in non-DOM environments (e.g. Node.js / Vitest Node tests).\n// Importing this module from Node is safe as long as SmartCartElement is never constructed there.\nconst Base: typeof HTMLElement =\n typeof HTMLElement !== 'undefined' ? HTMLElement : (class {} as unknown as typeof HTMLElement)\n\nexport class SmartCartElement extends Base {\n static readonly tagName = TAG\n static register(): void {\n if (!customElements.get(TAG)) customElements.define(TAG, SmartCartElement)\n }\n\n #adapter: CartAdapter | null = null\n #variantLookup: VariantLookup | null = null\n /** Resolved upsell variant display data, keyed by variant id; null until the first lookup runs. */\n #upsellVariants: ReadonlyMap<string, UpsellVariant> | null = null\n #upsellFetchInFlight = false\n /** Sibling variants per product handle, for the in-cart variant switcher; resolved lazily on open. */\n #productVariants = new Map<string, readonly ProductVariantOption[]>()\n #productVariantsFetching = new Set<string>()\n /** Last cart state rendered, so an async upsell resolve can re-render the carousel in place. */\n #lastState: SmartCartState | null = null\n #addOnDefaultApplied = false\n #addOnPending = false\n #upsellPending = false\n #discountPending = false\n #linePending = false\n #open = false\n #root: ShadowRoot\n #widgets: Record<string, { enabled?: boolean } & Record<string, unknown>> = {}\n #widgetCssInjected = false\n #timerIntervalId: ReturnType<typeof setInterval> | null = null\n #timerEndMs: number | null = null\n #onKeydown = (e: KeyboardEvent): void => {\n if (e.key === 'Escape') this.close()\n }\n\n constructor() {\n super()\n this.#root = this.attachShadow({ mode: 'open' })\n this.#root.innerHTML = `\n <style>${STYLES}</style>\n <div class=\"overlay\" data-overlay></div>\n <aside class=\"panel\" role=\"dialog\" aria-modal=\"true\" aria-label=\"Cart\" aria-hidden=\"true\">\n <header class=\"ksc-head\">\n <span class=\"ksc-head__title\">My cart</span>\n <span class=\"ksc-head__count\" data-cart-count></span>\n <button type=\"button\" class=\"ksc-head__close\" data-smart-cart-close aria-label=\"Close cart\">${CLOSE_SVG}</button>\n </header>\n <slot name=\"top-bar\"></slot>\n <div data-widget-zone=\"top-bar\"></div>\n <slot name=\"before-items\"></slot>\n <div data-widget-zone=\"before-items\"></div>\n <div class=\"items\">\n <div data-items></div>\n <slot name=\"after-items\"></slot>\n <div data-widget-zone=\"after-items\"></div>\n </div>\n <div class=\"footer\">\n <slot name=\"footer\"></slot>\n <div data-widget-zone=\"footer\"></div>\n <div data-checkout-wrap></div>\n <div data-widget-zone=\"below-checkout\"></div>\n <div data-continue-wrap></div>\n </div>\n </aside>\n <div class=\"chrome\" data-chrome></div>`\n this.#root.querySelector('[data-overlay]')?.addEventListener('click', () => this.close())\n this.#root.querySelector('[data-chrome]')?.addEventListener('click', (e) => {\n if ((e.target as Element | null)?.closest('[data-smart-cart-open]')) void this.open()\n })\n this.#root.querySelector('.panel')?.addEventListener('click', (e) => {\n const target = e.target as Element | null\n if (target?.closest('[data-smart-cart-close]')) {\n this.close()\n return\n }\n const qtyDec = target?.closest('[data-smart-cart-qty-dec]')\n if (qtyDec) {\n void this.#onQty(qtyDec, -1)\n return\n }\n const qtyInc = target?.closest('[data-smart-cart-qty-inc]')\n if (qtyInc) {\n void this.#onQty(qtyInc, 1)\n return\n }\n const lineRemove = target?.closest('[data-smart-cart-line-remove]')\n if (lineRemove) {\n void this.#onLineRemove(lineRemove)\n return\n }\n const toggle = target?.closest('[data-smart-cart-addon-toggle]')\n if (toggle) {\n void this.#onAddOnToggle(toggle)\n return\n }\n const upsellBtn = target?.closest('[data-smart-cart-upsell-add]')\n if (upsellBtn) void this.#onUpsellAdd(upsellBtn)\n const upsellNav = target?.closest(\n '[data-smart-cart-upsell-prev], [data-smart-cart-upsell-next]',\n )\n if (upsellNav) {\n this.#onUpsellNav(upsellNav)\n return\n }\n const discountApply = target?.closest('[data-smart-cart-discount-apply]')\n if (discountApply) {\n void this.#onDiscountApply(discountApply)\n return\n }\n const discountRemove = target?.closest('[data-smart-cart-discount-remove]')\n if (discountRemove) void this.#onDiscountRemove(discountRemove)\n })\n this.#root.querySelector('.panel')?.addEventListener('change', (e) => {\n const select = (e.target as Element | null)?.closest('[data-smart-cart-variant]')\n if (select) {\n void this.#onVariantSelect(select)\n return\n }\n const upsellSelect = (e.target as Element | null)?.closest('[data-smart-cart-upsell-variant]')\n if (upsellSelect) this.#onUpsellVariantSelect(upsellSelect)\n })\n }\n\n connectedCallback(): void {\n // Render the chrome (e.g. sticky bubble) on mount, decoupled from open(). Only fetch the cart\n // when an enabled chrome widget is present — never add a cart request to pages with chrome off.\n if (!this.#adapter || !this.#chromeEnabled()) return\n void this.#adapter.getCart().then((state) => this.#renderChrome(state))\n }\n\n disconnectedCallback(): void {\n document.removeEventListener('keydown', this.#onKeydown)\n if (this.#timerIntervalId !== null) {\n clearInterval(this.#timerIntervalId)\n this.#timerIntervalId = null\n }\n }\n\n get isOpen(): boolean {\n return this.#open\n }\n\n setAdapter(adapter: CartAdapter): void {\n this.#adapter = adapter\n }\n\n /** Wire the variant display-data seam used by the upsell carousel (productVariantsByIds, #1431).\n * Optional: with no lookup the carousel simply never resolves variants and renders nothing. */\n setVariantLookup(lookup: VariantLookup): void {\n this.#variantLookup = lookup\n }\n\n setBranding(branding: SmartCartBranding): void {\n for (const [key, cssVar] of Object.entries(TOKEN_VARS)) {\n const value = branding[key as keyof SmartCartBranding]\n if (value) this.style.setProperty(cssVar, value)\n }\n }\n\n setWidgets(\n widgets: Record<string, { enabled?: boolean } & Record<string, unknown>> | undefined,\n ): void {\n this.#widgets = widgets ?? {}\n }\n\n async open(): Promise<void> {\n this.#open = true\n this.setAttribute('open', '')\n this.#dialog()?.setAttribute('aria-hidden', 'false')\n document.addEventListener('keydown', this.#onKeydown)\n if (this.#adapter) {\n const loaded = await this.#adapter.getCart()\n const state = await this.#ensureAddOnDefault(loaded)\n this.#renderCart(state)\n this.#renderChrome(state)\n }\n // Resolve upsell display data lazily on first open (no network on page load); re-renders the\n // carousel when it lands. Fire-and-forget — the drawer is already shown. Sibling variants (the\n // in-cart switcher + the upsell size select) resolve AFTER, since the upsell handles come from\n // the resolved upsell variants.\n void this.#resolveUpsellVariants().then(() => this.#resolveProductVariants())\n }\n\n /** Add a line (from a theme add-to-cart submit intercepted by mountSmartCart) and open the drawer on\n * the result. Opens first for instant feedback, then adds and reconciles against the server cart.\n * Guarded against re-entrancy so a rapid double-click cannot add twice; a failed add leaves the\n * opened drawer on the current cart rather than throwing. */\n async addLineAndOpen(\n variantId: string,\n quantity: number,\n properties?: Record<string, string>,\n ): Promise<void> {\n if (this.#linePending) return\n this.#linePending = true\n try {\n await this.open()\n if (this.#adapter) {\n const state = await this.#adapter.addLine(variantId, quantity, properties)\n this.#renderCart(state)\n this.#renderChrome(state)\n }\n } catch {\n // The add failed (network / invalid variant): keep the opened drawer on the current cart.\n } finally {\n this.#linePending = false\n }\n }\n\n /** Lazily fetch sibling variants for every cart line that has a product handle and a real variant\n * title (single-variant lines have none → no switcher), plus every resolved upsell/add-on\n * product (the upsell card's size select). Caches per handle, never re-fetches, and re-renders\n * the cart once new variants land so the `<select>`s appear. Fail-closed per the lookup. */\n async #resolveProductVariants(): Promise<void> {\n const lookup = this.#variantLookup\n if (!lookup?.fetchProductVariants || this.#lastState === null) return\n const handles = new Set<string>()\n for (const line of this.#lastState.lines) {\n const handle = line.productHandle\n if (\n typeof handle === 'string' &&\n handle.length > 0 &&\n line.variantTitle !== null &&\n !this.#productVariants.has(handle) &&\n !this.#productVariantsFetching.has(handle)\n ) {\n handles.add(handle)\n }\n }\n for (const variant of this.#upsellVariants?.values() ?? []) {\n const handle = variant.productHandle\n if (\n handle !== null &&\n handle.length > 0 &&\n !this.#productVariants.has(handle) &&\n !this.#productVariantsFetching.has(handle)\n ) {\n handles.add(handle)\n }\n }\n if (handles.size === 0) return\n await Promise.all(\n [...handles].map(async (handle) => {\n this.#productVariantsFetching.add(handle)\n try {\n const variants = await lookup.fetchProductVariants!(handle)\n if (variants.length > 0) this.#productVariants.set(handle, variants)\n } finally {\n this.#productVariantsFetching.delete(handle)\n }\n }),\n )\n if (this.#open && this.#lastState !== null) this.#renderCart(this.#lastState)\n }\n\n /** Swap a line to a different variant of the same product. Adds the target variant first (carrying\n * the line's properties) then removes the old line, so a mid-swap failure never drops the item. */\n async #onVariantSelect(select: Element): Promise<void> {\n if (!this.#adapter || this.#linePending) return\n if (!(select instanceof HTMLSelectElement)) return\n const lineId = select.getAttribute('data-line-id')\n const targetVariantId = select.value\n const qty = Number(select.getAttribute('data-qty'))\n if (!lineId || !targetVariantId || !Number.isFinite(qty) || qty <= 0) return\n const line = this.#lastState?.lines.find((l) => l.id === lineId)\n this.#linePending = true\n try {\n await this.#adapter.addLine(targetVariantId, qty, line?.attributes)\n const next = await this.#adapter.removeLine(lineId)\n this.#renderCart(next)\n this.#renderChrome(next)\n } finally {\n this.#linePending = false\n }\n // The new line may belong to a product whose variants aren't cached yet — resolve again.\n void this.#resolveProductVariants()\n }\n\n /** Configured upsell variant ids when the carousel is enabled; [] otherwise. */\n #upsellVariantIds(): readonly string[] {\n const cfg = this.#widgets[UPSELL_KEY]\n if (cfg?.enabled !== true) return []\n return readVariantIds(cfg)\n }\n\n /** Configured add-on variant id when the add-on widget is enabled; null otherwise. The add-on card\n * resolves its title/price/image from the same lookup as the upsell carousel. */\n #addOnVariantId(): string | null {\n const cfg = this.#widgets[ADDON_KEY]\n if (cfg?.enabled !== true) return null\n const raw = cfg.variantId\n return typeof raw === 'string' && raw.trim() !== '' ? raw : null\n }\n\n /** Fetch variant display data (upsell carousel + add-on card) once and re-render the open drawer.\n * Skips when there is no lookup, nothing configured, a fetch is already in flight, or data is\n * already resolved. An empty result (fail-closed or all-inactive) is allowed to retry on a later open. */\n async #resolveUpsellVariants(): Promise<void> {\n if (!this.#variantLookup) return\n if (this.#upsellVariants !== null && this.#upsellVariants.size > 0) return\n if (this.#upsellFetchInFlight) return\n const ids = [...this.#upsellVariantIds()]\n const addOnId = this.#addOnVariantId()\n if (addOnId !== null && !ids.includes(addOnId)) ids.push(addOnId)\n if (ids.length === 0) return\n this.#upsellFetchInFlight = true\n try {\n const variants = await this.#variantLookup.fetchVariants(ids)\n this.#upsellVariants = new Map(variants.map((v) => [v.id, v]))\n } finally {\n this.#upsellFetchInFlight = false\n }\n if (this.#open && this.#lastState !== null) this.#renderWidgets(this.#lastState)\n }\n\n async #ensureAddOnDefault(state: SmartCartState): Promise<SmartCartState> {\n if (this.#addOnDefaultApplied || !this.#adapter) return state\n // Find an enabled widget config entry that opts into defaultOn and names a variant.\n // Keyed loosely over the full config blob so it is independent of widget registry order.\n const entry = Object.values(this.#widgets).find(\n (c) =>\n c?.enabled === true &&\n (c as { defaultOn?: unknown }).defaultOn === true &&\n typeof (c as { variantId?: unknown }).variantId === 'string',\n ) as ({ variantId?: string } & Record<string, unknown>) | undefined\n if (!entry?.variantId) return state\n // Set the flag BEFORE the await so a rapid double-open cannot fire twice.\n this.#addOnDefaultApplied = true\n const present = state.lines.some((l) => l.variantId === entry.variantId)\n if (present) return state\n return this.#adapter.addLine(entry.variantId, 1, { [ADDON_ATTR_KEY]: ADDON_ATTR_VALUE })\n }\n\n close(): void {\n this.#open = false\n this.removeAttribute('open')\n this.#dialog()?.setAttribute('aria-hidden', 'true')\n document.removeEventListener('keydown', this.#onKeydown)\n }\n\n /** Build an optimistic next state for an add-on toggle so the switch (and the subtotal) flips the\n * instant it's clicked, before the network round-trip. On add a synthetic add-on line is appended\n * (priced from the resolved variant, hidden from the list by the add-on filter) and the subtotal\n * bumped; on remove the add-on line is dropped and the subtotal reduced. Null when there is no\n * prior state or configured add-on variant — the caller then skips the optimism and just awaits. */\n #optimisticAddOnState(add: boolean): SmartCartState | null {\n const base = this.#lastState\n const variantId = this.#addOnVariantId()\n if (base === null || variantId === null) return null\n const currency = base.subtotal.currency\n if (add) {\n const price = this.#upsellVariants?.get(variantId)?.price ?? { amount: 0, currency }\n const line: SmartCartLine = {\n id: `ksc-optimistic-addon-${variantId}`,\n title: '',\n variantTitle: null,\n variantId,\n quantity: 1,\n imageUrl: null,\n linePrice: { amount: price.amount, currency },\n attributes: { [ADDON_ATTR_KEY]: ADDON_ATTR_VALUE },\n }\n return {\n ...base,\n lines: [...base.lines, line],\n subtotal: { amount: base.subtotal.amount + price.amount, currency },\n }\n }\n const removed = base.lines.find((l) => l.variantId === variantId)\n return {\n ...base,\n lines: base.lines.filter((l) => l.variantId !== variantId),\n subtotal: {\n amount: Math.max(0, base.subtotal.amount - (removed?.linePrice.amount ?? 0)),\n currency,\n },\n }\n }\n\n async #onAddOnToggle(toggle: Element): Promise<void> {\n if (!this.#adapter || this.#addOnPending) return\n const checked = toggle.getAttribute('data-checked') === 'true'\n const lineId = toggle.getAttribute('data-line-id')\n const variantId = toggle.getAttribute('data-variant-id')\n if (checked ? !lineId : !variantId) return\n\n // Optimistic: flip the switch + subtotal immediately so the click feels instant; the server\n // result reconciles the real state below (and corrects a rare optimistic/server divergence).\n const optimistic = this.#optimisticAddOnState(!checked)\n if (optimistic) {\n this.#renderCart(optimistic)\n this.#renderChrome(optimistic)\n }\n\n this.#addOnPending = true\n try {\n const next = checked\n ? await this.#adapter.removeLine(lineId!)\n : await this.#adapter.addLine(variantId!, 1, { [ADDON_ATTR_KEY]: ADDON_ATTR_VALUE })\n this.#renderCart(next)\n this.#renderChrome(next)\n } finally {\n this.#addOnPending = false\n }\n }\n\n /** Scroll the upsell track one card left/right (the arrows sit outside the track). */\n #onUpsellNav(btn: Element): void {\n const track = btn.closest('.ksc-up')?.querySelector('.ksc-up__track')\n if (!track) return\n const direction = btn.hasAttribute('data-smart-cart-upsell-prev') ? -1 : 1\n track.scrollBy({ left: direction * track.clientWidth, behavior: 'smooth' })\n }\n\n /** Retarget an upsell card's add button when the shopper picks a different size — the select\n * carries no other intent (no re-render, no network). */\n #onUpsellVariantSelect(select: Element): void {\n if (!(select instanceof HTMLSelectElement)) return\n const addBtn = select.closest('.ksc-up__card')?.querySelector('[data-smart-cart-upsell-add]')\n if (addBtn && select.value) addBtn.setAttribute('data-variant-id', select.value)\n }\n\n async #onUpsellAdd(btn: Element): Promise<void> {\n if (!this.#adapter || this.#upsellPending) return\n const variantId = btn.getAttribute('data-variant-id')\n if (!variantId) return\n this.#upsellPending = true\n try {\n const next = await this.#adapter.addLine(variantId, 1, {\n [UPSELL_VARIANT_ATTR]: variantId,\n })\n this.#renderCart(next)\n this.#renderChrome(next)\n } finally {\n this.#upsellPending = false\n }\n }\n\n /** Quantity stepper. `delta` is +1 / −1. Decrementing past 1 removes the line. Guarded against\n * re-entrancy so a rapid double-click cannot fire two mutations. */\n /** Optimistic state for a line quantity change (or removal at `nextQty <= 0`): rescale the line\n * price + subtotal so the number updates the instant the stepper/trash is clicked, before the\n * network round-trip. Null when there is no prior state or the line is gone. */\n #optimisticQtyState(lineId: string, nextQty: number): SmartCartState | null {\n const base = this.#lastState\n if (base === null) return null\n const line = base.lines.find((l) => l.id === lineId)\n if (!line) return null\n const currency = base.subtotal.currency\n if (nextQty <= 0) {\n return {\n ...base,\n lines: base.lines.filter((l) => l.id !== lineId),\n subtotal: { amount: Math.max(0, base.subtotal.amount - line.linePrice.amount), currency },\n }\n }\n const unit = line.quantity > 0 ? line.linePrice.amount / line.quantity : line.linePrice.amount\n const newLineAmount = Math.round(unit * nextQty)\n const scaled: SmartCartLine = {\n ...line,\n quantity: nextQty,\n linePrice: { amount: newLineAmount, currency: line.linePrice.currency },\n ...(line.compareAtLinePrice &&\n line.quantity > 0 && {\n compareAtLinePrice: {\n amount: Math.round((line.compareAtLinePrice.amount / line.quantity) * nextQty),\n currency: line.compareAtLinePrice.currency,\n },\n }),\n }\n return {\n ...base,\n lines: base.lines.map((l) => (l.id === lineId ? scaled : l)),\n subtotal: {\n amount: base.subtotal.amount + (newLineAmount - line.linePrice.amount),\n currency,\n },\n }\n }\n\n async #onQty(btn: Element, delta: number): Promise<void> {\n if (!this.#adapter || this.#linePending) return\n const lineId = btn.closest('[data-line-id]')?.getAttribute('data-line-id')\n const current = Number(btn.getAttribute('data-qty'))\n if (!lineId || !Number.isFinite(current)) return\n const next = current + delta\n const optimistic = this.#optimisticQtyState(lineId, next)\n if (optimistic) {\n this.#renderCart(optimistic)\n this.#renderChrome(optimistic)\n }\n this.#linePending = true\n try {\n const state =\n next <= 0\n ? await this.#adapter.removeLine(lineId)\n : await this.#adapter.updateLine(lineId, next)\n this.#renderCart(state)\n this.#renderChrome(state)\n } finally {\n this.#linePending = false\n }\n }\n\n async #onLineRemove(btn: Element): Promise<void> {\n if (!this.#adapter || this.#linePending) return\n const lineId = btn.closest('[data-line-id]')?.getAttribute('data-line-id')\n if (!lineId) return\n const optimistic = this.#optimisticQtyState(lineId, 0)\n if (optimistic) {\n this.#renderCart(optimistic)\n this.#renderChrome(optimistic)\n }\n this.#linePending = true\n try {\n const state = await this.#adapter.removeLine(lineId)\n this.#renderCart(state)\n this.#renderChrome(state)\n } finally {\n this.#linePending = false\n }\n }\n\n async #onDiscountApply(applyBtn: Element): Promise<void> {\n if (!this.#adapter || this.#discountPending) return\n // Find the sibling input within the same .ksc-discount container.\n const container = applyBtn.closest('.ksc-discount')\n const input = container?.querySelector('[data-smart-cart-discount-input]') as\n | HTMLInputElement\n | null\n | undefined\n const code = (input?.value ?? '').trim()\n if (!code) return\n const current = this.#lastState?.appliedCodes ?? []\n this.#discountPending = true\n try {\n const next = await this.#adapter.updateDiscountCodes([...current, code])\n this.#renderCart(next)\n this.#renderChrome(next)\n } finally {\n this.#discountPending = false\n }\n }\n\n async #onDiscountRemove(removeBtn: Element): Promise<void> {\n if (!this.#adapter || this.#discountPending) return\n const code = removeBtn.getAttribute('data-code')\n if (!code) return\n const current = this.#lastState?.appliedCodes ?? []\n this.#discountPending = true\n try {\n const next = await this.#adapter.updateDiscountCodes(current.filter((c) => c !== code))\n this.#renderCart(next)\n this.#renderChrome(next)\n } finally {\n this.#discountPending = false\n }\n }\n\n #dialog(): Element | null {\n return this.#root.querySelector('[role=\"dialog\"]')\n }\n\n #injectWidgetCss(): void {\n if (this.#widgetCssInjected) return\n const css = WIDGETS.map((w) => w.css)\n .filter((c): c is string => typeof c === 'string' && c.length > 0)\n .join('\\n')\n if (css) {\n const style = this.#root.querySelector('style')\n if (style) style.append(`\\n${css}`)\n }\n this.#widgetCssInjected = true\n }\n\n #chromeEnabled(): boolean {\n return WIDGETS.some(\n (w) => (w.placement ?? 'zone') === 'chrome' && this.#widgets[w.key]?.enabled === true,\n )\n }\n\n #renderChrome(state: SmartCartState | null): void {\n this.#injectWidgetCss()\n const chrome = this.#root.querySelector('[data-chrome]')\n if (!chrome) return\n const html = WIDGETS.filter((w) => (w.placement ?? 'zone') === 'chrome')\n .map((w) => {\n const cfg = this.#widgets[w.key]\n if (cfg?.enabled !== true) return ''\n return w.render({\n config: cfg,\n state,\n formatMoney,\n ...(this.#upsellVariants !== null && { variants: this.#upsellVariants }),\n })\n })\n .join('')\n chrome.innerHTML = html\n }\n\n #renderWidgets(state: SmartCartState | null): void {\n this.#injectWidgetCss()\n const zones = new Map<WidgetZone, Element>()\n for (const zone of this.#root.querySelectorAll('[data-widget-zone]')) {\n zones.set(zone.getAttribute('data-widget-zone') as WidgetZone, zone)\n }\n // Multiple widgets can share one zone (e.g. addOn + discountCode both target 'footer', addOn\n // first per registry order). Accumulate each enabled widget's HTML per zone in registry order, then write every\n // zone's innerHTML exactly once below — a single writer per zone, so a later widget never\n // overwrites an earlier one and a disabled widget never wipes an enabled sibling. A zone with\n // no enabled widget falls through to '' (cleared).\n const html = new Map<WidgetZone, string>()\n for (const widget of WIDGETS) {\n if ((widget.placement ?? 'zone') !== 'zone') continue\n if (!widget.zone || !zones.has(widget.zone)) continue\n const cfg = this.#widgets[widget.key]\n if (cfg?.enabled !== true) continue\n let rendered = ''\n try {\n rendered = widget.render({\n config: cfg,\n state,\n formatMoney,\n ...(this.#upsellVariants !== null && { variants: this.#upsellVariants }),\n ...(this.#productVariants.size > 0 && { productVariants: this.#productVariants }),\n })\n } catch (err) {\n console.error(`[kotao-smart-cart] widget render failed`, widget.key, err)\n }\n html.set(widget.zone, (html.get(widget.zone) ?? '') + rendered)\n }\n for (const [name, zone] of zones) {\n zone.innerHTML = html.get(name) ?? ''\n }\n }\n\n /** Positive integer minutes from the enabled reservationTimer widget config, or null.\n * Mirrors the widget's own resolution exactly: absent `minutes` → TIMER_DEFAULT_MINUTES;\n * present but invalid (non-number / ≤0 / non-finite) → null (no interval). */\n #reservationMinutes(): number | null {\n const cfg = this.#widgets[RESERVATION_TIMER_KEY]\n if (cfg?.enabled !== true) return null\n const raw = cfg.minutes\n if (raw === undefined) return TIMER_DEFAULT_MINUTES\n return typeof raw === 'number' && Number.isFinite(raw) && raw > 0 ? Math.floor(raw) : null\n }\n\n /** Compute the element-lifetime end time once and start a single per-second tick. Idempotent:\n * guards on #timerEndMs so it never resets the end time or starts a second interval after\n * expiry (post-expiry re-open stays expired — start-once for the element's lifetime). */\n #startTimerIfNeeded(): void {\n if (this.#timerEndMs !== null) return\n const minutes = this.#reservationMinutes()\n if (minutes === null) return\n this.#timerEndMs = Date.now() + minutes * MS_PER_MINUTE\n this.#timerIntervalId = setInterval(() => this.#tickCountdown(), TIMER_TICK_MS)\n }\n\n /** Surgically update the countdown span's text; stop the interval at expiry. No full re-render. */\n #tickCountdown(): void {\n const span = this.#root.querySelector('[data-ksc-countdown]')\n if (!span) return\n if (this.#timerEndMs === null) return\n const remaining = Math.max(0, this.#timerEndMs - Date.now())\n if (remaining === 0) {\n span.textContent = span.getAttribute('data-ksc-end-text') ?? formatCountdown(0)\n if (this.#timerIntervalId !== null) {\n clearInterval(this.#timerIntervalId)\n this.#timerIntervalId = null\n }\n return\n }\n span.textContent = formatCountdown(remaining)\n }\n\n /** One cart line as a rich card: image, title, struck compare-at, options/personalization,\n * quantity stepper, price, \"You save …\" badge, and a remove control. */\n #renderLine(l: SmartCartLine): string {\n const id = escapeHtml(l.id)\n const image = l.imageUrl\n ? `<img class=\"ksc-line__img\" src=\"${escapeHtml(l.imageUrl)}\" alt=\"${escapeHtml(l.title)}\" width=\"64\" height=\"64\" loading=\"lazy\">`\n : `<div class=\"ksc-line__img ksc-line__img--ph\" aria-hidden=\"true\"></div>`\n\n // Meta lines (top→bottom, matching the live cart): visible (non-`_`-prefixed) line properties\n // such as personalization, then either an in-cart variant `<select>` (when the product's sibling\n // variants have resolved) or the static option text.\n const opts = l.options ?? (l.variantTitle ? [{ name: '', value: l.variantTitle }] : [])\n const handle = l.productHandle ?? null\n const variants = handle ? this.#productVariants.get(handle) : undefined\n const hasSwitcher = variants !== undefined && variants.length > 1\n const optName = l.options?.[0]?.name ?? ''\n\n // Property/option meta mirrors the original cart: grey label, BOLD value (\"Personalized: Yes\").\n const propLines = (l.properties ?? []).map(\n (p) =>\n `<span class=\"ksc-line__opt\">${escapeHtml(p.name)}: <b>${escapeHtml(p.value)}</b></span>`,\n )\n const optLines = hasSwitcher\n ? []\n : opts.map((o) =>\n o.name\n ? `<span class=\"ksc-line__opt\">${escapeHtml(o.name)}: <b>${escapeHtml(o.value)}</b></span>`\n : `<span class=\"ksc-line__opt\">${escapeHtml(o.value)}</span>`,\n )\n const switcher = hasSwitcher\n ? `<div class=\"ksc-line__variant\">${optName ? `<span>${escapeHtml(optName)}:</span>` : ''}<select class=\"ksc-line__select\" data-smart-cart-variant data-line-id=\"${id}\" data-qty=\"${l.quantity}\" aria-label=\"${escapeHtml(optName || 'Variant')}\">${variants!\n .map(\n (v) =>\n `<option value=\"${escapeHtml(v.id)}\"${v.title === l.variantTitle ? ' selected' : ''}>${escapeHtml(v.title ?? '')}</option>`,\n )\n .join('')}</select></div>`\n : ''\n\n const metaParts = [...propLines, ...optLines, ...(switcher ? [switcher] : [])]\n const meta = metaParts.length ? `<div class=\"ksc-line__meta\">${metaParts.join('')}</div>` : ''\n\n // Model B (line shows what you pay, #1560): the main price is ALWAYS the final, post-discount\n // `linePrice`. The struck \"was\" price is the genuine-sale compareAtLinePrice when it beats\n // linePrice; else, for a line with a discount but no sale (e.g. a non-sale BOGO), it falls back\n // to originalLinePrice when that beats linePrice. \"You save\" is struck − linePrice (using the\n // FINAL price), so it reflects the total saving vs. the original — not just the sale portion.\n const hasLineDiscount = (l.discountAllocations?.length ?? 0) > 0\n const struck: Money | undefined =\n l.compareAtLinePrice && l.compareAtLinePrice.amount > l.linePrice.amount\n ? l.compareAtLinePrice\n : hasLineDiscount && l.originalLinePrice && l.originalLinePrice.amount > l.linePrice.amount\n ? l.originalLinePrice\n : undefined\n const compare = struck\n ? `<span class=\"ksc-line__compare\">${escapeHtml(formatMoney(struck))}</span>`\n : ''\n const save =\n struck && struck.amount - l.linePrice.amount > 0\n ? `<span class=\"ksc-line__save\">${TAG_SVG}You save ${escapeHtml(\n formatMoneyCompact({\n amount: struck.amount - l.linePrice.amount,\n currency: l.linePrice.currency,\n }),\n )}</span>`\n : ''\n\n // Discount sub-row(s), unchanged: a struck-to-€0 \"FREE\" row per freed unit for a Buy-X-Get-Y\n // allocation, or a plain \"−amount\" row for a whole-line %. The main price above is now always\n // the final price, so these rows are purely informational (not subtracted from anything).\n const displayPrice = l.linePrice\n const discountRows = hasLineDiscount\n ? l\n .discountAllocations!.map((a) => {\n const code = escapeHtml(a.code)\n if (typeof a.quantity === 'number' && a.quantity > 0) {\n const unit = Math.round((l.originalLinePrice ?? l.linePrice).amount / l.quantity)\n const struck = escapeHtml(\n formatMoney({ amount: unit * a.quantity, currency: l.linePrice.currency }),\n )\n return `<div class=\"ksc-line__discount\"><span>🎁 ${a.quantity}× ${code} — <s>${struck}</s> FREE · You save 100%</span></div>`\n }\n return `<div class=\"ksc-line__discount\"><span>🏷 ${code} −${escapeHtml(formatMoney(a.amount))}</span></div>`\n })\n .join('')\n : ''\n\n // Layout mirrors the original cart: title + meta on the left, a right-aligned stacked price\n // column (struck compare-at above the final price above the savings badge), and a bottom row\n // with the quantity stepper left and the remove control right.\n return `<div class=\"ksc-line\" data-line-id=\"${id}\">\n ${image}\n <div class=\"ksc-line__body\">\n <div class=\"ksc-line__top\">\n <div class=\"ksc-line__main\">\n <span class=\"ksc-line__title\">${escapeHtml(l.title)}</span>\n ${meta}\n ${discountRows}\n </div>\n <div class=\"ksc-line__prices\">\n ${compare}\n <span class=\"ksc-line__price\">${escapeHtml(formatMoney(displayPrice))}</span>\n ${save}\n </div>\n </div>\n <div class=\"ksc-line__bottom\">\n <div class=\"ksc-qty\">\n <button type=\"button\" data-smart-cart-qty-dec data-qty=\"${l.quantity}\" aria-label=\"Decrease quantity\">−</button>\n <span class=\"ksc-qty__n\">${l.quantity}</span>\n <button type=\"button\" data-smart-cart-qty-inc data-qty=\"${l.quantity}\" aria-label=\"Increase quantity\">+</button>\n </div>\n <button type=\"button\" class=\"ksc-line__remove\" data-smart-cart-line-remove aria-label=\"Remove item\">${TRASH_SVG}</button>\n </div>\n </div>\n </div>`\n }\n\n #renderCart(state: SmartCartState): void {\n this.#lastState = state\n const items = this.#root.querySelector('[data-items]')\n const checkoutWrap = this.#root.querySelector('[data-checkout-wrap]')\n const continueWrap = this.#root.querySelector('[data-continue-wrap]')\n const countEl = this.#root.querySelector('[data-cart-count]')\n if (!items || !checkoutWrap) return\n // The add-on is represented by its toggle widget, never a cart line — hide its line from the\n // item list AND the header count (its price still counts toward the subtotal/total, like the\n // real cart line it is). Same filter pattern the upsell carousel uses for already-added items.\n const addOnVariantId = this.#addOnVariantId()\n const displayLines =\n addOnVariantId === null\n ? state.lines\n : state.lines.filter((l) => l.variantId !== addOnVariantId)\n if (countEl) {\n const count = displayLines.reduce((sum, l) => sum + l.quantity, 0)\n countEl.textContent = count > 0 ? `· ${count}` : ''\n }\n try {\n if (displayLines.length === 0) {\n items.innerHTML = `<div class=\"ksc-empty\">${BAG_SVG}<p data-empty>Your cart is empty</p></div>`\n checkoutWrap.innerHTML = ''\n if (continueWrap)\n continueWrap.innerHTML = `<button type=\"button\" class=\"ksc-continue\" data-smart-cart-close>Continue shopping</button>`\n this.#renderWidgets(state)\n this.#startTimerIfNeeded()\n this.#tickCountdown()\n return\n }\n items.innerHTML = displayLines.map((l) => this.#renderLine(l)).join('')\n\n // Model B (line shows what you pay, #1560): the Subtotal is the sum of the FINAL line prices\n // over ALL state.lines (including the hidden add-on line, so its price still counts), and the\n // Total equals that same sum — so the lines visibly sum to the Subtotal. The \"Discounts\" row\n // above it shows the REAL applied discounts (cart discountTotal, falling back to the named\n // cart-level allocations) so it matches the checkout's Discounts row exactly — NOT the\n // savings-vs-compare-at total (that stays per-line as struck prices + \"You save\" badges;\n // showing it here as \"Discounts\" made the drawer disagree with the checkout, e.g. −€184 in\n // the drawer vs −€54 at checkout for a compare-at-heavy BOGO cart). Informational only,\n // never subtracted from the Subtotal.\n const finalSubtotal: Money = {\n amount: state.lines.reduce((sum, l) => sum + l.linePrice.amount, 0),\n currency: state.subtotal.currency,\n }\n const discountsTotal =\n state.discountTotal?.amount ??\n state.discountAllocations?.reduce((sum, a) => sum + a.amount.amount, 0) ??\n 0\n const displayTotal: Money = finalSubtotal\n const rows: string[] = [\n ...(discountsTotal > 0\n ? [\n `<div class=\"ksc-summary__row ksc-summary__row--discount\"><span>Discounts</span><span>-${escapeHtml(formatMoney({ amount: discountsTotal, currency: state.subtotal.currency }))}</span></div>`,\n ]\n : []),\n `<div class=\"ksc-summary__row ksc-summary__row--total\"><span>Subtotal</span><span>${escapeHtml(formatMoney(finalSubtotal))}</span></div>`,\n ]\n const totalLabel = escapeHtml(formatMoney(displayTotal))\n checkoutWrap.innerHTML = `<div class=\"ksc-summary\">${rows.join('')}</div>\n <a class=\"checkout\" data-checkout href=\"${escapeHtml(state.checkoutUrl)}\">Checkout${totalLabel ? ` • ${totalLabel}` : ''}</a>`\n if (continueWrap)\n continueWrap.innerHTML = `<button type=\"button\" class=\"ksc-continue\" data-smart-cart-close>or continue shopping</button>`\n } catch (err) {\n console.error('[kotao-smart-cart] render failed', err)\n // Ensure the shell always renders a checkout link even when the cart body fails.\n checkoutWrap.innerHTML = `<a class=\"checkout\" data-checkout href=\"${escapeHtml(state.checkoutUrl)}\">Checkout</a>`\n }\n this.#renderWidgets(state)\n this.#startTimerIfNeeded()\n this.#tickCountdown()\n }\n}\n","import type { SmartCartMountConfig } from './config'\n\n/**\n * Default cart-trigger selectors — the controls that OPEN the drawer. Conservative + theme-agnostic:\n * explicit opt-in and cart links. Add-to-cart submits are deliberately NOT here: clicking \"Add to\n * cart\" must ADD the product and then open (see `readAddToCartIntent` + mount's handler), not merely\n * open the drawer on the current cart. Merchants can union extra open-triggers via config; a migrator\n * follow-up will emit data-kotao-cart markers so re-imported themes are zero-config.\n */\nexport const DEFAULT_CART_SELECTORS: readonly string[] = [\n '[data-kotao-cart]',\n 'a[href$=\"/cart\"]',\n 'a[href*=\"/cart?\"]',\n]\n\n/** The default selectors unioned with any merchant-supplied ones (deduped). */\nexport function resolveCartSelectors(config: Pick<SmartCartMountConfig, 'selectors'>): string[] {\n return [...new Set([...DEFAULT_CART_SELECTORS, ...(config.selectors ?? [])])]\n}\n\n/** True when the clicked target (or an ancestor) matches any cart-trigger (open-drawer) selector. */\nexport function isCartTrigger(target: EventTarget | null, selectors: string[]): boolean {\n if (!(target instanceof Element) || selectors.length === 0) return false\n const query = selectors.join(',')\n return target.closest(query) !== null\n}\n\n/** The Shopify-shaped product form (`<form action=\".../cart/add\">`) and its submit controls. */\nconst ADD_FORM_SELECTOR = 'form[action$=\"/cart/add\"]'\nconst ADD_SUBMIT_SELECTOR = '[type=\"submit\"], [name=\"add\"]'\n\n/** A resolved add-to-cart request read from a product form's fields. */\nexport interface AddToCartIntent {\n /** The selected variant id (the form's hidden `id` field). */\n readonly variantId: string\n /** Requested quantity (form `quantity`, default 1, never < 1). */\n readonly quantity: number\n /** Line-item properties from `properties[<key>]` fields, when any are present. */\n readonly properties?: Record<string, string>\n}\n\n/** The Shopify product form (`<form action=\".../cart/add\">`) enclosing an add-to-cart submit `target`,\n * or null. Lets the caller run the form's own constraint validation before taking over the add. */\nexport function findAddToCartForm(target: EventTarget | null): HTMLFormElement | null {\n if (!(target instanceof Element)) return null\n const form = target.closest(ADD_SUBMIT_SELECTOR)?.closest(ADD_FORM_SELECTOR)\n return form instanceof HTMLFormElement ? form : null\n}\n\n/**\n * When `target` is (or is within) an add-to-cart submit control of a Shopify product form, reads the\n * form's variant id + quantity + line-item properties. Returns null for anything else — cart links,\n * unrelated buttons, or an add form with no resolvable variant id (so the caller lets the theme's own\n * add run rather than silently swallowing the click). Pure DOM read; no side effects.\n */\nexport function readAddToCartIntent(target: EventTarget | null): AddToCartIntent | null {\n const form = findAddToCartForm(target)\n if (form === null) return null\n\n const data = new FormData(form)\n const rawId = data.get('id')\n const variantId = typeof rawId === 'string' ? rawId.trim() : ''\n if (variantId === '') return null\n\n const rawQty = Number(data.get('quantity'))\n const quantity = Number.isFinite(rawQty) && rawQty >= 1 ? Math.trunc(rawQty) : 1\n\n const properties: Record<string, string> = {}\n for (const [key, value] of data.entries()) {\n const match = /^properties\\[(.+)\\]$/.exec(key)\n if (match && typeof value === 'string' && value.trim() !== '') properties[match[1]!] = value\n }\n return Object.keys(properties).length > 0\n ? { variantId, quantity, properties }\n : { variantId, quantity }\n}\n","import type { CartAdapter } from './cart-adapter'\nimport type { SmartCartMountConfig } from './config'\nimport type { VariantLookup } from './variant-lookup'\nimport { SmartCartElement } from './element'\nimport {\n findAddToCartForm,\n isCartTrigger,\n readAddToCartIntent,\n resolveCartSelectors,\n} from './interception'\n\nexport interface SmartCartHandle {\n open(): Promise<void>\n close(): void\n destroy(): void\n}\n\nexport interface MountOptions {\n readonly config: SmartCartMountConfig\n readonly adapter: CartAdapter\n /** Variant display-data seam for the upsell carousel (productVariantsByIds). Optional — without it\n * the carousel never resolves variants and renders nothing. */\n readonly variantLookup?: VariantLookup\n /** Where to append the element (defaults to document.body). */\n readonly root?: ParentNode & Node\n}\n\n/** Registers the element, mounts one instance, and wires a delegated cart-trigger listener. */\nexport function mountSmartCart(opts: MountOptions): SmartCartHandle {\n SmartCartElement.register()\n const root = opts.root ?? document.body\n const el = document.createElement(SmartCartElement.tagName) as SmartCartElement\n el.setAdapter(opts.adapter)\n if (opts.variantLookup) el.setVariantLookup(opts.variantLookup)\n if (opts.config.branding) el.setBranding(opts.config.branding)\n el.setWidgets(opts.config.widgets)\n root.appendChild(el)\n\n const selectors = resolveCartSelectors(opts.config)\n const onClick = (event: Event): void => {\n // Add-to-cart submit: ADD the product via our adapter, then open the drawer on the result —\n // never a bare open (the bug this fixes: the add-to-cart button used to just open the drawer on\n // the unchanged cart, so nothing was ever added). Only when a variant id resolves do we take over\n // and preventDefault the theme's native /cart/add submit; otherwise the theme handles it.\n const addIntent = readAddToCartIntent(event.target)\n if (addIntent !== null) {\n event.preventDefault()\n event.stopPropagation()\n // Respect the product form's own constraint validation before adding: a required line-item\n // property — e.g. a personalization field rendered with `required` — must block the add and\n // surface the browser's native localized message, exactly as the theme's native submit would.\n // reportValidity() runs native constraints + shows that UI WITHOUT submitting, so (unlike\n // dispatching a synthetic submit) it can't trigger the theme's own /cart/add handler and cause\n // a double add. Gated-off (disabled) personalization controls are excluded natively.\n const form = findAddToCartForm(event.target)\n if (form !== null && typeof form.reportValidity === 'function' && !form.reportValidity())\n return\n void el.addLineAndOpen(addIntent.variantId, addIntent.quantity, addIntent.properties)\n return\n }\n if (!isCartTrigger(event.target, selectors)) return\n event.preventDefault()\n event.stopPropagation()\n void el.open()\n }\n document.addEventListener('click', onClick, true)\n\n return {\n open: () => el.open(),\n close: () => el.close(),\n destroy: () => {\n document.removeEventListener('click', onClick, true)\n el.remove()\n },\n }\n}\n","import {\n mountSmartCart,\n type SmartCartHandle,\n} from '@kotao/smart-cart'\n\nimport type { CartAdapter, SmartCartMountConfig } from './smart-cart-types'\n\n// Custom storefronts mount exactly one drawer; the module-level active handle lets openSmartCart()\n// reach it from an explicit cart trigger without prop-drilling a ref through the theme. This wiring is\n// deliberately React-free so it is unit-testable in Node (the SDK has no DOM test environment) — the\n// <CartDrawerOverlay> wrapper is the only React touchpoint.\nlet activeHandle: SmartCartHandle | null = null\n\n/** Mounts the drawer and records it as the active handle. Browser-only — call from a client effect. */\nexport function attachSmartCart(\n config: SmartCartMountConfig,\n adapter: CartAdapter,\n): SmartCartHandle {\n const handle = mountSmartCart({ config, adapter })\n activeHandle = handle\n return handle\n}\n\n/** Tears down a drawer, clearing the active handle only if it is still the active one. */\nexport function detachSmartCart(handle: SmartCartHandle): void {\n if (activeHandle === handle) activeHandle = null\n handle.destroy()\n}\n\n/** Opens the active Smart Cart drawer (no-op if none is mounted). Wire to explicit cart-button clicks. */\nexport function openSmartCart(): void {\n void activeHandle?.open()\n}\n","import { useEffect } from 'react'\n\nimport { attachSmartCart, detachSmartCart, openSmartCart } from './cart-drawer-mount'\nimport type { CartAdapter, SmartCartMountConfig } from './smart-cart-types'\n\nexport { openSmartCart }\n\nexport interface CartDrawerOverlayProps {\n /** Per-storefront Smart Cart config (selectors/branding). Pass shop.smartCart-derived config here. */\n readonly config: SmartCartMountConfig\n /** Cart data seam — typically createStorefrontApiCartAdapter(...). */\n readonly adapter: CartAdapter\n}\n\n/**\n * Mounts the framework-agnostic Smart Cart drawer for a custom (Hydrogen/SDK) theme. Client-only:\n * renders null on the server and mounts the Web Component after hydration. Memoize `config`/`adapter`\n * in the theme so the effect doesn't remount on every render.\n */\nexport function CartDrawerOverlay({ config, adapter }: CartDrawerOverlayProps): null {\n useEffect(() => {\n if (typeof window === 'undefined') return\n const handle = attachSmartCart(config, adapter)\n return () => detachSmartCart(handle)\n }, [config, adapter])\n return null\n}\n","import {\n Children,\n cloneElement,\n createContext,\n createElement,\n isValidElement,\n useContext,\n useEffect,\n useMemo,\n useSyncExternalStore,\n type CSSProperties,\n type ComponentType,\n type MouseEvent,\n type PointerEvent,\n type ReactElement,\n type ReactNode,\n} from 'react'\n\nimport {\n resolveHydrogenEditorStyles,\n type HydrogenEditorInstanceSnapshot,\n type HydrogenEditorPreviewRuntime,\n type HydrogenEditorReconciliationReason,\n} from '../editor/hydrogen'\n\nexport interface HydrogenEditorRegisteredComponentProps {\n readonly instanceId: string\n readonly props: Readonly<Record<string, unknown>>\n readonly styles: Readonly<Record<string, string | number>>\n readonly slots: Readonly<Record<string, readonly string[]>>\n readonly variantId?: string\n}\n\nexport type HydrogenEditorRegisteredComponent =\n ComponentType<HydrogenEditorRegisteredComponentProps>\n\ninterface HydrogenEditorReactContextValue {\n readonly preview: HydrogenEditorPreviewRuntime\n readonly components: Readonly<Record<string, HydrogenEditorRegisteredComponent>>\n readonly viewportWidth?: number\n}\n\nconst HydrogenEditorReactContext = createContext<HydrogenEditorReactContextValue | null>(null)\nconst HYDROGEN_CANVAS_INTENT_EVENT = 'kotao:hydrogen-canvas-intent'\nconst HYDROGEN_CANVAS_RESULT_EVENT = 'kotao:hydrogen-canvas-result'\nconst HYDROGEN_CANVAS_STATE_EVENT = 'kotao:hydrogen-canvas-state'\nconst HYDROGEN_CANVAS_STATE_REQUEST_EVENT = 'kotao:hydrogen-canvas-state-request'\n\nfunction useHydrogenEditorCanvasEvents(preview: HydrogenEditorPreviewRuntime): void {\n const snapshot = useSyncExternalStore(\n (listener) => preview.store.subscribe(listener),\n () => preview.store.getSnapshot(),\n () => preview.store.getSnapshot(),\n )\n\n useEffect(() => {\n if (typeof document === 'undefined' || typeof CustomEvent === 'undefined') return\n const dispatchState = (): void => {\n document.dispatchEvent(\n new CustomEvent(HYDROGEN_CANVAS_STATE_EVENT, {\n detail: {\n selectedInstanceId: snapshot.selectedInstanceId,\n hoveredInstanceId: snapshot.hoveredInstanceId,\n selectionStatus: snapshot.selectionStatus,\n revision: snapshot.revision,\n },\n }),\n )\n }\n dispatchState()\n document.addEventListener(HYDROGEN_CANVAS_STATE_REQUEST_EVENT, dispatchState)\n return () => document.removeEventListener(HYDROGEN_CANVAS_STATE_REQUEST_EVENT, dispatchState)\n }, [\n snapshot.hoveredInstanceId,\n snapshot.revision,\n snapshot.selectedInstanceId,\n snapshot.selectionStatus,\n ])\n\n useEffect(() => {\n if (typeof document === 'undefined' || typeof CustomEvent === 'undefined') return\n const onIntent = (event: Event): void => {\n if (!(event instanceof CustomEvent)) return\n const result = preview.dispatchCanvasIntent(event.detail)\n document.dispatchEvent(new CustomEvent(HYDROGEN_CANVAS_RESULT_EVENT, { detail: result }))\n }\n document.addEventListener(HYDROGEN_CANVAS_INTENT_EVENT, onIntent)\n return () => document.removeEventListener(HYDROGEN_CANVAS_INTENT_EVENT, onIntent)\n }, [preview])\n}\n\nexport interface HydrogenEditorProviderProps {\n readonly preview: HydrogenEditorPreviewRuntime\n readonly documentId: string\n readonly route?: string\n readonly reconciliationReason?: HydrogenEditorReconciliationReason\n /**\n * Changes when same-route loader data or an HMR generation reconciles. It is deliberately not\n * interpreted as authority and is never sent across the bridge.\n */\n readonly reconciliationKey?: string | number\n readonly components?: Readonly<Record<string, HydrogenEditorRegisteredComponent>>\n readonly viewportWidth?: number\n readonly children: ReactNode\n}\n\n/**\n * Activates the editor runtime for a route. Route/loader/HMR changes reconcile the existing\n * preview store instead of replacing it, so source-backed draft operations and selection remain\n * visible. The provider is editor-only and must not be mounted in ordinary public responses.\n */\nexport function HydrogenEditorProvider({\n children,\n components = {},\n documentId,\n preview,\n reconciliationKey,\n reconciliationReason = 'route',\n route,\n viewportWidth,\n}: HydrogenEditorProviderProps): ReactElement {\n useHydrogenEditorCanvasEvents(preview)\n const value = useMemo(\n () => ({\n preview,\n components,\n ...(viewportWidth !== undefined ? { viewportWidth } : {}),\n }),\n [components, preview, viewportWidth],\n )\n\n useEffect(() => {\n preview.reconcile(documentId, reconciliationReason, route)\n preview.ready()\n }, [documentId, preview, reconciliationKey, reconciliationReason, route])\n\n return (\n <HydrogenEditorReactContext.Provider value={value}>\n {children}\n </HydrogenEditorReactContext.Provider>\n )\n}\n\nfunction useHydrogenEditorContext(): HydrogenEditorReactContextValue {\n const context = useContext(HydrogenEditorReactContext)\n if (context === null) {\n throw new Error('Hydrogen editor hooks must be rendered inside HydrogenEditorProvider')\n }\n return context\n}\n\nfunction useInstanceSnapshot(instanceId: string): HydrogenEditorInstanceSnapshot | null {\n const { preview } = useHydrogenEditorContext()\n return useSyncExternalStore(\n (listener) => preview.store.subscribeInstance(instanceId, listener),\n () => preview.store.getInstanceSnapshot(instanceId),\n () => preview.store.getInstanceSnapshot(instanceId),\n )\n}\n\nexport interface HydrogenEditorReactInstance {\n readonly snapshot: HydrogenEditorInstanceSnapshot\n readonly props: Readonly<Record<string, unknown>>\n readonly styles: Readonly<Record<string, string | number>>\n}\n\n/**\n * Subscribes to exactly one component instance. A prop/style operation invalidates only this\n * subscription; structural operations additionally invalidate the affected parent/slot.\n */\nexport function useHydrogenEditorInstance(\n instanceId: string,\n sourceProps: Readonly<Record<string, unknown>> = {},\n): HydrogenEditorReactInstance | null {\n const { preview, viewportWidth } = useHydrogenEditorContext()\n const snapshot = useInstanceSnapshot(instanceId)\n return useMemo(() => {\n if (snapshot === null) return null\n return {\n snapshot,\n props: { ...sourceProps, ...snapshot.resolvedProps },\n styles: resolveHydrogenEditorStyles(preview.manifest, snapshot.instance, viewportWidth),\n }\n }, [preview.manifest, snapshot, sourceProps, viewportWidth])\n}\n\nexport function useHydrogenEditorSlot(parentInstanceId: string, slotId: string): readonly string[] {\n const snapshot = useInstanceSnapshot(parentInstanceId)\n return snapshot?.childInstanceIds[slotId] ?? []\n}\n\nexport interface HydrogenEditorBoundaryProps {\n readonly instanceId: string\n readonly children: ReactElement\n readonly applyPreviewProps?: boolean\n readonly viewportWidth?: number\n}\n\n/**\n * A reconciliation and interaction boundary for one extracted JSX instance. It uses a\n * `display: contents` marker only in editor mode, preserving the component's layout while clicks\n * and pointer transitions remain attributable to the stable instance ID.\n */\nexport function HydrogenEditorBoundary({\n applyPreviewProps = true,\n children,\n instanceId,\n viewportWidth,\n}: HydrogenEditorBoundaryProps): ReactElement | null {\n const { preview, viewportWidth: contextViewportWidth } = useHydrogenEditorContext()\n const snapshot = useInstanceSnapshot(instanceId)\n\n useEffect(() => preview.registerInstance(instanceId), [instanceId, preview])\n\n if (snapshot === null) return null\n const child = Children.only(children)\n if (!isValidElement<Record<string, unknown>>(child)) return null\n const effectiveViewportWidth = viewportWidth ?? contextViewportWidth\n const previewProps = applyPreviewProps ? snapshot.resolvedProps : {}\n const childStyle = isRecordStyle(child.props.style) ? child.props.style : {}\n const previewStyle = applyPreviewProps\n ? resolveHydrogenEditorStyles(preview.manifest, snapshot.instance, effectiveViewportWidth)\n : {}\n const renderedChild = cloneElement(child, {\n ...previewProps,\n ...(Object.keys(previewStyle).length > 0\n ? { style: { ...childStyle, ...previewStyle } as CSSProperties }\n : {}),\n })\n const blockingReason = snapshot.capabilityReasons.find((reason) => reason.severity === 'blocking')\n const inlineProps = snapshot.component.props\n .filter(\n (control) =>\n control.allowedBindings.includes('inline') &&\n (snapshot.instance.props[control.propName] ?? control.defaultBinding)?.kind !==\n 'external' &&\n (control.control === 'text' ||\n control.control === 'textarea' ||\n control.control === 'richtext'),\n )\n .map((control) => ({ propName: control.propName, label: control.label }))\n const layoutControls = snapshot.component.styles.layout\n .filter((control) => ['gap', 'height', 'margin', 'padding', 'width'].includes(control.control))\n .map((control) => ({\n controlId: control.controlId,\n control: control.control,\n label: control.label,\n allowedValues: control.allowedValues,\n }))\n const onPointerEnter = (_event: PointerEvent<HTMLSpanElement>): void => {\n preview.hoverInstance(instanceId)\n }\n const onPointerLeave = (_event: PointerEvent<HTMLSpanElement>): void => {\n preview.hoverInstance(null)\n }\n const onClick = (event: MouseEvent<HTMLSpanElement>): void => {\n event.preventDefault()\n event.stopPropagation()\n preview.selectInstance(instanceId)\n }\n\n return (\n <span\n data-kotao-hydrogen-capability={snapshot.editable ? 'editable' : 'read-only'}\n data-kotao-hydrogen-capabilities={snapshot.component.capabilities.join(' ')}\n data-kotao-hydrogen-component={snapshot.component.componentId}\n data-kotao-hydrogen-instance={instanceId}\n data-kotao-hydrogen-inline-props={JSON.stringify(inlineProps)}\n data-kotao-hydrogen-label={snapshot.component.name}\n data-kotao-hydrogen-layout-controls={JSON.stringify(layoutControls)}\n data-kotao-hydrogen-reason={blockingReason?.code}\n onClick={onClick}\n onPointerEnter={onPointerEnter}\n onPointerLeave={onPointerLeave}\n style={{ display: 'contents' }}\n >\n {renderedChild}\n </span>\n )\n}\n\nfunction isRecordStyle(value: unknown): value is Readonly<Record<string, string | number>> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\ninterface HydrogenEditorRegisteredInstanceProps {\n readonly instanceId: string\n}\n\nfunction HydrogenEditorRegisteredInstance({\n instanceId,\n}: HydrogenEditorRegisteredInstanceProps): ReactElement | null {\n const { components } = useHydrogenEditorContext()\n const instance = useHydrogenEditorInstance(instanceId)\n if (instance === null) return null\n const Component = components[instance.snapshot.component.componentId]\n if (Component === undefined) {\n return (\n <span\n data-kotao-hydrogen-instance={instanceId}\n data-kotao-hydrogen-reason=\"COMPONENT_RENDERER_UNAVAILABLE\"\n style={{ display: 'contents' }}\n />\n )\n }\n return (\n <HydrogenEditorBoundary applyPreviewProps={false} instanceId={instanceId}>\n {createElement(Component, {\n instanceId,\n props: instance.props,\n styles: instance.styles,\n slots: instance.snapshot.childInstanceIds,\n ...(instance.snapshot.instance.variantId !== undefined\n ? { variantId: instance.snapshot.instance.variantId }\n : {}),\n })}\n </HydrogenEditorBoundary>\n )\n}\n\nexport interface HydrogenEditorSlotProps {\n readonly parentInstanceId: string\n readonly slotId: string\n /**\n * Source-rendered children keyed by stable instance ID. Newly inserted instances fall through to\n * the registered component library without replacing or regenerating existing route source.\n */\n readonly existingChildren?: Readonly<Record<string, ReactElement>>\n readonly empty?: ReactNode\n}\n\nexport function HydrogenEditorSlot({\n empty = null,\n existingChildren = {},\n parentInstanceId,\n slotId,\n}: HydrogenEditorSlotProps): ReactElement {\n const parent = useInstanceSnapshot(parentInstanceId)\n const instanceIds = useHydrogenEditorSlot(parentInstanceId, slotId)\n const slot = parent?.component.slots.find((candidate) => candidate.slotId === slotId)\n return (\n <span\n data-kotao-hydrogen-slot={slotId}\n data-kotao-hydrogen-slot-accepts={\n slot?.accepts.mode === 'any' ? '*' : (slot?.accepts.componentIds.join(' ') ?? '')\n }\n data-kotao-hydrogen-slot-count={instanceIds.length}\n data-kotao-hydrogen-slot-insertion={slot?.insertion ?? 'fixed'}\n data-kotao-hydrogen-slot-label={slot?.label ?? slotId}\n data-kotao-hydrogen-slot-max={slot?.maxInstances ?? 0}\n data-kotao-hydrogen-slot-parent={parentInstanceId}\n style={{ display: 'contents' }}\n >\n {instanceIds.length === 0\n ? empty\n : instanceIds.map((instanceId) => {\n const existing = existingChildren[instanceId]\n return existing === undefined ? (\n <HydrogenEditorRegisteredInstance instanceId={instanceId} key={instanceId} />\n ) : (\n <HydrogenEditorBoundary instanceId={instanceId} key={instanceId}>\n {existing}\n </HydrogenEditorBoundary>\n )\n })}\n </span>\n )\n}\n"]}
1
+ {"version":3,"sources":["../src/react/cart.tsx","../src/react/presence-tracker.ts","../src/analytics/anonymous-context.ts","../src/react/analytics.tsx","../src/react/image.tsx","../src/react/media-file.tsx","../src/react/money.tsx","../src/react/pagination.tsx","../src/react/seo.tsx","../src/react/shop-pay-button.tsx","../src/react/theme-settings.tsx","../../smart-cart/src/format.ts","../../smart-cart/src/widgets/add-on.ts","../../smart-cart/src/widgets/reservation-timer.ts","../../smart-cart/src/widgets/upsell-carousel.ts","../../smart-cart/src/widgets/discount-code.ts","../../smart-cart/src/widgets/free-shipping-bar.ts","../../smart-cart/src/widgets/sticky-bubble.ts","../../smart-cart/src/widgets/payment-icons.ts","../../smart-cart/src/widgets/trust-badges.ts","../../smart-cart/src/widgets/index.ts","../../smart-cart/src/element.ts","../../smart-cart/src/interception.ts","../../smart-cart/src/mount.ts","../src/react/cart-drawer-mount.ts","../src/react/cart-drawer-overlay.tsx","../src/react/hydrogen-editor.tsx"],"names":["CartForm","jsx","Fragment","createContext","useContext","formatMoney","css","readMessage","MS_PER_MINUTE","STYLES","struck","useEffect","useSyncExternalStore","useMemo"],"mappings":"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","file":"react.js","sourcesContent":["import React, { type ReactElement, type ReactNode } from 'react'\nimport { useFetcher, type FetcherWithComponents } from 'react-router'\n\nimport { CART_FORM_ACTIONS, type CartFormAction } from '../cart/actions'\nimport { getCartFormInput } from '../cart/CartForm'\nimport type { CartLineInput } from '../cart/types'\nimport type { Cart as StorefrontCart } from '../storefront-api-types'\n\ntype CartFormInputValue = unknown\n\nexport type CartFormFetcher = FetcherWithComponents<unknown>\n\nexport interface CartFormProps {\n readonly action: CartFormAction\n readonly inputs?: Readonly<Record<string, CartFormInputValue>>\n readonly route?: string\n readonly children?: ReactNode | ((fetcher: CartFormFetcher) => ReactNode)\n}\n\nexport type OptimisticCartLineInput = CartLineInput\nexport type OptimisticInputData = Readonly<Record<string, unknown>>\nexport type CartReturn = StorefrontCart\nexport interface CartQueryDataReturn {\n readonly cart: CartReturn\n readonly errors?: readonly unknown[]\n readonly userErrors?: readonly unknown[]\n}\n\nfunction serializeInputValue(value: CartFormInputValue): string {\n if (value !== null && typeof value === 'object') return JSON.stringify(value)\n return String(value)\n}\n\nexport const CartForm = Object.assign(\n function CartForm({ action, inputs = {}, route, children }: CartFormProps): ReactElement {\n const fetcher = useFetcher<unknown>()\n const renderedChildren = typeof children === 'function' ? children(fetcher) : children\n const hiddenInputs = Object.entries(inputs).flatMap(([name, value]) =>\n value == null\n ? []\n : [<input key={name} type=\"hidden\" name={name} value={serializeInputValue(value)} />],\n )\n const routeProps = route === undefined ? {} : { action: route }\n return (\n <fetcher.Form method=\"post\" {...routeProps}>\n <input type=\"hidden\" name=\"cartAction\" value={action} />\n {hiddenInputs}\n {renderedChildren}\n </fetcher.Form>\n )\n },\n { ACTIONS: CART_FORM_ACTIONS, getFormInput: getCartFormInput },\n)\n\nexport interface OptimisticInputProps {\n readonly id: string\n readonly data: OptimisticInputData\n}\n\nexport function OptimisticInput({ id, data }: OptimisticInputProps): ReactElement {\n return <input type=\"hidden\" name={`optimisticData:${id}`} value={JSON.stringify(data)} />\n}\n\nexport function useOptimisticData<T>(_id: string | null | undefined): T | undefined {\n return undefined\n}\n","import type { AnalyticsContext } from '../analytics/events'\nimport type { PixelSend } from '../analytics/pixel-transport'\n\ntype Stage = 'browsing' | 'product' | 'cart' | 'checkout'\n\n/** A per-document id distinguishes tabs; the server supplies the pseudonymous visitor identity.\n * No heartbeat goes through the marketing event bus or historical page-view transport. */\nexport function startPresenceTracking(options: {\n endpoint: string\n send: PixelSend\n consent: () => boolean\n context: () => AnalyticsContext\n}): { stop(): void; activity(stage?: Stage): void } {\n let tabId: string | undefined\n let sequence = 0\n let lastActivity = Date.now()\n let lastUrl = ''\n let stage: Stage = 'browsing'\n let interval: ReturnType<typeof setInterval> | undefined\n let stopped = false\n\n const activity = (nextStage?: Stage): void => {\n if (document.visibilityState !== 'visible') return\n lastActivity = Date.now()\n if (nextStage) stage = nextStage\n }\n const onInteraction = (): void => activity()\n const send = (visible: boolean): void => {\n if (!options.consent()) return\n // Browsers without secure random ids keep normal analytics, but cannot emit presence.\n if (!tabId) {\n if (typeof globalThis.crypto?.randomUUID !== 'function') return\n tabId = globalThis.crypto.randomUUID()\n }\n const context = options.context()\n if (context.url !== lastUrl) {\n lastUrl = context.url ?? ''\n const path = new URL(lastUrl, window.location.href).pathname\n stage = /^\\/checkout(?:\\/|$)/.test(path)\n ? 'checkout'\n : /^\\/cart(?:\\/|$)/.test(path)\n ? 'cart'\n : /\\/products\\//.test(path)\n ? 'product'\n : 'browsing'\n lastActivity = Date.now()\n }\n options.send(\n options.endpoint,\n JSON.stringify({\n events: [\n {\n event: 'visitor_presence',\n context,\n consent: true,\n timestamp: new Date().toISOString(),\n payload: {\n tabId,\n sequence: ++sequence,\n visible,\n stage,\n idleSeconds: Math.min(\n 86400,\n Math.max(0, Math.floor((Date.now() - lastActivity) / 1000)),\n ),\n },\n },\n ],\n }),\n )\n }\n const visibility = (): void => {\n if (interval !== undefined) clearInterval(interval)\n interval = undefined\n const visible = document.visibilityState === 'visible'\n send(visible)\n if (visible) interval = setInterval(() => send(true), 20_000)\n }\n const hide = (): void => {\n if (interval !== undefined) clearInterval(interval)\n interval = undefined\n send(false)\n }\n const resume = (event: PageTransitionEvent): void => {\n if (event.persisted) visibility()\n }\n const events = ['pointerdown', 'keydown', 'scroll'] as const\n for (const event of events) document.addEventListener(event, onInteraction, { passive: true })\n document.addEventListener('visibilitychange', visibility)\n window.addEventListener('pagehide', hide)\n window.addEventListener('pageshow', resume)\n visibility()\n return {\n activity,\n stop() {\n if (stopped) return\n stopped = true\n hide()\n for (const event of events) document.removeEventListener(event, onInteraction)\n document.removeEventListener('visibilitychange', visibility)\n window.removeEventListener('pagehide', hide)\n window.removeEventListener('pageshow', resume)\n },\n }\n}\n","import type { AnalyticsContext } from './events'\n\nexport type AnonymousAnalyticsContext = Pick<AnalyticsContext, 'url'>\n\n/**\n * Keep the one dimension required by an anonymous page view without exposing attribution data.\n * The candidate must resolve to the current HTTP(S) origin; query, fragment, and credentials are\n * discarded, while checkout session paths are collapsed so their identifiers never reach analytics.\n */\nexport function anonymousPageContext(\n candidateUrl: string | undefined,\n currentUrl: string | undefined,\n): AnonymousAnalyticsContext {\n if (!candidateUrl || !currentUrl) return {}\n\n try {\n const current = new URL(currentUrl)\n const candidate = new URL(candidateUrl, current)\n if (!['http:', 'https:'].includes(current.protocol)) return {}\n if (!['http:', 'https:'].includes(candidate.protocol)) return {}\n if (candidate.origin !== current.origin) return {}\n\n const pathname = /^\\/checkout(?:\\/|$)/.test(candidate.pathname)\n ? '/checkout'\n : candidate.pathname || '/'\n return { url: `${candidate.origin}${pathname}` }\n } catch {\n return {}\n }\n}\n","import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactElement,\n type ReactNode,\n} from 'react'\nimport React from 'react'\n\nimport { startPresenceTracking } from './presence-tracker'\nimport { anonymousPageContext } from '../analytics/anonymous-context'\nimport { collectAnalyticsAttribution } from '../analytics/attribution'\nimport { createAnalyticsBus, type AnalyticsBus } from '../analytics/analytics-bus'\nimport type { ShopAnalytics } from '../analytics/shop'\nimport {\n buildConsentCookie,\n CONSENT_COOKIE,\n GRANTED_CONSENT,\n mergeConsent,\n readConsentCookie,\n type ConsentState,\n} from '../analytics/consent'\nimport type { AnalyticsEmitter } from '../analytics/emitter'\nimport type { AnalyticsContext, AnalyticsEventMap, AnalyticsEventName } from '../analytics/events'\nimport { createPixelTransport, type PixelSend } from '../analytics/pixel-transport'\n\n/** Browser pixel send: sendBeacon (survives unload, non-blocking) with a keepalive fetch fallback. */\nconst beaconSend: PixelSend = (endpoint, body) => {\n if (typeof navigator !== 'undefined' && typeof navigator.sendBeacon === 'function') {\n try {\n if (navigator.sendBeacon(endpoint, new Blob([body], { type: 'application/json' }))) return\n } catch { /* Fall through when sendBeacon is unavailable or its quota is exhausted. */ }\n }\n if (typeof fetch === 'function') {\n void fetch(endpoint, {\n method: 'POST',\n body,\n keepalive: true,\n headers: { 'content-type': 'application/json' },\n }).catch(() => {})\n }\n}\n\ninterface AnalyticsContextValue {\n readonly subscribe: AnalyticsEmitter['subscribe']\n readonly publish: AnalyticsBus['publish']\n readonly consent: ConsentState\n readonly setConsent: (patch: Partial<ConsentState>) => void\n readonly decided: boolean\n readonly mounted: boolean\n}\n\nconst AnalyticsReactContext = createContext<AnalyticsContextValue | null>(null)\n\nexport interface AnalyticsProviderProps {\n readonly cart?: unknown\n readonly consent?: {\n readonly checkoutDomain?: string\n readonly storefrontAccessToken?: string\n readonly withPrivacyBanner?: boolean\n }\n readonly shopId?: string\n readonly shop?: ShopAnalytics\n readonly geo?: AnalyticsContext['geo']\n /** Current page URL; changing it auto-emits `page_viewed` (themes pass it from RR8 navigation). */\n readonly url?: string\n /** Same-origin pixel endpoint (default '/api/storefront/pixel'). */\n readonly pixelEndpoint?: string\n readonly children: ReactNode\n}\n\n/**\n * `<AnalyticsProvider>` (Hydrogen-shaped) — wires the consent-gated analytics bus and exposes it via\n * `useAnalytics`. The visible consent UI is disabled for now; analytics starts granted while the public\n * API remains in place for the replacement flow.\n */\nexport function AnalyticsProvider(props: AnalyticsProviderProps): ReactElement {\n const [consent, setConsentState] = useState<ConsentState>(GRANTED_CONSENT)\n const [decided, setDecided] = useState(true)\n const [mounted, setMounted] = useState(false)\n const consentRef = useRef<ConsentState>(consent)\n consentRef.current = consent\n const pageUrlRef = useRef(props.url)\n pageUrlRef.current = props.url\n // Build without explicit `undefined` (exactOptionalPropertyTypes).\n const contextRef = useRef<AnalyticsContext>({})\n const shopId = props.shopId ?? props.shop?.shopId ?? props.shop?.storefrontId\n const browserUrl =\n typeof window === 'undefined'\n ? undefined\n : (() => {\n try {\n return new URL(props.url ?? window.location.href, window.location.href).href\n } catch {\n return props.url\n }\n })()\n contextRef.current = {\n ...(shopId !== undefined ? { shopId } : {}),\n ...(props.geo !== undefined ? { geo: props.geo } : {}),\n ...(browserUrl !== undefined\n ? { url: browserUrl }\n : props.url !== undefined\n ? { url: props.url }\n : {}),\n }\n\n // The pixel endpoint is static config — captured once so the bus is genuinely stable.\n const endpointRef = useRef(props.pixelEndpoint)\n\n // The bus is created ONCE (empty deps) so navigation/prop changes never drop theme subscribers or the\n // in-flight queue; the ambient context + consent are read through refs so each publish sees the latest.\n const bus = useMemo(\n () =>\n createAnalyticsBus({\n transport: createPixelTransport({\n send: beaconSend,\n ...(endpointRef.current !== undefined ? { endpoint: endpointRef.current } : {}),\n }),\n getConsent: () => consentRef.current,\n getAnonymousContext: () => {\n if (typeof window === 'undefined') return {}\n return anonymousPageContext(\n pageUrlRef.current ?? window.location.href,\n window.location.href,\n )\n },\n // createAnalyticsBus calls this only after an explicit analytics grant. Keep every browser\n // attribution/device read inside this lazy seam so denied visits never evaluate it.\n getContext: () => ({\n ...collectAnalyticsAttribution(\n typeof window === 'undefined' || typeof document === 'undefined'\n ? null\n : {\n referrer: document.referrer,\n search: window.location.search,\n ...(typeof window.matchMedia === 'function'\n ? { matchMedia: (query: string) => window.matchMedia(query) }\n : {}),\n },\n ),\n ...contextRef.current,\n }),\n }),\n [],\n )\n\n // Legacy cookies are ignored while the UI is removed; stale rejections must not suppress scripts.\n useEffect(() => {\n setMounted(true)\n const cookie = typeof document === 'undefined' ? '' : document.cookie\n if (cookie.includes(`${CONSENT_COOKIE}=`)) {\n const existing = readConsentCookie(cookie)\n consentRef.current = existing\n setConsentState(existing)\n setDecided(true)\n }\n }, [])\n\n // Call ONLY from a direct user gesture (a banner action): it persists the choice + dismisses the\n // banner. Never auto-grant on the visitor's behalf — that would defeat the opt-in model.\n const setConsent = useCallback((patch: Partial<ConsentState>) => {\n setConsentState((prev) => {\n const next = mergeConsent(prev, patch)\n consentRef.current = next\n if (typeof document !== 'undefined') document.cookie = buildConsentCookie(next)\n return next\n })\n setDecided(true)\n }, [])\n\n // Auto page_viewed on mount + whenever the URL changes.\n useEffect(() => {\n bus.publish('page_viewed', {})\n }, [bus, props.url])\n\n useEffect(() => {\n const tracker = startPresenceTracking({\n endpoint: endpointRef.current ?? '/api/storefront/pixel',\n send: beaconSend,\n consent: () => consentRef.current.analytics,\n context: () => ({\n ...collectAnalyticsAttribution({\n referrer: document.referrer,\n search: window.location.search,\n ...(typeof window.matchMedia === 'function' ? { matchMedia: (query: string) => window.matchMedia(query) } : {}),\n }),\n ...contextRef.current,\n }),\n })\n const unsubscribers = [\n bus.emitter.subscribe('product_added_to_cart', () => tracker.activity('cart')),\n bus.emitter.subscribe('cart_viewed', () => tracker.activity('cart')),\n bus.emitter.subscribe('product_viewed', () => tracker.activity('product')),\n ]\n return () => {\n tracker.stop()\n unsubscribers.forEach(unsubscribe => unsubscribe())\n bus.flush()\n }\n }, [bus])\n\n // Flush the pixel batch when the page is hidden (best-effort, never blocks).\n useEffect(() => {\n if (typeof document === 'undefined') return\n const onHide = (): void => bus.flush()\n document.addEventListener('visibilitychange', onHide)\n return () => document.removeEventListener('visibilitychange', onHide)\n }, [bus])\n\n const value = useMemo<AnalyticsContextValue>(\n () => ({\n subscribe: bus.emitter.subscribe,\n publish: bus.publish,\n consent,\n setConsent,\n decided,\n mounted,\n }),\n [bus, consent, setConsent, decided, mounted],\n )\n\n return (\n <AnalyticsReactContext.Provider value={value}>{props.children}</AnalyticsReactContext.Provider>\n )\n}\n\nexport function useAnalytics(): AnalyticsContextValue {\n const value = useContext(AnalyticsReactContext)\n if (value === null) throw new Error('useAnalytics must be used within an <AnalyticsProvider>')\n return value\n}\n\nexport interface ConsentBannerRenderProps {\n readonly acceptAll: () => void\n readonly rejectAll: () => void\n readonly setConsent: (patch: Partial<ConsentState>) => void\n}\n\nexport interface ConsentBannerProps {\n /** Render-prop for full theme control. Omit for a minimal, unstyled accessible fallback. */\n readonly children?: (api: ConsentBannerRenderProps) => ReactNode\n}\n\n/**\n * Legacy no-op. Kept so existing themes do not fail imports while the consent UI is removed.\n */\nexport function ConsentBanner({ children }: ConsentBannerProps): ReactElement | null {\n void children\n return null\n}\n\nfunction usePublishAnalytics<E extends AnalyticsEventName>(\n event: E,\n payload: AnalyticsEventMap[E] | null,\n): void {\n const analytics = useAnalytics()\n useEffect(() => {\n if (payload !== null) analytics.publish(event, payload)\n }, [analytics, event, payload])\n}\n\nexport interface AnalyticsCartViewProps {\n readonly data?: {\n readonly cart?: { readonly id?: string | null } | null\n readonly id?: string | null\n }\n}\n\nexport function AnalyticsCartView({ data }: AnalyticsCartViewProps): null {\n const cartId = data?.cart?.id ?? data?.id ?? undefined\n const payload = useMemo<AnalyticsEventMap['cart_viewed']>(\n () => (cartId != null ? { cartId } : {}),\n [cartId],\n )\n usePublishAnalytics('cart_viewed', payload)\n return null\n}\n\nexport interface AnalyticsProductViewProps {\n readonly data?: {\n readonly products?: readonly {\n readonly handle?: string | null\n readonly id?: string | null\n readonly price?: number | string | null\n readonly productId?: string | null\n readonly quantity?: number | null\n readonly sku?: string | null\n readonly currency?: string | null\n readonly title?: string | null\n readonly variantId?: string | null\n readonly variantTitle?: string | null\n readonly vendor?: string | null\n }[]\n }\n}\n\nexport function AnalyticsProductView({ data }: AnalyticsProductViewProps): null {\n const product = data?.products?.[0]\n const productId = product?.productId ?? product?.id ?? null\n const handle = product?.handle ?? undefined\n const price = product?.price == null ? undefined : Number(product.price)\n const payload = useMemo<AnalyticsEventMap['product_viewed'] | null>(() => {\n if (productId == null) return null\n return {\n productId,\n ...(handle != null ? { handle } : {}),\n ...(product?.variantId != null ? { variantId: product.variantId } : {}),\n ...(product?.title != null ? { title: product.title } : {}),\n ...(product?.variantTitle != null ? { variantTitle: product.variantTitle } : {}),\n ...(product?.vendor != null ? { vendor: product.vendor } : {}),\n ...(product?.sku != null ? { sku: product.sku } : {}),\n ...(price !== undefined && Number.isFinite(price) ? { price } : {}),\n ...(product?.currency != null ? { currency: product.currency } : {}),\n ...(product?.quantity != null ? { quantity: product.quantity } : {}),\n }\n }, [handle, price, product, productId])\n usePublishAnalytics('product_viewed', payload)\n return null\n}\n\nexport interface AnalyticsCollectionViewProps {\n readonly data?: {\n readonly collection?: {\n readonly handle?: string | null\n readonly id?: string | null\n } | null\n }\n}\n\nexport function AnalyticsCollectionView({ data }: AnalyticsCollectionViewProps): null {\n const collection = data?.collection\n const collectionId = collection?.id ?? null\n const handle = collection?.handle ?? undefined\n const payload = useMemo<AnalyticsEventMap['collection_viewed'] | null>(() => {\n if (collectionId == null) return null\n return {\n collectionId,\n ...(handle != null ? { handle } : {}),\n }\n }, [collectionId, handle])\n usePublishAnalytics('collection_viewed', payload)\n return null\n}\n\nfunction resultCountFromSearchResults(searchResults: unknown): number | undefined {\n if (Array.isArray(searchResults)) return searchResults.length\n if (searchResults != null && typeof searchResults === 'object') {\n const nodes = (searchResults as { readonly nodes?: unknown }).nodes\n if (Array.isArray(nodes)) return nodes.length\n }\n return undefined\n}\n\nexport interface AnalyticsSearchViewProps {\n readonly data?: {\n readonly searchResults?: unknown\n readonly searchTerm?: string | null\n }\n}\n\nexport function AnalyticsSearchView({ data }: AnalyticsSearchViewProps): null {\n const query = data?.searchTerm ?? ''\n const resultCount = resultCountFromSearchResults(data?.searchResults)\n const payload = useMemo<AnalyticsEventMap['search_viewed']>(\n () => ({\n query,\n ...(resultCount != null ? { resultCount } : {}),\n }),\n [query, resultCount],\n )\n usePublishAnalytics('search_viewed', payload)\n return null\n}\n\nexport const Analytics = Object.freeze({\n Provider: AnalyticsProvider,\n CartView: AnalyticsCartView,\n CollectionView: AnalyticsCollectionView,\n ProductView: AnalyticsProductView,\n SearchView: AnalyticsSearchView,\n})\n","import React, { type CSSProperties, type ImgHTMLAttributes, type ReactElement } from 'react'\n\nimport { buildImageAttrs, type ImageAttrsOptions, type ImageData } from '../image/image-attrs'\n\n/** Passthrough `<img>` attributes — the SDK owns the computed ones (src/srcSet/sizes/width/height/loading). */\ntype PassthroughImgProps = Omit<\n ImgHTMLAttributes<HTMLImageElement>,\n 'src' | 'srcSet' | 'sizes' | 'width' | 'height' | 'loading'\n>\n\ntype HydrogenImageData = Omit<ImageData, 'url'> & {\n readonly url?: string | undefined\n}\n\nexport interface ImageProps extends Omit<ImageAttrsOptions, 'data'>, PassthroughImgProps {\n readonly data?: HydrogenImageData | null | undefined\n}\n\n/**\n * Hydrogen-shaped `<Image>` (ADR-0003 §SDK). A thin wrapper: it computes the responsive `<img>`\n * attributes via `buildImageAttrs` (src/srcSet over `/kotao-cdn/*`, CLS-safe via aspect-ratio) and\n * spreads any extra `<img>` props through. All logic lives in `buildImageAttrs` (unit-tested).\n */\nexport function Image(props: ImageProps): ReactElement {\n const {\n data,\n src,\n aspectRatio,\n crop,\n sizes,\n width,\n height,\n loading,\n srcSetWidths,\n format,\n quality,\n alt,\n style,\n ...passthrough\n } = props\n const resolvedData: ImageData = {\n url: src ?? data?.url ?? '',\n altText: alt ?? data?.altText ?? '',\n ...(data?.width != null ? { width: data.width } : {}),\n ...(data?.height != null ? { height: data.height } : {}),\n }\n const { style: aspectStyle, ...imgAttrs } = buildImageAttrs({\n data: resolvedData,\n src,\n aspectRatio,\n crop,\n sizes,\n width,\n height,\n loading,\n srcSetWidths,\n format,\n quality,\n })\n const mergedStyle: CSSProperties = { ...aspectStyle, ...style }\n return <img {...passthrough} {...imgAttrs} style={mergedStyle} />\n}\n","import React, { type ReactElement, type VideoHTMLAttributes } from 'react'\n\nimport type { ImageCrop, ImageData } from '../image/image-attrs'\nimport type { ImageFormat } from '../image/image-url'\nimport { Image } from './image'\n\ninterface ShopifyMediaSource {\n readonly url: string\n readonly mimeType?: string | null\n}\n\ninterface ShopifyMediaData {\n readonly alt?: string | null\n readonly image?: ImageData | null\n readonly mediaContentType?: string | null\n readonly previewImage?: ImageData | null\n readonly sources?: readonly ShopifyMediaSource[] | null\n readonly url?: string | null\n}\n\nexport interface MediaFileImageOptions {\n readonly alt?: string\n readonly aspectRatio?: string\n readonly crop?: ImageCrop\n readonly format?: ImageFormat\n readonly height?: number\n readonly loading?: 'eager' | 'lazy'\n readonly quality?: number\n readonly sizes?: string\n readonly srcSetWidths?: number[]\n readonly width?: number\n}\n\nexport interface MediaFileVideoOptions extends Omit<\n VideoHTMLAttributes<HTMLVideoElement>,\n 'children' | 'className'\n> {\n readonly previewImageOptions?: {\n readonly src?: string\n }\n}\n\nexport interface MediaFileProps {\n readonly className?: string\n readonly data: ShopifyMediaData\n readonly mediaOptions?: {\n readonly image?: MediaFileImageOptions\n readonly video?: MediaFileVideoOptions\n }\n}\n\nfunction imageDataFromMedia(data: ShopifyMediaData, alt?: string): ImageData | null {\n const source = data.image ?? data.previewImage\n if (source != null) {\n return {\n url: source.url,\n altText: alt ?? source.altText ?? data.alt ?? '',\n ...(source.width != null ? { width: source.width } : {}),\n ...(source.height != null ? { height: source.height } : {}),\n }\n }\n if (data.url == null) return null\n return { url: data.url, altText: alt ?? data.alt ?? '' }\n}\n\nexport function MediaFile({ className, data, mediaOptions }: MediaFileProps): ReactElement | null {\n const mediaType = data.mediaContentType?.toUpperCase()\n if (mediaType === 'VIDEO' && data.sources?.length) {\n const { previewImageOptions, ...videoOptions } = mediaOptions?.video ?? {}\n const poster = videoOptions.poster ?? previewImageOptions?.src ?? data.previewImage?.url\n return (\n <video\n {...videoOptions}\n className={className}\n {...(poster != null && poster.length > 0 ? { poster } : {})}\n >\n {data.sources.map((source) => (\n <source key={source.url} src={source.url} type={source.mimeType ?? undefined} />\n ))}\n </video>\n )\n }\n\n const imageOptions = mediaOptions?.image\n const imageData = imageDataFromMedia(data, imageOptions?.alt)\n if (imageData === null) return null\n\n return (\n <Image\n className={className}\n data={imageData}\n {...(imageOptions?.aspectRatio != null ? { aspectRatio: imageOptions.aspectRatio } : {})}\n {...(imageOptions?.crop != null ? { crop: imageOptions.crop } : {})}\n {...(imageOptions?.format != null ? { format: imageOptions.format } : {})}\n {...(imageOptions?.height != null ? { height: imageOptions.height } : {})}\n {...(imageOptions?.loading != null ? { loading: imageOptions.loading } : {})}\n {...(imageOptions?.quality != null ? { quality: imageOptions.quality } : {})}\n {...(imageOptions?.sizes != null ? { sizes: imageOptions.sizes } : {})}\n {...(imageOptions?.srcSetWidths != null ? { srcSetWidths: imageOptions.srcSetWidths } : {})}\n {...(imageOptions?.width != null ? { width: imageOptions.width } : {})}\n />\n )\n}\n","import React, { type ElementType, type ReactElement } from 'react'\n\nexport interface MoneyData {\n readonly amount: string | number\n readonly currencyCode: string\n}\n\nexport interface UseMoneyValue {\n readonly amount: string\n readonly currencyCode: string\n readonly currencyName: string\n readonly currencyNarrowSymbol: string\n readonly currencySymbol: string\n readonly localizedString: string\n readonly withoutTrailingZeros: string\n readonly withoutTrailingZerosAndCurrency: string\n}\n\nexport interface MoneyProps {\n readonly data?: MoneyData | null\n readonly as?: ElementType\n readonly withoutTrailingZeros?: boolean\n readonly withoutCurrency?: boolean\n readonly [prop: string]: unknown\n}\n\nfunction fractionDigits(amount: string | number): number {\n const [, decimals = ''] = String(amount).split('.')\n return decimals.replace(/0+$/u, '').length\n}\n\nfunction currencyPart(currencyCode: string, currencyDisplay: 'symbol' | 'narrowSymbol'): string {\n return (\n new Intl.NumberFormat('en-US', {\n currency: currencyCode,\n currencyDisplay,\n style: 'currency',\n })\n .formatToParts(0)\n .find((part) => part.type === 'currency')?.value ?? currencyCode\n )\n}\n\nfunction formatMoney(\n amount: number,\n currencyCode: string,\n options: { currencyDisplay?: 'symbol' | 'narrowSymbol'; trimZeros?: boolean } = {},\n): string {\n const digits = options.trimZeros === true ? 0 : 2\n return new Intl.NumberFormat('en-US', {\n currency: currencyCode,\n currencyDisplay: options.currencyDisplay ?? 'narrowSymbol',\n maximumFractionDigits: options.trimZeros === true ? fractionDigits(amount) : digits,\n minimumFractionDigits: options.trimZeros === true ? 0 : digits,\n style: 'currency',\n }).format(amount)\n}\n\nfunction formatDecimal(amount: number, originalAmount: string | number): string {\n const digits = fractionDigits(originalAmount)\n return new Intl.NumberFormat('en-US', {\n maximumFractionDigits: Math.max(digits, 0),\n minimumFractionDigits: 0,\n }).format(amount)\n}\n\n/**\n * Hydrogen-shaped money formatter. It is intentionally pure: themes can call it during render without\n * depending on browser APIs beyond `Intl`, and `<Money>` is a thin wrapper over this function.\n */\nexport function useMoney(data: MoneyData): UseMoneyValue {\n const amount = Number(data.amount)\n const currencyCode = data.currencyCode\n const currencyName =\n new Intl.DisplayNames(['en-US'], { type: 'currency' }).of(currencyCode) ?? currencyCode\n\n return {\n amount: String(data.amount),\n currencyCode,\n currencyName,\n currencyNarrowSymbol: currencyPart(currencyCode, 'narrowSymbol'),\n currencySymbol: currencyPart(currencyCode, 'symbol'),\n localizedString: formatMoney(amount, currencyCode),\n withoutTrailingZeros: formatMoney(amount, currencyCode, { trimZeros: true }),\n withoutTrailingZerosAndCurrency: formatDecimal(amount, data.amount),\n }\n}\n\nexport function Money({\n as: Component = 'span',\n data,\n withoutCurrency,\n withoutTrailingZeros,\n ...passthrough\n}: MoneyProps): ReactElement {\n const text =\n data == null\n ? ''\n : withoutCurrency === true\n ? useMoney(data).withoutTrailingZerosAndCurrency\n : withoutTrailingZeros === true\n ? useMoney(data).withoutTrailingZeros\n : useMoney(data).localizedString\n return <Component {...passthrough}>{text}</Component>\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport React, { type AnchorHTMLAttributes, type ReactElement, type ReactNode } from 'react'\n\nimport { getPaginationInfo, type Connection, type PaginationInfo } from '../pagination/pagination'\n\ntype PaginationLinkProps = AnchorHTMLAttributes<HTMLAnchorElement>\n\nexport interface HydrogenPaginationInfo<T = any> extends PaginationInfo<T> {\n readonly isLoading: boolean\n readonly state: 'idle'\n readonly PreviousLink: (props: PaginationLinkProps) => ReactElement\n readonly NextLink: (props: PaginationLinkProps) => ReactElement\n}\n\nexport interface PaginationProps<T = any> {\n connection: Connection<T>\n /** The current request URL. Hydrogen reads it from the router; pass it in to keep this framework-agnostic. */\n currentUrl?: URL | string\n /** Isolates URL params when several paginations share a page. */\n namespace?: string\n children: (state: HydrogenPaginationInfo<T>) => ReactNode\n}\n\n/**\n * Hydrogen-shaped `<Pagination>` (ADR-0003 §SDK). A thin render-props wrapper over `getPaginationInfo`:\n * it hands the theme the current page's `nodes` + ready-built `nextPageUrl`/`prevPageUrl`. All logic\n * lives in `getPaginationInfo` (unit-tested); this just calls the render prop.\n */\nexport function Pagination<T = any>({\n connection,\n currentUrl,\n namespace,\n children,\n}: PaginationProps<T>): ReactElement {\n const info = getPaginationInfo(\n connection,\n currentUrl ?? 'https://storefront.kotao.local/',\n namespace != null ? { namespace } : {},\n )\n const PreviousLink = ({ children: linkChildren, ...props }: PaginationLinkProps) => (\n <a {...props} href={info.prevPageUrl ?? props.href}>\n {linkChildren}\n </a>\n )\n const NextLink = ({ children: linkChildren, ...props }: PaginationLinkProps) => (\n <a {...props} href={info.nextPageUrl ?? props.href}>\n {linkChildren}\n </a>\n )\n return (\n <>\n {children({\n ...info,\n isLoading: false,\n state: 'idle',\n PreviousLink,\n NextLink,\n })}\n </>\n )\n}\n","import React, { type ReactElement } from 'react'\n\nimport { getSeoMeta, serializeJsonLd } from '../seo/get-seo-meta'\nimport type { SeoConfig, SeoDescriptor } from '../seo/types'\n\nexport interface SeoProps {\n /** One or more SEO configs, merged root → leaf (deeper/later wins per field). */\n readonly config: SeoConfig | readonly SeoConfig[]\n}\n\nfunction renderDescriptor(descriptor: SeoDescriptor, key: number): ReactElement {\n if ('title' in descriptor) return <title key={key}>{descriptor.title}</title>\n if ('script:ld+json' in descriptor) {\n // JSON-LD must be injected as raw text; serializeJsonLd escapes `<` so a value containing\n // `</script>` cannot break out (XSS guard). React text children would HTML-escape the JSON instead.\n return (\n <script\n key={key}\n type=\"application/ld+json\"\n dangerouslySetInnerHTML={{ __html: serializeJsonLd(descriptor['script:ld+json']) }}\n />\n )\n }\n if ('tagName' in descriptor) {\n return (\n <link key={key} rel={descriptor.rel} href={descriptor.href} hrefLang={descriptor.hrefLang} />\n )\n }\n if ('property' in descriptor) {\n return <meta key={key} property={descriptor.property} content={descriptor.content} />\n }\n return <meta key={key} name={descriptor.name} content={descriptor.content} />\n}\n\n/**\n * Hydrogen-shaped `<Seo/>` (ADR-0003 §SDK) — renders the head descriptors `getSeoMeta` produces\n * (title, meta, canonical/alternate links, JSON-LD). Themes can use this OR return `getSeoMeta(...)`\n * from a route `meta` export. All merge/emit logic lives in `getSeoMeta` (unit-tested).\n */\nexport function Seo({ config }: SeoProps): ReactElement {\n const configs = (Array.isArray(config) ? [...config] : [config]) as SeoConfig[]\n const descriptors = getSeoMeta(...configs)\n return <>{descriptors.map((descriptor, index) => renderDescriptor(descriptor, index))}</>\n}\n","import React, { type AnchorHTMLAttributes, type CSSProperties, type ReactElement } from 'react'\n\ntype AnchorProps = Omit<AnchorHTMLAttributes<HTMLAnchorElement>, 'href' | 'children'>\n\nexport interface ShopPayButtonProps extends AnchorProps {\n readonly storeDomain?: string\n readonly variantIds: readonly string[]\n readonly width?: CSSProperties['width']\n}\n\nfunction normalizeStoreDomain(storeDomain: string): string {\n return storeDomain.replace(/^https?:\\/\\//, '').replace(/\\/+$/, '')\n}\n\nfunction variantPathSegment(variantId: string): string {\n return variantId.split('/').at(-1) ?? variantId\n}\n\nexport function ShopPayButton({\n storeDomain,\n style,\n variantIds,\n width,\n ...props\n}: ShopPayButtonProps): ReactElement | null {\n if (storeDomain == null || storeDomain.length === 0 || variantIds.length === 0) return null\n\n const domain = normalizeStoreDomain(storeDomain)\n const lines = variantIds.map((variantId) => `${variantPathSegment(variantId)}:1`).join(',')\n const href = `https://${domain}/cart/${lines}?payment=shop_pay`\n const mergedStyle = width == null ? style : ({ ...style, width } satisfies CSSProperties)\n\n return (\n <a\n {...props}\n aria-label={props['aria-label'] ?? 'Buy with Shop Pay'}\n href={href}\n rel={props.target === '_blank' ? 'noreferrer' : props.rel}\n style={mergedStyle}\n >\n Buy with Shop Pay\n </a>\n )\n}\n","import {\n createContext,\n useContext,\n useSyncExternalStore,\n type ReactElement,\n type ReactNode,\n} from 'react'\nimport React from 'react'\n\nimport type { ThemeSettingsStore } from '../settings/store'\nimport type { ResolvedSettings, ThemeSettingsSnapshot } from '../settings/types'\n\n/**\n * React binding for the theme-settings store (#93). Thin over `useSyncExternalStore`: in plain runtime the\n * snapshot is stable (one server render); in the visual editor, live postMessage patches to the store\n * re-render the subscribed sections without a reload. The store (settings/store.ts) holds the logic and is\n * unit-tested; this binding follows the SDK convention of keeping React components as thin wrappers.\n */\nconst ThemeSettingsContext = createContext<ThemeSettingsStore | null>(null)\n\nexport interface ThemeSettingsProviderProps {\n readonly store: ThemeSettingsStore\n readonly children: ReactNode\n}\n\nexport function ThemeSettingsProvider({\n store,\n children,\n}: ThemeSettingsProviderProps): ReactElement {\n return <ThemeSettingsContext.Provider value={store}>{children}</ThemeSettingsContext.Provider>\n}\n\nfunction useThemeSettingsStore(): ThemeSettingsStore {\n const store = useContext(ThemeSettingsContext)\n if (store === null) {\n throw new Error('useThemeSettings must be used within a <ThemeSettingsProvider>')\n }\n return store\n}\n\n/** The merged theme settings; re-renders on live editor patches (`useSyncExternalStore`). */\nexport function useThemeSettings(): ThemeSettingsSnapshot {\n const store = useThemeSettingsStore()\n return useSyncExternalStore(store.subscribe, store.getSnapshot, store.getSnapshot)\n}\n\n/** Merged settings for one section instance (undefined if the instance is absent). */\nexport function useSectionSettings(instanceId: string): ResolvedSettings | undefined {\n return useThemeSettings().sections.find((section) => section.id === instanceId)?.settings\n}\n\n/** The merged global theme tokens (logo, colors, fonts). */\nexport function useGlobalThemeTokens(): ResolvedSettings {\n return useThemeSettings().global\n}\n","import type { Money } from './cart-adapter'\n\n/**\n * Format a Money value as a localised string. When `m.currency` is a valid ISO-4217 code the\n * result is fully currency-formatted (e.g. \"€216.00\"). When it is absent or invalid — which\n * happens on a migrated theme whose `/cart.js` omits the `currency` field — the value degrades\n * gracefully to a plain decimal string (e.g. \"216.00\") rather than throwing a RangeError that\n * would blank the entire drawer.\n */\nexport const formatMoney = (m: Money): string => {\n // EUR is formatted deterministically as \"€1.234,56\" (symbol prefix, dot thousands, comma\n // decimals) — the European display every EUR storefront uses (Shopify's default EUR\n // money_format is `€{{amount_with_comma_separator}}`), independent of the shopper's browser\n // locale. Intl with `undefined` locale would render \"€1,234.56\" on an en-US browser and\n // diverge from the theme's own server-rendered prices.\n if (m.currency === 'EUR' && Number.isFinite(m.amount)) {\n const negative = m.amount < 0\n const abs = Math.round(Math.abs(m.amount))\n const units = Math.floor(abs / 100)\n .toString()\n .replace(/\\B(?=(\\d{3})+(?!\\d))/g, '.')\n return `${negative ? '-' : ''}€${units},${String(abs % 100).padStart(2, '0')}`\n }\n if (m.currency && /^[A-Za-z]{3}$/.test(m.currency)) {\n try {\n return new Intl.NumberFormat(undefined, {\n style: 'currency',\n currency: m.currency,\n }).format(m.amount / 100)\n } catch {\n // Fall through to the plain-number fallback below.\n }\n }\n return new Intl.NumberFormat(undefined, { minimumFractionDigits: 2 }).format(m.amount / 100)\n}\n\n/** Like {@link formatMoney}, but drops the decimals on whole amounts (\"€46\" instead of \"€46,00\") —\n * the original cart app's display for savings amounts and free-shipping progress. */\nexport const formatMoneyCompact = (m: Money): string => {\n const formatted = formatMoney(m)\n return Number.isFinite(m.amount) && Math.round(Math.abs(m.amount)) % 100 === 0\n ? formatted.replace(/[.,]00(?=\\D*$)/, '')\n : formatted\n}\n\nexport const escapeHtml = (s: string | null | undefined): string =>\n String(s ?? '').replace(\n /[&<>\"']/g,\n (c) => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;' })[c]!,\n )\n\n/** Format a remaining-duration in ms as \"mm:ss\" (both zero-padded, floored, clamped at 0) —\n * matching the original cart app's countdown display (\"09:56\"). */\nexport const formatCountdown = (ms: number): string => {\n const total = Number.isFinite(ms) && ms > 0 ? Math.floor(ms / 1000) : 0\n const minutes = Math.floor(total / 60)\n const seconds = total % 60\n return `${String(minutes).padStart(2, '0')}:${String(seconds).padStart(2, '0')}`\n}\n","import { escapeHtml, formatMoney } from '../format'\nimport type { SmartCartLine, SmartCartState } from '../cart-adapter'\nimport type { SmartCartWidget } from './types'\n\n/** The line attribute that flags an add-on line. Shared with the element's toggle handler. */\nexport const ADDON_ATTR_KEY = '_kotao_addon'\nexport const ADDON_ATTR_VALUE = '1'\n/** Config key for the add-on widget (used by the element to resolve the variant's display data). */\nexport const ADDON_KEY = 'addOn'\n\n/** A non-empty variant id string from the passthrough config, or null. */\nfunction readVariantId(config: Record<string, unknown>): string | null {\n const raw = config.variantId\n return typeof raw === 'string' && raw.trim() !== '' ? raw : null\n}\n\n/** Optional merchant subtitle (e.g. \"Protect your order from being lost or damaged.\"); null when unset. */\nfunction readDescription(config: Record<string, unknown>): string | null {\n const raw = config.description\n return typeof raw === 'string' && raw.trim() !== '' ? raw : null\n}\n\n/** Find the add-on line in the cart by its merchandise (variant) id — a reliable round-trip across\n * every adapter, unlike the `_kotao_addon` attribute the migrated `/cart.js` does not echo back. */\nfunction findAddOnLine(state: SmartCartState | null, variantId: string): SmartCartLine | null {\n if (state === null) return null\n return state.lines.find((l) => l.variantId === variantId) ?? null\n}\n\nconst css = `\n .ksc-addon { display: grid; grid-template-columns: auto minmax(0, 1fr) auto auto; align-items: center;\n gap: 2px 12px; padding: 14px 18px; border-top: 1px solid var(--ksc-border); font: inherit; color: var(--ksc-text); }\n .ksc-addon__icon { grid-row: 1 / span 2; width: 44px; height: 44px; display: flex; align-items: center;\n justify-content: center; color: var(--ksc-accent); }\n .ksc-addon__icon svg { width: 34px; height: 34px; }\n .ksc-addon__img { grid-row: 1 / span 2; width: 44px; height: 44px; object-fit: cover; border-radius: 8px;\n background: var(--ksc-border); }\n .ksc-addon__text { grid-column: 2; display: flex; flex-direction: column; gap: 1px; min-width: 0; }\n .ksc-addon__title { font-size: .875rem; font-weight: 600; }\n .ksc-addon__desc { font-size: .76rem; color: var(--ksc-muted); line-height: 1.3; }\n .ksc-addon__price { grid-column: 3; font-size: .875rem; font-weight: 600; white-space: nowrap; }\n .ksc-addon__toggle { grid-column: 4; grid-row: 1 / span 2; width: 42px; height: 24px; padding: 0; border: none;\n border-radius: 999px; background: color-mix(in oklab, var(--ksc-text) 22%, transparent); position: relative;\n cursor: pointer; transition: background .2s ease; flex: 0 0 auto; }\n .ksc-addon__toggle[aria-checked=\"true\"] { background: var(--ksc-accent); }\n .ksc-addon__knob { position: absolute; top: 2px; left: 2px; width: 20px; height: 20px; border-radius: 50%;\n background: #fff; box-shadow: 0 1px 3px rgba(0,0,0,.25); transition: transform .2s ease; }\n .ksc-addon__toggle[aria-checked=\"true\"] .ksc-addon__knob { transform: translateX(18px); }\n @media (prefers-reduced-motion: reduce) { .ksc-addon__toggle, .ksc-addon__knob { transition: none; } }\n`\n\nconst SHIELD_SVG = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M12 3l7 3v5c0 4.6-3 7.8-7 9-4-1.2-7-4.4-7-9V6l7-3z\"/><path d=\"M9 12l2 2 4-4\"/></svg>`\n\n/**\n * Add-on toggle (#1397). Adds/removes a merchant-chosen REAL-product variant as a flagged cart line,\n * rendered as a rich card (icon + title + optional description + price + switch) — mirroring the\n * third-party shipping-protection upsell merchants expect.\n *\n * Reads `variantId` (string, required) and `description` (string, optional) defensively from the\n * passthrough config; renders nothing without a variant id. Title/price/image come from the resolved\n * variant display data (`ctx.variants`, the same `productVariantsByIds` seam the upsell carousel\n * uses) so they show BEFORE the line is added; once the line is in the cart its own data is the\n * fallback, then a generic \"Add-on\". The line is flagged `{ _kotao_addon: '1' }`; the switch is \"on\"\n * when that line is present.\n *\n * The switch only carries intent (data attributes) — the element's delegated panel handler performs\n * the addLine/removeLine mutation and re-renders (widget render() is pure). `defaultOn` (auto-add on\n * first open) is handled by the element, not this widget.\n */\nexport const addOn: SmartCartWidget = {\n key: ADDON_KEY,\n // Footer, not 'after-items': the add-on is a checkout-adjacent offer that must stay pinned above\n // the discount code, NOT scroll away with the upsell carousel. It renders before `discountCode`\n // (WIDGETS registry order) so it sits directly above the code input (#1548 moved the whole\n // 'after-items' zone into the scroll region — only the upsell belongs there).\n zone: 'footer',\n css,\n render({ config, state, variants }) {\n const variantId = readVariantId(config)\n if (variantId === null) return ''\n\n const line = findAddOnLine(state, variantId)\n const checked = line !== null\n const resolved = variants?.get(variantId)\n\n const title = escapeHtml(resolved?.productTitle ?? line?.title ?? 'Add-on')\n // Subtitle: an explicit merchant override wins; otherwise fall back to the product's description.\n const description = readDescription(config) ?? resolved?.productDescription ?? null\n const descHtml = description\n ? `<span class=\"ksc-addon__desc\">${escapeHtml(description)}</span>`\n : ''\n\n const priceMoney = resolved?.price ?? line?.linePrice ?? null\n const priceHtml = priceMoney\n ? `<span class=\"ksc-addon__price\">${escapeHtml(formatMoney(priceMoney))}</span>`\n : ''\n\n const image = resolved?.imageUrl ?? line?.imageUrl ?? null\n const icon = image\n ? `<img class=\"ksc-addon__img\" src=\"${escapeHtml(image)}\" alt=\"\" width=\"34\" height=\"34\">`\n : `<span class=\"ksc-addon__icon\">${SHIELD_SVG}</span>`\n\n const lineIdAttr = line ? ` data-line-id=\"${escapeHtml(line.id)}\"` : ''\n const checkedStr = checked ? 'true' : 'false'\n\n return `<div class=\"ksc-addon\" data-checked=\"${checkedStr}\">\n ${icon}\n <span class=\"ksc-addon__text\"><span class=\"ksc-addon__title\">${title}</span>${descHtml}</span>\n ${priceHtml}\n <button type=\"button\" class=\"ksc-addon__toggle\" role=\"switch\" aria-checked=\"${checkedStr}\" aria-label=\"${title}\" data-smart-cart-addon-toggle data-variant-id=\"${escapeHtml(\n variantId,\n )}\" data-checked=\"${checkedStr}\"${lineIdAttr}><span class=\"ksc-addon__knob\"></span></button>\n </div>`\n },\n}\n","import { escapeHtml, formatCountdown } from '../format'\nimport type { SmartCartWidget } from './types'\n\n/** Default countdown length when `minutes` is absent. */\nexport const DEFAULT_MINUTES = 10\nconst MS_PER_MINUTE = 60_000\n\n/** The two modes. v1 renders both identically — `hold` (real kernel-inventory reservation, #959)\n * is a FOLLOW-UP and is intentionally NOT implemented here. */\nconst MODES = new Set(['display', 'hold'])\nconst DEFAULT_MODE = 'display'\n\n/** A strictly-positive integer minutes value from the passthrough config, or null. */\nfunction readMinutes(config: Record<string, unknown>): number | null {\n const raw = config.minutes\n return typeof raw === 'number' && Number.isFinite(raw) && raw > 0 ? Math.floor(raw) : null\n}\n\n/** Read the `mode` enum defensively; fall back to 'display' when absent/invalid. v1 ignores the\n * distinction for rendering — it is read only so a stored 'hold' config is preserved, not coerced. */\nfunction readMode(config: Record<string, unknown>): string {\n const raw = config.mode\n return typeof raw === 'string' && MODES.has(raw) ? raw : DEFAULT_MODE\n}\n\n/** Optional merchant message shown before the countdown; null when absent/blank. */\nfunction readMessage(config: Record<string, unknown>): string | null {\n const raw = config.message\n return typeof raw === 'string' && raw.trim() !== '' ? raw : null\n}\n\nconst css = `\n .ksc-rt { display: flex; align-items: center; justify-content: center; gap: 4px;\n padding: 9px 16px; font: inherit; font-size: 0.8125rem; font-weight: 400;\n color: var(--ksc-text, #111);\n background: rgb(215, 254, 218); }\n .ksc-rt__count { font-variant-numeric: tabular-nums; font-weight: 700; }\n .ksc-rt__icon { font-size: 0.95em; line-height: 1; }\n @media (prefers-reduced-motion: reduce) { .ksc-rt { transition: none; } }\n`\n\n/**\n * Reservation timer (#1401). Renders a client-side \"expires in m:ss\" countdown in the cart drawer\n * top bar. The widget is pure: it seeds a `[data-ksc-countdown]` span with the initial m:ss (so it\n * is correct before the first tick) and an end-text data attribute; the DRAWER ELEMENT owns the\n * per-second interval and surgically updates the span (widget render() must stay stateless).\n *\n * Reads `minutes` (positive integer, default 10) and `mode` ('display'|'hold', default 'display')\n * defensively from the passthrough config. v1 is `display` only — a pure client countdown with NO\n * real inventory hold, which is what most cart apps ship. `mode:'hold'` renders the SAME display\n * countdown here; the real kernel-inventory reservation (#959) is a follow-up. Renders nothing when\n * `minutes` is invalid. The optional `message` is HTML-escaped; the seed is a trusted numeric format.\n */\nexport const reservationTimer: SmartCartWidget = {\n key: 'reservationTimer',\n zone: 'top-bar',\n css,\n render({ config }) {\n const minutes = readMinutes(config) ?? (config.minutes === undefined ? DEFAULT_MINUTES : null)\n if (minutes === null) return ''\n void readMode(config) // v1: mode does not change rendering; reserved for the #959 follow-up.\n\n const seed = formatCountdown(minutes * MS_PER_MINUTE)\n const message = readMessage(config) ?? 'Your cart will expire in'\n\n return `<div class=\"ksc-rt\">\n <span>${escapeHtml(message)}</span>\n <span class=\"ksc-rt__count\" data-ksc-countdown data-ksc-end-text=\"00:00\">${seed}</span>\n <span class=\"ksc-rt__icon\" aria-hidden=\"true\">⏰</span>\n </div>`\n },\n}\n","import { escapeHtml, formatMoney } from '../format'\nimport type { SmartCartState } from '../cart-adapter'\nimport type { ProductVariantOption, UpsellVariant } from '../variant-lookup'\nimport type { SmartCartWidget } from './types'\n\n/** Widget key — must match the stored config blob + the Workspaces picker (SMART_CART_WIDGET_KEYS). */\nexport const UPSELL_KEY = 'upsell'\n\n/** Line attribute tagging an upsell-added line with the source variant id, so the carousel can\n * hide items already in the cart (and the element can re-render cleanly). */\nexport const UPSELL_VARIANT_ATTR = '_kotao_upsell_variant'\n\n/** Shopify's single-variant sentinel title — noise on a card, so it is not shown as a sub-line. */\nconst DEFAULT_VARIANT_TITLE = 'Default Title'\n\n/**\n * Read the configured variant ids from the upsell passthrough config. The merchant enters ONLY ids\n * (`items: [{ variantId }]`); all display data is fetched live (#1431), never inline. De-duplicates\n * while preserving first-seen order. Tolerates the legacy `{ variantId, title, price, imageUrl }`\n * shape (the extra keys are simply ignored) so older stored blobs keep working without a migration.\n */\nexport function readVariantIds(config: Record<string, unknown>): readonly string[] {\n const raw = config.items\n if (!Array.isArray(raw)) return []\n const ids: string[] = []\n for (const entry of raw) {\n if (typeof entry !== 'object' || entry === null) continue\n const variantId = (entry as { variantId?: unknown }).variantId\n if (typeof variantId === 'string' && variantId.trim() !== '') ids.push(variantId.trim())\n }\n return [...new Set(ids)]\n}\n\n/** Optional merchant section title (e.g. \"BUY 1 GET 1 FREE\"); default mirrors a generic upsell. */\nfunction readTitle(config: Record<string, unknown>): string {\n const raw = config.title\n return typeof raw === 'string' && raw.trim() !== '' ? raw : 'You might also like'\n}\n\n/** Variant ids already represented in the cart — via the upsell tag OR the line's own variant id —\n * so an item the shopper already has is not re-offered. */\nfunction cartVariantIds(state: SmartCartState | null): ReadonlySet<string> {\n if (state === null) return new Set()\n const ids = new Set<string>()\n for (const line of state.lines) {\n const tag = line.attributes?.[UPSELL_VARIANT_ATTR]\n if (typeof tag === 'string') ids.add(tag)\n if (line.variantId !== null && line.variantId !== undefined) ids.add(String(line.variantId))\n }\n return ids\n}\n\nconst ARROW_LEFT_SVG = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M19 12H5M11 6l-6 6 6 6\"/></svg>`\nconst ARROW_RIGHT_SVG = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M5 12h14M13 6l6 6-6 6\"/></svg>`\n\nconst css = `\n .ksc-up { padding: 14px 6px 16px; font: inherit; color: var(--ksc-text); }\n .ksc-up__title { margin: 0 0 10px; font-size: 0.9375rem; font-weight: 700; text-align: center; }\n .ksc-up__row { display: grid; grid-template-columns: 28px minmax(0, 1fr) 28px; align-items: center; gap: 2px; }\n .ksc-up__arrow { display: flex; align-items: center; justify-content: center; width: 28px; height: 28px;\n padding: 0; border: none; background: none; cursor: pointer; color: rgb(52, 64, 84); border-radius: 8px; }\n .ksc-up__arrow:hover { background: var(--ksc-border); }\n .ksc-up__arrow svg { width: 18px; height: 18px; }\n .ksc-up__track { display: flex; gap: 10px; overflow-x: auto; scroll-snap-type: x mandatory;\n scroll-behavior: smooth; -webkit-overflow-scrolling: touch; scrollbar-width: none; }\n .ksc-up__track::-webkit-scrollbar { display: none; }\n .ksc-up__card { scroll-snap-align: start; flex: 0 0 100%; display: grid;\n grid-template-columns: 64px minmax(0, 1fr); gap: 4px 12px; align-items: start;\n border-radius: 12px; padding: 12px; background: rgb(242, 244, 247); box-sizing: border-box; }\n .ksc-up__img { grid-row: 1 / span 4; width: 64px; height: 64px; object-fit: cover; border-radius: 8px;\n background: var(--ksc-surface); }\n .ksc-up__name { font-size: 0.9375rem; font-weight: 700; line-height: 1.25; display: -webkit-box;\n -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }\n .ksc-up__prices { display: flex; align-items: center; flex-wrap: wrap; gap: 6px; font-size: 0.875rem; }\n .ksc-up__price { font-weight: 700; }\n .ksc-up__compare { color: rgb(152, 162, 179); text-decoration: line-through; }\n .ksc-up__save { font-size: 0.75rem; font-weight: 500; color: rgb(7, 148, 85);\n background: rgb(220, 250, 230); padding: 2px 8px; border-radius: 6px; white-space: nowrap; }\n .ksc-up__variant { display: flex; flex-direction: column; gap: 3px; align-items: flex-start;\n font-size: 0.78rem; color: rgb(152, 162, 179); }\n .ksc-up__select { font: inherit; font-size: 0.8125rem; color: var(--ksc-text); padding: 4px 24px 4px 10px;\n border: 1px solid var(--ksc-border); border-radius: 8px; background-color: var(--ksc-surface); cursor: pointer;\n appearance: none; -webkit-appearance: none;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6' fill='none' stroke='%23999' stroke-width='1.5'%3E%3Cpath d='M1 1l4 4 4-4'/%3E%3C/svg%3E\");\n background-repeat: no-repeat; background-position: right 8px center; }\n .ksc-up__add { justify-self: start; margin-top: 6px; padding: 8px 14px; font: inherit; font-size: 0.8125rem;\n font-weight: 600; cursor: pointer; border: none; border-radius: 8px; background: rgb(7, 148, 85);\n color: #fff; transition: opacity .15s ease; }\n .ksc-up__add:hover { opacity: 0.9; }\n .ksc-up__add:focus-visible { outline: 2px solid rgb(7, 148, 85); outline-offset: 2px; }\n @media (prefers-reduced-motion: reduce) { .ksc-up__track { scroll-behavior: auto; } .ksc-up__add { transition: none; } }\n`\n\n/** A single card from live variant data, in the original cart app's horizontal \"layout-1\": image\n * left; title, price row (final bold + struck compare-at + \"You save X%\" badge), an optional\n * size `<select>` over the product's sibling variants, and a green add button on the right. */\nfunction card(\n variant: UpsellVariant,\n currency: string,\n siblings: readonly ProductVariantOption[] | undefined,\n): string {\n const name = escapeHtml(variant.productTitle)\n const img =\n variant.imageUrl !== null\n ? `<img class=\"ksc-up__img\" src=\"${escapeHtml(variant.imageUrl)}\" alt=\"${escapeHtml(variant.imageAltText ?? '')}\" loading=\"lazy\" />`\n : `<div class=\"ksc-up__img\" role=\"presentation\"></div>`\n\n const price = escapeHtml(formatMoney({ amount: variant.price.amount, currency }))\n const showCompare =\n variant.compareAtPrice !== null && variant.compareAtPrice.amount > variant.price.amount\n const compare = showCompare\n ? `<s class=\"ksc-up__compare\">${escapeHtml(formatMoney({ amount: variant.compareAtPrice!.amount, currency }))}</s>`\n : ''\n const savePct = showCompare\n ? Math.round(\n ((variant.compareAtPrice!.amount - variant.price.amount) / variant.compareAtPrice!.amount) *\n 100,\n )\n : 0\n const save = savePct > 0 ? `<span class=\"ksc-up__save\">You save ${savePct}%</span>` : ''\n\n const hasMeaningfulTitle =\n variant.title !== null && variant.title.trim() !== '' && variant.title !== DEFAULT_VARIANT_TITLE\n // A size `<select>` over the product's sibling variants when they have resolved; falls back to\n // the static variant title. The select carries intent only — the element's change handler\n // retargets the sibling add button's data-variant-id.\n const variantHtml =\n siblings !== undefined && siblings.length > 1\n ? `<span class=\"ksc-up__variant\"><span>Size:</span><select class=\"ksc-up__select\" data-smart-cart-upsell-variant aria-label=\"Size\">${siblings\n .map(\n (v) =>\n `<option value=\"${escapeHtml(v.id)}\"${v.id === variant.id ? ' selected' : ''}>${escapeHtml(v.title ?? '')}</option>`,\n )\n .join('')}</select></span>`\n : hasMeaningfulTitle\n ? `<span class=\"ksc-up__variant\"><span>Size:</span><span>${escapeHtml(variant.title!)}</span></span>`\n : ''\n\n return `<div class=\"ksc-up__card\" role=\"listitem\">\n ${img}\n <span class=\"ksc-up__name\">${name}</span>\n <span class=\"ksc-up__prices\"><span class=\"ksc-up__price\">${price}</span>${compare}${save}</span>\n ${variantHtml}\n <button type=\"button\" class=\"ksc-up__add\" data-smart-cart-upsell-add data-variant-id=\"${escapeHtml(variant.id)}\" aria-label=\"Add ${name} to cart\">Add to cart</button>\n </div>`\n}\n\n/**\n * In-cart upsell carousel (#1396). The merchant configures only `items: [{ variantId }]` and an\n * optional section `title`; the card's title, price, image, and parent product are fetched LIVE via\n * the storefront-api `productVariantsByIds` query (#1431) and supplied through `ctx.variants` (the\n * element resolves them async on open and re-renders — widget render stays pure). One card per view\n * with outside prev/next arrows, mirroring the original cart app's layout: the arrows carry intent\n * (`data-smart-cart-upsell-prev/next`); the element's delegated panel handler scrolls the track.\n *\n * Renders nothing until the lookup resolves and at least one configured id resolves to a variant.\n * In-cart filter: a configured id matching a `_kotao_upsell_variant` line attribute OR a line's own\n * variant id is hidden, so the carousel cleanly stops re-offering items already in the cart after\n * re-render. An id whose variant is inactive/unknown (absent from the lookup) is simply skipped.\n */\nexport const upsellCarousel: SmartCartWidget = {\n key: UPSELL_KEY,\n zone: 'after-items',\n css,\n render({ config, state, variants, productVariants }) {\n if (variants === undefined || variants.size === 0) return ''\n const inCart = cartVariantIds(state)\n const cards = readVariantIds(config)\n .filter((id) => !inCart.has(id))\n .map((id) => variants.get(id))\n .filter((variant): variant is UpsellVariant => variant !== undefined)\n .map((variant) =>\n card(\n variant,\n state?.currency ?? variant.price.currency,\n variant.productHandle !== null ? productVariants?.get(variant.productHandle) : undefined,\n ),\n )\n .join('')\n if (cards === '') return ''\n\n return `<section class=\"ksc-up\" aria-label=\"Recommended add-ons\">\n <p class=\"ksc-up__title\">${escapeHtml(readTitle(config))}</p>\n <div class=\"ksc-up__row\">\n <button type=\"button\" class=\"ksc-up__arrow\" data-smart-cart-upsell-prev aria-label=\"Previous item\">${ARROW_LEFT_SVG}</button>\n <div class=\"ksc-up__track\" role=\"list\">${cards}</div>\n <button type=\"button\" class=\"ksc-up__arrow\" data-smart-cart-upsell-next aria-label=\"Next item\">${ARROW_RIGHT_SVG}</button>\n </div>\n </section>`\n },\n}\n","import { escapeHtml } from '../format'\nimport type { SmartCartWidget } from './types'\n\nconst css = `\n .ksc-discount { padding: 10px 20px; display: flex; flex-direction: column; gap: 8px; }\n .ksc-discount__row { display: flex; align-items: center; gap: 6px; padding: 5px 5px 5px 14px;\n border: 1px solid rgb(190, 190, 190); border-radius: 10px; background: var(--ksc-surface); }\n .ksc-discount__row:focus-within { border-color: var(--ksc-text); }\n .ksc-discount__input { flex: 1; min-width: 0; padding: 6px 0; border: none; background: none;\n color: var(--ksc-text); font: inherit; font-size: 0.875rem; outline: none; }\n .ksc-discount__apply { padding: 8px 16px; border: none; border-radius: 8px;\n background: rgb(220, 250, 230); color: var(--ksc-text); font: inherit; font-size: 0.875rem;\n font-weight: 500; cursor: pointer; white-space: nowrap; }\n .ksc-discount__apply:hover { filter: brightness(0.97); }\n .ksc-discount__chips { display: flex; flex-wrap: wrap; gap: 6px; }\n .ksc-discount__chip { display: inline-flex; align-items: center; gap: 5px; padding: 3px 8px 3px 10px; background: rgb(242, 244, 247); border-radius: 999px; font-size: 0.8125rem; color: var(--ksc-text); }\n .ksc-discount__chip-remove { display: inline-flex; align-items: center; justify-content: center; background: none; border: none; cursor: pointer; padding: 2px; color: color-mix(in oklab, var(--ksc-text) 60%, transparent); line-height: 1; font-size: 1rem; }\n .ksc-discount__chip-remove:hover { color: var(--ksc-text); }\n`\n\nconst REMOVE_SVG = `<svg viewBox=\"0 0 16 16\" width=\"12\" height=\"12\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><path d=\"M3 3l10 10M13 3L3 13\"/></svg>`\n\n/**\n * Discount-code input widget (#1398). Renders a text input + apply button, plus a chip for each\n * currently applied code. The chip has a remove button. All mutation intent is carried via data\n * attributes — the element's delegated panel click handler performs the actual `updateDiscountCodes`\n * call and re-renders (widget render is pure / side-effect-free).\n */\nexport const discountCode: SmartCartWidget = {\n key: 'discountCode',\n zone: 'footer',\n css,\n render({ state }) {\n const codes = state?.appliedCodes ?? []\n\n const chipsHtml =\n codes.length > 0\n ? `<div class=\"ksc-discount__chips\">${codes\n .map(\n (code) =>\n `<span class=\"ksc-discount__chip\"><span>${escapeHtml(code)}</span><button type=\"button\" class=\"ksc-discount__chip-remove\" data-smart-cart-discount-remove data-code=\"${escapeHtml(code)}\" aria-label=\"Remove discount code ${escapeHtml(code)}\">${REMOVE_SVG}</button></span>`,\n )\n .join('')}</div>`\n : ''\n\n return `<div class=\"ksc-discount\">\n <div class=\"ksc-discount__row\">\n <input id=\"ksc-discount-input\" class=\"ksc-discount__input\" type=\"text\" placeholder=\"Discount code\" aria-label=\"Discount code\" data-smart-cart-discount-input>\n <button type=\"button\" class=\"ksc-discount__apply\" data-smart-cart-discount-apply aria-label=\"Apply discount code\">Apply</button>\n </div>${chipsHtml ? `\\n ${chipsHtml}` : ''}\n</div>`\n },\n}\n","import { escapeHtml, formatMoneyCompact } from '../format'\nimport type { SmartCartWidget } from './types'\n\n/** A finite, strictly-positive integer threshold (minor units), or null when missing/invalid. */\nfunction readThreshold(config: Record<string, unknown>): number | null {\n const raw = config.threshold\n return typeof raw === 'number' && Number.isFinite(raw) && raw > 0 ? Math.round(raw) : null\n}\n\nfunction readMessage(\n config: Record<string, unknown>,\n key: 'messageBefore' | 'messageAfter',\n): string | null {\n const raw = config[key]\n return typeof raw === 'string' && raw.trim() !== '' ? raw : null\n}\n\n/** Escape a merchant message template, bolding the `{amount}` substitution. The template text is\n * untrusted (escaped); only the widget's own `<b>` wrapper and the formatted amount are emitted\n * as markup. */\nfunction renderTemplate(template: string, amount: string): string {\n return template\n .split(/\\{amount\\}/g)\n .map((part) => escapeHtml(part))\n .join(`<b>${escapeHtml(amount)}</b>`)\n}\n\nconst TRUCK_SVG = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M1 5h14v11H1zM15 9h4l3 3v4h-7z\"/><circle cx=\"6\" cy=\"18.5\" r=\"1.8\"/><circle cx=\"18\" cy=\"18.5\" r=\"1.8\"/></svg>`\n\nconst css = `\n .ksc-fsb { padding: 14px 20px 10px; font: inherit; color: var(--ksc-text); }\n .ksc-fsb__msg { margin: 0 0 10px; font-size: 0.8125rem; text-align: center; }\n .ksc-fsb__msg b { font-weight: 700; }\n .ksc-fsb__track { position: relative; height: 8px; border-radius: 999px;\n background: rgb(234, 236, 240); }\n .ksc-fsb__fill { height: 100%; border-radius: 999px; background: rgb(29, 41, 57);\n transition: width .3s ease; }\n .ksc-fsb__step { position: absolute; right: -2px; top: 50%; transform: translateY(-50%);\n width: 14px; height: 14px; border-radius: 4px; border: 2px solid rgb(29, 41, 57);\n background: var(--ksc-surface); box-sizing: border-box; }\n .ksc-fsb--unlocked .ksc-fsb__step { background: rgb(29, 41, 57); }\n .ksc-fsb__tier { display: flex; flex-direction: column; align-items: flex-end; gap: 1px;\n margin-top: 6px; font-size: 0.78rem; color: rgb(152, 162, 179); }\n .ksc-fsb__tier svg { width: 20px; height: 20px; }\n .ksc-fsb--unlocked .ksc-fsb__tier { color: rgb(29, 41, 57); }\n @media (prefers-reduced-motion: reduce) { .ksc-fsb__fill { transition: none; } }\n`\n\n/**\n * Free-shipping progress bar (#1395), styled to match the original cart app's tiered-promotions\n * bar: a centered message with the remaining amount in bold, a grey track with a dark fill and a\n * square tier marker at the end, and a truck-icon tier label underneath. Reads `threshold`\n * (integer minor units) and optional `messageBefore`/`messageAfter` from its passthrough config\n * (`{amount}` substitutes the formatted remaining amount, rendered bold). Renders nothing without\n * a valid threshold or cart state.\n */\nexport const freeShippingBar: SmartCartWidget = {\n key: 'freeShippingBar',\n zone: 'before-items',\n css,\n render({ config, state }) {\n const threshold = readThreshold(config)\n if (threshold === null || state === null) return ''\n\n // Progress toward free shipping is measured on what the shopper actually PAYS — the discounted\n // total (subtotal minus cart discounts, e.g. a BOGO), not the pre-discount gross. Otherwise a\n // €61 cart (after a €54 BOGO) would wrongly \"unlock\" a €100 threshold on its €115 gross.\n const discountTotal = state.discountTotal?.amount ?? 0\n const subtotal = Math.max(0, state.subtotal.amount - discountTotal)\n const remaining = Math.max(0, threshold - subtotal)\n const unlocked = remaining === 0\n const pct = Math.min(100, Math.round((subtotal / threshold) * 100))\n const remainingMoney = formatMoneyCompact({\n amount: remaining,\n currency: state.subtotal.currency,\n })\n\n const beforeTemplate = readMessage(config, 'messageBefore')\n const afterTemplate = readMessage(config, 'messageAfter')\n\n // Defaults mirror the original cart app's tier texts (\"Add X to unlock Free shipping!\" /\n // \"Free shipping unlocked!\"). A merchant template is escaped with `{amount}` bolded.\n const message = unlocked\n ? afterTemplate !== null\n ? renderTemplate(afterTemplate, remainingMoney)\n : `<b>Free shipping</b> unlocked!`\n : beforeTemplate !== null\n ? renderTemplate(beforeTemplate, remainingMoney)\n : `Add <b>${escapeHtml(remainingMoney)}</b> to unlock <b>Free shipping</b>!`\n\n return `<div class=\"ksc-fsb${unlocked ? ' ksc-fsb--unlocked' : ''}\">\n <p class=\"ksc-fsb__msg\">${message}</p>\n <div class=\"ksc-fsb__track\"><div class=\"ksc-fsb__fill\" style=\"width: ${pct}%\"></div><span class=\"ksc-fsb__step\" aria-hidden=\"true\"></span></div>\n <div class=\"ksc-fsb__tier\">${TRUCK_SVG}<span>${unlocked ? '' : '🔒 '}Free shipping</span></div>\n </div>`\n },\n}\n","import type { SmartCartWidget } from './types'\n\n/** The two anchor positions the bubble supports. */\nconst POSITIONS = new Set(['bottom-right', 'bottom-left'])\nconst DEFAULT_POSITION = 'bottom-right'\n\n/** The two visual styles the bubble supports. */\nconst STYLES = new Set(['solid', 'outline'])\nconst DEFAULT_STYLE = 'solid'\n\n/** Read a known-enum string from the passthrough blob; fall back to `fallback` when absent/invalid. */\nfunction readEnum(\n config: Record<string, unknown>,\n key: string,\n allowed: Set<string>,\n fallback: string,\n): string {\n const raw = config[key]\n return typeof raw === 'string' && allowed.has(raw) ? raw : fallback\n}\n\n/** Total item count = sum of line quantities; 0 when state is null/empty. */\nfunction itemCount(lines: ReadonlyArray<{ quantity: number }> | undefined): number {\n return (lines ?? []).reduce((sum, l) => sum + l.quantity, 0)\n}\n\nconst css = `\n .ksc-sb { position: fixed; z-index: 1; display: inline-flex; align-items: center; justify-content: center;\n width: 56px; height: 56px; border: none; border-radius: 9999px; cursor: pointer;\n background: var(--ksc-accent); color: var(--ksc-accent-text);\n box-shadow: 0 6px 20px rgba(0,0,0,.25); transition: transform .15s ease; font: inherit; }\n .ksc-sb:hover { transform: scale(1.06); }\n .ksc-sb:focus-visible { outline: 2px solid var(--ksc-accent-text); outline-offset: 2px; }\n .ksc-sb--bottom-right { right: 20px; bottom: 20px; }\n .ksc-sb--bottom-left { left: 20px; bottom: 20px; }\n .ksc-sb--outline { background: var(--ksc-surface); color: var(--ksc-accent);\n border: 2px solid var(--ksc-accent); }\n .ksc-sb__icon { width: 24px; height: 24px; display: block; }\n .ksc-sb__badge { position: absolute; top: -4px; right: -4px; min-width: 20px; height: 20px;\n padding: 0 5px; border-radius: 9999px; background: var(--ksc-text); color: var(--ksc-surface);\n font-size: 12px; line-height: 20px; text-align: center; font-weight: 600; }\n @media (prefers-reduced-motion: reduce) { .ksc-sb { transition: none; } .ksc-sb:hover { transform: none; } }\n`\n\n// Inline CC0 cart glyph (trusted constant — not config-derived, so safe to emit unescaped).\nconst CART_ICON = `<svg class=\"ksc-sb__icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><circle cx=\"9\" cy=\"21\" r=\"1\"/><circle cx=\"20\" cy=\"21\" r=\"1\"/><path d=\"M1 1h4l2.68 13.39a2 2 0 0 0 2 1.61h9.72a2 2 0 0 0 2-1.61L23 6H6\"/></svg>`\n\n/**\n * Sticky cart bubble (#1400). A floating button that opens the Smart Cart drawer and shows a live\n * item-count badge. `placement: 'chrome'` — it renders outside `.panel` and stays clickable while\n * the drawer is closed. Reads `position` ('bottom-right'|'bottom-left') and `style` ('solid'|'outline')\n * defensively from the passthrough config; both fall back to a default when absent/invalid. The count\n * is numeric and config only ever selects from known-enum classes, so no value is raw-interpolated.\n */\nexport const stickyBubble: SmartCartWidget = {\n key: 'stickyBubble',\n placement: 'chrome',\n css,\n render({ config, state }) {\n const position = readEnum(config, 'position', POSITIONS, DEFAULT_POSITION)\n const style = readEnum(config, 'style', STYLES, DEFAULT_STYLE)\n const count = itemCount(state?.lines)\n const badge = count > 0 ? `<span class=\"ksc-sb__badge\" data-count-badge>${count}</span>` : ''\n return `<button type=\"button\" data-smart-cart-open aria-label=\"Open cart\"\n class=\"ksc-sb ksc-sb--${position} ksc-sb--${style}\">${CART_ICON}${badge}</button>`\n },\n}\n","/**\n * Payment-method icon SVGs for the Smart Cart trust-badges widget (issue #1399).\n *\n * Copied verbatim from packages/liquid/src/payment-icons.ts — DO NOT import @kotao/liquid here,\n * as that would bundle the full LiquidJS runtime into the smart-cart browser IIFE.\n * Keep this file in sync with the source when new icons are added there.\n *\n * Source: gilbarbara/logos (https://github.com/gilbarbara/logos), license CC0 1.0 Universal\n * (public domain dedication — https://creativecommons.org/publicdomain/zero/1.0/). No attribution\n * is required; this header is courtesy. Each SVG below is vendored from\n * https://raw.githubusercontent.com/gilbarbara/logos/main/logos/<name>.svg with the leading\n * `<?xml …?>` prolog stripped (invalid inside an HTML body) and every internal id namespaced with\n * its icon key (e.g. `linearGradient-1` → `visa-linearGradient-1`). Inline SVGs share ONE document\n * id namespace, so without this rendering several icons together would resolve a later icon’s\n * `url(#…)` / `xlink:href=\"#…\"` reference to the FIRST same-id definition (wrong gradient/clip).\n * The logos are clean static SVGs — no <script> tags and no inline event handlers (verified at\n * vendor time).\n *\n * Keys: visa, mastercard, amex, maestro, discover, jcb, unionpay, paypal, apple-pay, google-pay.\n * (apple-pay / google-pay are vendored from the same liquid source so the badge row can match\n * an original store's wallet icons; neither SVG contains internal ids, so no namespacing needed.)\n */\nexport const PAYMENT_ICON_SVGS: Record<string, string> = {\n visa: `<svg width=\"256px\" height=\"83px\" viewBox=\"0 0 256 83\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" preserveAspectRatio=\"xMidYMid\">\n <defs>\n <linearGradient x1=\"45.9741966%\" y1=\"-2.00617467%\" x2=\"54.8768726%\" y2=\"100%\" id=\"visa-linearGradient-1\">\n <stop stop-color=\"#222357\" offset=\"0%\"></stop>\n <stop stop-color=\"#254AA5\" offset=\"100%\"></stop>\n </linearGradient>\n </defs>\n <g>\n <path d=\"M132.397094,56.2397455 C132.251036,44.7242808 142.65954,38.2977599 150.500511,34.4772086 C158.556724,30.5567233 161.262627,28.0430004 161.231878,24.5376253 C161.17038,19.1719416 154.805357,16.804276 148.847757,16.7120293 C138.454628,16.5505975 132.412467,19.5178668 127.607952,21.7625368 L123.864273,4.24334875 C128.684163,2.02174043 137.609033,0.084559486 146.864453,-7.10542736e-15 C168.588553,-7.10542736e-15 182.802234,10.7236802 182.879107,27.3511501 C182.963666,48.4525854 153.69071,49.6210438 153.890577,59.05327 C153.959762,61.912918 156.688728,64.964747 162.669389,65.7411565 C165.628971,66.133205 173.800493,66.433007 183.0636,62.1665965 L186.699658,79.11693 C181.718335,80.931115 175.314876,82.6684285 167.343223,82.6684285 C146.895202,82.6684285 132.512402,71.798691 132.397094,56.2397455 M221.6381,81.2078555 C217.671491,81.2078555 214.327548,78.8940005 212.836226,75.342502 L181.802894,1.24533061 L203.511621,1.24533061 L207.831842,13.1835926 L234.360459,13.1835926 L236.866494,1.24533061 L256,1.24533061 L239.303345,81.2078555 L221.6381,81.2078555 M224.674554,59.6067505 L230.939643,29.5804456 L213.781755,29.5804456 L224.674554,59.6067505 M106.076031,81.2078555 L88.9642665,1.24533061 L109.650591,1.24533061 L126.754669,81.2078555 L106.076031,81.2078555 M75.473185,81.2078555 L53.941265,26.7822953 L45.2316377,73.059396 C44.2092367,78.2252115 40.1734431,81.2078555 35.6917903,81.2078555 L0.491982464,81.2078555 L0,78.886313 C7.22599245,77.318119 15.4359498,74.7890215 20.409585,72.083118 C23.4537265,70.4303645 24.322383,68.985166 25.3217224,65.0569935 L41.8185094,1.24533061 L63.68098,1.24533061 L97.1972855,81.2078555 L75.473185,81.2078555\" fill=\"url(#visa-linearGradient-1)\" transform=\"translate(128.000000, 41.334214) scale(1, -1) translate(-128.000000, -41.334214) \"></path>\n </g>\n</svg>`,\n mastercard: `<svg width=\"256px\" height=\"199px\" viewBox=\"0 0 256 199\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" preserveAspectRatio=\"xMidYMid\">\n\t<g>\n\t\t<path d=\"M46.5392504,198.011312 L46.5392504,184.839826 C46.5392504,179.790757 43.4659038,176.497885 38.1973096,176.497885 C35.5630125,176.497885 32.7091906,177.375984 30.7334678,180.229806 C29.1967945,177.815034 27.0015469,176.497885 23.7086756,176.497885 C21.513428,176.497885 19.3181804,177.15646 17.5619824,179.571233 L17.5619824,176.936935 L12.9519625,176.936935 L12.9519625,198.011312 L17.5619824,198.011312 L17.5619824,186.3765 C17.5619824,182.644579 19.5377052,180.888381 22.6110518,180.888381 C25.6843984,180.888381 27.2210717,182.864103 27.2210717,186.3765 L27.2210717,198.011312 L31.8310916,198.011312 L31.8310916,186.3765 C31.8310916,182.644579 34.0263392,180.888381 36.880161,180.888381 C39.9535076,180.888381 41.490181,182.864103 41.490181,186.3765 L41.490181,198.011312 L46.5392504,198.011312 L46.5392504,198.011312 Z M114.81145,176.936935 L107.347608,176.936935 L107.347608,170.570717 L102.737589,170.570717 L102.737589,176.936935 L98.566618,176.936935 L98.566618,181.107905 L102.737589,181.107905 L102.737589,190.766995 C102.737589,195.59654 104.713311,198.450362 109.981906,198.450362 C111.957628,198.450362 114.152876,197.791787 115.689549,196.913688 L114.372401,192.962243 C113.055252,193.840341 111.518579,194.059866 110.420955,194.059866 C108.225708,194.059866 107.347608,192.742718 107.347608,190.54747 L107.347608,181.107905 L114.81145,181.107905 L114.81145,176.936935 L114.81145,176.936935 Z M153.886857,176.497885 C151.25256,176.497885 149.496362,177.815034 148.398738,179.571233 L148.398738,176.936935 L143.788718,176.936935 L143.788718,198.011312 L148.398738,198.011312 L148.398738,186.156975 C148.398738,182.644579 149.935411,180.668856 152.789233,180.668856 C153.667332,180.668856 154.764956,180.888381 155.643055,181.107905 L156.960204,176.71741 C156.082105,176.497885 154.764956,176.497885 153.886857,176.497885 L153.886857,176.497885 L153.886857,176.497885 Z M94.834697,178.693133 C92.6394495,177.15646 89.566103,176.497885 86.2732315,176.497885 C81.0046375,176.497885 77.492241,179.132183 77.492241,183.303153 C77.492241,186.81555 80.1265385,188.791272 84.736558,189.449847 L86.931806,189.669371 C89.346578,190.10842 90.6637265,190.766995 90.6637265,191.864619 C90.6637265,193.401292 88.9075285,194.498916 85.834182,194.498916 C82.7608355,194.498916 80.346063,193.401292 78.8093895,192.303668 L76.614142,195.816065 C79.0289145,197.572262 82.321786,198.450362 85.614657,198.450362 C91.7613505,198.450362 95.2737465,195.59654 95.2737465,191.645094 C95.2737465,187.913173 92.4199245,185.937451 88.0294295,185.278876 L85.834182,185.059351 C83.858459,184.839826 82.321786,184.400777 82.321786,183.083629 C82.321786,181.546955 83.858459,180.668856 86.2732315,180.668856 C88.9075285,180.668856 91.5418255,181.76648 92.858974,182.425054 L94.834697,178.693133 L94.834697,178.693133 Z M217.329512,176.497885 C214.695215,176.497885 212.939017,177.815034 211.841393,179.571233 L211.841393,176.936935 L207.231373,176.936935 L207.231373,198.011312 L211.841393,198.011312 L211.841393,186.156975 C211.841393,182.644579 213.378066,180.668856 216.231888,180.668856 C217.109987,180.668856 218.207611,180.888381 219.08571,181.107905 L220.402859,176.71741 C219.52476,176.497885 218.207611,176.497885 217.329512,176.497885 L217.329512,176.497885 L217.329512,176.497885 Z M158.496877,187.474123 C158.496877,193.840341 162.887372,198.450362 169.69264,198.450362 C172.765986,198.450362 174.961234,197.791787 177.156481,196.035589 L174.961234,192.303668 C173.205036,193.620817 171.448838,194.279391 169.473115,194.279391 C165.741194,194.279391 163.106897,191.645094 163.106897,187.474123 C163.106897,183.522678 165.741194,180.888381 169.473115,180.668856 C171.448838,180.668856 173.205036,181.32743 174.961234,182.644579 L177.156481,178.912658 C174.961234,177.15646 172.765986,176.497885 169.69264,176.497885 C162.887372,176.497885 158.496877,181.107905 158.496877,187.474123 L158.496877,187.474123 L158.496877,187.474123 Z M201.08468,187.474123 L201.08468,176.936935 L196.47466,176.936935 L196.47466,179.571233 C194.937987,177.595509 192.742739,176.497885 189.888917,176.497885 C183.961749,176.497885 179.351729,181.107905 179.351729,187.474123 C179.351729,193.840341 183.961749,198.450362 189.888917,198.450362 C192.962264,198.450362 195.157512,197.352737 196.47466,195.377015 L196.47466,198.011312 L201.08468,198.011312 L201.08468,187.474123 Z M184.181274,187.474123 C184.181274,183.742202 186.596046,180.668856 190.547492,180.668856 C194.279413,180.668856 196.91371,183.522678 196.91371,187.474123 C196.91371,191.206044 194.279413,194.279391 190.547492,194.279391 C186.596046,194.059866 184.181274,191.206044 184.181274,187.474123 L184.181274,187.474123 Z M129.080559,176.497885 C122.933866,176.497885 118.543371,180.888381 118.543371,187.474123 C118.543371,194.059866 122.933866,198.450362 129.300084,198.450362 C132.373431,198.450362 135.446777,197.572262 137.861549,195.59654 L135.666302,192.303668 C133.910104,193.620817 131.714856,194.498916 129.519609,194.498916 C126.665787,194.498916 123.811965,193.181768 123.153391,189.449847 L138.739648,189.449847 L138.739648,187.693648 C138.959173,180.888381 135.007727,176.497885 129.080559,176.497885 L129.080559,176.497885 L129.080559,176.497885 Z M129.080559,180.449331 C131.934381,180.449331 133.910104,182.20553 134.349153,185.498401 L123.372916,185.498401 C123.811965,182.644579 125.787688,180.449331 129.080559,180.449331 L129.080559,180.449331 Z M243.452958,187.474123 L243.452958,168.594995 L238.842938,168.594995 L238.842938,179.571233 C237.306265,177.595509 235.111017,176.497885 232.257196,176.497885 C226.330027,176.497885 221.720007,181.107905 221.720007,187.474123 C221.720007,193.840341 226.330027,198.450362 232.257196,198.450362 C235.330542,198.450362 237.52579,197.352737 238.842938,195.377015 L238.842938,198.011312 L243.452958,198.011312 L243.452958,187.474123 Z M226.549552,187.474123 C226.549552,183.742202 228.964324,180.668856 232.91577,180.668856 C236.647691,180.668856 239.281988,183.522678 239.281988,187.474123 C239.281988,191.206044 236.647691,194.279391 232.91577,194.279391 C228.964324,194.059866 226.549552,191.206044 226.549552,187.474123 L226.549552,187.474123 Z M72.443172,187.474123 L72.443172,176.936935 L67.833152,176.936935 L67.833152,179.571233 C66.2964785,177.595509 64.101231,176.497885 61.247409,176.497885 C55.3202405,176.497885 50.7102205,181.107905 50.7102205,187.474123 C50.7102205,193.840341 55.3202405,198.450362 61.247409,198.450362 C64.3207555,198.450362 66.5160035,197.352737 67.833152,195.377015 L67.833152,198.011312 L72.443172,198.011312 L72.443172,187.474123 Z M55.3202405,187.474123 C55.3202405,183.742202 57.735013,180.668856 61.6864585,180.668856 C65.4183795,180.668856 68.0526765,183.522678 68.0526765,187.474123 C68.0526765,191.206044 65.4183795,194.279391 61.6864585,194.279391 C57.735013,194.059866 55.3202405,191.206044 55.3202405,187.474123 Z\" fill=\"#000000\"></path>\n\t\t<rect fill=\"#FF5F00\" x=\"93.2980455\" y=\"16.9034088\" width=\"69.1502985\" height=\"124.251009\"></rect>\n\t\t<path d=\"M97.688519,79.0288935 C97.688519,53.783546 109.542856,31.3920209 127.763411,16.9033869 C114.3724,6.3661985 97.468994,-1.94737475e-05 79.0289145,-1.94737475e-05 C35.3434877,-1.94737475e-05 1.7258174e-06,35.3434665 1.7258174e-06,79.0288935 C1.7258174e-06,122.71432 35.3434877,158.057806 79.0289145,158.057806 C97.468994,158.057806 114.3724,151.691588 127.763411,141.1544 C109.542856,126.88529 97.688519,104.274241 97.688519,79.0288935 Z\" fill=\"#EB001B\"></path>\n\t\t<path d=\"M255.746345,79.0288935 C255.746345,122.71432 220.402859,158.057806 176.717432,158.057806 C158.277352,158.057806 141.373945,151.691588 127.982936,141.1544 C146.423015,126.665766 158.057827,104.274241 158.057827,79.0288935 C158.057827,53.783546 146.20349,31.3920209 127.982936,16.9033869 C141.373945,6.3661985 158.277352,-1.94737475e-05 176.717432,-1.94737475e-05 C220.402859,-1.94737475e-05 255.746345,35.5629913 255.746345,79.0288935 Z\" fill=\"#F79E1B\"></path>\n\t</g>\n</svg>`,\n amex: `<svg width=\"256px\" height=\"256px\" viewBox=\"0 0 256 256\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" preserveAspectRatio=\"xMidYMid\">\n <title>AMEX</title>\n <g>\n <path d=\"M256,138.547884 L256,0 L0,0 L0,256 L256,256 L256,181.309577 C255.429844,181.309577 256,138.547884 256,138.547884\" fill=\"#006FCF\"></path>\n <path d=\"M224.641425,124.293987 L244.026726,124.293987 L244.026726,79.2516704 L222.930958,79.2516704 L222.930958,85.5233853 L218.939866,79.2516704 L200.694878,79.2516704 L200.694878,87.233853 L197.273942,79.2516704 L163.634744,79.2516704 C162.494432,79.2516704 161.35412,79.8218263 160.213808,79.8218263 C159.073497,79.8218263 158.503341,80.3919822 157.363029,80.9621381 C156.222717,81.532294 155.652561,81.532294 154.512249,82.1024499 L154.512249,79.2516704 L58.155902,79.2516704 L55.3051225,86.6636971 L52.454343,79.2516704 L29.6481069,79.2516704 L29.6481069,87.233853 L26.2271715,79.2516704 L7.98218263,79.2516704 L0,98.636971 L0,124.293987 L13.1135857,124.293987 L15.3942094,118.022272 L19.9554566,118.022272 L22.2360802,124.293987 L122.583519,124.293987 L122.583519,118.592428 L126.57461,124.293987 L154.512249,124.293987 L154.512249,120.873051 C155.082405,121.443207 156.222717,121.443207 156.792873,122.013363 C157.363029,122.583519 158.503341,122.583519 159.073497,123.153675 C160.213808,123.723831 161.35412,123.723831 162.494432,123.723831 L183.020045,123.723831 L185.300668,117.452116 L189.861915,117.452116 L192.142539,123.723831 L220.080178,123.723831 L220.080178,118.022272 L224.641425,124.293987 L224.641425,124.293987 Z M256,181.309577 L256,139.11804 L99.2071269,139.11804 L95.2160356,144.819599 L91.2249443,139.11804 L45.6124722,139.11804 L45.6124722,184.160356 L91.2249443,184.160356 L95.2160356,178.458797 L99.2071269,184.160356 L127.714922,184.160356 L127.714922,174.467706 L126.57461,174.467706 C130.565702,174.467706 133.986637,173.89755 136.837416,172.757238 L136.837416,184.730512 L157.363029,184.730512 L157.363029,179.028953 L161.35412,184.730512 L246.30735,184.730512 C249.728285,183.5902 253.14922,183.020045 256,181.309577 L256,181.309577 Z\" fill=\"#FFFFFF\"></path>\n <path d=\"M246.30735,170.476615 L230.91314,170.476615 L230.91314,176.74833 L245.737194,176.74833 C252.008909,176.74833 256,172.757238 256,167.055679 C256,161.35412 252.579065,158.503341 246.877506,158.503341 L240.035635,158.503341 C238.325167,158.503341 237.184855,157.363029 237.184855,155.652561 C237.184855,153.942094 238.325167,152.801782 240.035635,152.801782 L253.14922,152.801782 L256,146.530067 L240.605791,146.530067 C234.334076,146.530067 230.342984,150.521158 230.342984,155.652561 C230.342984,161.35412 233.76392,164.2049 239.465479,164.2049 L246.30735,164.2049 C248.017817,164.2049 249.158129,165.345212 249.158129,167.055679 C249.728285,169.336303 248.587973,170.476615 246.30735,170.476615 L246.30735,170.476615 Z M218.36971,170.476615 L202.975501,170.476615 L202.975501,176.74833 L217.799555,176.74833 C224.071269,176.74833 228.062361,172.757238 228.062361,167.055679 C228.062361,161.35412 224.641425,158.503341 218.939866,158.503341 L212.097996,158.503341 C210.387528,158.503341 209.247216,157.363029 209.247216,155.652561 C209.247216,153.942094 210.387528,152.801782 212.097996,152.801782 L225.211581,152.801782 L228.062361,146.530067 L212.668151,146.530067 C206.396437,146.530067 202.405345,150.521158 202.405345,155.652561 C202.405345,161.35412 205.826281,164.2049 211.52784,164.2049 L218.36971,164.2049 C220.080178,164.2049 221.22049,165.345212 221.22049,167.055679 C221.790646,169.336303 220.080178,170.476615 218.36971,170.476615 L218.36971,170.476615 Z M198.414254,152.231626 L198.414254,145.959911 L174.467706,145.959911 L174.467706,176.178174 L198.414254,176.178174 L198.414254,169.906459 L181.309577,169.906459 L181.309577,163.634744 L197.844098,163.634744 L197.844098,157.363029 L181.309577,157.363029 L181.309577,151.66147 L198.414254,151.66147 L198.414254,152.231626 L198.414254,152.231626 Z M159.643653,152.231626 C162.494432,152.231626 163.634744,153.942094 163.634744,155.652561 C163.634744,157.363029 162.494432,159.073497 159.643653,159.073497 L151.091314,159.073497 L151.091314,151.66147 L159.643653,152.231626 L159.643653,152.231626 Z M151.091314,165.345212 L154.512249,165.345212 L163.634744,176.178174 L172.187082,176.178174 L161.924276,164.775056 C167.055679,163.634744 169.906459,160.213808 169.906459,155.652561 C169.906459,149.951002 165.915367,145.959911 159.643653,145.959911 L143.679287,145.959911 L143.679287,176.178174 L150.521158,176.178174 L151.091314,165.345212 Z M132.846325,156.222717 C132.846325,158.503341 131.706013,160.213808 128.855234,160.213808 L119.732739,160.213808 L119.732739,152.231626 L128.285078,152.231626 C131.135857,152.231626 132.846325,153.942094 132.846325,156.222717 L132.846325,156.222717 Z M112.890869,145.959911 L112.890869,176.178174 L119.732739,176.178174 L119.732739,165.915367 L128.855234,165.915367 C135.126949,165.915367 139.688196,161.924276 139.688196,155.652561 C139.688196,149.951002 135.697105,145.389755 129.42539,145.389755 L112.890869,145.959911 L112.890869,145.959911 Z M102.628062,176.178174 L111.180401,176.178174 L99.2071269,160.783964 L111.180401,145.959911 L102.628062,145.959911 L95.2160356,155.652561 L87.8040089,145.959911 L79.2516704,145.959911 L91.2249443,160.783964 L79.2516704,175.608018 L87.8040089,175.608018 L95.2160356,165.915367 L102.628062,176.178174 L102.628062,176.178174 Z M76.9710468,152.231626 L76.9710468,145.959911 L53.0244989,145.959911 L53.0244989,176.178174 L76.9710468,176.178174 L76.9710468,169.906459 L59.8663697,169.906459 L59.8663697,163.634744 L76.4008909,163.634744 L76.4008909,157.363029 L59.8663697,157.363029 L59.8663697,151.66147 L76.9710468,151.66147 L76.9710468,152.231626 L76.9710468,152.231626 Z M215.518931,98.636971 L227.492205,116.88196 L236.044543,116.88196 L236.044543,86.6636971 L229.202673,86.6636971 L229.202673,106.619154 L227.492205,103.768374 L216.659243,86.6636971 L207.536748,86.6636971 L207.536748,116.88196 L214.378619,116.88196 L214.378619,96.3563474 L215.518931,98.636971 L215.518931,98.636971 Z M185.870824,98.0668151 L188.151448,91.7951002 L190.432071,98.0668151 L193.282851,104.908686 L183.020045,104.908686 L185.870824,98.0668151 L185.870824,98.0668151 Z M197.844098,116.88196 L205.256125,116.88196 L192.142539,86.6636971 L183.020045,86.6636971 L169.906459,116.88196 L177.318486,116.88196 L180.169265,110.610245 L194.993318,110.610245 L197.844098,116.88196 L197.844098,116.88196 Z M165.915367,116.88196 L168.766147,110.610245 L167.055679,110.610245 C161.924276,110.610245 159.073497,107.18931 159.073497,102.057906 L159.073497,101.487751 C159.073497,96.3563474 161.924276,92.935412 167.055679,92.935412 L174.467706,92.935412 L174.467706,86.6636971 L166.485523,86.6636971 C157.363029,86.6636971 152.231626,92.935412 152.231626,101.487751 L152.231626,102.057906 C152.231626,111.180401 157.363029,116.88196 165.915367,116.88196 Z M140.258352,116.88196 L147.100223,116.88196 L147.100223,87.233853 L140.258352,87.233853 L140.258352,116.88196 Z M125.434298,92.935412 C128.285078,92.935412 129.42539,94.6458797 129.42539,96.3563474 C129.42539,98.0668151 128.285078,99.7772829 125.434298,99.7772829 L116.88196,99.7772829 L116.88196,92.3652561 L125.434298,92.935412 L125.434298,92.935412 Z M116.88196,106.048998 L120.302895,106.048998 L129.42539,116.88196 L137.977728,116.88196 L127.714922,105.478842 C132.846325,104.33853 135.697105,100.917595 135.697105,96.3563474 C135.697105,90.6547884 131.706013,86.6636971 125.434298,86.6636971 L109.469933,86.6636971 L109.469933,116.88196 L116.311804,116.88196 L116.88196,106.048998 Z M104.33853,92.935412 L104.33853,86.6636971 L80.3919822,86.6636971 L80.3919822,116.88196 L104.33853,116.88196 L104.33853,110.610245 L87.233853,110.610245 L87.233853,104.33853 L103.768374,104.33853 L103.768374,98.0668151 L87.233853,98.0668151 L87.233853,92.3652561 L104.33853,92.3652561 L104.33853,92.935412 L104.33853,92.935412 Z M52.454343,116.88196 L58.7260579,116.88196 L67.2783964,92.3652561 L67.2783964,116.88196 L74.1202673,116.88196 L74.1202673,86.6636971 L62.7171492,86.6636971 L55.8752784,107.18931 L49.0334076,86.6636971 L37.6302895,86.6636971 L37.6302895,116.88196 L44.4721604,116.88196 L44.4721604,92.3652561 L52.454343,116.88196 Z M15.3942094,98.0668151 L17.674833,91.7951002 L19.9554566,98.0668151 L22.8062361,104.908686 L12.5434298,104.908686 L15.3942094,98.0668151 L15.3942094,98.0668151 Z M27.3674833,116.88196 L34.77951,116.88196 L21.6659243,86.6636971 L13.1135857,86.6636971 L0,116.88196 L7.41202673,116.88196 L10.2628062,110.610245 L25.0868597,110.610245 L27.3674833,116.88196 Z\" fill=\"#006FCF\"></path>\n </g>\n</svg>`,\n maestro: `<svg width=\"256px\" height=\"199px\" viewBox=\"0 0 256 199\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" preserveAspectRatio=\"xMidYMid\">\n\t<g>\n\t\t<polygon fill=\"#6C6BBD\" points=\"162.611457 141.314624 93.388935 141.314624 93.388935 16.9132715 162.611457 16.9132715\"></polygon>\n\t\t<path d=\"M97.782719,79.1164824 C97.782719,104.351869 109.598131,126.83083 127.997782,141.317159 C114.542597,151.910287 97.5614005,158.232967 79.1064205,158.232967 C35.4160534,158.232967 -3.86542948e-06,122.811879 -3.86542948e-06,79.1164824 C-3.86542948e-06,35.4210857 35.4160534,-1.5e-06 79.1064205,-1.5e-06 C97.5614005,-1.5e-06 114.542597,6.32267769 127.997782,16.915806 C109.598131,31.4021353 97.782719,53.8810959 97.782719,79.1164824\" fill=\"#D32011\" transform=\"translate(63.998889, 79.116483) scale(1, -1) translate(-63.998889, -79.116483) \"></path>\n\t\t<path d=\"M255.999994,79.1164824 C255.999994,35.4210857 220.583936,-1.5e-06 176.89357,-1.5e-06 C158.43859,-1.5e-06 141.457392,6.32267769 127.997178,16.915806 C146.401859,31.4021353 158.217271,53.8810959 158.217271,79.1164824 C158.217271,104.351869 146.401859,126.83083 127.997178,141.317159 C141.457392,151.910287 158.43859,158.232967 176.89357,158.232967 C220.583936,158.232967 255.999994,122.811879 255.999994,79.1164824\" fill=\"#0099DF\" transform=\"translate(191.998586, 79.116483) scale(1, -1) translate(-191.998586, -79.116483) \"></path>\n\t\t<path d=\"M186.032633,192.824108 C186.953118,192.824108 188.276002,192.648059 189.287027,192.250691 L187.878634,187.945032 C186.912878,188.3424 185.947123,188.47318 185.021607,188.47318 C182.033802,188.47318 180.539899,186.54167 180.539899,183.070986 L180.539899,171.290784 L175.967652,171.290784 L175.967652,192.295961 L180.49463,192.295961 L180.49463,189.745764 C181.681704,191.591765 183.396925,192.824108 186.032633,192.824108 L186.032633,192.824108 Z M169.141975,188.121082 L161.672461,188.121082 L161.672461,178.629518 C161.672461,176.521958 162.416898,175.113565 164.705537,175.113565 C165.892611,175.113565 167.386514,175.510933 168.744607,176.300639 L170.06246,172.392348 C168.613828,171.381323 166.330219,170.762636 164.353439,170.762636 C158.946215,170.762636 157.059974,173.664932 157.059974,178.544008 L157.059974,188.121082 L152.794555,188.121082 L152.794555,192.295961 L157.059974,192.295961 L157.059974,198.66894 L161.672461,198.66894 L161.672461,192.295961 L169.141975,192.295961 L169.141975,188.121082 L169.141975,188.121082 Z M110.64839,183.639374 C111.136298,186.672449 112.977269,188.739768 116.231663,188.739768 C119.174199,188.739768 121.065469,186.893767 121.548347,183.639374 L110.64839,183.639374 Z M126.296644,181.793373 C126.251375,188.3424 122.207274,192.824108 116.317173,192.824108 C110.165513,192.824108 105.859854,188.3424 105.859854,181.793373 C105.859854,175.118595 110.341562,170.767666 116.629032,170.767666 C119.792886,170.767666 122.690152,171.557373 125.24035,173.710202 L122.99698,177.095375 C121.241519,175.686982 118.99815,174.897276 116.89059,174.897276 C113.948055,174.897276 111.267077,176.2604 110.608151,180.037911 L126.206105,180.037911 C126.251375,180.611328 126.296644,181.179715 126.296644,181.793373 L126.296644,181.793373 Z M146.376306,186.934008 C145.103723,187.728744 142.513285,188.739768 139.832308,188.739768 C137.327381,188.739768 135.833477,187.814253 135.833477,186.275081 C135.833477,184.871717 137.41289,184.474349 139.38967,184.212791 L141.5425,183.905962 C146.114747,183.242006 148.881234,181.310495 148.881234,177.618493 C148.881234,173.619663 145.365281,170.762636 139.30416,170.762636 C135.873717,170.762636 132.709863,171.642882 130.204935,173.488883 L132.357764,177.050106 C133.896937,175.863032 136.185576,174.852006 139.34943,174.852006 C142.468015,174.852006 144.137967,175.772492 144.137967,177.402204 C144.137967,178.584248 142.950893,179.248205 140.445965,179.595273 L138.293136,179.902101 C133.590108,180.566058 131.039911,182.673618 131.039911,186.099031 C131.039911,190.273911 134.470354,192.824108 139.787038,192.824108 C143.126942,192.824108 146.160017,192.074643 148.353086,190.62601 L146.376306,186.934008 L146.376306,186.934008 Z M202.737182,188.48324 C201.796576,188.48324 200.92639,188.317251 200.116564,187.990302 C199.311768,187.658324 198.612602,187.195566 198.024094,186.602029 C197.435587,186.008492 196.972829,185.294236 196.635821,184.46429 C196.298812,183.634343 196.132824,182.718888 196.132824,181.722953 C196.132824,180.721988 196.298812,179.811562 196.635821,178.981616 C196.972829,178.15167 197.435587,177.437413 198.024094,176.843876 C198.612602,176.250339 199.311768,175.787581 200.116564,175.455603 C200.92639,175.123625 201.796576,174.962666 202.737182,174.962666 C203.677787,174.962666 204.553002,175.123625 205.357799,175.455603 C206.167624,175.787581 206.871821,176.250339 207.460329,176.843876 C208.058896,177.437413 208.521653,178.15167 208.863692,178.981616 C209.2007,179.811562 209.366689,180.721988 209.366689,181.722953 C209.366689,182.718888 209.2007,183.634343 208.863692,184.46429 C208.521653,185.294236 208.058896,186.008492 207.460329,186.602029 C206.871821,187.195566 206.167624,187.658324 205.357799,187.990302 C204.553002,188.317251 203.677787,188.48324 202.737182,188.48324 L202.737182,188.48324 Z M202.737181,192.824108 C204.366893,192.824108 205.875886,192.54243 207.264159,191.974043 C208.652432,191.410685 209.854596,190.63104 210.865621,189.640134 C211.881676,188.649229 212.671383,187.477245 213.2448,186.129211 C213.818217,184.776148 214.104926,183.307395 214.104926,181.722953 C214.104926,180.13851 213.818217,178.669758 213.2448,177.316695 C212.671383,175.968661 211.881676,174.791647 210.865621,173.800741 C209.854596,172.809836 208.652432,172.03522 207.264159,171.466833 C205.875886,170.903476 204.366893,170.621797 202.737181,170.621797 C201.107469,170.621797 199.598476,170.903476 198.210203,171.466833 C196.82193,172.03522 195.629826,172.809836 194.623831,173.800741 C193.617836,174.791647 192.828129,175.968661 192.254712,177.316695 C191.681295,178.669758 191.394586,180.13851 191.394586,181.722953 C191.394586,183.307395 191.681295,184.776148 192.254712,186.129211 C192.828129,187.477245 193.617836,188.649229 194.623831,189.640134 C195.629826,190.63104 196.82193,191.410685 198.210203,191.974043 C199.598476,192.54243 201.107469,192.824108 202.737181,192.824108 L202.737181,192.824108 Z M83.9492805,181.793373 C83.9492805,185.485375 86.368699,188.51845 90.3222595,188.51845 C94.099771,188.51845 96.6499685,185.616154 96.6499685,181.793373 C96.6499685,177.970591 94.099771,175.073325 90.3222595,175.073325 C86.368699,175.073325 83.9492805,178.101371 83.9492805,181.793373 L83.9492805,181.793373 Z M100.955627,181.793373 L100.955627,192.295961 L96.38841,192.295961 L96.38841,189.745764 C94.934747,191.637034 92.741678,192.824108 89.7538725,192.824108 C83.863771,192.824108 79.2512835,188.211621 79.2512835,181.793373 C79.2512835,175.380154 83.863771,170.762636 89.7538725,170.762636 C92.741678,170.762636 94.934747,171.949711 96.38841,173.840981 L96.38841,171.290784 L100.955627,171.290784 L100.955627,181.793373 Z M75.2071835,171.290784 L75.2071835,184.474349 C75.2071835,189.438935 72.0433285,192.778839 66.9479635,192.824108 C64.2669865,192.869379 61.49547,192.034402 59.5639595,189.086837 C58.1153265,191.415716 55.826688,192.824108 52.6175635,192.824108 C50.3792245,192.824108 48.1811252,192.165182 46.4659035,189.705524 L46.4659035,192.295961 L41.8986858,192.295961 L41.8986858,171.290784 L46.5111733,171.290784 L46.5111733,182.935177 C46.5111733,186.581909 48.5332234,188.51845 51.651808,188.51845 C54.6848835,188.51845 56.224056,186.54167 56.224056,182.980446 L56.224056,171.290784 L60.8365435,171.290784 L60.8365435,182.935177 C60.8365435,186.581909 62.949133,188.51845 65.9771785,188.51845 C69.100793,188.51845 70.594696,186.54167 70.594696,182.980446 L70.594696,171.290784 L75.2071835,171.290784 L75.2071835,171.290784 Z\" fill=\"#110F0D\" transform=\"translate(128.001806, 184.645368) scale(1, -1) translate(-128.001806, -184.645368) \"></path>\n\t</g>\n</svg>`,\n discover: `<svg width=\"512px\" height=\"86px\" viewBox=\"0 0 512 86\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" preserveAspectRatio=\"xMidYMid\">\n <defs>\n <linearGradient x1=\"19.4143743%\" y1=\"9.06316954%\" x2=\"88.6006499%\" y2=\"80.4988417%\" id=\"discover-linearGradient-1\">\n <stop stop-color=\"#F34F26\" offset=\"0%\"></stop>\n <stop stop-color=\"#F69E35\" offset=\"100%\"></stop>\n </linearGradient>\n <path d=\"M270.356257,0.364742204 C246.374007,0.364742204 226.91662,19.0997905 226.91662,42.2224896 C226.91662,66.805636 245.528651,85.1826697 270.356257,85.1826697 C294.56404,85.1826697 313.677606,66.5627539 313.677606,42.7050996 C313.677606,18.9893895 294.69179,0.364742204 270.356257,0.364742204 Z\" id=\"discover-path-2\"></path>\n <filter x=\"-50%\" y=\"-50%\" width=\"200%\" height=\"200%\" filterUnits=\"objectBoundingBox\" id=\"discover-filter-3\">\n <feMorphology radius=\"1\" operator=\"erode\" in=\"SourceAlpha\" result=\"shadowSpreadInner1\"></feMorphology>\n <feGaussianBlur stdDeviation=\"4\" in=\"shadowSpreadInner1\" result=\"shadowBlurInner1\"></feGaussianBlur>\n <feOffset dx=\"3\" dy=\"3\" in=\"shadowBlurInner1\" result=\"shadowOffsetInner1\"></feOffset>\n <feComposite in=\"shadowOffsetInner1\" in2=\"SourceAlpha\" operator=\"arithmetic\" k2=\"-1\" k3=\"1\" result=\"shadowInnerInner1\"></feComposite>\n <feColorMatrix values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.5 0\" type=\"matrix\" in=\"shadowInnerInner1\"></feColorMatrix>\n </filter>\n </defs>\n <g>\n\t\t<g>\n\t\t\t<use fill=\"url(#discover-linearGradient-1)\" fill-rule=\"evenodd\" xlink:href=\"#discover-path-2\"></use>\n\t\t\t<use fill=\"black\" fill-opacity=\"1\" filter=\"url(#discover-filter-3)\" xlink:href=\"#discover-path-2\"></use>\n\t\t</g>\n\t\t<path d=\"M23.7456761,1.8914302 L0.392712098,1.8914302 L0.392712098,83.3452818 L23.6242351,83.3452818 C35.9497171,83.3452818 44.8638087,80.424387 52.6833531,73.947003 C61.9617679,66.2520539 67.4644687,54.6489097 67.4644687,42.6577848 C67.4644687,18.6092946 49.4990731,1.8914302 23.7456761,1.8914302 Z M42.3182772,63.0677739 C37.2966092,67.598946 30.8318426,69.5561979 20.5582417,69.5561979 L16.2904548,69.5561979 L16.2904548,15.6836683 L20.5582417,15.6836683 C30.8318426,15.6836683 37.0489955,17.5179019 42.3182772,22.2761847 C47.8130922,27.1622172 51.0904245,34.7278394 51.0904245,42.5410752 C51.0904245,50.3700827 47.8130922,58.2006673 42.3182772,63.0677739 Z M74.7982489,83.3452818 L90.66918,83.3452818 L90.66918,1.8914302 L74.7982489,1.8914302 L74.7982489,83.3452818 Z M129.525598,33.136488 C119.986952,29.6020791 117.179612,27.271041 117.179612,22.8896988 C117.179612,17.7560527 122.177623,13.8510119 129.028793,13.8510119 C133.791807,13.8510119 137.700002,15.8035322 141.865274,20.430911 L150.159543,9.57849352 C143.32099,3.58056537 135.138699,0.531920849 126.213568,0.531920849 C111.815701,0.531920849 100.815031,10.5515994 100.815031,23.8517646 C100.815031,35.0984713 105.940791,40.8330142 120.846503,46.2205826 C127.079427,48.4080994 130.247935,49.8669696 131.839287,50.8637328 C135.014104,52.9408486 136.60861,55.8617434 136.60861,59.2794427 C136.60861,65.8845763 131.351945,70.762723 124.257894,70.762723 C116.684385,70.762723 110.583942,66.9807005 106.917052,59.8976883 L96.6702625,69.8022343 C103.98354,80.534788 112.779344,85.3135737 124.884025,85.3135737 C141.371624,85.3135737 152.968459,74.3065948 152.968459,58.5555276 C152.968459,45.6070685 147.607703,39.7400445 129.525598,33.136488 Z M157.974356,42.6577848 C157.974356,66.6226858 176.78984,85.1826697 200.980274,85.1826697 C207.818827,85.1826697 213.681119,83.8310461 220.895035,80.424387 L220.895035,61.7271904 C214.534361,68.0847103 208.91495,70.6428591 201.705766,70.6428591 C185.708663,70.6428591 174.342092,59.0365605 174.342092,42.5410752 C174.342092,26.9146035 186.063522,14.5765041 200.980274,14.5765041 C208.541165,14.5765041 214.291478,17.2624025 220.895035,23.735055 L220.895035,5.03943561 C213.933464,1.50818104 208.18315,0.0540422711 201.34302,0.0540422711 C177.275604,0.0540422711 157.974356,18.9893895 157.974356,42.6577848 Z M349.625746,56.6061616 L327.883059,1.8914302 L310.537486,1.8914302 L345.116654,85.4255519 L353.660114,85.4255519 L388.843332,1.8914302 L371.625509,1.8914302 L349.625746,56.6061616 Z M396.065135,83.3452818 L441.130819,83.3452818 L441.130819,69.5561979 L411.942374,69.5561979 L411.942374,47.5548575 L440.014192,47.5548575 L440.014192,33.7626193 L411.942374,33.7626193 L411.942374,15.6836683 L441.130819,15.6836683 L441.130819,1.8914302 L396.065135,1.8914302 L396.065135,83.3452818 Z M504.019955,25.9304575 C504.019955,10.6714633 493.530284,1.8914302 475.19741,1.8914302 L451.62049,1.8914302 L451.62049,83.3452818 L467.515079,83.3452818 L467.515079,50.6082334 L469.595349,50.6082334 L491.569878,83.3452818 L511.114007,83.3452818 L485.447354,49.0342307 C497.435324,46.5833287 504.019955,38.3963067 504.019955,25.9304575 Z M472.137726,39.3820298 L467.515079,39.3820298 L467.515079,14.6995224 L472.391648,14.6995224 C482.307234,14.6995224 487.679032,18.864794 487.679032,26.7915853 C487.679032,34.9691444 482.307234,39.3820298 472.137726,39.3820298 Z\" fill=\"#0B1015\"></path>\n\t</g>\n</svg>`,\n jcb: `<svg width=\"256px\" height=\"198px\" viewBox=\"0 0 256 198\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" preserveAspectRatio=\"xMidYMid\">\n <defs>\n <linearGradient x1=\"-57.5270968%\" y1=\"50.1241953%\" x2=\"232.39121%\" y2=\"50.1241953%\" id=\"jcb-linearGradient-1\">\n <stop stop-color=\"#007940\" offset=\"0%\"></stop>\n <stop stop-color=\"#00873F\" offset=\"22.85%\"></stop>\n <stop stop-color=\"#40A737\" offset=\"74.33%\"></stop>\n <stop stop-color=\"#5CB531\" offset=\"100%\"></stop>\n </linearGradient>\n <linearGradient x1=\"0.182516704%\" y1=\"49.95997%\" x2=\"100.273441%\" y2=\"49.95997%\" id=\"jcb-linearGradient-2\">\n <stop stop-color=\"#007940\" offset=\"0%\"></stop>\n <stop stop-color=\"#00873F\" offset=\"22.85%\"></stop>\n <stop stop-color=\"#40A737\" offset=\"74.33%\"></stop>\n <stop stop-color=\"#5CB531\" offset=\"100%\"></stop>\n </linearGradient>\n <linearGradient x1=\"-62.8015845%\" y1=\"49.8578253%\" x2=\"253.671294%\" y2=\"49.8578253%\" id=\"jcb-linearGradient-3\">\n <stop stop-color=\"#007940\" offset=\"0%\"></stop>\n <stop stop-color=\"#00873F\" offset=\"22.85%\"></stop>\n <stop stop-color=\"#40A737\" offset=\"74.33%\"></stop>\n <stop stop-color=\"#5CB531\" offset=\"100%\"></stop>\n </linearGradient>\n <linearGradient x1=\"0.175556793%\" y1=\"50.0058048%\" x2=\"101.808162%\" y2=\"50.0058048%\" id=\"jcb-linearGradient-4\">\n <stop stop-color=\"#1F286F\" offset=\"0%\"></stop>\n <stop stop-color=\"#004E94\" offset=\"47.51%\"></stop>\n <stop stop-color=\"#0066B1\" offset=\"82.61%\"></stop>\n <stop stop-color=\"#006FBC\" offset=\"100%\"></stop>\n </linearGradient>\n <linearGradient x1=\"-0.575855512%\" y1=\"49.9142191%\" x2=\"98.13299%\" y2=\"49.9142191%\" id=\"jcb-linearGradient-5\">\n <stop stop-color=\"#6C2C2F\" offset=\"0%\"></stop>\n <stop stop-color=\"#882730\" offset=\"17.35%\"></stop>\n <stop stop-color=\"#BE1833\" offset=\"57.31%\"></stop>\n <stop stop-color=\"#DC0436\" offset=\"85.85%\"></stop>\n <stop stop-color=\"#E60039\" offset=\"100%\"></stop>\n </linearGradient>\n </defs>\n\t<g>\n\t\t<path d=\"M256.000001,157.418094 C256.000001,179.325184 238.16137,197.163815 216.254279,197.163815 L-3.43623867e-08,197.163815 L-3.43623867e-08,39.7457218 C-3.43623867e-08,17.8386312 17.8386309,3.69395977e-07 39.7457214,3.69395977e-07 L256.000001,3.69395977e-07 L256.000001,157.418094 Z\" fill=\"#FFFFFF\"></path>\n\t\t<path d=\"M185.584353,117.046455 L202.01467,117.046455 C202.484108,117.046455 203.579463,116.889977 204.048901,116.889977 C207.178485,116.26406 209.838631,113.447434 209.838631,109.535453 C209.838631,105.779952 207.178485,102.963326 204.048901,102.18093 C203.579463,102.024451 202.640588,102.024451 202.01467,102.024451 L185.584353,102.024451 L185.584353,117.046455 Z\" fill=\"url(#jcb-linearGradient-1)\"></path>\n\t\t<path d=\"M200.13692,13.3007339 C184.488999,13.3007339 171.657702,25.9755506 171.657702,41.7799516 L171.657702,71.354524 L211.872861,71.354524 C212.811737,71.354524 213.907092,71.354524 214.689488,71.511003 C223.765282,71.980441 230.493888,76.6748175 230.493888,84.8117365 C230.493888,91.2273845 225.955991,96.7041575 217.506113,97.799512 L217.506113,98.11247 C226.738387,98.738387 233.779952,103.902201 233.779952,111.882641 C233.779952,120.488998 225.955991,126.122251 215.628363,126.122251 L171.501223,126.122251 L171.501223,184.019561 L213.281174,184.019561 C228.929097,184.019561 241.760392,171.344744 241.760392,155.540344 L241.760392,13.3007339 L200.13692,13.3007339 L200.13692,13.3007339 Z\" fill=\"url(#jcb-linearGradient-2)\"></path>\n\t\t<path d=\"M207.804402,86.6894875 C207.804402,82.933986 205.144255,80.4303185 202.01467,79.960881 C201.701713,79.960881 200.919316,79.8044015 200.449879,79.8044015 L185.584353,79.8044015 L185.584353,93.574573 L200.449879,93.574573 C200.919316,93.574573 201.858192,93.574573 202.01467,93.4180935 C205.144255,92.948656 207.804402,90.4449885 207.804402,86.6894875 L207.804402,86.6894875 Z\" fill=\"url(#jcb-linearGradient-3)\"></path>\n\t\t<path d=\"M42.7188266,13.3007339 C27.0709047,13.3007339 14.2396088,25.9755506 14.2396088,41.7799516 L14.2396088,112.03912 C22.2200489,115.951101 30.5134475,118.454768 38.8068461,118.454768 C48.6650368,118.454768 53.9853305,112.508558 53.9853305,104.371639 L53.9853305,71.1980445 L78.3960885,71.1980445 L78.3960885,104.215159 C78.3960885,117.046455 70.415648,127.530563 43.3447434,127.530563 C26.9144255,127.530563 14.0831296,123.931541 14.0831296,123.931541 L14.0831296,183.863082 L55.863081,183.863082 C71.5110025,183.863082 84.3422985,171.188265 84.3422985,155.383864 L84.3422985,13.3007339 L42.7188266,13.3007339 L42.7188266,13.3007339 Z\" fill=\"url(#jcb-linearGradient-4)\"></path>\n\t\t<path d=\"M121.427874,13.3007339 C105.779951,13.3007339 92.9486555,25.9755506 92.9486555,41.7799517 L92.9486555,79.0220055 C100.146699,72.919316 112.665037,69.0073355 132.850856,69.946211 C143.647922,70.4156485 155.227384,73.3887535 155.227384,73.3887535 L155.227384,85.4376535 C149.437654,82.4645485 142.552568,79.8044015 133.633252,79.178485 C118.298289,78.0831305 109.066015,85.594133 109.066015,98.738387 C109.066015,112.03912 118.298289,119.550123 133.633252,118.298289 C142.552568,117.672372 149.437654,114.855746 155.227384,112.03912 L155.227384,124.08802 C155.227384,124.08802 143.804402,127.061126 132.850856,127.530563 C112.665037,128.469438 100.146699,124.557458 92.9486555,118.454768 L92.9486555,184.17604 L134.728607,184.17604 C150.376529,184.17604 163.207824,171.501223 163.207824,155.696822 L163.207824,13.3007339 L121.427874,13.3007339 L121.427874,13.3007339 Z\" fill=\"url(#jcb-linearGradient-5)\"></path>\n\t</g>\n</svg>`,\n unionpay: `<svg width=\"256px\" height=\"160px\" viewBox=\"0 0 256 160\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" preserveAspectRatio=\"xMidYMid\">\n\t<g>\n\t\t<path d=\"M50.041631,0.000667563305 L113.820211,0.000667563305 C122.723127,0.000667563305 128.260438,7.25731345 126.183558,16.1897657 L96.4900715,143.675416 C94.3945365,152.576777 85.480739,159.839641 76.571605,159.839641 L12.7992433,159.839641 C3.908764,159.839641 -1.64098444,152.576777 0.435896208,143.675416 L30.1418186,16.1897657 C32.2186993,7.25731345 41.1278333,0.000667563305 50.041631,0.000667563305\" fill=\"#E21836\"></path>\n\t\t<path d=\"M108.513283,0.000667563305 L181.857018,0.000667563305 C190.758378,0.000667563305 186.744527,7.25731345 184.650546,16.1897657 L154.961724,143.675416 C152.878625,152.576777 153.528427,159.839641 144.608411,159.839641 L71.2646775,159.839641 C62.3446615,159.839641 56.8244495,152.576777 58.919985,143.675416 L88.6072525,16.1897657 C90.715224,7.25731345 99.6057035,0.000667563305 108.513283,0.000667563305\" fill=\"#00447C\"></path>\n\t\t<path d=\"M178.94783,0.000667563305 L242.726409,0.000667563305 C251.641762,0.000667563305 257.179074,7.25731345 255.085093,16.1897657 L225.396271,143.675416 C223.300736,152.576777 214.380719,159.839641 205.466922,159.839641 L141.717879,159.839641 C132.797863,159.839641 127.265215,152.576777 129.354532,143.675416 L159.048017,16.1897657 C161.124899,7.25731345 170.027814,0.000667563305 178.94783,0.000667563305\" fill=\"#007B84\"></path>\n\t\t<path d=\"M66.698338,40.8561434 C60.139686,40.9229891 58.202715,40.8561434 57.5840035,40.7100156 C57.346157,41.8401744 52.920349,62.256098 52.9079125,62.273198 C51.9549725,66.403641 51.261643,69.347961 48.9064975,71.2491775 C47.5695833,72.3544635 46.0088137,72.8876745 44.1993159,72.8876745 C41.2907503,72.8876745 39.5962892,71.4434965 39.3118063,68.704377 L39.2573971,67.7638735 C39.2573971,67.7638735 40.1434913,62.231225 40.1434913,62.200134 C40.1434913,62.200134 44.7884909,43.5952629 45.6201759,41.1359627 C45.6637033,40.9960531 45.6761397,40.9229891 45.6870215,40.8561434 C36.6457507,40.9354255 35.0430082,40.8561434 34.9326351,40.7100156 C34.8720075,40.9105527 34.6481522,42.0640298 34.6481522,42.0640298 L29.9052159,63.0333735 L29.4979234,64.8117805 L28.7097659,70.6289115 C28.7097659,72.3544635 29.0486581,73.762887 29.7233334,74.9536735 C31.8841598,78.729679 38.0479561,79.2955355 41.5348148,79.2955355 C46.0274683,79.2955355 50.241857,78.341041 53.089795,76.598389 C58.0332685,73.677387 59.3266555,69.1116695 60.4801325,65.0542905 L61.014898,62.972746 C61.014898,62.972746 65.7998075,43.6496723 66.6128375,41.1359627 C66.643929,40.9960531 66.656365,40.9229891 66.698338,40.8561434 Z M82.9786885,56.444252 C81.825211,56.444252 79.7172395,56.724071 77.823796,57.6521385 C77.1366845,58.0050215 76.486882,58.412314 75.8013245,58.818052 L76.420036,56.5841615 L76.081144,56.20796 C72.0657375,57.0209905 71.167207,57.129809 67.4580475,57.6521385 L67.147137,57.8588935 C66.7165265,61.4296985 66.3341065,64.1144085 64.7375825,71.133208 C64.129753,73.7199815 63.498605,76.331628 62.8659025,78.912183 L63.036903,79.2401935 C66.8377815,79.0396565 67.9912585,79.0396565 71.29468,79.0940655 L71.562063,78.8033645 C71.981792,76.65342 72.036201,76.1497455 72.965823,71.795447 C73.402652,69.7310025 74.313619,65.1948215 74.7628845,63.579643 C75.588351,63.197223 76.402936,62.8210215 77.1802115,62.8210215 C79.0316825,62.8210215 78.8062725,64.4362005 78.734763,65.079785 C78.655481,66.160198 77.9808055,69.68903 77.2890305,72.7188505 L76.8273285,74.674476 C76.5055365,76.1186545 76.152653,77.522414 75.830861,78.954156 L75.9707705,79.2401935 C79.7172395,79.0396565 80.859835,79.0396565 84.0591015,79.0940655 L84.435303,78.8033645 C85.013596,75.4455335 85.183042,74.547003 86.209046,69.6579385 L86.725157,67.411612 C87.727843,63.0153405 88.2315175,60.786114 87.4728965,58.970398 C86.670748,56.93549 84.7462135,56.444252 82.9786885,56.444252 Z M101.165696,61.047123 C99.1743155,61.429543 97.904247,61.684489 96.6419515,61.8492715 C95.3905375,62.049809 94.1702145,62.2316915 92.24568,62.499074 L92.093334,62.637429 L91.9534245,62.7478025 C91.7528875,64.181099 91.6129775,65.420076 91.3471495,66.876691 C91.1217395,68.383051 90.7750745,70.094612 90.2107725,72.5539125 C89.7739435,74.436474 89.5485335,75.092495 89.299805,75.754734 C89.057295,76.4169725 88.7899125,77.060557 88.298674,78.9120275 L88.413711,79.0830285 L88.510093,79.240038 C90.308709,79.1545375 91.4855045,79.09391 92.6949455,79.0830285 C93.902832,79.039501 95.1542455,79.0830285 97.0912165,79.09391 L97.260663,78.955555 L97.4425455,78.803209 C97.7223645,77.133621 97.7643375,76.6843555 97.935338,75.8697705 C98.104784,74.9961125 98.39704,73.786672 99.113688,70.556314 C99.4525805,69.039072 99.8303365,67.5264935 100.181665,65.97816 C100.546985,64.436045 100.929404,62.9172485 101.293169,61.4000065 L101.23876,61.2165695 L101.165696,61.047123 Z M101.208135,54.841043 C99.3986375,53.7730665 96.222689,54.1119585 94.0851805,55.587228 C91.953891,57.0329605 91.711381,59.0849685 93.5146605,60.166936 C95.293067,61.2053765 98.481452,60.896021 100.600305,59.408315 C102.726932,57.9314915 102.99276,55.898138 101.208135,54.841043 Z M112.151399,79.574733 C115.812368,79.574733 119.565055,78.565829 122.389675,75.571763 C124.562938,73.143554 125.559405,69.5307765 125.904516,68.043071 C127.028457,63.112034 126.153244,60.809743 125.054176,59.407538 C123.384588,57.2700295 120.43405,56.5844725 117.373138,56.5844725 C115.532549,56.5844725 111.148714,56.766355 107.724038,59.923649 C105.264737,62.2010665 104.12836,65.291515 103.442803,68.2544895 C102.751028,71.2734285 101.955097,76.70814 106.95298,78.7306115 C108.495095,79.3928505 110.718104,79.574733 112.151399,79.574733 Z M111.865362,68.4798995 C112.709484,64.7458675 113.705951,61.6118915 116.249197,61.6118915 C118.242132,61.6118915 118.386705,63.943719 117.500611,67.6901875 C117.342047,68.5218725 116.614517,71.6138755 115.630486,72.9305805 C114.943374,73.902175 114.130344,74.49135 113.231813,74.49135 C112.96443,74.49135 111.374124,74.49135 111.349251,72.1299865 C111.336815,70.964073 111.574661,69.7732865 111.865362,68.4798995 Z M135.05616,79.094532 L135.342197,78.803831 C135.747935,76.6538865 135.814781,76.148657 136.713312,71.7959135 C137.162577,69.731469 138.092198,65.195288 138.529028,63.580109 C139.356049,63.196135 140.156643,62.8199335 140.958791,62.8199335 C142.797825,62.8199335 142.57397,64.4351125 142.500907,65.0786965 C142.43406,66.1606645 141.759386,69.6879415 141.055173,72.717762 L140.618345,74.673388 C140.284116,76.1191205 139.920351,77.521326 139.598559,78.9546225 L139.738469,79.24066 C143.497374,79.0401225 144.596441,79.0401225 147.814363,79.094532 L148.203001,78.803831 C148.767303,75.4444455 148.919649,74.5459145 149.976744,69.658405 L150.480419,67.410524 C151.487768,63.0142525 151.99766,60.7865805 151.251476,58.9708645 C150.426009,56.9359565 148.489038,56.4447185 146.746386,56.4447185 C145.591354,56.4447185 143.472501,56.722983 141.589939,57.652605 C140.916819,58.005488 140.242143,58.411226 139.579904,58.8185185 L140.156643,56.584628 L139.847287,56.206872 C135.833436,57.021457 134.91625,57.1302755 131.211754,57.652605 L130.927271,57.85936 C130.478006,61.4301645 130.112686,64.1133205 128.516162,71.1336745 C127.908333,73.720448 127.277185,76.332094 126.646037,78.9126495 L126.815483,79.24066 C130.622579,79.0401225 131.758957,79.0401225 135.05616,79.094532 Z M162.673542,79.2398825 C162.909834,78.0864055 164.313594,71.2494885 164.32603,71.2494885 C164.32603,71.2494885 165.52148,66.232951 165.594545,66.0510685 C165.594545,66.0510685 165.970746,65.5287395 166.346947,65.321984 L166.900367,65.321984 C172.122106,65.321984 178.018519,65.321984 182.6402,61.92218 C185.785058,59.590353 187.935002,56.1470215 188.89416,51.9621695 C189.142889,50.9361655 189.326326,49.7158426 189.326326,48.4955199 C189.326326,46.8927774 189.004534,45.3071349 188.074912,44.0681575 C185.718212,40.770954 181.025022,40.7103265 175.60741,40.6854536 C175.59031,40.6854536 172.93669,40.7103265 172.93669,40.7103265 C166.001837,40.7958268 163.220744,40.770954 162.078149,40.6310444 C161.981767,41.1362735 161.799884,42.0348043 161.799884,42.0348043 C161.799884,42.0348043 159.315711,53.547812 159.315711,53.5664665 C159.315711,53.5664665 153.371107,78.0444325 153.091287,79.1979095 C159.146265,79.124846 161.628884,79.124846 162.673542,79.2398825 Z M167.276569,58.7882045 C167.276569,58.7882045 169.917752,47.2985153 169.905316,47.3420427 L169.990815,46.7528678 L170.028125,46.3036024 L171.083665,46.4124209 C171.083665,46.4124209 176.530813,46.8803409 176.658287,46.8927774 C178.808231,47.7244624 179.694325,49.8681887 179.075614,52.666381 C178.511312,55.223618 176.852606,57.373563 174.721316,58.412003 C172.966227,59.291879 170.816282,59.364943 168.601047,59.364943 L167.167751,59.364943 L167.276569,58.7882045 Z M183.721236,68.692718 C183.023242,71.668129 182.221093,77.102841 187.194103,79.039812 C188.779745,79.714487 190.200605,79.915024 191.644784,79.8419605 C193.169799,79.759569 194.582886,78.99473 195.891818,77.8941075 C195.773673,78.346482 195.655527,78.7988565 195.537381,79.2527855 L195.76279,79.5434865 C199.339813,79.392695 200.449763,79.392695 204.325259,79.4222315 L204.676588,79.1548485 C205.242445,75.8281085 205.775656,72.597751 207.246262,66.2334175 C207.962909,63.184942 208.678003,60.1660035 209.413306,57.1299645 L209.29827,56.795736 C205.296854,57.537257 204.227323,57.6958215 200.378253,58.241469 L200.085998,58.479315 C200.047134,58.788671 200.006716,59.08559 199.969406,59.3825095 C199.370904,58.4155785 198.503465,57.590112 197.164996,57.0755555 C195.453434,56.4024345 191.433365,57.269874 187.977597,60.416286 C185.549388,62.662613 184.383475,65.7406245 183.721236,68.692718 Z M192.12514,68.8746005 C192.981698,65.2074135 193.965729,62.104529 196.515194,62.104529 C198.127263,62.104529 198.976048,63.5922345 198.803493,66.1292625 C198.666693,66.761965 198.51901,67.4288675 198.343345,68.182825 C198.0884,69.2725655 197.811689,70.3529785 197.542752,71.4349465 C197.26915,72.174913 196.950468,72.8729065 196.600694,73.3377175 C195.944673,74.267339 194.383904,74.8440775 193.485373,74.8440775 C193.230426,74.8440775 191.65722,74.8440775 191.602811,72.524687 C191.590374,71.3696555 191.828221,70.1804235 192.12514,68.8746005 Z M236.010903,56.766044 L235.701548,56.413161 C231.742105,57.2153095 231.025456,57.3427825 227.387807,57.834021 L227.120423,58.1014035 C227.107988,58.144931 227.097105,58.211777 227.078451,58.2724045 L227.066014,58.211777 C224.357986,64.459519 224.437268,63.111723 222.232914,68.0303235 C222.220477,67.806468 222.220477,67.6665585 222.208042,67.428712 L221.656175,56.766044 L221.30951,56.413161 C217.161968,57.2153095 217.064031,57.3427825 213.233616,57.834021 L212.935143,58.1014035 C212.893169,58.228877 212.893169,58.3687865 212.868297,58.5211325 L212.893169,58.575542 C213.371971,61.022406 213.256934,60.4767585 213.737291,64.338264 C213.961146,66.233262 214.25962,68.139142 214.483475,70.010822 C214.861232,73.143243 215.072651,74.685358 215.534352,79.4656035 C212.947578,83.7344015 212.335085,85.3495805 209.844694,89.0960495 L209.861794,89.1333585 L208.10826,91.906678 C207.907723,92.198934 207.725841,92.399471 207.470894,92.4849715 C207.191075,92.6233265 206.82731,92.648199 206.32208,92.648199 L205.350486,92.648199 L203.906308,97.451763 L208.860663,97.5372635 C211.769228,97.524827 213.597381,96.1645945 214.581412,94.336442 L217.696733,88.9981125 L217.646987,88.9981125 L217.974998,88.621911 C220.070533,84.110603 236.010903,56.766044 236.010903,56.766044 Z M183.72108,119.853625 L181.619326,119.853625 L189.398302,94.1242455 L191.978857,94.1242455 L192.798105,91.4737355 L192.877387,94.421165 C192.781005,96.243099 194.214302,97.858278 197.979425,97.5908955 L202.333723,97.5908955 L203.832311,92.63654 L202.193814,92.63654 C201.251756,92.63654 200.814927,92.3986935 200.869337,91.888801 L200.790054,88.890071 L192.726596,88.890071 L192.726596,88.9056165 C190.119614,88.960026 182.33442,89.1558995 180.758105,89.5756285 C178.850671,90.0668665 176.840635,91.5125995 176.840635,91.5125995 L177.630347,88.85898 L170.087664,88.85898 L168.516013,94.1242455 L160.632883,120.246927 L159.103204,120.246927 L157.603062,125.165528 L172.626247,125.165528 L172.122572,126.805579 L179.525345,126.805579 L180.016584,125.165528 L182.093465,125.165528 L183.72108,119.853625 Z M177.557284,99.352202 C176.349398,99.6864305 174.101516,100.699998 174.101516,100.699998 L176.100669,94.1242455 L182.093465,94.1242455 L180.647732,98.915373 C180.647732,98.915373 178.796261,99.0241915 177.557284,99.352202 Z M177.672321,108.746356 C177.672321,108.746356 175.789759,108.982648 174.550781,109.262467 C173.330458,109.632451 171.042159,110.798364 171.042159,110.798364 L173.106603,103.955229 L179.13049,103.955229 L177.672321,108.746356 Z M174.31449,119.914253 L168.30304,119.914253 L170.045692,114.139095 L176.038487,114.139095 L174.31449,119.914253 Z M188.791404,103.955229 L197.456474,103.955229 L196.211278,107.987735 L187.431173,107.987735 L186.112912,112.396443 L193.795505,112.396443 L187.978375,120.587374 C187.571082,121.188986 187.205762,121.401959 186.800025,121.571405 C186.392732,121.77816 185.857967,122.02067 185.239255,122.02067 L183.107965,122.02067 L181.643577,126.849107 L187.218198,126.849107 C190.115882,126.849107 191.827443,125.530847 193.091294,123.800631 L197.080273,118.341047 L197.936831,123.884578 C198.118713,124.923017 198.864898,125.530847 199.370127,125.767139 C199.928211,126.046958 200.50495,126.527315 201.319535,126.598824 C202.193192,126.636133 202.82434,126.66567 203.244069,126.66567 L205.983189,126.66567 L207.627904,121.262049 L206.547491,121.262049 C205.927224,121.262049 204.859248,121.157894 204.677366,120.963575 C204.495483,120.727283 204.495483,120.363518 204.397546,119.810098 L203.528552,114.254131 L199.970183,114.254131 L201.530954,112.396443 L210.293959,112.396443 L211.641755,107.987735 L203.528552,107.987735 L204.792402,103.955229 L212.880733,103.955229 L214.380875,98.982219 L190.266674,98.982219 L188.791404,103.955229 Z M115.605924,121.037106 L117.628395,114.309008 L125.940582,114.309008 L127.459378,109.304907 L119.139419,109.304907 L120.409488,105.163582 L128.539791,105.163582 L130.046152,100.318045 L109.703292,100.318045 L108.228023,105.163582 L112.849704,105.163582 L111.616945,109.304907 L106.982827,109.304907 L105.446931,114.394508 L110.067057,114.394508 L107.371465,123.295869 C107.0077,124.474219 107.542466,124.923484 107.881358,125.470686 C108.228023,126.003897 108.579352,126.35678 109.369064,126.557317 C110.183649,126.7392 110.741733,126.848018 111.500354,126.848018 L120.87119,126.848018 L122.540778,121.304488 L118.387016,121.875009 C117.584868,121.875009 115.363414,121.778627 115.605924,121.037106 Z M116.55933,88.8286665 L114.452913,92.635763 C114.002093,93.4674475 113.596355,93.983559 113.231036,94.221405 C112.909244,94.4219425 112.271878,94.505888 111.348474,94.505888 L110.249406,94.505888 L108.780355,99.3762975 L112.430442,99.3762975 C114.18553,99.3762975 115.533326,98.7327135 116.176911,98.410921 C116.868686,98.040938 117.050568,98.252357 117.585334,97.736246 L118.818094,96.668269 L130.216064,96.668269 L131.728643,91.5973225 L123.385365,91.5973225 L124.84198,88.8286665 L116.55933,88.8286665 Z M133.386416,121.134887 C133.192097,120.855067 133.332007,120.362275 133.628926,119.336271 L136.744247,109.024932 L147.826644,109.024932 C149.441823,109.001614 150.607736,108.982959 151.366357,108.92855 C152.180942,108.843049 153.067037,108.552348 154.032413,108.030019 C155.028881,107.482817 155.538773,106.906078 155.969384,106.243839 C156.44974,105.583155 157.220798,104.137422 157.883037,101.908196 L161.798952,88.859291 L150.298381,88.926137 C150.298381,88.926137 146.757113,89.448466 145.197898,90.0252045 C143.624692,90.668789 141.37681,92.4658505 141.37681,92.4658505 L142.415251,88.8888275 L135.31095,88.8888275 L125.364931,121.874854 C125.012048,123.155803 124.775756,124.085425 124.721347,124.643509 C124.702692,125.245121 125.479968,125.840514 125.983643,126.289779 C126.579036,126.739045 127.458911,126.665981 128.303033,126.739045 C129.190682,126.805891 130.452978,126.847863 132.195629,126.847863 L137.655214,126.847863 L139.33102,121.189296 L134.443511,121.650998 C133.921182,121.650998 133.543426,121.371178 133.386416,121.134887 Z M138.754282,102.060541 L150.394763,102.060541 L149.654797,104.379932 C149.550642,104.434341 149.301913,104.264895 148.117345,104.404805 L138.037634,104.404805 L138.754282,102.060541 Z M141.086109,94.2815665 L152.824526,94.2815665 L151.980405,97.075095 C151.980405,97.075095 146.447757,97.020686 145.561663,97.1839135 C141.662847,97.858589 139.38543,99.941688 139.38543,99.941688 L141.086109,94.2815665 Z M149.915339,112.146937 C149.818957,112.493602 149.666611,112.705021 149.453638,112.863585 C149.217345,113.015931 148.834926,113.07034 148.264406,113.07034 L146.605699,113.07034 L146.703636,110.245721 L139.804537,110.245721 L139.524718,124.054801 C139.513836,125.051268 139.610218,125.628007 140.339303,126.089709 C141.068387,126.666447 143.314714,126.739511 146.338316,126.739511 L150.661524,126.739511 L152.222294,121.570628 L148.458724,121.777383 L147.207311,121.850447 C147.03631,121.777383 146.873082,121.710537 146.6912,121.528655 C146.532635,121.371645 146.265253,121.468028 146.30878,120.47156 L146.338316,116.931847 L150.285323,116.768619 C152.416613,116.768619 153.32758,116.075288 154.104855,115.414604 C154.846376,114.781902 155.088886,114.054372 155.368706,113.07034 L156.030945,109.936365 L150.607114,109.936365 L149.915339,112.146937 Z\" fill=\"#FEFEFE\"></path>\n\t</g>\n</svg>`,\n paypal: `<svg width=\"256px\" height=\"302px\" viewBox=\"0 0 256 302\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" preserveAspectRatio=\"xMidYMid\">\n\t<g>\n\t\t<path d=\"M217.168476,23.5070146 C203.234077,7.62479651 178.045612,0.815753338 145.823355,0.815753338 L52.3030619,0.815753338 C45.7104431,0.815753338 40.1083819,5.6103852 39.0762042,12.1114399 L0.136468302,259.076601 C-0.637664968,263.946149 3.13311322,268.357876 8.06925331,268.357876 L65.804612,268.357876 L80.3050438,176.385849 L79.8555471,179.265958 C80.8877248,172.764903 86.4481659,167.970272 93.0324607,167.970272 L120.46841,167.970272 C174.366398,167.970272 216.569147,146.078116 228.897012,82.7490197 C229.263268,80.8761167 229.579581,79.0531577 229.854273,77.2718188 C228.297683,76.4477414 228.297683,76.4477414 229.854273,77.2718188 C233.525163,53.8646924 229.829301,37.9325302 217.168476,23.5070146\" fill=\"#27346A\"></path>\n\t\t<path d=\"M102.396976,68.8395929 C103.936919,68.1070797 105.651665,67.699203 107.449652,67.699203 L180.767565,67.699203 C189.449511,67.699203 197.548776,68.265236 204.948824,69.4555699 C207.071448,69.7968545 209.127479,70.1880831 211.125242,70.6375799 C213.123006,71.0787526 215.062501,71.5781934 216.943728,72.1275783 C217.884341,72.4022708 218.808307,72.6852872 219.715624,72.9849517 C223.353218,74.2002577 226.741092,75.61534 229.854273,77.2718188 C233.525163,53.8563683 229.829301,37.9325302 217.168476,23.5070146 C203.225753,7.62479651 178.045612,0.815753338 145.823355,0.815753338 L52.2947379,0.815753338 C45.7104431,0.815753338 40.1083819,5.6103852 39.0762042,12.1114399 L0.136468302,259.068277 C-0.637664968,263.946149 3.13311322,268.349552 8.0609293,268.349552 L65.804612,268.349552 L95.8875974,77.5798073 C96.5035744,73.6675208 99.0174265,70.4627756 102.396976,68.8395929 Z\" fill=\"#27346A\"></path>\n\t\t<path d=\"M228.897012,82.7490197 C216.569147,146.069792 174.366398,167.970272 120.46841,167.970272 L93.0241367,167.970272 C86.4398419,167.970272 80.8794007,172.764903 79.8555471,179.265958 L61.8174095,293.621258 C61.1431644,297.883153 64.4394738,301.745495 68.7513129,301.745495 L117.421821,301.745495 C123.182038,301.745495 128.084882,297.550192 128.983876,291.864891 L129.458344,289.384335 L138.631407,231.249423 L139.222412,228.036354 C140.121406,222.351053 145.02425,218.15575 150.784467,218.15575 L158.067979,218.15575 C205.215193,218.15575 242.132193,199.002194 252.920115,143.605884 C257.423406,120.456802 255.092683,101.128442 243.181019,87.5519756 C239.568397,83.4399129 235.081754,80.0437153 229.854273,77.2718188 C229.571257,79.0614817 229.263268,80.8761167 228.897012,82.7490197 L228.897012,82.7490197 Z\" fill=\"#2790C3\"></path>\n\t\t<path d=\"M216.952052,72.1275783 C215.070825,71.5781934 213.13133,71.0787526 211.133566,70.6375799 C209.135803,70.1964071 207.071448,69.8051785 204.957148,69.4638939 C197.548776,68.265236 189.457835,67.699203 180.767565,67.699203 L107.457976,67.699203 C105.651665,67.699203 103.936919,68.1070797 102.4053,68.8479169 C99.0174265,70.4710996 96.5118984,73.6675208 95.8959214,77.5881313 L80.3133678,176.385849 L79.8638711,179.265958 C80.8877248,172.764903 86.4481659,167.970272 93.0324607,167.970272 L120.476734,167.970272 C174.374722,167.970272 216.577471,146.078116 228.905336,82.7490197 C229.271592,80.8761167 229.579581,79.0614817 229.862597,77.2718188 C226.741092,75.623664 223.361542,74.2002577 219.723948,72.9932757 C218.816631,72.6936112 217.892665,72.4022708 216.952052,72.1275783\" fill=\"#1F264F\"></path>\n\t</g>\n</svg>`,\n 'apple-pay': `<svg width=\"512px\" height=\"211px\" viewBox=\"0 0 512 211\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" preserveAspectRatio=\"xMidYMid\">\n <g>\n <path d=\"M93.5520633,27.1031049 C87.5513758,34.2039183 77.9502759,39.8045599 68.349176,39.0044683 C67.1490386,29.4033684 71.849577,19.2021998 77.3502072,12.901478 C83.3508946,5.6006416 93.8520976,0.400045829 102.353071,0 C103.353186,10.0011457 99.4527392,19.8022685 93.5520633,27.1031049 Z M102.25306,40.904686 C88.3514675,40.1045943 76.4501041,48.8055911 69.8493479,48.8055911 C63.1485803,48.8055911 53.0474231,41.3047318 42.0461628,41.5047547 C27.7445244,41.7047776 14.4430006,49.8057057 7.14216427,62.7071836 C-7.8595543,88.5101396 3.24171744,126.714516 17.7433787,147.716922 C24.8441922,158.118114 33.345166,169.51942 44.5464492,169.119374 C55.1476637,168.719328 59.3481449,162.218584 72.1496114,162.218584 C85.0510894,162.218584 88.7515133,169.119374 99.9527965,168.919351 C111.554126,168.719328 118.854962,158.51816 125.955775,148.116968 C134.056703,136.315616 137.357081,124.814299 137.557104,124.21423 C137.357081,124.014207 115.154538,115.513233 114.954515,89.9103 C114.754492,68.5078482 132.45652,58.3066795 133.256612,57.7066108 C123.255466,42.9049151 107.653679,41.3047318 102.25306,40.904686 Z M182.56226,11.9013634 L182.56226,167.819225 L206.765033,167.819225 L206.765033,114.513118 L240.268871,114.513118 C270.872377,114.513118 292.37484,93.5107124 292.37484,63.1072295 C292.37484,32.7037465 271.272423,11.9013634 241.068963,11.9013634 L182.56226,11.9013634 Z M206.765033,32.3037007 L234.668229,32.3037007 C255.670635,32.3037007 267.67201,43.5049839 267.67201,63.2072409 C267.67201,82.909498 255.670635,94.2107926 234.568218,94.2107926 L206.765033,94.2107926 L206.765033,32.3037007 Z M336.579904,169.019363 C351.781646,169.019363 365.883261,161.31848 372.283994,149.117083 L372.784052,149.117083 L372.784052,167.819225 L395.186618,167.819225 L395.186618,90.2103344 C395.186618,67.7077565 377.184556,53.2060952 349.481382,53.2060952 C323.778438,53.2060952 304.776261,67.9077794 304.076181,88.1100938 L325.878678,88.1100938 C327.678884,78.5089939 336.579904,72.2082721 348.781302,72.2082721 C363.582998,72.2082721 371.883949,79.1090626 371.883949,91.8105177 L371.883949,100.411503 L341.680488,102.211709 C313.577269,103.911904 298.375528,115.413222 298.375528,135.415513 C298.375528,155.617827 314.077326,169.019363 336.579904,169.019363 Z M343.080649,150.517243 C330.179171,150.517243 321.978231,144.316533 321.978231,134.815444 C321.978231,125.014321 329.879137,119.313668 344.980867,118.413565 L371.883949,116.713371 L371.883949,125.514379 C371.883949,140.116051 359.482528,150.517243 343.080649,150.517243 Z M425.090044,210.224083 C448.692748,210.224083 459.794019,201.223052 469.495131,173.919924 L512,54.7062671 L487.397182,54.7062671 L458.893916,146.816819 L458.393859,146.816819 L429.890594,54.7062671 L404.587695,54.7062671 L445.592392,168.219271 L443.39214,175.120061 C439.691716,186.821402 433.691029,191.321918 422.989803,191.321918 C421.089585,191.321918 417.389162,191.121895 415.88899,190.921872 L415.88899,209.624014 C417.28915,210.02406 423.289838,210.224083 425.090044,210.224083 Z\" fill=\"#000000\"></path>\n </g>\n</svg>`,\n 'google-pay': `<svg width=\"512px\" height=\"204px\" viewBox=\"0 0 512 204\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" preserveAspectRatio=\"xMidYMid\">\n <title>Google Pay</title>\n <g>\n <path d=\"M362.926585,55.0572275 C377.002187,55.0572275 387.878788,58.8960279 396.196189,66.5736286 C404.51359,74.2512294 408.35239,84.4880304 408.35239,97.2840316 L408.35239,158.704838 L390.437988,158.704838 L390.437988,144.629236 L389.798188,144.629236 C382.120587,156.145637 371.243986,161.903838 358.447985,161.903838 C347.571384,161.903838 337.974383,158.704838 330.296782,152.306837 C323.258982,145.908836 318.780381,136.951636 318.780381,127.354635 C318.780381,117.117834 322.619182,108.800433 330.296782,102.402432 C337.974383,96.0044315 348.850984,93.4452313 361.646985,93.4452313 C373.163386,93.4452313 382.120587,95.3646315 389.158388,99.8432319 L389.158388,95.3646315 C389.158388,89.3931642 386.92904,83.421697 382.470345,79.5309543 L381.480787,78.7298298 C376.362387,74.2512294 369.964386,71.6920291 362.926585,71.6920291 C352.049984,71.6920291 343.732584,76.1706296 337.974383,85.1278305 L321.339581,74.8910295 C331.576382,61.4552281 345.012184,55.0572275 362.926585,55.0572275 Z M272.714777,11.5508233 C284.195633,11.5508233 295.105804,15.5456243 303.828346,22.9962452 L305.34458,24.3468245 C314.301781,32.0244253 318.780381,43.5408264 318.780381,55.6970276 C318.780381,67.8532288 314.301781,78.7298298 305.34458,87.0472306 C296.387379,95.3646315 285.510778,99.8432319 272.714777,99.8432319 L242.004374,99.2034318 L242.004374,158.704838 L222.810372,158.704838 L222.810372,11.5508233 L272.714777,11.5508233 Z M365.485786,108.800433 C357.808185,108.800433 351.410184,110.719833 346.291784,114.558633 C341.173383,117.757634 338.614183,122.236234 338.614183,127.994435 C338.614183,133.112835 341.173383,137.591436 345.012184,140.150636 C349.490784,143.349636 354.609185,145.269036 359.727585,145.269036 C366.893346,145.269036 374.059107,142.482352 379.664324,137.429163 L380.840987,136.311835 C387.238988,130.553635 390.437988,123.515834 390.437988,115.838233 C384.679788,111.359633 376.362387,108.800433 365.485786,108.800433 Z M273.994377,29.465225 L242.004374,29.465225 L242.004374,80.64923 L273.994377,80.64923 C281.032177,80.64923 288.069978,78.0900298 292.548579,72.9716293 C302.78538,63.3746283 302.78538,47.3796268 293.188379,37.7826258 L292.548579,37.1428258 C287.430178,32.0244253 281.032177,28.825425 273.994377,29.465225 Z M512,58.2562278 L448.659794,203.490842 L429.465792,203.490842 L453.138394,152.946637 L411.55139,58.8960279 L432.024992,58.8960279 L462.095595,131.193435 L462.735395,131.193435 L492.166198,58.8960279 L512,58.8960279 L512,58.2562278 Z\" fill=\"#5F6368\"></path>\n <g>\n <path d=\"M165.868166,86.4074306 C165.868166,80.64923 165.228366,74.8910295 164.588566,69.1328289 L84.6135583,69.1328289 L84.6135583,101.762632 L130.039363,101.762632 C128.119963,111.999433 122.361762,121.596434 113.404561,127.354635 L113.404561,148.468037 L140.915964,148.468037 C156.910965,133.752635 165.868166,111.999433 165.868166,86.4074306 Z\" fill=\"#4285F4\"></path>\n <path d=\"M84.6135583,168.941639 C107.646361,168.941639 126.840362,161.264038 140.915964,148.468037 L113.404561,127.354635 C105.72696,132.473035 96.1299594,135.672035 84.6135583,135.672035 C62.8603561,135.672035 43.6663543,120.956634 37.2683536,100.483032 L9.11715089,100.483032 L9.11715089,122.236234 C23.8325523,151.027237 52.6235551,168.941639 84.6135583,168.941639 Z\" fill=\"#34A853\"></path>\n <path d=\"M37.2683536,100.483032 C33.4295533,90.246231 33.4295533,78.7298298 37.2683536,67.8532288 L37.2683536,46.1000266 L9.11715089,46.1000266 C-3.0390503,69.772629 -3.0390503,97.9238317 9.11715089,122.236234 L37.2683536,100.483032 Z\" fill=\"#FBBC04\"></path>\n <path d=\"M84.6135583,33.3040254 C96.7697595,33.3040254 108.286161,37.7826258 117.243361,46.1000266 L117.243361,46.1000266 L141.555764,21.7876243 C126.200562,7.71202289 105.72696,-0.60537792 85.2533583,0.0344221425 C53.2633552,0.0344221425 23.8325523,17.9488239 9.75695095,46.7398267 L37.9081537,68.4930288 C43.6663543,48.0194268 62.8603561,33.3040254 84.6135583,33.3040254 Z\" fill=\"#EA4335\"></path>\n </g>\n </g>\n</svg>`,\n}\n","import type { SmartCartWidget } from './types'\nimport { PAYMENT_ICON_SVGS } from './payment-icons'\n\n/** The 8 CC0 card icons available to the widget. */\nconst KNOWN_KEYS = new Set(Object.keys(PAYMENT_ICON_SVGS))\n\n/** Default badge set shown when `badges` is missing, empty, or all-invalid. */\nconst DEFAULT_BADGES: readonly string[] = ['visa', 'mastercard', 'amex', 'paypal']\n\n/**\n * Read `badges` defensively from the passthrough config blob: must be a string[], filtered to\n * known icon keys, with duplicates removed. Returns null when absent/invalid so the caller can\n * fall back to the default set.\n */\nfunction readBadges(config: Record<string, unknown>): string[] | null {\n const raw = config.badges\n if (!Array.isArray(raw)) return null\n const seen = new Set<string>()\n const valid: string[] = []\n for (const item of raw) {\n if (typeof item === 'string' && KNOWN_KEYS.has(item) && !seen.has(item)) {\n seen.add(item)\n valid.push(item)\n }\n }\n return valid.length > 0 ? valid : null\n}\n\nconst css = `\n .ksc-tb { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; justify-content: center;\n padding: 10px 16px 4px; }\n .ksc-tb__icon { display: flex; align-items: center; justify-content: center; width: 38px; height: 26px;\n border: 1px solid rgb(234, 236, 240); border-radius: 5px; background: #fff; box-sizing: border-box; }\n .ksc-tb__icon svg { max-height: 15px; max-width: 28px; width: auto; height: auto; display: block; }\n`\n\n/**\n * Trust-badges / payment-icon row widget (#1399). Renders a flex row of CC0 payment-method SVGs\n * in the cart footer. Badge selection is read defensively from the passthrough `badges` string[],\n * filtered to the 8 known icon keys. Falls back to ['visa','mastercard','amex','paypal'] when\n * the config is missing or all-invalid. SVG strings are trusted constants (only known keys are\n * emitted) — they are NOT HTML-escaped.\n */\nexport const trustBadges: SmartCartWidget = {\n key: 'trustBadges',\n zone: 'below-checkout',\n css,\n render({ config }) {\n const badges = readBadges(config) ?? DEFAULT_BADGES\n const icons = badges\n .map(\n (key) => `<span class=\"ksc-tb__icon\" data-badge=\"${key}\">${PAYMENT_ICON_SVGS[key]}</span>`,\n )\n .join('')\n return `<div class=\"ksc-tb\">${icons}</div>`\n },\n}\n","import { addOn } from './add-on'\nimport { discountCode } from './discount-code'\nimport { freeShippingBar } from './free-shipping-bar'\nimport { reservationTimer } from './reservation-timer'\nimport { stickyBubble } from './sticky-bubble'\nimport { trustBadges } from './trust-badges'\nimport { upsellCarousel } from './upsell-carousel'\nimport type { SmartCartWidget } from './types'\n\n/** First-party widgets, in registration order. */\nexport const WIDGETS: readonly SmartCartWidget[] = [\n freeShippingBar,\n trustBadges,\n stickyBubble,\n addOn,\n reservationTimer,\n upsellCarousel,\n discountCode,\n]\n\nexport type { SmartCartWidget, SmartCartWidgetContext, WidgetZone } from './types'\n","import type { CartAdapter, Money, SmartCartLine, SmartCartState } from './cart-adapter'\nimport type { SmartCartBranding } from './config'\nimport type { ProductVariantOption, UpsellVariant, VariantLookup } from './variant-lookup'\nimport { escapeHtml, formatCountdown, formatMoney, formatMoneyCompact } from './format'\nimport { ADDON_ATTR_KEY, ADDON_ATTR_VALUE, ADDON_KEY } from './widgets/add-on'\nimport { DEFAULT_MINUTES as TIMER_DEFAULT_MINUTES } from './widgets/reservation-timer'\nimport { readVariantIds, UPSELL_KEY, UPSELL_VARIANT_ATTR } from './widgets/upsell-carousel'\nimport { WIDGETS } from './widgets'\nimport type { WidgetZone } from './widgets/types'\n\nexport { escapeHtml, formatMoney } from './format'\n\nconst TAG = 'kotao-smart-cart'\n\n/** Widget key whose enabled config drives the reservation countdown (must match the widget's key). */\nconst RESERVATION_TIMER_KEY = 'reservationTimer'\nconst TIMER_TICK_MS = 1000\nconst MS_PER_MINUTE = 60_000\n\nconst TOKEN_VARS: Record<keyof SmartCartBranding, string> = {\n accent: '--ksc-accent',\n accentText: '--ksc-accent-text',\n surface: '--ksc-surface',\n text: '--ksc-text',\n fontFamily: '--ksc-font',\n radius: '--ksc-radius',\n}\n\nconst STYLES = `\n :host { position: fixed; inset: 0; z-index: 2147483000; pointer-events: none;\n --ksc-accent: #111; --ksc-accent-text: #fff; --ksc-surface: #fff; --ksc-text: #111;\n --ksc-font: system-ui, sans-serif; --ksc-radius: 12px;\n --ksc-positive: #0e9f6e;\n --ksc-muted: color-mix(in oklab, var(--ksc-text) 55%, transparent);\n --ksc-border: color-mix(in oklab, var(--ksc-text) 12%, transparent); }\n .overlay { position: absolute; inset: 0; background: rgba(0,0,0,.45); opacity: 0;\n transition: opacity .25s ease; }\n .panel { position: absolute; top: 0; right: 0; height: 100%; width: min(520px, 100vw);\n background: var(--ksc-surface); color: var(--ksc-text); font-family: var(--ksc-font);\n transform: translateX(100%); transition: transform .25s ease; display: flex; flex-direction: column;\n box-shadow: -8px 0 40px rgba(0,0,0,.14); }\n :host([open]) .overlay { opacity: 1; }\n :host([open]) .panel { transform: translateX(0); }\n :host(:not([open])) { pointer-events: none; }\n :host([open]) { pointer-events: auto; }\n\n /* Header — centered \"My cart · N\" with the close control pinned right (original cart layout). */\n .ksc-head { position: relative; display: flex; align-items: center; justify-content: center;\n gap: 6px; flex: 0 0 auto; padding: 16px 52px; }\n .ksc-head__title { font-size: 1.125rem; font-weight: 600; letter-spacing: .01em; }\n .ksc-head__count { font-weight: 600; font-size: 1.125rem; }\n .ksc-head__close { position: absolute; right: 14px; top: 50%; transform: translateY(-50%);\n display: flex; align-items: center; justify-content: center;\n width: 32px; height: 32px; padding: 0; border: none; background: none; cursor: pointer;\n color: var(--ksc-text); border-radius: 8px; }\n .ksc-head__close:hover { background: var(--ksc-border); }\n .ksc-head__close svg { width: 18px; height: 18px; }\n\n /* Items / line cards */\n .items { flex: 1 1 auto; overflow: auto; }\n .ksc-empty { display: flex; flex-direction: column; align-items: center; justify-content: center;\n gap: 14px; padding: 56px 24px; text-align: center; color: var(--ksc-muted); }\n .ksc-empty svg { width: 44px; height: 44px; opacity: .5; }\n .ksc-empty p { margin: 0; font-size: .95rem; }\n .ksc-line { display: grid; grid-template-columns: 80px 1fr; gap: 14px;\n padding: 14px 20px; }\n .ksc-line + .ksc-line { border-top: 1px solid var(--ksc-border); }\n .ksc-line__img { width: 80px; height: 80px; object-fit: cover; border-radius: 8px;\n background: var(--ksc-border); }\n .ksc-line__img--ph { display: block; }\n .ksc-line__body { display: flex; flex-direction: column; gap: 6px; min-width: 0; }\n .ksc-line__top { display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; }\n .ksc-line__main { display: flex; flex-direction: column; gap: 5px; min-width: 0; }\n .ksc-line__title { font-size: .9375rem; font-weight: 700; line-height: 1.3; }\n .ksc-line__compare { color: rgb(152, 162, 179); text-decoration: line-through;\n font-size: .875rem; white-space: nowrap; }\n .ksc-line__meta { display: flex; flex-direction: column; gap: 3px; }\n .ksc-line__opt { font-size: .8125rem; color: rgb(152, 162, 179); line-height: 1.35;\n overflow: hidden; text-overflow: ellipsis; }\n .ksc-line__opt b { font-weight: 700; color: var(--ksc-text); }\n .ksc-line__variant { display: flex; flex-direction: column; gap: 3px; align-items: flex-start;\n font-size: .8125rem; color: rgb(152, 162, 179); }\n .ksc-line__discount { font-size: .8125rem; font-weight: 500; color: var(--ksc-positive); line-height: 1.35; }\n .ksc-line__discount s { color: rgb(152, 162, 179); text-decoration: line-through; }\n .ksc-line__select { font: inherit; font-size: .8125rem; color: var(--ksc-text); padding: 4px 24px 4px 10px;\n border: 1px solid var(--ksc-border); border-radius: 8px; background: var(--ksc-surface); cursor: pointer;\n appearance: none; -webkit-appearance: none;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6' fill='none' stroke='%23999' stroke-width='1.5'%3E%3Cpath d='M1 1l4 4 4-4'/%3E%3C/svg%3E\");\n background-repeat: no-repeat; background-position: right 8px center; }\n .ksc-line__select:focus { outline: none; border-color: var(--ksc-accent); }\n .ksc-line__bottom { display: flex; align-items: center; justify-content: space-between;\n gap: 10px; margin-top: 4px; }\n .ksc-qty { display: inline-flex; align-items: center; border: 1px solid var(--ksc-border);\n border-radius: 8px; }\n .ksc-qty button { width: 32px; height: 32px; display: flex; align-items: center; justify-content: center;\n padding: 0; border: none; background: none; cursor: pointer; color: var(--ksc-text);\n font-size: 16px; line-height: 1; border-radius: 8px; }\n .ksc-qty button:hover { background: var(--ksc-border); }\n .ksc-qty__n { min-width: 26px; text-align: center; font-size: .875rem; font-variant-numeric: tabular-nums; }\n .ksc-line__prices { display: flex; flex-direction: column; align-items: flex-end; gap: 3px; flex: 0 0 auto; }\n .ksc-line__price { font-size: .9375rem; font-weight: 700; }\n .ksc-line__save { display: inline-flex; align-items: center; gap: 4px; font-size: .75rem;\n font-weight: 500; color: rgb(7, 148, 85); white-space: nowrap;\n background: rgb(220, 250, 230); padding: 3px 8px; border-radius: 6px; }\n .ksc-line__save svg { width: 12px; height: 12px; }\n .ksc-line__remove { display: flex; align-items: center; justify-content: center; width: 32px; height: 32px;\n padding: 0; border: none; background: none; cursor: pointer; color: var(--ksc-muted); border-radius: 8px; }\n .ksc-line__remove:hover { color: var(--ksc-text); background: var(--ksc-border); }\n .ksc-line__remove svg { width: 17px; height: 17px; }\n\n /* Footer / summary / checkout */\n .footer { flex: 0 0 auto; border-top: 1px solid var(--ksc-border); }\n .ksc-summary { display: flex; flex-direction: column; gap: 6px; padding: 12px 20px 2px; }\n .ksc-summary__row { display: flex; align-items: center; justify-content: space-between;\n font-size: .875rem; color: rgb(71, 84, 103); }\n .ksc-summary__row--total { font-size: 1rem; font-weight: 700; color: var(--ksc-text); }\n .checkout { display: block; text-align: center; margin: 10px 20px 0; padding: 16px;\n background: var(--ksc-accent); color: var(--ksc-accent-text); text-decoration: none;\n border-radius: 10px; font-weight: 700; font-size: 1rem; }\n .checkout:hover { opacity: .92; }\n .ksc-continue { display: block; width: 100%; padding: 8px 18px 16px; text-align: center;\n border: none; background: none; cursor: pointer; color: var(--ksc-text); font: inherit;\n font-size: .875rem; font-weight: 700; }\n .ksc-continue:hover { opacity: .7; }\n\n @media (prefers-reduced-motion: reduce) { .overlay, .panel { transition: none; } }\n .chrome { position: absolute; inset: 0; pointer-events: none; }\n .chrome > * { pointer-events: auto; }\n :host([open]) .chrome { display: none; }\n`\n\nconst CLOSE_SVG = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" aria-hidden=\"true\"><path d=\"M6 6l12 12M18 6L6 18\"/></svg>`\nconst TRASH_SVG = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M4 7h16M9 7V4h6v3M7 7l1 13h8l1-13\"/></svg>`\nconst BAG_SVG = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M6 8h12l1 12H5L6 8zM9 8a3 3 0 0 1 6 0\"/></svg>`\nconst TAG_SVG = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M20 13l-7 7-9-9V4h7l9 9z\"/><circle cx=\"7.5\" cy=\"7.5\" r=\"1\" fill=\"currentColor\"/></svg>`\n\n// Guard: HTMLElement is not available in non-DOM environments (e.g. Node.js / Vitest Node tests).\n// Importing this module from Node is safe as long as SmartCartElement is never constructed there.\nconst Base: typeof HTMLElement =\n typeof HTMLElement !== 'undefined' ? HTMLElement : (class {} as unknown as typeof HTMLElement)\n\nexport class SmartCartElement extends Base {\n static readonly tagName = TAG\n static register(): void {\n if (!customElements.get(TAG)) customElements.define(TAG, SmartCartElement)\n }\n\n #adapter: CartAdapter | null = null\n #variantLookup: VariantLookup | null = null\n /** Resolved upsell variant display data, keyed by variant id; null until the first lookup runs. */\n #upsellVariants: ReadonlyMap<string, UpsellVariant> | null = null\n #upsellFetchInFlight = false\n /** Sibling variants per product handle, for the in-cart variant switcher; resolved lazily on open. */\n #productVariants = new Map<string, readonly ProductVariantOption[]>()\n #productVariantsFetching = new Set<string>()\n /** Last cart state rendered, so an async upsell resolve can re-render the carousel in place. */\n #lastState: SmartCartState | null = null\n #addOnDefaultApplied = false\n #addOnPending = false\n #upsellPending = false\n #discountPending = false\n #linePending = false\n #open = false\n #root: ShadowRoot\n #widgets: Record<string, { enabled?: boolean } & Record<string, unknown>> = {}\n #widgetCssInjected = false\n #timerIntervalId: ReturnType<typeof setInterval> | null = null\n #timerEndMs: number | null = null\n #onKeydown = (e: KeyboardEvent): void => {\n if (e.key === 'Escape') this.close()\n }\n\n constructor() {\n super()\n this.#root = this.attachShadow({ mode: 'open' })\n this.#root.innerHTML = `\n <style>${STYLES}</style>\n <div class=\"overlay\" data-overlay></div>\n <aside class=\"panel\" role=\"dialog\" aria-modal=\"true\" aria-label=\"Cart\" aria-hidden=\"true\">\n <header class=\"ksc-head\">\n <span class=\"ksc-head__title\">My cart</span>\n <span class=\"ksc-head__count\" data-cart-count></span>\n <button type=\"button\" class=\"ksc-head__close\" data-smart-cart-close aria-label=\"Close cart\">${CLOSE_SVG}</button>\n </header>\n <slot name=\"top-bar\"></slot>\n <div data-widget-zone=\"top-bar\"></div>\n <slot name=\"before-items\"></slot>\n <div data-widget-zone=\"before-items\"></div>\n <div class=\"items\">\n <div data-items></div>\n <slot name=\"after-items\"></slot>\n <div data-widget-zone=\"after-items\"></div>\n </div>\n <div class=\"footer\">\n <slot name=\"footer\"></slot>\n <div data-widget-zone=\"footer\"></div>\n <div data-checkout-wrap></div>\n <div data-widget-zone=\"below-checkout\"></div>\n <div data-continue-wrap></div>\n </div>\n </aside>\n <div class=\"chrome\" data-chrome></div>`\n this.#root.querySelector('[data-overlay]')?.addEventListener('click', () => this.close())\n this.#root.querySelector('[data-chrome]')?.addEventListener('click', (e) => {\n if ((e.target as Element | null)?.closest('[data-smart-cart-open]')) void this.open()\n })\n this.#root.querySelector('.panel')?.addEventListener('click', (e) => {\n const target = e.target as Element | null\n if (target?.closest('[data-smart-cart-close]')) {\n this.close()\n return\n }\n const qtyDec = target?.closest('[data-smart-cart-qty-dec]')\n if (qtyDec) {\n void this.#onQty(qtyDec, -1)\n return\n }\n const qtyInc = target?.closest('[data-smart-cart-qty-inc]')\n if (qtyInc) {\n void this.#onQty(qtyInc, 1)\n return\n }\n const lineRemove = target?.closest('[data-smart-cart-line-remove]')\n if (lineRemove) {\n void this.#onLineRemove(lineRemove)\n return\n }\n const toggle = target?.closest('[data-smart-cart-addon-toggle]')\n if (toggle) {\n void this.#onAddOnToggle(toggle)\n return\n }\n const upsellBtn = target?.closest('[data-smart-cart-upsell-add]')\n if (upsellBtn) void this.#onUpsellAdd(upsellBtn)\n const upsellNav = target?.closest(\n '[data-smart-cart-upsell-prev], [data-smart-cart-upsell-next]',\n )\n if (upsellNav) {\n this.#onUpsellNav(upsellNav)\n return\n }\n const discountApply = target?.closest('[data-smart-cart-discount-apply]')\n if (discountApply) {\n void this.#onDiscountApply(discountApply)\n return\n }\n const discountRemove = target?.closest('[data-smart-cart-discount-remove]')\n if (discountRemove) void this.#onDiscountRemove(discountRemove)\n })\n this.#root.querySelector('.panel')?.addEventListener('change', (e) => {\n const select = (e.target as Element | null)?.closest('[data-smart-cart-variant]')\n if (select) {\n void this.#onVariantSelect(select)\n return\n }\n const upsellSelect = (e.target as Element | null)?.closest('[data-smart-cart-upsell-variant]')\n if (upsellSelect) this.#onUpsellVariantSelect(upsellSelect)\n })\n }\n\n connectedCallback(): void {\n // Render the chrome (e.g. sticky bubble) on mount, decoupled from open(). Only fetch the cart\n // when an enabled chrome widget is present — never add a cart request to pages with chrome off.\n if (!this.#adapter || !this.#chromeEnabled()) return\n void this.#adapter.getCart().then((state) => this.#renderChrome(state))\n }\n\n disconnectedCallback(): void {\n document.removeEventListener('keydown', this.#onKeydown)\n if (this.#timerIntervalId !== null) {\n clearInterval(this.#timerIntervalId)\n this.#timerIntervalId = null\n }\n }\n\n get isOpen(): boolean {\n return this.#open\n }\n\n setAdapter(adapter: CartAdapter): void {\n this.#adapter = adapter\n }\n\n /** Wire the variant display-data seam used by the upsell carousel (productVariantsByIds, #1431).\n * Optional: with no lookup the carousel simply never resolves variants and renders nothing. */\n setVariantLookup(lookup: VariantLookup): void {\n this.#variantLookup = lookup\n }\n\n setBranding(branding: SmartCartBranding): void {\n for (const [key, cssVar] of Object.entries(TOKEN_VARS)) {\n const value = branding[key as keyof SmartCartBranding]\n if (value) this.style.setProperty(cssVar, value)\n }\n }\n\n setWidgets(\n widgets: Record<string, { enabled?: boolean } & Record<string, unknown>> | undefined,\n ): void {\n this.#widgets = widgets ?? {}\n }\n\n async open(): Promise<void> {\n this.#open = true\n this.setAttribute('open', '')\n this.#dialog()?.setAttribute('aria-hidden', 'false')\n document.addEventListener('keydown', this.#onKeydown)\n if (this.#adapter) {\n const loaded = await this.#adapter.getCart()\n const state = await this.#ensureAddOnDefault(loaded)\n this.#renderCart(state)\n this.#renderChrome(state)\n }\n // Resolve upsell display data lazily on first open (no network on page load); re-renders the\n // carousel when it lands. Fire-and-forget — the drawer is already shown. Sibling variants (the\n // in-cart switcher + the upsell size select) resolve AFTER, since the upsell handles come from\n // the resolved upsell variants.\n void this.#resolveUpsellVariants().then(() => this.#resolveProductVariants())\n }\n\n /** Add a line (from a theme add-to-cart submit intercepted by mountSmartCart) and open the drawer on\n * the result. Opens first for instant feedback, then adds and reconciles against the server cart.\n * Guarded against re-entrancy so a rapid double-click cannot add twice; a failed add leaves the\n * opened drawer on the current cart rather than throwing. */\n async addLineAndOpen(\n variantId: string,\n quantity: number,\n properties?: Record<string, string>,\n ): Promise<void> {\n if (this.#linePending) return\n this.#linePending = true\n try {\n await this.open()\n if (this.#adapter) {\n const state = await this.#adapter.addLine(variantId, quantity, properties)\n this.#renderCart(state)\n this.#renderChrome(state)\n }\n } catch {\n // The add failed (network / invalid variant): keep the opened drawer on the current cart.\n } finally {\n this.#linePending = false\n }\n }\n\n /** Lazily fetch sibling variants for every cart line that has a product handle and a real variant\n * title (single-variant lines have none → no switcher), plus every resolved upsell/add-on\n * product (the upsell card's size select). Caches per handle, never re-fetches, and re-renders\n * the cart once new variants land so the `<select>`s appear. Fail-closed per the lookup. */\n async #resolveProductVariants(): Promise<void> {\n const lookup = this.#variantLookup\n if (!lookup?.fetchProductVariants || this.#lastState === null) return\n const handles = new Set<string>()\n for (const line of this.#lastState.lines) {\n const handle = line.productHandle\n if (\n typeof handle === 'string' &&\n handle.length > 0 &&\n line.variantTitle !== null &&\n !this.#productVariants.has(handle) &&\n !this.#productVariantsFetching.has(handle)\n ) {\n handles.add(handle)\n }\n }\n for (const variant of this.#upsellVariants?.values() ?? []) {\n const handle = variant.productHandle\n if (\n handle !== null &&\n handle.length > 0 &&\n !this.#productVariants.has(handle) &&\n !this.#productVariantsFetching.has(handle)\n ) {\n handles.add(handle)\n }\n }\n if (handles.size === 0) return\n await Promise.all(\n [...handles].map(async (handle) => {\n this.#productVariantsFetching.add(handle)\n try {\n const variants = await lookup.fetchProductVariants!(handle)\n if (variants.length > 0) this.#productVariants.set(handle, variants)\n } finally {\n this.#productVariantsFetching.delete(handle)\n }\n }),\n )\n if (this.#open && this.#lastState !== null) this.#renderCart(this.#lastState)\n }\n\n /** Swap a line to a different variant of the same product. Adds the target variant first (carrying\n * the line's properties) then removes the old line, so a mid-swap failure never drops the item. */\n async #onVariantSelect(select: Element): Promise<void> {\n if (!this.#adapter || this.#linePending) return\n if (!(select instanceof HTMLSelectElement)) return\n const lineId = select.getAttribute('data-line-id')\n const targetVariantId = select.value\n const qty = Number(select.getAttribute('data-qty'))\n if (!lineId || !targetVariantId || !Number.isFinite(qty) || qty <= 0) return\n const line = this.#lastState?.lines.find((l) => l.id === lineId)\n this.#linePending = true\n try {\n await this.#adapter.addLine(targetVariantId, qty, line?.attributes)\n const next = await this.#adapter.removeLine(lineId)\n this.#renderCart(next)\n this.#renderChrome(next)\n } finally {\n this.#linePending = false\n }\n // The new line may belong to a product whose variants aren't cached yet — resolve again.\n void this.#resolveProductVariants()\n }\n\n /** Configured upsell variant ids when the carousel is enabled; [] otherwise. */\n #upsellVariantIds(): readonly string[] {\n const cfg = this.#widgets[UPSELL_KEY]\n if (cfg?.enabled !== true) return []\n return readVariantIds(cfg)\n }\n\n /** Configured add-on variant id when the add-on widget is enabled; null otherwise. The add-on card\n * resolves its title/price/image from the same lookup as the upsell carousel. */\n #addOnVariantId(): string | null {\n const cfg = this.#widgets[ADDON_KEY]\n if (cfg?.enabled !== true) return null\n const raw = cfg.variantId\n return typeof raw === 'string' && raw.trim() !== '' ? raw : null\n }\n\n /** Fetch variant display data (upsell carousel + add-on card) once and re-render the open drawer.\n * Skips when there is no lookup, nothing configured, a fetch is already in flight, or data is\n * already resolved. An empty result (fail-closed or all-inactive) is allowed to retry on a later open. */\n async #resolveUpsellVariants(): Promise<void> {\n if (!this.#variantLookup) return\n if (this.#upsellVariants !== null && this.#upsellVariants.size > 0) return\n if (this.#upsellFetchInFlight) return\n const ids = [...this.#upsellVariantIds()]\n const addOnId = this.#addOnVariantId()\n if (addOnId !== null && !ids.includes(addOnId)) ids.push(addOnId)\n if (ids.length === 0) return\n this.#upsellFetchInFlight = true\n try {\n const variants = await this.#variantLookup.fetchVariants(ids)\n this.#upsellVariants = new Map(variants.map((v) => [v.id, v]))\n } finally {\n this.#upsellFetchInFlight = false\n }\n if (this.#open && this.#lastState !== null) this.#renderWidgets(this.#lastState)\n }\n\n async #ensureAddOnDefault(state: SmartCartState): Promise<SmartCartState> {\n if (this.#addOnDefaultApplied || !this.#adapter) return state\n // Find an enabled widget config entry that opts into defaultOn and names a variant.\n // Keyed loosely over the full config blob so it is independent of widget registry order.\n const entry = Object.values(this.#widgets).find(\n (c) =>\n c?.enabled === true &&\n (c as { defaultOn?: unknown }).defaultOn === true &&\n typeof (c as { variantId?: unknown }).variantId === 'string',\n ) as ({ variantId?: string } & Record<string, unknown>) | undefined\n if (!entry?.variantId) return state\n // Set the flag BEFORE the await so a rapid double-open cannot fire twice.\n this.#addOnDefaultApplied = true\n const present = state.lines.some((l) => l.variantId === entry.variantId)\n if (present) return state\n return this.#adapter.addLine(entry.variantId, 1, { [ADDON_ATTR_KEY]: ADDON_ATTR_VALUE })\n }\n\n close(): void {\n this.#open = false\n this.removeAttribute('open')\n this.#dialog()?.setAttribute('aria-hidden', 'true')\n document.removeEventListener('keydown', this.#onKeydown)\n }\n\n /** Build an optimistic next state for an add-on toggle so the switch (and the subtotal) flips the\n * instant it's clicked, before the network round-trip. On add a synthetic add-on line is appended\n * (priced from the resolved variant, hidden from the list by the add-on filter) and the subtotal\n * bumped; on remove the add-on line is dropped and the subtotal reduced. Null when there is no\n * prior state or configured add-on variant — the caller then skips the optimism and just awaits. */\n #optimisticAddOnState(add: boolean): SmartCartState | null {\n const base = this.#lastState\n const variantId = this.#addOnVariantId()\n if (base === null || variantId === null) return null\n const currency = base.subtotal.currency\n if (add) {\n const price = this.#upsellVariants?.get(variantId)?.price ?? { amount: 0, currency }\n const line: SmartCartLine = {\n id: `ksc-optimistic-addon-${variantId}`,\n title: '',\n variantTitle: null,\n variantId,\n quantity: 1,\n imageUrl: null,\n linePrice: { amount: price.amount, currency },\n attributes: { [ADDON_ATTR_KEY]: ADDON_ATTR_VALUE },\n }\n return {\n ...base,\n lines: [...base.lines, line],\n subtotal: { amount: base.subtotal.amount + price.amount, currency },\n }\n }\n const removed = base.lines.find((l) => l.variantId === variantId)\n return {\n ...base,\n lines: base.lines.filter((l) => l.variantId !== variantId),\n subtotal: {\n amount: Math.max(0, base.subtotal.amount - (removed?.linePrice.amount ?? 0)),\n currency,\n },\n }\n }\n\n async #onAddOnToggle(toggle: Element): Promise<void> {\n if (!this.#adapter || this.#addOnPending) return\n const checked = toggle.getAttribute('data-checked') === 'true'\n const lineId = toggle.getAttribute('data-line-id')\n const variantId = toggle.getAttribute('data-variant-id')\n if (checked ? !lineId : !variantId) return\n\n // Optimistic: flip the switch + subtotal immediately so the click feels instant; the server\n // result reconciles the real state below (and corrects a rare optimistic/server divergence).\n const optimistic = this.#optimisticAddOnState(!checked)\n if (optimistic) {\n this.#renderCart(optimistic)\n this.#renderChrome(optimistic)\n }\n\n this.#addOnPending = true\n try {\n const next = checked\n ? await this.#adapter.removeLine(lineId!)\n : await this.#adapter.addLine(variantId!, 1, { [ADDON_ATTR_KEY]: ADDON_ATTR_VALUE })\n this.#renderCart(next)\n this.#renderChrome(next)\n } finally {\n this.#addOnPending = false\n }\n }\n\n /** Scroll the upsell track one card left/right (the arrows sit outside the track). */\n #onUpsellNav(btn: Element): void {\n const track = btn.closest('.ksc-up')?.querySelector('.ksc-up__track')\n if (!track) return\n const direction = btn.hasAttribute('data-smart-cart-upsell-prev') ? -1 : 1\n track.scrollBy({ left: direction * track.clientWidth, behavior: 'smooth' })\n }\n\n /** Retarget an upsell card's add button when the shopper picks a different size — the select\n * carries no other intent (no re-render, no network). */\n #onUpsellVariantSelect(select: Element): void {\n if (!(select instanceof HTMLSelectElement)) return\n const addBtn = select.closest('.ksc-up__card')?.querySelector('[data-smart-cart-upsell-add]')\n if (addBtn && select.value) addBtn.setAttribute('data-variant-id', select.value)\n }\n\n async #onUpsellAdd(btn: Element): Promise<void> {\n if (!this.#adapter || this.#upsellPending) return\n const variantId = btn.getAttribute('data-variant-id')\n if (!variantId) return\n this.#upsellPending = true\n try {\n const next = await this.#adapter.addLine(variantId, 1, {\n [UPSELL_VARIANT_ATTR]: variantId,\n })\n this.#renderCart(next)\n this.#renderChrome(next)\n } finally {\n this.#upsellPending = false\n }\n }\n\n /** Quantity stepper. `delta` is +1 / −1. Decrementing past 1 removes the line. Guarded against\n * re-entrancy so a rapid double-click cannot fire two mutations. */\n /** Optimistic state for a line quantity change (or removal at `nextQty <= 0`): rescale the line\n * price + subtotal so the number updates the instant the stepper/trash is clicked, before the\n * network round-trip. Null when there is no prior state or the line is gone. */\n #optimisticQtyState(lineId: string, nextQty: number): SmartCartState | null {\n const base = this.#lastState\n if (base === null) return null\n const line = base.lines.find((l) => l.id === lineId)\n if (!line) return null\n const currency = base.subtotal.currency\n if (nextQty <= 0) {\n return {\n ...base,\n lines: base.lines.filter((l) => l.id !== lineId),\n subtotal: { amount: Math.max(0, base.subtotal.amount - line.linePrice.amount), currency },\n }\n }\n const unit = line.quantity > 0 ? line.linePrice.amount / line.quantity : line.linePrice.amount\n const newLineAmount = Math.round(unit * nextQty)\n const scaled: SmartCartLine = {\n ...line,\n quantity: nextQty,\n linePrice: { amount: newLineAmount, currency: line.linePrice.currency },\n ...(line.compareAtLinePrice &&\n line.quantity > 0 && {\n compareAtLinePrice: {\n amount: Math.round((line.compareAtLinePrice.amount / line.quantity) * nextQty),\n currency: line.compareAtLinePrice.currency,\n },\n }),\n }\n return {\n ...base,\n lines: base.lines.map((l) => (l.id === lineId ? scaled : l)),\n subtotal: {\n amount: base.subtotal.amount + (newLineAmount - line.linePrice.amount),\n currency,\n },\n }\n }\n\n async #onQty(btn: Element, delta: number): Promise<void> {\n if (!this.#adapter || this.#linePending) return\n const lineId = btn.closest('[data-line-id]')?.getAttribute('data-line-id')\n const current = Number(btn.getAttribute('data-qty'))\n if (!lineId || !Number.isFinite(current)) return\n const next = current + delta\n const optimistic = this.#optimisticQtyState(lineId, next)\n if (optimistic) {\n this.#renderCart(optimistic)\n this.#renderChrome(optimistic)\n }\n this.#linePending = true\n try {\n const state =\n next <= 0\n ? await this.#adapter.removeLine(lineId)\n : await this.#adapter.updateLine(lineId, next)\n this.#renderCart(state)\n this.#renderChrome(state)\n } finally {\n this.#linePending = false\n }\n }\n\n async #onLineRemove(btn: Element): Promise<void> {\n if (!this.#adapter || this.#linePending) return\n const lineId = btn.closest('[data-line-id]')?.getAttribute('data-line-id')\n if (!lineId) return\n const optimistic = this.#optimisticQtyState(lineId, 0)\n if (optimistic) {\n this.#renderCart(optimistic)\n this.#renderChrome(optimistic)\n }\n this.#linePending = true\n try {\n const state = await this.#adapter.removeLine(lineId)\n this.#renderCart(state)\n this.#renderChrome(state)\n } finally {\n this.#linePending = false\n }\n }\n\n async #onDiscountApply(applyBtn: Element): Promise<void> {\n if (!this.#adapter || this.#discountPending) return\n // Find the sibling input within the same .ksc-discount container.\n const container = applyBtn.closest('.ksc-discount')\n const input = container?.querySelector('[data-smart-cart-discount-input]') as\n | HTMLInputElement\n | null\n | undefined\n const code = (input?.value ?? '').trim()\n if (!code) return\n const current = this.#lastState?.appliedCodes ?? []\n this.#discountPending = true\n try {\n const next = await this.#adapter.updateDiscountCodes([...current, code])\n this.#renderCart(next)\n this.#renderChrome(next)\n } finally {\n this.#discountPending = false\n }\n }\n\n async #onDiscountRemove(removeBtn: Element): Promise<void> {\n if (!this.#adapter || this.#discountPending) return\n const code = removeBtn.getAttribute('data-code')\n if (!code) return\n const current = this.#lastState?.appliedCodes ?? []\n this.#discountPending = true\n try {\n const next = await this.#adapter.updateDiscountCodes(current.filter((c) => c !== code))\n this.#renderCart(next)\n this.#renderChrome(next)\n } finally {\n this.#discountPending = false\n }\n }\n\n #dialog(): Element | null {\n return this.#root.querySelector('[role=\"dialog\"]')\n }\n\n #injectWidgetCss(): void {\n if (this.#widgetCssInjected) return\n const css = WIDGETS.map((w) => w.css)\n .filter((c): c is string => typeof c === 'string' && c.length > 0)\n .join('\\n')\n if (css) {\n const style = this.#root.querySelector('style')\n if (style) style.append(`\\n${css}`)\n }\n this.#widgetCssInjected = true\n }\n\n #chromeEnabled(): boolean {\n return WIDGETS.some(\n (w) => (w.placement ?? 'zone') === 'chrome' && this.#widgets[w.key]?.enabled === true,\n )\n }\n\n #renderChrome(state: SmartCartState | null): void {\n this.#injectWidgetCss()\n const chrome = this.#root.querySelector('[data-chrome]')\n if (!chrome) return\n const html = WIDGETS.filter((w) => (w.placement ?? 'zone') === 'chrome')\n .map((w) => {\n const cfg = this.#widgets[w.key]\n if (cfg?.enabled !== true) return ''\n return w.render({\n config: cfg,\n state,\n formatMoney,\n ...(this.#upsellVariants !== null && { variants: this.#upsellVariants }),\n })\n })\n .join('')\n chrome.innerHTML = html\n }\n\n #renderWidgets(state: SmartCartState | null): void {\n this.#injectWidgetCss()\n const zones = new Map<WidgetZone, Element>()\n for (const zone of this.#root.querySelectorAll('[data-widget-zone]')) {\n zones.set(zone.getAttribute('data-widget-zone') as WidgetZone, zone)\n }\n // Multiple widgets can share one zone (e.g. addOn + discountCode both target 'footer', addOn\n // first per registry order). Accumulate each enabled widget's HTML per zone in registry order, then write every\n // zone's innerHTML exactly once below — a single writer per zone, so a later widget never\n // overwrites an earlier one and a disabled widget never wipes an enabled sibling. A zone with\n // no enabled widget falls through to '' (cleared).\n const html = new Map<WidgetZone, string>()\n for (const widget of WIDGETS) {\n if ((widget.placement ?? 'zone') !== 'zone') continue\n if (!widget.zone || !zones.has(widget.zone)) continue\n const cfg = this.#widgets[widget.key]\n if (cfg?.enabled !== true) continue\n let rendered = ''\n try {\n rendered = widget.render({\n config: cfg,\n state,\n formatMoney,\n ...(this.#upsellVariants !== null && { variants: this.#upsellVariants }),\n ...(this.#productVariants.size > 0 && { productVariants: this.#productVariants }),\n })\n } catch (err) {\n console.error(`[kotao-smart-cart] widget render failed`, widget.key, err)\n }\n html.set(widget.zone, (html.get(widget.zone) ?? '') + rendered)\n }\n for (const [name, zone] of zones) {\n zone.innerHTML = html.get(name) ?? ''\n }\n }\n\n /** Positive integer minutes from the enabled reservationTimer widget config, or null.\n * Mirrors the widget's own resolution exactly: absent `minutes` → TIMER_DEFAULT_MINUTES;\n * present but invalid (non-number / ≤0 / non-finite) → null (no interval). */\n #reservationMinutes(): number | null {\n const cfg = this.#widgets[RESERVATION_TIMER_KEY]\n if (cfg?.enabled !== true) return null\n const raw = cfg.minutes\n if (raw === undefined) return TIMER_DEFAULT_MINUTES\n return typeof raw === 'number' && Number.isFinite(raw) && raw > 0 ? Math.floor(raw) : null\n }\n\n /** Compute the element-lifetime end time once and start a single per-second tick. Idempotent:\n * guards on #timerEndMs so it never resets the end time or starts a second interval after\n * expiry (post-expiry re-open stays expired — start-once for the element's lifetime). */\n #startTimerIfNeeded(): void {\n if (this.#timerEndMs !== null) return\n const minutes = this.#reservationMinutes()\n if (minutes === null) return\n this.#timerEndMs = Date.now() + minutes * MS_PER_MINUTE\n this.#timerIntervalId = setInterval(() => this.#tickCountdown(), TIMER_TICK_MS)\n }\n\n /** Surgically update the countdown span's text; stop the interval at expiry. No full re-render. */\n #tickCountdown(): void {\n const span = this.#root.querySelector('[data-ksc-countdown]')\n if (!span) return\n if (this.#timerEndMs === null) return\n const remaining = Math.max(0, this.#timerEndMs - Date.now())\n if (remaining === 0) {\n span.textContent = span.getAttribute('data-ksc-end-text') ?? formatCountdown(0)\n if (this.#timerIntervalId !== null) {\n clearInterval(this.#timerIntervalId)\n this.#timerIntervalId = null\n }\n return\n }\n span.textContent = formatCountdown(remaining)\n }\n\n /** One cart line as a rich card: image, title, struck compare-at, options/personalization,\n * quantity stepper, price, \"You save …\" badge, and a remove control. */\n #renderLine(l: SmartCartLine): string {\n const id = escapeHtml(l.id)\n const image = l.imageUrl\n ? `<img class=\"ksc-line__img\" src=\"${escapeHtml(l.imageUrl)}\" alt=\"${escapeHtml(l.title)}\" width=\"64\" height=\"64\" loading=\"lazy\">`\n : `<div class=\"ksc-line__img ksc-line__img--ph\" aria-hidden=\"true\"></div>`\n\n // Meta lines (top→bottom, matching the live cart): visible (non-`_`-prefixed) line properties\n // such as personalization, then either an in-cart variant `<select>` (when the product's sibling\n // variants have resolved) or the static option text.\n const opts = l.options ?? (l.variantTitle ? [{ name: '', value: l.variantTitle }] : [])\n const handle = l.productHandle ?? null\n const variants = handle ? this.#productVariants.get(handle) : undefined\n const hasSwitcher = variants !== undefined && variants.length > 1\n const optName = l.options?.[0]?.name ?? ''\n\n // Property/option meta mirrors the original cart: grey label, BOLD value (\"Personalized: Yes\").\n const propLines = (l.properties ?? []).map(\n (p) =>\n `<span class=\"ksc-line__opt\">${escapeHtml(p.name)}: <b>${escapeHtml(p.value)}</b></span>`,\n )\n const optLines = hasSwitcher\n ? []\n : opts.map((o) =>\n o.name\n ? `<span class=\"ksc-line__opt\">${escapeHtml(o.name)}: <b>${escapeHtml(o.value)}</b></span>`\n : `<span class=\"ksc-line__opt\">${escapeHtml(o.value)}</span>`,\n )\n const switcher = hasSwitcher\n ? `<div class=\"ksc-line__variant\">${optName ? `<span>${escapeHtml(optName)}:</span>` : ''}<select class=\"ksc-line__select\" data-smart-cart-variant data-line-id=\"${id}\" data-qty=\"${l.quantity}\" aria-label=\"${escapeHtml(optName || 'Variant')}\">${variants!\n .map(\n (v) =>\n `<option value=\"${escapeHtml(v.id)}\"${v.title === l.variantTitle ? ' selected' : ''}>${escapeHtml(v.title ?? '')}</option>`,\n )\n .join('')}</select></div>`\n : ''\n\n const metaParts = [...propLines, ...optLines, ...(switcher ? [switcher] : [])]\n const meta = metaParts.length ? `<div class=\"ksc-line__meta\">${metaParts.join('')}</div>` : ''\n\n // Model B (line shows what you pay, #1560): the main price is ALWAYS the final, post-discount\n // `linePrice`. The struck \"was\" price is the genuine-sale compareAtLinePrice when it beats\n // linePrice; else, for a line with a discount but no sale (e.g. a non-sale BOGO), it falls back\n // to originalLinePrice when that beats linePrice. \"You save\" is struck − linePrice (using the\n // FINAL price), so it reflects the total saving vs. the original — not just the sale portion.\n const hasLineDiscount = (l.discountAllocations?.length ?? 0) > 0\n const struck: Money | undefined =\n l.compareAtLinePrice && l.compareAtLinePrice.amount > l.linePrice.amount\n ? l.compareAtLinePrice\n : hasLineDiscount && l.originalLinePrice && l.originalLinePrice.amount > l.linePrice.amount\n ? l.originalLinePrice\n : undefined\n const compare = struck\n ? `<span class=\"ksc-line__compare\">${escapeHtml(formatMoney(struck))}</span>`\n : ''\n const save =\n struck && struck.amount - l.linePrice.amount > 0\n ? `<span class=\"ksc-line__save\">${TAG_SVG}You save ${escapeHtml(\n formatMoneyCompact({\n amount: struck.amount - l.linePrice.amount,\n currency: l.linePrice.currency,\n }),\n )}</span>`\n : ''\n\n // Discount sub-row(s), unchanged: a struck-to-€0 \"FREE\" row per freed unit for a Buy-X-Get-Y\n // allocation, or a plain \"−amount\" row for a whole-line %. The main price above is now always\n // the final price, so these rows are purely informational (not subtracted from anything).\n const displayPrice = l.linePrice\n const discountRows = hasLineDiscount\n ? l\n .discountAllocations!.map((a) => {\n const code = escapeHtml(a.code)\n if (typeof a.quantity === 'number' && a.quantity > 0) {\n const unit = Math.round((l.originalLinePrice ?? l.linePrice).amount / l.quantity)\n const struck = escapeHtml(\n formatMoney({ amount: unit * a.quantity, currency: l.linePrice.currency }),\n )\n return `<div class=\"ksc-line__discount\"><span>🎁 ${a.quantity}× ${code} — <s>${struck}</s> FREE · You save 100%</span></div>`\n }\n return `<div class=\"ksc-line__discount\"><span>🏷 ${code} −${escapeHtml(formatMoney(a.amount))}</span></div>`\n })\n .join('')\n : ''\n\n // Layout mirrors the original cart: title + meta on the left, a right-aligned stacked price\n // column (struck compare-at above the final price above the savings badge), and a bottom row\n // with the quantity stepper left and the remove control right.\n return `<div class=\"ksc-line\" data-line-id=\"${id}\">\n ${image}\n <div class=\"ksc-line__body\">\n <div class=\"ksc-line__top\">\n <div class=\"ksc-line__main\">\n <span class=\"ksc-line__title\">${escapeHtml(l.title)}</span>\n ${meta}\n ${discountRows}\n </div>\n <div class=\"ksc-line__prices\">\n ${compare}\n <span class=\"ksc-line__price\">${escapeHtml(formatMoney(displayPrice))}</span>\n ${save}\n </div>\n </div>\n <div class=\"ksc-line__bottom\">\n <div class=\"ksc-qty\">\n <button type=\"button\" data-smart-cart-qty-dec data-qty=\"${l.quantity}\" aria-label=\"Decrease quantity\">−</button>\n <span class=\"ksc-qty__n\">${l.quantity}</span>\n <button type=\"button\" data-smart-cart-qty-inc data-qty=\"${l.quantity}\" aria-label=\"Increase quantity\">+</button>\n </div>\n <button type=\"button\" class=\"ksc-line__remove\" data-smart-cart-line-remove aria-label=\"Remove item\">${TRASH_SVG}</button>\n </div>\n </div>\n </div>`\n }\n\n #renderCart(state: SmartCartState): void {\n this.#lastState = state\n const items = this.#root.querySelector('[data-items]')\n const checkoutWrap = this.#root.querySelector('[data-checkout-wrap]')\n const continueWrap = this.#root.querySelector('[data-continue-wrap]')\n const countEl = this.#root.querySelector('[data-cart-count]')\n if (!items || !checkoutWrap) return\n // The add-on is represented by its toggle widget, never a cart line — hide its line from the\n // item list AND the header count (its price still counts toward the subtotal/total, like the\n // real cart line it is). Same filter pattern the upsell carousel uses for already-added items.\n const addOnVariantId = this.#addOnVariantId()\n const displayLines =\n addOnVariantId === null\n ? state.lines\n : state.lines.filter((l) => l.variantId !== addOnVariantId)\n if (countEl) {\n const count = displayLines.reduce((sum, l) => sum + l.quantity, 0)\n countEl.textContent = count > 0 ? `· ${count}` : ''\n }\n try {\n if (displayLines.length === 0) {\n items.innerHTML = `<div class=\"ksc-empty\">${BAG_SVG}<p data-empty>Your cart is empty</p></div>`\n checkoutWrap.innerHTML = ''\n if (continueWrap)\n continueWrap.innerHTML = `<button type=\"button\" class=\"ksc-continue\" data-smart-cart-close>Continue shopping</button>`\n this.#renderWidgets(state)\n this.#startTimerIfNeeded()\n this.#tickCountdown()\n return\n }\n items.innerHTML = displayLines.map((l) => this.#renderLine(l)).join('')\n\n // Model B (line shows what you pay, #1560): the Subtotal is the sum of the FINAL line prices\n // over ALL state.lines (including the hidden add-on line, so its price still counts), and the\n // Total equals that same sum — so the lines visibly sum to the Subtotal. The \"Discounts\" row\n // above it shows the REAL applied discounts (cart discountTotal, falling back to the named\n // cart-level allocations) so it matches the checkout's Discounts row exactly — NOT the\n // savings-vs-compare-at total (that stays per-line as struck prices + \"You save\" badges;\n // showing it here as \"Discounts\" made the drawer disagree with the checkout, e.g. −€184 in\n // the drawer vs −€54 at checkout for a compare-at-heavy BOGO cart). Informational only,\n // never subtracted from the Subtotal.\n const finalSubtotal: Money = {\n amount: state.lines.reduce((sum, l) => sum + l.linePrice.amount, 0),\n currency: state.subtotal.currency,\n }\n const discountsTotal =\n state.discountTotal?.amount ??\n state.discountAllocations?.reduce((sum, a) => sum + a.amount.amount, 0) ??\n 0\n const displayTotal: Money = finalSubtotal\n const rows: string[] = [\n ...(discountsTotal > 0\n ? [\n `<div class=\"ksc-summary__row ksc-summary__row--discount\"><span>Discounts</span><span>-${escapeHtml(formatMoney({ amount: discountsTotal, currency: state.subtotal.currency }))}</span></div>`,\n ]\n : []),\n `<div class=\"ksc-summary__row ksc-summary__row--total\"><span>Subtotal</span><span>${escapeHtml(formatMoney(finalSubtotal))}</span></div>`,\n ]\n const totalLabel = escapeHtml(formatMoney(displayTotal))\n checkoutWrap.innerHTML = `<div class=\"ksc-summary\">${rows.join('')}</div>\n <a class=\"checkout\" data-checkout href=\"${escapeHtml(state.checkoutUrl)}\">Checkout${totalLabel ? ` • ${totalLabel}` : ''}</a>`\n if (continueWrap)\n continueWrap.innerHTML = `<button type=\"button\" class=\"ksc-continue\" data-smart-cart-close>or continue shopping</button>`\n } catch (err) {\n console.error('[kotao-smart-cart] render failed', err)\n // Ensure the shell always renders a checkout link even when the cart body fails.\n checkoutWrap.innerHTML = `<a class=\"checkout\" data-checkout href=\"${escapeHtml(state.checkoutUrl)}\">Checkout</a>`\n }\n this.#renderWidgets(state)\n this.#startTimerIfNeeded()\n this.#tickCountdown()\n }\n}\n","import type { SmartCartMountConfig } from './config'\n\n/**\n * Default cart-trigger selectors — the controls that OPEN the drawer. Conservative + theme-agnostic:\n * explicit opt-in and cart links. Add-to-cart submits are deliberately NOT here: clicking \"Add to\n * cart\" must ADD the product and then open (see `readAddToCartIntent` + mount's handler), not merely\n * open the drawer on the current cart. Merchants can union extra open-triggers via config; a migrator\n * follow-up will emit data-kotao-cart markers so re-imported themes are zero-config.\n */\nexport const DEFAULT_CART_SELECTORS: readonly string[] = [\n '[data-kotao-cart]',\n 'a[href$=\"/cart\"]',\n 'a[href*=\"/cart?\"]',\n]\n\n/** The default selectors unioned with any merchant-supplied ones (deduped). */\nexport function resolveCartSelectors(config: Pick<SmartCartMountConfig, 'selectors'>): string[] {\n return [...new Set([...DEFAULT_CART_SELECTORS, ...(config.selectors ?? [])])]\n}\n\n/** True when the clicked target (or an ancestor) matches any cart-trigger (open-drawer) selector. */\nexport function isCartTrigger(target: EventTarget | null, selectors: string[]): boolean {\n if (!(target instanceof Element) || selectors.length === 0) return false\n const query = selectors.join(',')\n return target.closest(query) !== null\n}\n\n/** The Shopify-shaped product form (`<form action=\".../cart/add\">`) and its submit controls. */\nconst ADD_FORM_SELECTOR = 'form[action$=\"/cart/add\"]'\nconst ADD_SUBMIT_SELECTOR = '[type=\"submit\"], [name=\"add\"]'\n\n/** A resolved add-to-cart request read from a product form's fields. */\nexport interface AddToCartIntent {\n /** The selected variant id (the form's hidden `id` field). */\n readonly variantId: string\n /** Requested quantity (form `quantity`, default 1, never < 1). */\n readonly quantity: number\n /** Line-item properties from `properties[<key>]` fields, when any are present. */\n readonly properties?: Record<string, string>\n}\n\n/** The Shopify product form (`<form action=\".../cart/add\">`) enclosing an add-to-cart submit `target`,\n * or null. Lets the caller run the form's own constraint validation before taking over the add. */\nexport function findAddToCartForm(target: EventTarget | null): HTMLFormElement | null {\n if (!(target instanceof Element)) return null\n const form = target.closest(ADD_SUBMIT_SELECTOR)?.closest(ADD_FORM_SELECTOR)\n return form instanceof HTMLFormElement ? form : null\n}\n\n/**\n * When `target` is (or is within) an add-to-cart submit control of a Shopify product form, reads the\n * form's variant id + quantity + line-item properties. Returns null for anything else — cart links,\n * unrelated buttons, or an add form with no resolvable variant id (so the caller lets the theme's own\n * add run rather than silently swallowing the click). Pure DOM read; no side effects.\n */\nexport function readAddToCartIntent(target: EventTarget | null): AddToCartIntent | null {\n const form = findAddToCartForm(target)\n if (form === null) return null\n\n const data = new FormData(form)\n const rawId = data.get('id')\n const variantId = typeof rawId === 'string' ? rawId.trim() : ''\n if (variantId === '') return null\n\n const rawQty = Number(data.get('quantity'))\n const quantity = Number.isFinite(rawQty) && rawQty >= 1 ? Math.trunc(rawQty) : 1\n\n const properties: Record<string, string> = {}\n for (const [key, value] of data.entries()) {\n const match = /^properties\\[(.+)\\]$/.exec(key)\n if (match && typeof value === 'string' && value.trim() !== '') properties[match[1]!] = value\n }\n return Object.keys(properties).length > 0\n ? { variantId, quantity, properties }\n : { variantId, quantity }\n}\n","import type { CartAdapter } from './cart-adapter'\nimport type { SmartCartMountConfig } from './config'\nimport type { VariantLookup } from './variant-lookup'\nimport { SmartCartElement } from './element'\nimport {\n findAddToCartForm,\n isCartTrigger,\n readAddToCartIntent,\n resolveCartSelectors,\n} from './interception'\n\nexport interface SmartCartHandle {\n open(): Promise<void>\n close(): void\n destroy(): void\n}\n\nexport interface MountOptions {\n readonly config: SmartCartMountConfig\n readonly adapter: CartAdapter\n /** Variant display-data seam for the upsell carousel (productVariantsByIds). Optional — without it\n * the carousel never resolves variants and renders nothing. */\n readonly variantLookup?: VariantLookup\n /** Where to append the element (defaults to document.body). */\n readonly root?: ParentNode & Node\n}\n\n/** Registers the element, mounts one instance, and wires a delegated cart-trigger listener. */\nexport function mountSmartCart(opts: MountOptions): SmartCartHandle {\n SmartCartElement.register()\n const root = opts.root ?? document.body\n const el = document.createElement(SmartCartElement.tagName) as SmartCartElement\n el.setAdapter(opts.adapter)\n if (opts.variantLookup) el.setVariantLookup(opts.variantLookup)\n if (opts.config.branding) el.setBranding(opts.config.branding)\n el.setWidgets(opts.config.widgets)\n root.appendChild(el)\n\n const selectors = resolveCartSelectors(opts.config)\n const onClick = (event: Event): void => {\n // Add-to-cart submit: ADD the product via our adapter, then open the drawer on the result —\n // never a bare open (the bug this fixes: the add-to-cart button used to just open the drawer on\n // the unchanged cart, so nothing was ever added). Only when a variant id resolves do we take over\n // and preventDefault the theme's native /cart/add submit; otherwise the theme handles it.\n const addIntent = readAddToCartIntent(event.target)\n if (addIntent !== null) {\n event.preventDefault()\n event.stopPropagation()\n // Respect the product form's own constraint validation before adding: a required line-item\n // property — e.g. a personalization field rendered with `required` — must block the add and\n // surface the browser's native localized message, exactly as the theme's native submit would.\n // reportValidity() runs native constraints + shows that UI WITHOUT submitting, so (unlike\n // dispatching a synthetic submit) it can't trigger the theme's own /cart/add handler and cause\n // a double add. Gated-off (disabled) personalization controls are excluded natively.\n const form = findAddToCartForm(event.target)\n if (form !== null && typeof form.reportValidity === 'function' && !form.reportValidity())\n return\n void el.addLineAndOpen(addIntent.variantId, addIntent.quantity, addIntent.properties)\n return\n }\n if (!isCartTrigger(event.target, selectors)) return\n event.preventDefault()\n event.stopPropagation()\n void el.open()\n }\n document.addEventListener('click', onClick, true)\n\n return {\n open: () => el.open(),\n close: () => el.close(),\n destroy: () => {\n document.removeEventListener('click', onClick, true)\n el.remove()\n },\n }\n}\n","import {\n mountSmartCart,\n type SmartCartHandle,\n} from '@kotao/smart-cart'\n\nimport type { CartAdapter, SmartCartMountConfig } from './smart-cart-types'\n\n// Custom storefronts mount exactly one drawer; the module-level active handle lets openSmartCart()\n// reach it from an explicit cart trigger without prop-drilling a ref through the theme. This wiring is\n// deliberately React-free so it is unit-testable in Node (the SDK has no DOM test environment) — the\n// <CartDrawerOverlay> wrapper is the only React touchpoint.\nlet activeHandle: SmartCartHandle | null = null\n\n/** Mounts the drawer and records it as the active handle. Browser-only — call from a client effect. */\nexport function attachSmartCart(\n config: SmartCartMountConfig,\n adapter: CartAdapter,\n): SmartCartHandle {\n const handle = mountSmartCart({ config, adapter })\n activeHandle = handle\n return handle\n}\n\n/** Tears down a drawer, clearing the active handle only if it is still the active one. */\nexport function detachSmartCart(handle: SmartCartHandle): void {\n if (activeHandle === handle) activeHandle = null\n handle.destroy()\n}\n\n/** Opens the active Smart Cart drawer (no-op if none is mounted). Wire to explicit cart-button clicks. */\nexport function openSmartCart(): void {\n void activeHandle?.open()\n}\n","import { useEffect } from 'react'\n\nimport { attachSmartCart, detachSmartCart, openSmartCart } from './cart-drawer-mount'\nimport type { CartAdapter, SmartCartMountConfig } from './smart-cart-types'\n\nexport { openSmartCart }\n\nexport interface CartDrawerOverlayProps {\n /** Per-storefront Smart Cart config (selectors/branding). Pass shop.smartCart-derived config here. */\n readonly config: SmartCartMountConfig\n /** Cart data seam — typically createStorefrontApiCartAdapter(...). */\n readonly adapter: CartAdapter\n}\n\n/**\n * Mounts the framework-agnostic Smart Cart drawer for a custom (Hydrogen/SDK) theme. Client-only:\n * renders null on the server and mounts the Web Component after hydration. Memoize `config`/`adapter`\n * in the theme so the effect doesn't remount on every render.\n */\nexport function CartDrawerOverlay({ config, adapter }: CartDrawerOverlayProps): null {\n useEffect(() => {\n if (typeof window === 'undefined') return\n const handle = attachSmartCart(config, adapter)\n return () => detachSmartCart(handle)\n }, [config, adapter])\n return null\n}\n","import {\n Children,\n cloneElement,\n createContext,\n createElement,\n isValidElement,\n useContext,\n useEffect,\n useMemo,\n useSyncExternalStore,\n type CSSProperties,\n type ComponentType,\n type MouseEvent,\n type PointerEvent,\n type ReactElement,\n type ReactNode,\n} from 'react'\n\nimport {\n resolveHydrogenEditorStyles,\n type HydrogenEditorInstanceSnapshot,\n type HydrogenEditorPreviewRuntime,\n type HydrogenEditorReconciliationReason,\n} from '../editor/hydrogen'\n\nexport interface HydrogenEditorRegisteredComponentProps {\n readonly instanceId: string\n readonly props: Readonly<Record<string, unknown>>\n readonly styles: Readonly<Record<string, string | number>>\n readonly slots: Readonly<Record<string, readonly string[]>>\n readonly variantId?: string\n}\n\nexport type HydrogenEditorRegisteredComponent =\n ComponentType<HydrogenEditorRegisteredComponentProps>\n\ninterface HydrogenEditorReactContextValue {\n readonly preview: HydrogenEditorPreviewRuntime\n readonly components: Readonly<Record<string, HydrogenEditorRegisteredComponent>>\n readonly viewportWidth?: number\n}\n\nconst HydrogenEditorReactContext = createContext<HydrogenEditorReactContextValue | null>(null)\nconst HYDROGEN_CANVAS_INTENT_EVENT = 'kotao:hydrogen-canvas-intent'\nconst HYDROGEN_CANVAS_RESULT_EVENT = 'kotao:hydrogen-canvas-result'\nconst HYDROGEN_CANVAS_STATE_EVENT = 'kotao:hydrogen-canvas-state'\nconst HYDROGEN_CANVAS_STATE_REQUEST_EVENT = 'kotao:hydrogen-canvas-state-request'\n\nfunction useHydrogenEditorCanvasEvents(preview: HydrogenEditorPreviewRuntime): void {\n const snapshot = useSyncExternalStore(\n (listener) => preview.store.subscribe(listener),\n () => preview.store.getSnapshot(),\n () => preview.store.getSnapshot(),\n )\n\n useEffect(() => {\n if (typeof document === 'undefined' || typeof CustomEvent === 'undefined') return\n const dispatchState = (): void => {\n document.dispatchEvent(\n new CustomEvent(HYDROGEN_CANVAS_STATE_EVENT, {\n detail: {\n selectedInstanceId: snapshot.selectedInstanceId,\n hoveredInstanceId: snapshot.hoveredInstanceId,\n selectionStatus: snapshot.selectionStatus,\n revision: snapshot.revision,\n },\n }),\n )\n }\n dispatchState()\n document.addEventListener(HYDROGEN_CANVAS_STATE_REQUEST_EVENT, dispatchState)\n return () => document.removeEventListener(HYDROGEN_CANVAS_STATE_REQUEST_EVENT, dispatchState)\n }, [\n snapshot.hoveredInstanceId,\n snapshot.revision,\n snapshot.selectedInstanceId,\n snapshot.selectionStatus,\n ])\n\n useEffect(() => {\n if (typeof document === 'undefined' || typeof CustomEvent === 'undefined') return\n const onIntent = (event: Event): void => {\n if (!(event instanceof CustomEvent)) return\n const result = preview.dispatchCanvasIntent(event.detail)\n document.dispatchEvent(new CustomEvent(HYDROGEN_CANVAS_RESULT_EVENT, { detail: result }))\n }\n document.addEventListener(HYDROGEN_CANVAS_INTENT_EVENT, onIntent)\n return () => document.removeEventListener(HYDROGEN_CANVAS_INTENT_EVENT, onIntent)\n }, [preview])\n}\n\nexport interface HydrogenEditorProviderProps {\n readonly preview: HydrogenEditorPreviewRuntime\n readonly documentId: string\n readonly route?: string\n readonly reconciliationReason?: HydrogenEditorReconciliationReason\n /**\n * Changes when same-route loader data or an HMR generation reconciles. It is deliberately not\n * interpreted as authority and is never sent across the bridge.\n */\n readonly reconciliationKey?: string | number\n readonly components?: Readonly<Record<string, HydrogenEditorRegisteredComponent>>\n readonly viewportWidth?: number\n readonly children: ReactNode\n}\n\n/**\n * Activates the editor runtime for a route. Route/loader/HMR changes reconcile the existing\n * preview store instead of replacing it, so source-backed draft operations and selection remain\n * visible. The provider is editor-only and must not be mounted in ordinary public responses.\n */\nexport function HydrogenEditorProvider({\n children,\n components = {},\n documentId,\n preview,\n reconciliationKey,\n reconciliationReason = 'route',\n route,\n viewportWidth,\n}: HydrogenEditorProviderProps): ReactElement {\n useHydrogenEditorCanvasEvents(preview)\n const value = useMemo(\n () => ({\n preview,\n components,\n ...(viewportWidth !== undefined ? { viewportWidth } : {}),\n }),\n [components, preview, viewportWidth],\n )\n\n useEffect(() => {\n preview.reconcile(documentId, reconciliationReason, route)\n preview.ready()\n }, [documentId, preview, reconciliationKey, reconciliationReason, route])\n\n return (\n <HydrogenEditorReactContext.Provider value={value}>\n {children}\n </HydrogenEditorReactContext.Provider>\n )\n}\n\nfunction useHydrogenEditorContext(): HydrogenEditorReactContextValue {\n const context = useContext(HydrogenEditorReactContext)\n if (context === null) {\n throw new Error('Hydrogen editor hooks must be rendered inside HydrogenEditorProvider')\n }\n return context\n}\n\nfunction useInstanceSnapshot(instanceId: string): HydrogenEditorInstanceSnapshot | null {\n const { preview } = useHydrogenEditorContext()\n return useSyncExternalStore(\n (listener) => preview.store.subscribeInstance(instanceId, listener),\n () => preview.store.getInstanceSnapshot(instanceId),\n () => preview.store.getInstanceSnapshot(instanceId),\n )\n}\n\nexport interface HydrogenEditorReactInstance {\n readonly snapshot: HydrogenEditorInstanceSnapshot\n readonly props: Readonly<Record<string, unknown>>\n readonly styles: Readonly<Record<string, string | number>>\n}\n\n/**\n * Subscribes to exactly one component instance. A prop/style operation invalidates only this\n * subscription; structural operations additionally invalidate the affected parent/slot.\n */\nexport function useHydrogenEditorInstance(\n instanceId: string,\n sourceProps: Readonly<Record<string, unknown>> = {},\n): HydrogenEditorReactInstance | null {\n const { preview, viewportWidth } = useHydrogenEditorContext()\n const snapshot = useInstanceSnapshot(instanceId)\n return useMemo(() => {\n if (snapshot === null) return null\n return {\n snapshot,\n props: { ...sourceProps, ...snapshot.resolvedProps },\n styles: resolveHydrogenEditorStyles(preview.manifest, snapshot.instance, viewportWidth),\n }\n }, [preview.manifest, snapshot, sourceProps, viewportWidth])\n}\n\nexport function useHydrogenEditorSlot(parentInstanceId: string, slotId: string): readonly string[] {\n const snapshot = useInstanceSnapshot(parentInstanceId)\n return snapshot?.childInstanceIds[slotId] ?? []\n}\n\nexport interface HydrogenEditorBoundaryProps {\n readonly instanceId: string\n readonly children: ReactElement\n readonly applyPreviewProps?: boolean\n readonly viewportWidth?: number\n}\n\n/**\n * A reconciliation and interaction boundary for one extracted JSX instance. It uses a\n * `display: contents` marker only in editor mode, preserving the component's layout while clicks\n * and pointer transitions remain attributable to the stable instance ID.\n */\nexport function HydrogenEditorBoundary({\n applyPreviewProps = true,\n children,\n instanceId,\n viewportWidth,\n}: HydrogenEditorBoundaryProps): ReactElement | null {\n const { preview, viewportWidth: contextViewportWidth } = useHydrogenEditorContext()\n const snapshot = useInstanceSnapshot(instanceId)\n\n useEffect(() => preview.registerInstance(instanceId), [instanceId, preview])\n\n if (snapshot === null) return null\n const child = Children.only(children)\n if (!isValidElement<Record<string, unknown>>(child)) return null\n const effectiveViewportWidth = viewportWidth ?? contextViewportWidth\n const previewProps = applyPreviewProps ? snapshot.resolvedProps : {}\n const childStyle = isRecordStyle(child.props.style) ? child.props.style : {}\n const previewStyle = applyPreviewProps\n ? resolveHydrogenEditorStyles(preview.manifest, snapshot.instance, effectiveViewportWidth)\n : {}\n const renderedChild = cloneElement(child, {\n ...previewProps,\n ...(Object.keys(previewStyle).length > 0\n ? { style: { ...childStyle, ...previewStyle } as CSSProperties }\n : {}),\n })\n const blockingReason = snapshot.capabilityReasons.find((reason) => reason.severity === 'blocking')\n const inlineProps = snapshot.component.props\n .filter(\n (control) =>\n control.allowedBindings.includes('inline') &&\n (snapshot.instance.props[control.propName] ?? control.defaultBinding)?.kind !==\n 'external' &&\n (control.control === 'text' ||\n control.control === 'textarea' ||\n control.control === 'richtext'),\n )\n .map((control) => ({ propName: control.propName, label: control.label }))\n const layoutControls = snapshot.component.styles.layout\n .filter((control) => ['gap', 'height', 'margin', 'padding', 'width'].includes(control.control))\n .map((control) => ({\n controlId: control.controlId,\n control: control.control,\n label: control.label,\n allowedValues: control.allowedValues,\n }))\n const onPointerEnter = (_event: PointerEvent<HTMLSpanElement>): void => {\n preview.hoverInstance(instanceId)\n }\n const onPointerLeave = (_event: PointerEvent<HTMLSpanElement>): void => {\n preview.hoverInstance(null)\n }\n const onClick = (event: MouseEvent<HTMLSpanElement>): void => {\n event.preventDefault()\n event.stopPropagation()\n preview.selectInstance(instanceId)\n }\n\n return (\n <span\n data-kotao-hydrogen-capability={snapshot.editable ? 'editable' : 'read-only'}\n data-kotao-hydrogen-capabilities={snapshot.component.capabilities.join(' ')}\n data-kotao-hydrogen-component={snapshot.component.componentId}\n data-kotao-hydrogen-instance={instanceId}\n data-kotao-hydrogen-inline-props={JSON.stringify(inlineProps)}\n data-kotao-hydrogen-label={snapshot.component.name}\n data-kotao-hydrogen-layout-controls={JSON.stringify(layoutControls)}\n data-kotao-hydrogen-reason={blockingReason?.code}\n onClick={onClick}\n onPointerEnter={onPointerEnter}\n onPointerLeave={onPointerLeave}\n style={{ display: 'contents' }}\n >\n {renderedChild}\n </span>\n )\n}\n\nfunction isRecordStyle(value: unknown): value is Readonly<Record<string, string | number>> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\ninterface HydrogenEditorRegisteredInstanceProps {\n readonly instanceId: string\n}\n\nfunction HydrogenEditorRegisteredInstance({\n instanceId,\n}: HydrogenEditorRegisteredInstanceProps): ReactElement | null {\n const { components } = useHydrogenEditorContext()\n const instance = useHydrogenEditorInstance(instanceId)\n if (instance === null) return null\n const Component = components[instance.snapshot.component.componentId]\n if (Component === undefined) {\n return (\n <span\n data-kotao-hydrogen-instance={instanceId}\n data-kotao-hydrogen-reason=\"COMPONENT_RENDERER_UNAVAILABLE\"\n style={{ display: 'contents' }}\n />\n )\n }\n return (\n <HydrogenEditorBoundary applyPreviewProps={false} instanceId={instanceId}>\n {createElement(Component, {\n instanceId,\n props: instance.props,\n styles: instance.styles,\n slots: instance.snapshot.childInstanceIds,\n ...(instance.snapshot.instance.variantId !== undefined\n ? { variantId: instance.snapshot.instance.variantId }\n : {}),\n })}\n </HydrogenEditorBoundary>\n )\n}\n\nexport interface HydrogenEditorSlotProps {\n readonly parentInstanceId: string\n readonly slotId: string\n /**\n * Source-rendered children keyed by stable instance ID. Newly inserted instances fall through to\n * the registered component library without replacing or regenerating existing route source.\n */\n readonly existingChildren?: Readonly<Record<string, ReactElement>>\n readonly empty?: ReactNode\n}\n\nexport function HydrogenEditorSlot({\n empty = null,\n existingChildren = {},\n parentInstanceId,\n slotId,\n}: HydrogenEditorSlotProps): ReactElement {\n const parent = useInstanceSnapshot(parentInstanceId)\n const instanceIds = useHydrogenEditorSlot(parentInstanceId, slotId)\n const slot = parent?.component.slots.find((candidate) => candidate.slotId === slotId)\n return (\n <span\n data-kotao-hydrogen-slot={slotId}\n data-kotao-hydrogen-slot-accepts={\n slot?.accepts.mode === 'any' ? '*' : (slot?.accepts.componentIds.join(' ') ?? '')\n }\n data-kotao-hydrogen-slot-count={instanceIds.length}\n data-kotao-hydrogen-slot-insertion={slot?.insertion ?? 'fixed'}\n data-kotao-hydrogen-slot-label={slot?.label ?? slotId}\n data-kotao-hydrogen-slot-max={slot?.maxInstances ?? 0}\n data-kotao-hydrogen-slot-parent={parentInstanceId}\n style={{ display: 'contents' }}\n >\n {instanceIds.length === 0\n ? empty\n : instanceIds.map((instanceId) => {\n const existing = existingChildren[instanceId]\n return existing === undefined ? (\n <HydrogenEditorRegisteredInstance instanceId={instanceId} key={instanceId} />\n ) : (\n <HydrogenEditorBoundary instanceId={instanceId} key={instanceId}>\n {existing}\n </HydrogenEditorBoundary>\n )\n })}\n </span>\n )\n}\n"]}