{"version":3,"file":"index.es.min.js","sources":["../../../packages/components/src/colors/components/color/constants.mjs","../../../packages/helpers/src/props.helpers.js","../../../packages/helpers/src/assets/js/eventDispatch.js","../../../packages/components/src/constants.mjs","../../../packages/helpers/src/getCurrency.js","../../../packages/helpers/src/catalog.js","../../../packages/page-builder-sections/src/cross-sell/services/fetcher.service.js","../../../packages/components/src/colors/components/color/color.js","../../../packages/components/src/colors/colors.js","../../../packages/components/src/colors/constants.mjs","../../../packages/components/src/card-labels/cardLabels.js","../../../packages/components/src/nespressoElement/nespressoElement.js","../../../packages/helpers/src/viewport.helpers.ts","../../../packages/helpers/src/utils.ts","../../../packages/components/src/sku/fragments/image.js","../../../packages/components/src/sku/constants.mjs","../../../packages/components/src/sku/fragments/heading.js","../../../packages/components/src/sku/fragments/headline.js","../../../packages/components/src/sku/fragments/labelTechnology.js","../../../packages/components/src/sku/fragments/labelRange.js","../../../packages/components/src/sku/fragments/strikethroughPrice.js","../../../packages/helpers/src/dataLayer.js","../../../packages/components/src/sku/fragments/addToCart.js","../../../packages/components/src/sku/fragments/additionalMessage.js","../../../packages/helpers/src/cremaDataHelper.js","../../../packages/components/src/sku-coffee/services/index.js","../../../packages/page-builder-sections/src/cross-sell-natural/dataTransform/product.coffee.dto.js","../../../services/plp/services.js","../../../packages/components/src/sku/services/index.js","../../../packages/components/src/sku-quick-view/shared-quick-view-types.ts","../../../packages/components/src/sku-quick-view/shared-quick-view.ts","../../../packages/page-builder-sections/src/cross-sell-natural/dataTransform/product.dto.js","../../../packages/page-builder-sections/src/cross-sell-natural/dataTransform/product.machine.dto.js","../../../packages/page-builder-sections/src/cross-sell-natural/dataTransform/product.accessory.dto.js","../../../packages/page-builder-sections/src/cross-sell-natural/dataTransform/product.giftCard.dto.js","../../../packages/helpers/src/events.helpers.ts","../../../packages/helpers/src/gtmEvents.js","../../../packages/components/src/sku/sku.js","../../../packages/components/src/sku/fragments/setCardTheme.js","../../../packages/components/src/sku/fragments/labels.js","../../../packages/helpers/src/logos.helpers.js","../../../packages/components/src/sku/fragments/quickView.js","../../../packages/components/src/sku/fragments/price.js","../../../packages/helpers/src/colors.helpers.js","../../../packages/helpers/src/rating.service.js","../../../packages/components/src/sku-machine/fragments/ratings.js","../../../packages/helpers/src/deferred.js","../../../packages/helpers/src/scrollTo.ts","../../../packages/components/src/sku-machine/sku-machine.js","../../../packages/helpers/src/energy-label.helpers.js","../../../packages/components/src/sku-machine/fragments/voltage.js","../../../packages/helpers/src/assets/js/eventBus.js","../../../packages/components/src/cta/cta.js","../../../packages/components/src/img/js/constants.js","../../../packages/components/src/img/img.js","../../../packages/components/src/link/link.js","../../../packages/helpers/src/assets/js/viewportTracking.js","../../../packages/helpers/src/assets/js/zoneTracking.js","../../../packages/components/src/container/container.js","../../../packages/components/src/chip/chip.js","../../../packages/helpers/src/assets/js/scopedKeyboardNav.js","../../../packages/components/src/dropdown/dropdown.js","../../../packages/helpers/src/assets/js/productTracking.js","../../../packages/components/src/add-to-cart/addToCart.js","../../../packages/components/src/plp-sticky-bar/plp-sticky-bar.js","../../../packages/helpers/src/swipeEvents.ts","../../../packages/components/src/popin/components/overlay.js","../../../packages/components/src/popin/popin.js","../../../packages/components/src/card-logos/cardLogos.js","../../../packages/components/src/slider-menu/js/constants.js","../../../packages/components/src/slider-menu/js/SliderMenuLib.js","../../../packages/components/src/slider-menu/slider-menu.js","../../../packages/components/src/slider-natural/slider-natural.js","../../../packages/helpers/src/contrast.helpers.js","../../../packages/helpers/src/useragent.helpers.ts","../../../packages/helpers/src/refs.helpers.js","../../../packages/helpers/src/impolicy.js","../../../packages/components/src/navigation-bubbles/components/bubble/js/constants.js","../../../packages/components/src/navigation-bubbles/components/bubble/bubble.js","../../../packages/helpers/src/intersection-observer.service.js","../../../packages/components/src/navigation-bubbles/data/constants.js","../../../packages/components/src/navigation-bubbles/navigation-bubbles.js","../../../packages/components/src/navigation-bubbles/services/events.manager.js","../../../services/plp-data/src/prod/index.js","../../../packages/apps/src/plp-core/config/experiments.ts","../../../packages/apps/src/plp-core/config/constants.js","../../../packages/apps/src/plp-core/store/plp.data.js","../../../packages/apps/src/plp-core/store/plp.actions.js","../../../services/crema-service/src/Store.ts","../../../services/crema-service/src/CremaService.ts","../../../packages/apps/src/plp-core/store/plp.events.js","../../../packages/apps/src/plp-core/helpers/tracking.js","../../../packages/apps/src/plp-core/store/index.js","../../../packages/apps/src/plp-core/components/filter/popin/plp.filter-popin.mobileDropDown.js","../../../packages/apps/src/plp-core/components/filter/popin/plp.filter-popin.content.js","../../../packages/apps/src/plp-core/components/filter/popin/plp.filter-popin.footer.js","../../../packages/apps/src/plp-core/components/filter/plp.filter-popin.js","../../../packages/apps/src/plp-core/components/filter/plp.filter-cta.js","../../../packages/apps/src/plp-core/components/filter/plp.filter-links.js","../../../packages/apps/src/plp-core/components/filter/plp.filter-sort.js","../../../packages/apps/src/plp-core/components/filter/_plp.filter.main.js","../../../packages/components/src/sticky/sticky.service.js","../../../packages/apps/src/plp-core/components/navigation/plp.bar.js","../../../packages/apps/src/plp-core/components/navigation/_plp.navigation.main.js","../../../packages/apps/src/plp-core/components/results/plp.results-chip.js","../../../packages/apps/src/plp-core/components/results/plp.results-header.js","../../../packages/apps/src/plp-core/components/plp.product.js","../../../packages/apps/src/plp-core/components/results/_plp.results.main.js","../../../packages/apps/src/plp-core/components/products/_plp.products.main.js","../../../packages/apps/src/plp-core/components/products/plp.category-products.js","../../../packages/apps/src/plp-core/plp.app.js","../../../packages/apps/src/plp-core/models/Category.js","../../../packages/apps/src/plp-machine/models/machine.category.js","../../../packages/apps/src/plp-core/models/Product.js","../../../packages/apps/src/plp-machine/models/machine.product.js","../../../packages/apps/src/plp-core/models/NavigationLinks.js","../../../packages/apps/src/plp-core/models/NavigationBubbles.js","../../../packages/apps/src/plp-core/models/MainDTO.js","../../../packages/apps/src/plp-machine/dataTransform/plp-machine.dto.js","../../../packages/apps/src/plp-core/filter/filter.js","../../../packages/apps/src/plp-core/filter/types/DefaultFilterChipType.js","../../../packages/apps/src/plp-core/filter/createFilter.js","../../../packages/apps/src/plp-machine/dataTransform/plp-machine.filterPrice.dto.js","../../../packages/apps/src/plp-machine/dataTransform/plp-machine.filters.dto.js","../../../packages/apps/src/plp-machine/dataTransform/plp-machine.sort.dto.js","../../../packages/apps/src/plp-core/store/plp.states.js","../../../packages/apps/src/plp-machine/plp-machine.component.js"],"sourcesContent":["export const EVENT_COLOR_CLICKED = 'EVENT_COLOR_CLICKED'\n","const getData = attributes => attributes.find(attribute => attribute.nodeName === 'data')\n\nconst createProps = attributes => {\n const data = getData([...attributes])\n const props = [...attributes]\n .filter(attribute => attribute.nodeName !== 'data')\n .reduce((all, attr) => {\n return { ...all, [attr.nodeName]: attr.nodeValue }\n }, {})\n\n if (isNil(data)) {\n return props\n }\n\n try {\n return { ...props, ...JSON.parse(data.nodeValue) }\n } catch (error) {\n console.log('ERROR: No data', error, data?.nodeValue)\n }\n}\n\nconst isNil = obj => obj === undefined || obj === null\n\nexport const parseBool = value => (!value || value === 'false' ? false : true)\n\nexport default createProps\n","export const dispatchEvent = ({ eventName, args, element }) => {\n // Use the provided element or fallback to window if available\n if (!element) {\n if (typeof window !== 'undefined') {\n element = window\n } else {\n throw new Error(\n '`element` is not provided and `window` is unavailable. Provide a valid element to dispatch the event.'\n )\n }\n }\n\n let event\n if (args) {\n event = new CustomEvent(eventName, { detail: args, bubbles: true })\n } else {\n if (typeof Event === 'function') {\n event = new Event(eventName)\n } else {\n event = document.createEvent('Event')\n event.initEvent(eventName, true, true)\n }\n }\n element.dispatchEvent(event)\n}\n\nexport const readEvent = e => {\n if (!e.detail) {\n return\n }\n return e.detail\n}\n","export const MAX_WIDTH_CONTAINER = 1160\n\nexport const BREAKPOINT_XL = 1920\nexport const BREAKPOINT_TABLET = 1024\nexport const BREAKPOINT_L = 996\nexport const BREAKPOINT_M = 768\nexport const BREAKPOINT_S = 750\nexport const BREAKPOINT_XS = 375\n\nexport const CTA_PRIMARY = 'primary'\nexport const CTA_PRIMARY_TRANSPARENT = 'primary_transparent'\nexport const CTA_SUBTLE = 'subtle'\nexport const CTA_LINK = 'link'\nexport const CTA_LINK_UNDERLINE = 'link-underline'\nexport const CTA_LINK_GOLD = 'link-gold'\nexport const CTA_LINK_ADD_TO_CART_SMALL = 'AddToCart_small'\nexport const CTA_LINK_ADD_TO_CART_LARGE = 'AddToCart_large'\n\nexport const EVENT_TAB_CHANGE = 'EVENT_TAB_CHANGE'\n\nexport const EVENT_VIDEO = 'WEB_COMPONENT_VIDEO'\nexport const EVENT_POPIN_OPEN = 'WEB_COMPONENT_POPIN_OPEN'\nexport const EVENT_POPIN_OPENED = 'WEB_COMPONENT_POPIN_OPENED'\nexport const EVENT_POPIN_CLOSE = 'WEB_COMPONENT_POPIN_CLOSE'\nexport const EVENT_POPIN_CLOSED = 'WEB_COMPONENT_POPIN_CLOSED'\nexport const EVENT_POPIN_CLOSE_CLICK = 'WEB_COMPONENT_POPIN_CLOSE_CLICK'\nexport const EVENT_POPIN_KEY_DOWN = 'keydown'\nexport const EVENT_POPIN_FORM_TOGGLE_TITLE = 'WEB_COMPONENT_POPIN_FORM_TOGGLE_TITLE'\nexport const EVENT_CTA_CLICK = 'WEB_COMPONENT_CTA_CLICK'\nexport const EVENT_HERO_REORDER_OPEN = 'WEB_COMPONENT_HERO_REORDER_OPEN'\nexport const EVENT_HERO_REORDER_CLOSE = 'WEB_COMPONENT_HERO_REORDER_CLOSE'\nexport const EVENT_QUICKVIEW_OPEN = 'WEB_COMPONENT_QUICKVIEW_OPEN'\nexport const EVENT_QS_OPEN = 'WEB_COMPONENT_QS_OPEN'\nexport const EVENT_QS_OPENED = 'WEB_COMPONENT_QS_OPENED'\nexport const EVENT_QS_CLOSE = 'WEB_COMPONENT_QS_CLOSE'\nexport const EVENT_QS_CLOSED = 'WEB_COMPONENT_QS_CLOSED'\nexport const EVENT_QS_CLOSE_CLICK = 'WEB_COMPONENT_QS_CLOSE_CLICK'\nexport const EVENT_QS_KEY_DOWN = 'keydown'\nexport const EVENT_ADD_TO_CART = 'WEB_COMPONENT_ADD_TO_CART'\nexport const EVENT_CART_UPDATED = 'WEB_COMPONENT_CART_UPDATED'\nexport const EVENT_VIDEO_TOGGLE = 'WEB_COMPONENT_VIDEO_TOGGLE'\nexport const VIDEO_ON_HOVER = 'VIDEO_ON_HOVER'\nexport const VIDEO_ON_OUT = 'VIDEO_ON_OUT'\nexport const EVENT_DETAIL_OPEN = 'WEB_COMPONENT_DETAIL_OPEN'\nexport const EVENT_SLIDER_READY = 'WEB_COMPONENT_SLIDER_READY'\nexport const EVENT_SLIDE_CHANGE = 'WEB_COMPONENT_SLIDE_CHANGE'\nexport const EVENT_OVERLAY_OPEN = 'WEB_COMPONENT_OVERLAY_OPEN'\nexport const EVENT_OVERLAY_CLOSE = 'WEB_COMPONENT_OVERLAY_CLOSE'\nexport const EVENT_OVERLAY_CLICKED = 'WEB_COMPONENT_OVERLAY_CLICKED'\nexport const EVENT_OPEN_PRODUCT_AR_CLICKED = 'OPEN_PRODUCT_AR_CLICKED'\nexport const EVENT_SORT_BY_CHANGE = 'WEB_COMPONENT_SORT_BY_CHANGE'\n\nexport const EVENT_BUBBLE_SELECTED = 'EVENT_BUBBLE_SELECTED'\nexport const EVENT_RECO_TOOL_OPTION_CLICKED = 'EVENT_RECO_TOOL_OPTION_CLICKED'\nexport const WEB_COMPONENT_PROJECTS_LOADED = 'WEB_COMPONENT_PROJECTS_LOADED'\nexport const WEB_COMPONENT_ANCHOR_LOADED = 'WEB_COMPONENT_ANCHOR_LOADED'\n\nexport const EVENT_SWIPED_UP = 'swiped-up'\nexport const EVENT_SWIPED_DOWN = 'swiped-down'\nexport const EVENT_SWIPED_LEFT = 'swiped-left'\nexport const EVENT_SWIPED_RIGHT = 'swiped-right'\n\nexport const EVENT_HEADER_POSITION_CHANGED = 'EVENT_HEADER_POSITION_CHANGED'\n\nexport const keys = { ESC: 'Escape' }\n\nexport const ADD_TO_CART_MODIFIER_MINI = 'mini'\nexport const ADD_TO_CART_MODIFIER_DEFAULT = ADD_TO_CART_MODIFIER_MINI\n\nexport const COFFEE_ORIGINAL = 'original'\nexport const COFFEE_VERTUO = 'vertuo'\nexport const COFFEE_PRO = 'pro'\nexport const COFFEE_OL = 'OL'\nexport const COFFEE_VL = 'VL'\nexport const INTENSITY_MAX_OL = 14\nexport const INTENSITY_MAX_VL = 12\nexport const DEFAULT_BUBBLE_ICON = ''\n\nexport const NUMBER_PRODUCTS_SLIDER = 8\nexport const NUMBER_FEATURES_PDP = 8\n\nexport const ALIGNMENT = ['center', 'left', 'right']\nexport const POSITION = ['top', 'right', 'bottom', 'left']\nexport const TRANSLATION_ADD_TO_CART = 'Add to cart'\nexport const TRANSLATION_UPDATE_BASKET = 'Update basket'\n\nexport const TIME_INSTANT = 1\nexport const TIME_FAST = 300\nexport const TIME_MEDIUM = 600\nexport const TIME_SLOW = 1200\n\nexport const APP_APPLE_LINK = {\n default: 'https://apps.apple.com/us/app/nespresso/id342879434',\n us: 'https://apps.apple.com/us/app/nespresso-new/id1609639566',\n uk: 'https://apps.apple.com/gb/app/nespresso-new/id1609639566',\n kr: 'https://apps.apple.com/kr/app/%EB%84%A4%EC%8A%A4%ED%94%84%EB%A0%88%EC%86%8C-%EB%B6%80%ED%8B%B0%ED%81%AC/id1609639566'\n}\nexport const APP_ANDROID_LINK =\n 'https://play.google.com/store/apps/details?id=com.nespresso.activities'\nexport const APP_HUAWEI_LINK = 'https://appgallery.huawei.com/app/C102571517'\n\nexport const SRC_PAGE_PLP = 'plp'\nexport const SRC_PAGE_PDP = 'pdp'\n\nexport const PLP_TYPE_COFFEE = 'coffee'\nexport const PLP_TYPE_MACHINE = 'machine'\nexport const PLP_TYPE_ACCESSORY = 'accessory'\nexport const CALLEO_API_DOMAIN = 'https://www.contact.nespresso.com/'\n\n// SCSS RELATED\n// Todo : should be shared by JS and SCSS\nexport const BROWSER_CONTEXT = 16 // 1rem = 16px\nexport const COLOR_WHITE_1000 = '#FFFFFF' // Do not change for #FFF shortcut, it will break slider-natural gradients !\n\nexport const CONTRAST_DARK = 'dark'\nexport const CONTRAST_LIGHT = 'light'\n\nexport const B2B_CONTACT_FORM_POPIN_ID = 'b2b-contact-form-popin-id'\nexport const B2B_CONTACT_FORM_POPIN_SRC_SEARCH = 'coveo-search'\n\nexport const B2B_CONTACT_FORM_POPIN_SRC_SKU_MAIN_INFO = 'sku-main-info'\n\nexport const B2B_CONTACT_FORM_POPIN_SRC_SKU_MAIN_INFO_AUTO = 'sku-main-info-auto'\n\nexport const ASPECT_RATIO_16_9 = '16/9'\nexport const ASPECT_RATIO_1_1 = '1/1'\n\nexport const NESPRESSO_PRODUCTION_DOMAIN = 'https://www.nespresso.com'\nexport const NESPRESSO_ROLLOUT_DOMAIN = 'https://nc2-env-rollout.nespresso.com'\n\nexport const EVENT_QUIZ_ON_GO_BACK = 'WEB_COMPONENT_EVENT_QUIZ_ON_GO_BACK'\nexport const EVENT_QUIZ_SUBMIT = 'WEB_COMPONENT_EVENT_QUIZ_SUBMIT'\n","export const getCurrency = () => window[window.config.padl.namespace].dataLayer.app.app.currency\n","import { COFFEE_VERTUO } from '@kissui/components/src/constants.mjs'\nimport { getCurrency } from './getCurrency'\nexport { getCurrency } from './getCurrency'\n\nexport const ECAPI_TYPE_CAPSULE = 'capsule'\nexport const ECAPI_TYPE_MACHINE = 'machine'\nexport const ECAPI_TYPE_ACCESSORY = 'accessory'\nexport const ECAPI_TYPE_GIFT_CARD = 'giftcard'\n\nconst TECHNOLOGY_CATEGORY_IDENTIFIER = '/machineTechno/'\nconst SLEEVE_OF_10 = 10\nconst SLEEVE_OF_7 = 7\n\nconst trimSku = sku => sku.replace(/[^a-z0-9- +./]/gi, '')\n\nexport const getLegacySKU = productId => productId.split('prod/').pop()\n\nexport const getPriceFormatter = async () => await window.napi.priceFormat()\n\nexport const getProduct = sku => window.napi.catalog().getProduct(trimSku(sku))\n\nexport function getTechnologyName(productData) {\n const techno = productData.technologies[0]\n return techno.substring(\n techno.indexOf(TECHNOLOGY_CATEGORY_IDENTIFIER) + TECHNOLOGY_CATEGORY_IDENTIFIER.length\n )\n}\n\nfunction isMultipleOf(quantity, multiple) {\n return quantity % multiple === 0\n}\n\nexport function getSleeveNumber(product, getTechnologyNameFn = getTechnologyName) {\n if (product.sales_multiple !== 1 && isMultipleOf(product.sales_multiple, SLEEVE_OF_10)) {\n // Sleeve of original or vertuo\n return product.sales_multiple / SLEEVE_OF_10\n }\n\n if (\n product.sales_multiple !== 1 &&\n getTechnologyNameFn(product) === COFFEE_VERTUO &&\n isMultipleOf(product.sales_multiple, SLEEVE_OF_7)\n ) {\n // Sleeve of vertuo\n return product.sales_multiple / SLEEVE_OF_7\n }\n\n if (product.sales_multiple === 1 && isMultipleOf(product.unitQuantity, SLEEVE_OF_10)) {\n // Bundle of original or vertuo\n return product.unitQuantity / SLEEVE_OF_10\n }\n\n if (\n product.sales_multiple === 1 &&\n getTechnologyNameFn(product) === COFFEE_VERTUO &&\n isMultipleOf(product.unitQuantity, SLEEVE_OF_7)\n ) {\n // Bundle of vertuo\n return product.unitQuantity / SLEEVE_OF_7\n }\n\n return NaN\n}\n\n/**\n * Guess if the product is part of a bundle.\n * This is determined by checking the 'sales_multiple' and 'unitQuantity' properties.\n */\nexport function isBundled(productData) {\n // TODO: this function should not change the productData, but some components still need it\n productData.sales_multiple = productData.sales_multiple || productData.salesMultiple\n\n const isSalesMultipleGreaterThanOne = productData.sales_multiple > 1\n const isUnitQuantityEqualToOne = productData.unitQuantity === 1\n const isSalesMultipleEqualToOne = productData.sales_multiple === 1\n const isUnitQuantityGreaterThanOne = productData.unitQuantity > 1\n\n // The product is not bundled if sales_multiple > 1 and unitQuantity = 1\n if (isSalesMultipleGreaterThanOne && isUnitQuantityEqualToOne) {\n return false\n }\n\n // The product is bundled if sales_multiple = 1 and unitQuantity > 1\n return isSalesMultipleEqualToOne && isUnitQuantityGreaterThanOne\n}\n\n/**\n * Replace an array of SKU with product data\n * Remove the element inside the list if sku fail. It prevents to get an empty item.\n * @param {Array.<String>} skus\n * @param getProductFn\n * @returns {Promise<Awaited<unknown>[]>}\n */\nexport function getProductAndClean(skus, getProductFn = getProduct, napi = window.napi) {\n const promises = []\n\n if (!napi) {\n return Promise.reject()\n }\n\n if (!Array.isArray(skus)) {\n skus = [skus]\n }\n\n // Load manually the product to delete SKU fail\n for (const sku of skus) {\n promises.push(\n getProductFn(sku)\n .then(data => skus.splice(skus.indexOf(sku), 1, data))\n .catch(() => {\n skus.splice(skus.indexOf(sku), 1)\n console.error(`getProduct fail on sku ${sku}`)\n })\n )\n }\n\n return Promise.all(promises)\n}\n\nexport const getFormattedPrice = async price => {\n const priceFormatter = await getPriceFormatter()\n const currency = getCurrency()\n\n return priceFormatter.html\n ? priceFormatter.html(currency, price)\n : priceFormatter.short(currency, price) || ''\n}\n\nexport const getProductCategories = async sku => {\n const productDetails = await getProduct(sku)\n const productCategories = productDetails ? productDetails.supercategories : []\n const productCategoriesNew = await Promise.all(\n productCategories.map(async categoryEncoded => {\n const productCategoryData = await window.napi.catalog().getCategory(categoryEncoded)\n return productCategoryData\n })\n )\n return productCategoriesNew\n}\n","import {\n getProduct,\n getProductCategories,\n ECAPI_TYPE_CAPSULE,\n ECAPI_TYPE_GIFT_CARD\n} from '@kissui/helpers/src/catalog'\n\n/**\n * Api fetcher service\n *\n * @returns {object}\n */\nconst fetcher = () => {\n const apiRatings = window.napi && window.napi.ratings\n const apiPriceFormat = window.napi && window.napi.priceFormat\n let priceFormatter = null\n\n const loadPriceFormat = async () => {\n priceFormatter = await apiPriceFormat()\n }\n\n const getApiProduct = async sku => await getProduct(sku)\n\n /**\n * Get all products merged with data coming from API\n *\n * @returns {Promise<array>}list of products\n * @param productList\n * @param withRating\n */\n const getAll = (productList, withRating) =>\n Promise.all(\n productList.map(async product => {\n try {\n const fetchedProduct = await getOne(product, withRating)\n productList.splice(productList.indexOf(product), 1, fetchedProduct)\n } catch (error) {\n productList.splice(productList.indexOf(product), 1)\n }\n })\n )\n\n /**\n * Get product merged with data coming from API\n *\n * @returns {Promise} product\n * @param product\n * @param withRating\n */\n const getOne = async (product, withRating) => {\n try {\n return await fetchOne(product, withRating)\n } catch (error) {\n console.error(`Fetch for product ${product.sku} failed: ${error}`)\n throw error\n }\n }\n\n /**\n * Fetch and merge product with data coming from API\n *\n * @param {object} product - base product from static data\n * @param apiProduct\n * @param withRating\n * @param list\n * @returns {Promise<object>} Product\n */\n const fetchOne = async (product, withRating) => {\n const { api_override: { name = '', headline = '', description = '' } = {} } = product\n\n const apiProduct = await getApiProduct(product.sku)\n const productCategories = await getProductCategories(product.sku)\n\n const overrides = {\n name: name !== '' ? name : apiProduct.name,\n headline: headline !== '' ? headline : apiProduct.headline,\n description: description !== '' ? description : apiProduct.description,\n longSku: apiProduct ? apiProduct.id : null,\n price: apiProduct ? apiProduct.price : null,\n pdp_urls: getValueObject(apiProduct, 'pdpURLs'),\n images: apiProduct.images,\n slides: apiProduct.slides,\n technologies: apiProduct.technologies,\n type: apiProduct.type,\n productCategories\n }\n\n if (withRating && product.productRatings?.ratingEnabled) {\n overrides.rating = await getRating(product, apiProduct)\n }\n\n if (apiProduct.type === ECAPI_TYPE_CAPSULE) {\n overrides.bundled = apiProduct.bundled\n overrides.intensity = apiProduct.capsuleProperties?.intensity || 0\n overrides.unit_quantity = getValueNumber(apiProduct, 'unitQuantity', 1)\n overrides.sales_multiple = getValueNumber(apiProduct, 'salesMultiple', 10)\n }\n\n if (apiProduct.type === ECAPI_TYPE_GIFT_CARD) {\n if (!product.variant.giftcard_price) {\n throw new Error('Gift Card amount price is not defined')\n }\n\n overrides.price = product.variant.giftcard_price\n overrides.images = { icon: product.variant.default_image }\n }\n\n return { ...merge(product, apiProduct), ...overrides }\n }\n\n /**\n * Merge products based on static product existing keys\n * A shallow copy is made to prevent original object mutation\n *\n * @param {object} product\n * @param {object} apiProduct\n * @param {boolean} force Force property override\n * @returns {object} Product\n */\n const merge = (product, apiProduct, force = false) => {\n const mergedProduct = { ...product }\n\n if (!apiProduct) {\n return mergedProduct\n }\n\n for (const key of Object.keys(mergedProduct)) {\n const empty = mergedProduct[key] === '' || mergedProduct[key] === '0'\n if (key in apiProduct && (empty || force)) {\n mergedProduct[key] = apiProduct[key]\n }\n }\n\n return mergedProduct\n }\n\n /**\n * @param {object} apiProduct\n * @returns {number}\n */\n const getValueNumber = (apiProduct, key, defaultValue) =>\n parseInt((apiProduct && apiProduct[key]) || defaultValue)\n\n /**\n * @param {object} apiProduct\n * @returns {object}\n */\n const getValueObject = (apiProduct, key) => {\n return apiProduct && Object.keys(apiProduct[key]).length > 0 ? apiProduct[key] : {}\n }\n\n /**\n * @param {string} sku\n * @returns {Promise<number>} Rating value\n */\n const getRating = async ({ sku }, apiProduct) => {\n if (\n !apiRatings ||\n (apiProduct && apiProduct.productRatings && !apiProduct.productRatings.ratingEnabled)\n ) {\n return toFloat(0, 1)\n }\n\n try {\n const { ratingAverage = 0 } = await apiRatings().summary(sku)\n return toFloat(ratingAverage !== 0 ? ratingAverage : 0, 1)\n } catch (error) {\n console.error(`Product rating fetch failed on sku ${sku}`, error)\n return toFloat(0, 1)\n }\n }\n\n /**\n * Get currency from datalayer\n * @returns {string}\n */\n const _getCurrency = () => {\n const { dataLayer = {} } = window[window.config.padl.namespace]\n return dataLayer.app?.app?.currency\n }\n\n /**\n * @returns {string}\n * @param price\n */\n const formatPrice = price => {\n const { short } = priceFormatter\n return short(_getCurrency(), price)\n }\n\n /**\n * @param {number} value\n * @param {number} decimal\n * @returns {number}\n */\n const toFloat = (value, decimal = 2) => parseFloat(value).toFixed(decimal)\n\n return {\n loadPriceFormat,\n getApiProduct,\n getAll,\n getOne,\n fetchOne,\n merge,\n formatPrice\n }\n}\n\nexport default fetcher()\n","import { EVENT_COLOR_CLICKED } from './constants.mjs'\nimport createProps from '@kissui/helpers/src/props.helpers'\n\nimport { dispatchEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\n\nclass color extends HTMLElement {\n connectedCallback() {\n this.props = createProps(this.attributes)\n this.render()\n this.createEventListeners()\n }\n\n createEventListeners() {\n this.addEventListener('click', this.handleClick)\n }\n\n render() {\n const { link, label, code, a11y_label = 'color', selected, size = 'large' } = this.props\n\n const element = document.createElement(link ? 'a' : 'button')\n\n if (link) {\n element.setAttribute('href', link)\n }\n if (label) {\n element.setAttribute('title', label)\n element.setAttribute('aria-label', `${label} ${a11y_label}`)\n }\n if (selected === 'true') {\n element.setAttribute('class', 'selected')\n }\n\n this.classList.add(size)\n\n element.innerHTML = `\n <div><span style=\"background-color: ${code}\"></span></div>\n `\n this.innerHTML = element.outerHTML\n }\n\n handleClick() {\n const { sku } = this.props\n dispatchEvent({\n element: this,\n eventName: EVENT_COLOR_CLICKED,\n args: { sku }\n })\n }\n}\n\ncustomElements.get('nb-color') || customElements.define('nb-color', color)\n\nexport default color\n","import { EVENT_COLOR_CLICKED } from './components/color/constants.mjs'\nimport { DEFAULT_MAX_COLOR_COUNT, EVENT_COLOR_CHANGE } from './constants.mjs'\n\nimport createProps from '@kissui/helpers/src/props.helpers'\nimport { dispatchEvent, readEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\n\nimport fetcherService from '@kissui/page-builder-sections/src/cross-sell/services/fetcher.service'\nimport './components/color'\n\nclass Colors extends HTMLElement {\n constructor() {\n super()\n this._apiProducts = {}\n this._colors = []\n this._maxColors = DEFAULT_MAX_COLOR_COUNT\n }\n\n async connectedCallback() {\n this.props = createProps(this.attributes)\n this.updateMaxColors()\n\n await this.fetchColors()\n\n this.render()\n this.createEventListeners()\n }\n\n hasColorData() {\n return this.props.colors && this.props.colors.every(this.hasAllProps)\n }\n\n hasAllProps(color) {\n return color.sku != null && color.name != null && color.code != null\n }\n\n createEventListeners() {\n this.addEventListener(EVENT_COLOR_CLICKED, this.onColorChange)\n }\n\n render() {\n const { heading = '' } = this.props\n\n this.innerHTML = `\n ${heading ? `<p class=\"t-sm-400-sl\">${heading}</p>` : ``}\n ${this.renderColors()}${this.renderExtraColors()}\n `\n }\n\n renderColors() {\n return this._colors.map(this.renderColor.bind(this)).join('')\n }\n\n renderColor(color) {\n const { a11y_label = '', activeSku, size = 'large' } = this.props\n const { code = '', name = '', link = '', sku = '' } = color\n this.classList.add(size)\n\n return `\n <nb-color\n code=\"${code}\"\n label=\"${name}\"\n link=\"${link}\"\n sku=\"${sku}\"\n selected=\"${sku === activeSku}\"\n ${a11y_label ? `a11y_label=\"${a11y_label}\"` : ''}\n size=\"${size}\"\n ></nb-color>\n `\n }\n\n renderExtraColors() {\n const { colors = [], extra_url, extra_title } = this.props\n const extraColorsLength = Math.max(0, colors.length - this._maxColors)\n if (extraColorsLength <= 0 || !extra_url) {\n return ''\n }\n\n return `\n <nb-link\n size=\"small\"\n color=\"black\"\n seo_label=\"${extra_title}\"\n aria-label=\"${extra_title}\"\n link=\"${extra_url}\"\n >+${extraColorsLength}</nb-link>`\n }\n\n async fetchColors() {\n if (this.hasColorData()) {\n this._colors = this.clampColor(this.props.colors)\n return\n }\n try {\n const preparedColors = this.prepareColors(this._maxColors)\n await Promise.all(preparedColors.map(this.fetchColor.bind(this)))\n } catch (error) {\n console.error(`Fetch for colors failed: ${error}`)\n }\n }\n\n async fetchColor(color) {\n const { prevent } = this.props\n const apiProduct = await fetcherService.getApiProduct(color.sku)\n const apiColor = {\n code: apiProduct.colorShade.cssCode,\n name: apiProduct.colorShade.name,\n link: prevent === undefined ? apiProduct.pdpURLs.desktop : ''\n }\n this._apiProducts[color.sku] = apiProduct\n this._colors.push({ ...color, ...apiColor })\n }\n\n prepareColors() {\n const { colors = [] } = this.props\n return this.clampColor(colors).filter(this.hasSKU)\n }\n\n clampColor(colors) {\n return colors.slice(0, this._maxColors)\n }\n\n hasSKU(colorItem) {\n return colorItem.sku != null && colorItem.sku !== ''\n }\n\n updateMaxColors() {\n const { max_colors } = this.props\n if (max_colors) {\n this._maxColors = parseInt(max_colors)\n }\n }\n\n onColorChange($event) {\n const { sku } = readEvent($event)\n const productData = { ...this._apiProducts[sku], sku }\n if (productData) {\n dispatchEvent({\n element: this,\n eventName: EVENT_COLOR_CHANGE,\n args: { productData }\n })\n }\n }\n}\n\n// Registers custom element\ncustomElements.get('nb-colors') || customElements.define('nb-colors', Colors)\n\nexport default Colors\n","export const DEFAULT_MAX_COLOR_COUNT = 4\nexport const EVENT_COLOR_CHANGE = 'EVENT_COLOR_CHANGE'\n","import createProps from '@kissui/helpers/src/props.helpers'\n\nclass CardLabels extends HTMLElement {\n constructor() {\n super()\n this.props = {}\n this.labels = []\n }\n\n connectedCallback() {\n this.props = createProps(this.attributes)\n this.render()\n }\n\n render() {\n const { labels = [], direction = 'column' } = this.props\n this.classList.add(`${direction === 'row' ? 'direction-row' : 'direction-' + direction}`)\n\n if (labels.length === 0) {\n return ''\n }\n this.labels = labels\n\n this.innerHTML = `${this.renderLabels()}`\n }\n\n renderLabels() {\n return this.labels\n .map(label => {\n const { name = '', bgColor = '', color = '' } = label\n return `<mark class=\"t-3xs-500-caps-sl\"\n ${\n bgColor &&\n color &&\n `style=\"background: ${bgColor}; color: ${color}\"`\n }>\n <span>${name}</span>\n </mark>`\n })\n .join('')\n }\n}\n\ncustomElements.get('nb-card-labels') || customElements.define('nb-card-labels', CardLabels)\n\nexport default CardLabels\n","export class NespressoElement extends HTMLElement {\n constructor() {\n super()\n this.template = ''\n }\n\n connectedCallback() {\n this.props = this._createProps()\n this.onStart?.()\n this.loadTemplate()\n this.onReady?.()\n }\n\n /**\n * Load the attributes and create the props object\n * @returns {any}\n * @private\n */\n _createProps(forceAttributes = null) {\n const attributes = forceAttributes || this.attributes\n\n const getData = attr => attr.find(attribute => attribute.nodeName === 'data')\n\n let props\n try {\n props = [...attributes].reduce((all, attr) => {\n return { ...all, [attr.nodeName]: attr.nodeValue }\n }, {})\n\n const data = getData([...attributes])\n\n if (data === undefined || data === null) {\n return props\n }\n\n return { ...props, ...JSON.parse(data.nodeValue) }\n } catch (error) {\n console.log(this.nodeName, 'ERROR: No data', error)\n }\n }\n\n /**\n * Render by DOM diff\n */\n render(force = false) {\n if (force) {\n // todo review the performance of this\n this.innerHTML = ''\n }\n /**\n * Convert a template string into HTML DOM nodes\n * @param {String} str The template string\n * @return {Node} The template HTML\n */\n const _stringToHTML = str => {\n const parser = new DOMParser()\n const doc = parser.parseFromString(str, 'text/html')\n return doc.body\n }\n\n /**\n * Compare the template to the UI and make updates\n * @param {Node} template The template HTML\n * @param {Node} elem The UI HTML\n */\n const _diff = (template, elem) => {\n /**\n * Get the type for a node\n * @param {Node} node The node\n * @return {String} The type\n */\n const _getNodeType = node => {\n if (node.nodeType === 3) {\n return 'text'\n }\n if (node.nodeType === 8) {\n return 'comment'\n }\n return node.tagName.toLowerCase()\n }\n\n /**\n * Get the content from a node\n * @param {Node} node The node\n * @return {String} The type\n */\n const _getNodeContent = node => {\n if (node.childNodes && node.childNodes.length > 0) {\n return null\n }\n return node.textContent\n }\n\n // Get arrays of child nodes\n const domNodes = Array.prototype.slice.call(elem.childNodes)\n const templateNodes = Array.prototype.slice.call(template.childNodes)\n\n // If extra elements in DOM, remove them\n var count = domNodes.length - templateNodes.length\n if (count > 0) {\n for (; count > 0; count--) {\n domNodes[domNodes.length - count].parentNode.removeChild(\n domNodes[domNodes.length - count]\n )\n }\n }\n\n // Diff each item in the templateNodes\n templateNodes.forEach(function (node, index) {\n // If element doesn't exist, create it\n if (!domNodes[index]) {\n elem.appendChild(node.cloneNode(true))\n return\n }\n\n // If element is not the same type, replace it with new element\n if (_getNodeType(node) !== _getNodeType(domNodes[index])) {\n domNodes[index].parentNode.replaceChild(node.cloneNode(true), domNodes[index])\n return\n }\n\n // If content is different, update it\n const templateContent = _getNodeContent(node)\n if (templateContent && templateContent !== _getNodeContent(domNodes[index])) {\n domNodes[index].textContent = templateContent\n }\n\n // If target element should be empty, wipe it\n if (domNodes[index].childNodes.length > 0 && node.childNodes.length < 1) {\n domNodes[index].innerHTML = ''\n return\n }\n\n // If element is empty and shouldn't be, build it up\n // This uses a document fragment to minimize reflows\n if (domNodes[index].childNodes.length < 1 && node.childNodes.length > 0) {\n const fragment = document.createDocumentFragment()\n _diff(node, fragment)\n domNodes[index].appendChild(fragment)\n return\n }\n\n // If there are existing child elements that need to be modified, diff them\n if (node.childNodes.length > 0) {\n _diff(node, domNodes[index])\n }\n })\n }\n\n // todo - add support to reactivity\n // this.template(this.state)\n const templateHTML = _stringToHTML(this.template)\n _diff(templateHTML, this)\n }\n\n /**\n * Set the HTML to be used in the template\n * @param {String} html The HTML to use\n *\n * This function is overwritten by the extended class to set the HTML\n *\n */\n loadTemplate(template = '', force = false) {\n this.template = template === '' ? this.template : `${template}`\n this.render(force)\n }\n\n disconnectedCallback() {\n this.onDestroy?.()\n }\n}\n\ncustomElements.get('nb-nespresso-element') ||\n customElements.define('nb-nespresso-element', NespressoElement)\n","import { BREAKPOINT_M, BREAKPOINT_TABLET } from '@kissui/components'\n\nconst viewport = () => {\n const lt = (ref: number) => {\n return window.innerWidth < ref\n }\n\n return {\n get is() {\n const { innerWidth: vw, devicePixelRatio } = window\n return {\n mobile: vw < BREAKPOINT_M,\n mobile_tablet: vw < BREAKPOINT_TABLET,\n tablet: vw >= BREAKPOINT_M && vw < BREAKPOINT_TABLET,\n desktop: vw >= BREAKPOINT_TABLET && devicePixelRatio <= 1,\n retina: vw >= BREAKPOINT_TABLET && devicePixelRatio > 1\n }\n },\n lt\n }\n}\n\nconst helper = viewport()\n\nexport default helper\n","export { waitForSelector } from './waitForSelector'\n\nexport const constants = {\n LEFT: 37,\n UP: 38,\n RIGHT: 39,\n DOWN: 40,\n ESC: 27,\n SPACE: 32,\n ENTER: 13,\n TAB: 9\n}\n\nexport function capitalize(s = '') {\n return s[0].toUpperCase() + s.slice(1)\n}\n\nexport const convertToCamelCase = (str: string): string => {\n const arr = str.match(/[a-z]+|\\d+/gi)\n if (!arr) { return str }\n return arr.map((m, i) => {\n let low = m.toLowerCase()\n if (i !== 0) {\n low = low.split('').map((s, k) => (k === 0 ? s.toUpperCase() : s)).join(\"\")\n }\n return low\n }).join(\"\")\n}\n\nexport function slug(s = '') {\n return s\n .toLowerCase()\n .trim()\n .replace(/\\s+/g, '-') // Replace spaces with -\n .replace(/[^\\w-]+/g, '') // Remove all non-word chars\n .replace(/--+/g, '-') // Replace multiple - with single -\n}\n\nexport function pxToEm(target: number, stripedInnerFontSize = 1) {\n return target / 14 / stripedInnerFontSize + 'em'\n}\n\nexport function percent(target: number) {\n return target + '%'\n}\n\nexport function parseHTML(str: string) {\n const tmp = document.implementation.createHTMLDocument('')\n tmp.body.innerHTML = str\n return tmp.body.childNodes\n}\n\nexport function stripHTML(str: string) {\n const tmp = document.implementation.createHTMLDocument('')\n tmp.body.innerHTML = str\n return (tmp.body.textContent ?? \"\").replace(RegExp('[\\\\s|\\'|\"]', 'g'), '')\n}\n\nexport function makeId(length: number) {\n var result = ''\n var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'\n var charactersLength = characters.length\n for (var i = 0; i < length; i++) {\n result += characters.charAt(Math.floor(Math.random() * charactersLength))\n }\n return result\n}\n\nexport function removeEmptyValues(obj: { [key: string]: any }): { [key: string]: any } {\n const findText = [\n 'Default campaign ID (tracking missing in Page Builder export)',\n 'Default campaign name (tracking missing in Page Builder export)',\n 'promoname', \n 'promoid', \n 'promocreative', \n 'undefined'\n ];\n \n for (let key in obj) {\n const value = obj[key];\n \n if (value === null || value === undefined || value === '') {\n delete obj[key];\n continue;\n }\n \n if (typeof value === 'string') {\n for (const text of findText) {\n if (value.includes(text)) {\n delete obj[key];\n break;\n }\n }\n }\n }\n \n return obj;\n}\n\nexport function makeHash(str: string) {\n var hash = 0,\n i,\n chr\n if (!str) {\n return hash\n }\n for (i = 0; i < str.length; i++) {\n chr = str.charCodeAt(i)\n hash = (hash << 5) - hash + chr\n hash |= 0 // Convert to 32bit integer\n }\n return 'id-' + hash\n}\n\nexport function getHashLink(link: string) {\n let linkHash = link\n let linkNoHash = link\n if (link.indexOf('#') !== -1) {\n linkNoHash = link.replace('#', '')\n } else {\n linkHash = '#' + link\n }\n\n return { linkNoHash, linkHash }\n}\n\nexport function lazyLoad(node: Element, attribute: string, value: any, url: string) {\n const CLASSNAME_OUT_OF_SCREEN = 'lazy-load'\n const CLASSNAME_IN_SCREEN = 'lazy-loaded'\n const CLASSNAME_ON_ERROR = 'lazy-loaded-error'\n\n const isOldIOS = () => {\n var agent = window.navigator.userAgent,\n start = agent.indexOf('OS ')\n if ((agent.indexOf('iPhone') > -1 || agent.indexOf('iPad') > -1) && start > -1) {\n return window.Number(agent.substr(start + 3, 3).replace('_', '.')) < 14\n }\n return false\n }\n\n const inViewPort = (attribute: string, value: any) => {\n node.setAttribute(attribute, value)\n\n const cb = () => node.classList.add(CLASSNAME_IN_SCREEN)\n\n if (url) {\n const img = new Image()\n img.src = url\n img.onload = cb\n img.onerror = () => {\n cb()\n node.classList.add(CLASSNAME_ON_ERROR)\n throw new Error(`Image ${url} cannot be loaded`)\n }\n\n return\n }\n\n cb()\n }\n\n if (/Trident\\/|MSIE/.test(window.navigator.userAgent) || isOldIOS()) {\n inViewPort(attribute, value)\n } else {\n if ('IntersectionObserver' in window) {\n node.classList.add(CLASSNAME_OUT_OF_SCREEN)\n let lazyBackgroundObserver = new IntersectionObserver(function (entries) {\n entries.forEach(function (entry) {\n if (entry.isIntersecting) {\n inViewPort(attribute, value)\n lazyBackgroundObserver.unobserve(entry.target)\n }\n })\n })\n lazyBackgroundObserver.observe(node)\n } else {\n inViewPort(attribute, value)\n }\n }\n}\n\nexport function lazyLoadCallback(node: Element, cb: () => void) {\n const isOldIOS = () => {\n var agent = window.navigator.userAgent,\n start = agent.indexOf('OS ')\n if ((agent.indexOf('iPhone') > -1 || agent.indexOf('iPad') > -1) && start > -1) {\n return window.Number(agent.substr(start + 3, 3).replace('_', '.')) < 14\n }\n return false\n }\n\n if (/Trident\\/|MSIE/.test(window.navigator.userAgent) || isOldIOS()) {\n cb()\n } else {\n if ('IntersectionObserver' in window) {\n let lazyBackgroundObserver = new IntersectionObserver(\n function (entries) {\n entries.forEach(function (entry) {\n if (entry.isIntersecting) {\n cb()\n lazyBackgroundObserver.unobserve(entry.target)\n }\n })\n },\n { rootMargin: '150% 0px' }\n )\n lazyBackgroundObserver.observe(node)\n }\n }\n}\n\n// Debounce\nexport function debounce<T>(func: (v: T) => void, time = 100) {\n let timer: number\n return function (event: T) {\n if (timer) {\n window.clearTimeout(timer)\n }\n timer = window.setTimeout(func, time, event)\n }\n}\n\n// isIE - to check for internet explorer\nexport function isIE() {\n let ua = window.navigator.userAgent,\n isIE = /MSIE|Trident/.test(ua)\n\n return isIE\n}\n\n// Load external script\nexport const loadExternalScript = ({\n src,\n callback = null,\n async = false,\n defer = false,\n module = false,\n id = ''\n}: {\n src: string;\n callback: null | GlobalEventHandlers[\"onload\"]\n module: boolean,\n defer: boolean,\n async: boolean,\n id: string\n}) => {\n const script = document.createElement('script')\n script.type = module ? 'module' : 'text/javascript'\n script.src = src\n id ? (script.id = id) : false // add id attribute only if passed\n if (typeof callback === 'function') {\n script.onload = callback\n }\n script.async = async\n script.defer = defer\n document.body.appendChild(script)\n}\n\n// Load external css\nexport const loadExternalCss = ({ src }: { src: string }) => {\n const script = document.createElement('link')\n script.rel = 'stylesheet'\n script.href = src\n document.body.appendChild(script)\n}\n// Lazy load vendor script\nexport const lazyLoadVendorScript = (handler, el) => {\n const observer = new IntersectionObserver(handler)\n observer.observe(el)\n}\n\n/**\n * Replaces variable inside a given string\n * Each variable have to be enclosed between stChr and enChr\n * The values have to be contained in the vars object, they key must match\n * example :\n * txt : 'See {resultsLength} Results'\n * vars : {resultsLength:'30'}\n * stChr : '{'\n * enChr : '}'\n *\n * will return : 'See 30 Results'\n *\n * @param {string} txt\n * @param {object} vars\n * @param {string} stChr\n * @param {string} enChr\n */\nexport function interpolate(txt: string, vars: Record<string, null | undefined | string>, stChr: string, enChr: string) {\n let curIdx = 0\n\n while (txt) {\n const stIdx = txt.indexOf(stChr, curIdx)\n if (stIdx === -1) {\n break\n }\n const enIdx = txt.indexOf(enChr, stIdx + 1)\n if (enIdx === -1) {\n break\n }\n const hashId = txt.substring(stIdx + stChr.length, enIdx)\n if (vars[hashId] != null) {\n txt = txt.substr(0, stIdx) + vars[hashId] + txt.substr(enIdx + enChr.length)\n curIdx = stIdx\n } else {\n curIdx = enIdx\n }\n }\n return txt\n}\n\n/**\n * Find in container element, add height to equal size of element\n * @param container css path where my element is contain e.g. `.c-container`\n * @param el css path of elements to equalized\n */\nexport const equalHeight = (containerSelector: string, el: string, elementScope: HTMLElement) => {\n const container = elementScope.querySelector<HTMLElement>(containerSelector)\n if (!container) {\n return\n }\n\n const items = container.querySelectorAll<HTMLElement>(el)\n let max = -1\n\n for (let i = 0; i < [...items].length; i++) {\n const item = [...items][i]\n let h = item.offsetHeight\n max = h > max ? h : max\n }\n\n if (max <= 0) {\n return\n }\n\n for (let i = 0; i < [...items].length; i++) {\n const item = [...items][i]\n item.style.height = `${max}px`\n }\n}\n\nexport const stringifyCurlyQuote = (data: {}) => JSON.stringify(data).replace(\"'\", '’')\n\nexport const stringifyForAttribute = (data = {}) => {\n return escapeHtml(JSON.stringify(data))\n}\n\n/**\n * This function is included instead of sanitizeString because for\n * inserting HTML into innerHTML we need to make sure all HTML\n * entities are escaped.\n */\nexport const escapeHtml = (text: string) => {\n const map = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n } as { [s: string]: string }\n\n return text.replace(/[&<>\"']/g, (m) => map[m])\n}\n\n/**\n * Because setting attributes escapes more than the characters above and then preact also\n * escapes text we need a more complete way of unescaping all html entities (not just the ones\n * above)\n */\nconst domParser = new DOMParser()\nexport const unescapeHtml = (text: string) => {\n return domParser.parseFromString(text, \"text/html\").body.textContent\n}\n\nexport const sanitizeString = (data: {}) => {\n if (!data) {\n return ''\n }\n\n return data.toString().replace(/\"/g, '"').replace(/'/g, ''')\n}\n\nexport const stripTags = (s: string) => {\n return (s || '').replace(/(<([^>]+)>)/gi, '')\n}\n\nexport const setAttributes = (element: Element, attrs: Record<string, any>) => {\n for (let key in attrs) {\n element.setAttribute(key, attrs[key])\n }\n return element\n}\n\nexport const getMetaContent = (metaName: string) => {\n const metaTag = document.querySelector(`meta[name=${metaName}]`)\n if (!metaTag) {\n return ''\n }\n return metaTag.getAttribute('content')\n}\n\nexport const isObjectEmpty = (obj: {}) => {\n return Object.keys(obj).length === 0\n}\n","import './image.scss'\n\nexport const renderImage = (\n { url, image_alt_text, image, quick_view_plp = {} },\n theme = 'portrait'\n) => {\n if (!image) {\n return ''\n }\n\n let img = `<nb-img file=\"${image}\"\n description=\"${image_alt_text}\"\n aspect_ratio=\"${theme === 'portrait' ? '16/9' : '1/1'}\"\n object_fit=\"contain\"\n force_height=\"${theme === 'portrait' ? '160' : '120'}\">\n </nb-img>`\n\n const renderClass = url ? '' : 'class=\"cursor-default\"'\n\n if (url || quick_view_plp?.show_view) {\n const linkHref = url || 'javascript:void(0)'\n img = `<a ${renderClass.trim()} href=\"${linkHref}\" target=\"_self\" aria-hidden=\"true\" tabindex=\"-1\">${img}</a>`\n }\n\n return `<div class=\"cb-image\">\n ${img}\n </div>`\n}\n","export const VARIATION_PLP = 'plp'\nexport const VARIATION_PDP = 'pdp'\nexport const VARIATION_CROSS_SELL = 'cross-sell'\nexport const VARIATION_SMALL = 'small'\n","import { VARIATION_PDP } from '@kissui/components/src/sku/constants'\nimport viewportHelper from '@kissui/helpers/src/viewport.helpers'\n\nconst isPdp = variation => variation === VARIATION_PDP\n\nconst getHeadingLevel = ({ variation }) => (isPdp(variation) ? 'h1' : 'h3')\n\nconst renderLink = ({ url, a11y_product_card = '', name = '', name_custom = '' }) => {\n const a11yProductName = a11y_product_card.replace('{productName}', name)\n const productName = name_custom !== '' ? name_custom : name\n\n return `<a href=\"${url}\" target=\"_self\" title=\"${a11yProductName}\" aria-label=\"${a11yProductName}\">${productName}</a>`\n}\n\nexport const renderHeading = props => {\n const { url, name = '', name_custom = '' } = props\n\n if (!name) {\n return ''\n }\n\n const finalName = name_custom !== '' ? name_custom : name\n const result = []\n const headingLevel = getHeadingLevel(props)\n\n result.push(\n `<${headingLevel} class=\"cb-heading ${\n viewportHelper.is.mobile ? 't-md-700-sl' : 'h-lg-700'\n }\">`\n )\n\n if (url && !isPdp(props.variation)) {\n result.push(renderLink(props))\n } else {\n result.push(`${finalName}`)\n }\n\n result.push(`</${headingLevel}>`)\n\n return result.join('')\n}\n","import viewportHelper from '@kissui/helpers/src/viewport.helpers'\nexport const renderHeadline = ({ headline = '', is_headline_hidden = false }) => {\n if ((is_headline_hidden && viewportHelper.is.mobile) || !headline) {\n return ''\n }\n\n return `<p class=\"cb-text t-sm-400-sl\">${headline}</p>`\n}\n","export const renderLabelTechnology = ({ label_technology }) => {\n if (!label_technology) {\n return ''\n }\n\n return `<p class=\"cb-technology t-xs-700-sl\">${label_technology}</p>`\n}\n","export const renderLabelRange = ({ label_range }) => {\n if (!label_range) {\n return ''\n }\n\n return `<p class=\"cb-range t-xs-500-sl\">${label_range}</p>`\n}\n","import { getFormattedPrice } from '@kissui/helpers/src/catalog'\n\nconst getStrikethroughPriceElement = component => {\n return component.querySelector('.cb-price-old')\n}\n\nconst fetchStrikethroughPrice = strikethroughPrice => {\n return getFormattedPrice(strikethroughPrice)\n}\n\nexport const renderStrikethroughPrice = ({ strikethrough_price }, component) => {\n if (!strikethrough_price) {\n return ''\n }\n\n fetchStrikethroughPrice(strikethrough_price)\n .then(payload => {\n const element = getStrikethroughPriceElement(component)\n if (!element) {\n return\n }\n\n element.innerHTML = payload\n })\n .catch(e => {\n console.error(`Error: Component SKU - Strike Through Price - ${e}`)\n\n const element = getStrikethroughPriceElement(component)\n if (!element) {\n return\n }\n\n element.style.display = 'none'\n })\n\n return `<p class=\"cb-price-old t-sm-400-sl\"></p>`\n}\n","export const getDataLayer = () => {\n return window[window?.padlNamespace]?.dataLayer\n}\n\nexport const getMarketCode = () => {\n const dataLayer = getDataLayer()\n if (!dataLayer) {\n return 'ch'\n }\n\n return dataLayer.app.app.market.toLocaleLowerCase()\n}\n\nexport const getLangCode = () => {\n const dataLayer = getDataLayer()\n if (!dataLayer) {\n return 'en'\n }\n\n return getDataLayer().page.page.pageInfo.language.toLocaleLowerCase()\n}\n\nexport const getSegmentCode = () => {\n const dataLayer = getDataLayer()\n if (!dataLayer) {\n return 'B2C'\n }\n\n return getDataLayer().page.page.pageInfo.segmentBusiness\n}\n\nexport const isLoggedIn = () => {\n const dataLayer = getDataLayer()\n if (!dataLayer || !dataLayer.user) {\n return false\n }\n\n return dataLayer.user.isLoggedIn\n}\n\nexport const interpolateMarketLang = (string, market, lang) => {\n return string.replace('{market}', market).replace('{lang}', lang)\n}\n","import viewportHelper from '@kissui/helpers/src/viewport.helpers'\nimport {\n VARIATION_PLP,\n VARIATION_SMALL,\n VARIATION_CROSS_SELL,\n VARIATION_PDP\n} from '@kissui/components/src/sku/constants'\nimport { isLoggedIn } from '@kissui/helpers/src/dataLayer'\n\nconst getButtonSize = variation => {\n switch (variation) {\n case VARIATION_PLP:\n return viewportHelper.is.mobile ? 'small' : 'large'\n case VARIATION_SMALL:\n return 'small'\n default:\n return 'large'\n }\n}\n\nfunction getComputedProps(activeSku, activeLongSku, sku, longSku, disableTracking) {\n const skuProp = activeSku || sku\n const activeLongSkuProp = activeLongSku || longSku\n const disableTrackingProp = disableTracking && `disableTracking=true`\n\n return { skuProp, activeLongSkuProp, disableTrackingProp }\n}\n\nexport const renderAddToCart = props => {\n const {\n activeLongSku,\n activeSku,\n category_name = '',\n contact_cta = {},\n hidePrice,\n longSku = '',\n position,\n rendererName = '',\n show_view_details = false,\n sku,\n url,\n variation = VARIATION_PLP,\n view_details_label = 'View details',\n technologies = [],\n disableTracking = false\n } = props\n\n const buttonSize = getButtonSize(variation)\n let cta_url = url,\n cta_label = view_details_label,\n contact_cta_text = contact_cta.contact_cta_text || '',\n contact_url_anchor = contact_cta.contact_url_anchor || '',\n is_b2b = checkForB2B(technologies)\n\n // CONTACT US BUTTON\n const { skuProp, activeLongSkuProp, disableTrackingProp } = getComputedProps(\n activeSku,\n activeLongSku,\n sku,\n longSku,\n disableTracking\n )\n\n function b2bNotLoggedIn(contact_url_anchor, cta_url, cta_label) {\n //CONTACT US BUTTON[ hidePrice = true]\n const linkAttribute = contact_url_anchor ? `link=\"${cta_url}\"` : ''\n\n return `<nb-cta ${linkAttribute} variation=\"primary\" data-disabletracking=\"true\">${cta_label}</nb-cta>`\n }\n\n function b2bLoggedIn({\n skuProp,\n activeLongSkuProp,\n buttonSize,\n category_name,\n position,\n rendererName,\n variation,\n disableTrackingProp\n }) {\n return `\n <nb-add-to-cart\n sku=\"${skuProp}\"\n longSku=\"${activeLongSkuProp}\"\n buttonSize=\"${buttonSize}\"\n showPrice\n range='${category_name}'\n position='${position}'\n rendererName='${rendererName}'\n tracking_no_impression=\"${variation === VARIATION_PDP}\"\n ${disableTrackingProp}\n >\n </nb-add-to-cart>\n `\n }\n\n function remainingCases(cta_url, cta_label) {\n //VIEW DETAILS BUTTON [ hidePrice = false]\n return `<nb-cta link=\"${cta_url}\" variation=\"primary\">${cta_label}</nb-cta>`\n }\n\n if (hidePrice || show_view_details) {\n if (\n is_b2b &&\n (variation === VARIATION_PDP || variation === VARIATION_CROSS_SELL) &&\n !isLoggedIn()\n ) {\n cta_url = contact_url_anchor\n cta_label = contact_cta_text\n\n return b2bNotLoggedIn(contact_url_anchor, cta_url, cta_label)\n } else if (is_b2b && variation === VARIATION_PDP && isLoggedIn()) {\n return b2bLoggedIn({\n skuProp,\n activeLongSkuProp,\n buttonSize,\n category_name,\n position,\n rendererName,\n variation,\n disableTrackingProp\n })\n }\n\n return remainingCases(cta_url, cta_label)\n }\n\n // ADD TO CART BUTTON\n return `\n <nb-add-to-cart\n sku=\"${skuProp}\"\n longSku=\"${activeLongSkuProp}\"\n buttonSize=\"${buttonSize}\"\n showPrice\n range='${category_name}'\n position='${position}'\n rendererName='${rendererName}'\n tracking_no_impression=\"${variation === VARIATION_PDP}\"\n ${disableTrackingProp}\n ></nb-add-to-cart>\n `\n}\n\nfunction checkForB2B(technologies) {\n return Array.isArray(technologies) && technologies.some(tech => tech.includes('pro'))\n}\n","export const renderAdditionalMessage = ({\n additional_message_icon,\n additional_message,\n additional_message_link\n}) => {\n if (!additional_message && !additional_message_link) {\n return ''\n }\n\n let additionalMessageFinal = ''\n\n if (additional_message) {\n let renderIcon = ''\n if (additional_message_icon) {\n renderIcon = `<nb-icon icon=\"${additional_message_icon}\" class=\"additionalMsgIcon\"></nb-icon>`\n }\n\n additionalMessageFinal = `<p class=\"cb-warn t-sm-500-sl\">\n ${renderIcon}\n ${additional_message}</p>`\n }\n\n const hasAdditionalMessageLink =\n additional_message_link && additional_message_link.link && additional_message_link.label\n\n if (!hasAdditionalMessageLink) {\n return additionalMessageFinal\n }\n\n return (\n additionalMessageFinal +\n `<nb-link\n link='${additional_message_link.link}'\n color=\"${additional_message_link.color}\"\n size=\"${additional_message_link.size}\"\n seo_label=\"${additional_message_link.seo_label}\">\n ${additional_message_link.label}\n </nb-link>`\n )\n}\n","import { getMarketCode } from './dataLayer'\n\nconst LABEL_CATEGORY_NAME = 'cat/capsule-range-label'\nconst LABEL_CATEGORY_NAME_MACHINE = 'cat/machine-range-label'\nexport const RANGE_CATEGORY_NAME = 'cat/capsule-range'\nconst FAIR_TRADE_CATEGORY_NAME = 'cat/capsule-range-fair-trade'\nconst VERTUO_NEXT_CATEGORY_NAME = 'cat/capsule-attribute-only-vertuo-next'\nconst ORGANIC_EU_CATEGORY_NAME = 'capsule-attribute-organic-eu'\nconst RAINFOREST_CATEGORY_NAME = 'capsule-attribute-rainforest'\nconst SUSTAINABILITY_CATEGORY_NAME = 'capsule-attribute-sustainability'\nconst ARABICA_CATEGORY_NAME = 'capsule-attribute-arabica'\nconst PRODUCT_HIGHLIGHT_CATEGORY_NAME = 'cat/capsule-attribute-highlight'\nconst TECHNOLOGY_CATEGORY_IDENTIFIER = '/machineTechno/'\n\nconst COMMON_URL = 'https://www.nespresso.com/shared_res/agility/commons/img/icons/'\n\nexport const FAIR_TRADE_IMG = COMMON_URL + 'fairTrade.svg'\nexport const ORGANIC_LOGO_IMG_EU = COMMON_URL + 'logo-organic-eu.svg'\nexport const ORGANIC_LOGO_IMG_US = COMMON_URL + 'logo-organic-us.svg'\nexport const ORGANIC_LOGO_IMG_CA = COMMON_URL + 'logo-organic-ca.svg'\nexport const ORGANIC_LOGO_IMG_BR = COMMON_URL + 'logo-organic-br.svg'\nexport const ORGANIC_LOGO_IMG_JP = COMMON_URL + 'logo-organic-jp.svg'\nexport const ORGANIC_LOGO_IMG_BE = COMMON_URL + 'logo-organic-be.png'\n\nexport const VERTUONEXT_LOGO_IMG = COMMON_URL + 'logo-only-vertuo-next.svg'\nexport const RAINFOREST_LOGO_IMG = COMMON_URL + 'logo-rainforest.svg'\nexport const SUSTAINABILITY_LOGO_IMG = COMMON_URL + 'logo-sustainability.svg'\nexport const Q_CERTIFICATION_ARABICA_LOGO_IMG = COMMON_URL + 'q_grade_certification_arabica.svg'\nexport const DESIGN_AWARD_2021_IMG = COMMON_URL + 'design_award_2021.svg'\n\nexport const LOGO_IMG_MAP = {\n fair_trade: FAIR_TRADE_IMG,\n is_organic: getOrganicLogo(),\n only_vertuo_next: VERTUONEXT_LOGO_IMG,\n is_q_certified_arabica: Q_CERTIFICATION_ARABICA_LOGO_IMG,\n is_rainforest: RAINFOREST_LOGO_IMG,\n is_sustainable: SUSTAINABILITY_LOGO_IMG,\n is_design_award_2021: DESIGN_AWARD_2021_IMG\n}\n\nexport function getOrganicLogo() {\n let organicLogoImg = ORGANIC_LOGO_IMG_EU\n\n switch (getMarketCode()) {\n case 'us':\n organicLogoImg = ORGANIC_LOGO_IMG_US\n break\n case 'ca':\n organicLogoImg = ORGANIC_LOGO_IMG_CA\n break\n case 'br':\n organicLogoImg = ORGANIC_LOGO_IMG_BR\n break\n case 'jp':\n organicLogoImg = ORGANIC_LOGO_IMG_JP\n break\n case 'be':\n organicLogoImg = ORGANIC_LOGO_IMG_BE\n break\n }\n\n return organicLogoImg\n}\n\n/**\n * retrieves the list of categories of type Vertuo Next\n * @param {category[]} categories\n */\nexport function getVertuoNext(categories) {\n return categories.find(category => isVertuoNext(category))\n}\n\n/**\n * returns true when the category is product vertuo next\n * @param {category} category\n */\nfunction isVertuoNext(category) {\n return getCategoryRegEx(VERTUO_NEXT_CATEGORY_NAME).test(category.id)\n}\n\n/**\n * retrieves the list of categories of type organic EU\n * @param {category[]} categories\n */\nexport function getOrganicEu(categories) {\n return categories.find(category => isOrganicEu(category))\n}\n\n/**\n * returns true when the category is product organic EU\n * @param {category} category\n */\nfunction isOrganicEu(category) {\n return getCategoryRegEx(ORGANIC_EU_CATEGORY_NAME).test(category.id)\n}\n\n/**\n * retrieves the list of categories of type rainforest\n * @param {category[]} categories\n */\nexport function getRainforest(categories) {\n return categories.find(category => isRainforest(category))\n}\n\n/**\n * returns true when the category is rainforest\n * @param {category} category\n */\nfunction isRainforest(category) {\n return getCategoryRegEx(RAINFOREST_CATEGORY_NAME).test(category.id)\n}\n\n/**\n * retrieves the list of categories of type sustainability\n * @param {category[]} categories\n */\nexport function getSustainability(categories) {\n return categories.find(category => isSustainability(category))\n}\n\n/**\n * retrieves the list of categories of type arabica\n * @param {category[]} categories\n */\nexport function getArabica(categories) {\n return categories.find(category => isArabica(category))\n}\n\n/**\n * returns true when the category is arabica\n * @param {category} category\n */\nfunction isArabica(category) {\n return getCategoryRegEx(ARABICA_CATEGORY_NAME).test(category.id)\n}\n\n/**\n * returns true when the category is sustainability\n * @param {category} category\n */\nfunction isSustainability(category) {\n return getCategoryRegEx(SUSTAINABILITY_CATEGORY_NAME).test(category.id)\n}\n\n/**\n * retrieves the list of categories of type label\n * @param {category[]} categories\n */\nexport function getLabels(categories) {\n return categories.filter(category => isLabel(category))\n}\n\n/**\n * retrieves the list of categories of type label\n * @param {category[]} categories\n */\nexport function getProductHighlight(categories) {\n return categories.find(category => isProductHighlight(category))\n}\n/**\n * retrieves the list of categories of type label\n * @param {category[]} categories\n */\nexport function getFairTrade(categories) {\n return categories.find(category => isFairTrade(category))\n}\n\n/**\n * returns a regex to match the tail (global) of a given local category ID\n * @param {string} categoryIdTail : should contain the end of the category ID\n */\nexport function getCategoryRegEx(categoryIdTail) {\n return new RegExp(categoryIdTail.replace(/\\//g, '\\\\/'))\n}\n\n/**\n * returns true when the category is child of the label category (is type label)\n * @param {category} category\n */\nfunction isLabel(category) {\n return (\n getCategoryRegEx(LABEL_CATEGORY_NAME).test(category.id) ||\n getCategoryRegEx(LABEL_CATEGORY_NAME_MACHINE).test(category.id)\n )\n}\n\n/**\n * returns true when the category is product highlight\n * @param {category} category\n */\nfunction isProductHighlight(category) {\n return getCategoryRegEx(PRODUCT_HIGHLIGHT_CATEGORY_NAME).test(category.id)\n}\n/**\n * returns true when the category is fair trade\n * @param {category} category\n */\nfunction isFairTrade(category) {\n return getCategoryRegEx(FAIR_TRADE_CATEGORY_NAME).test(category.id)\n}\n\n/**\n * returns true when the category is child of the range category (is type range)\n * @param {category} category\n */\nexport function isRange(category) {\n return category.superCategories.some(superCategory =>\n getCategoryRegEx(RANGE_CATEGORY_NAME).test(superCategory)\n )\n}\n\nexport function getTechnologyName(productData, categories) {\n if (!productData || !productData.technologies || !productData.technologies.length) {\n return null\n }\n\n const techno = productData.technologies[0]\n const categoryNameAsSubstring = techno.substring(\n techno.indexOf(TECHNOLOGY_CATEGORY_IDENTIFIER) + TECHNOLOGY_CATEGORY_IDENTIFIER.length\n )\n const category = categories?.find(cat => cat.id === techno)\n\n // Backward compatibility, return name as substring if the list of categories are not available\n return category?.name || categoryNameAsSubstring\n}\n\nexport function isCategoryHidden(categoryId) {\n let hideCategory = false\n // To enable AB testing: exclude categories which are to be hidden\n if (\n window.PLP_HIDE_CATEGORIES?.length &&\n window.PLP_HIDE_CATEGORIES.findIndex(c => categoryId.indexOf(c) >= 0) >= 0\n ) {\n hideCategory = true\n }\n\n // To enable AB testing: exclude categories except those which are to be shown\n if (window.PLP_ONLY_SHOW_CATEGORIES?.length) {\n // Default to hide\n hideCategory = true\n if (window.PLP_ONLY_SHOW_CATEGORIES.findIndex(c => categoryId.indexOf(c) >= 0) >= 0) {\n hideCategory = false\n }\n }\n return hideCategory\n}\n","import { INTENSITY_MAX_OL, INTENSITY_MAX_VL } from '@kissui/components'\n\nexport const getMaxIntensity = ({ technologies }) =>\n technologies.indexOf('original') !== -1 ? INTENSITY_MAX_OL : INTENSITY_MAX_VL\n","import { getFinalPrice } from '@kissui/plp/services'\nimport { isBundled } from '@kissui/helpers/src/catalog'\nimport { getMaxIntensity } from '@kissui/components/src/sku-coffee/services'\n\nexport const getMergedProductCoffeeData = (\n product,\n pageBuilderProductProps,\n pageBuilderProps,\n priceFormatter,\n currency\n) => {\n const { bundle_details } = pageBuilderProductProps\n const { options } = pageBuilderProps\n const { show_sleeve_price } = options\n\n const isBundledResult = isBundled(product)\n\n const { showCapsulePrice, price_per_capsule, final_price } = getFinalPrice(\n show_sleeve_price,\n product,\n isBundled\n )\n\n const option = {\n bundled: isBundledResult,\n intensity: product.capsuleProperties?.intensity || product.intensity || null,\n max_intensity: getMaxIntensity(product),\n price_per_capsule: price_per_capsule\n ? priceFormatter.short(currency, price_per_capsule)\n : null,\n show_capsule_price: showCapsulePrice\n }\n\n if (show_sleeve_price) {\n option.price = priceFormatter.short(currency, final_price)\n }\n\n if (bundle_details) {\n option.bundle_details = bundle_details\n }\n\n return option\n}\n","import {\n getVertuoNext,\n getOrganicEu,\n getRainforest,\n getLabels,\n getProductHighlight,\n getFairTrade,\n getSustainability,\n isRange,\n getCategoryRegEx,\n RANGE_CATEGORY_NAME,\n getArabica\n} from '@kissui/helpers/src/cremaDataHelper'\n\n/**\n * Modifies the structure to make it easier to use in components\n * Applies all the data customization mixing Page builder with HMC data\n * @param {object} plpData : original PLP data\n */\nexport async function getMergedPLPData(plpData) {\n const { data } = plpData\n if (!data) {\n return []\n }\n\n const eCommerceData = data.configuration.eCommerceData\n\n addLabels(eCommerceData)\n\n addProductAttribute(\n eCommerceData,\n getFairTrade,\n (prod, category) => (prod.fairTrade = category.name)\n )\n addProductAttribute(eCommerceData, getProductHighlight, prod => (prod.highlighted = true))\n addProductAttribute(eCommerceData, getVertuoNext, prod => (prod.onlyVertuoNext = true))\n addProductAttribute(eCommerceData, getOrganicEu, prod => (prod.organicEu = true))\n addProductAttribute(eCommerceData, getRainforest, prod => (prod.rainforest = true))\n addProductAttribute(eCommerceData, getSustainability, prod => (prod.sustainability = true))\n addProductAttribute(eCommerceData, getArabica, prod => (prod.arabica = true))\n\n addSubSegments(eCommerceData)\n\n return eCommerceData.categories\n}\n\nfunction addSubSegments(eCommerceData) {\n const { categories, productGroups, products } = eCommerceData\n // should be forEach if nothing returned/assigned\n categories.forEach(category => {\n const hasSegment = category.subCategories.length > 0 && isRange(category)\n if (hasSegment) {\n category.segments = category.subCategories.map(categoryId => {\n const segment = categories.find(subCategory => subCategory.id === categoryId)\n if (segment && isSubsegment(categories, segment)) {\n segment.products = getProductsData(productGroups, segment.id, products)\n segment.isSegment = true\n }\n return segment\n })\n }\n\n category.products = getProductsData(productGroups, category.id, products)\n })\n}\n\nexport function getProductsData(productGroups, categoryId, products) {\n let result = []\n try {\n const currentCategory = productGroups.find(category => category.categoryId === categoryId)\n\n if (!currentCategory) {\n return result\n }\n\n const { productIds } = currentCategory\n return productIds.map(productId => {\n const product = products.find(product => product.id === productId)\n return product\n })\n } catch (e) {\n //generally an anti pattern to only log the error, with no try catch the result would be the same\n console.log(e)\n }\n\n return result\n}\n\n/**\n * adds labels property to products containing each label's category data (JSON parsed description property) assigned to it\n * labels are categories that have the label base category as parent\n * to apply a label on a given product, the label has to contain the product\n * this function has to clean the productGroups as well by removing the label ones\n * @param {category[]} categories\n * @param {productGroup[]} productGroups\n * @param {product[]} products\n */\nfunction addLabels(eCommerceData) {\n const { categories, productGroups, products } = eCommerceData\n const labels = getLabels(categories)\n const labelGroups = getLabelGroups(productGroups, labels)\n labelGroups.forEach(group => {\n const label = labels.find(label => label.id === group.categoryId)\n group.productIds.forEach(productId => {\n const prod = products.find(product => product.id === productId)\n prod.labels = prod.labels || []\n prod.labels.push(label.description)\n })\n })\n //removing label categories from productGroups\n labelGroups.forEach(labelGroup => {\n const indexToRemove = productGroups.findIndex(\n productGroup => productGroup.categoryId === labelGroup.categoryId\n )\n productGroups.splice(indexToRemove, 1)\n })\n}\n\n/**\n * adds a property to products containing the given category assigned to it\n * The category is recognized by ID\n * to apply a the category on a given product, the category's productGroup has to contain the product\n * this function has to clean the productGroups as well by removing the given's one to not let it display as a range in the PLP\n * @param {category[]} categories\n * @param {productGroup[]} productGroups\n * @param {product[]} products\n */\nfunction addProductAttribute(eCommerceData, categoryFetcher, assignHandler) {\n const { categories, productGroups, products } = eCommerceData\n const category = categoryFetcher(categories)\n if (!category) {\n return\n }\n const categoryGroup = getCategoryGroup(productGroups, category)\n if (!categoryGroup) {\n return\n }\n categoryGroup.productIds.forEach(productId => {\n const prod = products.find(product => product.id === productId)\n if (categoryFetcher === getArabica) {\n console.log('addProductAttribute', prod)\n }\n assignHandler(prod, category)\n })\n const indexToRemove = productGroups.findIndex(\n productGroup => productGroup.categoryId === categoryGroup.categoryId\n )\n productGroups.splice(indexToRemove, 1)\n}\n\n/**\n * retrieve all the productGroup that are labels\n * @param {productGroup[]} productGroups\n * @param {category[]} labels\n */\nfunction getLabelGroups(productGroups, labels) {\n return productGroups.filter(group => labels.some(label => label.id === group.categoryId))\n}\n\n/**\n * retrieve the productGroup which correspond to a category\n * @param {productGroup[]} productGroups\n * @param {category} fairTrade\n */\nfunction getCategoryGroup(productGroups, category) {\n return productGroups.find(group => category.id === group.categoryId)\n}\n\n/**\n * returns true when the category is child of the range category (is type range)\n * @param {category} category\n */\nexport function isSubsegment(categories, category) {\n /*category.superCategories.some(superCategoryId => {\n const superCategoryData = categories.find(categoryToFind => categoryToFind.id === superCategoryId)\n })*/\n const result = category.superCategories.some(superCategory =>\n getCategoryRegEx(RANGE_CATEGORY_NAME).test(superCategory)\n )\n return result\n}\nexport function getFinalPrice(show_sleeve_price, product, isBundled) {\n let showCapsulePrice = show_sleeve_price\n let final_price\n let price_per_capsule\n\n const bundled = isBundled(product)\n\n if (product.type === 'capsule' && !bundled) {\n final_price = product.price * product.salesMultiple\n // this isn't necessary in prod but the mock price formatter needs it\n final_price = Math.round(final_price * 100) / 100\n price_per_capsule = product.price\n } else {\n showCapsulePrice = false\n final_price = product.price\n }\n\n return { showCapsulePrice, final_price, price_per_capsule }\n}\n","import {\n ECAPI_TYPE_ACCESSORY,\n ECAPI_TYPE_CAPSULE,\n ECAPI_TYPE_GIFT_CARD,\n ECAPI_TYPE_MACHINE\n} from '@kissui/helpers/src/catalog'\n\nexport const getSkuComponentByType = ({ type, is_machine_b2b }) => {\n let result = 'nb-sku'\n\n if (type === ECAPI_TYPE_CAPSULE) {\n result = 'nb-sku-coffee'\n } else if (type === ECAPI_TYPE_MACHINE && is_machine_b2b) {\n result = 'nb-sku-machine-b2b'\n } else if (type === ECAPI_TYPE_MACHINE) {\n result = 'nb-sku-machine'\n } else if (type === ECAPI_TYPE_ACCESSORY) {\n result = 'nb-sku-accessory'\n } else if (type === ECAPI_TYPE_GIFT_CARD) {\n result = 'nb-sku-gift-card'\n }\n\n return result\n}\n\nexport const apiOverride = (productData, pageBuilderData) => {\n if (!productData || !pageBuilderData) {\n return {}\n }\n\n const { images, name, headline, description } = productData\n const { api_override } = pageBuilderData\n\n if (!api_override) {\n return {}\n }\n\n return {\n image: api_override.image || images?.icon || images?.url || images?.push || images?.main,\n name: api_override.name || name,\n headline: api_override.headline || headline,\n description: api_override.description || description\n }\n}\n","export const VARIATION_CROSS_SELL = 'cross-sell'\nexport const VARIATION_PLP = 'plp'\n\nexport interface CapsuleFeaturesInputType {\n acidity?: number | null\n bitterness?: number | null\n body?: number | null\n intensity?: number | null\n roastLevel?: number | null\n}\n\nexport interface CapsuleFeatureType {\n value: number | null\n}\n\nexport interface CapsuleFeaturesOutputType {\n acidity: CapsuleFeatureType\n bitterness: CapsuleFeatureType\n body: CapsuleFeatureType\n intensity: CapsuleFeatureType\n roast: CapsuleFeatureType\n}\n\nexport type QuickViewProductType = {\n modelType: string\n id: string\n legacyId: string\n internationalId: string\n name: string\n urlFriendlyName: string\n internationalName: string\n headline: string\n rootCategory: string\n category: string\n supercategories: string[]\n mobileImages: {\n modelType: string\n icon: string\n main: string\n }\n responsiveImages: {\n standard: string\n }\n pdpURLs: {\n opr: string\n desktop: string\n mobile: string\n }\n unitQuantity: number\n salesMultiple: number\n maxOrderQuantity: number\n technologies: string[]\n comingSoon: boolean\n unit_quantity: number\n productSelections: string[]\n type: string\n priceDisplay: string\n isOrderable: boolean\n bundled: boolean\n capsuleProperties: {\n intensity: number\n bitterness: number\n acidity: number\n roastLevel: number\n }\n capsuleProductAromatics: string[]\n aromaticProfileDescription: string\n roastingDescription: string\n capsuleCupSizes: string[]\n capsuleCupSizesDetails: {\n id: string\n name: string\n capacityLabel: string\n }[]\n capsuleAromatics: {\n id: string\n name: string\n }[]\n decaffeinated: boolean\n}\n\n//Confirmed this props are not available in Product Type\nexport type ProductNewPropsType = {\n currency: string\n pdpURLs: {\n desktop: string\n mobile: string\n }\n responsiveImages: {\n standard: string\n }\n supercategories: string[]\n productSelections: string[]\n capsuleProperties?: CapsuleFeaturesInputType\n capsuleProductAromatics: string[]\n unitPrice: number\n cupSizesDetails?: {\n icon: string\n label: string\n size: string\n capacityLabel: string | null\n category: {\n id: string\n name: string\n description: string | null\n icon: {\n url: string\n altText: string\n }\n detailsIcon: {\n url: string\n altText: string\n }\n url: string | null\n capacityLabel: string | null\n rangeLink: string | null\n subCategories: []\n superCategories: string[]\n }\n }[]\n category_name: string\n url: string\n}\n\n// This is the Product Type signature Combined\nexport type ProductPropsType = QuickViewProductType & ProductNewPropsType\n\nexport type AddToCartPropsType = {\n sku?: string\n longSku?: string\n category_name?: string\n price?: string\n strikethrough_price?: number\n hidePrice?: boolean\n type?: string\n price_per_capsule?: number | string\n show_capsule_price?: boolean\n label_capsules?: string\n capsule_price_label?: string\n capsule_price_syntax?: string\n show_sleeve_price?: boolean\n show_sleeve?: boolean\n sleeve_syntax?: string\n number_of_sleeves?: number\n label_sleeves?: string\n label_sleeve?: string\n technologies: string[]\n sales_multiple?: number\n unitQuantity?: number\n unit_quantity?: number\n bundled?: boolean\n url?: string\n}\n\nexport type PageBuilderProductPropsType = {\n sku: string\n highlighted: boolean\n labels: {\n bgColor: string\n color: string\n name: string\n }[]\n strikethrough_price: string\n variant: {\n is_capsule: boolean\n number_of_sleeves: number\n number_of_capsules: string\n bundle_details: {\n popin_link_text: string\n popin_label_close: string\n description: string\n other_skus: string\n other_skus_quantity: string\n }\n logos: {\n fair_trade: boolean\n alt_fair_trade: string\n is_organic: boolean\n alt_organic: string\n only_vertuo_next: boolean\n alt_vertuo_next: string\n is_rainforest: boolean\n alt_rainforest: string\n is_sustainable: boolean\n alt_sustainable: string\n is_q_certified_arabica: boolean\n alt_q_certification_arabica: string\n }\n sku_timer: {\n launch_date: string\n remaining_days: string\n remaining_day: string\n label: string\n a11y_label: string\n }\n ingredients: {\n heading: string\n description: string\n }\n }\n}\n\nexport type PageBuilderPropsType = {\n quick_view_plp?: {\n popin?: {\n close?: string\n }\n cup_sizes?: {\n heading: string\n unit_is_oz: boolean\n items: string[]\n }\n aromatic_profile?: {\n heading: string\n items: string[]\n }\n link?: {\n label: string\n url: string\n }\n levels?: {\n a11y_level_of: string\n acidity_label: string\n bitterness_label: string\n roastiness_label: string\n body_label: string\n }\n }\n campaign?: {\n id?: string\n name?: string\n creative?: string\n position?: string\n }\n tracking_position: string\n tracking_list: string\n capsuleProperties?: CapsuleFeaturesInputType\n price_per_capsule?: number | string\n show_capsule_price?: boolean\n label_capsules?: string\n capsule_price_label?: string\n capsule_price_syntax?: string\n show_sleeve_price?: boolean\n show_sleeve?: boolean\n sleeve_syntax?: string\n number_of_sleeves?: number\n label_sleeves?: string\n label_sleeve?: string\n technologies: string[]\n sales_multiple?: number\n unit_quantity?: number\n bundled?: boolean\n pdpURLs: {\n desktop: string\n mobile: string\n }\n intensity_label: string\n products: {\n sku: string\n longSku: string\n price: number\n strikethrough_price: number\n hidePrice: boolean\n url: string\n }[]\n priceFormatter: {\n formatPrice: (price: number) => string\n }\n currency: string\n options: {\n intensity_label: string\n show_sleeve: boolean\n label_sleeve: string\n label_sleeves: string\n label_capsules: string\n sleeve_syntax: string\n show_sleeve_price: boolean\n capsule_price_label: string\n capsule_price_syntax: string\n a11y_intensity_max: string\n label_decaffeinato: string\n is_headline_hidden: boolean\n sizes_title: string\n notes_title: string\n enabledExperiments: string[]\n }\n copywriting: {\n sku_quick_view: {\n more_info: string\n a11y_more_info: string\n popin: {\n close: string\n }\n cup_sizes: {\n heading: string\n unit_is_oz: boolean\n items: string[]\n }\n aromatic_profile: {\n heading: string\n items: string[]\n }\n link: {\n label: string\n }\n }\n aromatic_profile: {\n heading: string\n items: string[]\n }\n }\n}\n\nexport type SkuType = {\n tracking_list: string\n tracking_position: string\n id: string\n sku: string\n longSku: string\n name: string\n name_custom: string\n available: boolean\n description: string | null\n hidePrice: boolean\n image_alt_text: string\n inStock: boolean\n internationalId: string\n internationalName: string\n legacyId: string\n maxOrderQuantity: number | null\n packagingType: string | null\n price: string\n pushRatingEnabled: boolean\n ranges: string[]\n salesMultiple: number\n technologies: string[]\n type: string\n unitQuantity: number\n url: string\n labels: []\n category_name: string\n category: {\n id: string\n name: string\n description: string | null\n icon: {\n url: string\n altText: string | null\n }\n detailsIcon: string | null\n url: string | null\n capacityLabel: string | null\n rangeLink: string | null\n subCategories: []\n superCategories: string[]\n }\n highlighted: boolean\n strikethrough_price: string\n view_details_label: string\n headline: string\n cupSizes: string[]\n cupSizesDetails: {\n icon: string\n label: string\n size: string\n capacityLabel: string | null\n category: {\n id: string\n name: string\n description: string | null\n icon: {\n url: string\n altText: string | null\n }\n detailsIcon: string | null\n url: string | null\n capacityLabel: string | null\n rangeLink: string | null\n subCategories: []\n superCategories: string[]\n }\n }[]\n flavors: string[]\n in_stock: boolean\n sales_multiple: number\n bundled: boolean\n logos: []\n is_headline_hidden: boolean\n a11y_price: string\n a11y_product_card: string\n label_sleeve: string\n label_sleeves: string\n label_capsules: string\n intensity: number\n a11y_intensity_max: string\n label_decaffeinato: string\n show_sleeve_price: boolean\n show_sleeve: boolean\n price_per_capsule: number | string\n final_price: string | null\n capsule_price_label: string\n capsule_price_syntax: string\n sleeve_syntax: string\n perSleeveLabel: string\n number_of_sleeves: number\n number_of_capsules: string\n show_capsule_price: boolean\n sort_price: number\n bundle_details: any\n quick_view_plp: {\n show_view: boolean\n quick_view_text: string\n popin: {\n close: string\n }\n cup_sizes: {\n heading: string\n unit_is_oz: boolean\n items: string[]\n }\n aromatic_profile: {\n heading: string\n items: string[]\n }\n link: {\n label: string\n }\n levels: {\n a11y_level_of: string\n acidity_label: string\n bitterness_label: string\n roastiness_label: string\n body_label: string\n }\n }\n hasPricePerSleeve: boolean\n sleevePrice: string\n rendererName: string\n position: number\n rawPrice: number\n variation: string\n intensity_label: string\n campaign: {\n id: string\n name: string\n creative: string\n position: string\n }\n capsuleProductAromatics: string[]\n copywriting: {\n heading: string\n sku_quick_view: {\n more_info: string\n a11y_more_info: string\n popin: {\n close: string\n }\n cup_sizes: {\n heading: string\n unit_is_oz: false\n items: string[]\n }\n aromatic_profile: {\n heading: string\n items: string[]\n }\n link: {\n label: string\n }\n }\n aromatic_profile: {\n heading: string\n items: string[]\n }\n }\n options: {\n intensity_label: string\n show_sleeve: boolean\n label_sleeve: string\n label_sleeves: string\n label_capsules: string\n sleeve_syntax: string\n show_sleeve_price: boolean\n capsule_price_label: string\n capsule_price_syntax: string\n a11y_intensity_max: string\n label_decaffeinato: string\n is_headline_hidden: boolean\n sizes_title: string\n notes_title: string\n enabledExperiments: string[]\n }\n products: {\n sku: string\n longSku: string\n price: number\n strikethrough_price: number\n hidePrice: boolean\n url: string\n }[]\n priceFormatter: {\n formatPrice: (price: number) => string\n }\n currency: string\n}\n\nexport type MergedProductType = {\n intensity_label: string\n capsuleProductAromatics?: string[]\n pdpURLs?: {\n desktop: string\n mobile: string\n }\n}\n\nexport type AddToCardPropertiesType = SkuType & MergedProductType\n\ntype CupSizeType = {\n icon: string\n label: string\n size: string\n capacityLabel: string | null\n category: {\n id: string\n name: string\n description: string | null\n icon: {\n url: string\n altText: string\n }\n detailsIcon: {\n url: string\n altText: string\n }\n url: string | null\n capacityLabel: string | null\n rangeLink: string | null\n subCategories: []\n superCategories: string[]\n }\n}[]\n\nexport type QuickViewPropsType = {\n popin: {\n popin_id: string\n close?: string\n footer: boolean\n }\n product: MergedProductType\n intensity: {\n intensity_label?: string\n a11y_intensity_max: string\n }\n cup_sizes: {\n heading: string\n unit_is_oz: boolean\n items?: [] | CupSizeType\n }\n aromatic_profile: {\n heading: string\n items: string[]\n }\n link: {\n label: string\n url?: string\n }\n levels: any\n pricing: {\n add_to_cart: AddToCartPropsType & {\n position: string\n variation: string\n url: string\n view_details_label: string\n rendererName: string\n }\n showSleeve: any\n showCapsulePrice: any\n }\n campaign: any\n}\n","import { getMergedProductData } from '@kissui/page-builder-sections/src/cross-sell-natural/dataTransform'\n\nimport {\n CapsuleFeaturesInputType,\n CapsuleFeaturesOutputType,\n ProductPropsType,\n AddToCartPropsType,\n SkuType,\n ProductNewPropsType,\n MergedProductType,\n AddToCardPropertiesType,\n QuickViewPropsType,\n VARIATION_PLP,\n VARIATION_CROSS_SELL\n} from './shared-quick-view-types'\n\nexport const getCapsuleFeatures = ({\n acidity = null,\n bitterness = null,\n body = null,\n intensity = null,\n roastLevel = null\n}: CapsuleFeaturesInputType = {}): CapsuleFeaturesOutputType => ({\n acidity: { value: acidity },\n bitterness: { value: bitterness },\n body: { value: body },\n intensity: { value: intensity },\n roast: { value: roastLevel }\n})\n\nexport const getSkuQuickViewData = async (\n product: ProductPropsType,\n popinId: string,\n skuData: SkuType,\n componentType: string\n) => {\n const { tracking_position, tracking_list } = skuData\n\n const handlePLPVariation = () => {\n if (!product) return\n let quickViewElement = document.createElement('nb-sku-quick-view')\n quickViewElement.setAttribute(\n 'data',\n JSON.stringify(getSkuQuickViewProp(popinId, product, skuData, componentType))\n )\n quickViewElement.setAttribute('id', popinId)\n quickViewElement.setAttribute('tracking_no_impression', 'true')\n quickViewElement.setAttribute('tracking_position', tracking_position)\n quickViewElement.setAttribute('tracking_list', tracking_list)\n quickViewElement.setAttribute('campaign_position', skuData.campaign.position)\n quickViewElement.setAttribute('listname_text', skuData?.copywriting?.heading)\n document.body.appendChild(quickViewElement)\n }\n\n const handleCrossSellVariation = () => {\n const { sku_quick_view } = skuData.copywriting\n if (!sku_quick_view.more_info) return ''\n\n const quickViewElement = document.querySelector(\n `nb-sku-quick-view > nb-popin[id=\"${popinId}\"]`\n )?.parentElement\n\n if (quickViewElement) quickViewElement.remove()\n\n let newQuickViewElement = document.createElement('nb-sku-quick-view')\n newQuickViewElement.setAttribute(\n 'data',\n JSON.stringify(getSkuQuickViewProp(popinId, product, skuData, componentType))\n )\n newQuickViewElement.setAttribute('tracking_no_impression', 'true')\n newQuickViewElement.setAttribute('tracking_position', tracking_position)\n newQuickViewElement.setAttribute('tracking_list', tracking_list)\n newQuickViewElement.setAttribute('campaign_position', skuData.campaign.position)\n newQuickViewElement.setAttribute('listname_text', skuData?.copywriting?.heading)\n document.body.appendChild(newQuickViewElement)\n }\n\n const variationHandlers: { [key: string]: () => void | string } = {\n [VARIATION_PLP]: handlePLPVariation,\n [VARIATION_CROSS_SELL]: handleCrossSellVariation\n }\n\n const handleVariation = variationHandlers[componentType]\n if (handleVariation) {\n handleVariation()\n }\n}\n\nexport const getSkuQuickViewProp = (\n popinId: string,\n product: ProductPropsType,\n skuData: SkuType,\n componentType: string\n) => {\n let mergedProductData = getMergedProductDataForComponentType(product, skuData, componentType)\n let addToCartProps = getAddToCartProperties(componentType, skuData, mergedProductData)\n\n return isVariationOnPLP(componentType)\n ? getPlpQuickViewProps(popinId, skuData, mergedProductData, addToCartProps)\n : getCrossSellQuickViewProps(popinId, product, skuData, mergedProductData, addToCartProps)\n}\n\nconst getMergedProductDataForComponentType = (\n product: ProductPropsType,\n skuData: SkuType,\n componentType: string\n) => {\n switch (componentType) {\n case VARIATION_PLP:\n return {\n ...skuData,\n ...product,\n ...getCapsuleFeatures(product?.capsuleProperties)\n }\n case VARIATION_CROSS_SELL: {\n const matchedProduct =\n skuData.products?.find(\n productPageBuilder => productPageBuilder.sku === product?.legacyId\n ) || {}\n return getMergedProductData(\n product,\n matchedProduct,\n skuData,\n skuData?.priceFormatter,\n skuData?.currency\n )\n }\n default:\n return {}\n }\n}\n\nexport const getAddToCartProperties = (\n componentType: string,\n skuData: SkuType,\n mergedProductData: MergedProductType\n): AddToCartPropsType => {\n const data: AddToCardPropertiesType = isVariationOnPLP(componentType)\n ? skuData\n : (mergedProductData as AddToCardPropertiesType)\n return getAddToCartProps(data, componentType)\n}\n\nexport const getAddToCartProps = (\n data: AddToCardPropertiesType,\n componentType: string\n): AddToCartPropsType => {\n const commonProps: AddToCartPropsType = {\n sku: data.sku,\n longSku: data.longSku,\n category_name: data.category_name,\n price: data.price ?? 0,\n strikethrough_price: Number(data.strikethrough_price),\n hidePrice: data.hidePrice,\n technologies: data.technologies || [],\n url: data.url || ''\n }\n\n if (isVariationOnPLP(componentType)) {\n return {\n ...commonProps,\n type: data.type,\n price_per_capsule: data.price_per_capsule,\n show_capsule_price: data.show_capsule_price,\n label_capsules: data.label_capsules,\n capsule_price_label: data.capsule_price_label,\n capsule_price_syntax: data.capsule_price_syntax,\n show_sleeve_price: data.show_sleeve_price,\n show_sleeve: data.show_sleeve,\n sleeve_syntax: data.sleeve_syntax,\n number_of_sleeves: data.number_of_sleeves,\n label_sleeves: data.label_sleeves,\n label_sleeve: data.label_sleeve,\n technologies: data.technologies || [],\n sales_multiple: data.sales_multiple,\n unit_quantity: data.unitQuantity,\n bundled: data.bundled,\n url: data.url || ''\n }\n }\n\n return commonProps\n}\n\nexport const getPlpQuickViewProps = (\n popinId: string,\n skuData: SkuType,\n mergedProductData: MergedProductType,\n addToCartProps: AddToCartPropsType\n): QuickViewPropsType => {\n return {\n popin: {\n popin_id: popinId,\n close: skuData?.quick_view_plp?.popin?.close,\n footer: true\n },\n product: {\n ...mergedProductData\n },\n intensity: {\n intensity_label: mergedProductData?.intensity_label,\n a11y_intensity_max: 'max of {max_intensity}'\n },\n cup_sizes: {\n ...skuData?.quick_view_plp?.cup_sizes,\n items: skuData?.cupSizesDetails\n },\n aromatic_profile: {\n ...skuData?.quick_view_plp?.aromatic_profile,\n items: skuData?.capsuleProductAromatics || mergedProductData?.capsuleProductAromatics\n },\n link: {\n ...skuData?.quick_view_plp?.link,\n url: skuData?.url\n },\n levels: {\n ...skuData?.quick_view_plp?.levels\n },\n pricing: {\n add_to_cart: {\n ...addToCartProps,\n position: '',\n variation: 'small',\n url: '',\n view_details_label: 'View details',\n rendererName: ''\n },\n showSleeve: {},\n showCapsulePrice: {}\n },\n campaign: skuData.campaign\n }\n}\n\nexport const getCrossSellQuickViewProps = (\n popinId: string,\n product: ProductNewPropsType,\n skuData: SkuType,\n mergedProductData: MergedProductType,\n addToCartProps: AddToCartPropsType\n): QuickViewPropsType => {\n const props: QuickViewPropsType = {\n popin: {\n popin_id: popinId,\n close: skuData?.copywriting?.sku_quick_view?.popin?.close,\n footer: true\n },\n product: {\n ...mergedProductData\n },\n intensity: {\n intensity_label: skuData?.options?.intensity_label,\n a11y_intensity_max: 'max of {max_intensity}'\n },\n cup_sizes: {\n ...skuData?.copywriting?.sku_quick_view?.cup_sizes,\n items: product?.cupSizesDetails\n },\n aromatic_profile: {\n ...skuData?.copywriting?.sku_quick_view?.aromatic_profile,\n items: product?.capsuleProductAromatics || mergedProductData?.capsuleProductAromatics\n },\n link: {\n ...skuData?.copywriting?.sku_quick_view?.link,\n url: mergedProductData?.pdpURLs?.desktop\n },\n levels: {\n ...skuData?.quick_view_plp?.levels\n },\n pricing: {\n add_to_cart: {\n ...addToCartProps,\n position: '',\n variation: 'small',\n url: '',\n view_details_label: 'View details',\n rendererName: ''\n },\n showSleeve: {},\n showCapsulePrice: {}\n },\n campaign: {}\n }\n return props\n}\nconst isVariationOnPLP = (componentType: string) => componentType === VARIATION_PLP\n","import { sanitizeString } from '@kissui/helpers/src/utils'\nimport { getMergedProductCoffeeData } from './product.coffee.dto'\nimport { getMergedProductMachineData } from './product.machine.dto'\nimport { VARIATION_PLP } from '@kissui/components/src/sku/constants'\nimport { getMergedProductGiftCardData } from './product.giftCard.dto'\nimport { getMergedProductAccessoryData } from './product.accessory.dto'\nimport { apiOverride } from '@kissui/components/src/sku/services'\nimport {\n ECAPI_TYPE_ACCESSORY,\n ECAPI_TYPE_CAPSULE,\n ECAPI_TYPE_GIFT_CARD,\n ECAPI_TYPE_MACHINE\n} from '@kissui/helpers/src/catalog'\n\nexport const getMergedProductData = (\n product,\n pageBuilderProductProps,\n pageBuilderProps,\n priceFormatter,\n currency\n) => {\n const { options } = pageBuilderProps\n const {\n variant = {},\n labels = [],\n strikethrough_price,\n additional_message,\n additional_message_icon,\n additional_message_link,\n contact_cta\n } = pageBuilderProductProps || {}\n\n // lists header props not coming from this.props\n let data = {\n sku: product.internationalId,\n technologies: product.technologies,\n longSku: product.id,\n name: product.name,\n headline: sanitizeString(product.headline),\n sales_multiple: product.salesMultiple,\n unit_quantity: product.unitQuantity,\n type: product.type,\n category_name: product.rangeData?.name || '',\n label_range: product.rangeData?.name || '',\n price: product.price ? priceFormatter.short(currency, product.price) : null,\n rawPrice: product.price,\n strikethrough_price: strikethrough_price || '',\n variation: VARIATION_PLP,\n image_alt_text: product.name,\n image: product.images?.icon || product.images?.push || product.images?.main,\n additional_message: additional_message || '',\n additional_message_icon: additional_message_icon || '',\n additional_message_link: additional_message_link || {},\n contact_cta: contact_cta || {},\n ...apiOverride(product, pageBuilderProductProps)\n }\n\n if (labels && labels.length) {\n data.labels = labels\n }\n\n if (product.highlighted) {\n data.highlighted = product.highlighted\n }\n\n let dataTransformObjectProductType = {}\n if (product.type === ECAPI_TYPE_CAPSULE) {\n dataTransformObjectProductType = getMergedProductCoffeeData(\n product,\n pageBuilderProductProps,\n pageBuilderProps,\n priceFormatter,\n currency\n )\n } else if (product.type === ECAPI_TYPE_MACHINE) {\n dataTransformObjectProductType = getMergedProductMachineData(\n product,\n pageBuilderProductProps,\n pageBuilderProps\n )\n } else if (product.type === ECAPI_TYPE_ACCESSORY) {\n dataTransformObjectProductType = getMergedProductAccessoryData(\n product,\n pageBuilderProductProps,\n pageBuilderProps\n )\n } else if (product.type === ECAPI_TYPE_GIFT_CARD) {\n dataTransformObjectProductType = getMergedProductGiftCardData(\n product,\n pageBuilderProductProps,\n pageBuilderProps\n )\n }\n\n return {\n ...product,\n ...options,\n ...variant,\n ...data,\n ...dataTransformObjectProductType\n }\n}\n","export const getMergedProductMachineData = (product, pageBuilderProductProps, pageBuilderProps) => {\n const { strikethrough_price, variant = {} } = pageBuilderProductProps\n const { ratingsAndReviews } = product\n\n // lists header props not coming from this.props\n const options = {\n ratings: ratingsAndReviews\n }\n\n if (variant?.colors) {\n options.colors = variant.colors\n options.activeSku = product.internationalId\n options.max_colors = 99\n }\n\n options.strikethrough_price = strikethrough_price || ''\n options.show_ratings = (pageBuilderProps && pageBuilderProps.options.show_ratings) || false\n options.minimum_rating = (pageBuilderProps && pageBuilderProps.options.minimum_rating) || 0\n\n return options\n}\n","export const getMergedProductAccessoryData = () => ({})\n","export const getMergedProductGiftCardData = (_, pageBuilderProductProps) => {\n const { variant = {} } = pageBuilderProductProps\n\n return {\n image: variant && variant.default_image\n }\n}\n","export type EventListener = {\n element: HTMLElement\n type: string\n listener: (e: Event) => void\n options?: boolean | AddEventListenerOptions\n}\n\nconst add = (eventListeners: EventListener[] = []) => {\n eventListeners.forEach(eventListener => {\n if (!eventListener || !eventListener.element) {\n return\n }\n return eventListener.element.addEventListener(\n eventListener.type,\n eventListener.listener,\n eventListener.options\n )\n })\n}\n\nconst remove = (eventListeners: EventListener[] = []) => {\n eventListeners.forEach(eventListener => {\n if (!eventListener || !eventListener.element) {\n return\n }\n eventListener.element.removeEventListener(eventListener.type, eventListener.listener)\n })\n}\n\nconst busNamespace = 'pageBuilder'\n\nexport const emitCustomEvent = (eventName: string, data: unknown) => {\n const customEvent = new CustomEvent(`${busNamespace}.${eventName}`, {\n detail: data,\n bubbles: true,\n cancelable: true,\n composed: false\n })\n\n window.dispatchEvent(customEvent)\n}\n\nexport default { add, emitCustomEvent, remove }\n","import { getProduct } from '@kissui/helpers/src/catalog'\nimport { emitCustomEvent } from './events.helpers'\nimport { removeEmptyValues } from '@kissui/helpers/src/utils'\n\nconst raisedByPB = 'page builder'\nconst raisedByWC = 'Web component'\n\n/**\n * helper method for 'itemDisplay' GTM event\n * @param {*} event : 'itemDisplay' - Mandatory as is\n * @param {*} eventRaisedBy : 'Web component' - Mandatory as is\n * @param {*} eventAction : 'Click' - Action that led to the item display. For example, click\n * @param {*} itemTypes : ['products'] - Mandatory as is\n * @param {*} rootElement : ['nb-slider'] - Root DOM element for item detection. Closest common ancestor element of the inserted/displayed promotions and products. It will help the detection to reduce its performance consumption. Set to 0 (zero) in order to request detection through the entire document.\n */\nexport const itemDisplay = args => {\n window.gtmDataObject = window.gtmDataObject || []\n const eventData = {\n event: 'itemDisplay',\n eventRaisedBy: raisedByWC,\n eventAction: 'Click',\n itemTypes: ['products'],\n ...args\n }\n window.gtmDataObject.push(eventData)\n emitCustomEvent('itemDisplay', eventData)\n}\n\n/**\n *\n * helper method for 'customEvent' GTM event\n * @param {*} args (event, eventRaisedBy, eventCategory, eventAction, eventLabel, nonInteraction)\n */\n\nexport const customEvent = args => {\n window.gtmDataObject = window.gtmDataObject || []\n var eventData\n if (args.event_GA4 === undefined || args.event_GA4 === false) {\n eventData = {\n event: 'customEvent',\n eventRaisedBy: raisedByWC,\n ...args\n }\n } else {\n eventData = {\n event_raised_by: raisedByPB,\n ...args\n }\n }\n window.gtmDataObject.push(eventData)\n emitCustomEvent('customEvent', eventData)\n}\n\n/**\n * Helper method for tracking component interactions, compatible with GA4.\n *\n * @param {String} creative : component raising the event, e.g. 'before_coffees_list', 'before_machines_list', 'before_accessories_list'\n * @param {String} actionType : description of the interaction, e.g 'pdp quick view'\n * @param {String} internationalId : long SKU, e.g. 'erp.pt.b2c/prod/7243.30'\n * @param {String} internationalName : international name of the product, e.g. 'Vertuo Carafe Pour-Over Style Mild'\n * @param {String} productType : type of product, i.e. 'capsule', 'machine', 'accessory'\n * @param {String} range : product range, e.g. 'ispirazione italiana'\n * @param {String} technology : technology, i.e. 'original', 'vertuo'\n * @param {Number} price : price, e.g. .51\n * @param {String} eventAction : description of the action, e.g. 'PDP Quick View'\n *\n * Initally created for PDP Quick View tracking:\n * https://dsu-confluence.nestle.biz/display/DIANA/BEFORE+-+PDP+Quick+View\n * Will probably be rolled out across all components, update this comment accordingly.\n */\nexport const trackComponentInteraction = ({\n creative = '',\n actionType = '',\n internationalId = '',\n internationalName = '',\n productType = '',\n technology = '',\n category = '',\n rawPrice = '',\n eventAction = ''\n}) => {\n window.gtmDataObject = window.gtmDataObject || []\n const eventData = {\n event: 'page_builder_component_interaction',\n event_raised_by: raisedByPB,\n component_name: creative,\n action_type: actionType,\n item_id_event: internationalId,\n item_name_event: internationalName,\n item_category_event: productType,\n item_technology_event: technology,\n item_range_event: category,\n item_price_event: rawPrice,\n eventCategory: 'User Engagement',\n eventAction: eventAction,\n eventLabel: `${productType} - ${technology} - ${internationalName}`\n }\n window.gtmDataObject.push(eventData)\n emitCustomEvent('page_builder_component_interaction', eventData)\n}\n\n/**\n *\n * Push 'view_promotion' event for GA 4\n * @param {*} args (event, event_raised_by, ecommerce: {promotion_id, promotion_name, creative_slot, creative_name})\n */\nexport const viewPromotion = args => {\n const event = 'view_promotion'\n const eventData = {\n event,\n event_raised_by: raisedByPB,\n ecommerce: {}\n }\n if (Object.keys(args).length) {\n const { id = '', creative = '', name = '', position = '' } = args\n let ecommerceData = {\n promotion_id: id,\n promotion_name: name,\n creative_slot: position,\n creative_name: creative\n }\n ecommerceData = removeEmptyValues(ecommerceData)\n eventData.ecommerce = ecommerceData\n }\n window.gtmDataObject ??= []\n window.gtmDataObject.push(eventData)\n emitCustomEvent(event, eventData)\n}\n\nexport const handlePromoClick = args => {\n const { campaign, cta_name } = args\n\n const cleanedData = removeEmptyValues(campaign)\n selectPromotion({ cta_name, ...cleanedData })\n}\n\n/**\n *\n * Push 'select_promotion' event for GA 4\n * @param {*} args (event, event_raised_by, cta_name, ecommerce: {promotion_id, promotion_name, creative_slot, creative_name})\n */\nexport const selectPromotion = args => {\n const event = 'select_promotion'\n const eventData = {\n event: 'select_promotion',\n cta_name: args?.cta_name ?? '(not set)',\n event_raised_by: raisedByPB,\n ecommerce: {}\n }\n if (Object.keys(args).length) {\n const { id = '', creative = '', name = '', position = '' } = args\n let ecommerceData = {\n promotion_id: id,\n promotion_name: name,\n creative_slot: position,\n creative_name: creative\n }\n ecommerceData = removeEmptyValues(ecommerceData)\n eventData.ecommerce = ecommerceData\n }\n\n window.gtmDataObject ??= []\n window.gtmDataObject.push(eventData)\n emitCustomEvent(event, eventData)\n}\n\nexport const interactionClick = (nameComponent, ctaName) => {\n window.gtmDataObject = window.gtmDataObject || []\n const eventData = {\n event: 'page_builder_component_interaction',\n event_raised_by: raisedByPB,\n eventCategory: 'User Engagement',\n eventAction: 'Click CTA',\n eventLabel: `Page Builder - ${nameComponent} - ${ctaName}`,\n component_name: nameComponent,\n action_type: 'web component click',\n cta_name: ctaName\n }\n window.gtmDataObject.push(eventData)\n emitCustomEvent('page_builder_component_interaction', eventData)\n}\n\nexport const getProductInfo = async (sku, data) => {\n let product = data\n if (!product) {\n product = await getProduct(sku)\n }\n return product\n}\n\nexport const getProductPayload = (data, actionField = {}) => {\n const {\n internationalName,\n internationalId,\n category,\n unitPrice,\n legacyId,\n name,\n technologies,\n bundled,\n inStock,\n type\n } = data\n\n const technology = technologies.map(item => item.split('/').pop()).join('|')\n const isDiscovery = category.toLowerCase().includes('discovery')\n\n return [\n // Array consists of one product details for PDP Product Detail View\n {\n ...actionField,\n name: internationalName, // '[[International Product Name]]' NIE, Contract\n id: internationalId, // '[[International Product ID]]'\n price: unitPrice, // '[[Product Price]'\n // dimension43: '[[true/false]]', // '[[true/false]]' // Signifies if this product is part of a standing order or not\n dimension44: isDiscovery.toString(), // '[[true/false]]', // Signifies if this product is part of a discovery offer\n dimension53: legacyId, // '[[Product Local market ID]]', // Local market id for product\n dimension54: name, // '[[Product Local market Name]]', // Local market name for product\n dimension55: category, // '[[Product Range]]', // Range of the product, eg: Barista Creations for Ice (Nessoft Category)\n dimension56: technology, // '[[Product Technology]]', //Product technology according to Nespresso categorization (original, vertuo, pro)\n dimension57: bundled ? 'bundle' : 'single', // '[[Product Type]]', //If the product is single or bundle\n dimension192: inStock ? 'in stock' : 'out of stock', // '[in stock]', // \"in stock\" or \"out of stock\"\n category: type, // '[[Product Category]]', //Product category according to Nespresso categorization (Nessoft type): capsule, accessory, machine\n brand: 'Nespresso' // Static value set to Nespresso\n }\n ]\n}\n\nexport const trackDetailView = async (sku, data) => {\n // https://dsu-confluence.nestle.biz/display/DIANA/HQ+PB+Tracking+-+Product+Detail+View\n if (window.pbTrackDetailViewPDP || !sku || !window.napi) {\n return\n }\n\n const productInfo = await getProductInfo(sku, data)\n const productPayload = getProductPayload(productInfo)\n const currency = productInfo.currency\n\n window.gtmDataObject = window.gtmDataObject || []\n const eventData = {\n event: 'detailView',\n currencyCode: currency,\n eventRaisedBy: raisedByPB,\n ecommerce: {\n detail: {\n actionField: {},\n products: productPayload\n }\n }\n }\n window.gtmDataObject.push(eventData)\n // Track only once per page\n window.pbTrackDetailViewPDP = true\n emitCustomEvent('detailView', eventData)\n}\n\nexport const trackAddToCartImpression = (product, isStickyBar) => {\n // https://dsu-confluence.nestle.biz/pages/viewpage.action?spaceKey=DIANA&title=PDP+-+Sticky+Add+To+Cart+Custom+Event\n\n window.gtmDataObject = window.gtmDataObject || []\n const eventData = {\n event: 'page_builder_component_interaction',\n event_raised_by: raisedByPB,\n component_name: 'before_sku_main_info',\n action_type: isStickyBar\n ? 'sticky add to cart impression'\n : 'standard add to cart impression',\n //product info\n item_id_event: product.internationalId,\n item_name_event: product.internationalName,\n item_category_event: product.type,\n item_price_event: product.price_per_capsule?.split(' ')[0],\n item_market_id_event: product.legacyId,\n item_market_name_event: product.name,\n item_range_event: product.category_name,\n item_technology_event: product.technology?.[0]?.split('/').slice(-1) ?? '',\n item_type_event: product.bundled ? 'bundle' : 'single'\n }\n window.gtmDataObject.push(eventData)\n emitCustomEvent('page_builder_component_interaction', eventData)\n}\n\nexport const productImpression = async (position, list, sku, data) => {\n // https://dsu-confluence.nestle.biz/pages/viewpage.action?pageId=225612781\n // don't track already tracked products\n window.gtmDataObject = window.gtmDataObject || []\n const hasDetailView = window.gtmDataObject.find(item => item.event === 'detailView')\n const alreadyTracked = !!hasDetailView?.ecommerce?.detail?.products.find(p =>\n sku.includes(p.id)\n )\n if (alreadyTracked) {\n return\n }\n\n const productInfo = await getProductInfo(sku, data)\n const productPayload = getProductPayload(productInfo, { list: list, position: position })\n const currency = productInfo.currency\n const eventData = {\n event: 'impression',\n eventAction: 'Product Impression',\n currencyCode: currency,\n eventRaisedBy: raisedByPB,\n ecommerce: {\n impressions: productPayload\n }\n }\n window.gtmDataObject.push(eventData)\n emitCustomEvent('impression', eventData)\n}\n\nexport const productClick = async (position, list, sku, data) => {\n // https://dsu-confluence.nestle.biz/pages/viewpage.action?pageId=225612781\n\n if (typeof list !== 'string') return\n\n const productInfo = await getProductInfo(sku, data)\n const productPayload = getProductPayload(productInfo, { position: position })\n const currency = productInfo.currency\n\n window.gtmDataObject = window.gtmDataObject || []\n const eventData = {\n event: 'productClick',\n eventAction: 'Product Click',\n currencyCode: currency,\n eventRaisedBy: raisedByPB,\n ecommerce: {\n click: {\n actionField: {\n list: list\n },\n products: productPayload\n }\n }\n }\n window.gtmDataObject.push(eventData)\n emitCustomEvent('productClick', eventData)\n}\n\nexport function filterTrackingFromPlpFilters(filtersSelected) {\n const grouped = groupSelectedFilters(filtersSelected)\n const groupKeys = Object.keys(grouped)\n const typesFiltersSelected = groupKeys.join('|').substring(0, 99)\n const valuesFiltersSelected = groupKeys\n .map(key => grouped[key].values.map(value => value.split('/').at(-1)).join(','))\n .join('|')\n .substring(0, 99)\n\n return [typesFiltersSelected, valuesFiltersSelected]\n}\n\nexport const filterActionEvent = (\n actionType,\n filterType,\n filterValues,\n clickLocation,\n dataType\n) => {\n // https://dsu-confluence.nestle.biz/display/DIANA/PLP+-+Filter+Revamp\n window.gtmDataObject = window.gtmDataObject || []\n const eventData = getExplicitFilterEventData(\n actionType,\n filterType,\n filterValues,\n clickLocation\n )\n\n window.gtmDataObject.push(eventData)\n if (window.NEXT_V1_PLP_EXPLICIT_FILTER_TRACKING && dataType) {\n window.gtmDataObject.push({\n ...window.NEXT_V1_PLP_EXPLICIT_FILTER_TRACKING,\n experiment_action: `${actionType} - ${dataType}`,\n cta_name: 'All filters'\n })\n }\n\n emitCustomEvent('plp_filter', eventData)\n}\n\nconst getExplicitFilterEventData = (actionType, filterType, filterValues, clickLocation) => {\n return {\n event: 'plp_filter',\n event_raised_by: raisedByPB,\n action_type: actionType,\n filter_type: filterType,\n ...(filterValues ? { filter_values: filterValues } : {}),\n ...(clickLocation ? { click_location: clickLocation } : {})\n }\n}\n\nfunction groupSelectedFilters(filtersSelected = []) {\n return filtersSelected.reduce((grouped, { key, value }) => {\n if (!grouped[key]) grouped[key] = { key, values: [] }\n grouped[key].values.push(value.replaceAll(',', '-'))\n return grouped\n }, {})\n}\n\nfunction arrTolastURLElementMapper(arr) {\n if (typeof arr === 'undefined' || arr.length === 0) return undefined\n\n return arr.map(item => item.split('/').pop()?.trim() || '')\n}\n\nfunction arrToJoinedString(arr, joiner = '|') {\n if (typeof arr === 'undefined' || arr.length === 0) return undefined\n\n return arr.map(item => item.trim()).join(joiner)\n}\n\nfunction findTechnogiesText(arr) {\n if (typeof arr === 'undefined' || arr.length === 0) return undefined\n\n if (arr.length === 1) return cleanText(arrTolastURLElementMapper(arr)?.[0])\n else return 'multiple'\n}\n\nfunction cleanText(str) {\n if (typeof str === 'undefined') return undefined\n\n return str.toString().trim()\n}\n\nconst generateEcommerceObject = async (productIds, options) => {\n const productRequests = productIds.map(SKU => getProduct(SKU))\n const productData = await Promise.all(productRequests)\n\n return {\n ecommerce: {\n currency: window[window.config.padl.namespace].dataLayer.app.app.currency,\n value: productData.reduce((ac, product) => {\n return ac + product.price\n }, 0),\n items: productData.map((product, index) => {\n if (product.type === 'bundle' || product.type === 'giftcard') {\n return {\n item_id: cleanText(product.internationalId),\n item_name: cleanText(product.internationalName),\n item_brand: 'nespresso',\n item_category: cleanText(product.type),\n index: index + 1\n }\n }\n\n let output = {\n item_id: cleanText(product.internationalId),\n item_name: cleanText(product.internationalName),\n item_brand: 'nespresso',\n item_category: cleanText(product.type),\n item_category2: arrToJoinedString(\n arrTolastURLElementMapper(product.technologies)\n ),\n item_category3: cleanText(product.category),\n price: product.price,\n quantity: product.salesMultiple,\n affiliation: 'nespresso online store',\n coupon: undefined,\n discount: undefined,\n location_id: undefined,\n item_list_name: cleanText(options?.listName),\n item_list_id: cleanText(options?.listId),\n index: index + 1,\n item_market_id: cleanText(product.legacyId),\n item_market_name: cleanText(product.name),\n item_technology: findTechnogiesText(product.technologies),\n item_range: cleanText(product.category),\n item_discovery_offer: product.category.includes('discovery').toString(),\n item_added_by_user: undefined,\n item_ecotax_applicable: product?.displayEcoTax\n ? cleanText(product?.displayEcoTax.toString())\n : undefined,\n item_selection_list: cleanText(arrToJoinedString(product.productSelections)),\n item_in_stock: product?.inStock\n ? cleanText(product?.inStock.toString())\n : undefined,\n item_subscription_name: undefined,\n item_subscription_category: undefined,\n item_subscription_price: undefined,\n item_subscription_duration: undefined,\n item_subscription_fee: undefined\n }\n\n switch (product.type) {\n case 'capsule': {\n const capsuleProduct = product\n\n output.item_category4 = capsuleProduct.bundled ? 'bundle' : 'single'\n\n output.item_type = capsuleProduct.bundled ? 'bundle' : 'single'\n\n output.item_coffee_aromatic_profile = cleanText(\n arrToJoinedString(capsuleProduct.capsuleProductAromatics)?.toLowerCase()\n )\n\n output.item_coffee_intensity =\n cleanText(capsuleProduct.capsuleProperties.intensity) ?? undefined\n\n output.item_coffee_cup_size = cleanText(\n arrToJoinedString(capsuleProduct.capsuleCupSizes)\n )?.toLowerCase()\n\n break\n }\n case 'machine': {\n const machineProduct = product\n\n output.item_machine_shade = cleanText(machineProduct.colorShade?.name)\n\n break\n }\n }\n\n if (product.type === 'machine' || product.type === 'accessory') {\n output.item_avg_rating = product.ratingCode\n output.item_number_of_reviews = product.ratingCode\n }\n\n return output\n })\n }\n }\n}\n\nexport const selectItems = async (productIds, options) => {\n const ecommerceObject = await generateEcommerceObject(productIds, options)\n\n const output = {\n event: 'select_item',\n event_raised_by: options?.eventRaisedBy ?? 'before_cross_sell_v3',\n click_location: options?.clickLocation ?? 'page builder cross sell quick view',\n item_list_id: options?.listId ?? 'before_cross_sell_v3',\n subscription_product_included: 'false',\n discovery_offer_included: 'false',\n ...ecommerceObject\n }\n\n window.gtmDataObject.push({ ecommerce: null })\n window.gtmDataObject.push(output)\n}\n\nexport const viewItemList = async (productIds, options) => {\n const ecommerceObject = await generateEcommerceObject(productIds, options)\n\n const output = {\n event: 'view_item_list',\n event_raised_by: options?.eventRaisedBy,\n subscription_product_included: 'false',\n discovery_offer_included: 'false',\n ...ecommerceObject\n }\n\n if (options?.eventRaisedBy === undefined) delete output.event_raised_by\n\n window.gtmDataObject.push({ ecommerce: null })\n window.gtmDataObject.push(output)\n}\n\nexport const isGtmTrackingExists = trackingData => {\n window.gtmDataObject = window.gtmDataObject || []\n\n return window.gtmDataObject.some(\n event =>\n event.event === trackingData.event &&\n event.ecommerce?.creative_slot === trackingData.campaign.position &&\n event.ecommerce?.promotion_id === trackingData.campaign.id &&\n event.ecommerce?.promotion_name === trackingData.campaign.name &&\n event.ecommerce?.creative_name === trackingData.campaign.creative\n )\n}\n","import { EVENT_POPIN_OPEN } from '@kissui/components'\nimport { NespressoElement } from '@kissui/components/src/nespressoElement'\nimport { renderLabels } from './fragments/labels'\nimport { renderLogos } from '@kissui/helpers/src/logos.helpers'\nimport { renderImage } from './fragments/image'\nimport { renderHeading } from './fragments/heading'\nimport { renderHeadline } from './fragments/headline'\nimport { renderLabelTechnology } from './fragments/labelTechnology'\nimport { renderLabelRange } from './fragments/labelRange'\nimport { renderQuickView } from './fragments/quickView'\nimport { renderStrikethroughPrice } from './fragments/strikethroughPrice'\nimport { renderPrice } from './fragments/price'\nimport { renderAddToCart } from './fragments/addToCart'\nimport { renderAdditionalMessage } from './fragments/additionalMessage'\nimport { setCardTheme } from './fragments/setCardTheme'\nimport { getSkuQuickViewData } from '@kissui/components/src/sku-quick-view/shared-quick-view'\nimport { dispatchEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\nimport { getTechnologyName, getProduct } from '@kissui/helpers/src/catalog'\nimport { trackComponentInteraction, productClick } from '@kissui/helpers/src/gtmEvents'\nimport { isLoggedIn } from '@kissui/helpers/src/dataLayer'\nimport { VARIATION_PLP } from '@kissui/components/src/sku/constants'\n\nclass Sku extends NespressoElement {\n constructor() {\n super()\n this.type = 'default'\n this.popinId = ''\n this.isQuickViewPlp = false\n this.boundOnPDPLinkClick = this.onPDPLinkClick.bind(this)\n this.boundOnQuickViewOpen = this.onQuickViewOpen.bind(this)\n this.clickMethod = this.boundOnPDPLinkClick\n }\n\n loadTemplate() {\n this.classList.add('nb-sku')\n this.classList.add(`nb-sku__${this.type}`)\n setCardTheme(this.props, this)\n\n Object.assign(this.props, this.getSleevePrice(this.props))\n Object.assign(this.props, this.checkHiddenPriceForLoggedInUser(this.props))\n\n const { quick_view_plp = {} } = this.props\n this.isQuickViewPlp = quick_view_plp?.show_view || false\n this.clickMethod = this.isQuickViewPlp\n ? this.boundOnQuickViewOpen\n : this.boundOnPDPLinkClick\n\n this.template = `${this.renderVisual()}\n ${this.renderHeader()}\n <div class=\"cb-content\">\n ${this.renderInformation()}\n ${this.isQuickViewPlp ? this.renderQuickView() : ''}\n <div class=\"cb-shop\">\n <div class=\"cb-price\">\n ${this.renderPricing()}\n </div>\n ${this.renderAction()}\n </div>\n ${this.renderFooter()}\n </div>`\n\n this.render()\n }\n\n onReady() {\n const { activeSku, sku } = this.props\n this.setAttribute('data-product-short-sku', activeSku || sku)\n this.bindEvent()\n }\n\n renderHeaderDefault() {\n return `${renderLabels(this.props, this)}${renderLogos(this.props, this)}`\n }\n\n renderHeader() {\n return this.renderHeaderDefault()\n }\n\n renderVisualDefault() {\n const theme = this.hasAttribute('portrait') ? 'portrait' : 'landscape'\n return renderImage(this.props, theme)\n }\n\n getSleevePrice({ number_of_sleeves, price }) {\n let hasPricePerSleeve = true\n let sleevePrice\n if (number_of_sleeves === '1') {\n sleevePrice = price\n } else {\n hasPricePerSleeve = false\n }\n return { hasPricePerSleeve, sleevePrice }\n }\n\n checkHiddenPriceForLoggedInUser({ hidePrice, show_view_details }) {\n return {\n hidePrice: isLoggedIn() ? false : hidePrice,\n show_view_details: isLoggedIn() ? false : show_view_details\n }\n }\n\n renderVisual() {\n return this.renderVisualDefault()\n }\n\n renderInformationDefault() {\n return `${renderLabelTechnology(this.props)}\n ${renderLabelRange(this.props)}\n ${renderHeading(this.props)}\n ${renderHeadline(this.props)}`\n }\n\n renderInformation() {\n return this.renderInformationDefault()\n }\n\n renderQuickView() {\n return renderQuickView(this.props)\n }\n\n renderPricingDefault() {\n const isPortrait = this.hasAttribute('portrait')\n\n const pricingWithClass = `\n ${renderStrikethroughPrice(this.props, this)}\n <div class=\"${isPortrait ? 't-md-700-sl' : 't-sm-700-sl'}\">\n ${renderPrice(this.props)}\n </div>`\n\n return pricingWithClass\n }\n\n renderPricing() {\n return this.renderPricingDefault()\n }\n\n renderActionDefault() {\n return renderAddToCart(this.props, false, this)\n }\n\n renderAction() {\n const actionSlot = this.querySelector('[slot=\"action\"]')?.outerHTML\n if (actionSlot) {\n return actionSlot\n }\n return this.renderActionDefault()\n }\n\n renderFooterDefault() {\n return renderAdditionalMessage(this.props)\n }\n\n renderFooter() {\n return this.renderFooterDefault()\n }\n\n async onPDPLinkClick() {\n const productIndex = this.getAttribute('tracking_position') || 0\n const list = this.getAttribute('tracking_list') || ''\n\n await productClick(productIndex, list, this.props.longSku)\n }\n\n renderSkuQuickView(product) {\n this.popinId = `plp-quick-view`\n\n let quickViewElement = document.querySelector(`#${this.popinId}`)\n if (quickViewElement) {\n quickViewElement.remove()\n }\n\n getSkuQuickViewData(product, this.popinId, this.props, VARIATION_PLP)\n }\n\n async onQuickViewOpen(e) {\n e.preventDefault()\n\n const { sku } = this.props\n if (!sku) {\n return\n }\n\n try {\n const product = await getProduct(sku)\n\n this.renderSkuQuickView(product)\n trackComponentInteraction({\n creative: this.props.campaign?.creative,\n actionType: 'pdp quick view',\n internationalId: product.internationalId,\n internationalName: product.internationalName,\n productType: product.type,\n technology: getTechnologyName(product),\n category: product.category,\n rawPrice: product.price,\n eventAction: 'PDP Quick View'\n })\n dispatchEvent({ eventName: EVENT_POPIN_OPEN, args: { id: this.popinId } })\n } catch (e) {\n console.error(`getProduct fail on sku ${sku}`)\n }\n return false\n }\n\n bindEvent() {\n this.unbindEvent()\n const showQuickView = this.props.quick_view_plp?.show_view\n const quickViewTextExists = this.props.quick_view_plp?.quick_view_text\n\n if (!quickViewTextExists) {\n this.classList.add('sku-hover')\n }\n\n if (showQuickView && this.props.variation === VARIATION_PLP) {\n const elements = quickViewTextExists ? this.querySelectorAll('nb-link button') : [this]\n\n elements.forEach(element => {\n element.addEventListener('click', this.clickMethod)\n })\n\n // to avoid adding click event to the button inside the sku card\n this.addStopPropagationEvent('nb-add-to-cart')\n this.addStopPropagationEvent('nb-cta')\n }\n }\n\n unbindEvent() {\n const showQuickView = this.props.quick_view_plp?.show_view\n const quickViewTextExists = this.props.quick_view_plp?.quick_view_text\n\n if (showQuickView && this.props.variation === VARIATION_PLP) {\n const elements = quickViewTextExists ? this.querySelectorAll('nb-link button') : [this]\n\n elements.forEach(element => {\n element.removeEventListener('click', this.clickMethod)\n })\n\n this.removeStopPropagationEvent('nb-add-to-cart')\n this.removeStopPropagationEvent('nb-cta')\n }\n }\n\n addStopPropagationEvent(selector) {\n const element = this.querySelector(selector)\n if (element) {\n element.addEventListener('click', this.stopPropagationHandler)\n }\n }\n\n removeStopPropagationEvent(selector) {\n const element = this.querySelector(selector)\n if (element) {\n element.removeEventListener('click', this.stopPropagationHandler)\n }\n }\n\n stopPropagationHandler(event) {\n event.stopPropagation()\n }\n\n disconnectedCallback() {\n this.unbindEvent()\n }\n}\n\ncustomElements.get('nb-sku') || customElements.define('nb-sku', Sku)\n\nexport default Sku\n","import viewportHelper from '@kissui/helpers/src/viewport.helpers'\nimport { VARIATION_PDP, VARIATION_PLP } from '@kissui/components/src/sku/constants'\nimport { ECAPI_TYPE_CAPSULE } from '@kissui/helpers/src/catalog'\n\nexport const setCardTheme = ({ variation, type }, component) => {\n // PDP\n if (variation === VARIATION_PDP) {\n component.setAttribute('pdp', 'true') // Used by CSS to increase font-size, etc.\n }\n\n // COFFEE on PLP on MOBILE\n if (variation === VARIATION_PLP && type === ECAPI_TYPE_CAPSULE && viewportHelper.is.mobile) {\n component.setAttribute('landscape', 'true')\n return\n }\n\n component.setAttribute('portrait', 'true')\n}\n","import viewportHelper from '@kissui/helpers/src/viewport.helpers'\nimport { stringifyForAttribute } from '@kissui/helpers/src/utils'\n\n/**\n * Display labels\n * @param {Object[]} labels - List of labels\n * @param {string} labels[].name - Text\n * @param {string} labels[].bgColor - Background\n * @param {string} labels[].color - Font color\n * @param {HTMLElement} component - Apply css on component\n * @returns {String} - Render of labels\n */\nexport const renderLabels = ({ labels = [] }, component = null) => {\n if (!component || !labels || !labels.length) {\n return ''\n }\n\n if (component && labels.length) {\n component.classList.add('has-labels')\n }\n\n const direction = viewportHelper.is.mobile ? 'row' : 'column'\n const data = stringifyForAttribute({ labels })\n\n return `<nb-card-labels data=\"${data}\" direction=\"${direction}\"></nb-card-labels>`\n}\n","import { stringifyForAttribute } from '@kissui/helpers/src/utils'\n\nexport const renderLogos = (props, component) => {\n const {\n fair_trade,\n alt_fair_trade,\n is_organic,\n alt_organic,\n only_vertuo_next,\n alt_vertuo_next,\n is_rainforest,\n alt_rainforest,\n is_sustainable,\n alt_sustainable,\n is_q_certified_arabica,\n alt_q_certification_arabica,\n logos\n } = props\n\n if (\n !fair_trade &&\n !is_organic &&\n !only_vertuo_next &&\n !is_rainforest &&\n !is_sustainable &&\n !is_q_certified_arabica &&\n (logos == null || logos.length < 1)\n ) {\n return ''\n }\n\n component.classList.add('has-logos')\n\n const data = {\n fair_trade,\n alt_fair_trade,\n is_organic,\n alt_organic,\n only_vertuo_next,\n alt_vertuo_next,\n is_rainforest,\n alt_rainforest,\n is_sustainable,\n alt_sustainable,\n is_q_certified_arabica,\n alt_q_certification_arabica,\n logos\n }\n return `<nb-card-logos data='${stringifyForAttribute(data)}'></nb-card-logos>`\n}\n","import { getTechnologyName } from '@kissui/helpers/src/catalog'\n\nexport const renderQuickView = ({\n sku,\n quick_view,\n tracking_list,\n tracking_position,\n campaign_creative,\n internationalId,\n internationalName,\n type,\n technologies,\n category,\n rawPrice,\n colors\n}) => {\n if (!quick_view || !quick_view.label || !quick_view.popin_id) {\n return ''\n }\n\n const skuData = JSON.stringify({\n internationalId: internationalId,\n internationalName: internationalName,\n type: type,\n technology: getTechnologyName({ technologies }),\n category: category,\n rawPrice: rawPrice\n })\n let colorsSkusList = []\n if (typeof colors !== 'undefined') {\n colors.map(color => {\n colorsSkusList.push(color.sku)\n })\n }\n\n return `<nb-link\n color=\"gold\"\n size=\"large\"\n sku_colors=\"${colorsSkusList}\"\n popin_id=\"${quick_view.popin_id}\"\n sku='${sku}'\n sku_data='${skuData}'\n campaign_creative='${campaign_creative}'\n tracking_list='${tracking_list}'\n tracking_position='${tracking_position}'>${quick_view.label}</nb-link>`\n}\n","import { ECAPI_TYPE_CAPSULE } from '@kissui/helpers/src/catalog'\nexport const renderPrice = ({\n price,\n hidePrice,\n giftcard_price,\n price_per_capsule,\n show_sleeve_price,\n type\n}) => {\n if ((!price && !giftcard_price) || hidePrice) {\n return ''\n }\n let finalPrice = null\n if (!show_sleeve_price && price_per_capsule) {\n finalPrice = price_per_capsule\n } else {\n finalPrice = price\n }\n if (type !== ECAPI_TYPE_CAPSULE) {\n finalPrice = price\n }\n\n return `<p class=\"cb-price-current\"><span>${finalPrice || giftcard_price}</span></p>`\n}\n","import viewportHelper from '@kissui/helpers/src/viewport.helpers'\nimport { stringifyForAttribute } from '@kissui/helpers/src/utils'\n\nconst DISPLAY_COLOR_MAX = 4\n\nexport const renderColors = props => {\n if (!props) {\n return ''\n }\n\n const {\n colors,\n sku,\n max_colors = DISPLAY_COLOR_MAX,\n a11y_extra_color = '',\n url,\n activeSku,\n name\n } = props\n\n if (!colors) {\n return ''\n }\n\n const colorData = stringifyForAttribute({\n colors,\n max_colors,\n activeSku: activeSku || sku,\n extra_url: url,\n extra_title: name + ', ' + a11y_extra_color\n })\n\n const size = viewportHelper.is.mobile ? 'small' : 'large'\n\n return `<nb-colors data=\"${colorData}\" size=\"${size}\"></nb-colors>`\n}\n","// Caching mechanism for ratings\nconst API_RATING_CACHE_TTL = 86400000 // 24 hrs\nconst API_RATING_CACHE_PREFIX = 'n-ratings-'\n\nconst setWithExpiry = (key, value) => {\n const now = new Date()\n\n // 'item' is an object which contains the original value\n // as well as the time when it's supposed to expire\n const item = {\n value: value,\n expiry: now.getTime() + API_RATING_CACHE_TTL\n }\n localStorage.setItem(key, JSON.stringify(item))\n}\n\nconst getWithExpiry = key => {\n const itemStr = localStorage.getItem(key)\n if (!itemStr) return undefined\n\n const item = JSON.parse(itemStr)\n const now = new Date()\n\n // compare the expiry time of the item with the current time\n if (now.getTime() > item.expiry) {\n // If the item is expired, delete the item from storage and return null\n localStorage.removeItem(key)\n return undefined\n }\n\n return item.value\n}\n\nexport const getEncodedProductId = longSku => window.btoa(longSku)\n\nexport const getRatingDetails = async sku => {\n const key = `${API_RATING_CACHE_PREFIX}${sku}`\n let data = getWithExpiry(key)\n if (data === undefined) {\n // already expired or not cached\n data = await window.napi.ratings().summary(sku)\n setWithExpiry(key, data)\n }\n return data\n}\n\nexport const isRatingEnabled = product =>\n product.productRatings && product.productRatings.ratingEnabled\n\nexport const isRated = (productRatings, minimum_rating) =>\n productRatings.reviewCount > 0 &&\n productRatings.ratingAverage > 0 &&\n productRatings.ratingAverage >= minimum_rating\n\nexport const getRatingPercentage = ratingSpread => {\n const ratingAverageSum = ratingSpread.reduce((partialSum, value) => partialSum + value, 0)\n\n return ratingSpread.map(element => {\n return (element / ratingAverageSum) * 100\n })\n}\n\nexport const checkIfReviewsAvailable = ratingsResult => ratingsResult.reviewCount > 0\n\nexport const getProductReviews = async (\n market,\n language,\n encodedProductId,\n sort = 'highlightedFirst',\n page = 0\n) => {\n const url = `/ecapi/rating/v1/${market}/${language}/${encodedProductId}/read?platform=desktop&page=${page}&sort=${sort}`\n const response = await fetch(url)\n\n return response.json()\n}\n\nexport const postLike = async (market, language, encodedProductId, reviewId) => {\n const url = `/ecapi/rating/v1/${market}/${language}/${encodedProductId}/${reviewId}/like`\n\n const response = await fetch(url, {\n method: 'POST'\n })\n\n return response.json()\n}\n\nexport const getNapiProductReviews = async (sku, sort = 'highlightedFirst', page = 0) => {\n return window.napi.ratings().read(sku, sort, page)\n}\n\nexport const postNapiLike = async (sku, reviewId) => {\n return window.napi.ratings().like(sku, reviewId)\n}\n","import { getRatingDetails, isRated } from '@kissui/helpers/src/rating.service'\n\nexport const renderRatings = ({ sku, minimum_rating = 0 }, component) => {\n getRatingDetails(sku)\n .then(ratings => {\n const ratingElementBlock = component.querySelector('.cb-ratings-block')\n if (!ratings || !isRated(ratings, minimum_rating)) {\n if (ratingElementBlock) {\n ratingElementBlock.innerHTML = ''\n }\n\n return ''\n }\n\n if (ratingElementBlock) {\n ratingElementBlock.innerHTML = `<nb-rating stars=\"${ratings.ratingAverage}\"></nb-rating>`\n }\n })\n .catch(err => {\n const ratingElementBlock = component.querySelector('.cb-ratings-block')\n if (ratingElementBlock) {\n ratingElementBlock.innerHTML = ''\n }\n console.error(err)\n })\n\n return ''\n}\n\nexport const renderRatingsWithData = props => {\n const {\n show_ratings,\n minimum_rating = 0,\n ratingAverage,\n reviewCount,\n review_cta,\n reviews_cta\n } = props\n\n if (!show_ratings || !isRated(props, minimum_rating)) {\n return ''\n }\n\n let link = ''\n if (reviewCount && review_cta && reviews_cta) {\n const ctaLabel = (reviewCount > 1 ? reviews_cta : review_cta).replace(\n '{nb_review}',\n reviewCount\n )\n if (ctaLabel) {\n link = `<nb-link class=\"is-review\" icon_right=\"chevron-right\" size=\"small\" color=\"gold\">\n ${ctaLabel}\n </nb-link>`\n }\n }\n\n const toInt = parseFloat(ratingAverage).toFixed(2)\n\n return `<nb-rating stars=\"${toInt}\"></nb-rating>\n ${link}`\n}\n","export default class Deferred {\n constructor() {\n this.promise = new Promise((resolve, reject) => {\n this.reject = reject\n this.resolve = resolve\n })\n }\n}\n","import Deferred from './deferred'\n\nconst resolveScrollPosition = (scrollTo: HTMLElement | string | number, scrollPaddingTop = 140) => {\n if (typeof scrollTo === \"number\") {\n return scrollTo\n }\n\n const scrollToElement = typeof scrollTo === \"object\" ? scrollTo : document.querySelector(scrollTo)\n\n if (scrollToElement === null && typeof scrollTo === \"string\") {\n throw new Error(`error: No element found with the selector \"${scrollTo}\"`)\n }\n\n return window.scrollY + scrollToElement!.getBoundingClientRect().top - scrollPaddingTop\n}\n\nconst resolveScrollDuration = (scrollDuration: number, deltaScroll: number) => {\n const viewportHeight = window.innerHeight\n const bodyHeight = document.body.clientHeight\n\n if (deltaScroll > viewportHeight && bodyHeight - viewportHeight > 0) {\n return Math.abs(\n scrollDuration +\n scrollDuration * (Math.abs(deltaScroll) / (bodyHeight - viewportHeight))\n )\n }\n return scrollDuration\n}\n/**\n * Smooth scroll-to inspired by:\n * http://stackoverflow.com/a/24559613/728480\n */\nconst scrollTo = (scrollTo: HTMLElement | string | number = 0, options: { scrollPaddingTop?: number, scrollDuration?: number } = {}) => {\n const { scrollDuration: baseScrollDuration = 300 } = options\n const deferred = new Deferred()\n\n let scrollPosition: number = 0;\n\n try {\n scrollPosition = resolveScrollPosition(scrollTo, options.scrollPaddingTop)\n }\n catch (error) {\n console.error(error)\n return\n }\n\n let currentTime = 0\n const initialTimestamp = window.performance.now()\n const initialScroll = window.scrollY\n const deltaScroll = initialScroll - scrollPosition\n\n const scrollDuration = resolveScrollDuration(baseScrollDuration, deltaScroll)\n\n const finalTimestamp = initialTimestamp + scrollDuration\n\n function step() {\n const currentTimestamp = window.performance.now()\n if (currentTimestamp < finalTimestamp) {\n currentTime = (currentTimestamp - initialTimestamp) / scrollDuration\n currentTime = --currentTime * currentTime * currentTime + 1\n const moveStep = deltaScroll * currentTime\n window.scrollTo(0, scrollPosition + (deltaScroll - moveStep))\n window.requestAnimationFrame(step)\n } else {\n window.scrollTo(0, scrollPosition)\n setTimeout(() => deferred.resolve(undefined), 125)\n }\n return deferred.promise\n }\n\n window.requestAnimationFrame(step)\n return deferred.promise\n}\n\nexport default scrollTo\n","import Sku from '@kissui/components/src/sku'\nimport { VARIATION_PDP, VARIATION_PLP } from '@kissui/components/src/sku/constants'\nimport { renderLabelTechnology } from '@kissui/components/src/sku/fragments/labelTechnology'\nimport { renderLabelRange } from '@kissui/components/src/sku/fragments/labelRange'\nimport { renderHeadline } from '@kissui/components/src/sku/fragments/headline'\nimport { renderHeading } from '@kissui/components/src/sku/fragments/heading'\nimport { renderImage } from '@kissui/components/src/sku/fragments/image'\nimport { renderColors } from '@kissui/helpers/src/colors.helpers'\nimport { renderRatings, renderRatingsWithData } from './fragments/ratings'\nimport { renderEnergyLabel } from '@kissui/helpers/src/energy-label.helpers'\nimport { renderVoltage } from './fragments/voltage'\nimport { isRatingEnabled } from '@kissui/helpers/src/rating.service'\nimport { EVENT_COLOR_CLICKED } from '@kissui/components/src/colors/components/color/constants.mjs'\nimport { readEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\nimport { getProduct, getPriceFormatter, getCurrency } from '@kissui/helpers/src/catalog'\nimport scrollTo from '@kissui/helpers/src/scrollTo'\nimport { apiOverride } from '@kissui/components/src/sku/services'\n\nclass SkuMachine extends Sku {\n constructor() {\n super()\n this.type = 'machine'\n this.reviewLink = null\n this.boundOnColorClick = this.onColorClick.bind(this)\n this.boundOnReviewLinkClick = this.onReviewLinkClick.bind(this)\n }\n\n renderHeader() {\n return `${this.renderHeaderDefault()}\n ${renderEnergyLabel(this.props)}`\n }\n\n renderInformation() {\n const { variation } = this.props\n\n if (variation === VARIATION_PDP) {\n return this.renderInformationPDP()\n }\n if (variation === VARIATION_PLP) {\n return this.renderInformationPLP()\n }\n\n return this.renderInformationDefault()\n }\n\n renderInformationDefault() {\n return `${renderColors(this.props)}\n ${renderLabelTechnology(this.props)}\n ${renderLabelRange(this.props)}\n ${renderHeading(this.props)}\n ${\n this.props.show_ratings && isRatingEnabled(this.props)\n ? `<div class=\"cb-ratings-block\"><nb-loader></nb-loader></div> ${renderRatings(\n this.props,\n this\n )}`\n : ''\n }\n ${renderHeadline(this.props)}`\n }\n\n renderInformationPLP() {\n return `${renderColors(this.props)}\n ${renderLabelTechnology(this.props)}\n ${renderLabelRange(this.props)}\n ${renderHeading(this.props)}\n ${\n this.props.show_ratings\n ? `<div class=\"cb-ratings-block\"><nb-loader></nb-loader></div> ${renderRatings(\n { ...this.props, sku: this.props.sku || this.props.legacyId },\n this\n )}`\n : ''\n }\n ${renderHeadline(this.props)}`\n }\n\n renderInformationPDP() {\n const { showVoltage = {} } = this.props\n return `${renderLabelTechnology(this.props)}\n ${renderLabelRange(this.props)}\n ${renderHeading(this.props)}\n ${renderHeadline(this.props)}\n ${renderRatingsWithData(this.props)}\n ${renderVoltage(showVoltage)}\n ${renderColors(this.props)}`\n }\n\n renderVisualDefault() {\n const { variation } = this.props\n if (variation === VARIATION_PDP) {\n return ''\n }\n\n return renderImage(this.props)\n }\n\n onReviewLinkClick(e) {\n e.preventDefault()\n if (document.querySelector('nb-rating-reviews')) {\n scrollTo(`nb-rating-reviews`)\n }\n }\n\n onColorClick(e) {\n const event = readEvent(e)\n if (!event.sku) {\n return\n }\n\n this.template = '<nb-loader></nb-loader>'\n this.render()\n\n return Promise.all([getPriceFormatter(), getProduct(event.sku)])\n .then(([formatter, payload]) => {\n if (!payload || !formatter) {\n return\n }\n\n const newLabels = this.props.colors?.find(c => c.sku === event.sku)?.labels\n\n this.props = {\n ...this.props,\n ...payload,\n colors: this.props.colors,\n sku: payload.legacyId || '',\n longSku: payload.id || '',\n image: payload.responsiveImages?.standard || payload.images?.icon || '',\n image_alt_text: payload.name || '',\n price: formatter.short(getCurrency(), payload.price),\n activeSku: payload.legacyId || '',\n activeLongSku: payload.id || '',\n url: payload.pdpURLs?.desktop || '',\n labels: newLabels,\n ...apiOverride(payload, this.props)\n }\n })\n .catch(() => {\n console.error(`getProduct fail on sku ${event.sku}`)\n })\n .finally(() => {\n this.loadTemplate()\n this.onReady?.()\n })\n }\n\n bindEvent() {\n this.addEventListener(EVENT_COLOR_CLICKED, this.boundOnColorClick)\n\n this.reviewLink = this.querySelector('.is-review')\n if (this.reviewLink) {\n this.reviewLink.addEventListener('click', this.boundOnReviewLinkClick)\n }\n }\n\n unbindEvent() {\n this.removeEventListener(EVENT_COLOR_CLICKED, this.boundOnColorClick)\n\n if (this.reviewLink) {\n this.reviewLink.removeEventListener('click', this.boundOnReviewLinkClick)\n }\n }\n\n disconnectedCallback() {\n this.unbindEvent()\n }\n}\n\ncustomElements.get('nb-sku-machine') || customElements.define('nb-sku-machine', SkuMachine)\n\nexport default SkuMachine\n","import { stringifyForAttribute } from '@kissui/helpers/src/utils'\n\nexport const renderEnergyLabel = props => {\n const { a11y_energy_label, energy_level } = props\n\n if (!energy_level) {\n return ''\n }\n\n const data = {\n a11y_label: a11y_energy_label,\n level: energy_level\n }\n\n return `<nb-energy-label data='${stringifyForAttribute(data)}'></nb-energy-label>`\n}\n","export const renderVoltage = props => {\n if (!props) {\n return ''\n }\n\n const { show_voltage, voltage_label, voltage_list, a11y_voltage_label } = props\n\n if (!show_voltage || !voltage_label || !voltage_list || !voltage_list.length) {\n return ''\n }\n\n const voltageItem = voltage_list\n .map(({ label, url }) => {\n if (url) {\n return `<a href=\"${url}\" target=\"_self\"><span class=\"t-sm-400\">${label}</span></a>`\n }\n\n return `<div aria-current=\"page\"><span class=\"t-sm-700\">${label}</span></div>`\n })\n .join('')\n\n return `<div class=\"cb-sku-tab\">\n <span class=\"sr-only\">${a11y_voltage_label}</span>\n <p class='t-sm-400' aria-hidden=\"true\">${voltage_label}</p>\n ${voltageItem}\n </div>`\n}\n","class EventBus {\n constructor() {\n this._bus = document.createElement('div')\n }\n\n register(event, callback) {\n this._bus.addEventListener(event, callback)\n }\n\n remove(event, callback) {\n this._bus.removeEventListener(event, callback)\n }\n\n fire(event, detail = {}) {\n this._bus.dispatchEvent(new CustomEvent(event, { detail }))\n }\n}\n\nif (!bus) {\n var bus = new EventBus()\n}\n\nexport default bus\n","import createProps from '@kissui/helpers/src/props.helpers'\nimport EventBus from '@kissui/helpers/src/assets/js/eventBus'\nimport { dispatchEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\nimport {\n handlePromoClick,\n productImpression,\n trackComponentInteraction\n} from '@kissui/helpers/src/gtmEvents'\nimport { EVENT_POPIN_OPEN, EVENT_QS_OPEN, TIME_SLOW } from '@kissui/components'\nimport { getLangCode, getMarketCode } from '@kissui/helpers/src/dataLayer'\n\nclass Cta extends HTMLElement {\n constructor() {\n super()\n this.props = {}\n this.market = getMarketCode()\n this.language = getLangCode()\n }\n\n static get observedAttributes() {\n return ['slot', 'quantity']\n }\n\n connectedCallback() {\n this.props = {\n ...createProps(this.attributes),\n disableTracking: this.hasAttribute('data-disabletracking')\n }\n\n this.boundHandleClick = this.handleClick.bind(this)\n this.slot = this.innerHTML.replace(/\\n*$/, '').trim()\n this.render()\n }\n\n render() {\n const {\n add_to_cart = '',\n aria_label,\n aria_label_after,\n aria_label_before,\n contrast,\n icon_left = '',\n icon_right = '',\n label_update,\n label,\n link_new_tab = false,\n long_sku = '',\n seo_label = '',\n size = '48',\n tracking_list = '',\n tracking_position = '',\n transparent = 'false',\n variation\n } = this.props\n let { link } = this.props\n\n const slot = this.slot ? this.slot : label\n\n const element = document.createElement(link ? 'a' : 'button')\n\n if (tracking_position && tracking_list && long_sku) {\n productImpression(tracking_position, tracking_list, long_sku)\n }\n\n if (link) {\n link = link.replace('{market}', this.market)\n link = link.replace('{lang}', this.language)\n\n element.setAttribute('href', link)\n }\n\n if (link && link_new_tab) {\n element.setAttribute('target', '_blank')\n }\n // Todo : can we get rid of this title attr ? at least when it's a button, not a link ?\n if (seo_label && link) {\n element.setAttribute('title', seo_label)\n }\n\n if (aria_label) {\n element.setAttribute('aria-label', aria_label)\n } else if (aria_label_before || aria_label_after) {\n const ariaLabel = [aria_label_before, slot, aria_label_after]\n .filter(value => !!value)\n .join(' ')\n ariaLabel && element.setAttribute('aria-label', ariaLabel)\n }\n\n if (variation !== 'navigation') {\n element.classList.add(`button--cta`)\n }\n element.classList.add(`button--${variation}`)\n if (contrast) {\n if (transparent === 'true') {\n element.classList.add(`button--${contrast}--transparent`)\n } else {\n element.classList.add(`button--${contrast}`)\n }\n }\n if (size) {\n let textClass = 't-md-400-sl'\n switch (size) {\n case '32':\n textClass = 't-xs-500-sl'\n break\n case '40':\n textClass = 't-sm-400-sl'\n break\n }\n element.classList.add(`size--${size}`, textClass)\n }\n\n if ((variation === 'primary' || variation === 'tertiary') && add_to_cart !== '') {\n this.setAttribute('add_to_cart', add_to_cart)\n this.setAttribute('quantity', '0')\n add_to_cart === 'small'\n ? element.classList.add('addToCart--small')\n : element.classList.add('addToCart--large')\n }\n\n icon_left && this.setAttribute('icon_left', icon_left)\n icon_right && this.setAttribute('icon_right', icon_right)\n\n element.innerHTML = `\n ${icon_left && `<nb-icon icon='${icon_left}'></nb-icon>`}\n <span>${slot}</span>\n ${\n variation === 'primary' && add_to_cart !== '' && label_update !== ''\n ? `<span class=\"update\">${label_update}</span>`\n : ''\n }\n ${icon_right && `<nb-icon icon='${icon_right}'></nb-icon>`}\n `\n this.innerHTML = element.outerHTML\n\n this.removeListeners()\n this.addListeners()\n }\n\n handleClick() {\n if (this.props.disableTracking === false) {\n this.track()\n }\n\n const { event_id = '', popin_id = '', qs_id = '' } = this.props\n\n if (event_id) {\n EventBus.fire(event_id, {})\n }\n if (popin_id) {\n this.popin(popin_id)\n }\n if (qs_id) {\n this.openQuantitySelector(qs_id)\n }\n }\n\n popin(popin_id) {\n dispatchEvent({ eventName: EVENT_POPIN_OPEN, args: { id: popin_id } })\n }\n\n openQuantitySelector(qs_id) {\n dispatchEvent({ eventName: EVENT_QS_OPEN, args: { id: qs_id } })\n }\n\n track() {\n const {\n campaign_id = '',\n campaign_name = '',\n campaign_position = '',\n campaign_creative = '',\n campaign_instance_index = '',\n tracking_list,\n label,\n popin_id = '',\n tracking_slot_prefix = '',\n sku_data = ''\n } = this.props\n\n const campaign = {\n id: campaign_id,\n name: campaign_name,\n position: campaign_position,\n creative: campaign_creative\n }\n\n const ctaOrPopin = popin_id ? 'POPIN' : 'CTA'\n const slot = this.slot ? this.slot : label\n const slotContent = `${tracking_slot_prefix}${slot}`\n const instanceIndex = campaign_instance_index ? ` - ${campaign_instance_index}` : ''\n const tabbedComponentStatus = JSON.parse(this.props?.tabbed_component ?? 'false')\n\n let cta_name_value = tabbedComponentStatus\n ? `${ctaOrPopin + instanceIndex} - ${\n this.props.long_sku.split('/')[2]\n } - ${slotContent}`\n : `${ctaOrPopin + instanceIndex} - ${slotContent}`\n\n handlePromoClick({\n campaign,\n cta_name: cta_name_value\n })\n\n if (popin_id && sku_data) {\n const product = JSON.parse(sku_data)\n const componentName =\n tracking_list.indexOf(' - ') > -1 ? tracking_list.split(' - ')[0] : tracking_list\n trackComponentInteraction({\n creative: this.props.campaign_creative ?? '',\n actionType: componentName.toLowerCase() + ' quick view',\n internationalId: product.internationalId,\n internationalName: product.internationalName,\n productType: product.type,\n technology: product.technology,\n category: product.category,\n rawPrice: product.rawPrice,\n eventAction: componentName + ' Quick View'\n })\n }\n }\n\n attributeChangedCallback(name) {\n if (name === 'slot') {\n this.render()\n }\n if (name === 'quantity') {\n this.classList.add('updated')\n setTimeout(() => {\n this.classList.remove('updated')\n }, TIME_SLOW)\n }\n }\n\n addListeners() {\n this.addEventListener('click', this.boundHandleClick)\n }\n\n removeListeners() {\n this.removeEventListener('click', this.boundHandleClick)\n }\n\n disconnectedCallback() {\n this.removeListeners()\n }\n}\n\ncustomElements.get('nb-cta') || customElements.define('nb-cta', Cta)\n\nexport default Cta\n","/**\n * We removed duplicated values to improve the performances\n * Here are original values :\n * small: 16, 24, 32, 36, 48, 64, 72, 96, 108, 120, 128, 144, 150, 180, 192, 216, 225, 240, 288, 300, 360, 384, 450, 480, 600\n * medium: 180, 240, 270, 360, 450, 480, 512, 540, 600, 675, 720, 768, 800, 900, 960, 1000, 1024, 1080, 1200, 1350, 1440, 1500, 1536, 1600, 1800, 2000, 2048, 2400, 3000, 3200, 4000\n * large: 640, 720, 800, 960, 1024, 1080, 1200, 1280, 1440, 1536, 1600, 1920, 2048, 2160, 2400, 2560, 2880, 3072, 3200, 3840, 4096\n * product: 45, 50, 58, 60, 65, 90, 100, 120, 130, 135, 150, 174, 180, 195, 200, 230, 232, 240, 260, 300, 360, 400, 450, 460, 480, 600, 690, 720, 800, 900, 960, 1200\n *\n * Useful documentation:\n * IT documentation on IM Policy (Image Manager Policy) profiles and resolutions: https://dsu-confluence.nestle.biz/x/XAYoC\n * Our IM Policy documentation: https://dsu-confluence.nestle.biz/x/zQjrCg\n * Our IM Policy study on page builder sections: https://dsu-confluence.nestle.biz/x/1tb3Cg\n */\n\nexport const LAZYLOAD_CUSTOM = 'custom'\nexport const LAZYLOAD_NATIVE = 'native'\n\nexport const PROFILES = [\n {\n name: 'small',\n sizes: [\n 16, 24, 32, 36, 48, 64, 72, 96, 108, 120, 128, 144, 150, 180, 192, 216, 225, 240, 288,\n 300, 360, 384, 450, 480, 600\n ]\n },\n {\n name: 'medium',\n sizes: [\n 270, 512, 540, 675, 720, 768, 800, 900, 960, 1000, 1024, 1080, 1200, 1350, 1440, 1500,\n 1536, 1600, 1800, 2000, 2048, 2400, 3000, 3200, 4000\n ]\n },\n {\n name: 'large',\n sizes: [640, 1280, 1920, 2160, 2560, 2880, 3072, 3840, 4096]\n },\n {\n name: 'product',\n sizes: [\n 45, 50, 58, 60, 65, 90, 100, 130, 135, 174, 195, 200, 230, 232, 260, 300, 400, 460, 690\n ]\n }\n]\n","import createProps from '@kissui/helpers/src/props.helpers'\nimport { lazyLoad } from '@kissui/helpers/src/utils'\nimport { PROFILES, LAZYLOAD_CUSTOM, LAZYLOAD_NATIVE } from './js/constants'\n\n/** IMAGE COMPONENT\n * Important prerequisite!\n * For the ImPolicy and CLS we need to assume that the width of the component is set by the parent component\n *\n * IM Policy annoying behaviour:\n * Also IM Policy is returning in some cases more than 2x images (based in device pixel density auto detection e.g. Iphone 11 pro returns x3)\n * We don't want this behaviour so we need to force x1 by adding an extra param &imdensity=1\n *\n * @Params\n * - file: path of your image\n * - description: img alt description. If empty, set alt='image' to avoid A11y errors + aria-hidden=\"true\" because we assume it's a decorative image\n * (we don't use alt='' because if void it does not allow the error message to be displayed, not creating :before and :after pseudo element on img)\n * - aspect_ratio: (default 1:1) is managing the CLS including a blinking animation\n * - force_width: use this if for any reason you need to force the image width to ask to akamai (e.g. image cropped on both sides like in card-lifestyle tablet)\n * - force_height: use this if in the layout you cannot rely on width but in height\n * - lazyload: (default custom / native / no) is managing fadein animation + error message\n * - impolicy: (default true) is checking automatically the right profile and 'real' end resolution\n * - placeholder_color_light: (default black_100) is the lighter color for CLS animation\n * - placeholder_color_dark: (default black_250) is the darker color for CLS animation\n * - object-fit: (default: cover) use 'contain' instead (applys object-fit: contain on img) if you want to image to be displayed always fully\n * like in sku component, where the product image have different original aspect_ratio, we want to display always the full product\n */\n\nclass Img extends HTMLElement {\n constructor() {\n super()\n }\n\n connectedCallback() {\n this.props = createProps(this.attributes)\n this.render()\n this.#initLazyLoad()\n }\n\n #initLazyLoad() {\n if (this.lazyload !== LAZYLOAD_CUSTOM) {\n return\n }\n const callbackSuccess = () => {\n this.classList.remove('loading')\n }\n\n lazyLoad(this.firstElementChild, 'src', `${this.file}`, this.file, { callbackSuccess })\n }\n\n render() {\n const {\n file = '',\n description = '',\n lazyload = LAZYLOAD_CUSTOM,\n fetchpriority = ''\n } = this.props\n\n if (file === '') {\n return\n }\n\n // Set properties used elsewhere in component\n this.lazyload = lazyload\n this.file = file + this.#setImPolicyQuery()\n\n this.#setCssProperties()\n this.classList.add('nb-img')\n this.innerHTML = `\n <img\n ${this.lazyload === LAZYLOAD_CUSTOM ? 'src=\"\"' : `src=\"${this.file}\"`}\n ${description !== '' ? `alt=\"${description}\"` : 'alt=\"image\" aria-hidden=\"true\"'}\n ${this.lazyload === LAZYLOAD_NATIVE ? 'loading=\"lazy\"' : ''}\n ${fetchpriority !== '' ? `fetchpriority=${fetchpriority}` : ''}\n class=\"loading\"\n />`\n // Get this element's first class\n this.parentClass = this.getAttribute('class').split(' ')[0]\n\n // Add that previous class + a suffix to its first child\n if (this.parentClass !== '') {\n this.firstElementChild.classList.add(this.parentClass + '-content')\n }\n }\n\n #setImPolicyQuery() {\n const { aspect_ratio, force_width, force_height, impolicy = true } = this.props\n\n if (impolicy === 'false') {\n return ''\n }\n\n let width = this.offsetWidth\n\n if (force_width && force_width !== '') {\n width = Number(force_width)\n }\n\n if (force_height && force_height !== '') {\n const [w, h] = aspect_ratio.split('/')\n width = Math.round((Number(force_height) * w) / h)\n }\n\n let finalWidth = this.#getRetinaWidth(width)\n\n const impolicy_profil = this.#getImpolicyProfile(finalWidth)\n\n return `?impolicy=${impolicy_profil}&imwidth=${finalWidth}&imdensity=1`\n }\n\n #getRetinaWidth(width) {\n const { devicePixelRatio } = window\n return devicePixelRatio > 1 ? width * 2 : width\n }\n\n #getImpolicyProfile(width) {\n const { exactFound, closests } = this.#getClosests(width)\n\n if (exactFound) {\n return exactFound.name\n } else {\n let tempDiff = closests[0].diff\n let closest = null\n closests.forEach(item => {\n if (item.diff <= tempDiff) {\n tempDiff = item.diff\n closest = item\n }\n })\n return closest.name\n }\n }\n\n #getClosests(width) {\n let exactFound = null\n let closests = []\n PROFILES.every(profile => {\n const found = profile.sizes.find(el => el >= width)\n\n if (found) {\n if (found === width) {\n exactFound = profile\n return false\n }\n\n closests.push({ name: profile.name, diff: found - width })\n }\n\n return true\n })\n return { exactFound, closests }\n }\n\n #setCssProperties() {\n const {\n aspect_ratio,\n object_fit,\n placeholder_color_light,\n placeholder_color_dark,\n error_message\n } = this.props\n\n this.#setCssProperty('--image-aspect-ratio', aspect_ratio)\n this.#setCssProperty('--image-object-fit', object_fit)\n this.#setCssProperty('--image-placeholder-color-light', placeholder_color_light)\n this.#setCssProperty('--image-placeholder-color-dark', placeholder_color_dark)\n this.#setCssProperty('--image-placeholder-error-text', '\"' + error_message + '\"')\n }\n\n #setCssProperty(name, value) {\n if (!value || value === '\"undefined\"') {\n return\n }\n\n this.style.setProperty(name, value)\n }\n}\n\ncustomElements.get('nb-img') || customElements.define('nb-img', Img)\n\nexport default Img\n","import createProps from '@kissui/helpers/src/props.helpers'\nimport {\n handlePromoClick,\n productClick,\n trackComponentInteraction\n} from '@kissui/helpers/src/gtmEvents'\nimport { dispatchEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\nimport { EVENT_POPIN_OPEN, EVENT_QUICKVIEW_OPEN } from '../constants.mjs'\nimport { getLangCode, getMarketCode } from '@kissui/helpers/src/dataLayer'\n\nclass Link extends HTMLElement {\n constructor() {\n super()\n this.slot = this.innerHTML\n this.boundHandleClick = this.handleClick.bind(this)\n this.market = getMarketCode()\n this.language = getLangCode()\n }\n\n connectedCallback() {\n this.props = {\n ...createProps(this.attributes),\n disableTracking: this.hasAttribute('data-disabletracking')\n }\n this.render()\n this.setClassHelper()\n this.bindEvents()\n }\n\n render() {\n const {\n size = 'large',\n color = 'gold',\n link = '',\n icon_right = '',\n icon_left = '',\n image = '',\n image_alt = ''\n } = this.props\n\n // Todo : can we get rid of this setAttributes, it's only needed because stories are using data\n size && this.setAttribute('size', size)\n color && this.setAttribute('color', color)\n image && this.setAttribute('image', image)\n image_alt && this.setAttribute('image_alt', image_alt)\n icon_left && this.setAttribute('icon_left', icon_left)\n icon_right && this.setAttribute('icon_right', icon_right)\n\n if (link === '') {\n this.renderButton()\n } else {\n this.renderLink()\n }\n\n this.link = this.firstElementChild\n }\n\n renderLink() {\n const {\n label,\n seo_label = '',\n tracking_label = '',\n link_new_tab = 'false',\n a11y_label_new_tab = '',\n icon_right = '',\n image = '',\n image_alt = '',\n icon_left = '',\n selected = '',\n phantom = ''\n } = this.props\n let { link } = this.props\n\n const slot = this.slot ? this.slot : label\n\n if (link) {\n link = link.replace('{market}', this.market)\n link = link.replace('{lang}', this.language)\n }\n\n this.innerHTML = `\n <a\n href=\"${link}\"\n ${link_new_tab === 'true' ? 'target=\"_blank\"' : ''}\n ${\n link_new_tab === 'true' && a11y_label_new_tab !== ''\n ? `aria-description='${a11y_label_new_tab}'`\n : ''\n }\n ${tracking_label && `tracking_label='${tracking_label}'`}\n ${seo_label ? `title=\"${seo_label}\"` : ''}\n ${slot ? `aria-label=\"${slot}\"` : ''}\n ${selected === 'true' ? 'aria-current=\"true\"' : ''}\n ${phantom === 'true' ? `phantom=\"${slot}\"` : ''}\n >\n ${icon_left && `<nb-icon icon='${icon_left}'></nb-icon>`}\n ${image && `<img src='${image}' alt='${image_alt}'/>`}\n <span>${slot}</span>\n ${icon_right && `<nb-icon icon='${icon_right}'></nb-icon>`}\n </a>`\n }\n\n renderButton() {\n const {\n label,\n tracking_label = '',\n icon_right = '',\n icon_left = '',\n selected = '',\n image = '',\n image_alt = '',\n phantom = ''\n } = this.props\n\n const slot = this.slot ? this.slot : label\n\n this.innerHTML = `\n <button\n ${tracking_label && `tracking_label='${tracking_label}'`}\n ${selected === 'true' ? 'aria-selected=\"true\"' : ''}\n ${phantom === 'true' ? `phantom=\"${slot}\"` : ''}\n >\n ${image && `<img src='${image}' alt='${image_alt}'/>`}\n ${icon_left && `<nb-icon icon='${icon_left}'></nb-icon>`}\n <span>${slot}</span>\n ${icon_right && `<nb-icon icon='${icon_right}'></nb-icon>`}\n </button>`\n }\n\n setClassHelper() {\n const { size = 'large', cta_link_type = 'false' } = this.props\n let sizeClass = ''\n\n switch (size) {\n case 'xsmall':\n sizeClass = 't-2xs-500-sl'\n break\n case 'small':\n sizeClass = 't-xs-500-sl'\n break\n case 'medium':\n sizeClass = 't-sm-400-sl'\n break\n case 'large':\n sizeClass = 't-sm-700-sl'\n break\n default:\n sizeClass = 't-sm-700-sl'\n break\n }\n\n if (cta_link_type === 'true') {\n sizeClass = 't-sm-700-sl'\n this.setAttribute('underline', 'false')\n }\n\n this.querySelector('a, button').classList.add(sizeClass)\n }\n\n handleClick() {\n if (this.props.disableTracking === false) {\n this.track()\n }\n\n const {\n popin_id = '',\n sku = '',\n tracking_position = '',\n tracking_list = '',\n sku_colors\n } = this.props\n\n if (popin_id && sku) {\n this.quickView(popin_id, sku, tracking_position, tracking_list, sku_colors)\n return\n }\n\n if (popin_id) {\n this.popin(popin_id)\n }\n }\n\n popin(popin_id) {\n dispatchEvent({ eventName: EVENT_POPIN_OPEN, args: { id: popin_id } })\n }\n\n quickView(popin_id, sku, tracking_position, tracking_list, colors) {\n const { sku_data } = this.props\n\n dispatchEvent({\n eventName: EVENT_QUICKVIEW_OPEN,\n args: {\n sku_colors: colors,\n id: popin_id,\n sku: sku,\n tracking_position: tracking_position,\n tracking_list: tracking_list\n }\n })\n\n if (sku_data) {\n const product = JSON.parse(sku_data)\n const componentName =\n tracking_list.indexOf(' - ') > -1 ? tracking_list.split(' - ')[0] : tracking_list\n trackComponentInteraction({\n creative: this.props.campaign_creative ?? '',\n actionType: componentName.toLowerCase() + ' quick view',\n internationalId: product.internationalId,\n internationalName: product.internationalName,\n productType: product.type,\n technology: product.technology,\n category: product.category,\n rawPrice: product.rawPrice,\n eventAction: componentName + ' Quick View'\n })\n }\n }\n\n track() {\n const {\n campaign_id = '',\n campaign_name = '',\n campaign_position = '',\n campaign_creative = '',\n campaign_instance_index = '',\n label,\n popin_id = '',\n long_sku = '',\n tracking_list = '',\n tracking_position = ''\n } = this.props\n\n const campaign = {\n id: campaign_id,\n name: campaign_name,\n position: campaign_position,\n creative: campaign_creative\n }\n\n const linkOrPopin = popin_id ? 'POPIN' : 'LINK'\n const slot = this.slot ? this.slot : label\n // value 0 is accepted as we need to pass the index\n const instanceIndex =\n campaign_instance_index || campaign_instance_index === 0\n ? ` - ${campaign_instance_index}`\n : ''\n\n if (tracking_list && tracking_position) {\n productClick(tracking_position, tracking_list, long_sku)\n } else {\n handlePromoClick({\n campaign,\n cta_name: `${linkOrPopin + instanceIndex} - ${slot.trim()}`\n })\n }\n }\n\n bindEvents() {\n this.unbindEvents()\n this.link.addEventListener('click', this.boundHandleClick)\n }\n\n unbindEvents() {\n this.link.removeEventListener('click', this.boundHandleClick)\n }\n\n disconnectedCallback() {\n this.unbindEvents()\n }\n}\n\ncustomElements.get('nb-link') || customElements.define('nb-link', Link)\n\nexport default Link\n","import { viewPromotion } from '@kissui/helpers/src/gtmEvents'\n\nexport default class {\n constructor(node, data) {\n this.observer = new IntersectionObserver(\n IntersectionObserverEntry => this.onChange(IntersectionObserverEntry),\n { threshold: [0], rootMargin: '0% 0%' }\n )\n\n this.el = node\n this.data = data\n\n if (!(this.el instanceof Element)) {\n return\n }\n\n this.observer.observe(this.el)\n }\n\n /**\n * Check if element are in the viewport\n * @param {Array} observables\n * @param {HTMLElement} observables.target\n * @param {Boolean} observables.isIntersecting\n */\n onChange(observables) {\n observables.forEach(observable => {\n if (!observable.isIntersecting) {\n return\n }\n\n this.track(observable)\n this.observer.unobserve(observable.target)\n })\n }\n\n track() {\n // This line is needed to make the code compatible with Safari <=13\n if ('requestIdleCallback' in window) {\n window.requestIdleCallback(() => this.runTrack())\n } else {\n window.setTimeout(() => this.runTrack(), 1)\n }\n }\n\n runTrack() {\n if (!this.data['id'] || this.data['id'] === null || this.data['id'] === '') {\n return\n }\n viewPromotion({ ...this.data })\n }\n}\n","import Viewport from './viewportTracking'\nimport { viewPromotion } from '@kissui/helpers/src/gtmEvents'\nimport { isObjectEmpty, removeEmptyValues } from '@kissui/helpers/src/utils'\n\nexport default function (node, campaign) {\n const tracking = new ZoneTracking(node, campaign)\n\n return {\n destroy: () => {\n if (!tracking.getIom().hasIntersectionObserver()) {\n tracking.destroy()\n }\n }\n }\n}\n\nclass ZoneTracking extends Viewport {\n constructor(node, data) {\n super(node)\n this.data = data\n }\n\n runTrack() {\n const cleanedData = removeEmptyValues(this.data)\n if (cleanedData && !isObjectEmpty(cleanedData)) {\n viewPromotion({ ...cleanedData })\n }\n }\n}\n","import zoneTracking from '@kissui/helpers/src/assets/js/zoneTracking'\nimport { lazyLoad } from '@kissui/helpers/src/utils'\nimport viewportHelper from '@kissui/helpers/src/viewport.helpers'\n\nclass Container extends HTMLElement {\n constructor() {\n super()\n this.slot = this.innerHTML\n }\n\n connectedCallback() {\n this.props = [...this.attributes].reduce((all, attr) => {\n return { ...all, [attr.nodeName]: attr.nodeValue }\n }, {})\n this.render()\n this.initTracking()\n this.initLazyLoad()\n }\n\n initTracking() {\n const {\n campaign_id = null,\n campaign_name = null,\n campaign_position = null,\n campaign_creative = null\n } = this.props\n zoneTracking(this, {\n id: campaign_id,\n name: campaign_name,\n position: campaign_position,\n creative: campaign_creative\n })\n }\n\n initLazyLoad() {\n const el = this.querySelector('.cb-bg-img')\n if (!el) {\n return\n }\n\n const url = this.getBgImgUrl()\n if (!url) {\n return\n }\n\n const { lazy_load } = this.props\n if (lazy_load === 'false') {\n el.setAttribute('style', `background-image: url(${url})`)\n return\n }\n\n lazyLoad(\n el,\n 'style',\n `background-image: url(${url}); ${el.getAttribute('style') || ''}`,\n url\n )\n }\n\n getBgImgUrl() {\n const {\n background_mobile = '',\n background_tablet = '',\n background_desktop = '',\n background_retina = ''\n } = this.props\n\n let url = ''\n if (viewportHelper.is.mobile && background_mobile) {\n url = background_mobile\n } else if (viewportHelper.is.tablet && background_tablet) {\n url = background_tablet\n } else if ((viewportHelper.is.retina || viewportHelper.is.tablet) && background_retina) {\n url = background_retina\n } else if (\n (viewportHelper.is.desktop || viewportHelper.is.retina || viewportHelper.is.tablet) &&\n background_desktop\n ) {\n url = background_desktop\n }\n\n return url\n }\n\n render() {\n const {\n styles = '',\n contrast,\n background_color = '',\n classname = '',\n element_class = '',\n slot\n } = this.props\n\n // Fix for undefined contrast (contrast is needed for background-color to work)\n let contrastDefault = 'light'\n if (contrast === 'undefined') {\n this.setAttribute('contrast', contrastDefault)\n } else {\n contrastDefault = contrast\n }\n\n this.innerHTML = `\n <section\n class=\"${classname}\"\n contrast=\"${contrastDefault}\"\n style=\"${styles}\"\n >\n ${background_color || this.hasBgImage() ? this.renderBg() : ''}\n <div class=\"cb-inner ${element_class}\">\n ${slot}\n </div>\n </section>`\n }\n\n hasBgImage() {\n const { background_mobile: m, background_desktop: d, background_retina: r } = this.props\n return !!m || !!d || !!r\n }\n\n renderBg() {\n const { background_color = '' } = this.props\n\n return `<div class=\"cb-bg-color ${background_color ? background_color : ''}\">\n </div>${this.hasBgImage() ? '<div class=\"cb-bg-img\"></div>' : ''}`\n }\n}\n\ncustomElements.get('nb-container') || customElements.define('nb-container', Container)\n\nexport default Container\n","import createProps from '@kissui/helpers/src/props.helpers'\nimport { makeHash } from '@kissui/helpers/src/utils'\nimport { selectPromotion } from '@kissui/helpers/src/gtmEvents'\n\nclass Chip extends HTMLElement {\n constructor() {\n super()\n this.slot = this.innerHTML\n this.checkbox = null\n }\n\n static get observedAttributes() {\n return ['disabled', 'checked']\n }\n\n connectedCallback() {\n this.props = createProps(this.attributes)\n this.computedSlot = this.computeSlot()\n this.render()\n this.initTracking()\n }\n\n initTracking() {\n const { campaign_id, campaign_name, campaign_creative, campaign_position } = this.props\n\n const link = this.querySelector('label')\n\n if (link) {\n link.onclick = () => {\n selectPromotion({\n cta_name: this.computedSlot,\n id: campaign_id,\n name: campaign_name,\n creative: campaign_creative,\n position: campaign_position\n })\n }\n }\n }\n\n computeSlot() {\n const { content } = this.props\n return (this.slot ? this.slot : content).trim()\n }\n\n render() {\n const {\n icon = '',\n color = '',\n background_image = '',\n filter_label_AA = 'filter',\n rounded = 'true',\n checked = 'false',\n disabled = 'false',\n id,\n type = 'checkbox'\n } = this.props\n\n const slot = this.computedSlot\n let style = ''\n\n const checkedAttr = checked === 'true' ? 'checked' : ''\n const disabledAttr = disabled === 'true' ? 'disabled' : ''\n const inputId = 'chip-checkbox-' + (id || makeHash(slot))\n\n this.innerHTML = `\n <input type='${type}' name='options' id='${inputId}' aria-label='${slot} ${filter_label_AA}' ${checkedAttr} ${disabledAttr}>\n <label style='${style}' for='${inputId}'>\n ${\n icon &&\n `<nb-icon icon='${icon}'></nb-icon>\n `\n }\n ${\n color &&\n `<div class='chip-color' style='background:${color}'></div>\n `\n }\n ${\n background_image &&\n `<div class='chip-image ${\n rounded === 'true' ? 'rounded' : ''\n }' style='background-image:url(\"${background_image}\")'></div>\n `\n }\n <span class=\"t-2xs-700-sl\" aria-hidden=\"true\" phantom=\"${slot}\">${slot}</span>\n </label>\n `\n\n this.checkbox = this.getElementsByTagName('input')[0]\n }\n\n attributeChangedCallback(name, _, newValue) {\n if (!this.checkbox) {\n return\n }\n\n if (name === 'disabled') {\n this.checkbox.disabled = newValue === 'true'\n } else if (name === 'checked') {\n this.checkbox.checked = newValue === 'true'\n }\n }\n}\n\ncustomElements.get('nb-chip') || customElements.define('nb-chip', Chip)\n\nexport default Chip\n","export function recursiveSwitchAriaHidden(elem, componentOpenState) {\n const parent = elem.parentNode\n const body = document.getElementsByTagName('body')[0]\n\n if (parent === body) {\n return\n }\n\n const brothers = parent.children\n for (const brother of brothers) {\n if (brother !== elem) {\n componentOpenState\n ? brother.setAttribute('aria-hidden', componentOpenState)\n : brother.removeAttribute('aria-hidden')\n }\n }\n recursiveSwitchAriaHidden(parent, componentOpenState)\n}\n\nexport function focusin(e, el, loop) {\n if (!el.contains(e.target)) {\n if (el.lastFocused === el.firstFocusable) {\n loop ? el.lastFocusable.focus() : el.firstFocusable.focus()\n } else {\n loop ? el.firstFocusable.focus() : el.lastFocusable.focus()\n }\n } else {\n el.lastFocused = e.target\n }\n}\n\nexport function setFirstAndLastFocusable(el) {\n const focusable = el.querySelectorAll('button, [href], input, select, textarea, [tabindex=\"0\"]')\n el.firstFocusable = focusable[0]\n el.lastFocusable = focusable[focusable.length - 1]\n el.lastFocused = el.firstFocusable\n}\n","import createProps from '@kissui/helpers/src/props.helpers'\nimport { dispatchEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\nimport viewportHelper from '@kissui/helpers/src/viewport.helpers'\nimport {\n recursiveSwitchAriaHidden,\n setFirstAndLastFocusable,\n focusin\n} from '@kissui/helpers/src/assets/js/scopedKeyboardNav'\nimport { EVENT_SORT_BY_CHANGE, EVENT_POPIN_KEY_DOWN } from '@kissui/components'\n\nclass Dropdown extends HTMLElement {\n constructor() {\n super()\n this.isOpen = false\n this.selected = null\n this.buttonElement = null\n this.onClickOutside = this.onClickOutside.bind(this)\n }\n\n connectedCallback() {\n this.props = createProps(this.attributes)\n this.classList.add('nb-dropdown')\n this.render()\n }\n\n render() {\n this.buttonElement = null\n const { label = '', aa_description } = this.props\n let { options = [], element_id, element_name } = this.props\n\n // Accept Selected and Checked as option setter\n options = options.map(option => {\n const payload = { ...option }\n payload.checked = payload.checked || payload.selected\n\n return payload\n })\n\n this.unbindEvent()\n\n this.innerHTML = `\n <button\n class='nb-dropdown__button'\n aria-haspopup=\"listbox\"\n aria-expanded=\"${this.isOpen}\"\n aria-label=\"${label} ${options && this.renderSelected()}\"\n ${aa_description !== '' ? `aria-description=\"${aa_description}\"` : ''}>\n <span class=\"nb-dropdown__button__label t-sm-700-sl\">${label}</span>\n <span class=\"nb-dropdown__button__value t-xs-500-sl\"\n ${element_id ? `name=\"${element_id}\"` : ''}\n value=\"${options && this.renderSelected()}\">\n </span>\n </button>\n <div class=\"nb-dropdown__menu\" ${element_name ? `id=\"${element_name}\"` : ''}>\n <div role=\"listbox\">\n <ul>\n ${options && options.length > 0 && this.renderOptions()}\n </ul>\n </div>\n </div>\n `\n this.buttonElement = this.querySelector('.nb-dropdown__button')\n this.buttonElementValue = this.querySelector('.nb-dropdown__button__value')\n this.dropdownMenu = this.querySelector('.nb-dropdown__menu > div')\n this.selectedOption = this.querySelector('button[aria-selected=true]')\n if (!this.selected) {\n this.selected = options[0]\n }\n setFirstAndLastFocusable(this.dropdownMenu)\n this.bindEvent()\n }\n\n // Render <BUTTON> tags for the custom select, <BUTTON> is better than <RADIOBUTTONS> for keyboard navigation users in this case\n renderOptions() {\n const {\n label,\n aa_listbox_description,\n aa_select_description,\n icon_option,\n options = []\n } = this.props\n return options\n .map(option => {\n return `<li>\n <button\n data-id=\"${option.id}\"\n data-selectedlabel=\"${option.label}\"\n class=\"${viewportHelper.is.mobile ? 't-sm-400-sl' : 't-xs-500-sl'}\"\n role=\"option\"\n aria-label='${label + ' ' + option.label}'\n value='${option.id ?? option.label}'\n aria-selected='${option.checked}'\n ${option.link ? `data-link='${option.link}'` : ''}\n ${\n option.checked\n ? aa_listbox_description !== undefined &&\n `aria-description=\"${aa_listbox_description}\"`\n : aa_select_description !== undefined &&\n `aria-description=\"${aa_select_description}\"`\n }>\n ${icon_option && `<nb-icon icon='${icon_option}'></nb-icon>`} ${option.label}\n </button>\n </li>`\n })\n .join('')\n }\n\n // Render the selected option to display in the main button of the PLP Filter Bar\n renderSelected() {\n const { options = [] } = this.props\n const currentOption = options.find(\n option => option.checked === true || option.selected === true\n )\n return `${currentOption?.label || options[0]?.label}`\n }\n\n bindEvent() {\n this.boundHandleClick = this.handleClick.bind(this)\n this.boundHandleLabelClick = this.handleLabelClick.bind(this)\n this.boundHandleMobileClose = this.handleMobileClose.bind(this)\n this.boundFocus = this.focus.bind(this)\n this.boundFocusin = this.focusin.bind(this)\n this.boundKeyNav = this.keyNav.bind(this)\n\n this.buttonElement.addEventListener('click', this.boundHandleClick)\n this.querySelectorAll('.nb-dropdown__menu button').forEach(item => {\n item.addEventListener('click', this.boundHandleLabelClick)\n })\n this.dropdownMenu.addEventListener('click', this.boundHandleMobileClose)\n window.addEventListener('click', this.onClickOutside)\n }\n\n unbindEvent() {\n if (!this.buttonElement) {\n return\n }\n this.buttonElement.removeEventListener('click', this.boundHandleClick)\n this.querySelectorAll('.nb-dropdown__menu button').forEach(item => {\n item.removeEventListener('click', this.boundHandleLabelClick)\n })\n this.dropdownMenu.removeEventListener('click', this.boundHandleMobileClose)\n window.removeEventListener('click', this.onClickOutside)\n document.removeEventListener(EVENT_POPIN_KEY_DOWN, this.boundKeyNav)\n }\n\n handleClick() {\n this.toogleDropdown(!this.isOpen)\n }\n\n handleMobileClose() {\n this.toogleDropdown(false)\n }\n\n onClickOutside(e) {\n if (this.isOpen && !this.contains(e.target)) {\n this.toogleDropdown(false)\n }\n }\n\n handleLabelClick(e) {\n this.isOpen = false\n\n // Unpress active button\n if (this.selectedOption) {\n this.selectedOption.setAttribute('aria-selected', 'false')\n }\n\n /*\n * TODO CHECK WITH THOMAS\n const activeButton = this.querySelector('button[aria-pressed=true]')\n const activeLink = activeButton.getAttribute('data-link')\n if (activeLink) {\n window.location.href = activeLink\n return null\n }\n activeButton.setAttribute('aria-pressed', 'false')\n * */\n\n // Activate pressed option\n this.selectedOption = e.target\n this.selectedOption.setAttribute('aria-selected', 'true')\n\n // Reset all checked attributes to false / Destroy the object and build it again\n this.props.options = this.props.options.map(option => ({ ...option, checked: false }))\n\n // Get the id from the clicked button's data-id attribute\n const selectedOptionId = this.selectedOption.dataset.id\n\n // Find the option using the selected button's data-id\n this.selected = this.props.options.find(option => option.id === selectedOptionId)\n\n if (!this.selected) {\n // Handle the error as needed maybe set the first item as checked.\n this.selected = this.props.options[0]\n }\n\n this.selected.checked = true\n e.target.closest('.nb-dropdown').classList.add('nb-dropdown--is-filled')\n\n this.reRender()\n\n this.toogleDropdown(false)\n\n dispatchEvent({\n eventName: EVENT_SORT_BY_CHANGE,\n args: { options: this.props.options, selected: this.selected },\n element: this\n })\n }\n\n reRender() {\n const { label, aa_listbox_description, aa_select_description } = this.props\n this.buttonElementValue.setAttribute('value', this.selectedOption.dataset.selectedlabel)\n this.buttonElement.setAttribute('aria-label', label + ' ' + this.renderSelected())\n this.dropdownMenu.querySelectorAll('button').forEach(item => {\n item.setAttribute('aria-description', aa_select_description)\n })\n this.selectedOption.setAttribute('aria-description', aa_listbox_description)\n }\n\n setSelected(value, dispatchChange = false) {\n const { options = [] } = this.props\n const tmpSelected = options.find(option => option.value === value)\n if (tmpSelected) {\n this.selected.checked = false\n this.selected = tmpSelected\n this.selected.checked = true\n }\n\n if (this.selectedOption) {\n this.selectedOption.setAttribute('aria-selected', 'false')\n }\n\n this.dropdownMenu.querySelectorAll('button').forEach(item => {\n if (item.value === this.selected.label) {\n this.selectedOption = item\n this.selectedOption.setAttribute('aria-selected', 'true')\n }\n })\n\n this.classList.add('nb-dropdown--is-filled')\n\n if (this.selectedOption) {\n this.reRender()\n }\n\n if (dispatchChange) {\n dispatchEvent({\n eventName: EVENT_SORT_BY_CHANGE,\n args: { options, selected: this.selected },\n element: this\n })\n }\n }\n\n toogleDropdown(value) {\n value ? this.open() : this.close()\n this.isOpen = !this.isOpen\n\n // Open and Close shared actions\n this.switchAriaModal()\n this.buttonElement.setAttribute('aria-expanded', this.isOpen)\n }\n\n switchAriaModal() {\n // This is the future way to scope the SR focus to a modal, but it's not supported yet by all SR\n this.dropdownMenu.setAttribute('aria-modal', this.isOpen)\n // So we need to set aria-hidden=false to all brothers and brothers of parent until body\n recursiveSwitchAriaHidden(this.dropdownMenu, this.isOpen)\n }\n\n open() {\n // Transitionend listener is fired multiple times (fore each css property)\n // so we need to instanciate it only when we open or close and then we remove it on focusin\n this.dropdownMenu.addEventListener('transitionend', this.boundFocus)\n document.addEventListener('focusin', this.boundFocusin)\n document.addEventListener(EVENT_POPIN_KEY_DOWN, this.boundKeyNav)\n this.buttonElement.classList.add('isOpen')\n this.openingSource = document.activeElement\n }\n\n close() {\n // Transitionend listener is fired multiple times (fore each css property)\n // so we need to instantiate it only when we open or close and then we remove it on focusin\n this.dropdownMenu.addEventListener('transitionend', this.boundFocus)\n document.removeEventListener('focusin', this.boundFocusin)\n document.removeEventListener(EVENT_POPIN_KEY_DOWN, this.boundKeyNav)\n this.buttonElement.classList.remove('isOpen')\n this.buttonElement.setAttribute('aria-expanded', false)\n }\n\n focus() {\n this.dropdownMenu.removeEventListener('transitionend', this.boundFocus)\n if (this.isOpen && this.selectedOption) {\n this.selectedOption.focus()\n this.dropdownMenu.lastFocused = this.selectedOption\n } else {\n this.buttonElement.focus()\n }\n }\n\n focusin(e) {\n const loop = false\n focusin(e, this.dropdownMenu, loop)\n }\n\n keyNav(e) {\n switch (e.key) {\n case 'Escape':\n this.toogleDropdown(false)\n break\n case 'ArrowUp':\n e.preventDefault()\n this.prevOption()\n break\n case 'ArrowDown':\n e.preventDefault()\n this.nextOption()\n break\n case 'Home':\n case 'PageUp':\n e.preventDefault()\n this.firstOption()\n break\n case 'End':\n case 'PageDown':\n e.preventDefault()\n this.lastOption()\n break\n default:\n break\n }\n }\n\n prevOption() {\n if (this.dropdownMenu.lastFocused !== this.dropdownMenu.firstFocusable) {\n const prevSibling = this.dropdownMenu.lastFocused.previousElementSibling\n prevSibling.focus()\n this.dropdownMenu.lastFocused = prevSibling\n }\n }\n\n nextOption() {\n if (this.dropdownMenu.lastFocused !== this.dropdownMenu.lastFocusable) {\n const nextSibling = this.dropdownMenu.lastFocused.nextElementSibling\n nextSibling.focus()\n this.dropdownMenu.lastFocused = nextSibling\n }\n }\n\n firstOption() {\n if (this.dropdownMenu.lastFocused !== this.dropdownMenu.firstFocusable) {\n this.dropdownMenu.firstFocusable.focus()\n this.dropdownMenu.lastFocused = this.dropdownMenu.firstFocusable\n }\n }\n\n lastOption() {\n if (this.dropdownMenu.lastFocused !== this.dropdownMenu.lastFocusable) {\n this.dropdownMenu.lastFocusable.focus()\n this.dropdownMenu.lastFocused = this.dropdownMenu.lastFocusable\n }\n }\n\n disconnectedCallback() {\n this.unbindEvent()\n }\n}\n\ncustomElements.get('nb-dropdown') || customElements.define('nb-dropdown', Dropdown)\n\nexport default Dropdown\n","import Viewport from './viewportTracking'\nimport { parseHTML, capitalize } from '../../utils'\nimport { productImpression } from '@kissui/helpers/src/gtmEvents'\n\nexport default function (node, productData, currency, range, position) {\n const tracking = new ProductTracking(node, productData, currency, range, position)\n\n return {\n destroy: () => {\n if (!tracking.getIom().hasIntersectionObserver()) {\n tracking.destroy()\n }\n }\n }\n}\n\nclass ProductTracking extends Viewport {\n constructor(node, data, currency, range, position) {\n super(node)\n this.node = node\n this.data = data\n this.currency = currency\n this.range = range\n this.position = position\n }\n\n async runTrack() {\n // Remove impressionOnScoll event - from Analytics team (Luigi, Yahor)\n const noImpression =\n this.node.closest('[tracking_no_impression]')?.getAttribute('tracking_no_impression') ||\n false\n const productIndex =\n this.node.closest('[tracking_position]')?.getAttribute('tracking_position') || 0\n const list = this.node.closest('[tracking_list]')?.getAttribute('tracking_list') || ''\n\n if (noImpression !== 'true') {\n await productImpression(productIndex, list, this.data.id)\n }\n }\n\n async getPLPCategory(categoryId) {\n return (await window.getPLPData()).data.configuration.eCommerceData.categories.find(\n category => category.id === categoryId\n )\n }\n\n async getCategoriesWithPlpData(productData) {\n const TECHNOLOGY_CATEGORY_IDENTIFIER = '/machineTechno/'\n const isTechnologyCategory = categoryId =>\n categoryId.indexOf(TECHNOLOGY_CATEGORY_IDENTIFIER) !== -1\n\n const getTechnologyName = categoryId =>\n categoryId.substr(\n categoryId.indexOf(TECHNOLOGY_CATEGORY_IDENTIFIER) +\n TECHNOLOGY_CATEGORY_IDENTIFIER.length\n )\n\n const categories = [\n ...(productData.cupSizes || []),\n ...(productData.flavors || []),\n ...(productData.ranges || []),\n ...(productData.technologies || [])\n ]\n\n const categoryNames = await Promise.all(\n categories.map(async categoryId => {\n const categoryData = await this.getPLPCategory(categoryId)\n\n if (!categoryData && isTechnologyCategory(categoryId)) {\n return getTechnologyName(categoryId)\n }\n\n return categoryData.name\n })\n )\n\n return categoryNames.join('|')\n }\n\n async getCategories(productData) {\n if (!productData) {\n return ''\n }\n\n if (window.getPLPData) {\n return this.getCategoriesWithPlpData(productData)\n }\n\n return Promise.all(\n productData.supercategories.map(superCategory =>\n window.napi.catalog().getCategory(superCategory)\n )\n ).then(categories => {\n const dimension55 = []\n for (const category of categories) {\n const code = category.code\n if (!code) {\n return\n }\n if (\n ~code.indexOf('-cupSize-') ||\n ~code.indexOf('-range-') ||\n ~code.indexOf('capsule-aromatic-') ||\n ~code.indexOf('machine-keyFeature-') ||\n ~code.indexOf('machine-color-') ||\n ~code.indexOf('accessory-collection-') ||\n ~code.indexOf('accessory-hero-month')\n ) {\n dimension55.push(category.name.toLowerCase())\n }\n }\n return dimension55.join('|')\n })\n }\n\n buildGTMProductObject(productData, dimension55) {\n let category\n if (productData.type === 'capsule') {\n category = 'capsules'\n } else if (productData.type === 'accessory') {\n category = 'accessories'\n } else if (productData.type === 'machine') {\n category = 'machines'\n }\n\n let dimension56 = null\n if (productData.technologies) {\n dimension56 = productData.technologies\n .map(technology => capitalize(technology.split('/')[2]))\n .join('|||')\n }\n\n let dimension130 = ''\n if (productData.productSelections != null) {\n dimension130 = productData.productSelections.join('|')\n }\n\n const impressionsOnScrollData = {\n brand: 'Nespresso',\n category,\n dimension43: 'false',\n dimension44: 'false',\n dimension53: productData.legacyId,\n dimension54: parseHTML(productData.name)[0].textContent,\n dimension55,\n dimension56,\n dimension57: this.isBundled(productData) ? 'bundled' : 'single',\n dimension130,\n id: productData.internationalId,\n name: parseHTML(productData.internationalName)[0].textContent,\n price: productData.price\n }\n if (this.range) {\n impressionsOnScrollData.list = this.range\n }\n if (this.position) {\n impressionsOnScrollData.position = parseInt(this.position)\n }\n return impressionsOnScrollData\n }\n\n /**\n * Guess if it's bundled even if the 'bundled' property is missing (ecapi VS PLP Data)\n */\n isBundled(productData) {\n let result = productData.salesMultiple === 1 && productData.unitQuantity > 1\n\n if (productData.bundled) {\n result = productData.bundled\n } else if (productData.salesMultiple > 1 && productData.unitQuantity === 1) {\n result = false\n }\n\n return result\n }\n}\n","import productTracking from '@kissui/helpers/src/assets/js/productTracking'\nimport { getProduct } from '@kissui/helpers/src/catalog'\n\nclass AddToCart extends HTMLElement {\n static addToCartCounter = 0\n\n connectedCallback() {\n this.sku = (this.getAttribute('sku') || '').trim()\n this.range = this.getAttribute('range')\n this.position = this.getAttribute('position')\n this.longSku = (this.getAttribute('longSku') || '').trim()\n this.buttonSize = this.getAttribute('buttonSize') || 'small' // large or small\n this.rendererName = this.getAttribute('rendererName') || 'default'\n this.elementID = `addToCart${AddToCart.addToCartCounter++}`\n this.disableTracking = this.getAttribute('disableTracking') || false\n\n this.render()\n\n if (!this.isWindowNapiActive()) {\n return\n }\n\n window.napi\n .getConfig()\n .then(() => {\n this.pushButton()\n })\n .catch(e => console.error(e))\n\n if (!this.disableTracking) {\n this.tracking()\n .then(() => {})\n .catch(e => console.error(e))\n }\n }\n\n render() {\n this.innerHTML = `<div class=\"cb-AddToCart\" id=\"${this.elementID}\">\n <button class='AddToBagButtonLarge'>\n <span class='AddToBagButtonLarge__label'>+</span>\n </button>\n </div>`\n }\n\n isWindowNapiActive() {\n return !!window.napi\n }\n\n pushButton() {\n if (!document.getElementById(this.elementID)) {\n return\n }\n\n const buttonSize = this.buttonSize\n\n window.ui = window.ui || []\n window.ui.push({\n id: this.elementID,\n module: 'AddToBagButton',\n configuration: { props: { productId: this.longSku, buttonSize } },\n ecommerceData: { activated: true }\n })\n }\n\n async tracking() {\n if (!this.isWindowNapiActive()) {\n return Promise.resolve()\n }\n\n const data = await this.getProductData()\n const currency = window[window.config.padl.namespace].dataLayer.app.app.currency\n productTracking(this, data, currency, this.range, this.position)\n }\n\n getSkuKey(sku) {\n return sku.indexOf('prod/') !== -1 ? 'id' : 'legacyId'\n }\n\n async getProductData() {\n let plpData = null\n if (window.getPLPData != null) {\n plpData = await window.getPLPData()\n }\n if (plpData) {\n const skuKey = this.getSkuKey(this.sku)\n const allKeys = [skuKey, 'internationalId', 'id', 'legacyId']\n let currentKeyIndex = 0\n let data = null\n\n while (!data && currentKeyIndex < allKeys.length - 1) {\n const key = allKeys[currentKeyIndex]\n\n data = plpData.data.configuration.eCommerceData.products.find(\n product => product[key] === this.sku\n )\n\n currentKeyIndex++\n }\n\n return data\n } else if (this.isWindowNapiActive()) {\n return await getProduct(this.longSku)\n }\n\n console.error('Error: napi is not found.')\n }\n}\n\ncustomElements.get('nb-add-to-cart') || customElements.define('nb-add-to-cart', AddToCart)\n\nexport default AddToCart\n","import createProps from '@kissui/helpers/src/props.helpers'\nimport viewportHelper from '@kissui/helpers/src/viewport.helpers'\nimport { EVENT_SLIDER_READY } from '@kissui/components'\nimport { readEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\nimport { stringifyForAttribute, escapeHtml } from '@kissui/helpers/src/utils'\nimport { BROWSER_CONTEXT } from '../constants.mjs'\nimport { customEvent } from '@kissui/helpers/src/gtmEvents'\n\nconst SLIDER_CHIPS_ID = 'slider_natural_chips'\n\nclass PlpStickyBar extends HTMLElement {\n constructor() {\n super()\n this.boundReinitSlider = this.reinitSlider.bind(this)\n this.boundLinkClick = this.linkClick.bind(this)\n }\n\n connectedCallback() {\n this.props = createProps(this.attributes)\n\n this.addEventListener(EVENT_SLIDER_READY, this.boundReinitSlider)\n this.render()\n\n this.dropdownButtons = this.querySelectorAll(`.nb-dropdown__menu button`)\n if (this.dropdownButtons) {\n this.dropdownButtons.forEach(item => {\n item.addEventListener('click', this.boundLinkClick)\n })\n }\n }\n\n render() {\n const { navigation = [], navigation_bubbles = '' } = this.props\n this.classList.add('nb-plp-sticky-bar')\n\n this.innerHTML = `<div class='cb-restrict'>\n ${this.renderLinksSelect(navigation)}\n ${this.renderChipsSlider(navigation_bubbles)}\n </div>`\n\n this.dropdown = this.querySelector('nb-dropdown')\n this.navigationBubble = this.querySelector('nb-navigation-bubbles')\n\n // We set aria-hidden on this whole component because it has no sense to manage twice the features for SR and keyboard navigations\n // Those features (bubble anchor + dropdown page switch) are already managed by the non sticky components\n this.setAttribute('aria-hidden', 'true')\n }\n\n renderLinksSelect(links) {\n if (viewportHelper.is.mobile || !links || links.length <= 1) {\n return ''\n }\n\n const data = links.map(e => {\n e.checked = e.selected\n return e\n })\n\n return `\n <nb-dropdown\n data='${stringifyForAttribute({ icon_option: '16/symbol/check', options: data })}'\n ></nb-dropdown>\n `\n }\n\n renderChipsSlider(bubbles) {\n const { a11y_slider_previous_button = '', a11y_slider_next_button = '' } = this.props\n\n return `<nb-navigation-bubbles\n slider_id='${SLIDER_CHIPS_ID}'\n a11y_slider_previous_button=\"${a11y_slider_previous_button}\"\n a11y_slider_next_button=\"${a11y_slider_next_button}\"\n sticky='true' data='${escapeHtml(bubbles)}'\n selected_nav_link_label=\"${\n this.props.selected_nav_link_label || ''\n }\"></nb-navigation-bubbles>`\n }\n\n forceSliderWidth() {\n // This is needed for Chip Slider, I don't understand why the width is too much\n // So we set it hardly in JS (only when dropdown is in the layout)\n if (this.dropdown) {\n const dropdownWidth = this.dropdown.offsetWidth\n const stickyBarWidth = this.querySelector('.cb-restrict').offsetWidth\n const navigationBubbleWidth = stickyBarWidth - dropdownWidth\n\n this.navigationBubble.style.setProperty(\n 'width',\n `${navigationBubbleWidth / BROWSER_CONTEXT}rem`\n )\n }\n }\n\n reinitSlider(e) {\n const { id } = readEvent(e)\n if (id !== SLIDER_CHIPS_ID) {\n return\n }\n this.forceSliderWidth()\n e.target.initSlider()\n }\n\n linkClick(event) {\n event.preventDefault()\n // We need to redefine click on dropdown links because these are buttons\n const link = event.currentTarget.getAttribute('data-link')\n if (link) {\n window.location.href = link\n }\n\n const textContent = event.currentTarget.getAttribute('value')\n customEvent({\n eventAction: 'PLP Content Tab',\n eventLabel: textContent\n })\n }\n\n disconnectedCallback() {\n this.removeEventListener(EVENT_SLIDER_READY, this.boundReinitSlider)\n\n if (this.dropdownButtons) {\n this.dropdownButtons.forEach(item => {\n item.removeEventListener('click', this.boundLinkClick)\n })\n }\n }\n}\n\ncustomElements.get('nb-plp-sticky-bar') || customElements.define('nb-plp-sticky-bar', PlpStickyBar)\n\nexport default PlpStickyBar\n","/*!\n * swiped-events.js - v@version@\n * Pure JavaScript swipe events\n * https://github.com/john-doherty/swiped-events\n * @inspiration https://stackoverflow.com/questions/16348031/disable-scrolling-when-touch-moving-certain-element\n * @author John Doherty <www.johndoherty.info>\n * @license MIT\n */\n\n// scrollElement has been added as an optional parameter in order to avoid scrolling to fire a swipe\nconst swipeEvents = (window: Window & typeof globalThis, document: Document, stopEl?: HTMLElement) => {\n if (window.nwcSwipeEvents) {\n return\n }\n window.nwcSwipeEvents = true\n\n // patch CustomEvent to allow constructor creation (IE/Chrome)\n // if (typeof window.CustomEvent !== 'function') {\n // window.CustomEvent = function(event, params) {\n // params = params || {bubbles: false, cancelable: false, detail: undefined}\n //\n // let evt = document.createEvent('CustomEvent')\n // evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail)\n // return evt\n // }\n //\n // window.CustomEvent.prototype = window.Event.prototype\n // }\n\n document.addEventListener('touchstart', handleTouchStart, false)\n document.addEventListener('touchmove', handleTouchMove, false)\n document.addEventListener('touchend', handleTouchEnd, false)\n\n let xDown: null | number = null\n let yDown: null | number = null\n let xDiff: null | number = null\n let yDiff: null | number = null\n let timeDown: null | number = null\n let startEl: HTMLElement | null = null\n\n // Variables added for checkScrollConditions\n let scrollTopArray: number[] = []\n let scrollLeftArray: number[] = []\n\n /**\n * Avoid swipe up or down events to fire by checking the scrollTop position of the optional param scrollEl (scrollable zone)\n * @param {string} direction - 'up' ,'down', 'left', 'right'\n * @returns {boolean}\n */\n function checkScrollCondition(direction: \"up\" |\"down\" | \"left\" | \"right\", e: TouchEvent) {\n if (stopEl === undefined) {\n return true\n }\n\n let el = e.target as HTMLElement\n let result = true\n let i = 0\n while (el !== stopEl && result) {\n if (isScrollable(el)) {\n switch (direction) {\n case 'up':\n result = scrollTopArray[i] === el.scrollHeight - el.clientHeight\n break\n case 'down':\n result = scrollTopArray[i] === 0\n break\n case 'left':\n result = scrollLeftArray[i] === el.scrollWidth - el.clientWidth\n break\n case 'right':\n result = scrollLeftArray[i] === 0\n break\n default:\n result = true\n }\n }\n el = el.parentNode as HTMLElement\n i++\n }\n return result\n }\n\n function memorizeStartElScrollPositions(el: HTMLElement) {\n if (stopEl === undefined || !stopEl.contains(el)) {\n return\n }\n scrollTopArray = []\n scrollLeftArray = []\n while (el !== stopEl) {\n scrollTopArray.push(el.scrollTop)\n scrollLeftArray.push(el.scrollLeft)\n el = el.parentNode as HTMLElement\n }\n }\n\n function isScrollable(el: HTMLElement) {\n return el.scrollHeight > el.clientHeight || el.scrollWidth > el.clientWidth\n }\n\n /**\n * Fires swiped event if swipe detected on touchend\n * @param {object} e - browser event object\n * @returns {void}\n */\n function handleTouchEnd(e: TouchEvent) {\n // if the user released on a different target, cancel!\n if (startEl !== e.target) {\n return\n }\n\n // Calculate the data-swipe-threshold to be a percentage of the viewport\n const defaultVertical = window.innerHeight * 0.25 // 25% of the viewport\n const defaultHorizontal = window.innerWidth * 0.5 // 50% of the viewport\n\n let swipeThresholdVertical =\n getNearestAttribute(startEl!, 'data-swipe-threshold', defaultVertical)\n\n let swipeThresholdHorizontal =\n getNearestAttribute(startEl!, 'data-swipe-threshold', defaultHorizontal)\n\n let swipeTimeout = getNearestAttribute(startEl!, 'data-swipe-timeout', 500) // default 500ms\n let timeDiff = Date.now() - timeDown!\n let eventType = ''\n let changedTouches = e.changedTouches || e.touches || []\n\n if (Math.abs(xDiff!) > Math.abs(yDiff!)) {\n // most significant\n if (Math.abs(xDiff!) > swipeThresholdHorizontal && timeDiff < swipeTimeout) {\n if (xDiff! > 0) {\n if (checkScrollCondition('left', e)) {\n eventType = 'swiped-left'\n }\n } else {\n if (checkScrollCondition('right', e)) {\n eventType = 'swiped-right'\n }\n }\n }\n } else if (Math.abs(yDiff!) > swipeThresholdVertical && timeDiff < swipeTimeout) {\n if (yDiff! > 0) {\n if (checkScrollCondition('up', e)) {\n eventType = 'swiped-up'\n }\n } else {\n if (checkScrollCondition('down', e)) {\n eventType = 'swiped-down'\n }\n }\n }\n\n if (eventType !== '') {\n let eventData = {\n dir: eventType.replace(/swiped-/, ''),\n touchType: (changedTouches[0] as Touch & { touchType: string })?.touchType ?? 'direct', // This is a non standard feature used only by safari\n xStart: xDown!,\n xEnd: (changedTouches[0] || {}).clientX || -1,\n yStart: yDown!,\n yEnd: (changedTouches[0] || {}).clientY || -1\n }\n\n // fire `swiped` event event on the element that started the swipe\n startEl!.dispatchEvent(\n new CustomEvent('swiped', { bubbles: true, cancelable: true, detail: eventData })\n )\n\n // fire `swiped-dir` event on the element that started the swipe\n startEl!.dispatchEvent(\n new CustomEvent(eventType, { bubbles: true, cancelable: true, detail: eventData })\n )\n }\n\n // reset values\n xDown = null\n yDown = null\n timeDown = null\n }\n\n /**\n * Records current location on touchstart event\n * @param {object} e - browser event object\n * @returns {void}\n */\n function handleTouchStart(e: TouchEvent) {\n const target = e.target as HTMLElement\n // if the element has data-swipe-ignore=\"true\" we stop listening for swipe events\n if (target.getAttribute('data-swipe-ignore') === 'true') {\n return\n }\n\n startEl = target\n memorizeStartElScrollPositions(startEl)\n\n timeDown = Date.now()\n xDown = e.touches[0].clientX\n yDown = e.touches[0].clientY\n xDiff = 0\n yDiff = 0\n }\n\n /**\n * Records location diff in px on touchmove event\n * @param {object} e - browser event object\n * @returns {void}\n */\n function handleTouchMove(e: TouchEvent) {\n if (!xDown || !yDown) {\n return\n }\n\n let xUp = e.touches[0].clientX\n let yUp = e.touches[0].clientY\n\n xDiff = xDown - xUp\n yDiff = yDown - yUp\n }\n\n /**\n * Gets attribute off HTML element or nearest parent\n * @param {object} el - HTML element to retrieve attribute from\n * @param {string} attributeName - name of the attribute\n * @param {any} defaultValue - default value to return if no match found\n * @returns {any} attribute value or defaultValue\n */\n function getNearestAttribute(el: HTMLElement, attributeName: string | number, defaultValue: number) {\n // walk up the dom tree looking for attributeName\n while (el && el !== document.documentElement) {\n let attributeValue = el.getAttribute(String(attributeName))\n\n if (attributeValue) {\n return parseInt(attributeValue, 10)\n }\n\n el = el.parentNode as HTMLElement\n }\n\n return defaultValue\n }\n}\n\nexport default swipeEvents\n","import './overlay.scss'\nimport { dispatchEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\nimport { EVENT_POPIN_CLOSE, TIME_INSTANT, TIME_SLOW } from '@kissui/components'\n\nconst open = popin_id => {\n const overlay = document.createElement('DIV')\n overlay.classList.add('nb-overlay')\n overlay.addEventListener('click', () => {\n dispatchEvent({ eventName: EVENT_POPIN_CLOSE, args: { id: popin_id } })\n })\n document.body.appendChild(overlay)\n setTimeout(() => {\n overlay.classList.add('fadein')\n }, TIME_INSTANT)\n}\n\nconst close = () => {\n if (!document.getElementsByClassName('nb-overlay').length) {\n return\n }\n const overlay = document.getElementsByClassName('nb-overlay')[0]\n overlay.classList.remove('fadein')\n setTimeout(() => {\n overlay.remove()\n }, TIME_SLOW)\n}\n\nexport default { open, close }\n","import swipeEvents from '@kissui/helpers/src/swipeEvents'\nimport createProps, { parseBool } from '@kissui/helpers/src/props.helpers'\nimport {\n recursiveSwitchAriaHidden,\n setFirstAndLastFocusable,\n focusin\n} from '@kissui/helpers/src/assets/js/scopedKeyboardNav'\nimport {\n TIME_FAST,\n EVENT_POPIN_OPENED,\n EVENT_POPIN_CLOSED,\n EVENT_VIDEO_TOGGLE,\n EVENT_POPIN_OPEN,\n EVENT_POPIN_CLOSE,\n EVENT_POPIN_KEY_DOWN,\n EVENT_SWIPED_DOWN\n} from '@kissui/components'\nimport Overlay from './components/overlay'\nimport viewportHelper from '@kissui/helpers/src/viewport.helpers'\nimport { dispatchEvent, readEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\n\nconst STATE_OPEN = 'isOpen'\nconst SCROLL_LOCK = 'scroll-lock'\n\nclass Popin extends HTMLElement {\n constructor() {\n super()\n this.props = {}\n this.ariaModal = null\n this.isVideo = null\n\n this.boundOpen = this.open.bind(this)\n this.boundClose = this.close.bind(this)\n this.boundEscapeClose = this.escapeClose.bind(this)\n this.boundFocus = this.focus.bind(this)\n this.boundFocusin = this.focusin.bind(this)\n }\n\n connectedCallback() {\n this.style.display = 'none'\n this.props = createProps(this.attributes)\n\n if (!this.id) {\n this.id = this.props.id\n }\n\n if (!this.content && !this.slot) {\n this.slot = this.innerHTML\n }\n\n this.ariaModal = false\n this.isVideo = false\n this.render()\n }\n\n attributeChangedCallback(name, oldValue, newValue) {\n this.props = createProps(this.attributes)\n\n if (name === 'content') {\n this.props.content = newValue\n }\n }\n\n static get observedAttributes() {\n return ['content']\n }\n\n disconnectedCallback() {\n if (!this.hasEvent) {\n return\n }\n this.unbindEvent()\n }\n\n render() {\n if (this.hasEvent) {\n this.unbindEvent()\n }\n const {\n heading = '',\n subheading = '',\n bgcolor = 'highlight',\n size = 'M',\n label_close = 'Close',\n image = '',\n image_alt = '',\n variation = 'before',\n content = '',\n heading_class = viewportHelper.is.mobile ? 't-sm-700-sl' : 'h-lg-700',\n heading_id = 'popin-heading'\n } = this.props\n const slot = content || this.slot\n\n if (slot === '') {\n this.bindEvent()\n this.classList.remove(STATE_OPEN)\n this.isOpen = false\n return false\n }\n this.checkIsVideo(slot)\n this.setAttribute('size', this.isVideo ? 'L' : size)\n\n // FYI : The role is dialog, not alertdialog (only used for alerts / warnings ...)\n this.setAttribute('role', 'dialog')\n this.setAttribute('aria-hidden', 'true')\n this.setAttribute('bgcolor', bgcolor)\n this.setAttribute('variation', variation)\n\n // Be careful to not remove the title div, even if empty, because it holds on purpose the top gradient for scroll effect\n this.innerHTML = `\n <nb-cta\n variation=\"navigation\"\n ${bgcolor === 'white' ? `contrast=\"highlight\"` : `contrast=\"light\"`}\n icon_right=\"24/symbol/close\"\n label=\"${label_close}\"></nb-cta>\n <div class=\"wrapper\">\n ${\n heading &&\n `<div class=\"title\" >\n ${\n heading &&\n `<h2 id=\"${heading_id}\" class=\"${heading_class}\">${heading}</h2>`\n }\n </div>`\n }\n ${\n subheading &&\n `<div class=\"subtitle\">\n ${subheading && `<p class=\"t-sm-500\">${subheading}</p>`}\n </div>`\n }\n\n <div class=\"content t-sm-400\" tabindex=\"-1\">\n ${\n image &&\n `<div class=\"popin-header-img\"><img loading=\"lazy\" src=\"${image}\" alt=\"${image_alt}\" title=\"${image_alt}\" width=\"300\" height=\"225\" /></div>`\n }\n ${slot}\n </div>\n ${this.renderFooter()}\n </div>\n ${this.isVideo && viewportHelper.is.mobile ? '<div class=\"swipeOverlay\"></div>' : ''}\n `\n\n // Expected css to be downloaded\n setTimeout(() => {\n this.style.display = 'inherit'\n }, 100)\n\n // Set the first and last focusable elements\n setFirstAndLastFocusable(this)\n\n this.buttonElement = this.querySelector('button')\n this.bindEvent()\n }\n\n renderFooter() {\n const { footer } = this.props\n return parseBool(footer) ? '<footer></footer>' : ''\n }\n\n checkIsVideo(slot) {\n const tempEl = document.createElement('div')\n tempEl.innerHTML = slot\n if (tempEl.children.length === 1 && tempEl.children[0].tagName === 'NB-VIDEO') {\n this.isVideo = true\n this.setAttribute('video', 'true')\n }\n }\n\n addLock() {\n document.getElementsByTagName('html')[0].classList.add(SCROLL_LOCK)\n Overlay.open(this.id)\n }\n\n removeLock() {\n // In case we have popin inside a popin we shouldn't remove the scroll_lock\n const parentPopin = this.parentNode.closest('nb-popin')\n if (!parentPopin) {\n document.getElementsByTagName('html')[0].classList.remove(SCROLL_LOCK)\n }\n Overlay.close()\n }\n\n switchAriaModal() {\n this.ariaModal = !this.ariaModal\n // This is the future way to scope the SR focus to a modal, but it's not supported yet by all SR\n this.setAttribute('aria-modal', this.ariaModal)\n // So we need to set aria-hidden=false to all ancestors of parent until body\n recursiveSwitchAriaHidden(this, this.ariaModal)\n }\n\n async open(e) {\n const event = readEvent(e)\n if (event.id !== this.id) {\n return\n }\n // Transitionend listener is fired multiple times (fore each css property)\n // so we need to instantiate it only when we open or close and then we remove it on focusin\n this.addEventListener('transitionend', this.boundFocus)\n document.addEventListener('focusin', this.boundFocusin)\n this.openingSource = document.activeElement\n\n this.addLock()\n this.switchAriaModal()\n this.setAttribute('aria-hidden', 'false')\n this.isOpen = !this.isOpen\n\n // event variable already contains ID and other args sent along with dispatch event\n dispatchEvent({\n eventName: EVENT_POPIN_OPENED,\n args: event\n })\n\n await new Promise(resolve => {\n setTimeout(() => {\n this.classList.add(STATE_OPEN)\n resolve()\n }, TIME_FAST)\n })\n }\n\n close(event) {\n event.cancelBubble = true\n if (event.stopPropagation) {\n event.stopPropagation()\n }\n // Transitionend listener is fired multiple times (fore each css property)\n // so we need to instantiate it only when we open or close, and then we remove it on focusin\n this.addEventListener('transitionend', this.boundFocus)\n document.removeEventListener('focusin', this.boundFocusin)\n this.removeLock()\n if (this.isVideo) {\n const openVideoPopin = this.closest('.has-open-video')\n if (openVideoPopin) {\n openVideoPopin.classList.remove('has-open-video')\n }\n }\n this.switchAriaModal()\n this.setAttribute('aria-hidden', 'true')\n this.isOpen = !this.isOpen\n this.classList.remove(STATE_OPEN)\n\n dispatchEvent({\n eventName: EVENT_POPIN_CLOSED,\n args: { id: this.id }\n })\n }\n\n focus() {\n this.removeEventListener('transitionend', this.boundFocus)\n if (this.isOpen) {\n this.buttonElement.focus()\n } else {\n this.openingSource.focus()\n }\n }\n\n focusin(e) {\n focusin(e, this, true)\n }\n\n escapeClose(e) {\n if (e.key === 'Escape' && this.isOpen) {\n this.close(e)\n }\n }\n\n swipeDown(e) {\n if (this.isOpen) {\n this.close(e)\n }\n }\n\n swipeOverlayTogglePlayPause() {\n dispatchEvent({\n eventName: EVENT_VIDEO_TOGGLE,\n args: { id: this.id }\n })\n }\n\n bindEvent() {\n this.hasEvent = true\n this.buttonElement != null && this.buttonElement.addEventListener('click', this.boundClose)\n window.addEventListener(EVENT_POPIN_OPEN, this.boundOpen)\n window.addEventListener(EVENT_POPIN_CLOSE, this.boundClose)\n document.addEventListener(EVENT_POPIN_KEY_DOWN, this.boundEscapeClose)\n\n if (viewportHelper.is.mobile) {\n swipeEvents(window, document, this)\n this.boundSwipeDown = this.swipeDown.bind(this)\n document.addEventListener(EVENT_SWIPED_DOWN, this.boundSwipeDown)\n if (this.isVideo) {\n this.swipeOverlay = this.querySelector('.swipeOverlay')\n this.boundSwipeOverlayTogglePlayPause = this.swipeOverlayTogglePlayPause.bind(this)\n this.swipeOverlay.addEventListener('click', this.boundSwipeOverlayTogglePlayPause)\n }\n }\n }\n\n unbindEvent() {\n this.hasEvent = false\n this.buttonElement != null &&\n this.buttonElement.removeEventListener('click', this.boundClose)\n window.removeEventListener(EVENT_POPIN_OPEN, this.boundOpen)\n window.removeEventListener(EVENT_POPIN_CLOSE, this.boundClose)\n document.removeEventListener(EVENT_POPIN_KEY_DOWN, this.boundEscapeClose)\n if (this.boundSwipeDown) {\n document.removeEventListener(EVENT_SWIPED_DOWN, this.boundSwipeDown)\n this.boundSwipeDown = null\n }\n if (this.boundSwipeOverlayTogglePlayPause) {\n this.swipeOverlay.removeEventListener('click', this.boundSwipeOverlayTogglePlayPause)\n this.boundSwipeOverlayTogglePlayPause = null\n }\n }\n}\n\ncustomElements.get('nb-popin') || customElements.define('nb-popin', Popin)\n\nexport default Popin\n","import { LOGO_IMG_MAP } from '@kissui/helpers/src/cremaDataHelper'\nimport createProps from '@kissui/helpers/src/props.helpers'\n\nclass CardLogos extends HTMLElement {\n constructor() {\n super()\n this.props = {}\n }\n\n connectedCallback() {\n this.props = createProps(this.attributes)\n this.render()\n }\n\n render() {\n // individual props for each logo is there for retro compatibility\n // logos is the prop that we should use going forward to add any logo\n let { direction = 'row', logos } = this.props\n let fair_trade\n let alt_fair_trade\n let is_organic\n let alt_organic\n let only_vertuo_next\n let alt_vertuo_next\n let is_rainforest\n let alt_rainforest\n let is_sustainable\n let alt_sustainable\n let is_q_certified_arabica\n let alt_q_certification_arabica\n\n this.classList.add(\n `${direction === 'column' ? 'direction-column' : 'direction-' + direction}`\n )\n\n let logos_list = []\n if (logos == null) {\n fair_trade = this.props?.fair_trade\n alt_fair_trade = this.props?.alt_fair_trade\n is_organic = this.props?.is_organic\n alt_organic = this.props?.alt_organic\n only_vertuo_next = this.props?.only_vertuo_next\n alt_vertuo_next = this.props?.alt_vertuo_next\n is_rainforest = this.props?.is_rainforest\n alt_rainforest = this.props?.alt_rainforest\n is_sustainable = this.props?.is_sustainable\n alt_sustainable = this.props?.alt_sustainable\n is_q_certified_arabica = this.props?.is_q_certified_arabica\n alt_q_certification_arabica = this.props?.alt_q_certification_arabica\n } else if (logos.length === undefined) {\n // Logos exists but is not an array, this is the old format\n fair_trade = logos?.fair_trade\n alt_fair_trade = logos?.alt_fair_trade\n is_organic = logos?.is_organic\n alt_organic = logos?.alt_organic\n only_vertuo_next = logos?.only_vertuo_next\n alt_vertuo_next = logos?.alt_vertuo_next\n is_rainforest = logos?.is_rainforest\n alt_rainforest = logos?.alt_rainforest\n is_sustainable = logos?.is_sustainable\n alt_sustainable = logos?.alt_sustainable\n is_q_certified_arabica = logos?.is_q_certified_arabica\n alt_q_certification_arabica = logos?.alt_q_certification_arabica\n } else if (logos.length) {\n logos_list = [...logos]\n }\n\n // here we fill logos with logos taken from individual props\n ;[\n [fair_trade, 'fair_trade', alt_fair_trade, logos_list],\n [is_organic, 'is_organic', alt_organic, logos_list],\n [only_vertuo_next, 'only_vertuo_next', alt_vertuo_next, logos_list],\n [is_rainforest, 'is_rainforest', alt_rainforest, logos_list],\n [is_sustainable, 'is_sustainable', alt_sustainable, logos_list],\n [\n is_q_certified_arabica,\n 'is_q_certified_arabica',\n alt_q_certification_arabica,\n logos_list\n ]\n ].forEach(param => this.appendLogo.apply(this, param))\n\n this.innerHTML = logos_list\n .map(logo => `<img src=\"${LOGO_IMG_MAP[logo.name]}\" alt=\"${logo.alt}\" loading=\"lazy\">`)\n .join('')\n }\n\n appendLogo(param, name, alt, list) {\n if (!!param && !this.hasLogo(list, name)) {\n list.push({ name, alt })\n }\n }\n\n hasLogo(logosList, logoName) {\n return logosList.some(logo => logo.name === logoName)\n }\n}\n\ncustomElements.get('nb-card-logos') || customElements.define('nb-card-logos', CardLogos)\n\nexport default CardLogos\n","export const root = 'pn-ProductNav'\nexport const container = 'pn-ProductNavContents'\nexport const slidesContainer = 'pn-ProductContainer'\nexport const item = 'pn-ProductNavLinkWrapper'\nexport const next = 'pnAdvancerRight'\nexport const prev = 'pnAdvancerLeft'\nexport const pnIndicator = 'pn-ProductNavIndicator'\nexport const link_plp_category_padding_x = 10\nexport const TRANSITION_FAST = 300\n\nexport const colours = {\n 0: '#000000',\n 1: '#000000',\n 2: '#99813D',\n 3: '#40FEFF',\n 4: '#14CC99',\n 5: '#00BAFF',\n 6: '#0082B2',\n 7: '#B25D7A',\n 8: '#00FF17',\n 9: '#006B49',\n 10: '#00B27A',\n 11: '#996B3D',\n 12: '#CC7014',\n 13: '#40FF8C',\n 14: '#FF3400',\n 15: '#ECBB5E',\n 16: '#ECBB0C',\n 17: '#B9D912',\n 18: '#253A93',\n 19: '#125FB9'\n}\n","import * as constants from './constants'\nimport { colours, link_plp_category_padding_x, TRANSITION_FAST } from './constants'\nimport { makeId } from '@kissui/helpers/src/utils'\n\nclass SliderMenu {\n /**\n * @param {HTMLElement} element\n * @param {Object} options\n * @param {Number} [options.slidesToScroll=1] options.slidesToScroll of element do slide\n * @param {Number} [options.slidesVisible=1] options.slidesVisible of element to display\n * @param {Boolean} [options.navigationButton=true] options.navigationButton show navigation button\n */\n\n constructor(element, options = {}) {\n this.boundNextClick = this.onNextClick.bind(this)\n this.boundPrevClick = this.onPrevClick.bind(this)\n this.boundLinkClick = this.onLinkClick.bind(this)\n this.boundTouchEnd = this.onTouchEnd.bind(this)\n this.disableAutoScroll = options.disableAutoScroll === 'true' || false\n this._entriesBounds = null\n\n return new Promise(resolve => {\n this._element = element\n this._slides = [].slice.call(element.children)\n this._options = Object.assign(\n {},\n {\n id: 'uuid',\n last_known_scroll_position: 0,\n ticking: false,\n navBarTravelDirection: '',\n navBarTravelling: false,\n navBarTravelDistance: 150,\n scrollAmount: 220\n },\n options\n )\n\n this.buildIHM()\n resolve(this)\n\n // Wait for CSS animation before setting the indicator\n setTimeout(() => {\n this.setOverflowAttribute()\n this.initializeIndicatorPosition()\n }, 0)\n })\n }\n\n /**\n * @returns {HTMLElement}\n */\n get element() {\n return this._element\n }\n\n // MAIN BUILDER\n buildIHM() {\n this._root = this.createElement('nav', constants.root)\n this._container = this.createElement('ul', constants.container)\n this._pnIndicator = null\n this._containerSlidesContent = null\n\n if (this.hasContainer()) {\n this._containerSlidesContent = this.createElement('div', constants.slidesContainer)\n }\n\n this.wrapItems()\n this._root.appendChild(this._container)\n\n if (this._containerSlidesContent) {\n this._element.appendChild(this._containerSlidesContent)\n }\n\n // Insert the slider between Arrows for accessibility keyboard navigation\n this._element.insertBefore(this._root, this._element.childNodes[2])\n\n this.createIndicator()\n }\n\n hasContainer() {\n if (document.querySelector('.slider-container')) return true\n\n return false\n }\n\n wrapItems() {\n const keys = []\n this._slides.map(child => {\n const randId = makeId(5)\n\n if (this.hasContainer()) {\n if (child.classList.contains('slider-container')) {\n if (child.children) {\n if (child.children.length) {\n ;[...child.children].forEach((el, i) => {\n if (i !== 0) {\n el.style.display = 'none'\n }\n\n el.id = keys[i]\n\n this._containerSlidesContent.appendChild(el)\n })\n }\n }\n child.remove()\n }\n }\n\n if (!child.classList.contains('pn-Advancer')) {\n const item = this.createElement('div', constants.item)\n item.appendChild(child)\n item.setAttribute('data-inner-content-id', randId)\n keys.push(randId)\n\n this._container.appendChild(item)\n }\n })\n }\n\n createElement(tag, className) {\n let div = document.createElement(tag)\n div.setAttribute('class', className)\n return div\n }\n\n // COMPONENT ROOT \"ELEMENT\" COMPOSER\n createIndicator() {\n this.elements = []\n this._pnIndicator = this.createElement('div', constants.pnIndicator)\n this._container.appendChild(this._pnIndicator)\n\n this.elements = Array.from(this._container.querySelectorAll('nb-link a'))\n // Handle setting the currently active link\n this.elements.forEach(element => {\n element.addEventListener('click', this.boundLinkClick)\n })\n\n const pnAdvancerLeft = document.getElementById(`${constants.prev}-${this._options.id}`)\n if (pnAdvancerLeft) {\n pnAdvancerLeft.addEventListener('click', this.boundPrevClick)\n }\n\n const pnAdvancerRight = document.getElementById(`${constants.next}-${this._options.id}`)\n if (pnAdvancerRight) {\n pnAdvancerRight.addEventListener('click', this.boundNextClick)\n }\n\n if (this._root) {\n this._container.addEventListener('touchend', this.boundTouchEnd)\n }\n }\n\n onLinkClick(e) {\n this.goToElement(e.currentTarget)\n }\n\n goToSlide(index) {\n this.goToElement(this._slides[index])\n }\n\n showContent(id) {\n const slidesContainer = document.querySelector(`.${constants.slidesContainer}`)\n\n if (slidesContainer.children) {\n ;[...slidesContainer.children].forEach(el => (el.style.display = 'none'))\n }\n\n document.getElementById(id).style.display = 'block'\n }\n\n goToElement(element) {\n if (this.hasContainer()) {\n const contentId = element\n .closest('[data-inner-content-id]')\n .getAttribute('data-inner-content-id')\n\n this.showContent(contentId)\n }\n\n this.deselectAllLinkBut(element)\n element.setAttribute('aria-current', 'true')\n\n if (!element || !this._entriesBounds) {\n return\n }\n\n let distance = 0\n\n for (const entry of this._entriesBounds) {\n if (entry.target.getAttribute('data-href') === element.getAttribute('data-href')) {\n break\n } else {\n distance = distance + entry.boundingClientRect.width + link_plp_category_padding_x\n }\n }\n\n if (!this.disableAutoScroll) {\n this._root.scroll({ left: distance, behavior: 'smooth' })\n }\n }\n\n deselectAllLinkBut(element) {\n this.elements.forEach(el => {\n if (el !== element) {\n el.setAttribute('aria-current', 'false')\n }\n })\n }\n\n sideScroll(element, direction, speed, distance, step) {\n this.setOverflowAttribute()\n\n let scrollAmount = 0\n let slideTimer = setInterval(function () {\n if (direction === 'left') {\n element.scrollLeft -= step\n } else {\n element.scrollLeft += step\n }\n scrollAmount += step\n if (scrollAmount >= distance) {\n window.clearInterval(slideTimer)\n }\n }, speed)\n return { slideTimer }\n }\n\n onPrevClick() {\n this.sideScroll(this._root, 'left', 25, this._options.scrollAmount, 10)\n setTimeout(() => {\n this.setOverflowAttribute()\n }, TRANSITION_FAST)\n }\n\n onNextClick() {\n this.sideScroll(this._root, 'right', 25, this._options.scrollAmount, 10)\n setTimeout(() => {\n this.setOverflowAttribute()\n }, TRANSITION_FAST)\n }\n\n onTouchEnd() {\n this.setOverflowAttribute()\n }\n\n initializeIndicatorPosition() {\n const selected = this._root.querySelector('[aria-current=\"true\"]')\n\n // Set the indicator\n if (selected) {\n this.moveIndicator(selected, colours[0])\n }\n }\n\n determineOverflow(content, container) {\n let containerMetrics = container.getBoundingClientRect()\n let containerMetricsRight = Math.floor(containerMetrics.right)\n let containerMetricsLeft = Math.floor(containerMetrics.left)\n\n let contentMetrics = content.getBoundingClientRect()\n let contentMetricsRight = Math.floor(contentMetrics.right)\n let contentMetricsLeft = Math.floor(contentMetrics.left)\n\n if (\n containerMetricsLeft > contentMetricsLeft &&\n containerMetricsRight < contentMetricsRight\n ) {\n return 'both'\n } else if (contentMetricsLeft < containerMetricsLeft) {\n return 'left'\n } else if (contentMetricsRight > containerMetricsRight) {\n return 'right'\n } else {\n return 'none'\n }\n }\n\n moveIndicator(item, color) {\n if (!this._pnIndicator) {\n return\n }\n\n let textPosition = item.getBoundingClientRect()\n let container = this._container.getBoundingClientRect().left\n let distance = textPosition.left - container\n\n this._pnIndicator.style.transform =\n 'translateX(' +\n (distance + this._container.scrollLeft + link_plp_category_padding_x) +\n 'px) scaleX(' +\n (textPosition.width - link_plp_category_padding_x * 2) * 0.01 +\n ')'\n\n this._root.scrollLeft = Math.floor(\n distance + this._container.getBoundingClientRect().left / 2\n )\n\n if (color) {\n this._pnIndicator.style.backgroundColor = color\n }\n }\n\n onResize() {\n this.setOverflowAttribute()\n this.initializeIndicatorPosition()\n }\n\n clearListeners() {\n this.elements.forEach(element => {\n element.removeEventListener('click', this.boundLinkClick)\n })\n\n if (typeof document !== 'undefined') {\n const pnAdvancerLeft = document.getElementById(`${constants.prev}-${this._options.id}`)\n if (pnAdvancerLeft) {\n pnAdvancerLeft.removeEventListener('click', this.boundPrevClick)\n }\n\n const pnAdvancerRight = document.getElementById(`${constants.next}-${this._options.id}`)\n if (pnAdvancerRight) {\n pnAdvancerRight.removeEventListener('click', this.boundNextClick)\n }\n }\n }\n\n kill() {\n this.clearListeners()\n }\n\n setOverflowAttribute() {\n this._element.setAttribute(\n 'data-overflowing',\n this.determineOverflow(this._container, this._root)\n )\n\n this.observe()\n }\n\n observe() {\n if (!('IntersectionObserver' in window)) {\n return false\n }\n\n this._entriesBounds = []\n\n // Using IntersectionObserver to prevent reflow while getting boundingClientRect\n const observer = new IntersectionObserver(\n entries => {\n for (const entry of entries) {\n this._entriesBounds.push({\n target: entry.target,\n intersection:\n entry.boundingClientRect.right <=\n window.innerWidth - link_plp_category_padding_x &&\n entry.boundingClientRect.left >= link_plp_category_padding_x,\n boundingClientRect: entry.boundingClientRect\n })\n }\n\n observer.disconnect()\n },\n { root: this._container }\n )\n\n this._slides.map(element => observer.observe(element))\n }\n\n isInViewport(element) {\n if (!this._entriesBounds) {\n return false\n }\n\n const entry = this._entriesBounds.find(entryBound => element === entryBound.target)\n\n return entry.intersection\n }\n}\n\nexport default SliderMenu\n","import SliderMenuLib from './js/SliderMenuLib'\nimport { debounce, makeId } from '@kissui/helpers/src/utils'\nimport { dispatchEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\nimport { customEvent, itemDisplay } from '@kissui/helpers/src/gtmEvents'\nimport { EVENT_SLIDE_CHANGE, EVENT_SLIDER_READY } from '@kissui/components'\n\nclass SliderMenu extends HTMLElement {\n constructor() {\n super()\n this.slot = this.innerHTML\n this.navBarTravelling = true\n this.disableAutoScroll = false\n this.navBarTravelDirection = ''\n this.navBarTravelDistance = 200\n this.randomId = null\n this.sliderMenu = null\n this.boundOnResize = this.onResize.bind(this)\n this.onLoad = this.onLoad.bind(this)\n this.debouncedOnResize = debounce(this.boundOnResize, 250)\n }\n\n static get observedAttributes() {\n return ['navBarTravelling', 'navBarTravelDirection', 'navBarTravelDistance']\n }\n\n render() {\n const navigation = this.getAttribute('navigation') === 'true' ? true : ''\n const a11y_slider_previous_button = this.getAttribute('a11y_slider_previous_button') || ''\n const a11y_slider_next_button = this.getAttribute('a11y_slider_next_button') || ''\n\n this.innerHTML = `\n <div id=\"pnProductNav-${this.randomId}\" class=\"pn-ProductNavWrapper ${this.randomId}\">\n ${\n navigation &&\n `<nb-cta id=\"pnAdvancerLeft-${this.randomId}\"\n class=\"pn-Advancer pn-AdvancerLeft\"\n variation=\"navigation\"\n contrast=\"highlight\"\n size=\"32\"\n icon_right=\"24/symbol/chevron-left\"\n label=\"${a11y_slider_previous_button}\"></nb-cta>`\n }\n ${this.slot}\n ${\n navigation &&\n `<nb-cta id=\"pnAdvancerRight-${this.randomId}\"\n class=\"pn-Advancer pn-AdvancerRight\"\n variation=\"navigation\"\n contrast=\"highlight\"\n size=\"32\"\n icon_right=\"24/symbol/chevron-right\"\n label=\"${a11y_slider_next_button}\"></nb-cta>`\n }\n <span id=\"pnIndicator-${this.randomId}\"\n class=\"pn-ProductNavIndicator\">\n </span>\n </div>\n\n `\n this.loadSwiper()\n }\n\n connectedCallback() {\n this.randomId = this.getAttribute('testId')\n ? this.getAttribute('testId')\n : `swiperMenu_${makeId(5)}`\n this.navBarTravelling = this.getAttribute('navBarTravelling') || this.navBarTravelling\n this.navBarTravelDirection =\n this.getAttribute('navBarTravelDirection') || this.navBarTravelDirection\n this.navBarTravelDistance =\n this.getAttribute('navBarTravelDistance') || this.navBarTravelDistance\n this.disableAutoScroll = this.getAttribute('disable_auto_scroll') || ''\n\n this.render()\n window.addEventListener('resize', this.debouncedOnResize)\n }\n\n loadSwiper() {\n let navBarTravelDirection = this.navBarTravelDirection\n let navBarTravelDistance = this.navBarTravelDistance\n\n this.sliderMenu = new SliderMenuLib(this.querySelector('.' + this.randomId), {\n id: this.randomId,\n index: this.index,\n navBarTravelDirection: navBarTravelDirection,\n navBarTravelDistance: navBarTravelDistance,\n disableAutoScroll: this.disableAutoScroll\n })\n\n this.sliderMenu.then(() => {\n this.classList.add('is-show')\n\n dispatchEvent({\n eventName: EVENT_SLIDER_READY,\n args: { className: this.randomId },\n element: this\n })\n })\n\n // Updates slider menu to follow semantics, accessibility\n const productNavLinkWrappers = document.querySelectorAll('.pn-ProductNavLinkWrapper')\n productNavLinkWrappers.forEach(div => {\n const li = document.createElement('li')\n li.classList.add('pn-ProductNavLinkWrapper')\n while (div.firstChild) {\n li.appendChild(div.firstChild)\n }\n div.parentNode.replaceChild(li, div)\n })\n }\n\n handleClick() {\n dispatchEvent({ eventName: EVENT_SLIDE_CHANGE })\n\n // GTM 'itemDisplay' event\n itemDisplay({ rootElement: ['nb-slider-menu'] })\n }\n\n onLoad() {\n this.sliderMenu.then(slider => slider.onLoad())\n }\n\n onResize() {\n this.sliderMenu.then(slider => slider.onResize())\n }\n\n onNavigationClick(e) {\n let name = ''\n\n if (\n e.target &&\n e.target.closest('.link') &&\n e.target.closest('.link').getAttribute('tracking_label')\n ) {\n name = e.target.closest('.link').getAttribute('tracking_label')\n }\n\n customEvent({ eventAction: 'PLP Content Tab', eventLabel: name })\n }\n\n disconnectedCallback() {\n window.removeEventListener('resize', this.debouncedOnResize)\n this.sliderMenu.then(slider => slider.kill())\n }\n}\n\ncustomElements.get('nb-slider-menu') || customElements.define('nb-slider-menu', SliderMenu)\n\nexport default SliderMenu\n","import createProps from '@kissui/helpers/src/props.helpers'\nimport viewportHelper from '@kissui/helpers/src/viewport.helpers'\nimport { makeId, setAttributes, convertToCamelCase } from '@kissui/helpers/src/utils'\nimport { isSafari } from '@kissui/helpers/src/useragent.helpers'\nimport { CONTRAST_LIGHT } from '@kissui/components'\nimport { getOppositeContrast } from '@kissui/helpers/src/contrast.helpers'\nimport { dispatchEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\nimport { BROWSER_CONTEXT, EVENT_SLIDER_READY } from '../constants.mjs'\n\nconst MAX_LOOP_TO_INIT = 50 // max 5 seconds\n\nclass SliderNatural extends HTMLElement {\n constructor() {\n super()\n // Default options\n this.contrast = CONTRAST_LIGHT\n this.defaultPosition = 0\n this.displayButtons = true\n this.displayNav = true\n this.displayCounter = false\n this.displayGradients = false\n this.itemsPerSlide = 1\n this.overflow = true\n this.overflowOpacity = 0.25\n this.flexAuto = false\n // Events\n this.boundPrevClick = this.#onPrevClick.bind(this)\n this.boundNextClick = this.#onNextClick.bind(this)\n this.boundNavClick = this.#onNavClick.bind(this)\n this.boundScroll = this.#onScroll.bind(this)\n }\n\n connectedCallback() {\n this.slot = this.innerHTML\n this.props = createProps(this.attributes)\n this.#render()\n\n // We need an id for event dispatcher\n if (!this.id || this.id === 'undefined') {\n this.id = this.props.testId ? this.props.testId : `slider_natural_${makeId(5)}`\n }\n\n this.#setProperties()\n\n this.loops = 0\n this.#waitForSliderToBeSized()\n .then(() => {\n this.initSlider()\n this.#dispatchReady()\n })\n .catch(e => {\n console.error(e)\n })\n .finally(() => {\n if (this.wait) {\n clearInterval(this.wait)\n this.wait = null\n }\n })\n }\n\n #waitForSliderToBeSized() {\n return new Promise((resolve, reject) => {\n this.wait = setInterval(() => {\n if (this.carousel.offsetWidth > 0) {\n return resolve()\n }\n\n this.loops += 1\n if (this.loops === MAX_LOOP_TO_INIT) {\n return reject(\n 'Error: slider width is ZERO even after 5s, cannot finish slider init'\n )\n }\n }, 100)\n })\n }\n\n #set(key, value) {\n const normalisedValue = this.#getOption(value)\n if (normalisedValue !== undefined) {\n this[convertToCamelCase(key)] = normalisedValue\n }\n }\n\n #getOption(value) {\n if (!isNaN(value)) {\n return parseFloat(value)\n } else if (value === 'true') {\n return true\n } else if (value === 'false') {\n return false\n } else {\n return value\n }\n }\n\n #setProperties() {\n const { options, a11y_labels } = this.props\n\n // Create refs to html elements\n this.container = this.querySelector('.container')\n this.wrapper = this.querySelector('.wrapper')\n this.carousel = this.querySelector('ul')\n\n // Set slider properties\n this.currentIndex = 0\n this.a11y_labels = a11y_labels\n if (viewportHelper.is.mobile) {\n this.options = options.mobile\n } else if (viewportHelper.is.tablet) {\n this.options = options.tablet\n } else {\n this.options = options.desktop\n }\n\n // Set options\n for (const property in this.options) {\n this.#set(property, this.options[property])\n }\n\n // If counter is displayed we force buttons and pagination to false\n if (this.displayCounter) {\n this.displayNav = this.displayButtons = false\n }\n\n // Overflow needs a class\n if (this.overflow) {\n this.container.classList.add('overflow')\n }\n\n // Contrast needs an attribute\n this.buttonsContrast = getOppositeContrast(this.contrast)\n this.setAttribute('contrast', this.contrast)\n\n // Set CSS properties for non dynamic options\n this.#setCssSlideMinHeight()\n this.#setCssSliderGap()\n this.#setCssPlaceholder()\n }\n\n /** Public Method **/\n initSlider() {\n // Get an updated number of items (if async we run again)\n this.slidesElements = this.querySelectorAll('.nn-carousel > li:not(.safari-fix)')\n this.itemNumber = this.slidesElements.length\n\n // For asynchronous initSlider() we need to reset first itemWidth and itemPerSlide to get the original values before other calculations\n this.#set('item_width', this.options['item_width'])\n this.#set('items_per_slide', this.options['items_per_slide'])\n\n // If itemsPerSlide is 'auto' we need to calculate it's real value based on itemWidth or scrollWidth / itemNumber\n // We also need to set the CSS --item-width variable to handle the calculation correctly\n if (this.itemsPerSlide === 'auto') {\n this.#calculateItemsPerSlide()\n }\n this.#setCssSlideWidth()\n this.#setCssItemsPerSlide()\n this.#setCssFlexAuto()\n\n // Other properties that can be set only after the rest\n this.maxSlides = this.itemNumber - this.itemsPerSlide\n\n // Finish rendering\n this.#renderButtons()\n this.#renderNav()\n this.#renderCounter()\n this.#renderGradients()\n\n // Init methods in this order !\n this.#applyCenteredLayout()\n this.#getSliderPositions()\n this.#getOpacityParams()\n this.#setOpacity()\n this.#updateStates()\n this.#bindEvent()\n this.#gotoDefaultPosition()\n\n // Render this safariFix at the end because we don't want the extra li to be considered in sliderElements\n this.#renderSafariFix()\n }\n\n #render() {\n this.innerHTML = `<div class=\"container\"><div class=\"wrapper\"><ul class=\"nn-carousel\">${this.slot}</ul></div></div>`\n }\n\n #renderButtons() {\n // Important: if maxSlides <= 0 it means we don't have scroll, so we don't need buttons\n const hasNoButton = !this.displayButtons || this.maxSlides <= 0\n if (hasNoButton) {\n // Needed if we reinit\n if (this.prevButton && this.nextButton) {\n this.prevButton.remove()\n this.nextButton.remove()\n }\n return\n }\n\n // Check if button exists already (for async content in order to avoid creating two occurrences)\n if (!this.prevButton) {\n this.prevButton = this.#renderButton('prev')\n }\n if (!this.nextButton) {\n this.nextButton = this.#renderButton('next')\n }\n }\n\n #renderButton(pos, renderInCounter = false) {\n const { creative = '', id = '', name = '', position = '' } = this.props.campaign ?? {}\n const buttonContrast = renderInCounter ? this.contrast : this.buttonsContrast\n const isPrev = pos === 'prev'\n\n const buttonEl = document.createElement('nb-cta')\n buttonEl.classList.add(pos)\n setAttributes(buttonEl, {\n variation: 'navigation',\n contrast: buttonContrast,\n size: '48',\n icon_right: isPrev ? '24/symbol/chevron-left' : '24/symbol/chevron-right',\n label: this.a11y_labels[pos],\n campaign_creative: creative,\n campaign_id: id,\n campaign_name: name,\n campaign_position: position\n })\n if (!renderInCounter) {\n isPrev ? this.container.prepend(buttonEl) : this.container.append(buttonEl)\n } else {\n isPrev ? this.counter.prepend(buttonEl) : this.counter.append(buttonEl)\n }\n return buttonEl\n }\n\n #renderNav() {\n if (!this.displayNav || this.maxSlides === 0) {\n // Needed if we reinit\n if (this.nav) {\n this.nav.remove()\n }\n return\n }\n\n // Check if nav exists already (for async content in order to avoid creating two occurrences)\n if (this.nav) {\n this.nav.remove()\n }\n\n const nav = document.createElement('nav')\n\n let bullets = ''\n for (let i = 0; i <= this.maxSlides; i++) {\n bullets += this.#renderBullet(i)\n }\n\n nav.innerHTML = `${bullets}`\n\n this.appendChild(nav)\n this.nav = this.querySelector('nav')\n this.navElements = this.querySelectorAll('nav button')\n }\n\n #renderBullet(index) {\n return `<button data-item='${index}' aria-label='${this.a11y_labels.nav} ${index}'><span></span></button>`\n }\n\n #renderCounter() {\n if (!this.displayCounter || this.maxSlides === 0) {\n // Needed if we reinit\n if (this.counter) {\n this.counter.remove()\n }\n return\n }\n\n // Check if counter exists already (for async content in order to avoid creating two occurrences)\n if (this.counter) {\n this.counter.remove()\n }\n\n this.counter = document.createElement('div')\n this.counter.classList.add('counter')\n this.counter.classList.add('t-sm-500')\n this.counter.setAttribute('aria-hidden', 'true')\n\n this.counter.innerHTML = `<span class='current'>${this.currentIndex + 1}</span>\n <span>/</span>\n <span>${this.maxSlides + 1}</span>`\n\n this.prevButton = this.#renderButton('prev', true)\n this.nextButton = this.#renderButton('next', true)\n\n this.appendChild(this.counter)\n }\n\n #renderGradients() {\n if (!this.displayGradients || this.overflow) {\n return\n }\n\n if (this.gradientsWidth) {\n this.#setCss('--gradients-width', this.gradientsWidth, true)\n }\n\n if (this.gradientsColor) {\n this.#setCss('--gradients-color', this.gradientsColor)\n this.#setCss('--gradients-color-transparent', this.gradientsColor + '00')\n }\n\n this.container.classList.add('hasGradients')\n }\n\n #renderSafariFix() {\n // In safari, both Desktop and iOS, the scroll doesn't reach the end, because the scroll-padding on the right side seems to not been taken into account\n // Same bug is happening in Chrome on iOS (seems to use Safari webkit rendering)\n // The fix is to render an extra <li> with the size equal to the scroll-padding\n if (!this.overflow || !isSafari()) {\n return\n }\n\n // Check if safariFix exists already (for async content in order to avoid creating two occurences)\n if (!this.safariFix) {\n this.safariFix = document.createElement('li')\n this.safariFix.classList.add('safari-fix')\n this.safariFix.setAttribute('aria-hidden', true)\n this.carousel.appendChild(this.safariFix)\n }\n\n const safariFixWidth = (this.paddingCorrection - this.sliderGap) / BROWSER_CONTEXT\n this.safariFix.style.setProperty('width', safariFixWidth + 'rem')\n }\n\n #calculateItemsPerSlide() {\n // For asynchronous slider content, if initSlider() is called twice, we need to remove first this class\n this.carousel.classList.remove('no-slides')\n\n let itemWidth = this.itemWidth\n\n // If itemWidth is not provided or 'auto', we need to calculate an average width for items that doesn't have fixed width\n if (this.itemWidth === undefined || this.itemWidth === 'auto') {\n itemWidth =\n (this.carousel.scrollWidth - this.sliderGap * (this.itemNumber - 1)) /\n this.itemNumber\n }\n\n this.itemsPerSlide = Math.floor(this.carousel.offsetWidth / itemWidth)\n // TODO: the fix below doesn't work, needs to be resolved.\n // const isLastElementSingle =\n // this.slidesElements[this.slidesElements.length - 2].offsetWidth +\n // this.slidesElements[this.slidesElements.length - 1].offsetWidth >\n // this.carousel.offsetWidth\n\n // this.itemsPerSlide = isLastElementSingle\n // ? 0\n // : Math.floor(this.carousel.offsetWidth / itemWidth)\n }\n\n #getSliderPositions() {\n this.sliderPositions = []\n this.maxScroll = this.carousel.scrollWidth - this.carousel.offsetWidth\n\n if (this.slidesElements.length === 0) {\n return\n }\n\n // We need to manage the first item initial position in case the slides are\n // visible on each side (equivalent to scroll-padding CSS of ul.nn-carousel)\n const firstItemOffsetLeft = this.slidesElements[0].offsetLeft\n\n this.querySelectorAll('.nn-carousel > li:not(.safari-fix)').forEach(element => {\n this.sliderPositions.push(element.offsetLeft - firstItemOffsetLeft)\n })\n }\n\n #setCss(name, value, isRem = false) {\n this.style.setProperty(name, isRem ? value / BROWSER_CONTEXT + 'rem' : value)\n }\n\n #setCssSlideWidth() {\n if (this.itemWidth === 'auto') {\n const itemWidthAuto =\n (this.container.clientWidth - (this.itemsPerSlide - 1) * this.sliderGap) /\n (this.itemsPerSlide || 1)\n this.#setCss('--item-width', itemWidthAuto, true)\n } else if (this.itemWidth) {\n this.#setCss('--item-width', this.itemWidth, true)\n }\n }\n\n #setCssSlideMinHeight() {\n if (this.slideMinHeight === 'auto') {\n this.#setCss('--slide-min-height', 'auto')\n } else if (this.slideMinHeight !== undefined) {\n this.#setCss('--slide-min-height', this.slideMinHeight, true)\n }\n }\n\n #setCssSliderGap() {\n if (this.sliderGap || this.sliderGap === 0) {\n this.#setCss('--slider-gap', this.sliderGap, true)\n }\n }\n\n #setCssFlexAuto() {\n if (this.flexAuto) {\n this.carousel.classList.add('flex-auto')\n }\n }\n\n #setCssPlaceholder() {\n if (this.placeholderBackground) {\n this.#setCss('--placeholder-background', this.placeholderBackground)\n }\n }\n\n #setCssItemsPerSlide() {\n this.#setCss('--items-per-slide', this.itemsPerSlide)\n }\n\n #applyCenteredLayout() {\n if (this.maxSlides > 0) {\n return\n }\n // If maxSlides is 0 or negative, it means that we have less items than needed to fulfill the carousel width\n // So to center the items (for example the bubbles when only 3) we need to apply a justify-content: center fix\n this.carousel.classList.add('no-slides')\n }\n\n /** Public Method **/\n updateSlider(index, instantly = false) {\n this.#getSliderPositions()\n this.goToSlide(parseInt(index), instantly)\n }\n\n #updateStates() {\n this.#setActiveButtons()\n this.#setActiveBullet()\n this.#setCounter()\n this.#setActiveSlides()\n }\n\n #updateStatesScroll(index) {\n this.#setActiveButtons(index)\n this.#setCounter()\n }\n\n #setActiveButtons(currentIndex) {\n if ((!this.displayButtons || this.maxSlides <= 0) && !this.displayCounter) {\n return\n }\n\n // First we remove all hide classes (because with pagination we can move from more than 2 slides)\n this.prevButton.classList.remove('hide')\n this.nextButton.classList.remove('hide')\n\n // Then we reset hide class on the right button\n if (this.currentIndex === 0) {\n this.prevButton.classList.add('hide')\n } else if (this.currentIndex === this.maxSlides || currentIndex === this.maxSlides) {\n this.nextButton.classList.add('hide')\n }\n }\n\n #setActiveBullet() {\n if (!this.displayNav || this.maxSlides <= 0) {\n return\n }\n\n this.navElements.forEach(item => {\n item.classList.remove('active')\n })\n\n this.navElements[this.currentIndex].classList.add('active')\n }\n\n #setCounter() {\n if (!this.displayCounter || this.maxSlides === 0) {\n return\n }\n\n if (!this.displayCounter) {\n return\n }\n\n this.counter.querySelector('.current').textContent = parseInt(this.currentIndex + 1)\n }\n\n #setActiveSlides() {\n // If we have no items overflowing on each side, we don't need to manage disabled slides\n if (!this.overflow) {\n return\n }\n\n this.slidesElements.forEach(element => {\n element.setAttribute('aria-disabled', 'true')\n })\n\n let tempIndex = parseInt(this.currentIndex)\n for (let i = 0; i < this.itemsPerSlide; i++) {\n if (this.slidesElements[tempIndex + i]) {\n this.slidesElements[tempIndex + i].removeAttribute('aria-disabled')\n }\n }\n }\n\n /** Public Method **/\n goToSlide(index, instantly = false) {\n if (index !== undefined) {\n this.currentIndex = index\n }\n\n // If index is over maxSlides, it means we reached out the end of scroll, so we don't need to update states anymore\n if (index < this.maxSlides) {\n this.#updateStates()\n }\n\n // We scroll to the right position (scrollTo duration is approx 750ms)\n this.carousel.scrollTo({\n left: this.sliderPositions[parseInt(this.currentIndex, 10)],\n behavior: instantly ? 'auto' : 'smooth'\n })\n }\n\n #gotoDefaultPosition() {\n if (this.defaultPosition === 0 || this.defaultPosition > this.maxSlides + 1) {\n return\n }\n this.goToSlide(this.defaultPosition, true)\n }\n\n #onScroll() {\n // Clear our timeout throughout the scroll\n if (this.isScrolling) {\n clearTimeout(this.isScrolling)\n }\n\n this.#setOpacity()\n\n // Set a timeout to run after scrolling ends\n this.isScrolling = setTimeout(() => {\n // Update the expected scroll positions again as sometimes they are initially incorrect\n this.#getSliderPositions()\n\n const carouselScrollLeft = Math.round(this.carousel.scrollLeft)\n\n // Ideal use case (exact pixel value)\n let index = this.sliderPositions.indexOf(carouselScrollLeft)\n\n // Sometimes the scrollLeft value can be +1 or -1 pixels. If the position is not found\n // then the index will be -1. In this case, try searching the list of positions to see\n // if the scroll position is one pixel left or right of the expected position (hence\n // using -1 and +1 in the indexOf() call below)\n if (index === -1) {\n index = this.sliderPositions.indexOf(carouselScrollLeft - 1)\n }\n if (index === -1) {\n index = this.sliderPositions.indexOf(carouselScrollLeft + 1)\n }\n\n // For items with flexible width (flex_auto) the last position of the scroll can not match an exact SliderPositions\n if (carouselScrollLeft === this.maxScroll) {\n index = this.maxSlides\n }\n\n if (index >= 0) {\n this.#switchBullets(index, true)\n }\n\n this.#updateStatesScroll(index)\n }, 100)\n }\n\n #getOpacityParams() {\n if (!this.overflow || !this.slidesElements.length) {\n return\n }\n // Set properties used for slide opacity calculation in #setOpacity()\n this.paddingCorrection = parseInt(\n getComputedStyle(this.carousel).getPropertyValue('padding-left')\n )\n\n this.itemWidthAdjusted = this.slidesElements[0].offsetWidth + this.sliderGap\n }\n\n #setOpacity() {\n if (!this.overflow) {\n return\n }\n const scrollX = this.carousel.scrollLeft\n\n this.slidesElements.forEach((item, index) => {\n // Adjust item offsetLeft because of slider padding on each side\n const itemOffsetLeft = item.offsetLeft - this.paddingCorrection\n // Adjust item offsetLeft to add itemWidth + sliderGap\n let itemX = itemOffsetLeft + this.itemWidthAdjusted\n\n // Determine if we need to calculate left or right items\n let percentage = 100\n\n if (scrollX > itemX) {\n // Avoid calculation if item is outside on left\n percentage = 0\n } else if (scrollX >= this.itemWidthAdjusted * index) {\n // Do left calculations\n percentage = Math.round(((itemX - scrollX) / this.itemWidthAdjusted) * 100)\n } else if (scrollX < itemX - (1 + this.itemsPerSlide) * this.itemWidthAdjusted) {\n // Avoid calculation if item is outside on right\n percentage = 0\n } else if (scrollX <= itemX - this.itemsPerSlide * this.itemWidthAdjusted) {\n // Do right calculations\n percentage = Math.round(\n (this.itemsPerSlide + 1) * 100 -\n ((itemX - scrollX) / this.itemWidthAdjusted) * 100\n )\n }\n\n const opacityPercentage = percentage / 100\n let finalOpacity =\n Math.round(\n (opacityPercentage * (1 - this.overflowOpacity) + this.overflowOpacity) * 100\n ) / 100\n\n item.firstElementChild.style.setProperty('opacity', finalOpacity)\n })\n }\n\n #switchBullets(index, alreadyScrolled = false) {\n if (!this.slidesElements[index]) {\n return\n }\n\n this.currentIndex = index\n\n // only fires goToSlide if user clicks on pagination buttons\n if (!alreadyScrolled) {\n this.goToSlide()\n } else {\n this.#updateStates()\n }\n }\n\n #onPrevClick() {\n if (this.currentIndex > 0) {\n this.currentIndex = this.currentIndex - 1\n this.#updateStates()\n }\n this.goToSlide()\n }\n\n #onNextClick() {\n if (this.currentIndex < this.maxSlides) {\n this.currentIndex = this.currentIndex + 1\n this.#updateStates()\n }\n this.goToSlide()\n }\n\n #onNavClick(e) {\n this.currentIndex = parseInt(e.target.dataset.item)\n this.#setActiveBullet()\n this.#switchBullets(this.currentIndex)\n }\n\n #dispatchReady() {\n dispatchEvent({\n eventName: EVENT_SLIDER_READY,\n args: { id: this.id },\n element: this\n })\n }\n\n #bindEvent() {\n this.#unbindEvent()\n\n this.carousel.addEventListener('scroll', this.boundScroll)\n if (this.prevButton) {\n this.prevButton.addEventListener('click', this.boundPrevClick)\n }\n if (this.nextButton) {\n this.nextButton.addEventListener('click', this.boundNextClick)\n }\n if (this.navElements) {\n this.navElements.forEach(element => {\n element.addEventListener('click', this.boundNavClick)\n })\n }\n }\n\n #unbindEvent() {\n this.carousel.removeEventListener('scroll', this.boundScroll)\n if (this.prevButton) {\n this.prevButton.removeEventListener('click', this.boundPrevClick)\n }\n if (this.nextButton) {\n this.nextButton.removeEventListener('click', this.boundNextClick)\n }\n if (this.navElements) {\n this.navElements.forEach(element => {\n element.removeEventListener('click', this.boundNavClick)\n })\n }\n }\n\n disconnectedCallback() {\n this.#unbindEvent()\n }\n}\n\ncustomElements.get('nb-slider-natural') || customElements.define('nb-slider-natural', SliderNatural)\n\nexport default SliderNatural\n","import { CONTRAST_DARK, CONTRAST_LIGHT } from '@kissui/components'\n\nexport const getOppositeContrast = contrast => {\n return contrast === CONTRAST_LIGHT ? CONTRAST_DARK : CONTRAST_LIGHT\n}\n","export const isIOS = () => {\n const agent = window.navigator.userAgent,\n start = agent.indexOf('OS ')\n return (agent.indexOf('iPhone') > -1 || agent.indexOf('iPad') > -1) && start > -1\n}\n\nexport const isMacOS = () => {\n const agent = window.navigator.userAgent,\n start = agent.indexOf('OS ')\n return agent.indexOf('Mac') > -1 && start > -1\n}\n\nexport const isApple = () => {\n const agent = window.navigator.userAgent,\n start = agent.indexOf('OS ')\n return (\n (agent.indexOf('iPhone') > -1 || agent.indexOf('iPad') > -1 || agent.indexOf('Mac') > -1) &&\n start > -1\n )\n}\n\nexport const isAndroid = () => {\n const agent = window.navigator.userAgent,\n start = agent.indexOf('Android ')\n return start > -1\n}\n\nexport const isHuawei = () => {\n const agent = window.navigator.userAgent,\n start = agent.indexOf('HUAWEI'),\n devices = navigator.userAgent.match(\n /ALP-|AMN-|ANA-|ANE-|ANG-|AQM-|ARS-|ART-|ATU-|BAC-|BLA-|BRQ-|CAG-|CAM-|CAN-|CAZ-|CDL-|CDY-|CLT-|CRO-|CUN-|DIG-|DRA-|DUA-|DUB-|DVC-|ELE-|ELS-|EML-|EVA-|EVR-|FIG-|FLA-|FRL-|GLK-|HMA-|HW-|HWI-|INE-|JAT-|JEF-|JER-|JKM-|JNY-|JSC-|LDN-|LIO-|LON-|LUA-|LYA-|LYO-|MAR-|MED-|MHA-|MLA-|MRD-|MYA-|NCE-|NEO-|NOH-|NOP-|OCE-|PAR-|PIC-|POT-|PPA-|PRA-|RNE-|SEA-|SLA-|SNE-|SPN-|STK-|TAH-|TAS-|TET-|TRT-|VCE-|VIE-|VKY-|VNS-|VOG-|VTR-|WAS-|WKG-|WLZ-|YAL/i\n )\n return start > -1 || devices !== null\n}\n\nexport const isSafari = () => {\n // https://stackoverflow.com/questions/7944460/detect-safari-browser\n // This includes Chrome on IOS which seems to be Safari, So it's fully OK !\n const agent = window.navigator.userAgent\n return /^((?!chrome|android).)*safari/i.test(agent)\n}\n\nexport const isWebInspector = () => {\n // https://stackoverflow.com/questions/19877924/what-is-the-list-of-possible-values-for-navigator-platform-as-of-today\n // If we are in a web inspector, in our Nespresso context platform can be MacIntel or eventually Win32 for windows users\n const platform = window.navigator.platform\n return platform.indexOf('MacIntel') > -1 || platform.indexOf('Win32') > -1\n}\n","const createRefs = component => [...component.querySelectorAll('[data-ref]')].reduce(extract, {})\n\nconst extract = (refs, $ref) => {\n const { ref } = $ref.dataset\n\n // Check if ref is of type array\n const refArray = ref.match(/(\\w+)\\[(.+)\\]/)\n\n if (refArray !== null) {\n return getRefArray(refs, $ref, refArray)\n } else {\n return { ...refs, [$ref.dataset.ref]: $ref }\n }\n}\n\nconst getRefArray = (refs, $ref, [, name, index]) => {\n if (refs[name] === undefined) {\n refs[name] = []\n }\n refs[name][index] = $ref\n return refs\n}\n\nexport default createRefs\n","import viewportHelper from './viewport.helpers'\n\n/**\n * Resize image on the fly by Akamai\n * https://dsu-confluence.nestle.biz/x/06kaCQ\n * https://dsu-confluence.nestle.biz/display/EUXUI/Performance?preview=/152742355/152761429/IMPoliciesExtract-31072020.docx\n * @param {''|'carouselBannerNarrowMedium'|'carouselBannerWide'|'horizontalBannerNarrow'|'landscapeRecipeDetails'|'large'|'medium'|'portraitRecipeDetails'|'productPdpMainDefault'|'productPdpMain'|'productPdpSafeZone'|'product'|'recipeCard'|'registrationTechChoiceMediumLarge'|'resize_crop'|'small'} policy - IM Policy coming from Akamaï\n * @param {24|150|320|640|1024|2048|5000} width - IM Width size of the image\n * @returns {string} - Rules apply in a query string parameter\n */\nexport const getImpolicy = (policy = 'product', width = 160) => {\n const rules = []\n\n if (policy) {\n rules.push(`impolicy=${policy}`)\n }\n\n if (width) {\n rules.push(`imwidth=${width}`)\n }\n\n return `?${rules.join('&')}`\n}\n\n/**\n * Ask the right resolution depending on breakpoint, returns the closest one\n * No need to give a retina resolution, Akamai will return Retina automatically (you need to give the normal resolution)\n * @param {''|'medium'} policy - IM Policy coming from Akamaï, default is medium because it have the largest batch of resolutions\n * @param {''|'375'} mobileWidth - Mobile image width to be served | 375 default is full mobile screen width\n * @param {''|'1024'} tabletWidth - Tablet image width to be served | 1024 default is full tablet landscape screen width\n * @param {''|'1920'} desktopWidth - Desktop image width to be served | 1024 default is full tablet landscape screen width\n * @returns {string} - Rules to concatenate to your image url\n */\nexport const getResponsiveImpolicy = (\n policy = 'medium',\n mobileWidth = '375',\n tabletWidth = '1024',\n desktopWidth = '1920',\n retinaWidth = '3840'\n) => {\n if (viewportHelper.is.mobile) {\n return getImpolicy(policy, mobileWidth)\n } else if (viewportHelper.is.tablet) {\n return getImpolicy(policy, tabletWidth)\n } else if (viewportHelper.is.desktop) {\n return getImpolicy(policy, desktopWidth)\n } else {\n return getImpolicy(policy, retinaWidth)\n }\n}\n","export const STATE_DEFAULT = 'default'\nexport const STATE_SELECTED = 'selected'\nexport const STATE_DISABLED = 'disabled'\n","import createProps from '@kissui/helpers/src/props.helpers'\nimport createRefs from '@kissui/helpers/src/refs.helpers'\nimport { lazyLoad, getHashLink } from '@kissui/helpers/src/utils'\nimport { getResponsiveImpolicy } from '@kissui/helpers/src/impolicy'\nimport { selectPromotion } from '@kissui/helpers/src/gtmEvents'\n\nimport { STATE_SELECTED, STATE_DISABLED } from './js/constants'\n\nclass Bubble extends HTMLElement {\n constructor() {\n super()\n this.classList.add('nb-bubble')\n }\n\n static get observedAttributes() {\n return ['state']\n }\n\n attributeChangedCallback(name) {\n if (name === 'state') {\n this.setState()\n }\n }\n\n connectedCallback() {\n this.props = createProps(this.attributes)\n this.render()\n this.refs = createRefs(this)\n this.initLazyLoad()\n this.initTracking()\n }\n\n initTracking() {\n const { label, campaign } = this.props\n\n const link = this.querySelector('a')\n\n if (link) {\n link.onclick = () => {\n selectPromotion({\n cta_name: label,\n ...campaign\n })\n }\n }\n }\n\n initLazyLoad() {\n let { src = '', src_retina = '' } = this.props.visual\n const { visual } = this.refs\n\n // If src_retina is not provided by markets, then takes the src as default\n if (src_retina === '') {\n src_retina = src\n }\n\n src_retina += getResponsiveImpolicy('small', '144', '160', '80', '160')\n src_retina += '&imdensity=1'\n\n if (visual && src_retina) {\n lazyLoad(visual, 'src', `${src_retina}`, src_retina)\n }\n }\n\n render() {\n const { label, link, state, a11y_scrollto = 'Scroll to' } = this.props\n const { linkNoHash, linkHash } = getHashLink(link)\n\n this.innerHTML = `\n ${\n state === STATE_DISABLED\n ? this.renderVisual()\n : `<a href=\"${linkHash}\" data-href=\"${linkNoHash}\" aria-label='${a11y_scrollto} ${label}'>\n ${this.renderVisual()}\n </a>`\n }\n\n ${this.renderLabel()}\n `\n\n this.link = this.querySelector('a')\n this.label = this.querySelector('span')\n state && this.setAttribute('state', state)\n this.setTheme()\n }\n\n setState() {\n const state = this.getAttribute('state')\n\n if (state === STATE_SELECTED) {\n this.link.setAttribute('aria-current', 'true')\n this.label.classList.add('t-xs-700-sl')\n this.label.classList.remove('t-xs-500-sl')\n } else {\n if (state !== STATE_DISABLED) {\n this.link.removeAttribute('aria-current')\n }\n\n this.label.classList.remove('t-xs-700-sl')\n this.label.classList.add('t-xs-500-sl')\n }\n }\n\n setTheme() {\n const { theme } = this.props\n\n if (theme && theme !== '') {\n this.style.setProperty('--placeholder-background', theme)\n }\n }\n\n renderVisual() {\n let { src = '', src_retina = '' } = this.props.visual\n const { state } = this.props\n\n if (src === '' && src_retina === '') {\n return ''\n }\n\n // Image is decorative, we can have alt=\"\" and aria-hidden should be true\n return `<img src=\"\" alt=\"\" aria-hidden=\"true\" data-ref=\"visual\" ${\n state === STATE_DISABLED ? 'class=\"is-disabled\"' : ''\n }/>`\n }\n\n renderLabel() {\n const { label, state } = this.props\n\n if (!label) {\n return\n }\n\n return `<span class=\"t-xs-500-sl ${\n state === STATE_DISABLED ? 'is-disabled' : ''\n }\">${label}</span>`\n }\n}\n\ncustomElements.get('nb-bubble') || customElements.define('nb-bubble', Bubble)\n\nexport default Bubble\n","/**\n * @typedef {Object} ObserverItem\n * @property {String} selector - target element selector\n * @property {Object} options - IntersectionObserver options\n * @property {Function} callback - function to call on threshold crossed\n */\n\nclass IntersectionObserverService {\n constructor() {\n this.observers = new Map()\n }\n\n /**\n * Creates a Map of ObserverItem objects, unique for each selector provided.\n * Each selector has its own configurable observer, target elements and callback.\n * Observers can be individually unobserved / destroyed.\n * @param {ObserverItem[]} observables\n */\n create(observables) {\n observables.forEach(({ selector, callback, options }) => {\n if (this.observers.has(selector)) {\n console.warn(`Observer for selector \"${selector}\" already exists`)\n return\n }\n\n const targets = document.querySelectorAll(selector)\n\n if (targets.length === 0) {\n console.warn(`No elements found for selector \"${selector}\"`)\n return\n }\n\n const observer = new IntersectionObserver(callback, options)\n targets.forEach(element => observer.observe(element))\n this.observers.set(selector, { observer, targets })\n })\n }\n\n /**\n * Unobserve for specified selector\n * @param {String} selector\n */\n unobserve(selector) {\n const entry = this.observers.get(selector)\n\n if (entry) {\n const { observer, targets } = entry\n targets.forEach(element => observer.unobserve(element))\n } else {\n console.warn(`No observer found for selector \"${selector}\"`)\n }\n }\n\n /**\n * Disconnect observer for specified selector\n * @param {String} selector\n */\n destroy(selector) {\n const entry = this.observers.get(selector)\n\n if (entry) {\n const { observer } = entry\n observer.disconnect()\n this.observers.delete(selector)\n } else {\n console.warn(`No observer found for selector \"${selector}\"`)\n }\n }\n\n /**\n * Disconnect all observers\n */\n destroyAll() {\n this.observers.forEach(entry => {\n entry.observer.disconnect()\n })\n\n this.observers.clear()\n }\n}\n\nexport default IntersectionObserverService\n","export const EVENT_NAVIGATION_SECTION_CHANGE = 'EVENT_NAVIGATION_SECTION_CHANGE'\n\n// In mobile / tablet / sticky we need a dynamic number of slides as it's a variable width\n// This 'auto' value is valid with new slider-natural, it calculates the available space and set automatically the good itemsPerSlide\nexport const NB_SLIDES_MOBILE = 'auto'\nexport const NB_SLIDES_TABLET = 'auto'\nexport const NB_SLIDES_DESKTOP = 9\nexport const NB_SLIDES_STICKY = 'auto'\n\nexport const INTERSECTION_RATIOS_SECTION = [0.2, 0.8]\n\nexport const BUBBLE_MOBILE_WIDTH = '104'\nexport const BUBBLE_TABLET_DESKTOP_WIDTH = '112'\nexport const GRADIENT_WIDTH = '8'\n\nexport const SLIDER_CONFIG_DEFAULT = {\n display_gradients: 'true',\n display_nav: 'false',\n overflow: 'false',\n placeholder_background: 'transparent',\n slide_min_height: 'auto',\n slider_gap: '0'\n}\n","import { dispatchEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\nimport eventsHelper from '@kissui/helpers/src/events.helpers'\nimport IntersectionObserverService from '@kissui/helpers/src/intersection-observer.service'\nimport createProps from '@kissui/helpers/src/props.helpers.js'\nimport createRefs from '@kissui/helpers/src/refs.helpers'\nimport scrollTo from '@kissui/helpers/src/scrollTo'\nimport { getHashLink, stringifyForAttribute } from '@kissui/helpers/src/utils'\nimport { COLOR_WHITE_1000 } from '../constants.mjs'\nimport eventsManager from './services/events.manager'\n\nimport { BREAKPOINT_M } from '@kissui/components'\nimport {\n BUBBLE_MOBILE_WIDTH,\n BUBBLE_TABLET_DESKTOP_WIDTH,\n EVENT_NAVIGATION_SECTION_CHANGE,\n GRADIENT_WIDTH,\n INTERSECTION_RATIOS_SECTION,\n NB_SLIDES_DESKTOP,\n NB_SLIDES_MOBILE,\n NB_SLIDES_STICKY,\n NB_SLIDES_TABLET,\n SLIDER_CONFIG_DEFAULT\n} from './data/constants'\n\nclass NavigationBubbles extends HTMLElement {\n constructor() {\n super()\n this.isMobile = window.innerWidth < BREAKPOINT_M\n // Used to prevent observer to fire a section change event\n // if navigation click already did it\n this.isScrolling = false\n this.scrollObserver = new IntersectionObserverService()\n }\n\n connectedCallback() {\n this.props = createProps(this.attributes)\n this.classList.add('nb-navigation-bubbles')\n this.sticky = this.isSticky()\n this.type = this.sticky ? 'Chip' : 'Bubble'\n this.isCenteredItems = this.props.is_centered_items ? 'true' : 'false'\n this.setAttribute('type', this.type.toLowerCase())\n this.setAttribute('is-centered-items', this.isCenteredItems)\n this.init()\n }\n\n isSticky() {\n if (!this.props) {\n return false\n }\n const { sticky = 'false' } = this.props\n return sticky === 'true'\n }\n\n init() {\n this.render()\n this.refs = createRefs(this)\n this.slider = this.querySelector('nb-slider-natural')\n this.eventsListeners = eventsManager(this).createListeners(this.slider)\n this.scrollObserver.create([\n {\n selector: '[data-id]',\n callback: this.onSectionChange,\n options: {\n threshold: INTERSECTION_RATIOS_SECTION,\n rootMargin: '-160px 0px 0px 0px'\n }\n }\n ])\n }\n\n render() {\n this.innerHTML = `${this.renderNavigation()}`\n }\n\n getSliderOptions() {\n return {\n flex_auto: this.sticky ? 'true' : 'false',\n gradients_color: this.sticky ? COLOR_WHITE_1000 : undefined,\n gradients_width: this.sticky ? GRADIENT_WIDTH : undefined,\n ...SLIDER_CONFIG_DEFAULT\n }\n }\n\n renderNavigation() {\n const {\n slider_id,\n a11y_slider_previous_button,\n a11y_slider_next_button,\n a11y_goto_slide = 'Goto slide',\n campaign\n } = this.props\n\n // Pass render function name by element type (Chip/Bubble)\n const list = this.renderList(`render${this.type}`)\n\n const sliderOptions = this.getSliderOptions()\n const sliderData = {\n options: {\n mobile: {\n items_per_slide: this.sticky ? NB_SLIDES_STICKY : NB_SLIDES_MOBILE,\n item_width: this.sticky ? 'auto' : BUBBLE_MOBILE_WIDTH,\n display_buttons: 'false',\n ...sliderOptions\n },\n tablet: {\n items_per_slide: this.sticky ? NB_SLIDES_STICKY : NB_SLIDES_TABLET,\n item_width: this.sticky ? 'auto' : BUBBLE_TABLET_DESKTOP_WIDTH,\n display_buttons: 'true',\n ...sliderOptions\n },\n desktop: {\n items_per_slide: this.sticky ? NB_SLIDES_STICKY : NB_SLIDES_DESKTOP,\n item_width: this.sticky ? 'auto' : BUBBLE_TABLET_DESKTOP_WIDTH,\n ...sliderOptions\n }\n },\n a11y_labels: {\n prev: a11y_slider_previous_button,\n next: a11y_slider_next_button,\n nav: a11y_goto_slide\n },\n campaign\n }\n\n const slider = `<nb-slider-natural\n id='${slider_id}'\n data=\"${stringifyForAttribute(sliderData)}\"\n data-ref=\"slider${this.type}\">\n ${list}\n </nb-slider-natural>`\n\n if (this.sticky) {\n return slider\n }\n\n return `<nb-container contrast=\"light\">${slider}</nb-container>`\n }\n\n renderList(renderFunction) {\n const { bubbles = [] } = this.props\n\n const output = bubbles\n .map(bubble => ({ ...bubble, campaign: this.props.campaign || undefined }))\n .map(bubble => this[renderFunction](bubble))\n .join('')\n\n return output\n }\n\n renderBubble(bubble) {\n let { link, campaign } = bubble\n if (!link) {\n return null\n }\n const { linkNoHash } = getHashLink(link)\n\n const bubbleWithCampaign = { ...bubble, campaign }\n\n return `\n <li>\n <nb-bubble data=\"${stringifyForAttribute(\n bubbleWithCampaign\n )}\" data-ref=\"bubbles[${linkNoHash}]\"></nb-bubble>\n </li>\n `\n }\n\n renderChip(chip) {\n const { link } = chip\n if (!link) {\n return null\n }\n const { linkNoHash, linkHash } = getHashLink(link)\n\n return `\n <li>\n <a href=\"${linkHash}\" data-href='${linkNoHash}' class=\"is-link\" tabindex=\"-1\" >\n <nb-chip\n background_image=\"${chip.visual.src}\"\n data-ref=\"chips[${linkNoHash}]\"\n rounded=\"false\"\n campaign_id=\"${chip.campaign?.id}\"\n campaign_name=\"${chip.campaign?.name}\"\n campaign_creative=\"${chip.campaign?.creative}\"\n campaign_position=\"${chip.campaign?.position}\"\n >\n ${chip.label}\n </nb-chip>\n </a>\n </li>\n `\n }\n\n // Called from events-manager.js, coupled code\n updateLayout() {\n this.geometry = this.getGeometry()\n }\n\n updateBubbles(sectionId) {\n const { bubbles = {} } = this.refs\n for (const bubbleId in bubbles) {\n const bubble = bubbles[bubbleId]\n const state = bubbleId === sectionId ? 'selected' : 'default'\n if (typeof bubble.setAttribute === 'function') {\n bubble.setAttribute('state', state)\n }\n }\n }\n\n updateChips(sectionId) {\n const { chips = {} } = this.refs\n for (const chipId in chips) {\n const chip = chips[chipId]\n const isChecked = chipId === sectionId ? 'true' : 'false'\n chip.setAttribute && chip.setAttribute('checked', isChecked)\n }\n }\n\n async updateSlider(sectionId, _index) {\n let index = _index\n const slider = await this.refs.sliderChip\n if (slider) {\n if (typeof _index === 'undefined') {\n const links = slider.querySelectorAll('a[data-href]')\n links.forEach((link, i) => {\n if (link.getAttribute('data-href') === sectionId) {\n index = i\n }\n })\n }\n if (index && slider && slider.goToSlide) {\n slider.goToSlide(index)\n }\n }\n }\n\n emit(event) {\n dispatchEvent({ element: this, ...event })\n }\n\n async scroll(link, index) {\n this.isScrolling = true\n const linkHref = link.getAttribute('data-href')\n const target = linkHref\n const { header, chips } = this.geometry\n\n // When clicking on first anchor we force height to 0 because sticky bar is usually not displayed yet\n const stickyBarHeight = index === 0 ? 0 : chips.height\n\n const scrollPaddingTop = header.top + header.height + stickyBarHeight\n const scrollOptions = { scrollPaddingTop }\n\n await scrollTo(`[data-id=\"${target}\"]`, scrollOptions)\n this.isScrolling = false\n\n // After scrolling visually, we need to give focus to the section for keyboard navigation\n const targetEl = document.querySelector(`[data-id=\"${target}\"]`)\n targetEl.focus({ preventScroll: true })\n }\n\n track() {\n //no-op as per https://nestle.atlassian.net/browse/DIGEX-12371?focusedCommentId=2903998\n }\n\n getGeometry() {\n const $header = document.querySelector('.Header__top')\n const $stickyBar = document.querySelector('nb-plp-sticky-bar')\n\n const headerRect = $header?.getBoundingClientRect() || { height: 0, y: 0 }\n const stickyBarRect = $stickyBar?.getBoundingClientRect() || { height: 0, y: 0 }\n\n return {\n header: { height: headerRect.height, top: headerRect.y },\n chips: { height: stickyBarRect.height, top: stickyBarRect.y }\n }\n }\n\n onSectionChange(entries) {\n const entry = entries[0]\n\n if (entry.isIntersecting && !this.isScrolling) {\n const { id = '' } = entry.target.dataset\n\n dispatchEvent({\n eventName: EVENT_NAVIGATION_SECTION_CHANGE,\n args: { sectionId: id || entry.target.getAttribute('data-id') }\n })\n }\n }\n\n disconnectedCallback() {\n eventsHelper.remove(this.eventsListeners)\n this.scrollObserver.destroy('[data-id]')\n }\n}\n\ncustomElements.get('nb-navigation-bubbles') ||\n customElements.define('nb-navigation-bubbles', NavigationBubbles)\n\nexport default NavigationBubbles\n","// TODO move the responsabiliy of the links to the correct component\nimport eventsHelper from '@kissui/helpers/src/events.helpers'\nimport { readEvent, dispatchEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\n\nimport { EVENT_HEADER_POSITION_CHANGED, EVENT_SLIDER_READY } from '@kissui/components'\n\nimport { EVENT_NAVIGATION_SECTION_CHANGE } from '../data/constants'\n\nconst eventsManager = rootElement => {\n const bindSliderLinksEvents = slider => {\n // We need to wait for EVENT_SLIDER_READY before getting geometry for chips slider to have height\n rootElement.geometry = rootElement.getGeometry()\n\n const links = slider.querySelectorAll('a')\n\n for (const [index, link] of links.entries()) {\n link.addEventListener('click', onSliderLinkClick.bind(this, index))\n }\n }\n\n const onSliderLinkClick = (index, $event) => {\n $event.preventDefault()\n\n const link = $event.target.closest('a')\n\n if (link) {\n dispatchEvent({\n eventName: EVENT_NAVIGATION_SECTION_CHANGE,\n args: { sectionId: link.getAttribute('data-href'), index }\n })\n\n rootElement.scroll && rootElement.scroll(link, index)\n window.location.hash = link.getAttribute('data-href')\n\n let finalLabel = '',\n plpListLabel = '',\n bubbleLabel = ''\n if (rootElement.closest('nb-plp-sticky-bar')) {\n bubbleLabel = link.querySelector('nb-chip label span').textContent\n plpListLabel = rootElement.props.selected_nav_link_label || ''\n } else {\n plpListLabel = rootElement.props.selected_nav_link_label || ''\n if (link.nextElementSibling.textContent) {\n bubbleLabel = link.nextElementSibling.textContent\n } else {\n bubbleLabel = link.getAttribute('aria-label')\n }\n }\n finalLabel = plpListLabel ? `${plpListLabel} : ${bubbleLabel}` : `${bubbleLabel}`\n rootElement.track(finalLabel)\n }\n }\n\n const onSectionChange = $event => {\n const { sectionId, index } = readEvent($event)\n\n rootElement.updateBubbles && rootElement.updateBubbles(sectionId)\n rootElement.updateChips && rootElement.updateChips(sectionId)\n rootElement.updateSlider && rootElement.updateSlider(sectionId, index)\n }\n\n const createListeners = slider => {\n const eventListeners = []\n\n if (slider) {\n eventListeners.push({\n element: rootElement,\n type: EVENT_SLIDER_READY,\n listener: bindSliderLinksEvents.bind(this, slider),\n options: { once: true }\n })\n }\n eventListeners.push({\n element: window,\n type: EVENT_NAVIGATION_SECTION_CHANGE,\n listener: onSectionChange\n })\n eventListeners.push({\n element: window,\n type: EVENT_HEADER_POSITION_CHANGED,\n listener: rootElement.updateLayout.bind(rootElement)\n })\n\n eventsHelper.add(eventListeners)\n\n return eventListeners\n }\n\n return { createListeners }\n}\n\nexport default eventsManager\n","import { getDataLayer } from '@kissui/helpers/src/dataLayer'\n\nexport async function setPLPDataProvider() {\n window.getPLPData = window.getPLPData || getPLPData\n}\n\nexport async function getPLPData() {\n return await window.plpData\n}\n\nexport async function market() {\n return napi.market().read() // eslint-disable-line\n}\n\nexport function getCurrency() {\n return getDataLayer().currency\n}\n\nexport async function getPriceFormatter() {\n return napi.priceFormat() // eslint-disable-line\n}\n","const runningExperiments = new Set<string>()\n\nexport function runningExperiment(experiment: string): Boolean {\n return runningExperiments.has(experiment)\n}\n\nexport function enableExperiment(experiment: string): void {\n runningExperiments.add(experiment)\n console.info('Running experiments:', ...runningExperiments.values())\n}\n\nexport function disableExperiment(experiment: string): void {\n runningExperiments.delete(experiment)\n console.info('Running experiments:', ...runningExperiments.values())\n}\n\n// List Current experiments\nexport const EXPLICIT_FILTERS = 'EXPLICIT_FILTERS'\n","// MAIN ID BLOCKS\nexport const FILTER_MAIN_BLOCK_ID = 'filtersPLP'\nexport const SORT_MENU_ID = 'plp-sort-menu'\nexport const SORT_MENU_MOBILE_ID = 'plp-sort-menu-mobile'\nexport const POPIN_ID = 'plp-filter-popin'\nexport const NAVIGATION_MAIN_BLOCK_ID = 'navigationPLP'\nexport const PRODUCTS_LIST_MAIN_BLOCK_ID = 'productsListPLP'\nexport const PRODUCTS_RESULTS_MAIN_BLOCK_ID = 'productsResultsPLP'\nexport const PRODUCTS_RESULTS_HEADER_ID = 'productsResultsHeaderPLP'\nexport const FILTER_BUTTON = 'plp-filter-cta'\nexport const CB_RESULTS_TOTAL_ID = 'cb-results-total-id'\nexport const MY_RECOMMENDATIONS_ID = 'my-recommendations'\n\n// URL variable\nexport const QUERY_URL_PARAMETER_FILTERS = 'filters'\nexport const QUERY_URL_PARAMETER_SORT = 'sort'\n","/**\n filtersPLP:\n navigationPLP\n productsListPLP\n productsResultsPLP\n\n data-request: not mutable // not to be changed\n data-response: mutable // changed by the component\n\n\n Don't:\n const dict = {\n 'foo': 1,\n 'bar': 2\n}\n\n Better:\n const dict = new Map([\n ['foo', 1],\n ['bar', 2]\n ])\n\n dict.get('foo');\n dict.set('foo', 2);\n dict.has('baz');\n dict.keys()\n\n */\nimport { stringifyForAttribute } from '@kissui/helpers/src/utils'\nimport { getPLPData, getPriceFormatter, market } from '@kissui/plp-data'\nimport { EXPLICIT_FILTERS, runningExperiment } from '../config/experiments'\nimport { MY_RECOMMENDATIONS_ID } from '../config/constants'\n\n// todo cache data if not changes\nconst appData = {\n _productsFlat: undefined,\n sessionId: '',\n\n init: async function (plpType) {\n window.plpDataType = plpType\n window.getPLPData = window.getPLPData || getPLPData\n this.set('sessionId', (Math.random() + 1).toString(36).substring(7))\n this.set('filtersSelected', [])\n this.set('sortCurrent', {})\n this.set('sortOptions', [])\n this.set('options', {})\n\n return window.getPLPData()\n },\n\n async reload() {\n this.set('sessionId', (Math.random() + 1).toString(36).substring(7))\n this.set('products', [])\n this.set('filters', [])\n this.set('filtersSelected', [])\n this.set('options', {})\n\n this._productsFlat = undefined\n\n return window.getPLPData()\n },\n\n // review if this pattern about set & get it's ok (I don't think so, because should be unmutable)\n set: function (key, value) {\n this[key] = value\n },\n get: function (key) {\n return this[key] || null\n },\n initPriceFormatter: function () {\n return getPriceFormatter()\n },\n initCurrency: function () {\n return market()\n },\n filters: [],\n products: [],\n productsList: function () {\n return this.products\n },\n\n getProducts() {\n if (this._productsFlat && this._productsFlat.length) {\n return this._productsFlat\n }\n\n this._productsFlat = this.products.reduce((acc, product) => {\n return acc.concat(product.products)\n }, [])\n\n return this._productsFlat\n },\n\n productsListFiltered: function ({ withSort = true } = {}) {\n const selectedFilters = this.get('filtersSelected')\n const filterPredicate = runningExperiment(EXPLICIT_FILTERS)\n ? filterProductsByFilterType(selectedFilters)\n : filterProductsByAllFilters(selectedFilters)\n const filteredList = this.getProducts().filter(filterPredicate)\n const sortCurrent = this.get('sortCurrent') ?? {}\n\n return withSort ? sortProducts(filteredList, sortCurrent) : filteredList\n },\n productsFilteredCount: function () {\n return this.productsListFiltered({ withSort: false }).length\n },\n /*\n * todo: refactor this function\n * fireAll should be true always, it's only true to performance improvement\n * the solution should be in the subscription site, right now we are subscribe to all changes,\n * but this is wrong should be subscribed only to some changes of the store using a seed/key\n * */\n filtersUpdate: function (filterSelection, fireAll = true) {\n const filter = this.get('filters').find(f => f.key === filterSelection.key)\n\n if (!filter) {\n return\n }\n\n setFilterValue(\n this.get('filtersSelected'),\n filter,\n filterSelection.value,\n filterSelection.selected\n )\n\n if (runningExperiment(EXPLICIT_FILTERS)) {\n this.filterChipsUpdate()\n }\n\n fireAll && this.fire()\n },\n filtersUpdateMultiple(key, valueSelections = Map()) {\n const filter = this.get('filters').find(f => f.key === key)\n const filtersSelected = this.get('filtersSelected')\n\n valueSelections.forEach((selected, value) => {\n const selectedCurrently = filtersSelected.find(\n f => f.key === filter.key && filterValueIsEqual(f, value)\n )\n\n if (selectedCurrently && selected) return\n setFilterValue(filtersSelected, filter, value, selected)\n })\n\n this.filterChipsUpdate()\n this.fire()\n },\n filtersSelectedWithLabel: function () {\n return this.get('filtersSelected').map(filter => {\n const { key: filterKey, value: filterValue } = filter\n const foundFilter = this.get('filters').find(f => f.key === filterKey)\n const filterLabel = foundFilter?.values.find(v => v.value === filterValue)?.label\n return {\n categoryTitle: foundFilter?.title,\n label: filterLabel,\n key: filterKey,\n value: filterValue\n }\n })\n },\n filtersSelectedCount: function () {\n return this.get('filtersSelected')?.length ?? 0\n },\n // todo modify this flow because the serilized attributes shouldn't be necessary\n filtersSelectedSerialized: function () {\n const filters = [this.get('sortCurrent'), ...this.get('filtersSelected')]\n return stringifyForAttribute(filters)\n },\n filtersReset: function () {\n this.set('filtersSelected', [])\n this.get('filters').forEach(filter => {\n filter.values.forEach(value => {\n value.selected = false\n value.disabled = false\n })\n })\n const sortCurrent = this.get('sortOptions')\n sortCurrent?.length && this.set('sortCurrent', sortCurrent[0])\n\n if (runningExperiment(EXPLICIT_FILTERS)) {\n this.filterChipsUpdate()\n }\n\n this.fire()\n },\n filterChipsUpdate() {\n const selectedFilters = this.get('filtersSelected')\n const productsList = this.getProducts()\n this.get('filters').forEach(filter => {\n filter.values.forEach(filterChip => {\n // hide product counts\n filterChip.productCount = null\n\n // maintain filter's presence when other filters in same group are selected\n const withoutGroup = selectedFilters.filter(\n selected => selected.key !== filterChip.filterKey\n )\n const onlyFilterInGroup = [...withoutGroup, filterChip]\n const predicate = filterProductsByFilterType(onlyFilterInGroup)\n filterChip.disabled = !productsList.find(predicate)\n })\n })\n },\n\n observers: [],\n subscribe: function (fn) {\n this.observers.push(fn)\n },\n unsubscribe: function (fnToRemove) {\n this.observers = this.observers.filter(fn => {\n if (fn !== fnToRemove) {\n return fn\n }\n })\n },\n fire: function () {\n this.observers.forEach(fn => {\n fn.call()\n })\n }\n}\n\nexport default appData\n\nfunction doesProductMatchFilter(product, filter) {\n const filterValue = filter.value\n const productPropValue = product[filter.filterKey || filter.key]\n switch (typeof productPropValue) {\n case 'string':\n return productPropValue === filterValue\n case 'number':\n return JSON.parse(`[${filterValue}]`).includes(productPropValue)\n default: {\n if (filterValue === MY_RECOMMENDATIONS_ID) {\n const recommendationProducts = appData.get('recommendation')?.products ?? []\n return recommendationProducts.some(p => p.id === product.id)\n }\n\n // check array values or\n // default to false for nullish values\n return productPropValue?.includes(filterValue) || false\n }\n }\n}\n\nfunction groupFiltersByType(filters = []) {\n /*\n group selected filters by key, e.g.\n {\n intensity: [1, 2, 3],\n collection: [a, b, c],\n }\n */\n return filters.reduce((all, filter) => {\n const filterKey = filter.key\n const current = all[filterKey] || []\n return {\n ...all,\n [filterKey]: [...current, filter]\n }\n }, {})\n}\n\nfunction filterProductsByFilterType(filters) {\n const groups = groupFiltersByType(filters)\n const types = Object.keys(groups)\n return (product, index, products) => {\n /*\n does product match at least one filter in each group, e.g.\n {\n intensity: [1, 2, 3],\n collection: [a, b, c],\n }\n matches\n {\n product: { intensity: 1 },\n product: { collection: a },\n }\n */\n return types.every(type => {\n return !!groups[type].find(filter => {\n return (\n doesProductMatchFilter(product, filter) &&\n products.findIndex(p => p.id === product.id) === index // Deduplicates\n )\n })\n })\n }\n}\n\nfunction filterProductsByAllFilters(filters = []) {\n return (product, index, products) => {\n return (\n // check that the product matches every filter selected\n filters.every(filter => {\n return doesProductMatchFilter(product, filter)\n }) && products.findIndex(p => p.id === product.id) === index // Deduplicates\n )\n }\n}\n\nfunction filterValueIsEqual(filterValue, value) {\n return Array.isArray(filterValue.value)\n ? filterValue.value.join(',') === value\n : filterValue.value === value\n}\n\nfunction setFilterValue(filtersSelected, filter, value, selected) {\n filter.values.forEach(filterValue => {\n // todo refactor this function\n let valueIsEqual = filterValueIsEqual(filterValue, value)\n if (!valueIsEqual) {\n return\n }\n\n filterValue.selected = selected\n if (selected) {\n filtersSelected.push({\n key: filter.key,\n value: value,\n color: filterValue.color || null\n })\n } else {\n filtersSelected.splice(\n 0,\n filtersSelected.length,\n ...filtersSelected.filter(\n fSelected => !(fSelected.key === filter.key && fSelected.value === value)\n )\n )\n }\n })\n}\n\nfunction createSorter({ key, order }) {\n const isAscending = order === 'asc'\n\n return (a, b) => {\n if (a[key] < b[key]) {\n return isAscending ? -1 : 1\n }\n if (a[key] > b[key]) {\n return isAscending ? 1 : -1\n }\n return 0\n }\n}\n\nfunction sortProducts(products, { key, order }) {\n const sorter = createSorter({ key, order })\n return [\n ...products.filter(p => p.inStock).sort(sorter),\n ...products.filter(p => !p.inStock).sort(sorter)\n ]\n}\n","import { customEvent } from '@kissui/helpers/src/gtmEvents'\nimport zoneTracking from '@kissui/helpers/src/assets/js/zoneTracking'\nimport { FILTER_MAIN_BLOCK_ID } from '../config/constants'\nimport appData from './plp.data'\n\nconst updateQueryStringParameter = (uri, key, value) => {\n const re = new RegExp('([?&])' + key + '=.*?(&|$)', 'i')\n const separator = uri.indexOf('?') !== -1 ? '&' : '?'\n return uri.match(re)\n ? uri.replace(re, '$1' + key + '=' + value + '$2')\n : uri + separator + key + '=' + value\n}\n\nexport const updateUrlVariable = (variable, queryArray) => {\n // we are removing the hash from the url\n const [path] = window.location.href.split('#')\n const value = encodeURIComponent(JSON.stringify(queryArray))\n const url = updateQueryStringParameter(path, variable, value)\n history.pushState(null, null, url)\n}\n\nexport const getUrlVariable = key => {\n const queryString = window.location.search\n const param = new URLSearchParams(queryString).get(key)\n\n if (!param) {\n return null\n }\n\n try {\n return JSON.parse(decodeURIComponent(param))\n } catch (err) {\n console.error('plp.actions-getUrlVariable: url parsing failed')\n return null\n }\n}\n\nconst defaultTracking = 'none selected'\n\nconst getSortTracking = data => {\n const { isSorted, sortKey, sortOrder } = data\n return `sort:${isSorted ? `${sortOrder}|${sortKey}` : defaultTracking}`\n}\n\nconst getFilterTracking = data => {\n const { isFiltered, filtersSelected } = data\n return `characteristics:${\n isFiltered\n ? // unique array of filter keys\n [...new Set(filtersSelected.map(filter => filter.key))].join(',')\n : defaultTracking\n }`\n}\n\nexport const trackInteraction = (data = {}) => {\n const { isSorted, isFiltered } = data\n const eventAction = 'PLP Filter click'\n\n if (!isSorted && !isFiltered) {\n customEvent({\n eventAction,\n eventLabel: defaultTracking\n })\n return\n }\n\n customEvent({\n eventAction,\n eventLabel: [getSortTracking(data), getFilterTracking(data)].join('|')\n })\n}\n\nexport const trackLoad = () => {\n const campaign = appData.get('campaign')\n const node = window.document.getElementById(FILTER_MAIN_BLOCK_ID)\n if (campaign) {\n zoneTracking(node, campaign)\n }\n}\n\nexport const cleanFilterDataXSS = (source, data) => {\n const cleanData = []\n data.forEach(item => {\n source.forEach(sourceItem => {\n if (sourceItem.key === item.key) {\n sourceItem.values.forEach(value => {\n if (item.value === value.value) {\n cleanData.push({\n key: sourceItem.key,\n value: value.value,\n selected: true\n })\n }\n })\n }\n })\n })\n\n return cleanData\n}\nexport const cleanSortDataXSS = (source, data) => {\n return [...source].filter(item => item.key === data.key && item.order === data.order)\n}\n","import { signal } from '@preact/signals'\nimport type { ModuleData } from './CremaService'\n\ntype ModuleName = 'ProductsList' | 'ProductDetails' | 'HeaderNavigation'\n\ntype PageStore = {\n [key: string]: string | undefined\n pageHtml?: string\n}\n\ntype SignalStore = {\n ProductsList: ModuleData\n ProductDetails: ModuleData\n HeaderNavigation: ModuleData\n}\n\ntype WindowCreamService = {\n pageStores: Map<string, PageStore>\n signalStore: SignalStore\n}\n\ndeclare global {\n interface Window {\n __crema_service__: WindowCreamService\n }\n}\n\n// Stored on window to allow sharing between page builder sections\n// Ideally this would be replaced by loading this service as a shared bundle in future\nwindow.__crema_service__ = window.__crema_service__ || {\n pageStores: new Map<string, PageStore>(),\n signalStore: {\n ProductsList: signal(undefined),\n ProductDetails: signal(undefined),\n HeaderNavigation: signal(undefined)\n }\n}\n\nconst pageStores = window.__crema_service__.pageStores\nconst signalStore = window.__crema_service__.signalStore\n\nexport function clear() {\n pageStores.clear()\n signalStore.ProductsList.value = undefined\n signalStore.ProductDetails.value = undefined\n signalStore.HeaderNavigation.value = undefined\n}\n\nexport function getPageHtml(url: string): string | undefined {\n const store = getStore(url)\n return store.pageHtml\n}\n\nexport function setPageHtml(url: string, html: string): void {\n const store = getStore(url)\n store.pageHtml = html\n}\n\nexport function getModuleData(moduleName: ModuleName): ModuleData {\n return signalStore[moduleName]\n}\n\nexport function setModuleData(moduleName: ModuleName, data: object | undefined): void {\n signalStore[moduleName].value = data\n}\n\nfunction getStore(url: string): PageStore {\n if (!pageStores.has(url)) {\n pageStores.set(url, {})\n }\n\n return pageStores.get(url) as PageStore\n}\n","import { Signal, batch } from '@preact/signals'\n\nimport * as store from './Store'\n\nconst parser = new DOMParser()\n\nexport type ModuleData<T = any> = Signal<Record<PropertyKey, T> | undefined>\n\nexport type HeaderNavigationMenuItem = {\n title: string,\n link: {\n url: string\n }\n}\n\nexport async function loadFromUrl(url: string, cacheOnly: boolean = false): Promise<void> {\n return batch(async () => {\n let html = store.getPageHtml(url)\n\n if (!html) {\n try {\n html = await fetchHtml(url)\n store.setPageHtml(url, html)\n } catch (error) {\n console.debug('Failed to load HTML', error)\n return\n }\n }\n\n if (!cacheOnly) {\n store.setModuleData('HeaderNavigation', parseModuleData(html, 'HeaderNavigationBar'))\n store.setModuleData('ProductsList', parseModuleData(html, 'ProductList'))\n store.setModuleData('ProductDetails', parseModuleData(html, 'ProductDetails'))\n }\n })\n}\n\nexport function loadFromPage(window: Window): void {\n batch(() => {\n const html = window.document.documentElement.innerHTML\n\n store.setModuleData('HeaderNavigation', parseModuleData(html, 'HeaderNavigationBar'))\n store.setModuleData('ProductsList', parseModuleData(html, 'ProductList'))\n store.setModuleData('ProductDetails', parseModuleData(html, 'ProductDetails'))\n\n // Only cache if we found either the PLP data or the PDP data\n if (\n store.getModuleData('HeaderNavigation').value &&\n (store.getModuleData('ProductsList').value ||\n store.getModuleData('ProductDetails').value)\n ) {\n store.setPageHtml(window.location.href, html)\n }\n })\n}\n\nexport function getProductsList(): ModuleData {\n return store.getModuleData('ProductsList')\n}\n\nexport function getProductDetails(): ModuleData {\n return store.getModuleData('ProductDetails')\n}\n\nexport function getHeaderNavigation(): ModuleData {\n return store.getModuleData('HeaderNavigation')\n}\n\nfunction parseModuleData(html: string, moduleName: string): ModuleData | undefined {\n try {\n const moduleScript = parseHtml(html, moduleName)\n return parseProductScript(moduleScript) as ModuleData\n } catch (error) {\n // Failed to parse module, but this could be expected if the module is not present\n return undefined\n }\n}\n\nasync function fetchHtml(url: string): Promise<string> {\n console.debug('Fetching HTML from', url)\n const response = await fetch(url)\n\n if (!response.ok) {\n throw new Error(`Failed to fetch from \"${url}\" - ${response.status}:${response.statusText}`)\n }\n\n const html = await response.text()\n\n return html\n}\n\nfunction parseHtml(html: string, moduleName: string): string {\n const document = parser.parseFromString(html, 'text/html')\n\n const scripts = document.querySelectorAll('script')\n for (const script of scripts) {\n const content = script.textContent ?? ''\n if (content.includes(`\"module\":\"${moduleName}\"`)) return content\n }\n\n throw new Error(`Failed to find module \"${moduleName}\"`)\n}\n\nfunction parseProductScript(script: string): object {\n const lines = script.split('\\n')\n for (const line of lines) {\n const trimmed = line.trim()\n if (trimmed.startsWith('window.ui.push(')) {\n const jsonString = trimmed.replace('window.ui.push(', '').slice(0, -2)\n return JSON.parse(jsonString)\n }\n }\n\n throw new Error('Failed to find UI data in script')\n}\n","import appData from './plp.data'\nimport {\n updateUrlVariable,\n getUrlVariable,\n trackInteraction,\n cleanFilterDataXSS,\n cleanSortDataXSS,\n trackLoad\n} from './plp.actions'\nimport { QUERY_URL_PARAMETER_FILTERS, QUERY_URL_PARAMETER_SORT } from '../config/constants'\nimport { getTrackingData } from '../helpers/tracking'\nimport { EXPLICIT_FILTERS, runningExperiment } from '../config/experiments'\nimport { loadFromUrl, getProductsList, loadFromPage } from '@kissui/crema-service'\nimport { filterActionEvent, filterTrackingFromPlpFilters } from '@kissui/helpers/src/gtmEvents'\n\n// todo find a better way to do this\nlet plpData = {}\nlet appStates = {}\n// one solution is make promise inside of promise\nconst isSorted = data => {\n return (\n data.get('sortCurrent').key !== data.get('sortOptions')[0].key ||\n data.get('sortCurrent').order !== data.get('sortOptions')[0].order\n )\n}\n\nconst isFiltered = data => data.filtersSelectedCount() !== 0\n\nexport default {\n onload: {\n process: function (e, handlePostEvent) {\n const { plpType, appStatesHandler } = e.detail.value\n\n appStates = appStatesHandler\n\n // initialize the store\n const init = appData.init(plpType)\n appData.set('plpType', plpType || null)\n appData.set('innerWidth', window.innerWidth)\n appData.set('innerHeight', window.innerHeight)\n\n // get market data\n const currency = appData.initCurrency()\n const priceFormatter = appData.initPriceFormatter()\n\n Promise.all([init, currency, priceFormatter])\n .then(values => {\n plpData = values[0]\n appData.set('currency', values[1].currency)\n appData.set('priceFormatter', values[2])\n handlePostEvent(new CustomEvent('onloadSuccess'))\n })\n .catch(err => {\n console.error(err)\n handlePostEvent(new CustomEvent('onloadError', { detail: { err } }))\n })\n\n if (runningExperiment(EXPLICIT_FILTERS)) {\n loadFromPage(window)\n }\n }\n },\n onReload: {\n async process(e, handlePostEvent) {\n const { plpType, url } = e.detail.value\n\n let data\n try {\n await loadFromUrl(url)\n data = getProductsList().value\n } catch (err) {\n console.error(err)\n return handlePostEvent(new CustomEvent('onloadError', { detail: { err } }))\n }\n\n window.plpData = Promise.resolve({\n techno: 'unknown', // Only used by mocks?\n data\n })\n\n simulatePageChange(url)\n\n try {\n // Reinitialize the store\n const [_data, currency, priceFormatter] = await Promise.all([\n appData.reload(plpType),\n appData.initCurrency(),\n appData.initPriceFormatter()\n ])\n plpData = _data // NOTE: Getting this from the appData is rather redundant\n appData.set('plpType', plpType || null)\n appData.set('innerWidth', window.innerWidth)\n appData.set('innerHeight', window.innerHeight)\n appData.set('currency', currency.currency)\n appData.set('priceFormatter', priceFormatter)\n handlePostEvent(new CustomEvent('onloadSuccess'))\n appData.fire()\n } catch (error) {\n console.error(error)\n handlePostEvent(new CustomEvent('onloadError', { detail: { error } }))\n }\n }\n },\n onloadSuccess: {\n nextState: function (e) {\n return appStates.onloadSuccess(e)\n }\n },\n onloadError: {\n nextState: function (e) {\n return appStates.showError(e)\n }\n },\n onMergeData: {\n // triggered from plp.app.js\n async process(e, handlePostEvent) {\n const {\n filtersService,\n productService,\n dataSortService,\n pageBuilderProps,\n recommendationService\n } = e.detail.value\n\n const recommendationInstance = recommendationService(pageBuilderProps)\n const dataToMerge = productService(\n plpData,\n pageBuilderProps,\n recommendationInstance?.recommendation\n )\n\n mergeData(dataToMerge)\n\n // Here we merge the data in a lazy way, the first interation is the\n // half-recommended data, missing the loading of products, which, since\n // it comes from Martech, may take longer than the rest. Then, in order\n // not to block the rest, while the spinner is displayed, the mergeData\n // is loaded and processed again.\n if (recommendationInstance?.readyToLoadProducts?.()) {\n await recommendationInstance.loadProducts()\n const newData = productService(\n plpData,\n pageBuilderProps,\n recommendationInstance?.recommendation\n )\n appData.set('recommendation', recommendationInstance.recommendation)\n mergeData(newData)\n appData.fire()\n }\n\n function mergeData(data = {}) {\n mergeProductData(data, pageBuilderProps)\n mergeFilters(data, { pageBuilderProps, dataSortService, filtersService })\n setUrlOverrides()\n handleExperiments()\n trackLoad(pageBuilderProps)\n handlePostEvent(new CustomEvent('switchProductsPage'))\n }\n }\n },\n switchProductsPage: {\n nextState: function (e) {\n if (isSorted(appData) || isFiltered(appData)) {\n return appStates.readyForShowResults(e)\n } else {\n return appStates.readyForPlay(e)\n }\n }\n },\n onMergeDataError: {\n nextState: function (e) {\n return appStates.showError(e)\n }\n },\n onFilter: {\n process: (e, handlePostEvent) => {\n const filtersSelected = appData.get('filtersSelected')\n\n updateUrlVariable(QUERY_URL_PARAMETER_FILTERS, appData.get('filtersSelected'))\n updateUrlVariable(QUERY_URL_PARAMETER_SORT, {\n key: appData.get('sortCurrent').key,\n order: appData.get('sortCurrent').order\n })\n\n handlePostEvent(new CustomEvent('switchProductsPage'))\n\n // condition check to not send empty filter list, clear event is handled in different place\n if (runningExperiment(EXPLICIT_FILTERS) && filtersSelected.length) {\n filterActionEvent(\n 'filter apply',\n ...filterTrackingFromPlpFilters(filtersSelected),\n null,\n e.detail.value\n )\n }\n }\n },\n onSort: {\n process: (e, handlePostEvent) => {\n updateUrlVariable(QUERY_URL_PARAMETER_FILTERS, appData.get('filtersSelected'))\n updateUrlVariable(QUERY_URL_PARAMETER_SORT, {\n key: appData.get('sortCurrent').key,\n order: appData.get('sortCurrent').order\n })\n\n handlePostEvent(new CustomEvent('switchProductsPage'))\n\n trackInteraction({\n isSorted: isSorted(appData),\n isFiltered: isFiltered(appData),\n sortKey: appData.get('sortCurrent').key,\n sortOrder: appData.get('sortCurrent').order,\n filtersSelected: appData.get('filtersSelected')\n })\n }\n },\n onloadFilter: {\n process: function (e, handlePostEvent) {\n handlePostEvent(new CustomEvent('onloadFilterSuccess', { detail: { e } }))\n // handlePostEvent(new CustomEvent('onloadFilterError'))\n }\n },\n onloadFilterSuccess: {\n nextState: function (e) {\n return appStates.readyForFilter(e)\n }\n },\n onloadFilterError: {\n nextState: function (e) {\n return appStates.showError(e)\n }\n }\n}\n\nfunction simulatePageChange(url) {\n try {\n const urlObj = new URL(window.location)\n urlObj.pathname = url\n window.history.pushState({}, '', urlObj)\n // TODO: Most likely need to trigger the matching tracking call for a page load\n } catch (error) {\n console.error('Failed to simulate page change', error)\n }\n}\n\nfunction mergeProductData(data, pageBuilderProps) {\n appData.set('enabledTechnologies', data.enabledTechnologies)\n appData.set(\n 'currentTechnology',\n data.enabledTechnologies\n ?.filter(tech => tech.isSelected)[0]\n ?.id?.split('/')\n .at(-1) ?? null\n )\n\n appData.set('products', data.categories)\n appData.set('translations', data.translations)\n appData.set('nav_links', data.nav_links)\n appData.set('bubbles', data.bubbles)\n appData.set('hide_sort_and_filter', pageBuilderProps.options?.hide_sort_and_filter)\n appData.set('options', pageBuilderProps.options)\n appData.set('maxIntensity', data.maxIntensity)\n appData.set('campaign', getTrackingData(pageBuilderProps))\n}\n\nfunction mergeFilters(data, { pageBuilderProps, dataSortService, filtersService }) {\n const sort = dataSortService(pageBuilderProps)\n const filters = filtersService(\n appData.get('products'),\n pageBuilderProps,\n data.categoriesExtraData,\n data.translations,\n {\n priceFormatter: appData.get('priceFormatter'),\n currency: appData.get('currency')\n }\n )\n\n appData.set('filters', filters)\n appData.set('sortOptions', sort)\n appData.set('sortCurrent', sort[0])\n}\n\nfunction setUrlOverrides() {\n const urlFilters = getUrlVariable(QUERY_URL_PARAMETER_FILTERS)\n if (urlFilters && urlFilters.length > 0) {\n const filterData = cleanFilterDataXSS(appData.get('filters'), urlFilters)\n if (filterData.length > 0) {\n filterData.forEach((filter, index) => {\n const isLast = index === filterData.length - 1\n appData.filtersUpdate(filter, isLast)\n })\n }\n }\n\n const urlSort = getUrlVariable(QUERY_URL_PARAMETER_SORT)\n if (urlSort) {\n const sortData = cleanSortDataXSS(appData.get('sortOptions'), urlSort)\n if (sortData.length > 0) {\n appData.set('sortCurrent', sortData[0])\n }\n }\n}\n\nfunction handleExperiments() {\n if (runningExperiment(EXPLICIT_FILTERS)) {\n appData.filterChipsUpdate()\n\n const notCurrentTech = appData\n .get('enabledTechnologies')\n .find(tech => tech.url !== window.location.pathname)\n if (notCurrentTech) {\n loadFromUrl(notCurrentTech.url, true)\n }\n }\n}\n","export function getTrackingData(pageBuilderProps) {\n // Backward compatibility for when data was at root of object\n const {\n campaign_id,\n campaign_name,\n campaign_creative = null,\n campaign_position\n } = pageBuilderProps\n\n if (!campaign_creative) {\n const { campaign = null } = pageBuilderProps\n return campaign\n }\n\n return {\n id: campaign_id,\n name: campaign_name,\n position: campaign_position,\n creative: campaign_creative\n }\n}\n","import appEvents from './plp.events'\n\nexport default (customEventName, eventData, eventFn = null) => {\n stateTransitionsManager(\n new CustomEvent(customEventName, {\n detail: {\n value: eventData,\n fn: eventFn\n }\n })\n )\n}\n\nconst stateTransitionsManager = event => {\n appEvents[event.type]?.process(event, handlePostEvent)\n}\n\nconst handlePostEvent = e => {\n appEvents[e.type]?.nextState(e)\n}\n","import { EVENT_SORT_BY_CHANGE } from '@kissui/components'\nimport { NespressoElement } from '@kissui/components/src/nespressoElement'\nimport './plp.filter-popin.mobileDropDown.scss'\nimport appData from '../../../store/plp.data'\nimport { SORT_MENU_MOBILE_ID, SORT_MENU_ID } from '../../../config/constants'\nimport { escapeHtml } from '@kissui/helpers/src/utils'\n\nclass PlpFilterPopinMobileDropdown extends NespressoElement {\n #SORT_MENU_ID = SORT_MENU_MOBILE_ID\n\n constructor() {\n super()\n this.formatSortSeparator = '::'\n appData.subscribe(this.componentUpdated.bind(this))\n this.boundOnSortChange = this.onSortChange.bind(this)\n }\n\n onStart() {\n const data = document.getElementById(SORT_MENU_ID)?.getAttribute('data')\n if (data) {\n this.template = `\n <nb-dropdown\n id=\"${this.#SORT_MENU_ID}\"\n data-testId=\"plp-sort-menu-mobile\"\n data=\"${escapeHtml(data)}\"></nb-dropdown>`\n }\n }\n\n onReady() {\n this.sortButton = document.getElementById(this.#SORT_MENU_ID)\n this.sortButton?.addEventListener(EVENT_SORT_BY_CHANGE, this.boundOnSortChange)\n }\n\n componentUpdated() {\n const { key, order } = appData.get('sortCurrent')\n this.sortButton?.setSelected(`${key}${this.formatSortSeparator}${order}`)\n }\n\n onSortChange(e) {\n const [key, order] = e.detail.selected.value.split(this.formatSortSeparator)\n appData.set('sortCurrent', { key, order })\n }\n\n onDestroy() {\n this.sortButton?.removeEventListener(EVENT_SORT_BY_CHANGE, this.boundOnSortChange)\n appData.unsubscribe(this.componentUpdated)\n }\n}\n\ncustomElements.get('plp-filter-sort-mobile') ||\n customElements.define('plp-filter-sort-mobile', PlpFilterPopinMobileDropdown)\n\nexport default PlpFilterPopinMobileDropdown\n","import { NespressoElement } from '@kissui/components/src/nespressoElement'\nimport './plp.filter-popin.content.scss'\nimport '../plp.filterImports'\nimport appData from '../../../store/plp.data'\nimport { EXPLICIT_FILTERS, runningExperiment } from '../../../config/experiments'\n\nclass PlpFilterPopinContent extends NespressoElement {\n #filters = []\n\n constructor() {\n super()\n appData.subscribe(this.onStoreChanges.bind(this))\n }\n\n onStoreChanges() {\n if (runningExperiment(EXPLICIT_FILTERS)) {\n // Force re-init if the filters have changed\n if (this.#filters !== appData.get('filters')) {\n this.onStart()\n this.render(true)\n this.onReady()\n }\n }\n\n this.querySelectorAll('nb-chip').forEach(chip => {\n chip.setAttribute(\n 'disabled',\n '' + this.isDisabled(chip.dataset.filterKey, chip.dataset.filterValue)\n )\n chip.setAttribute(\n 'checked',\n '' + this.isChecked(chip.dataset.filterKey, chip.dataset.filterValue)\n )\n\n if (runningExperiment(EXPLICIT_FILTERS)) {\n const labelEl = chip.querySelector('label span')\n const label = this.getLabel(chip.dataset.filterKey, chip.dataset.filterValue)\n labelEl.textContent = label\n labelEl.setAttribute('phantom', label)\n }\n })\n }\n\n onStart() {\n this.#filters = appData.get('filters')\n\n this.template =\n this.#filters\n ?.map(filter => {\n return `${filter.renderBefore()}\n ${filter.values\n .map(value => {\n value.disabled = this.isDisabled(filter.key, value.value)\n return value.render()\n })\n .join('')}\n ${filter.renderAfter()}`\n })\n .join('') ?? ''\n }\n\n onReady() {\n this.querySelectorAll('nb-chip').forEach(chip => {\n chip.addEventListener('change', this.handleChipEvent)\n })\n }\n\n isDisabled = (type, value) =>\n appData.productsListFiltered({ withSort: false }).filter(product => {\n if (!product[type]) {\n return false\n }\n if (typeof product[type] === 'string') {\n return product[type] === value\n } else if (typeof product[type] === 'number' && typeof value === 'number') {\n return value === product[type]\n } else if (typeof product[type] === 'number') {\n return JSON.parse('[' + value + ']').includes(product[type])\n } else {\n return !!product[type].includes(value)\n }\n }).length === 0\n\n isChecked = (key, value) =>\n appData\n .get('filtersSelected')\n .filter(fSelected => fSelected.key === key && fSelected.value === value).length > 0\n\n getLabel(key, value) {\n let filterValue\n appData.get('filters').some(item => {\n if (item.key !== key) {\n return false\n }\n filterValue = item.values.find(itemValue => {\n if (typeof itemValue.value === 'string') {\n return itemValue.value === value\n } else if (typeof itemValue.value === 'number' && typeof value === 'number') {\n return value === itemValue.value\n } else if (typeof itemValue.value === 'number') {\n return JSON.parse('[' + value + ']').includes(itemValue.value)\n } else {\n return !!itemValue.value.includes(value)\n }\n })\n if (filterValue) {\n return true\n }\n })\n\n const count = filterValue?.productCount ? ` (${filterValue.productCount})` : ''\n return `${filterValue.label}${count}`\n }\n\n onDestroy() {\n appData.unsubscribe(this.onStoreChanges)\n\n this.querySelectorAll('nb-chip').forEach(chip => {\n chip.removeEventListener('change', this.handleChipEvent)\n })\n }\n\n handleChipEvent(e) {\n e.stopPropagation()\n\n const filter = {\n key: e.target.parentNode.dataset.filterKey,\n value: e.target.parentNode.dataset.filterValue,\n selected: e.target.checked, // todo only works for checkbox\n label: e.target.parentNode.dataset.filterLabel\n }\n\n appData.filtersUpdate(filter)\n }\n}\n\ncustomElements.get('plp-filter-popin-content') ||\n customElements.define('plp-filter-popin-content', PlpFilterPopinContent)\n\nexport default PlpFilterPopinContent\n","import { EVENT_POPIN_CLOSE } from '@kissui/components'\nimport { NespressoElement } from '@kissui/components/src/nespressoElement'\nimport './plp.filter-popin.footer.scss'\nimport appData from '../../../store/plp.data'\nimport { customEvent } from '@kissui/helpers/src/gtmEvents'\n\nconst CATEGORY_IDENTIFIER = '/cat/'\n\nclass PlpFilterPopinFooter extends NespressoElement {\n constructor() {\n super()\n appData.subscribe(this.componentUpdated.bind(this))\n }\n\n onStart() {\n const translations = appData.translations\n const { a11y_see_result_number_label } = this.props\n this.template = `\n <nb-link\n class=\"nb-filter-popin-reset-all\"\n size=\"large\"\n color=\"black\"\n style=\"visibility: hidden\"\n >\n ${translations['productlistrespblock.resetfilters.label']}\n </nb-link>\n <nb-cta\n class=\"nb-filter-popin-see-results\"\n variation=\"secondary\"\n style=\"visibility: hidden\"\n aria_label_after=\"${a11y_see_result_number_label}\"\n >\n </nb-cta>\n `\n }\n\n getA11ySeeResultsText() {\n const { see_result_number_label, see_result_number_label_one } = this.props\n const productsFilteredCount = appData.productsFilteredCount()\n const label =\n productsFilteredCount === 1 ? see_result_number_label_one : see_result_number_label\n return label?.replace('{resultsLength}', '' + productsFilteredCount)\n }\n\n onReady() {\n this.componentUpdated()\n this.querySelector('.nb-filter-popin-reset-all')?.addEventListener('click', () => {\n const filtersTracking = this.filtersTracking()\n customEvent({\n event_GA4: true,\n event: 'plp_filter',\n action_type: 'filter clear',\n filter_type: filtersTracking.types,\n filter_values: filtersTracking.values\n })\n appData.filtersReset()\n this.setAttribute('data-refresh', 'true')\n })\n this.querySelector('.nb-filter-popin-see-results')?.addEventListener('click', () => {\n window.dispatchEvent(new CustomEvent(EVENT_POPIN_CLOSE))\n const filtersTracking = this.filtersTracking()\n customEvent({\n event_GA4: true,\n event: 'plp_filter',\n action_type: 'filter apply',\n filter_type: filtersTracking.types,\n filter_values: filtersTracking.values\n })\n })\n }\n\n filtersTracking() {\n let types = []\n let values = []\n const filtersSelected = appData.get('filtersSelected')\n if (filtersSelected && filtersSelected.length) {\n for (let i = 0; i < filtersSelected.length; i++) {\n const filter = filtersSelected[i]\n const value =\n filter.value.indexOf(CATEGORY_IDENTIFIER) > -1\n ? filter.value.substring(\n filter.value.indexOf(CATEGORY_IDENTIFIER) + CATEGORY_IDENTIFIER.length\n )\n : filter.value\n if (types.indexOf(filter.key) > -1) {\n values[types.indexOf(filter.key)] += ',' + value\n } else {\n types.push(filter.key)\n values.push(value)\n }\n }\n }\n\n return {\n types: types.join('|'),\n values: values.join('|')\n }\n }\n\n componentUpdated() {\n const productsFilteredCount = appData.productsFilteredCount()\n const filtersSelectedCount = appData.filtersSelectedCount()\n\n const btnReset = this.querySelector('.nb-filter-popin-reset-all')\n const btnResult = this.querySelector('.nb-filter-popin-see-results')\n\n btnReset.style.visibility =\n filtersSelectedCount && filtersSelectedCount > 0 ? 'visible' : 'hidden'\n btnResult.style.visibility =\n productsFilteredCount && productsFilteredCount > 0 ? 'visible' : 'hidden'\n\n btnResult.querySelector('span').textContent = this.getA11ySeeResultsText()\n btnResult.querySelector('button').setAttribute('aria-label', this.getA11ySeeResultsText())\n }\n\n onDestroy() {\n appData.unsubscribe(this.onStoreChanges)\n }\n}\n\ncustomElements.get('plp-filter-popin-footer') ||\n customElements.define('plp-filter-popin-footer', PlpFilterPopinFooter)\n\nexport default PlpFilterPopinFooter\n","import { BREAKPOINT_M, EVENT_POPIN_CLOSED } from '@kissui/components'\nimport { NespressoElement } from '@kissui/components/src/nespressoElement'\nimport handleAppEvent from '../../store'\nimport { FILTER_MAIN_BLOCK_ID, POPIN_ID } from '../../config/constants'\nimport appData from '../../store/plp.data'\nimport './plp.filter-popin.scss'\nimport './popin/plp.filter-popin.mobileDropDown'\nimport './popin/plp.filter-popin.content'\nimport './popin/plp.filter-popin.footer'\n\nclass PlpFilterPopin extends NespressoElement {\n onStart() {\n this.props = this._createProps(\n document.getElementById(FILTER_MAIN_BLOCK_ID).parentElement.attributes\n )\n\n const {\n see_result_number_label = 'See {resultsLength} Results',\n see_result_number_label_zero = 'No Result',\n see_result_number_label_one = 'See One Result',\n a11y_see_result_number_label = 'Close and validate filters'\n } = this.props.copywriting || this.props\n // todo: line above is backward compatibility fallback for coffee PLP projects without \"copywriting\"\n // Consider moving the backward compatibility into Coffee PLP DTO to avoid this in the code\n\n const isMobile =\n appData.innerWidth < BREAKPOINT_M\n ? '<plp-filter-sort-mobile></plp-filter-sort-mobile>'\n : ''\n\n this.template = `\n ${isMobile}\n <div class=\"mobileShadow\">\n <header>\n <h2 class=\"t-sm-700-sl\">${appData.translations['productlistrespblock.filter.label']}</h2>\n </header>\n <section>\n <plp-filter-popin-content\n ></plp-filter-popin-content>\n </section>\n <footer>\n <plp-filter-popin-footer\n see_result_number_label=\"${see_result_number_label}\"\n see_result_number_label_zero=\"${see_result_number_label_zero}\"\n see_result_number_label_one=\"${see_result_number_label_one}\"\n a11y_see_result_number_label=\"${a11y_see_result_number_label}\"\n ></plp-filter-popin-footer>\n </footer>\n </div>`\n }\n\n onReady() {\n window.addEventListener(EVENT_POPIN_CLOSED, this.eventPopinClsed)\n }\n\n onDestroy() {\n window.removeEventListener(EVENT_POPIN_CLOSED, this.eventPopinClsed)\n }\n\n eventPopinClsed(e) {\n e.stopPropagation()\n if (e.detail.id === POPIN_ID) {\n handleAppEvent('onFilter')\n }\n }\n}\n\ncustomElements.get('plp-filter-popin') || customElements.define('plp-filter-popin', PlpFilterPopin)\n\nexport default PlpFilterPopin\n","import { NespressoElement } from '@kissui/components/src/nespressoElement'\nimport handleAppEvent from '../../store'\nimport './plp.filter-cta.scss'\nimport { customEvent } from '@kissui/helpers/src/gtmEvents'\n\nclass PlpFilterCta extends NespressoElement {\n bubbleElement = null\n\n static get observedAttributes() {\n return ['data-filter-counter']\n }\n\n attributeChangedCallback(name, oldVal, newVal) {\n if (newVal != null && newVal.length > 0 && newVal !== oldVal) {\n if (name === 'data-filter-counter') {\n this.updateBubbleCounter(newVal)\n }\n }\n }\n\n onStart() {\n this.template = `<nb-cta id='plp-filter' size='40' variation='plpFilter' icon_right='24/symbol/filter'>${this.props.cta_filter_label}</nb-cta>`\n }\n\n onReady() {\n document.getElementById('plp-filter').addEventListener('click', () => {\n handleAppEvent('onloadFilter', {})\n customEvent({\n event_GA4: true,\n event: 'plp_filter',\n action_type: 'filter open'\n })\n })\n\n this.buttonElement = this.querySelector('nb-cta button')\n this.bubbleElement = document.createElement('div')\n this.bubbleElement.classList.add('t-2xs-700-sl')\n this.bubbleElement.classList.add('bubbleCounter')\n this.bubbleElement.innerHTML = '0'\n this.firstChild.firstChild.appendChild(this.bubbleElement)\n }\n\n updateBubbleCounter(counter) {\n if (!this.bubbleElement) {\n return null\n }\n\n this.bubbleElement.innerHTML = counter\n counter === '0'\n ? this.buttonElement.classList.remove('bubbleActive')\n : this.buttonElement.classList.add('bubbleActive')\n }\n}\n\ncustomElements.get('plp-filter-cta') || customElements.define('plp-filter-cta', PlpFilterCta)\n\nexport default PlpFilterCta\n","import { NespressoElement } from '@kissui/components/src/nespressoElement'\nimport { stringifyForAttribute } from '@kissui/helpers/src/utils'\nimport './plp.filter-links.scss'\nimport './plp.filter-links-slider.scss'\nimport { readEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\nimport { EVENT_SLIDER_READY } from '@kissui/components'\n\nconst SLIDER_NAV_LINKS_ID = 'slider_natural_nav_links'\n\nclass PlpFilterLinks extends NespressoElement {\n constructor() {\n super()\n this.boundReinitSlider = this.reinitSlider.bind(this)\n }\n\n onStart() {\n this.addEventListener(EVENT_SLIDER_READY, this.boundReinitSlider)\n\n const sliderData = {\n options: {\n mobile: {\n items_per_slide: 'auto',\n item_width: 'auto',\n slide_min_height: '40',\n slider_gap: '0',\n display_buttons: 'false',\n display_nav: 'false',\n overflow: 'false',\n flex_auto: 'true',\n display_gradients: 'true',\n gradients_color: '#FFFFFF',\n gradients_width: '8',\n placeholder_background: 'transparent'\n },\n tablet: {\n items_per_slide: 'auto',\n item_width: 'auto',\n slide_min_height: '80',\n slider_gap: '0',\n display_buttons: 'true',\n display_nav: 'false',\n overflow: 'false',\n flex_auto: 'true',\n display_gradients: 'true',\n gradients_color: '#FFFFFF',\n placeholder_background: 'transparent'\n },\n desktop: {\n items_per_slide: 'auto',\n item_width: 'auto',\n slide_min_height: '80',\n slider_gap: '0',\n display_buttons: 'true',\n display_nav: 'false',\n overflow: 'false',\n flex_auto: 'true',\n display_gradients: 'true',\n gradients_color: '#FFFFFF',\n placeholder_background: 'transparent'\n }\n },\n a11y_labels: {\n prev: this.props.a11y_slider_previous_button,\n next: this.props.a11y_slider_next_button,\n nav: 'Go to slide'\n }\n }\n\n this.template = `<nb-slider-natural\n id='${SLIDER_NAV_LINKS_ID}'\n data=\"${stringifyForAttribute(sliderData)}\">\n ${this.renderLinksList()}\n </nb-slider-menu>`\n }\n\n renderLinksList() {\n const { navigation = [] } = this.props\n\n return navigation\n .map(\n ({\n link = '',\n icon_left = '',\n seo_label = '',\n tracking_label = '',\n label = '',\n selected = false\n }) =>\n `<li><nb-link\n link='${link}'\n size='large'\n phantom='true'\n color='black'\n selected=${selected}\n ${seo_label && `seo_label='${seo_label}'`}\n ${tracking_label && `tracking_label='${tracking_label}'`}\n ${icon_left && `icon_left='${icon_left}'`}\n >${label}</nb-link></li>`\n )\n .join('')\n }\n\n reinitSlider(e) {\n const { id } = readEvent(e)\n if (id !== SLIDER_NAV_LINKS_ID) {\n return\n }\n e.target.initSlider()\n }\n\n /*bindEvents() {\n this.unbindEvents()\n this.link.addEventListener('click', this.boundHandleClick)\n }\n\n unbindEvents() {\n this.link.removeEventListener('click', this.boundHandleClick)\n }*/\n\n disconnectedCallback() {\n this.removeEventListener(EVENT_SLIDER_READY, this.boundReinitSlider)\n }\n}\n\ncustomElements.get('plp-filter-links') || customElements.define('plp-filter-links', PlpFilterLinks)\n\nexport default PlpFilterLinks\n","import { EVENT_SORT_BY_CHANGE } from '@kissui/components'\nimport { NespressoElement } from '@kissui/components/src/nespressoElement'\n\nimport handleAppEvent from '../../store'\nimport appData from '../../store/plp.data'\nimport { stringifyForAttribute } from '@kissui/helpers/src/utils'\nimport { SORT_MENU_ID } from '../../config/constants'\nimport { FILTER_MAIN_BLOCK_ID } from '../../config/constants'\n\nclass PlpFilterSort extends NespressoElement {\n #SORT_MENU_ID = SORT_MENU_ID\n\n constructor() {\n super()\n this.formatSortSeparator = '::'\n appData.subscribe(this.componentUpdated.bind(this))\n this.boundOnSortChange = this.onSortChange.bind(this)\n }\n\n onStart() {\n this.props = this._createProps(\n document.getElementById(FILTER_MAIN_BLOCK_ID).parentElement.attributes\n )\n\n const {\n label_sort_by = 'Sort by',\n aa_description_sort_by = 'You can select different sorting values from this listbox. To interact with this listbox press SPACE or ENTER key.',\n aa_listbox_description_sort_by = 'You can navigate through the options using UP or DOWN arrows keys. To exit this listbox press ESCAPE key.',\n aa_select_description_sort_by = 'To select this option press SPACE or ENTER key.',\n label_close_sort_by = 'Close'\n } = this.props\n\n const options = appData.get('sortOptions').map(option => ({\n label: option.label,\n value: this._formatSortValue(option.key, option.order),\n checked: option.checked\n }))\n\n if (appData.get('sortCurrent').key !== appData.get('sortOptions')[0].key) {\n options.forEach(option => {\n option.checked =\n option.value ===\n this._formatSortValue(\n appData.get('sortCurrent').key,\n appData.get('sortCurrent').order\n )\n })\n }\n\n const data = {\n label: label_sort_by,\n aa_description: aa_description_sort_by,\n aa_listbox_description: aa_listbox_description_sort_by,\n aa_select_description: aa_select_description_sort_by,\n icon_option: '16/symbol/check',\n label_close: label_close_sort_by,\n options: options\n }\n\n this.template = `<nb-dropdown id=\"${this.#SORT_MENU_ID}\" data='${stringifyForAttribute(\n data\n )}'/>`\n }\n\n onReady() {\n this.sortButton = document.getElementById(this.#SORT_MENU_ID)\n this.sortButton?.addEventListener(EVENT_SORT_BY_CHANGE, this.boundOnSortChange)\n }\n\n componentUpdated() {\n const { key, order } = appData.get('sortCurrent')\n this.sortButton?.setSelected(this._formatSortValue(key, order))\n }\n\n onSortChange(e) {\n const [key, order] = e.detail.selected.value.split(this.formatSortSeparator)\n appData.set('sortCurrent', { key, order })\n handleAppEvent('onSort')\n }\n\n onDestroy() {\n this.sortButton?.removeEventListener(EVENT_SORT_BY_CHANGE, this.boundOnSortChange)\n appData.unsubscribe(this.componentUpdated)\n }\n\n _formatSortValue(key, order) {\n return `${key}${this.formatSortSeparator}${order}`\n }\n}\n\ncustomElements.get('plp-filter-sort') || customElements.define('plp-filter-sort', PlpFilterSort)\n\nexport default PlpFilterSort\n","import { NespressoElement } from '@kissui/components/src/nespressoElement'\nimport { stringifyForAttribute } from '@kissui/helpers/src/utils'\n\nimport './_plp.filter.main.scss'\nimport './plp.filter-cta'\nimport './plp.filter-links'\nimport './plp.filter-sort'\nimport appData from '../../store/plp.data'\nimport { customEvent } from '@kissui/helpers/src/gtmEvents'\n\nclass PlpFilter extends NespressoElement {\n static get observedAttributes() {\n return ['data-request', 'data-filter-counter']\n }\n\n attributeChangedCallback(name, oldVal, newVal) {\n if (newVal != null && newVal !== oldVal && newVal.length > 0) {\n if (name === 'data-request') {\n this.updateComponent()\n } else if (name === 'data-filter-counter') {\n document\n .getElementById('plp-filter-cta')\n .setAttribute('data-filter-counter', newVal)\n }\n }\n }\n\n onStart() {\n this.props = this._createProps(this.parentElement.attributes)\n this.classList.add('plp-filter')\n }\n\n updateComponent() {\n const nav_links = appData.get('nav_links')\n /* Some markets still using PB old PB export which has 4 campaign param instead of one campaign object.\n This change adds a fallback to work with both the cases. */\n const campaign = {\n id: this.props.campaign_id,\n creative: this.props.campaign_creative,\n name: this.props.campaign_name,\n position: this.props.campaign_position\n }\n\n const HTML = `\n <div class='plp-filter-restrict'>\n <plp-filter-cta\n id=\"plp-filter-cta\"\n cta_filter_label=\"${\n this.props.copywriting?.cta_filter_label || this.props.cta_filter_label\n }\"\n data-filter-counter=\"0\"\n ></plp-filter-cta>\n <plp-filter-links\n data = '${stringifyForAttribute({\n navigation: nav_links,\n a11y_slider_previous_button: this.props.a11y_slider_previous_button,\n a11y_slider_next_button: this.props.a11y_slider_next_button,\n campaign: this.props.campaign || campaign\n })}'\n ></plp-filter-links>\n <plp-filter-sort></plp-filter-sort>\n </div>`\n this.loadTemplate(HTML)\n this.filterLinks = this.querySelectorAll('nb-slider-natural nb-link a')\n this.bindEvents()\n }\n\n linkClick({ textContent }) {\n customEvent({\n eventAction: 'PLP Content Tab',\n eventLabel: textContent\n })\n }\n\n bindEvents() {\n this.unbindEvents()\n if (this.filterLinks?.length) {\n this.filterLinks.forEach(element => {\n const textContent = element.querySelector('span').textContent\n element.boundLinkClick = this.linkClick.bind(this, { textContent })\n element.addEventListener('click', element.boundLinkClick)\n })\n }\n }\n\n unbindEvents() {\n if (this.filterLinks?.length) {\n this.filterLinks.forEach(element => {\n element.removeEventListener('click', element.boundLinkClick)\n })\n }\n }\n}\n\ncustomElements.get('plp-filter') || customElements.define('plp-filter', PlpFilter)\n\nexport default PlpFilter\n","/* eslint-disable */\n\nconst stickyService = () => {\n let element = null\n let elementHeight = 0\n let stickyElementSelector = ''\n let magicIndex = 2 // FFS\n\n const initialize = (\n $element,\n $elementHeight = elementHeight,\n $stickyElementSelector = stickyElementSelector,\n $magicIndex = magicIndex\n ) => {\n element = $element\n elementHeight = $elementHeight\n stickyElementSelector = $stickyElementSelector\n magicIndex = $magicIndex\n element.setAttribute('sticky', 'false')\n element.classList.add('nb-sticky-container')\n updateSticky()\n bindEvent()\n }\n\n const updateSticky = () => {\n const sticky = element.getAttribute('sticky') || 'false'\n let offsetElement = 0\n let isReady = false\n let parent = {}\n for (var i = 0; i < element.parentElement.childNodes.length; i++) {\n if (\n element.parentElement.childNodes[i].tagName &&\n element.parentElement.childNodes[i].tagName === element.tagName\n ) {\n parent = element.parentElement.childNodes[i + magicIndex]\n if (parent) {\n // todo : why 80px here ? if it's header height it should take other banners in consideration ?\n offsetElement = parent.offsetTop - 80\n isReady = true\n }\n }\n if (isReady) {\n break\n }\n }\n // todo review this flow, it's when the sticky element is the first of the list of childrens\n if (isReady && offsetElement === 0) {\n offsetElement = element.parentElement.offsetTop + element.parentElement.offsetHeight\n }\n const boundary = window.scrollY - offsetElement\n const isSticky = boundary > 0\n\n if ((sticky === 'true') !== isSticky) {\n element.setAttribute('sticky', isSticky)\n if (elementHeight > 0) {\n document.body.style.paddingTop = isSticky ? elementHeight + 'px' : '0px'\n }\n }\n }\n\n const destroy = () => {\n unbindEvent()\n }\n\n const bindEvent = () => {\n window.addEventListener('scroll', updateSticky)\n }\n\n const unbindEvent = () => {\n window.removeEventListener('scroll', updateSticky)\n }\n\n const updatePosition = (offset = 0) => {\n let el = element\n if (stickyElementSelector !== '') {\n el = element.querySelector(stickyElementSelector)\n }\n if (!el) {\n return\n }\n\n const $header = document.querySelector('.Header__top')\n const headerRect = $header?.getBoundingClientRect() || { height: 0, y: 0 }\n const header = { height: headerRect.height, top: headerRect.y }\n\n const top = `${header.top + header.height + offset}px`\n el.style.top = top\n\n return 0\n }\n\n return { initialize, destroy, updatePosition }\n}\n\nconst service = stickyService()\n\nexport default service\n","import { stringifyForAttribute } from '@kissui/helpers/src/utils'\nimport appData from '../../store/plp.data'\n\nconst dataTransformNavLinks = navLinks => {\n return navLinks ? stringifyForAttribute({ navigation: navLinks }) : ''\n}\n\nconst dataTransformNavigationBubbles = ({\n bubbles,\n // todo remove ity\n // navigation_bubbles,\n a11y_slider_previous_button,\n a11y_slider_next_button,\n campaign,\n selected_nav_link_label\n}) => {\n return bubbles\n ? stringifyForAttribute({\n a11y_slider_previous_button,\n a11y_slider_next_button,\n bubbles: bubbles,\n customEventAction: 'PLP Content Tab',\n campaign,\n selected_nav_link_label\n })\n : ''\n}\n\nexport const render = (props, campaign) => {\n const { a11y_slider_previous_button, a11y_slider_next_button } = props\n const nav_links = appData.get('nav_links') || []\n const bubbles = appData.get('bubbles') || []\n const selected_nav_link = nav_links.find(nav_link => nav_link.selected)\n const selected_nav_link_label = selected_nav_link?.label\n\n const data_navigation_bubbles = dataTransformNavigationBubbles({\n bubbles,\n ...props,\n campaign,\n selected_nav_link_label\n })\n\n return `\n <nb-navigation-bubbles data='${data_navigation_bubbles}'></nb-navigation-bubbles>\n <nb-plp-sticky-bar\n data=\"${dataTransformNavLinks(nav_links)}\"\n a11y_slider_previous_button=\"${a11y_slider_previous_button}\"\n a11y_slider_next_button=\"${a11y_slider_next_button}\"\n navigation_bubbles=\"${data_navigation_bubbles}\"\n selected_nav_link_label=\"${selected_nav_link_label}\"\n ></nb-plp-sticky-bar>\n `\n}\n","import { NespressoElement } from '@kissui/components/src/nespressoElement'\nimport stickyService from '@kissui/components/src/sticky/sticky.service'\nimport * as navigationBar from './plp.bar'\nimport './_plp.navigation.main.scss'\n\n/*\nSpecs:\n- [✓] Add sticky bar height 180\n- [✓] Add sticky bar on mobile, height 132px\n- [✓] If there is products filtered, remove the sticky bar\n */\n\nclass PlpNavigation extends NespressoElement {\n #isSticky = true\n\n onStart() {\n this.props = this._createProps(this.parentElement.attributes)\n\n // attribute magic-index is used in the sticky service to override the element picked as the \"below the fold\" point :-(\n const magicIndex = this.attributes.getNamedItem('magic-index')\n ? Number(this.attributes.getNamedItem('magic-index').value)\n : undefined\n\n this.#isSticky && stickyService.initialize(this, 0, 'nb-plp-sticky-bar', magicIndex)\n }\n\n static get observedAttributes() {\n return ['sticky', 'data-request']\n }\n\n attributeChangedCallback(name, oldVal, newVal) {\n if (newVal !== null && newVal !== oldVal && newVal.length) {\n if (name === 'sticky') {\n this.#isSticky && stickyService.updatePosition()\n }\n if (name === 'data-request') {\n this.updateComponent()\n }\n }\n }\n\n updateComponent() {\n /* Some markets still using PB old PB export which has 4 campaign param instead of one campaign object.\n This change adds a fallback to work with both the cases. */\n const campaign = {\n id: this.props.campaign_id,\n creative: this.props.campaign_creative,\n name: this.props.campaign_name,\n position: this.props.campaign_position\n }\n const HTML = navigationBar.render(\n this.props.copywriting ? this.props.copywriting : this.props,\n this.props.campaign || campaign,\n true\n )\n this.loadTemplate(HTML)\n }\n\n onDestroy() {\n this.#isSticky && stickyService.destroy()\n }\n}\n\ncustomElements.get('plp-navigation') || customElements.define('plp-navigation', PlpNavigation)\n\nexport default PlpNavigation\n","import { NespressoElement } from '@kissui/components/src/nespressoElement'\nimport appData from '../../store/plp.data'\nimport handleAppEvent from '../../store'\n\nclass PlpResultsChip extends NespressoElement {\n onStart() {\n const { a11y_label, color, icon_right, label, variation } = this.props\n\n const colorHtml = color ? `<div class=\"chip-color\" style=\"background:${color}\"></div>` : ''\n\n this.template = `\n <nb-cta\n icon_right=\"${icon_right}\"\n variation=\"${variation}\"\n size=\"32\"\n aria_label=\"${a11y_label} ${label}\"\n >\n ${colorHtml}${label}\n </nb-cta>\n `\n }\n onReady() {\n const { value, type, label } = this.props\n this.addEventListener('click', () => {\n appData.filtersUpdate({\n key: type,\n label: label,\n selected: false,\n value: value\n })\n this.remove()\n handleAppEvent('onFilter')\n })\n }\n}\n\ncustomElements.get('plp-results-chip') || customElements.define('plp-results-chip', PlpResultsChip)\n\nexport default PlpResultsChip\n","import appData from '../../store/plp.data'\nimport './plp.results-chip'\nimport './plp.results-header.scss'\nimport { CB_RESULTS_TOTAL_ID } from '@kissui/apps/src/plp-core/config/constants'\n\nexport default (copywritingProps = {}) => {\n const {\n a11y_header_result_label_button = 'Reset filter',\n a11y_header_result_label_reset = 'Filters',\n a11y_header_result_label_results = 'With your filters activated, you have currently',\n header_result_label = 'Currently shopping by',\n header_result_label_reset = 'Reset all',\n header_result_label_results = 'Results',\n header_result_label_results_one = 'Result',\n header_result_label_results_zero = 'Results'\n } = copywritingProps\n\n const total = appData.productsFilteredCount()\n const filterLabels = appData.filtersSelectedCount() && appData.filtersSelectedWithLabel()\n const getResultLabel = () => {\n switch (total) {\n case 0:\n return header_result_label_results_zero\n case 1:\n return header_result_label_results_one\n default:\n return header_result_label_results\n }\n }\n\n return `\n <nb-container\n element_class=\"plp-results-header\"\n contrast=\"light\">\n ${\n filterLabels\n ? `<p class=\"t-sm-400-sl cb-title\">${header_result_label}\n <span class='sr-only'> ${filterLabels\n .map(filter => `${filter.categoryTitle}, ${filter.label}, `)\n .join(' / ')}</span>\n </p>${filterLabels\n .map(\n filter =>\n `<plp-results-chip\n icon_right=\"24/symbol/close\"\n variation=\"secondary\"\n value=\"${filter.value}\"\n type=\"${filter.key}\"\n label=\"${filter.label}\"\n color=\"${filter.color || ''}\"\n a11y_label=\"${a11y_header_result_label_button}\"\n >${filter.label}</plp-results-chip>`\n )\n .join('')}`\n : ''\n }\n <nb-link\n id=\"nb-plp-filter-results-reset-all\"\n size=\"small\"\n color=\"black\"\n aria-label=\"${a11y_header_result_label_reset}\"\n >\n ${header_result_label_reset}\n </nb-link>\n <p class=\"t-xs-700-caps-sl cb-results\">\n <span class=\"sr-only\">${a11y_header_result_label_results}</span> \n <span id=\"${CB_RESULTS_TOTAL_ID}\">${total}</span> ${getResultLabel()}:\n </p>\n </nb-container>\n `\n}\n","import { stringifyForAttribute } from '@kissui/helpers/src/utils'\nimport { getSkuComponentByType } from '@kissui/components/src/sku/services'\nimport appData from '../store/plp.data'\nimport { VARIATION_PLP } from '@kissui/components/src/sku/constants'\n\nexport default (product, rendererName = '', list = '', index = 0) => {\n const data = { ...product, ...{ rendererName } }\n const position = index + 1\n\n // tracking\n data.position = position\n\n // price\n data.price = appData.priceFormatter.short(appData.currency, product.price)\n data.rawPrice = product.price // need the raw price for tracking\n if (data.sleevePrice) {\n data.sleevePrice = appData.priceFormatter.short(appData.currency, product.sleevePrice)\n }\n\n // price per capsule\n if (data.price_per_capsule) {\n data.price_per_capsule = appData.priceFormatter.short(\n appData.currency,\n product.price_per_capsule\n )\n }\n\n // Make the variation available to the SKU component to know where it is being displayed\n data.variation = VARIATION_PLP\n data.intensity_label =\n appData.get('options')?.intensity_label ||\n appData.translations['productlistrespblock.capsule.a11y.intensity']\n data.campaign = appData.get('campaign')\n\n const tag = getSkuComponentByType(data) // sku-coffee\n\n return `<${tag}\n tracking_list=\"${list}\"\n tracking_position=\"${position}\"\n id=\"${data.sku}\"\n data=\"${stringifyForAttribute(data)}\"\n ${data.highlighted ? `highlighted=\"${data.highlighted}\"` : ''}\n ></${tag}>`\n}\n","import { filterActionEvent } from '@kissui/helpers/src/gtmEvents'\nimport { NespressoElement } from '@kissui/components/src/nespressoElement'\nimport appData from '../../store/plp.data'\nimport handleAppEvent from '../../store'\nimport renderHeader from './plp.results-header'\nimport renderProduct from '../plp.product'\n\nclass PlpResults extends NespressoElement {\n #headerSelector = 'nb-container[element_class=\"plp-results-header\"]'\n #resetSelector = '#nb-plp-filter-results-reset-all'\n\n onStart() {\n this.props = this._createProps(this.parentElement.attributes)\n this.shouldHideHeader = this.getAttribute('hide-header') === 'true'\n this.productListBkp = []\n this.classList.add('plp-results')\n }\n\n static get observedAttributes() {\n return ['data-request']\n }\n\n attributeChangedCallback(name, oldVal, newVal) {\n if (newVal !== null && newVal !== oldVal && !!newVal.length) {\n if (name === 'data-request') {\n this.updateComponent()\n }\n }\n }\n\n updateComponent() {\n const headerMarkup = this.shouldHideHeader ? '' : renderHeader(this.props)\n if (this.arraysAreEqual(this.productListBkp, appData.productsListFiltered())) {\n // The header needs to update, even when the results do not change\n document.querySelector(this.#headerSelector).outerhtml = headerMarkup\n this.bindEvents()\n return\n }\n\n this.productListBkp = appData.productsListFiltered()\n const hasFilters = appData.filtersSelectedCount() > 0\n const isSorted = appData.get('sortCurrent')?.key !== appData.get('sortOptions')?.[0].key\n const listName = `${hasFilters ? 'filtered plp' : ''}${isSorted && hasFilters ? ': ' : ''}${\n isSorted ? 'manually ordered' : ''\n }`\n\n this.loadTemplate(\n `\n ${headerMarkup}\n <nb-container element_class=\"plp-grid\" className=\"plp-grid--results-list\">\n ${appData\n .productsListFiltered()\n .map((product, index) => {\n return renderProduct(product, 'results', listName || index)\n })\n .join('')}\n </nb-container>\n `,\n true\n )\n\n this.bindEvents()\n }\n\n arraysAreEqual(a = [], b = []) {\n return a.length !== b.length ? false : a.every((value, index) => value === b[index])\n }\n\n onDestroy() {\n document.querySelector(this.#resetSelector)?.removeEventListener('click', this.resetClick)\n }\n\n bindEvents() {\n document.querySelector(this.#resetSelector)?.addEventListener('click', this.resetClick)\n }\n\n resetClick() {\n filterActionEvent('filter clear', '', '', 'clear all ext')\n appData.filtersReset()\n handleAppEvent('onFilter')\n }\n}\n\ncustomElements.get('plp-results') || customElements.define('plp-results', PlpResults)\n\nexport default PlpResults\n","import { NespressoElement } from '@kissui/components/src/nespressoElement'\nimport appData from '../../store/plp.data'\nimport categoryProducts from './plp.category-products'\nimport { EXPLICIT_FILTERS, runningExperiment } from '../../config/experiments'\n\nclass PlpProducts extends NespressoElement {\n static get observedAttributes() {\n return ['data-request']\n }\n\n attributeChangedCallback(name, oldVal, newVal) {\n if (newVal !== null && newVal !== oldVal && newVal.length) {\n if (name === 'data-request') {\n this.updateComponent()\n }\n }\n }\n\n updateComponent() {\n const categories = appData.get('products') ?? []\n const HTML = categories.reduce((acc, category) => {\n acc += categoryProducts(category)\n return acc\n }, '')\n if (runningExperiment(EXPLICIT_FILTERS)) {\n this.loadTemplate(HTML, true) // the DOM Diff, simply does not work\n } else {\n this.loadTemplate(HTML)\n }\n }\n}\n\ncustomElements.get('plp-products') || customElements.define('plp-products', PlpProducts)\n\nexport default PlpProducts\n","import './plp.category-products.scss'\nimport './plp.category-products-more-items-per-row.scss'\n\nimport renderProduct from '../plp.product'\n\nexport default props => {\n const {\n id = null,\n background_retina,\n background_desktop,\n background_mobile,\n background_tablet,\n contrast = 'dark',\n name = null,\n description,\n products = []\n } = props\n\n const renderHeading = () => {\n return name ? `<h2 class=\"h-2xl-700 plp-category--title\">${name}</h2>` : ''\n }\n\n const renderDescription = () => {\n return description ? `<p class=\"description t-md-400\">${description}</p>` : ''\n }\n\n // Tabindex=\"0\" is needed to make the anchors bubbles works for keyboard navigation\n return `<div class=\"plp-category\" data-id=\"${id}\" tabindex=\"0\">\n <nb-container\n classname=\"plp-category--header\"\n contrast=\"${contrast}\"\n background_retina=\"${background_retina}\"\n background_desktop=\"${background_desktop}\"\n background_mobile=\"${background_mobile}\"\n background_tablet=\"${background_tablet}\"\n >\n <header>\n ${renderHeading()}\n <div class=\"plp-category--description\">\n ${renderDescription()}\n </div>\n </header>\n </nb-container>\n <nb-container classname=\"plp-category--products\" contrast=\"light\">\n <div class=\"plp-category--segment\">\n <div class=\"plp-category--side\"></div>\n <div class=\"plp-category--center\">\n <div class=\"plp-grid\">\n ${products\n .map((product, index) =>\n renderProduct(product, undefined, name, index)\n )\n .join('')}\n </div>\n </div>\n </div>\n </nb-container>\n </div>`\n}\n","// import * as Turbo from \"@hotwired/turbo\"\nimport { NespressoElement } from '@kissui/components/src/nespressoElement'\nimport handleAppEvent from './store'\n\nimport {\n FILTER_MAIN_BLOCK_ID,\n NAVIGATION_MAIN_BLOCK_ID,\n PRODUCTS_LIST_MAIN_BLOCK_ID,\n PRODUCTS_RESULTS_MAIN_BLOCK_ID\n} from './config/constants'\nimport { enableExperiment } from './config/experiments'\n\nimport './styles/plp.app.scss'\n\nclass PLPApp extends NespressoElement {\n constructor() {\n super()\n this.dataTransformService = () => []\n this.dataFiltersService = () => []\n this.dataSortService = () => []\n this.recommendationService = () => {}\n this.appStates = {}\n this.plpType = 'app'\n }\n\n static get observedAttributes() {\n return ['data-loaded', 'data']\n }\n\n attributeChangedCallback(name, oldVal, newVal) {\n if (\n name === 'data' &&\n oldVal !== null && // avoid during the first render\n newVal !== null &&\n newVal !== oldVal &&\n !!newVal.length\n ) {\n this.connectedCallback()\n return\n }\n const propChanged = name === 'data-loaded'\n const valueChanged = newVal !== null && newVal !== oldVal && !!newVal.length\n\n if (propChanged && valueChanged) {\n handleAppEvent('onMergeData', {\n dataSortService: this.dataSortService,\n filtersService: this.dataFiltersService,\n productService: this.dataTransformService,\n recommendationService: this.recommendationService,\n pageBuilderProps: this.props\n })\n }\n }\n\n defineTemplate() {\n this.template = `\n <plp-filter id=\"${FILTER_MAIN_BLOCK_ID}\" style=\"display: none;\"></plp-filter>\n <plp-navigation id=\"${NAVIGATION_MAIN_BLOCK_ID}\" style=\"display: none;\"></plp-navigation>\n <plp-products id=\"${PRODUCTS_LIST_MAIN_BLOCK_ID}\" style=\"display: none;\"></plp-products>\n <plp-results id=\"${PRODUCTS_RESULTS_MAIN_BLOCK_ID}\" style=\"display: none;\"></plp-results>\n `\n }\n\n onStart() {\n const enabledExperiments = this.props.options?.enabledExperiments ?? []\n enabledExperiments.forEach(experiment => enableExperiment(experiment))\n\n handleAppEvent('onload', {\n plpType: this.plpType,\n appStatesHandler: this.appStates\n })\n\n this.classList.add('plp-app', `plp-app-${this.plpType}`)\n const itemsPerRow = this.props.options?.items_per_row\n if (itemsPerRow > '3') {\n this.classList.add(`plp-row-${itemsPerRow}`)\n }\n\n this.defineTemplate()\n }\n}\n\nexport default PLPApp\n","/* eslint-disable */\nexport default class Category {\n _id = ''\n _name = ''\n _description = ''\n _products = []\n _capacityLabel = null\n _detailsIcon = null\n _icon = null\n _isLoadingProducts = false\n _rangeLink = null\n _subCategories = []\n _superCategories = []\n _url = ''\n _background_retina =\n '/shared_res/agility/next-components/assets/backgrounds/barista_creation_range_XL.jpg'\n _background_desktop =\n '/shared_res/agility/next-components/assets/backgrounds/barista_creation_range_L.jpg'\n _background_mobile =\n '/shared_res/agility/next-components/assets/backgrounds/barista_creation_range_S.jpg'\n _background_tablet = ''\n _contrast = 'dark'\n _isSegment = false\n\n constructor(category, PageBuilderData) {\n this._id = category.id || this._id\n this._name = category.name || this._name\n this._capacityLabel = category.capacityLabel || this._capacityLabel\n this._description = category.description || this._description\n this._detailsIcon = category.detailsIcon || this._detailsIcon\n this._icon = category.icon || this._icon\n this._rangeLink = category.rangeLink || this._rangeLink\n this._subCategories = category.subCategories || this._subCategories\n this._superCategories = category.superCategories || this._superCategories\n this._url = category.url || this._url\n this._background_desktop = PageBuilderData?.background_desktop || this._background_desktop\n this._background_mobile = PageBuilderData?.background_mobile || this._background_mobile\n this._background_retina = PageBuilderData?.background_retina || this._background_retina\n this._background_tablet = PageBuilderData?.background_tablet || this._background_tablet\n this._contrast = PageBuilderData?.contrast || this._contrast\n }\n\n get id() {\n return this._id\n }\n get products() {\n return this._products\n }\n set products(products) {\n this._products = products\n }\n get isLoadingProducts() {\n return this._isLoadingProducts\n }\n set isLoadingProducts(isLoadingProducts) {\n this._isLoadingProducts = isLoadingProducts\n }\n get name() {\n return this._name\n }\n get description() {\n return this._description\n }\n get contrast() {\n return this._contrast\n }\n get background_desktop() {\n return this._background_desktop\n }\n get background_mobile() {\n return this._background_mobile\n }\n get background_retina() {\n return this._background_retina\n }\n get background_tablet() {\n return this._background_tablet\n }\n\n isProductCategory() {\n return !this._isSegment && this._products && this._products.length > 0\n }\n}\n","import Category from '../../plp-core/models/Category.js'\n\nexport default class MachineCategory extends Category {\n constructor(category, PageBuilderData) {\n super(category, PageBuilderData)\n }\n}\n","import { isLoggedIn } from '@kissui/helpers/src/dataLayer'\n\nexport default class Product {\n id = ''\n sku = ''\n longSku = ''\n name = ''\n name_custom = ''\n available = true\n description = null\n hidePrice = false\n image_alt_text = ''\n image = ''\n inStock = true\n internationalId = ''\n internationalName = ''\n legacyId = ''\n maxOrderQuantity = null\n packagingType = null\n price = null\n pushRatingEnabled = false\n ranges = []\n salesMultiple = null\n technologies = []\n type = ''\n unitQuantity = 50\n url = ''\n labels = []\n category_name = ''\n category = null\n highlighted = false\n strikethrough_price = ''\n additional_message = ''\n additional_message_icon = ''\n additional_message_link = {}\n api_override = null\n view_details_label = ''\n headline = ''\n\n constructor(product) {\n /* SKU */\n this.sku = product.internationalId || this.sku\n this.longSku = product.id || this.longSku\n this.id = product.id || this.id\n this.name = product.name || this.name\n this.name_custom = product.name_custom || this.name_custom\n this.available = product.available || this.available\n this.description = product.description || this.description\n this.hidePrice = isLoggedIn() ? false : product.hidePrice || this.hidePrice\n this.image_alt_text = product?.image?.altText || this.image_alt_text\n this.image = product?.image?.url || this.image\n this.inStock = product.inStock\n this.internationalId = product.internationalId || this.internationalId\n this.internationalName = product.internationalName || this.internationalName\n this.legacyId = product.legacyId || this.legacyId\n this.maxOrderQuantity = product.maxOrderQuantity || this.maxOrderQuantity\n this.packagingType = product.packagingType || this.packagingType\n this.price = product.price ?? this.price\n this.pushRatingEnabled = product.pushRatingEnabled || this.pushRatingEnabled\n this.ranges = product.ranges || this.ranges\n this.salesMultiple = product.salesMultiple || this.salesMultiple\n this.technologies = product.technologies || this.technologies\n this.type = product.type || this.type\n this.unitQuantity = product.unitQuantity || this.unitQuantity\n this.url = product.url || this.url\n this.highlighted = product.highlighted || this.highlighted\n this.strikethrough_price = product.strikethrough_price || this.strikethrough_price\n this.additional_message = product.additional_message || this.additional_message\n this.additional_message_icon =\n product.additional_message_icon || this.additional_message_icon\n this.additional_message_link =\n product.additional_message_link || this.additional_message_link\n this.api_override = product.api_override || this.api_override\n this.view_details_label = product.view_details_label || this.view_details_label\n this.headline = product.headline || this.headline\n this.labels = product.labels || this.labels\n\n // category_name\n const categoryId = product.categoryId ? product.categoryId.split('/') : ['']\n this.category_name = categoryId[categoryId.length - 1]\n this.category = product.category || this.category\n }\n}\n","import Product from '../../plp-core/models/Product.js'\n\nexport default class MachineProduct extends Product {\n colorFilter = []\n energy_level = ''\n a11y_energy_label = ''\n show_ratings = false\n minimum_rating = 3\n show_view_details = false\n slides = []\n show_slider = false\n display_machine_range_name = false\n\n constructor(product) {\n super(product)\n\n this.colorFilter = []\n if (product.colors) {\n this.activeSku = product.legacyId\n this.activeLongSku = product.id || ''\n this.colors = product.colors\n this.colorFilter = product.colors.map(color => color.colorCategoryId)\n }\n\n this.energy_level = product.energy_level\n this.a11y_energy_label = product.a11y_energy_label\n this.display_machine_range_name = !!product.display_machine_range_name\n if (product.show_ratings !== undefined) {\n this.show_ratings = product.show_ratings\n }\n if (product.minimum_rating !== undefined) {\n this.minimum_rating = product.minimum_rating\n }\n if (product.a11y_extra_color !== undefined) {\n this.a11y_extra_color = product.a11y_extra_color\n }\n if (product.show_view_details !== undefined) {\n this.show_view_details = product.show_view_details\n }\n }\n}\n","import { COFFEE_ORIGINAL, COFFEE_VERTUO, COFFEE_PRO } from '@kissui/components/src/constants.mjs'\n\nexport default (nav_links, enabledCremaTechnologies, PageBuilderData) => {\n // Do not change icon name. This is NC2 merger of menus from PB export and crema data\n const ORIGINAL_ICON = 'coffee'\n const VERTUO_ICON = 'gran-lungo-vertuo-capsule'\n const PRO_ICON = 'brand_coffee_capsule_pro'\n\n const { copywriting = {}, options = {} } = PageBuilderData\n\n const transformCremaTechnologiesToLink = technologies => {\n return technologies.map(({ id, url, name, isSelected }) => ({\n link: url,\n label: name,\n seo_label: name,\n icon_left: id ? getIconByTechnology(id.split('/').pop()) : '',\n selected: isSelected\n }))\n }\n const getIconByTechnology = technology => {\n switch (technology) {\n case COFFEE_VERTUO:\n return VERTUO_ICON\n case COFFEE_PRO:\n return PRO_ICON\n default:\n return COFFEE_ORIGINAL\n }\n }\n const filterDefaultTechnology = link => {\n if (\n link.icon_left !== ORIGINAL_ICON &&\n link.icon_left !== VERTUO_ICON &&\n link.icon_left !== PRO_ICON\n ) {\n return link\n }\n }\n\n const replaceCremaTechnologies = () => {\n if (!copywriting.all_products_navigation_label) {\n return []\n }\n const selectedTechnology = enabledCremaTechnologies.find(t => t.isSelected)\n if (!selectedTechnology) {\n return []\n }\n return [\n {\n url: selectedTechnology.url,\n name: copywriting.all_products_navigation_label,\n isSelected: true\n }\n ]\n }\n\n let enabledTechnologies\n if (options.hide_technologies_in_navigation) {\n enabledTechnologies = replaceCremaTechnologies()\n } else {\n enabledTechnologies = enabledCremaTechnologies\n }\n\n if (!nav_links.length && enabledTechnologies.length) {\n return transformCremaTechnologiesToLink(enabledTechnologies)\n }\n\n if (!enabledTechnologies.length) {\n return nav_links\n }\n\n // Remove Page Builder data about technology links to use the one activated in Crema UI data\n const navLinksWithoutTechnology = [...nav_links].filter(filterDefaultTechnology)\n\n return [...transformCremaTechnologiesToLink(enabledTechnologies), ...navLinksWithoutTechnology]\n}\n","import { DEFAULT_BUBBLE_ICON } from '@kissui/components/src/constants.mjs'\nimport { isCategoryHidden } from '@kissui/helpers/src/cremaDataHelper'\n\nexport default (bubbles, productGroups, categories, recommendation) => {\n const productsGroup = productGroups\n .filter(el => !isCategoryHidden(el.categoryId)) // For AB testing\n .map(el => el.categoryId)\n const bubblesFilteredAndSorted = []\n\n const bubblesMathProductsGroup = bubbles\n .map(bubble => {\n const normalizedBubble = {\n ...bubble,\n link: bubble.link.replace('#', '')\n }\n\n if (productsGroup.includes(normalizedBubble.link)) {\n return normalizedBubble\n }\n })\n .filter(ele => typeof ele !== 'undefined')\n\n productsGroup.forEach(categoryId => {\n const bubble = bubblesMathProductsGroup.find(({ link }) => link === categoryId)\n if (bubble) {\n bubblesFilteredAndSorted.push(bubble)\n } else {\n const cremaCategory = categories.find(category => category.id === categoryId)\n if (cremaCategory) {\n const { name, id, icon } = cremaCategory\n const cremaBubble = {\n link: id,\n tracking_label: name,\n label: name,\n visual: {\n src: icon?.url || DEFAULT_BUBBLE_ICON,\n alt: icon?.altText || name\n }\n }\n bubblesFilteredAndSorted.push(cremaBubble)\n }\n }\n })\n\n if (recommendation) {\n bubblesFilteredAndSorted.unshift({\n link: recommendation.id,\n tracking_label: recommendation.name,\n label: recommendation.name,\n visual: {\n src: recommendation.background_desktop,\n alt: recommendation.name\n }\n })\n }\n\n return bubblesFilteredAndSorted\n}\n","/**\n * Modifies the structure to make it easier to use in components\n * Applies all the data customization mixing Page builder with HMC data\n * @param {object} plpData : original PLP data\n */\nimport navigationLinks from './NavigationLinks'\nimport navigationBubbles from './NavigationBubbles'\nimport { getLabels, isCategoryHidden } from '@kissui/helpers/src/cremaDataHelper'\nimport { isLoggedIn } from '@kissui/helpers/src/dataLayer'\n\nconst MAX_INTENSITY_FALLBACK = 15\n\n/**\n * Prior to HMC supporting labels natively the hack was to use a category with the data\n * about the label held as JSON data in the description. This function will parse the\n * descriptions for each label once and store them as an object.\n */\nconst parseLabels = labels => {\n labels.forEach(label => {\n try {\n label.parsedData = JSON.parse(label.description)\n } catch (e) {\n console.error(\n 'Wrong JSON format in HMC label categories',\n label.id,\n label.description,\n e\n )\n return\n }\n })\n}\n\n/**\n * Labels data is now available natively in the HMC data. If any labels are specified in the\n * HMC data then this should overwrite the existing functionality. To allow support for both\n * the \"labels from categories\" should continue to be used if HMC data is not specified.\n *\n * Adds labels property to products containing each label's category data (JSON\n * parsed description property) assigned to it.\n * Labels are categories that have the label base category as parent.\n * To apply a label on a given product, the label has to contain the product.\n * This function has to clean the productGroups as well by removing the label ones\n *\n * @param eCommerceData\n */\nconst addLabels = ({ categories, productGroups, products }) => {\n // Labels are already present in the products, skip.\n // This can happen after merging lazy data like recommendations\n if (products.some(product => product.labels?.length)) {\n return\n }\n\n // Use HMC data, if available, create labels with data from highlightLabels\n products.forEach(product => {\n if (product.highlightLabels?.length) {\n product.labels = product.highlightLabels.map(label => ({\n name: label.text,\n color: label.textColor,\n bgColor: label.backgroundColor\n }))\n }\n })\n\n // Backward compatibility, fall back to using HMC categories if no native HMC labels are specified\n const labels = getLabels(categories)\n parseLabels(labels)\n\n const labelGroups = productGroups.filter(group =>\n labels.some(label => label.id === group.categoryId)\n )\n\n labelGroups.forEach(group => {\n const label = labels.find(__label => __label.id === group.categoryId)\n if (!label.parsedData) {\n // Data could not be parsed so skip this label\n return\n }\n group.productIds.forEach(productId => {\n const prod = products.find(product => product.id === productId)\n if (!prod || prod.highlightLabels?.length > 0) {\n // Product not found or has native HMC labels\n return\n }\n prod.labels = prod.labels || []\n prod.labels.push(label.parsedData)\n })\n })\n\n //remove label categories from productGroups\n labelGroups.forEach(labelGroup => {\n const indexToRemove = productGroups.findIndex(\n productGroup => productGroup.categoryId === labelGroup.categoryId\n )\n productGroups.splice(indexToRemove, 1)\n })\n}\n\nexport default (\n plpData,\n PageBuilderData,\n Category,\n Product,\n colorFilterFunction,\n recommendation\n) => {\n if (!plpData.data) {\n return\n }\n\n let { categories, productGroups, enabledTechnologies, products } =\n plpData.data.configuration.eCommerceData\n\n productGroups = getOverridenProductGroups(recommendation, productGroups)\n applyRecommendationOverrides(recommendation, { Product, PageBuilderData })\n applyProductsOverrides(products, PageBuilderData)\n addLabels({ categories, productGroups, products })\n\n // Don't filter the products until after the labels have been applied\n if (colorFilterFunction) {\n products = colorFilterFunction(products)\n }\n\n const overriddenCategories = applyCategoryOverrides(categories, productGroups, products, {\n PageBuilderData,\n Category,\n Product\n })\n\n return {\n categories: recommendation\n ? [recommendation, ...overriddenCategories]\n : overriddenCategories,\n translations: plpData.data.configuration.translations,\n enabledTechnologies,\n nav_links: navigationLinks(\n getPBProperty(PageBuilderData, 'nav_links'),\n enabledTechnologies,\n PageBuilderData\n ),\n bubbles: navigationBubbles(\n getPBProperty(PageBuilderData, 'navigation_bubbles.bubbles'),\n productGroups,\n categories,\n recommendation\n ),\n maxIntensity: {\n original: MAX_INTENSITY_FALLBACK,\n vertuo: MAX_INTENSITY_FALLBACK,\n ...(plpData.data.configuration?.props?.maxIntensity ?? {})\n },\n categoriesExtraData: recommendation ? [recommendation, ...categories] : categories\n }\n}\n\n/**\n * Get a property from the Page Builder data taking into\n * account the old/new schema\n */\nfunction getPBProperty(PageBuilderData, key) {\n return key.split('.').reduce(\n (acc, current) => acc?.[current],\n // Backward compatibility to old schema\n PageBuilderData?.copywriting ? PageBuilderData.copywriting : PageBuilderData\n )\n}\n\nfunction applyProductsOverrides(products, PageBuilderData) {\n products.forEach(product => {\n product.view_details_label = getPBProperty(PageBuilderData, 'view_details_label')\n\n if (isLoggedIn()) {\n // The hide price attribute from Crema UI actually means \"hide price for anonymous users\"\n product.hidePrice = false\n }\n\n const pbProduct = PageBuilderData?.products?.find?.(\n pbProductData => pbProductData.sku && pbProductData.sku === product.legacyId\n )\n\n if (!pbProduct) {\n return\n }\n\n const apiOverride = pbProduct.api_override || product.api_override\n\n // Apply page builder overrides\n Object.assign(product, {\n highlighted: pbProduct.highlighted,\n strikethrough_price: pbProduct.strikethrough_price,\n additional_message: pbProduct.additional_message,\n additional_message_icon: pbProduct.additional_message_icon,\n additional_message_link: pbProduct.additional_message_link || {},\n display_machine_range_name: pbProduct.display_machine_range_name || false,\n name_custom: pbProduct.name_custom || '',\n ...(apiOverride\n ? {\n image: {\n url: apiOverride?.image || product.image?.url\n },\n name: apiOverride?.name || product.name,\n headline: apiOverride?.headline || product.headline,\n description: apiOverride?.description || product.description,\n api_override: apiOverride\n }\n : {})\n })\n })\n}\n\nfunction applyCategoryOverrides(\n categories,\n productGroups,\n products,\n { PageBuilderData, Category, Product }\n) {\n return categories\n .map(category => {\n const extraData = getPBProperty(PageBuilderData, 'categories').find(\n catData => catData.category_id === category.id\n )\n\n const categoryObj = new Category(category, extraData)\n\n productGroups.forEach(productGroup => {\n if (\n isCategoryHidden(productGroup.categoryId) ||\n productGroup.categoryId !== category.id\n )\n return\n\n productGroup.productIds.forEach(productID => {\n const product = products.find(p => p.id === productID)\n if (product) {\n product.categoryId = category.id\n product.category =\n categories.find(c => c.id === product.ranges?.[0]) || null\n const productObj = new Product(product, PageBuilderData)\n categoryObj.products.push(productObj)\n }\n })\n })\n\n return categoryObj.isProductCategory() ? categoryObj : null\n })\n .filter(Boolean)\n}\n\nfunction getOverridenProductGroups(recommendation, productGroups) {\n return recommendation\n ? [\n {\n categoryId: recommendation.id,\n productIds: recommendation.products.map(product => product.legacyId)\n },\n ...productGroups\n ]\n : productGroups\n}\n\nfunction applyRecommendationOverrides(recommendation, { Product, PageBuilderData }) {\n if (!recommendation) {\n return\n }\n\n recommendation.products = recommendation.products.map(p => new Product(p, PageBuilderData))\n}\n","import MachineCategory from '../models/machine.category'\nimport MachineProduct from '../models/machine.product'\nimport MainDTO from '../../plp-core/models/MainDTO'\n\nconst getPageBuilderData = (PageBuilderData, field) =>\n PageBuilderData.options ? PageBuilderData.options[field] : PageBuilderData[field]\n\nexport default (plpData, PageBuilderData) => {\n const { colorFilters, products, categories } = plpData.data.configuration.eCommerceData\n\n // Make the CSS filter color from HMC available inside the category for use later to display the filter\n if (colorFilters.length) {\n colorFilters.forEach(color => {\n const category = categories.find(categoryHmc => categoryHmc.id === color.id)\n category.cssColorCode = color.cssColorCode\n })\n }\n\n products.forEach(product => {\n const pbProduct =\n PageBuilderData.products &&\n PageBuilderData.products.find(\n pbProductData => pbProductData.sku && pbProductData.sku === product.legacyId\n )\n\n product.show_ratings = getPageBuilderData(PageBuilderData, 'show_ratings')\n product.minimum_rating = getPageBuilderData(PageBuilderData, 'minimum_rating')\n product.show_view_details = getPageBuilderData(PageBuilderData, 'show_view_details')\n product.display_machine_range_name = getPageBuilderData(\n PageBuilderData,\n 'display_machine_range_name'\n )\n product.name_custom = product.display_machine_range_name ? product.category?.name ?? '' : ''\n product.view_details_label = PageBuilderData.copywriting?.view_details_label\n\n if (pbProduct) {\n product.energy_level = pbProduct.energy_level\n product.a11y_energy_label = PageBuilderData.options.a11y_energy_label\n }\n\n const productsOtherColors = products.filter(productSameRanges => {\n return productSameRanges.ranges.some(productSameRange =>\n product.ranges.includes(productSameRange)\n )\n })\n if (productsOtherColors && productsOtherColors.length) {\n product.colors = productsOtherColors.map(otherProductColor => {\n return {\n colorCategoryId: otherProductColor.colorCategories\n ? otherProductColor.colorCategories[0]\n : '',\n sku: otherProductColor.legacyId,\n name: otherProductColor.colorShade?.name,\n code: otherProductColor.colorShade?.cssColorCode\n }\n })\n }\n })\n\n const colorFilterFunction = products => {\n // Product is for each color\n // need to display one card for all colors\n const displayedRanges = []\n let productRange = null\n const filteredProduct = products.filter(product => {\n productRange = product?.ranges[0]\n const isDisplayed = !displayedRanges.includes(productRange)\n displayedRanges.push(productRange)\n return isDisplayed\n })\n const productBySku = sku => products.find(product => product.legacyId === sku)\n filteredProduct.map(product => {\n product.colors.map(color => {\n color.labels = productBySku(color.sku).labels\n })\n })\n return filteredProduct\n }\n\n return MainDTO(plpData, PageBuilderData, MachineCategory, MachineProduct, colorFilterFunction)\n}\n","import viewportHelper from '@kissui/helpers/src/viewport.helpers'\n\n/**\n * @param {{}} [_filter]\n */\nexport default class Filter {\n #type = ''\n #key = ''\n #iconFn = {}\n #filterFn = {}\n #title = ''\n #values = []\n #after = '</fieldset>'\n #before = `<fieldset aria-labelledby=\"{key}\"><legend id=\"{key}\" aria-hidden=\"true\" class='${\n viewportHelper.is.mobile ? 't-sm-700-sl' : 't-md-700-sl'\n }'>{title}</legend>`\n showalllabel = ''\n\n constructor(_filter = {}) {\n this.#type = _filter.type\n this.#key = _filter.key\n this.#iconFn = _filter.iconFn ? _filter.iconFn : null\n this.#filterFn = _filter.filterFn ? _filter.filterFn : null\n const title = _filter.title ? _filter.title.toLowerCase() : 'Filter'\n this.#title = title.charAt(0).toUpperCase() + title.slice(1)\n this.#before = _filter.before ? _filter.before : this.#before\n this.#after = _filter.after ? _filter.after : this.#after\n this.showalllabel = _filter.showalllabel ?? ''\n }\n\n set values(values) {\n this.#values = values\n }\n\n set after(after) {\n this.#after = after\n }\n\n get after() {\n return this.#after\n }\n\n get values() {\n return this.#values\n }\n\n get type() {\n return this.#type\n }\n\n get filterFn() {\n return this.#filterFn\n }\n\n get iconFn() {\n return this.#iconFn\n }\n\n get key() {\n return this.#key\n }\n\n get title() {\n return this.#title\n }\n\n renderBefore() {\n return this.#before.replace('{title}', this.#title).replaceAll('{key}', this.#key)\n }\n\n renderAfter() {\n return this.#after\n }\n\n pushValues(value) {\n this.#values.findIndex(x => x.value === value.value) === -1 && this.#values.push(value)\n }\n}\n","/**\n * Filter chip type\n */\nexport default class DefaultFilterChipType {\n #value = null\n #label = null\n #filterType = null\n #filterKey = null\n #icon = ''\n #color = ''\n #selected = false\n #disabled = false\n\n constructor({\n value,\n label,\n filterType,\n filterKey,\n icon = '',\n color = '',\n selected = false,\n disabled = false\n }) {\n if (!value) {\n console.error('DefaultFilterChipType: value is required')\n return\n }\n if (!label) {\n console.error('DefaultFilterChipType: label is required')\n return\n }\n if (!filterType) {\n console.error('DefaultFilterChipType: filterType is required')\n return\n }\n if (!filterKey) {\n console.error('DefaultFilterChipType: filterKey is required')\n return\n }\n\n this.#value = value\n this.#label = label\n this.#filterType = filterType\n this.#filterKey = filterKey\n this.#icon = icon\n this.#color = color\n this.#selected = selected\n this.#disabled = disabled\n\n this.productCount = null\n }\n\n set disabled(value) {\n this.#disabled = !!value\n }\n\n get disabled() {\n return this.productCount !== null ? this.productCount === 0 : this.#disabled\n }\n\n set selected(value) {\n this.#selected = !!value\n }\n\n get selected() {\n return this.#selected\n }\n\n get filterKey() {\n return this.#filterKey\n }\n\n get filterType() {\n return this.#filterType\n }\n\n get value() {\n return Array.isArray(this.#value) ? this.#value.join(',') : this.#value\n }\n\n get label() {\n return this.#label\n }\n\n get color() {\n return this.#color\n }\n\n get icon() {\n return this.#icon\n }\n\n // disabled=\"${isDisabled(e.type, v)}\"\n render() {\n const productCountLabel = this.productCount !== null ? ` (${this.productCount})` : ''\n\n return `<nb-chip\n id=\"${this.#filterKey}-${this.#value}\"\n data-filter-value=\"${this.#value}\"\n data-filter-key=\"${this.#filterKey}\"\n data-filter-label=\"${this.#label}\"\n checked=\"${this.#selected}\"\n disabled=\"${this.#disabled}\"\n ${this.#icon ? `icon=\"${this.#icon}\"` : ''}\n ${this.#color ? `color=\"${this.#color}\"` : ''}\n >${this.#label}${productCountLabel}</nb-chip>`\n }\n}\n","import Filter from './filter'\nimport DefaultFilterChipType from './types/DefaultFilterChipType'\n\nconst getCategoryData = (categories, id) => {\n // Restrict filter to NOT use categories containing the word \"label\"\n const findCategory = categories?.find(\n category => category.id === id && !category.id.includes('label')\n )\n return findCategory\n ? {\n // todo this icon should be fixed into the DTO product for all attributes\n icon: findCategory.icon?.icon,\n color: findCategory.cssColorCode ? findCategory.cssColorCode : null,\n label: findCategory.name\n }\n : null\n}\n\nexport default (filterDefinition, categories, categoriesData) => {\n if (!filterDefinition || !categories) {\n console.error('CREATE_FILTER_DEFINITION_CATEGORY_NOT_FOUND')\n return []\n }\n\n const filters = filterDefinition.map(filter => new Filter(filter))\n categories\n .reduce((acc, category) => acc.concat(category.products), [])\n .forEach(product => {\n filters.forEach(filter => {\n const filterKey = filter.key\n const filterType = filter.type\n const fieldValue = product[filterKey]\n typeof fieldValue === 'object'\n ? fieldValue.map(attribute => {\n const data = getCategoryData(categoriesData, attribute)\n if (data) {\n filter.pushValues(\n new DefaultFilterChipType({\n filterKey,\n filterType,\n value: attribute,\n icon: filter.iconFn?.(attribute),\n label: data.label,\n color: data.color ?? null\n })\n )\n }\n })\n : filter.pushValues(\n new DefaultFilterChipType({\n filterKey,\n filterType,\n value: fieldValue,\n icon: filter.iconFn?.(filterKey),\n label:\n typeof filter.filterFn === 'function'\n ? filter.filterFn(fieldValue)\n : fieldValue\n })\n )\n })\n })\n\n return filters\n}\n","/**\n * Price filter\n * We want to get 3 chips, low-price range, mid-price range, high-price range.\n * For this, take the list of unique prices, sort, and divide into thirds.\n * This ensures that all products will fall within one of the three price ranges.\n * Using unique prices ensures that there are not overlaps between ranges (will\n * also work even if prices have decimal values).\n */\nimport Filter from '../../plp-core/filter/filter'\nimport DefaultFilterChipType from '../../plp-core/filter/types/DefaultFilterChipType'\n\nconst MIDDLE_THIRD_MIN_RATIO = 0.33\nconst MIDDLE_THIRD_MAX_RATIO = 0.66\n\nexport const getPriceFilter = (categories, PBprops, translations, priceHelper) => {\n if (!categories) {\n console.error('plp-machine.filterPrice.dto.js categories is not defined')\n return []\n }\n\n const uniquePrices = categories\n .map(category => category.products.map(product => product.price))\n .flat()\n .sort((a, b) => parseFloat(a) - parseFloat(b))\n .filter((price, index, arr) => arr.indexOf(price) === index)\n\n if (uniquePrices.length < 3) {\n console.error('plp-machine.filterPrice.dto.js not enough unique prices for filter')\n return []\n }\n\n const min = 0\n const max = -1\n const middleBottom = Math.round(uniquePrices.length * MIDDLE_THIRD_MIN_RATIO) - 1\n const middleTop = Math.round(uniquePrices.length * MIDDLE_THIRD_MAX_RATIO) - 1\n\n /**\n * @description\n * define the filter object data\n */\n const priceFilter = new Filter({\n type: 'default',\n key: 'priceFilter',\n title: translations['productlistrespblock.filterlabels.price']\n })\n\n const PRICE_RANGES = [\n {\n min: uniquePrices.at(min),\n max: uniquePrices.at(middleBottom),\n label: PBprops.copywriting.filter_group_price_low || 'Low {range}',\n value: 'low-price'\n },\n {\n min: uniquePrices.at(middleBottom + 1),\n max: uniquePrices.at(middleTop),\n label: PBprops.copywriting.filter_group_price_medium || 'Mid {range}',\n value: 'mid-price'\n },\n {\n min: uniquePrices.at(middleTop + 1),\n max: uniquePrices.at(max),\n label: PBprops.copywriting.filter_group_price_high || 'High {range}',\n value: 'high-price'\n }\n ]\n\n PRICE_RANGES.forEach(price => {\n priceFilter.pushValues(\n new DefaultFilterChipType({\n value: [price.value],\n label: price.label.replace(\n '{range}',\n ` ${priceHelper.priceFormatter.short(\n priceHelper.currency,\n price.min\n )} - ${priceHelper.priceFormatter.short(priceHelper.currency, price.max)}`\n ),\n filterType: priceFilter.type,\n filterKey: priceFilter.key\n })\n )\n })\n\n // Add the priceFilter array to each product\n // Todo: confirm if unique prices will be used then this can be added as a string with just\n // one value, if overlaps will be allowed then an array of ranges will be needed.\n categories.forEach(category => {\n category.products.forEach(product => {\n product.priceFilter = PRICE_RANGES.reduce((acc, range) => {\n if (product.price >= range.min && product.price <= range.max) {\n acc.push(range.value)\n }\n return acc\n }, [])\n })\n })\n\n return [priceFilter]\n}\n","import createFilter from '../../plp-core/filter/createFilter'\nimport { getPriceFilter } from './plp-machine.filterPrice.dto'\n\nexport const getMergedFilterData = (\n categories,\n PBprops,\n categoriesExtraData,\n translations,\n priceHelper\n) => {\n const colorFilter = categoriesExtraData.some(ele => ele.cssColorCode)\n if (!colorFilter) {\n return [...getPriceFilter(categories, PBprops, translations, priceHelper)]\n }\n return [\n ...createFilter(\n [\n {\n type: 'default',\n key: 'colorFilter',\n title: translations['productlistrespblock.filterlabels.color'] || 'Color'\n }\n ],\n categories,\n categoriesExtraData,\n PBprops\n ),\n ...getPriceFilter(categories, PBprops, translations, priceHelper)\n ]\n}\n","/**\n *\n * @param PBprops\n * @returns {[\n * {\n * checked: boolean,\n * id: string,\n * label: (string|*),\n * key: string,\n * order: asc|desc\n * }\n * ]}\n * Note: The first element is the default sort order\n * Note: The order of the sort array is important\n *\n */\nexport const getMergedSortData = PBprops => [\n {\n id: 'default',\n label: PBprops.copywriting.dropdown_recommended_option_label,\n key: 'recommended',\n order: 'asc',\n checked: true\n },\n {\n id: 'sortPriceAscending',\n label: PBprops.copywriting.dropdown_price_ascending_option_label,\n key: 'price',\n order: 'asc',\n checked: false\n },\n {\n id: 'sortPriceDescending',\n label: PBprops.copywriting.dropdown_price_descending_option_label,\n key: 'price',\n order: 'desc',\n checked: false\n }\n]\n","import appData from './plp.data'\nimport {\n POPIN_ID,\n FILTER_MAIN_BLOCK_ID,\n NAVIGATION_MAIN_BLOCK_ID,\n PRODUCTS_LIST_MAIN_BLOCK_ID,\n PRODUCTS_RESULTS_MAIN_BLOCK_ID,\n CB_RESULTS_TOTAL_ID\n} from '../config/constants'\nimport { dispatchEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\nimport { EVENT_POPIN_OPEN } from '@kissui/components'\nimport { setAttributes } from '@kissui/helpers/src/utils'\n\nexport default {\n onloadSuccess: function () {\n const plpApp = document.getElementById(PRODUCTS_LIST_MAIN_BLOCK_ID).parentElement\n plpApp.setAttribute('data-loaded', appData.sessionId)\n },\n /**\n * State: list of products\n */\n readyForPlay: function () {\n const filter = document.getElementById(FILTER_MAIN_BLOCK_ID)\n const navigation = document.getElementById(NAVIGATION_MAIN_BLOCK_ID)\n const productList = document.getElementById(PRODUCTS_LIST_MAIN_BLOCK_ID)\n const productsResults = document.getElementById(PRODUCTS_RESULTS_MAIN_BLOCK_ID)\n\n filter.setAttribute('data-request', appData.sessionId)\n filter.setAttribute('data-filter-counter', appData.filtersSelectedCount())\n navigation.setAttribute('data-request', appData.sessionId)\n productList.setAttribute('data-request', appData.sessionId)\n\n filter.style.display = 'block'\n\n navigation.style.display = 'block'\n\n productList.style.display = 'block'\n\n productsResults.style.display = 'none'\n\n if (appData.get('hide_sort_and_filter')) {\n filter.classList.add('hide-sort-and-filter')\n }\n\n document.getElementById(PRODUCTS_RESULTS_MAIN_BLOCK_ID).style.display = 'none'\n },\n /**\n * State: list of products filtered\n */\n readyForShowResults: function () {\n const filter = document.getElementById(FILTER_MAIN_BLOCK_ID)\n const navigation = document.getElementById(NAVIGATION_MAIN_BLOCK_ID)\n const productList = document.getElementById(PRODUCTS_LIST_MAIN_BLOCK_ID)\n const productsResults = document.getElementById(PRODUCTS_RESULTS_MAIN_BLOCK_ID)\n const cbResultsTotalText = document.getElementById(CB_RESULTS_TOTAL_ID)\n\n filter.style.display = 'block'\n filter.setAttribute('data-request', appData.sessionId)\n filter.setAttribute('data-filter-counter', appData.filtersSelectedCount())\n\n if (navigation) navigation.style.display = 'none'\n\n if (productList) productList.style.display = 'none'\n\n if (productsResults) {\n productsResults.setAttribute('data-request', appData.filtersSelectedSerialized())\n productsResults.style.display = 'block'\n }\n if (cbResultsTotalText) {\n cbResultsTotalText.textContent = appData.productsFilteredCount()\n }\n },\n /**\n * State: filter popin opened\n */\n readyForFilter: function () {\n // check if the popin is in the page\n let plpFilterPopin = document\n .getElementsByClassName('plp-app')[0]\n ?.querySelector(`#${POPIN_ID}`)\n\n if (!plpFilterPopin) {\n // todo test performance of this & new Popin()\n plpFilterPopin = setAttributes(\n document.createElement('nb-popin', {\n is: customElements.get('Popin')\n }),\n {\n 'data-request': appData.sessionId,\n id: POPIN_ID,\n popin_id: POPIN_ID,\n variation: 'before',\n bgcolor: 'white',\n heading: appData.translations['productlistrespblock.filter.label'],\n label_close: 'close',\n content:\n '<plp-filter-popin class=\"plp-filter-popin-content\"></plp-filter-popin>'\n }\n )\n document.getElementsByClassName('plp-app')[0]?.appendChild(plpFilterPopin)\n // todo wrong way to open the popin\n dispatchEvent({ eventName: EVENT_POPIN_OPEN, args: { id: POPIN_ID } })\n } else {\n // todo wrong way to open the popin\n plpFilterPopin.querySelector('plp-filter-popin').setAttribute('data-refresh', 'true')\n dispatchEvent({ eventName: EVENT_POPIN_OPEN, args: { id: POPIN_ID } })\n }\n },\n /**\n * State: shows the error\n */\n showError: function (e) {\n const errorMessage = e.detail.err || 'Error'\n console.error(errorMessage)\n }\n}\n","import PLPApp from '../plp-core/plp.app'\nimport { getMergedPLPData, getMergedFilterData, getMergedSortData } from './dataTransform'\nimport appStates from '../plp-core/store/plp.states'\nclass PLPMachine extends PLPApp {\n constructor() {\n super()\n this.plpType = 'machine'\n this.dataTransformService = getMergedPLPData\n this.dataFiltersService = getMergedFilterData\n this.dataSortService = getMergedSortData\n this.appStates = appStates\n }\n}\n\ncustomElements.get('nb-plp-machine') || customElements.define('nb-plp-machine', PLPMachine)\n\nexport default PLPMachine\n"],"names":["EVENT_COLOR_CLICKED","createProps","attributes","data","find","attribute","nodeName","getData","props","filter","reduce","all","attr","nodeValue","isNil","JSON","parse","error","console","log","obj","dispatchEvent","eventName","args","element","window","Error","event","CustomEvent","detail","bubbles","Event","document","createEvent","initEvent","readEvent","e","BREAKPOINT_TABLET","BREAKPOINT_M","EVENT_POPIN_OPEN","EVENT_POPIN_CLOSE","EVENT_POPIN_CLOSED","EVENT_POPIN_KEY_DOWN","EVENT_SLIDER_READY","EVENT_SORT_BY_CHANGE","EVENT_SWIPED_DOWN","CONTRAST_LIGHT","getCurrency","config","padl","namespace","dataLayer","app","currency","ECAPI_TYPE_CAPSULE","ECAPI_TYPE_MACHINE","ECAPI_TYPE_ACCESSORY","ECAPI_TYPE_GIFT_CARD","TECHNOLOGY_CATEGORY_IDENTIFIER","getPriceFormatter","async","napi","priceFormat","getProduct","sku","catalog","replace","trimSku","getTechnologyName","productData","techno","technologies","substring","indexOf","isBundled","sales_multiple","salesMultiple","isSalesMultipleGreaterThanOne","isUnitQuantityEqualToOne","unitQuantity","isSalesMultipleEqualToOne","isUnitQuantityGreaterThanOne","fetcherService","fetcher","apiRatings","ratings","apiPriceFormat","priceFormatter","getApiProduct","getOne","product","withRating","fetchOne","api_override","name","headline","description","apiProduct","productCategories","productDetails","supercategories","Promise","map","categoryEncoded","getCategory","getProductCategories","overrides","longSku","id","price","pdp_urls","getValueObject","images","slides","type","productRatings","ratingEnabled","rating","getRating","bundled","intensity","capsuleProperties","unit_quantity","getValueNumber","variant","giftcard_price","icon","default_image","merge","force","mergedProduct","key","Object","keys","empty","defaultValue","parseInt","length","toFloat","ratingAverage","summary","value","decimal","parseFloat","toFixed","loadPriceFormat","getAll","productList","fetchedProduct","splice","formatPrice","short","_getCurrency","color","HTMLElement","connectedCallback","this","render","createEventListeners","addEventListener","handleClick","link","label","code","a11y_label","selected","size","createElement","setAttribute","classList","add","innerHTML","outerHTML","customElements","get","define","Colors","constructor","_apiProducts","_colors","_maxColors","updateMaxColors","fetchColors","hasColorData","colors","every","hasAllProps","onColorChange","heading","renderColors","renderExtraColors","renderColor","bind","join","activeSku","extra_url","extra_title","extraColorsLength","Math","max","clampColor","preparedColors","prepareColors","fetchColor","prevent","apiColor","colorShade","cssCode","undefined","pdpURLs","desktop","push","hasSKU","slice","colorItem","max_colors","$event","CardLabels","super","labels","direction","renderLabels","bgColor","NespressoElement","template","_createProps","onStart","loadTemplate","onReady","forceAttributes","_diff","elem","_getNodeType","node","nodeType","tagName","toLowerCase","_getNodeContent","childNodes","textContent","domNodes","Array","prototype","call","templateNodes","count","parentNode","removeChild","forEach","index","appendChild","cloneNode","replaceChild","templateContent","fragment","createDocumentFragment","templateHTML","str","DOMParser","parseFromString","body","disconnectedCallback","onDestroy","helper","is","innerWidth","vw","devicePixelRatio","mobile","mobile_tablet","tablet","retina","lt","ref","parseHTML","tmp","implementation","createHTMLDocument","makeId","result","characters","i","charAt","floor","random","removeEmptyValues","findText","text","includes","getHashLink","linkHash","linkNoHash","lazyLoad","url","inViewPort","cb","img","Image","src","onload","onerror","test","navigator","userAgent","agent","start","Number","substr","lazyBackgroundObserver","IntersectionObserver","entries","entry","isIntersecting","unobserve","target","observe","isOldIOS","stringifyForAttribute","escapeHtml","stringify","m","sanitizeString","toString","setAttributes","attrs","renderImage","image_alt_text","image","quick_view_plp","theme","renderClass","show_view","linkHref","trim","VARIATION_PLP","VARIATION_PDP","isPdp","variation","renderHeading","name_custom","finalName","headingLevel","getHeadingLevel","viewportHelper","renderLink","a11y_product_card","a11yProductName","renderHeadline","is_headline_hidden","renderLabelTechnology","label_technology","renderLabelRange","label_range","getStrikethroughPriceElement","component","querySelector","fetchStrikethroughPrice","strikethroughPrice","html","getFormattedPrice","getDataLayer","padlNamespace","getMarketCode","market","toLocaleLowerCase","getLangCode","page","pageInfo","language","isLoggedIn","user","renderAddToCart","activeLongSku","category_name","contact_cta","hidePrice","position","rendererName","show_view_details","view_details_label","disableTracking","buttonSize","getButtonSize","cta_url","cta_label","contact_cta_text","contact_url_anchor","is_b2b","isArray","some","tech","checkForB2B","skuProp","activeLongSkuProp","disableTrackingProp","getComputedProps","b2bLoggedIn","remainingCases","b2bNotLoggedIn","LABEL_CATEGORY_NAME","LABEL_CATEGORY_NAME_MACHINE","COMMON_URL","ORGANIC_LOGO_IMG_EU","ORGANIC_LOGO_IMG_US","ORGANIC_LOGO_IMG_CA","ORGANIC_LOGO_IMG_BR","ORGANIC_LOGO_IMG_JP","ORGANIC_LOGO_IMG_BE","VERTUONEXT_LOGO_IMG","RAINFOREST_LOGO_IMG","SUSTAINABILITY_LOGO_IMG","Q_CERTIFICATION_ARABICA_LOGO_IMG","DESIGN_AWARD_2021_IMG","LOGO_IMG_MAP","fair_trade","is_organic","organicLogoImg","getOrganicLogo","only_vertuo_next","is_q_certified_arabica","is_rainforest","is_sustainable","is_design_award_2021","getLabels","categories","category","getCategoryRegEx","isLabel","categoryIdTail","RegExp","isCategoryHidden","categoryId","hideCategory","PLP_HIDE_CATEGORIES","findIndex","c","PLP_ONLY_SHOW_CATEGORIES","getMaxIntensity","INTENSITY_MAX_OL","getMergedProductCoffeeData","pageBuilderProductProps","pageBuilderProps","bundle_details","options","show_sleeve_price","isBundledResult","showCapsulePrice","price_per_capsule","final_price","round","getFinalPrice","option","max_intensity","show_capsule_price","apiOverride","pageBuilderData","main","VARIATION_CROSS_SELL","getCapsuleFeatures","acidity","bitterness","roastLevel","roast","getSkuQuickViewProp","popinId","skuData","componentType","mergedProductData","getMergedProductDataForComponentType","addToCartProps","getAddToCartProperties","isVariationOnPLP","getPlpQuickViewProps","getCrossSellQuickViewProps","matchedProduct","products","productPageBuilder","legacyId","getMergedProductData","strikethrough_price","additional_message","additional_message_icon","additional_message_link","internationalId","rangeData","rawPrice","highlighted","dataTransformObjectProductType","getMergedProductMachineData","ratingsAndReviews","show_ratings","minimum_rating","getMergedProductAccessoryData","getMergedProductGiftCardData","_","getAddToCartProps","commonProps","label_capsules","capsule_price_label","capsule_price_syntax","show_sleeve","sleeve_syntax","number_of_sleeves","label_sleeves","label_sleeve","popin","popin_id","close","footer","intensity_label","a11y_intensity_max","cup_sizes","items","cupSizesDetails","aromatic_profile","capsuleProductAromatics","levels","pricing","add_to_cart","showSleeve","campaign","copywriting","sku_quick_view","emitCustomEvent","customEvent","cancelable","composed","eventsHelper","eventListeners","eventListener","listener","remove","removeEventListener","raisedByPB","raisedByWC","eventData","gtmDataObject","event_GA4","eventRaisedBy","event_raised_by","trackComponentInteraction","creative","actionType","internationalName","productType","technology","eventAction","component_name","action_type","item_id_event","item_name_event","item_category_event","item_technology_event","item_range_event","item_price_event","eventCategory","eventLabel","viewPromotion","ecommerce","ecommerceData","promotion_id","promotion_name","creative_slot","creative_name","handlePromoClick","cta_name","cleanedData","selectPromotion","getProductInfo","getProductPayload","actionField","unitPrice","inStock","item","split","pop","dimension44","dimension53","dimension54","dimension55","dimension56","dimension57","dimension192","brand","productImpression","list","p","productInfo","productPayload","currencyCode","impressions","productClick","click","filterActionEvent","filterType","filterValues","clickLocation","dataType","getExplicitFilterEventData","NEXT_V1_PLP_EXPLICIT_FILTER_TRACKING","experiment_action","filter_type","filter_values","click_location","Sku","isQuickViewPlp","boundOnPDPLinkClick","onPDPLinkClick","boundOnQuickViewOpen","onQuickViewOpen","clickMethod","setCardTheme","assign","getSleevePrice","checkHiddenPriceForLoggedInUser","renderVisual","renderHeader","renderInformation","renderQuickView","renderPricing","renderAction","renderFooter","bindEvent","renderHeaderDefault","renderLogos","alt_fair_trade","alt_organic","alt_vertuo_next","alt_rainforest","alt_sustainable","alt_q_certification_arabica","logos","renderVisualDefault","hasAttribute","sleevePrice","hasPricePerSleeve","renderInformationDefault","quick_view","tracking_list","tracking_position","campaign_creative","colorsSkusList","renderPricingDefault","isPortrait","renderStrikethroughPrice","then","payload","catch","style","display","renderPrice","finalPrice","renderActionDefault","actionSlot","renderFooterDefault","renderAdditionalMessage","additionalMessageFinal","renderIcon","seo_label","productIndex","getAttribute","renderSkuQuickView","quickViewElement","handleVariation","Ai","handlePLPVariation","_s","handleCrossSellVariation","more_info","parentElement","newQuickViewElement","getSkuQuickViewData","preventDefault","unbindEvent","showQuickView","quickViewTextExists","quick_view_text","querySelectorAll","addStopPropagationEvent","removeStopPropagationEvent","selector","stopPropagationHandler","stopPropagation","DISPLAY_COLOR_MAX","a11y_extra_color","getRatingDetails","itemStr","localStorage","getItem","Date","getTime","expiry","removeItem","getWithExpiry","setWithExpiry","setItem","isRated","reviewCount","renderRatings","ratingElementBlock","err","Deferred","promise","resolve","reject","scrollTo","scrollDuration","baseScrollDuration","deferred","scrollPosition","resolveScrollPosition","scrollPaddingTop","scrollToElement","scrollY","getBoundingClientRect","top","currentTime","initialTimestamp","performance","now","deltaScroll","resolveScrollDuration","viewportHeight","innerHeight","bodyHeight","clientHeight","abs","finalTimestamp","requestAnimationFrame","step","currentTimestamp","moveStep","setTimeout","reviewLink","boundOnColorClick","onColorClick","boundOnReviewLinkClick","onReviewLinkClick","a11y_energy_label","energy_level","level","renderEnergyLabel","renderInformationPDP","renderInformationPLP","showVoltage","review_cta","reviews_cta","ctaLabel","renderRatingsWithData","show_voltage","voltage_label","voltage_list","a11y_voltage_label","renderVoltage","formatter","newLabels","responsiveImages","standard","finally","bus","_bus","register","callback","fire","EventBus$1","Cta","observedAttributes","boundHandleClick","slot","aria_label","aria_label_after","aria_label_before","contrast","icon_left","icon_right","label_update","link_new_tab","long_sku","transparent","ariaLabel","textClass","removeListeners","addListeners","track","event_id","qs_id","EventBus","openQuantitySelector","campaign_id","campaign_name","campaign_position","campaign_instance_index","tracking_slot_prefix","sku_data","ctaOrPopin","slotContent","instanceIndex","cta_name_value","tabbed_component","componentName","attributeChangedCallback","LAZYLOAD_CUSTOM","PROFILES","sizes","Img","__privateAdd","_initLazyLoad","_setImPolicyQuery","_getRetinaWidth","_getImpolicyProfile","_getClosests","_setCssProperties","_setCssProperty","__privateMethod","initLazyLoad_fn","file","lazyload","fetchpriority","setImPolicyQuery_fn","setCssProperties_fn","parentClass","firstElementChild","WeakSet","#initLazyLoad","#setImPolicyQuery","aspect_ratio","force_width","force_height","impolicy","width","offsetWidth","w","h","finalWidth","getRetinaWidth_fn","getImpolicyProfile_fn","#getRetinaWidth","#getImpolicyProfile","exactFound","closests","getClosests_fn","tempDiff","diff","closest","#getClosests","profile","found","el","#setCssProperties","object_fit","placeholder_color_light","placeholder_color_dark","error_message","setCssProperty_fn","#setCssProperty","setProperty","Link","setClassHelper","bindEvents","image_alt","renderButton","tracking_label","a11y_label_new_tab","phantom","cta_link_type","sizeClass","sku_colors","quickView","linkOrPopin","unbindEvents","Viewport","observer","IntersectionObserverEntry","onChange","threshold","rootMargin","Element","observables","observable","requestIdleCallback","runTrack","zoneTracking","tracking","ZoneTracking","destroy","getIom","hasIntersectionObserver","isObjectEmpty","Container","initTracking","initLazyLoad","getBgImgUrl","lazy_load","background_mobile","background_tablet","background_desktop","background_retina","styles","background_color","classname","element_class","contrastDefault","hasBgImage","renderBg","d","r","Chip","checkbox","computedSlot","computeSlot","onclick","content","background_image","filter_label_AA","rounded","checked","disabled","checkedAttr","disabledAttr","inputId","hash","charCodeAt","makeHash","getElementsByTagName","newValue","recursiveSwitchAriaHidden","componentOpenState","parent","brothers","children","brother","removeAttribute","focusin","loop","contains","lastFocused","firstFocusable","lastFocusable","focus","setFirstAndLastFocusable","focusable","Dropdown","isOpen","buttonElement","onClickOutside","aa_description","element_id","element_name","renderSelected","renderOptions","buttonElementValue","dropdownMenu","selectedOption","aa_listbox_description","aa_select_description","icon_option","boundHandleLabelClick","handleLabelClick","boundHandleMobileClose","handleMobileClose","boundFocus","boundFocusin","boundKeyNav","keyNav","toogleDropdown","selectedOptionId","dataset","reRender","selectedlabel","setSelected","dispatchChange","tmpSelected","open","switchAriaModal","openingSource","activeElement","prevOption","nextOption","firstOption","lastOption","prevSibling","previousElementSibling","nextSibling","nextElementSibling","ProductTracking","range","noImpression","getPLPCategory","getPLPData","configuration","eCommerceData","getCategoriesWithPlpData","cupSizes","flavors","ranges","categoryData","isTechnologyCategory","getCategories","superCategory","buildGTMProductObject","capitalize","s","toUpperCase","dimension130","productSelections","impressionsOnScrollData","dimension43","AddToCart","elementID","addToCartCounter","isWindowNapiActive","getConfig","pushButton","getElementById","ui","module","productId","activated","productTracking","getProductData","getSkuKey","plpData","allKeys","currentKeyIndex","__publicField","_AddToCart","SLIDER_CHIPS_ID","PlpStickyBar","boundReinitSlider","reinitSlider","boundLinkClick","linkClick","dropdownButtons","navigation","navigation_bubbles","renderLinksSelect","renderChipsSlider","dropdown","navigationBubble","links","a11y_slider_previous_button","a11y_slider_next_button","selected_nav_link_label","forceSliderWidth","dropdownWidth","navigationBubbleWidth","initSlider","currentTarget","location","href","swipeEvents","stopEl","nwcSwipeEvents","scrollTopArray","scrollLeftArray","scrollTop","scrollLeft","memorizeStartElScrollPositions","startEl","timeDown","touches","clientX","clientY","xDiff","yDiff","xDown","yDown","xUp","yUp","defaultVertical","defaultHorizontal","swipeThresholdVertical","getNearestAttribute","swipeThresholdHorizontal","swipeTimeout","timeDiff","eventType","changedTouches","checkScrollCondition","dir","touchType","xStart","xEnd","yStart","yEnd","isScrollable","scrollHeight","scrollWidth","clientWidth","attributeName","documentElement","attributeValue","String","Overlay","overlay","getElementsByClassName","STATE_OPEN","SCROLL_LOCK","Popin","ariaModal","isVideo","boundOpen","boundClose","boundEscapeClose","escapeClose","oldValue","hasEvent","subheading","bgcolor","label_close","heading_class","heading_id","checkIsVideo","parseBool","tempEl","addLock","removeLock","cancelBubble","openVideoPopin","swipeDown","swipeOverlayTogglePlayPause","boundSwipeDown","swipeOverlay","boundSwipeOverlayTogglePlayPause","CardLogos","logos_list","param","appendLogo","apply","logo","alt","hasLogo","logosList","logoName","slidesContainer","next","prev","colours","SliderMenu$1","boundNextClick","onNextClick","boundPrevClick","onPrevClick","onLinkClick","boundTouchEnd","onTouchEnd","disableAutoScroll","_entriesBounds","_element","_slides","_options","last_known_scroll_position","ticking","navBarTravelDirection","navBarTravelling","navBarTravelDistance","scrollAmount","buildIHM","setOverflowAttribute","initializeIndicatorPosition","_root","_container","_pnIndicator","_containerSlidesContent","hasContainer","constants","wrapItems","insertBefore","createIndicator","child","randId","tag","className","div","elements","from","pnAdvancerLeft","pnAdvancerRight","goToElement","goToSlide","showContent","contentId","deselectAllLinkBut","distance","boundingClientRect","scroll","left","behavior","sideScroll","speed","slideTimer","setInterval","clearInterval","moveIndicator","determineOverflow","container","containerMetrics","containerMetricsRight","right","containerMetricsLeft","contentMetrics","contentMetricsRight","contentMetricsLeft","textPosition","transform","link_plp_category_padding_x","backgroundColor","onResize","clearListeners","kill","intersection","disconnect","root","isInViewport","entryBound","SliderMenu","randomId","sliderMenu","boundOnResize","onLoad","debouncedOnResize","debounce","func","time","timer","clearTimeout","loadSwiper","SliderMenuLib","li","firstChild","itemTypes","itemDisplay","rootElement","slider","onNavigationClick","SliderNatural","_waitForSliderToBeSized","_set","_getOption","_setProperties","_render","_renderButtons","_renderButton","_renderNav","_renderBullet","_renderCounter","_renderGradients","_renderSafariFix","_calculateItemsPerSlide","_getSliderPositions","_setCss","_setCssSlideWidth","_setCssSlideMinHeight","_setCssSliderGap","_setCssFlexAuto","_setCssPlaceholder","_setCssItemsPerSlide","_applyCenteredLayout","_updateStates","_updateStatesScroll","_setActiveButtons","_setActiveBullet","_setCounter","_setActiveSlides","_gotoDefaultPosition","_onScroll","_getOpacityParams","_setOpacity","_switchBullets","_onPrevClick","_onNextClick","_onNavClick","_dispatchReady","_bindEvent","_unbindEvent","defaultPosition","displayButtons","displayNav","displayCounter","displayGradients","itemsPerSlide","overflow","overflowOpacity","flexAuto","onPrevClick_fn","onNextClick_fn","boundNavClick","onNavClick_fn","boundScroll","onScroll_fn","render_fn","testId","setProperties_fn","loops","waitForSliderToBeSized_fn","dispatchReady_fn","wait","slidesElements","itemNumber","set_fn","item_width","items_per_slide","calculateItemsPerSlide_fn","setCssSlideWidth_fn","setCssItemsPerSlide_fn","setCssFlexAuto_fn","maxSlides","renderButtons_fn","renderNav_fn","renderCounter_fn","renderGradients_fn","applyCenteredLayout_fn","getSliderPositions_fn","getOpacityParams_fn","setOpacity_fn","updateStates_fn","bindEvent_fn","gotoDefaultPosition_fn","renderSafariFix_fn","updateSlider","instantly","currentIndex","carousel","sliderPositions","unbindEvent_fn","#waitForSliderToBeSized","#set","normalisedValue","getOption_fn","convertToCamelCase","arr","match","low","k","#getOption","isNaN","#setProperties","a11y_labels","wrapper","property","buttonsContrast","setCssSlideMinHeight_fn","setCssSliderGap_fn","setCssPlaceholder_fn","#render","#renderButtons","prevButton","nextButton","renderButton_fn","#renderButton","pos","renderInCounter","buttonContrast","isPrev","buttonEl","counter","prepend","append","#renderNav","nav","bullets","renderBullet_fn","navElements","#renderBullet","#renderCounter","#renderGradients","gradientsWidth","setCss_fn","gradientsColor","#renderSafariFix","isSafari","safariFix","safariFixWidth","paddingCorrection","sliderGap","#calculateItemsPerSlide","itemWidth","#getSliderPositions","maxScroll","firstItemOffsetLeft","offsetLeft","#setCss","isRem","#setCssSlideWidth","itemWidthAuto","#setCssSlideMinHeight","slideMinHeight","#setCssSliderGap","#setCssFlexAuto","#setCssPlaceholder","placeholderBackground","#setCssItemsPerSlide","#applyCenteredLayout","#updateStates","setActiveButtons_fn","setActiveBullet_fn","setCounter_fn","setActiveSlides_fn","updateStatesScroll_fn","#updateStatesScroll","#setActiveButtons","#setActiveBullet","#setCounter","#setActiveSlides","tempIndex","#gotoDefaultPosition","#onScroll","isScrolling","carouselScrollLeft","switchBullets_fn","#getOpacityParams","getComputedStyle","getPropertyValue","itemWidthAdjusted","#setOpacity","scrollX","itemX","percentage","opacityPercentage","finalOpacity","#switchBullets","alreadyScrolled","#onPrevClick","#onNextClick","#onNavClick","#dispatchReady","#bindEvent","#unbindEvent","createRefs","extract","refs","$ref","refArray","getRefArray","getImpolicy","policy","rules","STATE_DISABLED","Bubble","setState","src_retina","visual","getResponsiveImpolicy","mobileWidth","tabletWidth","desktopWidth","retinaWidth","state","a11y_scrollto","renderLabel","setTheme","IntersectionObserverService","observers","Map","create","has","warn","targets","set","delete","destroyAll","clear","EVENT_NAVIGATION_SECTION_CHANGE","NB_SLIDES_STICKY","INTERSECTION_RATIOS_SECTION","SLIDER_CONFIG_DEFAULT","display_gradients","display_nav","placeholder_background","slide_min_height","slider_gap","NavigationBubbles","isMobile","scrollObserver","sticky","isSticky","isCenteredItems","is_centered_items","init","eventsListeners","bindSliderLinksEvents","geometry","getGeometry","onSliderLinkClick","sectionId","finalLabel","plpListLabel","bubbleLabel","onSectionChange","updateBubbles","updateChips","createListeners","once","updateLayout","eventsManager","renderNavigation","getSliderOptions","flex_auto","gradients_color","gradients_width","slider_id","a11y_goto_slide","renderList","sliderOptions","sliderData","display_buttons","renderFunction","bubble","renderBubble","bubbleWithCampaign","renderChip","chip","bubbleId","chips","chipId","isChecked","_index","sliderChip","emit","header","stickyBarHeight","height","scrollOptions","preventScroll","$header","$stickyBar","headerRect","y","stickyBarRect","runningExperiments","Set","runningExperiment","experiment","EXPLICIT_FILTERS","FILTER_MAIN_BLOCK_ID","SORT_MENU_ID","POPIN_ID","NAVIGATION_MAIN_BLOCK_ID","PRODUCTS_LIST_MAIN_BLOCK_ID","PRODUCTS_RESULTS_MAIN_BLOCK_ID","CB_RESULTS_TOTAL_ID","MY_RECOMMENDATIONS_ID","QUERY_URL_PARAMETER_FILTERS","QUERY_URL_PARAMETER_SORT","appData","_productsFlat","sessionId","plpType","plpDataType","reload","initPriceFormatter","initCurrency","read","filters","productsList","getProducts","acc","concat","productsListFiltered","withSort","selectedFilters","filterPredicate","filterProductsByFilterType","doesProductMatchFilter","filterProductsByAllFilters","filteredList","sortCurrent","order","sorter","isAscending","a","b","createSorter","sort","sortProducts","productsFilteredCount","filtersUpdate","filterSelection","fireAll","f","setFilterValue","filterChipsUpdate","filtersUpdateMultiple","valueSelections","filtersSelected","filterValueIsEqual","filtersSelectedWithLabel","filterKey","filterValue","foundFilter","filterLabel","values","v","categoryTitle","title","filtersSelectedCount","filtersSelectedSerialized","filtersReset","filterChip","productCount","predicate","subscribe","fn","unsubscribe","fnToRemove","productPropValue","groups","current","groupFiltersByType","types","fSelected","updateUrlVariable","variable","queryArray","path","updateQueryStringParameter","uri","re","separator","encodeURIComponent","pushState","getUrlVariable","queryString","search","URLSearchParams","decodeURIComponent","defaultTracking","getSortTracking","isSorted","sortKey","sortOrder","getFilterTracking","isFiltered","__crema_service__","pageStores","signalStore","ProductsList","signal","ProductDetails","HeaderNavigation","setPageHtml","getStore","pageHtml","getModuleData","moduleName","setModuleData","parser","loadFromUrl","cacheOnly","batch","store","debug","response","fetch","ok","status","statusText","fetchHtml","parseModuleData","moduleScript","scripts","script","parseHtml","lines","line","trimmed","startsWith","jsonString","parseProductScript","appStates","appEvents","process","handlePostEvent","appStatesHandler","loadFromPage","onReload","urlObj","URL","pathname","history","simulatePageChange","_data","onloadSuccess","nextState","onloadError","showError","onMergeData","filtersService","productService","dataSortService","recommendationService","recommendationInstance","mergeData","recommendation","readyToLoadProducts","loadProducts","newData","enabledTechnologies","isSelected","at","translations","nav_links","hide_sort_and_filter","maxIntensity","getTrackingData","mergeProductData","categoriesExtraData","mergeFilters","urlFilters","filterData","cleanFilterDataXSS","source","cleanData","sourceItem","isLast","urlSort","sortData","cleanSortDataXSS","setUrlOverrides","notCurrentTech","handleExperiments","trackLoad","switchProductsPage","readyForShowResults","readyForPlay","onMergeDataError","onFilter","grouped","replaceAll","groupSelectedFilters","groupKeys","filterTrackingFromPlpFilters","onSort","trackInteraction","onloadFilter","onloadFilterSuccess","readyForFilter","onloadFilterError","handleAppEvent","customEventName","eventFn","stateTransitionsManager","_SORT_MENU_ID","WeakMap","formatSortSeparator","componentUpdated","boundOnSortChange","onSortChange","__privateGet","sortButton","_filters","isDisabled","onStoreChanges","labelEl","getLabel","__privateSet","renderBefore","renderAfter","handleChipEvent","itemValue","CATEGORY_IDENTIFIER","a11y_see_result_number_label","getA11ySeeResultsText","see_result_number_label","see_result_number_label_one","filtersTracking","btnReset","btnResult","visibility","see_result_number_label_zero","eventPopinClsed","arguments","bubbleElement","oldVal","newVal","updateBubbleCounter","cta_filter_label","SLIDER_NAV_LINKS_ID","renderLinksList","label_sort_by","aa_description_sort_by","aa_listbox_description_sort_by","aa_select_description_sort_by","label_close_sort_by","_formatSortValue","updateComponent","HTML","filterLinks","service","stickyService","elementHeight","stickyElementSelector","magicIndex","initialize","updateSticky","offsetElement","isReady","offsetTop","offsetHeight","paddingTop","$element","$elementHeight","$stickyElementSelector","$magicIndex","updatePosition","offset","nav_link","data_navigation_bubbles","dataTransformNavigationBubbles","customEventAction","navLinks","dataTransformNavLinks","_isSticky","getNamedItem","navigationBar","colorHtml","renderProduct","getSkuComponentByType","is_machine_b2b","_headerSelector","_resetSelector","shouldHideHeader","productListBkp","headerMarkup","copywritingProps","a11y_header_result_label_button","a11y_header_result_label_reset","a11y_header_result_label_results","header_result_label","header_result_label_reset","header_result_label_results","header_result_label_results_one","header_result_label_results_zero","total","filterLabels","getResultLabel","arraysAreEqual","outerhtml","hasFilters","listName","resetClick","categoryProducts","PLPApp","dataTransformService","dataFiltersService","propChanged","valueChanged","defineTemplate","enabledExperiments","enableExperiment","info","itemsPerRow","items_per_row","Category","PageBuilderData","_id","_name","_description","_products","_capacityLabel","_detailsIcon","_icon","_isLoadingProducts","_rangeLink","_subCategories","_superCategories","_url","_background_retina","_background_desktop","_background_mobile","_background_tablet","_contrast","_isSegment","capacityLabel","detailsIcon","rangeLink","subCategories","superCategories","isLoadingProducts","isProductCategory","MachineCategory","Product","available","maxOrderQuantity","packagingType","pushRatingEnabled","altText","MachineProduct","colorFilter","show_slider","display_machine_range_name","colorCategoryId","navigationLinks","enabledCremaTechnologies","VERTUO_ICON","PRO_ICON","transformCremaTechnologiesToLink","getIconByTechnology","COFFEE_ORIGINAL","hide_technologies_in_navigation","replaceCremaTechnologies","all_products_navigation_label","selectedTechnology","t","navLinksWithoutTechnology","navigationBubbles","productGroups","productsGroup","bubblesFilteredAndSorted","bubblesMathProductsGroup","normalizedBubble","ele","cremaCategory","cremaBubble","unshift","addLabels","highlightLabels","textColor","parsedData","parseLabels","labelGroups","group","__label","productIds","prod","labelGroup","indexToRemove","productGroup","MainDTO","colorFilterFunction","getOverridenProductGroups","applyRecommendationOverrides","getPBProperty","pbProduct","pbProductData","applyProductsOverrides","overriddenCategories","extraData","catData","category_id","categoryObj","productID","productObj","Boolean","applyCategoryOverrides","original","vertuo","getPageBuilderData","field","getMergedPLPData","colorFilters","categoryHmc","cssColorCode","productsOtherColors","productSameRanges","productSameRange","otherProductColor","colorCategories","displayedRanges","productRange","filteredProduct","isDisplayed","productBySku","Filter","_filter","_type","_key","_iconFn","_filterFn","_title","_values","_after","_before","showalllabel","iconFn","filterFn","before","after","pushValues","x","DefaultFilterChipType","_value","_label","_filterType","_filterKey","_color","_selected","_disabled","productCountLabel","createFilter","filterDefinition","categoriesData","fieldValue","getCategoryData","findCategory","getPriceFilter","PBprops","priceHelper","uniquePrices","flat","min","middleBottom","middleTop","priceFilter","PRICE_RANGES","filter_group_price_low","filter_group_price_medium","filter_group_price_high","getMergedFilterData","getMergedSortData","dropdown_recommended_option_label","dropdown_price_ascending_option_label","dropdown_price_descending_option_label","productsResults","cbResultsTotalText","plpFilterPopin","errorMessage","PLPMachine"],"mappings":"koBAAO,MAAMA,EAAsB,sBCE7BC,EAAcC,IACVC,MAAAA,EAHMD,CAAAA,GAAcA,EAAWE,MAAKC,GAAoC,SAAvBA,EAAUC,WAGpDC,CAAQ,IAAIL,IACnBM,EAAQ,IAAIN,GACbO,QAAOJ,GAAoC,SAAvBA,EAAUC,WAC9BI,QAAO,CAACC,EAAKC,KACH,IAAKD,EAAK,CAACC,EAAKN,UAAWM,EAAKC,aACxC,CAAE,GAET,GAAIC,EAAMX,GACCK,OAAAA,EAGP,IACO,MAAA,IAAKA,KAAUO,KAAKC,MAAMb,EAAKU,WACzC,OAAQI,GACLC,QAAQC,IAAI,iBAAkBF,EAAOd,GAAMU,UAC/C,GAGEC,EAAQM,GAAoC,MAARA,ECrB7BC,EAAgBA,EAAGC,UAAAA,EAAWC,KAAAA,EAAMC,QAAAA,MAE7C,IAAKA,EACD,aAAWC,OAAW,KAGZ,MAAA,IAAIC,MACN,yGAHJF,EAAUC,MAIV,CAIJE,IAAAA,EACAJ,EACAI,EAAQ,IAAIC,YAAYN,EAAW,CAAEO,OAAQN,EAAMO,SAAS,IAEvC,mBAAVC,MACPJ,EAAQ,IAAII,MAAMT,IAElBK,EAAQK,SAASC,YAAY,SAC7BN,EAAMO,UAAUZ,GAAW,GAAM,IAGzCE,EAAQH,cAAcM,EAAK,EAGlBQ,EAAYC,IACrB,GAAKA,EAAEP,OAGP,OAAOO,EAAEP,MAAAA,EC3BAQ,EAAoB,KAEpBC,EAAe,IAgBfC,EAAmB,2BAEnBC,EAAoB,4BACpBC,EAAqB,6BAErBC,EAAuB,UAkBvBC,EAAqB,6BAMrBC,EAAuB,+BAQvBC,EAAoB,cAyDpBC,EAAiB,QCnHjBC,EAAcA,IAAMtB,OAAOA,OAAOuB,OAAOC,KAAKC,WAAWC,UAAUC,IAAIA,IAAIC,SCI3EC,EAAqB,UACrBC,EAAqB,UACrBC,EAAuB,YACvBC,EAAuB,WAE9BC,EAAiC,kBAQ1BC,EAAoBC,eAAkBnC,OAAOoC,KAAKC,cAElDC,EAAaC,GAAOvC,OAAOoC,KAAKI,UAAUF,WANvCC,CAAAA,GAAOA,EAAIE,QAAQ,mBAAoB,IAMWC,CAAQH,IAEnE,SAASI,EAAkBC,GACxBC,MAAAA,EAASD,EAAYE,aAAa,GACxC,OAAOD,EAAOE,UACVF,EAAOG,QAAQf,GAAkCA,GAEzD,CA0CO,SAASgB,EAAUL,GAEtBA,EAAYM,eAAiBN,EAAYM,gBAAkBN,EAAYO,cAEvE,MAAMC,EAAgCR,EAAYM,eAAiB,EAC7DG,EAAwD,IAA7BT,EAAYU,aACvCC,EAA2D,IAA/BX,EAAYM,eACxCM,EAA+BZ,EAAYU,aAAe,EAG5DF,QAAAA,IAAiCC,KAK9BE,GAA6BC,EACxC,CAmCO,MCyFPC,EApMgBC,MACNC,MAAAA,EAAa3D,OAAOoC,MAAQpC,OAAOoC,KAAKwB,QACxCC,EAAiB7D,OAAOoC,MAAQpC,OAAOoC,KAAKC,YAClD,IAAIyB,EAAiB,KAErB,MAIMC,EAAgB5B,MAAMI,SAAaD,EAAWC,GA4B9CyB,EAAS7B,MAAO8B,EAASC,KACvB,IACO,aAAMC,EAASF,EAASC,EAClC,OAAQ1E,GACLC,MAAAA,QAAQD,MAAM,qBAAqByE,EAAQ1B,eAAe/C,KACpDA,CACV,GAYE2E,EAAWhC,MAAO8B,EAASC,KACvB,MAAEE,cAAgBC,KAAAA,EAAO,GAAIC,SAAAA,EAAW,GAAIC,YAAAA,EAAc,IAAO,CAAC,GAAMN,EAExEO,QAAmBT,EAAcE,EAAQ1B,KACzCkC,ODyDsBtC,OAAMI,IAChCmC,MAAAA,QAAuBpC,EAAWC,GAClCkC,EAAoBC,EAAiBA,EAAeC,gBAAkB,GAO5E,aANmCC,QAAQ1F,IACvCuF,EAAkBI,KAAI1C,MAAM2C,SACU9E,OAAOoC,KAAKI,UAAUuC,YAAYD,KAG5E,ECjEoCE,CAAqBf,EAAQ1B,KAEvD0C,EAAY,CACdZ,KAAe,KAATA,EAAcA,EAAOG,EAAWH,KACtCC,SAAuB,KAAbA,EAAkBA,EAAWE,EAAWF,SAClDC,YAA6B,KAAhBA,EAAqBA,EAAcC,EAAWD,YAC3DW,QAASV,EAAaA,EAAWW,GAAK,KACtCC,MAAOZ,EAAaA,EAAWY,MAAQ,KACvCC,SAAUC,EAAed,EAAY,WACrCe,OAAQf,EAAWe,OACnBC,OAAQhB,EAAWgB,OACnB1C,aAAc0B,EAAW1B,aACzB2C,KAAMjB,EAAWiB,KACjBhB,kBAAAA,GAcJ,GAXIP,GAAcD,EAAQyB,gBAAgBC,gBACtCV,EAAUW,aAAeC,EAAU5B,EAASO,IAG5CA,EAAWiB,OAAS5D,IACpBoD,EAAUa,QAAUtB,EAAWsB,QAC/Bb,EAAUc,UAAYvB,EAAWwB,mBAAmBD,WAAa,EACjEd,EAAUgB,cAAgBC,EAAe1B,EAAY,eAAgB,GACrES,EAAU/B,eAAiBgD,EAAe1B,EAAY,gBAAiB,KAGvEA,EAAWiB,OAASzD,EAAsB,CACtC,IAACiC,EAAQkC,QAAQC,eACX,MAAA,IAAInG,MAAM,yCAGpBgF,EAAUG,MAAQnB,EAAQkC,QAAQC,eAClCnB,EAAUM,OAAS,CAAEc,KAAMpC,EAAQkC,QAAQG,cAC/C,CAEO,MAAA,IAAKC,EAAMtC,EAASO,MAAgBS,IAYzCsB,EAAQA,CAACtC,EAASO,EAAYgC,GAAQ,KACxC,MAAMC,EAAgB,IAAKxC,GAE3B,IAAKO,EACMiC,OAAAA,EAGX,IAAA,MAAWC,KAAOC,OAAOC,KAAKH,GAAgB,CAC1C,MAAMI,EAA+B,KAAvBJ,EAAcC,IAAsC,MAAvBD,EAAcC,GACrDA,KAAOlC,IAAeqC,GAASL,KAC/BC,EAAcC,GAAOlC,EAAWkC,GAExC,CAEOD,OAAAA,CAAAA,EAOLP,EAAiBA,CAAC1B,EAAYkC,EAAKI,IACrCC,SAAUvC,GAAcA,EAAWkC,IAASI,GAM1CxB,EAAiBA,CAACd,EAAYkC,IACzBlC,GAAcmC,OAAOC,KAAKpC,EAAWkC,IAAMM,OAAS,EAAIxC,EAAWkC,GAAO,CAAA,EAO/Eb,EAAY1D,OAASI,IAAAA,GAAOiC,KAC9B,IACKb,GACAa,GAAcA,EAAWkB,iBAAmBlB,EAAWkB,eAAeC,cAEhEsB,OAAAA,EAAQ,EAAG,GAGlB,IACM,MAAEC,cAAAA,EAAgB,SAAYvD,IAAawD,QAAQ5E,GACzD,OAAO0E,EAA0B,IAAlBC,EAAsBA,EAAgB,EAAG,EAC3D,OAAQ1H,GACGA,OAAAA,QAAAA,MAAM,sCAAsC+C,IAAO/C,GACpDyH,EAAQ,EAAG,EACtB,GA0BEA,EAAUA,CAACG,EAAOC,EAAU,IAAMC,WAAWF,GAAOG,QAAQF,GAE3D,MAAA,CACHG,gBArLoBrF,UACpB2B,QAAuBD,KAqLvBE,cAAAA,EACA0D,OA1KWA,CAACC,EAAaxD,IACzBU,QAAQ1F,IACJwI,EAAY7C,KAAI1C,MAAM8B,IACd,IACA,MAAM0D,QAAuB3D,EAAOC,EAASC,GAC7CwD,EAAYE,OAAOF,EAAY1E,QAAQiB,GAAU,EAAG0D,EACvD,CAAe,MACZD,EAAYE,OAAOF,EAAY1E,QAAQiB,GAAU,EACrD,MAmKRD,OAAAA,EACAG,SAAAA,EACAoC,MAAAA,EACAsB,YAnBgBzC,IACV,MAAE0C,MAAAA,GAAUhE,EACXgE,OAAAA,EAXUC,MACX,MAAErG,UAAAA,EAAY,CAAC,GAAM1B,OAAOA,OAAOuB,OAAOC,KAAKC,WAC9CC,OAAAA,EAAUC,KAAKA,KAAKC,QAAAA,EASdmG,GAAgB3C,EAAK,IAqB3B1B,GC3Mf,MAAMsE,UAAcC,YAChBC,iBAAAA,GACSnJ,KAAAA,MAAQP,EAAY2J,KAAK1J,YAC9B0J,KAAKC,SACLD,KAAKE,sBACT,CAEAA,oBAAAA,GACSC,KAAAA,iBAAiB,QAASH,KAAKI,YACxC,CAEAH,MAAAA,GACU,MAAEI,KAAAA,EAAMC,MAAAA,EAAOC,KAAAA,EAAMC,WAAAA,EAAa,QAASC,SAAAA,EAAUC,KAAAA,EAAO,SAAYV,KAAKpJ,MAE7EgB,EAAUQ,SAASuI,cAAcN,EAAO,IAAM,UAEhDA,GACAzI,EAAQgJ,aAAa,OAAQP,GAE7BC,IACA1I,EAAQgJ,aAAa,QAASN,GAC9B1I,EAAQgJ,aAAa,aAAc,GAAGN,KAASE,MAElC,SAAbC,GACA7I,EAAQgJ,aAAa,QAAS,YAGlCZ,KAAKa,UAAUC,IAAIJ,GAEnB9I,EAAQmJ,UAAY,qDACsBR,6BAE1CP,KAAKe,UAAYnJ,EAAQoJ,SAC7B,CAEAZ,WAAAA,GACU,MAAEhG,IAAAA,GAAQ4F,KAAKpJ,MACrBa,EAAc,CACVG,QAASoI,KACTtI,UAAWtB,EACXuB,KAAM,CAAEyC,IAAAA,IAEhB,EAGJ6G,eAAeC,IAAI,aAAeD,eAAeE,OAAO,WAAYtB,GCzCpE,MAAMuB,UAAetB,YACjBuB,WAAAA,WAEIrB,KAAKsB,aAAe,GACpBtB,KAAKuB,QAAU,GACfvB,KAAKwB,WCd0B,CDenC,CAEA,uBAAMzB,GACFC,KAAKpJ,MAAQP,EAAY2J,KAAK1J,YAC9B0J,KAAKyB,wBAECzB,KAAK0B,cAEX1B,KAAKC,SACLD,KAAKE,sBACT,CAEAyB,YAAAA,GACW,OAAA3B,KAAKpJ,MAAMgL,QAAU5B,KAAKpJ,MAAMgL,OAAOC,MAAM7B,KAAK8B,YAC7D,CAEAA,WAAAA,CAAYjC,GACR,OAAoB,MAAbA,EAAMzF,KAA6B,MAAdyF,EAAM3D,MAA8B,MAAd2D,EAAMU,IAC5D,CAEAL,oBAAAA,GACSC,KAAAA,iBAAiB/J,EAAqB4J,KAAK+B,cACpD,CAEA9B,MAAAA,GACU,MAAE+B,QAAAA,EAAU,IAAOhC,KAAKpJ,MAE9BoJ,KAAKe,UAAY,iBACXiB,EAAU,0BAA0BA,QAAgB,mBACpDhC,KAAKiC,iBAAiBjC,KAAKkC,+BAErC,CAEAD,YAAAA,GACW,OAAAjC,KAAKuB,QAAQ7E,IAAIsD,KAAKmC,YAAYC,KAAKpC,OAAOqC,KAAK,GAC9D,CAEAF,WAAAA,CAAYtC,GACF,MAAEW,WAAAA,EAAa,GAAI8B,UAAAA,EAAW5B,KAAAA,EAAO,SAAYV,KAAKpJ,OACpD2J,KAAAA,EAAO,GAAIrE,KAAAA,EAAO,GAAImE,KAAAA,EAAO,GAAIjG,IAAAA,EAAM,IAAOyF,EACjDgB,OAAAA,KAAAA,UAAUC,IAAIJ,GAEZ,kDAESH,8BACCrE,6BACDmE,4BACDjG,iCACKA,IAAQkI,uBAClB9B,EAAa,eAAeA,KAAgB,6BACtCE,wCAGpB,CAEAwB,iBAAAA,GACU,MAAEN,OAAAA,EAAS,GAAIW,UAAAA,EAAWC,YAAAA,GAAgBxC,KAAKpJ,MAC/C6L,EAAoBC,KAAKC,IAAI,EAAGf,EAAO/C,OAASmB,KAAKwB,YAC3D,OAAIiB,GAAqB,IAAMF,EACpB,GAGJ,mHAIcC,mCACCA,6BACND,qBACRE,aACZ,CAEA,iBAAMf,GACE,GAAA1B,KAAK2B,eACL3B,KAAKuB,QAAUvB,KAAK4C,WAAW5C,KAAKpJ,MAAMgL,aAG1C,IACA,MAAMiB,EAAiB7C,KAAK8C,cAAc9C,KAAKwB,kBACzC/E,QAAQ1F,IAAI8L,EAAenG,IAAIsD,KAAK+C,WAAWX,KAAKpC,OAC7D,OAAQ3I,GACGA,QAAAA,MAAM,4BAA4BA,IAC9C,CACJ,CAEA,gBAAM0L,CAAWlD,GACP,MAAEmD,QAAAA,GAAYhD,KAAKpJ,MACnByF,QAAmBf,EAAeM,cAAciE,EAAMzF,KACtD6I,EAAW,CACb1C,KAAMlE,EAAW6G,WAAWC,QAC5BjH,KAAMG,EAAW6G,WAAWhH,KAC5BmE,UAAkB+C,IAAZJ,EAAwB3G,EAAWgH,QAAQC,QAAU,IAE/DtD,KAAKsB,aAAazB,EAAMzF,KAAOiC,EAC/B2D,KAAKuB,QAAQgC,KAAK,IAAK1D,KAAUoD,GACrC,CAEAH,aAAAA,GACU,MAAElB,OAAAA,EAAS,IAAO5B,KAAKpJ,MAC7B,OAAOoJ,KAAK4C,WAAWhB,GAAQ/K,OAAOmJ,KAAKwD,OAC/C,CAEAZ,UAAAA,CAAWhB,GACP,OAAOA,EAAO6B,MAAM,EAAGzD,KAAKwB,WAChC,CAEAgC,MAAAA,CAAOE,GACH,OAAwB,MAAjBA,EAAUtJ,KAAiC,KAAlBsJ,EAAUtJ,GAC9C,CAEAqH,eAAAA,GACU,MAAEkC,WAAAA,GAAe3D,KAAKpJ,MACxB+M,IACA3D,KAAKwB,WAAa5C,SAAS+E,GAEnC,CAEA5B,aAAAA,CAAc6B,GACJ,MAAExJ,IAAAA,GAAQ7B,EAAUqL,GACpBnJ,EAAc,IAAKuF,KAAKsB,aAAalH,GAAMA,IAAAA,GAC7CK,GACAhD,EAAc,CACVG,QAASoI,KACTtI,UCzIkB,qBD0IlBC,KAAM,CAAE8C,YAAAA,IAGpB,EAIJwG,eAAeC,IAAI,cAAgBD,eAAeE,OAAO,YAAaC,GEhJtE,MAAMyC,UAAmB/D,YACrBuB,WAAAA,GACIyC,QACA9D,KAAKpJ,MAAQ,GACboJ,KAAK+D,OAAS,EAClB,CAEAhE,iBAAAA,GACIC,KAAKpJ,MAAQP,EAAY2J,KAAK1J,YAC9B0J,KAAKC,QACT,CAEAA,MAAAA,GACU,MAAE8D,OAAAA,EAAS,GAAIC,UAAAA,EAAY,UAAahE,KAAKpJ,MAGnD,GAFAoJ,KAAKa,UAAUC,IAAI,IAAiB,QAAdkD,EAAsB,gBAAkB,aAAeA,IAEvD,IAAlBD,EAAOlF,OACA,MAAA,GAEXmB,KAAK+D,OAASA,EAEd/D,KAAKe,UAAY,GAAGf,KAAKiE,gBAC7B,CAEAA,YAAAA,GACI,OAAOjE,KAAK+D,OACPrH,KAAI4D,IACK,MAAEpE,KAAAA,EAAO,GAAIgI,QAAAA,EAAU,GAAIrE,MAAAA,EAAQ,IAAOS,EACzC,MAAA,gEAES4D,GACArE,GACA,sBAAsBqE,aAAmBrE,4CAErC3D,2CAAI,IAG3BmG,KAAK,GACd,EAGJpB,eAAeC,IAAI,mBAAqBD,eAAeE,OAAO,iBAAkB0C,GC3CzE,MAAMM,UAAyBrE,YAClCuB,WAAAA,WAEIrB,KAAKoE,SAAW,EACpB,CAEArE,iBAAAA,GACSnJ,KAAAA,MAAQoJ,KAAKqE,eAClBrE,KAAKsE,YACLtE,KAAKuE,eACLvE,KAAKwE,WACT,CAOAH,YAAAA,CAAaI,EAAkB,MAC3B,MAAMnO,EAAamO,GAAmBzE,KAAK1J,WAIvCM,IAAAA,EACA,IACAA,EAAQ,IAAIN,GAAYQ,QAAO,CAACC,EAAKC,KAC1B,IAAKD,EAAK,CAACC,EAAKN,UAAWM,EAAKC,aACxC,CAAE,GAEL,MAAMV,EARMS,CAAAA,GAAQA,EAAKR,MAAKC,GAAoC,SAAvBA,EAAUC,WAQxCC,CAAQ,IAAIL,IAECC,OAAS,MAATA,EACfK,EAGJ,IAAKA,KAAUO,KAAKC,MAAMb,EAAKU,WACzC,OAAQI,GACLC,QAAQC,IAAIyI,KAAKtJ,SAAU,iBAAkBW,EACjD,CACJ,CAKA4I,MAAAA,CAAO5B,GAAQ,GACPA,IAEA2B,KAAKe,UAAY,IAOrB,MAWM2D,EAAQA,CAACN,EAAUO,KAMrB,MAAMC,EAAeC,GACK,IAAlBA,EAAKC,SACE,OAEW,IAAlBD,EAAKC,SACE,UAEJD,EAAKE,QAAQC,cAQlBC,EAAkBJ,GAChBA,EAAKK,YAAcL,EAAKK,WAAWrG,OAAS,EACrC,KAEJgG,EAAKM,YAIVC,EAAWC,MAAMC,UAAU7B,MAAM8B,KAAKZ,EAAKO,YAC3CM,EAAgBH,MAAMC,UAAU7B,MAAM8B,KAAKnB,EAASc,YAGtDO,IAAAA,EAAQL,EAASvG,OAAS2G,EAAc3G,OAC5C,GAAI4G,EAAQ,EACR,KAAOA,EAAQ,EAAGA,IACdL,EAASA,EAASvG,OAAS4G,GAAOC,WAAWC,YACzCP,EAASA,EAASvG,OAAS4G,IAMvCD,EAAcI,SAAQ,SAAUf,EAAMgB,GAE9B,IAACT,EAASS,GAEV,YADAlB,EAAKmB,YAAYjB,EAAKkB,WAAU,IAKpC,GAAInB,EAAaC,KAAUD,EAAaQ,EAASS,IAE7C,YADAT,EAASS,GAAOH,WAAWM,aAAanB,EAAKkB,WAAU,GAAOX,EAASS,IAKrEI,MAAAA,EAAkBhB,EAAgBJ,GACpCoB,GAAAA,GAAmBA,IAAoBhB,EAAgBG,EAASS,MAChET,EAASS,GAAOV,YAAcc,GAI9Bb,EAASS,GAAOX,WAAWrG,OAAS,GAAKgG,EAAKK,WAAWrG,OAAS,EAClEuG,EAASS,GAAO9E,UAAY,OAN5BkF,CAYAb,GAAAA,EAASS,GAAOX,WAAWrG,OAAS,GAAKgG,EAAKK,WAAWrG,OAAS,EAAG,CAC/DqH,MAAAA,EAAW9N,SAAS+N,yBAG1B,OAFAzB,EAAMG,EAAMqB,QACZd,EAASS,GAAOC,YAAYI,EAEhC,CAGIrB,EAAKK,WAAWrG,OAAS,GACzB6F,EAAMG,EAAMO,EAASS,GAbzB,CAeJ,GAAC,EAKCO,GAjGgBC,EAiGarG,KAAKoE,UAhGrB,IAAIkC,WACAC,gBAAgBF,EAAK,aAC7BG,MAHOH,IAAAA,EAkGtB3B,EAAM0B,EAAcpG,KACxB,CASAuE,YAAAA,CAAaH,EAAW,GAAI/F,GAAQ,GAC3B+F,KAAAA,SAAwB,KAAbA,EAAkBpE,KAAKoE,SAAW,GAAGA,IACrDpE,KAAKC,OAAO5B,EAChB,CAEAoI,oBAAAA,GACIzG,KAAK0G,aACT,EAGJzF,eAAeC,IAAI,yBACfD,eAAeE,OAAO,uBAAwBgD,GC3KlD,MAoBMwC,EAfK,CACH,MAAIC,GACM,MAAEC,WAAYC,EAAIC,iBAAAA,GAAqBlP,OACtC,MAAA,CACHmP,OAAQF,EAAKpO,EACbuO,cAAeH,EAAKrO,EACpByO,OAAQJ,GAAMpO,GAAgBoO,EAAKrO,EACnC6K,QAASwD,GAAMrO,GAAqBsO,GAAoB,EACxDI,OAAQL,GAAMrO,GAAqBsO,EAAmB,EAE9D,EACAK,GAfQC,GACDxP,OAAOgP,WAAaQ,GC0C5B,SAASC,EAAUjB,GACtB,MAAMkB,EAAMnP,SAASoP,eAAeC,mBAAmB,IACvDF,OAAAA,EAAIf,KAAKzF,UAAYsF,EACdkB,EAAIf,KAAKtB,UACpB,CAQO,SAASwC,EAAO7I,GACf8I,IAAAA,IAAAA,EAAS,GACTC,EAAa,iEAERC,EAAI,EAAGA,EAAIhJ,EAAQgJ,IACdD,GAAAA,EAAWE,OAAOpF,KAAKqF,MAFdH,GAEoBlF,KAAKsF,WAEzCL,OAAAA,CACX,CAEO,SAASM,EAAkBzQ,GAC9B,MAAM0Q,EAAW,CACb,gEACA,kEACA,YACA,UACA,gBACA,aAGJ,IAAA,IAAS3J,KAAO/G,EAAK,CACXyH,MAAAA,EAAQzH,EAAI+G,GAEdU,GAAU,MAAVA,GAAmD,KAAVA,GAKzC,GAAiB,iBAAVA,EACP,IAAA,MAAWkJ,KAAQD,EACXjJ,GAAAA,EAAMmJ,SAASD,GAAO,QACf3Q,EAAI+G,GACX,KACJ,cATG/G,EAAI+G,EAYnB,CAEO/G,OAAAA,CACX,CAiBO,SAAS6Q,EAAYhI,GACpBiI,IAAAA,EAAWjI,EACXkI,EAAalI,EACjB,OACiBA,IADbA,EAAKxF,QAAQ,KACAwF,EAAAA,EAAK/F,QAAQ,IAAK,IAE/BgO,EAAW,IAAMjI,EAGd,CAAEkI,WAAAA,EAAYD,SAAAA,EACzB,CAEO,SAASE,EAAS3D,EAAepO,EAAmBwI,EAAYwJ,GACnE,MAaMC,EAAaA,CAACjS,EAAmBwI,KAC9B2B,EAAAA,aAAanK,EAAWwI,GAE7B,MAAM0J,EAAKA,IAAM9D,EAAKhE,UAAUC,IAfR,eAiBxB,GAAI2H,EAAK,CACCG,MAAAA,EAAM,IAAIC,MAShB,OARAD,EAAIE,IAAML,EACVG,EAAIG,OAASJ,OACbC,EAAII,QAAU,KACPL,MAAAA,IACE9H,EAAAA,UAAUC,IAtBA,qBAuBT,IAAIhJ,MAAM,SAAS2Q,qBAAsB,EAIvD,CAEGE,KAGP,GAAI,iBAAiBM,KAAKpR,OAAOqR,UAAUC,aA7BnCC,EAAQvR,OAAOqR,UAAUC,UACzBE,EAAQD,EAAMvO,QAAQ,QACrBuO,EAAMvO,QAAQ,WAAY,GAAMuO,EAAMvO,QAAQ,SAAU,IAAOwO,GAAQ,GACjExR,OAAOyR,OAAOF,EAAMG,OAAOF,EAAQ,EAAG,GAAG/O,QAAQ,IAAK,MAAQ,IA2BzEoO,EAAWjS,EAAWwI,QAAK,GAEvB,yBAA0BpH,OAAQ,CAC7BgJ,EAAAA,UAAUC,IAtCS,aAuCxB,IAAI0I,EAAyB,IAAIC,sBAAqB,SAAUC,GACpD9D,EAAAA,SAAQ,SAAU+D,GAClBA,EAAMC,iBACNlB,EAAWjS,EAAWwI,GACC4K,EAAAA,UAAUF,EAAMG,QAC3C,GACH,IAELN,EAAuBO,QAAQlF,EAAI,MAEnC6D,EAAWjS,EAAWwI,GA7Cb+K,IACTZ,EACAC,CA8CZ,CAoKO,MAAMY,EAAwBA,CAAC1T,EAAO,KAClC2T,EAAW/S,KAAKgT,UAAU5T,IAQxB2T,EAAc/B,IACvB,MAAMzL,EAAM,CACR,IAAK,QACL,IAAK,OACL,IAAK,OACL,IAAK,SACL,IAAK,UAGT,OAAOyL,EAAK7N,QAAQ,YAAmBoC,GAAAA,EAAI0N,IAAE,EAQ/B,IAAI9D,UAKT+D,MAAAA,EAAkB9T,GACtBA,EAIEA,EAAK+T,WAAWhQ,QAAQ,KAAM,UAAUA,QAAQ,KAAM,UAHlD,GAUFiQ,EAAgBA,CAAC3S,EAAkB4S,KAC5C,IAAA,IAASjM,KAAOiM,EACZ5S,EAAQgJ,aAAarC,EAAKiM,EAAMjM,IAE7B3G,OAAAA,CAAAA,ECpYE6S,EAAcA,EACrBhC,IAAAA,EAAKiC,eAAAA,EAAgBC,MAAAA,EAAOC,eAAAA,EAAiB,CAAC,GAChDC,EAAQ,cAER,IAAKF,EACM,MAAA,GAGP/B,IAAAA,EAAM,iBAAiB+B,4BACRD,6BACW,aAAVG,EAAuB,OAAS,+DAEtB,aAAVA,EAAuB,MAAQ,yBAG7CC,MAAAA,EAAcrC,EAAM,GAAK,yBAE3BA,GAAAA,GAAOmC,GAAgBG,UAAW,CAClC,MAAMC,EAAWvC,GAAO,qBACxBG,EAAM,MAAMkC,EAAYG,gBAAgBD,sDAA6DpC,OACzG,CAEO,MAAA,2CACOA,uBAAG,ECzBRsC,EAAgB,MAChBC,EAAgB,MCEvBC,EAAQC,GAAaA,IAAcF,EAW5BG,EAAgB1U,IACnB,MAAE6R,IAAAA,EAAKvM,KAAAA,EAAO,GAAIqP,YAAAA,EAAc,IAAO3U,EAE7C,IAAKsF,EACM,MAAA,GAGLsP,MAAAA,EAA4B,KAAhBD,EAAqBA,EAAcrP,EAC/CyL,EAAS,GACT8D,EAlBcC,GAAGL,UAAAA,KAAiBD,EAAMC,GAAa,KAAO,KAkB7CK,CAAgB9U,GAErC+Q,OAAAA,EAAOpE,KACH,IAAIkI,uBACAE,EAAe/E,GAAGI,OAAS,cAAgB,gBAI/CyB,IAAQ2C,EAAMxU,EAAMyU,WACpB1D,EAAOpE,KAzBIqI,GAAGnD,IAAAA,EAAKoD,kBAAAA,EAAoB,GAAI3P,KAAAA,EAAO,GAAIqP,YAAAA,EAAc,OACxE,MAAMO,EAAkBD,EAAkBvR,QAAQ,gBAAiB4B,GAG5D,MAAA,YAAYuM,4BAA8BqD,kBAAgCA,MAF7C,KAAhBP,EAAqBA,EAAcrP,OAEyD,EAqBhG0P,CAAWhV,IAEvB+Q,EAAOpE,KAAK,GAAGiI,KAGnB7D,EAAOpE,KAAK,KAAKkI,MAEV9D,EAAOtF,KAAK,GAAE,ECtCZ0J,GAAiBA,EAAG5P,SAAAA,EAAW,GAAI6P,mBAAAA,GAAqB,KAC5DA,GAAsBL,EAAe/E,GAAGI,SAAY7K,EAC9C,GAGJ,kCAAkCA,QCNhC8P,GAAwBA,EAAGC,iBAAAA,KAC/BA,EAIE,wCAAwCA,QAHpC,GCFFC,GAAmBA,EAAGC,YAAAA,KAC1BA,EAIE,mCAAmCA,QAH/B,GCATC,GAA+BC,GAC1BA,EAAUC,cAAc,iBAG7BC,GAA0BC,GfiHCzS,OAAMiD,IACnC,MAAMtB,QAAuB5B,IACvBN,EAAWN,IAEVwC,OAAAA,EAAe+Q,KAChB/Q,EAAe+Q,KAAKjT,EAAUwD,GAC9BtB,EAAegE,MAAMlG,EAAUwD,IAAU,EAAA,EetHxC0P,CAAkBF,GCPhBG,GAAeA,IACjB/U,OAAOA,QAAQgV,gBAAgBtT,UAG7BuT,GAAgBA,KACzB,MAAMvT,EAAYqT,KAClB,OAAKrT,EAIEA,EAAUC,IAAIA,IAAIuT,OAAOC,oBAHrB,IAAA,EAMFC,GAAcA,IACLL,KAKXA,KAAeM,KAAKA,KAAKC,SAASC,SAASJ,oBAHvC,KAeFK,GAAaA,KACtB,MAAM9T,EAAYqT,KAClB,SAAKrT,IAAcA,EAAU+T,OAItB/T,EAAU+T,KAAKD,UAAAA,ECTnB,MAAME,GAAkB3W,IACrB,MACF4W,cAAAA,EACAlL,UAAAA,EACAmL,cAAAA,EAAgB,GAChBC,YAAAA,EAAc,CAAE,EAChBC,UAAAA,EACA5Q,QAAAA,EAAU,GACV6Q,SAAAA,EACAC,aAAAA,EAAe,GACfC,kBAAAA,GAAoB,EACpB1T,IAAAA,EACAqO,IAAAA,EACA4C,UAAAA,EAAYH,EACZ6C,mBAAAA,EAAqB,eACrBpT,aAAAA,EAAe,GACfqT,gBAAAA,GAAkB,GAClBpX,EAEEqX,EAtCY5C,CAAAA,IAClB,OAAQA,GACJ,KAAKH,EACMS,OAAAA,EAAe/E,GAAGI,OAAS,QAAU,QAChD,IPVuB,QOWZ,MAAA,QACX,QACW,MAAA,QACf,EA8BmBkH,CAAc7C,GACjC,IAAI8C,EAAU1F,EACV2F,EAAYL,EACZM,EAAmBX,EAAYW,kBAAoB,GACnDC,EAAqBZ,EAAYY,oBAAsB,GACvDC,EA2FR,SAAqB5T,GACV0K,OAAAA,MAAMmJ,QAAQ7T,IAAiBA,EAAa8T,MAAKC,GAAQA,EAAKtG,SAAS,QAClF,CA7FiBuG,CAAYhU,GAGnB,MAAEiU,QAAAA,EAASC,kBAAAA,EAAmBC,oBAAAA,GAnCxC,SAA0BxM,EAAWkL,EAAepT,EAAK2C,EAASiR,GAKvD,MAAA,CAAEY,QAJOtM,GAAalI,EAIXyU,kBAHQrB,GAAiBzQ,EAGN+R,oBAFTd,GAAmB,uBAGnD,CA6BgEe,CACxDzM,EACAkL,EACApT,EACA2C,EACAiR,GAyCAL,OAAAA,GAAaG,GAETS,GACClD,IAAcF,GPtGS,eOsGQE,GAC/BgC,KAMMkB,GAAUlD,IAAcF,GAAiBkC,KAzCxD,UACIuB,QAAAA,EACAC,kBAAAA,EACAZ,WAAAA,EACAR,cAAAA,EACAG,SAAAA,EACAC,aAAAA,EACAxC,UAAAA,EACAyD,oBAAAA,IAEO,MAAA,uEAEgBF,wCACIC,2CACGZ,yEAELR,yCACGG,6CACIC,uDACUxC,IAAcF,+BACtC2D,mFAItB,CAkBeE,CAAY,CACfJ,QAAAA,EACAC,kBAAAA,EACAZ,WAAAA,EACAR,cAAAA,EACAG,SAAAA,EACAC,aAAAA,EACAxC,UAAAA,EACAyD,oBAAAA,IAxBHG,SAAed,EAASC,GAEtB,MAAA,iBAAiBD,0BAAgCC,YAC5D,CAyBWa,CAAed,EAASC,IAjB3BD,EAAUG,EACVF,EAAYC,EA7CwBF,EA+CMA,EA3CvC,WA2CmBG,EA7CiB,SAASH,KAAa,sDA6CVC,cAkBpD,uDAEYQ,gCACIC,mCACGZ,yDAELR,iCACGG,qCACIC,+CACUxC,IAAcF,uBACtC2D,8CA3ELI,IAAmCf,CA2EX,EC1I9B,MCEDgB,GAAsB,0BACtBC,GAA8B,0BAW9BC,GAAa,kEAGNC,GAAsBD,GAAa,sBACnCE,GAAsBF,GAAa,sBACnCG,GAAsBH,GAAa,sBACnCI,GAAsBJ,GAAa,sBACnCK,GAAsBL,GAAa,sBACnCM,GAAsBN,GAAa,sBAEnCO,GAAsBP,GAAa,4BACnCQ,GAAsBR,GAAa,sBACnCS,GAA0BT,GAAa,0BACvCU,GAAmCV,GAAa,oCAChDW,GAAwBX,GAAa,wBAErCY,GAAe,CACxBC,WAf0Bb,GAAa,gBAgBvCc,WAQG,WACH,IAAIC,EAAiBd,GAErB,OAAQxC,MACJ,IAAK,KACDsD,EAAiBb,GACjB,MACJ,IAAK,KACDa,EAAiBZ,GACjB,MACJ,IAAK,KACDY,EAAiBX,GACjB,MACJ,IAAK,KACDW,EAAiBV,GACjB,MACJ,IAAK,KACDU,EAAiBT,GAIlBS,OAAAA,CACX,CA9BgBC,GACZC,iBAAkBV,GAClBW,uBAAwBR,GACxBS,cAAeX,GACfY,eAAgBX,GAChBY,qBAAsBV,IA+GnB,SAASW,GAAUC,GACtB,OAAOA,EAAW/Z,QAAOga,GA8B7B,SAAiBA,GACb,OACIC,GAAiB3B,IAAqBlG,KAAK4H,EAAS7T,KACpD8T,GAAiB1B,IAA6BnG,KAAK4H,EAAS7T,GAEpE,CAnCyC+T,CAAQF,IACjD,CAqBO,SAASC,GAAiBE,GAC7B,OAAO,IAAIC,OAAOD,EAAe1W,QAAQ,MAAO,OACpD,CAqDO,SAAS4W,GAAiBC,GAC7B,IAAIC,GAAe,EAEnB,OACIvZ,OAAOwZ,qBAAqBxS,QAC5BhH,OAAOwZ,oBAAoBC,WAAUC,GAAKJ,EAAWtW,QAAQ0W,IAAM,KAAM,IAEzEH,GAAe,GAIfvZ,OAAO2Z,0BAA0B3S,SAEjCuS,GAAe,EACXvZ,OAAO2Z,yBAAyBF,WAAUC,GAAKJ,EAAWtW,QAAQ0W,IAAM,KAAM,IAC9EH,GAAe,IAGhBA,CACX,CCnPO,MAAMK,GAAkBA,EAAG9W,aAAAA,MACY+W,IAA1C/W,EAAaE,QAAQ,YtBuEO,GACA,GuBvEnB8W,GAA6BA,CACtC7V,EACA8V,EACAC,EACAlW,EACAlC,KAEM,MAAEqY,eAAAA,GAAmBF,GACnBG,QAAAA,GAAYF,GACZG,kBAAAA,GAAsBD,EAExBE,EAAkBnX,EAAUgB,IAE1BoW,iBAAAA,EAAkBC,kBAAAA,EAAmBC,YAAAA,GCoK1C,SAAuBJ,EAAmBlW,EAAShB,GAClDoX,IACAE,EACAD,EAFAD,EAAmBF,EAIjBrU,MAAAA,EAAU7C,EAAUgB,GAEtBA,MAAiB,YAAjBA,EAAQwB,MAAuBK,GAM/BuU,GAAmB,EACnBE,EAActW,EAAQmB,QANtBmV,EAActW,EAAQmB,MAAQnB,EAAQd,cAEtCoX,EAAc1P,KAAK2P,MAAoB,IAAdD,GAAqB,IAC9CD,EAAoBrW,EAAQmB,OAMzB,CAAEiV,iBAAAA,EAAkBE,YAAAA,EAAaD,kBAAAA,EAC5C,CDtLiEG,CACzDN,EACAlW,EACAhB,GAGEyX,EAAS,CACX5U,QAASsU,EACTrU,UAAW9B,EAAQ+B,mBAAmBD,WAAa9B,EAAQ8B,WAAa,KACxE4U,cAAef,GAAgB3V,GAC/BqW,kBAAmBA,EACbxW,EAAegE,MAAMlG,EAAU0Y,GAC/B,KACNM,mBAAoBP,GAGpBF,OAAAA,IACAO,EAAOtV,MAAQtB,EAAegE,MAAMlG,EAAU2Y,IAG9CN,IACAS,EAAOT,eAAiBA,GAGrBS,CAAAA,EEhBEG,GAAcA,CAACjY,EAAakY,KACjC,IAAClY,IAAgBkY,EACjB,MAAO,GAGL,MAAEvV,OAAAA,EAAQlB,KAAAA,EAAMC,SAAAA,EAAUC,YAAAA,GAAgB3B,GACxCwB,aAAAA,GAAiB0W,EAEzB,OAAK1W,EAIE,CACH0O,MAAO1O,EAAa0O,OAASvN,GAAQc,MAAQd,GAAQqL,KAAOrL,GAAQmG,MAAQnG,GAAQwV,KACpF1W,KAAMD,EAAaC,MAAQA,EAC3BC,SAAUF,EAAaE,UAAYA,EACnCC,YAAaH,EAAaG,aAAeA,GAPlC,IClCFyW,GAAuB,aACvB3H,GAAgB,MCehB4H,GAAqBA,EAC9BC,QAAAA,EAAU,KACVC,WAAAA,EAAa,KACbxM,KAAAA,EAAO,KACP5I,UAAAA,EAAY,KACZqV,WAAAA,EAAa,MACa,MAAmC,CAC7DF,QAAS,CAAE9T,MAAO8T,GAClBC,WAAY,CAAE/T,MAAO+T,GACrBxM,KAAM,CAAEvH,MAAOuH,GACf5I,UAAW,CAAEqB,MAAOrB,GACpBsV,MAAO,CAAEjU,MAAOgU,KA6DPE,GAAsBA,CAC/BC,EACAtX,EACAuX,EACAC,KAEIC,IAAAA,EAAoBC,GAAqC1X,EAASuX,EAASC,GAC3EG,EAAiBC,GAAuBJ,EAAeD,EAASE,GAEpE,OAAOI,GAAiBL,GAClBM,GAAqBR,EAASC,EAASE,EAAmBE,GAC1DI,GAA2BT,EAAStX,EAASuX,EAASE,EAAmBE,EAAc,EAG3FD,GAAuCA,CACzC1X,EACAuX,EACAC,KAEA,OAAQA,GACJ,KAAKpI,GACM,MAAA,IACAmI,KACAvX,KACAgX,GAAmBhX,GAAS+B,oBAEvC,KAAKgV,GAAsB,CACjBiB,MAAAA,EACFT,EAAQU,UAAUvd,MACdwd,GAAsBA,EAAmB5Z,MAAQ0B,GAASmY,YACzD,CAAA,EACT,MCzGwBC,EAChCpY,EACA8V,EACAC,EACAlW,EACAlC,KAEM,MAAEsY,QAAAA,GAAYF,GAEhB7T,QAAAA,EAAU,CAAE,EACZ+F,OAAAA,EAAS,GACToQ,oBAAAA,EACAC,mBAAAA,EACAC,wBAAAA,EACAC,wBAAAA,EACA5G,YAAAA,GACAkE,GAA2B,CAAA,EAG/B,IAAIrb,EAAO,CACP6D,IAAK0B,EAAQyY,gBACb5Z,aAAcmB,EAAQnB,aACtBoC,QAASjB,EAAQkB,GACjBd,KAAMJ,EAAQI,KACdC,SAAUkO,EAAevO,EAAQK,UACjCpB,eAAgBe,EAAQd,cACxB8C,cAAehC,EAAQX,aACvBmC,KAAMxB,EAAQwB,KACdmQ,cAAe3R,EAAQ0Y,WAAWtY,MAAQ,GAC1CkQ,YAAatQ,EAAQ0Y,WAAWtY,MAAQ,GACxCe,MAAOnB,EAAQmB,MAAQtB,EAAegE,MAAMlG,EAAUqC,EAAQmB,OAAS,KACvEwX,SAAU3Y,EAAQmB,MAClBkX,oBAAqBA,GAAuB,GAC5C9I,UAAWH,EACXR,eAAgB5O,EAAQI,KACxByO,MAAO7O,EAAQsB,QAAQc,MAAQpC,EAAQsB,QAAQmG,MAAQzH,EAAQsB,QAAQwV,KACvEwB,mBAAoBA,GAAsB,GAC1CC,wBAAyBA,GAA2B,GACpDC,wBAAyBA,GAA2B,CAAE,EACtD5G,YAAaA,GAAe,CAAE,KAC3BgF,GAAY5W,EAAS8V,IAGxB7N,GAAUA,EAAOlF,SACjBtI,EAAKwN,OAASA,GAGdjI,EAAQ4Y,cACRne,EAAKme,YAAc5Y,EAAQ4Y,aAG/B,IAAIC,EAAiC,CAAA,EACrC,OAAI7Y,EAAQwB,OAAS5D,EACjBib,EAAiChD,GAC7B7V,EACA8V,EACAC,EACAlW,EACAlC,GAEGqC,EAAQwB,OAAS3D,EACxBgb,EC3EmCC,EAAC9Y,EAAS8V,EAAyBC,KACpE,MAAEsC,oBAAAA,EAAqBnW,QAAAA,EAAU,CAAC,GAAM4T,GACtCiD,kBAAAA,GAAsB/Y,EAGxBiW,EAAU,CACZtW,QAASoZ,GAGb,OAAI7W,GAAS4D,SACTmQ,EAAQnQ,OAAS5D,EAAQ4D,OACzBmQ,EAAQzP,UAAYxG,EAAQyY,gBAC5BxC,EAAQpO,WAAa,IAGzBoO,EAAQoC,oBAAsBA,GAAuB,GACrDpC,EAAQ+C,aAAgBjD,GAAoBA,EAAiBE,QAAQ+C,eAAiB,EACtF/C,EAAQgD,eAAkBlD,GAAoBA,EAAiBE,QAAQgD,gBAAmB,EAEnFhD,CAAAA,EDwD8B6C,CAC7B9Y,EACA8V,EACAC,GAEG/V,EAAQwB,OAAS1D,EACxB+a,EEjFqCK,CAAO,EFsFrClZ,EAAQwB,OAASzD,IACxB8a,EGvFoCM,EAACC,EAAGtD,KACtC,MAAE5T,QAAAA,EAAU,CAAC,GAAM4T,EAElB,MAAA,CACHjH,MAAO3M,GAAWA,EAAQG,gBHmFO8W,CAC7BnZ,EACA8V,IAKD,IACA9V,KACAiW,KACA/T,KACAzH,KACAoe,IDoBQT,CACHpY,EACAgY,EACAT,EACAA,GAAS1X,eACT0X,GAAS5Z,SAEjB,CACA,QACI,MAAO,GACf,EAGSia,GAAyBA,CAClCJ,EACAD,EACAE,KAEA,MAAMhd,EAAgCod,GAAiBL,GACjDD,EACCE,EACA4B,OAAAA,GAAkB5e,EAAM+c,EAAa,EAGnC6B,GAAoBA,CAC7B5e,EACA+c,KAEA,MAAM8B,EAAkC,CACpChb,IAAK7D,EAAK6D,IACV2C,QAASxG,EAAKwG,QACd0Q,cAAelX,EAAKkX,cACpBxQ,MAAO1G,EAAK0G,OAAS,EACrBkX,oBAAqB7K,OAAO/S,EAAK4d,qBACjCxG,UAAWpX,EAAKoX,UAChBhT,aAAcpE,EAAKoE,cAAgB,GACnC8N,IAAKlS,EAAKkS,KAAO,IAGjBkL,OAAAA,GAAiBL,GACV,IACA8B,EACH9X,KAAM/G,EAAK+G,KACX6U,kBAAmB5b,EAAK4b,kBACxBM,mBAAoBlc,EAAKkc,mBACzB4C,eAAgB9e,EAAK8e,eACrBC,oBAAqB/e,EAAK+e,oBAC1BC,qBAAsBhf,EAAKgf,qBAC3BvD,kBAAmBzb,EAAKyb,kBACxBwD,YAAajf,EAAKif,YAClBC,cAAelf,EAAKkf,cACpBC,kBAAmBnf,EAAKmf,kBACxBC,cAAepf,EAAKof,cACpBC,aAAcrf,EAAKqf,aACnBjb,aAAcpE,EAAKoE,cAAgB,GACnCI,eAAgBxE,EAAKwE,eACrB+C,cAAevH,EAAK4E,aACpBwC,QAASpH,EAAKoH,QACd8K,IAAKlS,EAAKkS,KAAO,IAIlB2M,CAAAA,EAGExB,GAAuBA,CAChCR,EACAC,EACAE,EACAE,KAEO,CACHoC,MAAO,CACHC,SAAU1C,EACV2C,MAAO1C,GAASzI,gBAAgBiL,OAAOE,MACvCC,QAAQ,GAEZla,QAAS,IACFyX,GAEP3V,UAAW,CACPqY,gBAAiB1C,GAAmB0C,gBACpCC,mBAAoB,0BAExBC,UAAW,IACJ9C,GAASzI,gBAAgBuL,UAC5BC,MAAO/C,GAASgD,iBAEpBC,iBAAkB,IACXjD,GAASzI,gBAAgB0L,iBAC5BF,MAAO/C,GAASkD,yBAA2BhD,GAAmBgD,yBAElElW,KAAM,IACCgT,GAASzI,gBAAgBvK,KAC5BoI,IAAK4K,GAAS5K,KAElB+N,OAAQ,IACDnD,GAASzI,gBAAgB4L,QAEhCC,QAAS,CACLC,YAAa,IACNjD,EACH7F,SAAU,GACVvC,UAAW,QACX5C,IAAK,GACLsF,mBAAoB,eACpBF,aAAc,IAElB8I,WAAY,CAAC,EACbzE,iBAAkB,CAAC,GAEvB0E,SAAUvD,EAAQuD,WAIb/C,GAA6BA,CACtCT,EACAtX,EACAuX,EACAE,EACAE,KAEkC,CAC9BoC,MAAO,CACHC,SAAU1C,EACV2C,MAAO1C,GAASwD,aAAaC,gBAAgBjB,OAAOE,MACpDC,QAAQ,GAEZla,QAAS,IACFyX,GAEP3V,UAAW,CACPqY,gBAAiB5C,GAAStB,SAASkE,gBACnCC,mBAAoB,0BAExBC,UAAW,IACJ9C,GAASwD,aAAaC,gBAAgBX,UACzCC,MAAOta,GAASua,iBAEpBC,iBAAkB,IACXjD,GAASwD,aAAaC,gBAAgBR,iBACzCF,MAAOta,GAASya,yBAA2BhD,GAAmBgD,yBAElElW,KAAM,IACCgT,GAASwD,aAAaC,gBAAgBzW,KACzCoI,IAAK8K,GAAmBlQ,SAASC,SAErCkT,OAAQ,IACDnD,GAASzI,gBAAgB4L,QAEhCC,QAAS,CACLC,YAAa,IACNjD,EACH7F,SAAU,GACVvC,UAAW,QACX5C,IAAK,GACLsF,mBAAoB,eACpBF,aAAc,IAElB8I,WAAY,CAAC,EACbzE,iBAAkB,CAAC,GAEvB0E,SAAU,CAAC,IAIbjD,GAAoBL,GAA0BA,IAAkBpI,GK9PzD6L,GAAkBA,CAACrf,EAAmBnB,KAC/C,MAAMygB,EAAc,IAAIhf,YAAY,eAAmBN,IAAa,CAChEO,OAAQ1B,EACR2B,SAAS,EACT+e,YAAY,EACZC,UAAU,IAGdrf,OAAOJ,cAAcuf,EAAW,EAGrBG,GAnCHrW,CAACsW,EAAkC,MAC3CA,EAAexR,SAAyByR,IAChC,GAACA,GAAkBA,EAAczf,QAG9Byf,OAAAA,EAAczf,QAAQuI,iBACzBkX,EAAc/Z,KACd+Z,EAAcC,SACdD,EAActF,QAClB,GACH,EAyBUoF,GAtBAI,CAACH,EAAkC,MAC9CA,EAAexR,SAAyByR,KAC/BA,IAAkBA,EAAczf,SAGrCyf,EAAczf,QAAQ4f,oBAAoBH,EAAc/Z,KAAM+Z,EAAcC,SAAQ,GACvF,ECtBCG,GAAa,eACbC,GAAa,gBA6BNV,GAAcrf,IAEnBggB,IAAAA,EADGC,OAAAA,cAAgB/f,OAAO+f,eAAiB,GAG3CD,OADmBvU,IAAnBzL,EAAKkgB,YAA8C,IAAnBlgB,EAAKkgB,UACzB,CACR9f,MAAO,cACP+f,cAAeJ,MACZ/f,GAGK,CACRogB,gBAAiBN,MACd9f,GAGXE,OAAO+f,cAAcrU,KAAKoU,GAC1BZ,GAAgB,cAAeY,EAAS,EAoB/BK,GAA4BA,EACrCC,SAAAA,EAAW,GACXC,WAAAA,EAAa,GACb3D,gBAAAA,EAAkB,GAClB4D,kBAAAA,EAAoB,GACpBC,YAAAA,EAAc,GACdC,WAAAA,EAAa,GACbxH,SAAAA,EAAW,GACX4D,SAAAA,EAAW,GACX6D,YAAAA,EAAc,OAEPV,OAAAA,cAAgB/f,OAAO+f,eAAiB,GAC/C,MAAMD,EAAY,CACd5f,MAAO,qCACPggB,gBAAiBN,GACjBc,eAAgBN,EAChBO,YAAaN,EACbO,cAAelE,EACfmE,gBAAiBP,EACjBQ,oBAAqBP,EACrBQ,sBAAuBP,EACvBQ,iBAAkBhI,EAClBiI,iBAAkBrE,EAClBsE,cAAe,kBACfT,YAAaA,EACbU,WAAY,GAAGZ,OAAiBC,OAAgBF,KAEpDtgB,OAAO+f,cAAcrU,KAAKoU,GAC1BZ,GAAgB,qCAAsCY,EAAS,EAQtDsB,GAAgBthB,IACnBI,MAAAA,EAAQ,iBACR4f,EAAY,CACd5f,MAAAA,EACAggB,gBAAiBN,GACjByB,UAAW,CAAC,GAEhB,GAAI1a,OAAOC,KAAK9G,GAAMkH,OAAQ,CACpB,MAAE7B,GAAAA,EAAK,GAAIib,SAAAA,EAAW,GAAI/b,KAAAA,EAAO,GAAI0R,SAAAA,EAAW,IAAOjW,EAC7D,IAAIwhB,EAAgB,CAChBC,aAAcpc,EACdqc,eAAgBnd,EAChBod,cAAe1L,EACf2L,cAAetB,GAEnBkB,EAAgBlR,EAAkBkR,GAClCxB,EAAUuB,UAAYC,CAC1B,CACAthB,OAAO+f,gBAAP/f,OAAO+f,cAAkB,IACzB/f,OAAO+f,cAAcrU,KAAKoU,GAC1BZ,GAAgBhf,EAAO4f,EAAS,EAGvB6B,GAAmB7hB,IACtB,MAAEif,SAAAA,EAAU6C,SAAAA,GAAa9hB,EAEzB+hB,EAAczR,EAAkB2O,GACtC+C,GAAgB,CAAEF,SAAAA,KAAaC,GAAa,EAQnCC,GAAkBhiB,IACrBI,MACA4f,EAAY,CACd5f,MAAO,mBACP0hB,SAAU9hB,GAAM8hB,UAAY,YAC5B1B,gBAAiBN,GACjByB,UAAW,CAAC,GAEhB,GAAI1a,OAAOC,KAAK9G,GAAMkH,OAAQ,CACpB,MAAE7B,GAAAA,EAAK,GAAIib,SAAAA,EAAW,GAAI/b,KAAAA,EAAO,GAAI0R,SAAAA,EAAW,IAAOjW,EAC7D,IAAIwhB,EAAgB,CAChBC,aAAcpc,EACdqc,eAAgBnd,EAChBod,cAAe1L,EACf2L,cAAetB,GAEnBkB,EAAgBlR,EAAkBkR,GAClCxB,EAAUuB,UAAYC,CAC1B,CAEAthB,OAAO+f,gBAAP/f,OAAO+f,cAAkB,IACzB/f,OAAO+f,cAAcrU,KAAKoU,GAC1BZ,GArBc,mBAqBSY,EAAS,EAmBvBiC,GAAiB5f,MAAOI,EAAK7D,KACtC,IAAIuF,EAAUvF,EACd,OAAKuF,IACDA,QAAgB3B,EAAWC,IAExB0B,CAAAA,EAGE+d,GAAoBA,CAACtjB,EAAMujB,EAAc,MAC5C,MACF3B,kBAAAA,EACA5D,gBAAAA,EACA1D,SAAAA,EACAkJ,UAAAA,EACA9F,SAAAA,EACA/X,KAAAA,EACAvB,aAAAA,EACAgD,QAAAA,EACAqc,QAAAA,EACA1c,KAAAA,GACA/G,EAEE8hB,EAAa1d,EAAa+B,KAAIud,GAAQA,EAAKC,MAAM,KAAKC,QAAO9X,KAAK,KAGjE,MAAA,CAEH,IACOyX,EACH5d,KAAMic,EACNnb,GAAIuX,EACJtX,MAAO8c,EAEPK,YAVYvJ,EAAS7L,cAAcoD,SAAS,aAUnBkC,WACzB+P,YAAapG,EACbqG,YAAape,EACbqe,YAAa1J,EACb2J,YAAanC,EACboC,YAAa9c,EAAU,SAAW,SAClC+c,aAAcV,EAAU,WAAa,eACrCnJ,SAAUvT,EACVqd,MAAO,aACV,EA0DIC,GAAoB5gB,MAAO4T,EAAUiN,EAAMzgB,EAAK7D,KAGzDsB,GAAAA,OAAO+f,cAAgB/f,OAAO+f,eAAiB,GACzB/f,OAAO+f,cAAcphB,MAAKyjB,GAAuB,eAAfA,EAAKliB,SACrBmhB,WAAWjhB,QAAQ8b,SAASvd,MAAKskB,GACrE1gB,EAAIgO,SAAS0S,EAAE9d,MAGf,OAGE+d,MAAAA,QAAoBnB,GAAexf,EAAK7D,GACxCykB,EAAiBnB,GAAkBkB,EAAa,CAAEF,KAAMA,EAAMjN,SAAUA,IAExE+J,EAAY,CACd5f,MAAO,aACPugB,YAAa,qBACb2C,aAJaF,EAAYthB,SAKzBqe,cAAeL,GACfyB,UAAW,CACPgC,YAAaF,IAGrBnjB,OAAO+f,cAAcrU,KAAKoU,GAC1BZ,GAAgB,aAAcY,EAAS,EAG9BwD,GAAenhB,MAAO4T,EAAUiN,EAAMzgB,EAAK7D,KAGpD,GAAoB,iBAATskB,EAAmB,OAExBE,MAAAA,QAAoBnB,GAAexf,EAAK7D,GACxCykB,EAAiBnB,GAAkBkB,EAAa,CAAEnN,SAAUA,IAC5DnU,EAAWshB,EAAYthB,SAEtBme,OAAAA,cAAgB/f,OAAO+f,eAAiB,GAC/C,MAAMD,EAAY,CACd5f,MAAO,eACPugB,YAAa,gBACb2C,aAAcxhB,EACdqe,cAAeL,GACfyB,UAAW,CACPkC,MAAO,CACHtB,YAAa,CACTe,KAAMA,GAEV9G,SAAUiH,KAItBnjB,OAAO+f,cAAcrU,KAAKoU,GAC1BZ,GAAgB,eAAgBY,EAAS,EAetC,MAAM0D,GAAoBA,CAC7BnD,EACAoD,EACAC,EACAC,EACAC,KAGO7D,OAAAA,cAAgB/f,OAAO+f,eAAiB,GAC/C,MAAMD,EAAY+D,GACdxD,EACAoD,EACAC,EACAC,GAGG5D,OAAAA,cAAcrU,KAAKoU,GACtB9f,OAAO8jB,sCAAwCF,GAC/C5jB,OAAO+f,cAAcrU,KAAK,IACnB1L,OAAO8jB,qCACVC,kBAAmB,GAAG1D,OAAgBuD,IACtChC,SAAU,gBAIlB1C,GAAgB,aAAcY,EAAS,EAGrC+D,GAA6BA,CAACxD,EAAYoD,EAAYC,EAAcC,KAC/D,CACHzjB,MAAO,aACPggB,gBAAiBN,GACjBe,YAAaN,EACb2D,YAAaP,KACTC,EAAe,CAAEO,cAAeP,GAAiB,MACjDC,EAAgB,CAAEO,eAAgBP,GAAkB,KC3WhE,MAAMQ,WAAY7X,EACd9C,WAAAA,WAEIrB,KAAK1C,KAAO,UACZ0C,KAAKoT,QAAU,GACfpT,KAAKic,gBAAiB,EACtBjc,KAAKkc,oBAAsBlc,KAAKmc,eAAe/Z,KAAKpC,MACpDA,KAAKoc,qBAAuBpc,KAAKqc,gBAAgBja,KAAKpC,MACtDA,KAAKsc,YAActc,KAAKkc,mBAC5B,CAEA3X,YAAAA,GACIvE,KAAKa,UAAUC,IAAI,UACnBd,KAAKa,UAAUC,IAAI,WAAWd,KAAK1C,QC/Bfif,GAAGlR,UAAAA,EAAW/N,KAAAA,GAAQgP,KAE1CjB,IAAcF,GACdmB,EAAU1L,aAAa,MAAO,QAI9ByK,IAAcH,GAAiB5N,IAAS5D,GAAsBiS,EAAe/E,GAAGI,OAChFsF,EAAU1L,aAAa,YAAa,QAIxC0L,EAAU1L,aAAa,WAAY,OAAM,EDoBrC2b,CAAavc,KAAKpJ,MAAOoJ,MAEzBxB,OAAOge,OAAOxc,KAAKpJ,MAAOoJ,KAAKyc,eAAezc,KAAKpJ,QACnD4H,OAAOge,OAAOxc,KAAKpJ,MAAOoJ,KAAK0c,gCAAgC1c,KAAKpJ,QAE9D,MAAEgU,eAAAA,EAAiB,CAAC,GAAM5K,KAAKpJ,MACrCoJ,KAAKic,eAAiBrR,GAAgBG,YAAa,EACnD/K,KAAKsc,YAActc,KAAKic,eAClBjc,KAAKoc,qBACLpc,KAAKkc,oBAEXlc,KAAKoE,SAAW,GAAGpE,KAAK2c,6CACJ3c,KAAK4c,qGAED5c,KAAK6c,sDACL7c,KAAKic,eAAiBjc,KAAK8c,kBAAoB,4JAGvC9c,KAAK+c,gGAET/c,KAAKgd,uFAEThd,KAAKid,mDAG7Bjd,KAAKC,QACT,CAEAuE,OAAAA,GACU,MAAElC,UAAAA,EAAWlI,IAAAA,GAAQ4F,KAAKpJ,MAChCoJ,KAAKY,aAAa,yBAA0B0B,GAAalI,GACzD4F,KAAKkd,WACT,CAEAC,mBAAAA,GACW,MAAA,GE3DalZ,GAAGF,OAAAA,EAAS,IAAMuI,EAAY,QACtD,IAAKA,IAAcvI,IAAWA,EAAOlF,OAC1B,MAAA,GAGPyN,GAAavI,EAAOlF,QACpByN,EAAUzL,UAAUC,IAAI,cAG5B,MAAMkD,EAAY2H,EAAe/E,GAAGI,OAAS,MAAQ,SAGrD,MAAO,yBAFMiD,EAAsB,CAAElG,OAAAA,mBAEeC,sBAAS,EF+C/CC,CAAajE,KAAKpJ,MAAOoJ,QGrEhBod,EAACxmB,EAAO0V,KACzB,MACF4D,WAAAA,EACAmN,eAAAA,EACAlN,WAAAA,EACAmN,YAAAA,EACAhN,iBAAAA,EACAiN,gBAAAA,EACA/M,cAAAA,EACAgN,eAAAA,EACA/M,eAAAA,EACAgN,gBAAAA,EACAlN,uBAAAA,EACAmN,4BAAAA,EACAC,MAAAA,GACA/mB,EAGA,OAACsZ,GACAC,GACAG,GACAE,GACAC,GACAF,KACS,MAAToN,GAAiBA,EAAM9e,OAAS,IAKrCyN,EAAUzL,UAAUC,IAAI,aAiBjB,wBAAwBmJ,EAflB,CACTiG,WAAAA,EACAmN,eAAAA,EACAlN,WAAAA,EACAmN,YAAAA,EACAhN,iBAAAA,EACAiN,gBAAAA,EACA/M,cAAAA,EACAgN,eAAAA,EACA/M,eAAAA,EACAgN,gBAAAA,EACAlN,uBAAAA,EACAmN,4BAAAA,EACAC,MAAAA,yBAlBO,EAoB+C,EHuBXP,CAAYpd,KAAKpJ,MAAOoJ,OACvE,CAEA4c,YAAAA,GACI,OAAO5c,KAAKmd,qBAChB,CAEAS,mBAAAA,GACI,MAAM/S,EAAQ7K,KAAK6d,aAAa,YAAc,WAAa,YACpDpT,OAAAA,EAAYzK,KAAKpJ,MAAOiU,EACnC,CAEA4R,cAAAA,EAAiB/G,kBAAAA,EAAmBzY,MAAAA,IAChC,IACI6gB,EADAC,GAAoB,EAExB,MAA0B,MAAtBrI,EACAoI,EAAc7gB,EAEd8gB,GAAoB,EAEjB,CAAEA,kBAAAA,EAAmBD,YAAAA,EAChC,CAEApB,+BAAAA,EAAkC/O,UAAAA,EAAWG,kBAAAA,IAClC,MAAA,CACHH,WAAWN,MAAuBM,EAClCG,mBAAmBT,MAAuBS,EAElD,CAEA6O,YAAAA,GACI,OAAO3c,KAAK4d,qBAChB,CAEAI,wBAAAA,GACI,MAAO,GAAG/R,GAAsBjM,KAAKpJ,mBACnCuV,GAAiBnM,KAAKpJ,mBACtB0U,EAActL,KAAKpJ,mBACnBmV,GAAe/L,KAAKpJ,QAC1B,CAEAimB,iBAAAA,GACI,OAAO7c,KAAKge,0BAChB,CAEAlB,eAAAA,GACWA,MInHgBA,GAC3B1iB,IAAAA,EACA6jB,WAAAA,EACAC,cAAAA,EACAC,kBAAAA,EACAC,kBAAAA,EACA7J,gBAAAA,EACA4D,kBAAAA,EACA7a,KAAAA,EACA3C,aAAAA,EACAkW,SAAAA,EACA4D,SAAAA,EACA7S,OAAAA,MAEA,IAAKqc,IAAeA,EAAW3d,QAAU2d,EAAWnI,SACzC,MAAA,GAGLzC,MAAAA,EAAUlc,KAAKgT,UAAU,CAC3BoK,gBAAiBA,EACjB4D,kBAAmBA,EACnB7a,KAAMA,EACN+a,WAAY7d,EAAkB,CAAEG,aAAAA,IAChCkW,SAAUA,EACV4D,SAAUA,IAEd,IAAI4J,EAAiB,GACrB,cAAWzc,EAAW,KAClBA,EAAOlF,KAAImD,IACPwe,EAAe9a,KAAK1D,EAAMzF,IAAG,IAI9B,6EAGWikB,yBACFJ,EAAWnI,2BAChB1b,yBACKiZ,kCACS+K,8BACJF,kCACIC,MAAsBF,EAAW3d,iBAAK,EJyEpDwc,CAAgB9c,KAAKpJ,MAChC,CAEA0nB,oBAAAA,GACUC,MAAAA,EAAave,KAAK6d,aAAa,YAEZ,MAAA,ajBjHOW,GAAGrK,oBAAAA,GAAuB7H,IACzD6H,GAIL3H,GAAwB2H,GACnBsK,MAAKC,IACI9mB,MAAAA,EAAUyU,GAA6BC,GACxC1U,IAILA,EAAQmJ,UAAY2d,EAAAA,IAEvBC,OAAWnmB,IACAnB,QAAAA,MAAM,kDAAkDmB,KAE1DZ,MAAAA,EAAUyU,GAA6BC,GACxC1U,IAILA,EAAQgnB,MAAMC,QAAU,OAAA,IAGzB,4CAvBI,GiBgHLL,CAAyBxe,KAAKpJ,MAAOoJ,8BACzBue,EAAa,cAAgB,gCK5HxBO,GACvB7hB,MAAAA,EACA0Q,UAAAA,EACA1P,eAAAA,EACAkU,kBAAAA,EACAH,kBAAAA,EACA1U,KAAAA,MAEK,IAACL,IAAUgB,GAAmB0P,EACxB,MAAA,GAEX,IAAIoR,EAAa,KACjB,OACIA,GADC/M,GAAqBG,EACTA,EAEAlV,EAEbK,IAAS5D,IACTqlB,EAAa9hB,GAGV,qCAAqC8hB,GAAc9gB,cAAc,ELwG9D6gB,CAAY9e,KAAKpJ,wBAI3B,CAEAmmB,aAAAA,GACI,OAAO/c,KAAKse,sBAChB,CAEAU,mBAAAA,GACWzR,OAAAA,GAAgBvN,KAAKpJ,MAChC,CAEAomB,YAAAA,GACI,MAAMiC,EAAajf,KAAKuM,cAAc,oBAAoBvL,UACtDie,OAAAA,GAGGjf,KAAKgf,qBAChB,CAEAE,mBAAAA,GACWC,MdrJwBA,GACnC9K,wBAAAA,EACAD,mBAAAA,EACAE,wBAAAA,MAEI,IAACF,IAAuBE,EACjB,MAAA,GAGX,IAAI8K,EAAyB,GAE7B,GAAIhL,EAAoB,CACpB,IAAIiL,EAAa,GACbhL,IACAgL,EAAa,kBAAkBhL,2CAGnC+K,EAAyB,gDACnBC,kBACAjL,OACV,CAKA,OAFIE,GAA2BA,EAAwBjU,MAAQiU,EAAwBhU,MAOnF8e,EACA,+BACY9K,EAAwBjU,6BACvBiU,EAAwBzU,6BACzByU,EAAwB5T,iCACnB4T,EAAwBgL,4BACnChL,EAAwBhU,4BAVvB8e,CAAAA,Ec2HAD,CAAwBnf,KAAKpJ,MACxC,CAEAqmB,YAAAA,GACI,OAAOjd,KAAKkf,qBAChB,CAEA,oBAAM/C,GACIoD,MAAAA,EAAevf,KAAKwf,aAAa,sBAAwB,EACzD3E,EAAO7a,KAAKwf,aAAa,kBAAoB,SAE7CrE,GAAaoE,EAAc1E,EAAM7a,KAAKpJ,MAAMmG,QACtD,CAEA0iB,kBAAAA,CAAmB3jB,GACfkE,KAAKoT,QAAU,iBAEf,IAAIsM,EAAmBtnB,SAASmU,cAAc,IAAIvM,KAAKoT,WACnDsM,GACAA,EAAiBnI,SP1IMvd,OAC/B8B,EACAsX,EACAC,EACAC,KAEM,MAAE6K,kBAAAA,EAAmBD,cAAAA,GAAkB7K,EA8CvCsM,EAL4D,CAC9DC,CAAC1U,IAxCsB2U,KACvB,IAAK/jB,EAAS,OACV4jB,IAAAA,EAAmBtnB,SAASuI,cAAc,qBAC7BC,EAAAA,aACb,OACAzJ,KAAKgT,UAAUgJ,GAAoBC,EAAStX,EAASuX,EAASC,KAEjD1S,EAAAA,aAAa,KAAMwS,GACnBxS,EAAAA,aAAa,yBAA0B,QACvCA,EAAAA,aAAa,oBAAqBud,GAClCvd,EAAAA,aAAa,gBAAiBsd,GAC/CwB,EAAiB9e,aAAa,oBAAqByS,EAAQuD,SAAShJ,UACpE8R,EAAiB9e,aAAa,gBAAiByS,GAASwD,aAAa7U,SAC5DwE,SAAAA,KAAKV,YAAY4Z,EAAgB,EA4B1CI,CAACjN,IAzB4BkN,KACvB,MAAEjJ,eAAAA,GAAmBzD,EAAQwD,YACnC,IAAKC,EAAekJ,UAAkB,MAAA,GAEtC,MAAMN,EAAmBtnB,SAASmU,cAC9B,oCAAoC6G,QACrC6M,cAECP,GAAkBA,EAAiBnI,SAEnC2I,IAAAA,EAAsB9nB,SAASuI,cAAc,qBAC7BC,EAAAA,aAChB,OACAzJ,KAAKgT,UAAUgJ,GAAoBC,EAAStX,EAASuX,EAASC,KAE9C1S,EAAAA,aAAa,yBAA0B,QACvCA,EAAAA,aAAa,oBAAqBud,GAClCvd,EAAAA,aAAa,gBAAiBsd,GAClDgC,EAAoBtf,aAAa,oBAAqByS,EAAQuD,SAAShJ,UACvEsS,EAAoBtf,aAAa,gBAAiByS,GAASwD,aAAa7U,SAC/DwE,SAAAA,KAAKV,YAAYoa,EAAmB,GAQP5M,GACtCqM,GACgBA,KOuFhBQ,CAAoBrkB,EAASkE,KAAKoT,QAASpT,KAAKpJ,MAAOsU,EAC3D,CAEA,qBAAMmR,CAAgB7jB,GAClBA,EAAE4nB,iBAEI,MAAEhmB,IAAAA,GAAQ4F,KAAKpJ,MACrB,GAAKwD,EAIL,CAAI,IACM0B,MAAAA,QAAgB3B,EAAWC,GAE5BqlB,KAAAA,mBAAmB3jB,GACxBkc,GAA0B,CACtBC,SAAUjY,KAAKpJ,MAAMggB,UAAUqB,SAC/BC,WAAY,iBACZ3D,gBAAiBzY,EAAQyY,gBACzB4D,kBAAmBrc,EAAQqc,kBAC3BC,YAAatc,EAAQwB,KACrB+a,WAAY7d,EAAkBsB,GAC9B+U,SAAU/U,EAAQ+U,SAClB4D,SAAU3Y,EAAQmB,MAClBqb,YAAa,mBAEjB7gB,EAAc,CAAEC,UAAWiB,EAAkBhB,KAAM,CAAEqF,GAAIgD,KAAKoT,UACjE,CAAW,MACA/b,QAAAA,MAAM,0BAA0B+C,IAC5C,CACO,OAAA,CAAA,CACX,CAEA8iB,SAAAA,GACIld,KAAKqgB,cACCC,MAAAA,EAAgBtgB,KAAKpJ,MAAMgU,gBAAgBG,UAC3CwV,EAAsBvgB,KAAKpJ,MAAMgU,gBAAgB4V,gBAElDD,GACDvgB,KAAKa,UAAUC,IAAI,aAGnBwf,GAAiBtgB,KAAKpJ,MAAMyU,YAAcH,KACzBqV,EAAsBvgB,KAAKygB,iBAAiB,kBAAoB,CAACzgB,OAEzE4F,SAAQhO,IACbA,EAAQuI,iBAAiB,QAASH,KAAKsc,YAAW,IAItDtc,KAAK0gB,wBAAwB,kBAC7B1gB,KAAK0gB,wBAAwB,UAErC,CAEAL,WAAAA,GACUC,MAAAA,EAAgBtgB,KAAKpJ,MAAMgU,gBAAgBG,UAC3CwV,EAAsBvgB,KAAKpJ,MAAMgU,gBAAgB4V,gBAEnDF,GAAiBtgB,KAAKpJ,MAAMyU,YAAcH,KACzBqV,EAAsBvgB,KAAKygB,iBAAiB,kBAAoB,CAACzgB,OAEzE4F,SAAQhO,IACbA,EAAQ4f,oBAAoB,QAASxX,KAAKsc,YAAW,IAGzDtc,KAAK2gB,2BAA2B,kBAChC3gB,KAAK2gB,2BAA2B,UAExC,CAEAD,uBAAAA,CAAwBE,GACdhpB,MAAAA,EAAUoI,KAAKuM,cAAcqU,GAC/BhpB,GACAA,EAAQuI,iBAAiB,QAASH,KAAK6gB,uBAE/C,CAEAF,0BAAAA,CAA2BC,GACjBhpB,MAAAA,EAAUoI,KAAKuM,cAAcqU,GAC/BhpB,GACAA,EAAQ4f,oBAAoB,QAASxX,KAAK6gB,uBAElD,CAEAA,sBAAAA,CAAuB9oB,GACnBA,EAAM+oB,iBACV,CAEAra,oBAAAA,GACIzG,KAAKqgB,aACT,EAGJpf,eAAeC,IAAI,WAAaD,eAAeE,OAAO,SAAU6a,IMtQhE,MAAM+E,GAAoB,EAEb9e,GAAerL,IACxB,IAAKA,EACM,MAAA,GAGL,MACFgL,OAAAA,EACAxH,IAAAA,EACAuJ,WAAAA,EAAaod,GACbC,iBAAAA,EAAmB,GACnBvY,IAAAA,EACAnG,UAAAA,EACApG,KAAAA,GACAtF,EAEJ,IAAKgL,EACM,MAAA,GAaJ,MAAA,oBAVWqI,EAAsB,CACpCrI,OAAAA,EACA+B,WAAAA,EACArB,UAAWA,GAAalI,EACxBmI,UAAWkG,EACXjG,YAAatG,EAAO,KAAO8kB,cAGlBrV,EAAe/E,GAAGI,OAAS,QAAU,uBAEC,ECC1Cia,GAAmBjnB,MAAMI,IAClC,MAAMmE,EAAM,aAA6BnE,IACrC7D,IAAAA,EArBcgI,CAAAA,IACZ2iB,MAAAA,EAAUC,aAAaC,QAAQ7iB,GACrC,IAAK2iB,EAAS,OAERjH,MAAAA,EAAO9iB,KAAKC,MAAM8pB,GAIxB,MAAA,IAHgBG,MAGRC,UAAYrH,EAAKsH,QAMzB,OAAOtH,EAAKhb,MAJRkiB,aAAaK,WAAWjjB,EAIhBU,EAODwiB,CAAcljB,GACzB,YAAa6E,IAAT7M,IAEAA,QAAasB,OAAOoC,KAAKwB,UAAUuD,QAAQ5E,GApC7BsnB,EAACnjB,EAAKU,KAKxB,MAAMgb,EAAO,CACThb,MAAOA,EACPsiB,QANQ,IAAIF,MAMAC,UAVS,OAYzBH,aAAaQ,QAAQpjB,EAAKpH,KAAKgT,UAAU8P,GAAK,EA4B1CyH,CAAcnjB,EAAKhI,IAEhBA,CAAAA,EAMEqrB,GAAUA,CAACrkB,EAAgBwX,IACpCxX,EAAeskB,YAAc,GAC7BtkB,EAAewB,cAAgB,GAC/BxB,EAAewB,eAAiBgW,EClDvB+M,GAAgBA,EAAG1nB,IAAAA,EAAK2a,eAAAA,EAAiB,GAAKzI,KACvD2U,GAAiB7mB,GACZqkB,MAAKhjB,IACIsmB,MAAAA,EAAqBzV,EAAUC,cAAc,qBACnD,IAAK9Q,IAAYmmB,GAAQnmB,EAASsZ,GAC1BgN,OAAAA,IACAA,EAAmBhhB,UAAY,IAG5B,GAGPghB,IACAA,EAAmBhhB,UAAY,qBAAqBtF,EAAQsD,8BAAa,IAGhF4f,OAAMqD,IACGD,MAAAA,EAAqBzV,EAAUC,cAAc,qBAC/CwV,IACAA,EAAmBhhB,UAAY,IAEnCzJ,QAAQD,MAAM2qB,EAAG,IAGlB,IC1BI,MAAMC,GACjB5gB,WAAAA,GACIrB,KAAKkiB,QAAU,IAAIzlB,SAAQ,CAAC0lB,EAASC,KAC5BA,KAAAA,OAASA,EACdpiB,KAAKmiB,QAAUA,CAAAA,GAEvB,ECJJ,MA8BME,GAAWA,CAACA,EAA0C,EAAGtQ,EAAkE,CAAA,KACvH,MAAEuQ,eAAgBC,EAAqB,KAAQxQ,EAC/CyQ,EAAW,IAAIP,GAErB,IAAIQ,EAAyB,EAEzB,IACiBC,EArCKA,EAACL,EAAyCM,EAAmB,OACnF,GAAoB,iBAAbN,EACAA,OAAAA,EAGX,MAAMO,EAAsC,iBAAbP,EAAwBA,EAAWjqB,SAASmU,cAAc8V,GAErFO,GAAoB,OAApBA,GAAgD,iBAAbP,EACnC,MAAM,IAAIvqB,MAAM,8CAA8CuqB,MAGlE,OAAOxqB,OAAOgrB,QAAUD,EAAiBE,wBAAwBC,IAAMJ,CAAAA,EA0BlDD,CAAsBL,EAAUtQ,EAAQ4Q,wBAEtDtrB,GAEH,YADAC,QAAQD,MAAMA,EAElB,CAEA,IAAI2rB,EAAc,EACZC,MAAAA,EAAmBprB,OAAOqrB,YAAYC,MAEtCC,EADgBvrB,OAAOgrB,QACOJ,EAE9BH,EAnCoBe,EAACf,EAAwBc,KACnD,MAAME,EAAiBzrB,OAAO0rB,YACxBC,EAAaprB,SAASoO,KAAKid,aAEjC,OAAIL,EAAcE,GAAkBE,EAAaF,EAAiB,EACvD5gB,KAAKghB,IACRpB,EACAA,GAAkB5f,KAAKghB,IAAIN,IAAgBI,EAAaF,KAGzDhB,CAAAA,EAyBgBe,CAAsBd,EAAoBa,GAE3DO,EAAiBV,EAAmBX,EAiBnCsB,OAAAA,OAAAA,uBAfP,SAASC,IACCC,MAAAA,EAAmBjsB,OAAOqrB,YAAYC,MAC5C,GAAIW,EAAmBH,EAAgB,CACnCX,GAAec,EAAmBb,GAAoBX,EACxCU,IAAEA,EAAcA,EAAcA,EAAc,EAC1D,MAAMe,EAAWX,EAAcJ,EACxBX,OAAAA,SAAS,EAAGI,GAAkBW,EAAcW,IACnDlsB,OAAO+rB,sBAAsBC,EAAI,MAE1BxB,OAAAA,SAAS,EAAGI,GACnBuB,YAAW,IAAMxB,EAASL,aAAQ/e,IAAY,KAElD,OAAOof,EAASN,OACpB,IAGOM,EAASN,OAAAA,ECiGpBjhB,eAAeC,IAAI,mBAAqBD,eAAeE,OAAO,iBAtJ9D,cAAyB6a,GACrB3a,WAAAA,GACIyC,QACA9D,KAAK1C,KAAO,UACZ0C,KAAKikB,WAAa,KAClBjkB,KAAKkkB,kBAAoBlkB,KAAKmkB,aAAa/hB,KAAKpC,MAChDA,KAAKokB,uBAAyBpkB,KAAKqkB,kBAAkBjiB,KAAKpC,KAC9D,CAEA4c,YAAAA,GACW,MAAA,GAAG5c,KAAKmd,0CC1BUvmB,CAAAA,IACvB,MAAE0tB,kBAAAA,EAAmBC,aAAAA,GAAiB3tB,EAEvC2tB,OAAAA,EASE,0BAA0Bta,EALpB,CACTzJ,WAAY8jB,EACZE,MAAOD,0BALA,EAAA,EDuBGE,CAAkBzkB,KAAKpJ,QACrC,CAEAimB,iBAAAA,GACU,MAAExR,UAAAA,GAAcrL,KAAKpJ,MAEvByU,OAAAA,IAAcF,EACPnL,KAAK0kB,uBAEZrZ,IAAcH,EACPlL,KAAK2kB,uBAGT3kB,KAAKge,0BAChB,CAEAA,wBAAAA,GACI,MAAO,GAAG/b,GAAajC,KAAKpJ,2BAClBqV,GAAsBjM,KAAKpJ,2BAC3BuV,GAAiBnM,KAAKpJ,2BACtB0U,EAActL,KAAKpJ,2BAEjBoJ,KAAKpJ,MAAMke,eJLAhZ,EIKgCkE,KAAKpJ,MJJhEkF,EAAQyB,gBAAkBzB,EAAQyB,eAAeC,eIK3B,+DAA+DskB,GAC3D9hB,KAAKpJ,MACLoJ,QAEJ,uBAER+L,GAAe/L,KAAKpJ,SJZPkF,IAAAA,CIa3B,CAEA6oB,oBAAAA,GACI,MAAO,GAAG1iB,GAAajC,KAAKpJ,2BAClBqV,GAAsBjM,KAAKpJ,2BAC3BuV,GAAiBnM,KAAKpJ,2BACtB0U,EAActL,KAAKpJ,2BAEjBoJ,KAAKpJ,MAAMke,aACL,+DAA+DgN,GAC3D,IAAK9hB,KAAKpJ,MAAOwD,IAAK4F,KAAKpJ,MAAMwD,KAAO4F,KAAKpJ,MAAMqd,UACnDjU,QAEJ,uBAER+L,GAAe/L,KAAKpJ,QAClC,CAEA8tB,oBAAAA,GACU,MAAEE,YAAAA,EAAc,CAAC,GAAM5kB,KAAKpJ,MAClC,MAAO,GAAGqV,GAAsBjM,KAAKpJ,2BAC3BuV,GAAiBnM,KAAKpJ,2BACtB0U,EAActL,KAAKpJ,2BACnBmV,GAAe/L,KAAKpJ,2BHrDDA,CAAAA,IAC3B,MACFke,aAAAA,EACAC,eAAAA,EAAiB,EACjBhW,cAAAA,EACA8iB,YAAAA,EACAgD,WAAAA,EACAC,YAAAA,GACAluB,EAEJ,IAAKke,IAAiB8M,GAAQhrB,EAAOme,GAC1B,MAAA,GAGX,IAAI1U,EAAO,GACPwhB,GAAAA,GAAegD,GAAcC,EAAa,CAC1C,MAAMC,GAAYlD,EAAc,EAAIiD,EAAcD,GAAYvqB,QAC1D,cACAunB,GAEAkD,IACA1kB,EAAO,6GACO0kB,oCAGtB,CAIA,MAAO,qBAFO5lB,WAAWJ,GAAeK,QAAQ,iCAGtCiB,GAAI,EGwBA2kB,CAAsBhlB,KAAKpJ,2BEnFhBA,CAAAA,IACzB,IAAKA,EACM,MAAA,GAGL,MAAEquB,aAAAA,EAAcC,cAAAA,EAAeC,aAAAA,EAAcC,mBAAAA,GAAuBxuB,EAE1E,OAAKquB,GAAiBC,GAAkBC,GAAiBA,EAAatmB,OAc/D,2DACqBumB,4DACiBF,kBAZzBC,EACfzoB,KAAI,EAAG4D,MAAAA,EAAOmI,IAAAA,KACPA,EACO,YAAYA,4CAA8CnI,eAG9D,mDAAmDA,mBAE7D+B,KAAK,kBAXC,EAgBM,EF4DHgjB,CAAcT,uBACd3iB,GAAajC,KAAKpJ,QAChC,CAEAgnB,mBAAAA,GACU,MAAEvS,UAAAA,GAAcrL,KAAKpJ,MAC3B,OAAIyU,IAAcF,EACP,GAGJV,EAAYzK,KAAKpJ,MAC5B,CAEAytB,iBAAAA,CAAkB7rB,GACdA,EAAE4nB,iBACEhoB,SAASmU,cAAc,sBACvB8V,GAAS,oBAEjB,CAEA8B,YAAAA,CAAa3rB,GACHT,MAAAA,EAAQQ,EAAUC,GACxB,GAAKT,EAAMqC,IAINgK,OAAAA,KAAAA,SAAW,0BAChBpE,KAAKC,SAEExD,QAAQ1F,IAAI,CAACgD,IAAqBI,EAAWpC,EAAMqC,OACrDqkB,MAAK,EAAE6G,EAAW5G,MACX,IAACA,IAAY4G,EACb,OAGEC,MAAAA,EAAYvlB,KAAKpJ,MAAMgL,QAAQpL,MAAK+a,GAAKA,EAAEnX,MAAQrC,EAAMqC,OAAM2J,OAErE/D,KAAKpJ,MAAQ,IACNoJ,KAAKpJ,SACL8nB,EACH9c,OAAQ5B,KAAKpJ,MAAMgL,OACnBxH,IAAKskB,EAAQzK,UAAY,GACzBlX,QAAS2hB,EAAQ1hB,IAAM,GACvB2N,MAAO+T,EAAQ8G,kBAAkBC,UAAY/G,EAAQthB,QAAQc,MAAQ,GACrEwM,eAAgBgU,EAAQxiB,MAAQ,GAChCe,MAAOqoB,EAAU3lB,MAAMxG,IAAeulB,EAAQzhB,OAC9CqF,UAAWoc,EAAQzK,UAAY,GAC/BzG,cAAekR,EAAQ1hB,IAAM,GAC7ByL,IAAKiW,EAAQrb,SAASC,SAAW,GACjCS,OAAQwhB,KACL7S,GAAYgM,EAAS1e,KAAKpJ,WAGpC+nB,OAAM,KACHrnB,QAAQD,MAAM,0BAA0BU,EAAMqC,MAAK,IAEtDsrB,SAAQ,KACAnhB,KAAAA,eACLvE,KAAKwE,WAAO,GAExB,CAEA0Y,SAAAA,GACIld,KAAKG,iBAAiB/J,EAAqB4J,KAAKkkB,mBAEhDlkB,KAAKikB,WAAajkB,KAAKuM,cAAc,cACjCvM,KAAKikB,YACLjkB,KAAKikB,WAAW9jB,iBAAiB,QAASH,KAAKokB,uBAEvD,CAEA/D,WAAAA,GACIrgB,KAAKwX,oBAAoBphB,EAAqB4J,KAAKkkB,mBAE/ClkB,KAAKikB,YACLjkB,KAAKikB,WAAWzM,oBAAoB,QAASxX,KAAKokB,uBAE1D,CAEA3d,oBAAAA,GACIzG,KAAKqgB,aACT,IGnJJ,IAAKsF,GACGA,IAAAA,GAAM,IAnBd,MACItkB,WAAAA,GACSukB,KAAAA,KAAOxtB,SAASuI,cAAc,MACvC,CAEAklB,QAAAA,CAAS9tB,EAAO+tB,GACPF,KAAAA,KAAKzlB,iBAAiBpI,EAAO+tB,EACtC,CAEAvO,MAAAA,CAAOxf,EAAO+tB,GACLF,KAAAA,KAAKpO,oBAAoBzf,EAAO+tB,EACzC,CAEAC,IAAAA,CAAKhuB,EAAOE,EAAS,IACjB+H,KAAK4lB,KAAKnuB,cAAc,IAAIO,YAAYD,EAAO,CAAEE,OAAAA,IACrD,GAOJ,MAAA+tB,GAAeL,GCXf,MAAMM,WAAYnmB,YACduB,WAAAA,WAEIrB,KAAKpJ,MAAQ,GACboJ,KAAK+M,OAASD,KACd9M,KAAKoN,SAAWH,IACpB,CAEA,6BAAWiZ,GACA,MAAA,CAAC,OAAQ,WACpB,CAEAnmB,iBAAAA,GACIC,KAAKpJ,MAAQ,IACNP,EAAY2J,KAAK1J,YACpB0X,gBAAiBhO,KAAK6d,aAAa,yBAGvC7d,KAAKmmB,iBAAmBnmB,KAAKI,YAAYgC,KAAKpC,MAC9CA,KAAKomB,KAAOpmB,KAAKe,UAAUzG,QAAQ,OAAQ,IAAI2Q,OAC/CjL,KAAKC,QACT,CAEAA,MAAAA,GACU,MACFyW,YAAAA,EAAc,GACd2P,WAAAA,EACAC,iBAAAA,EACAC,kBAAAA,EACAC,SAAAA,EACAC,UAAAA,EAAY,GACZC,WAAAA,EAAa,GACbC,aAAAA,EACArmB,MAAAA,EACAsmB,aAAAA,GAAe,EACfC,SAAAA,EAAW,GACXvH,UAAAA,EAAY,GACZ5e,KAAAA,EAAO,KACPwd,cAAAA,EAAgB,GAChBC,kBAAAA,EAAoB,GACpB2I,YAAAA,EAAc,QACdzb,UAAAA,GACArL,KAAKpJ,MACL,IAAEyJ,KAAAA,GAASL,KAAKpJ,MAEdwvB,MAAAA,EAAOpmB,KAAKomB,KAAOpmB,KAAKomB,KAAO9lB,EAE/B1I,EAAUQ,SAASuI,cAAcN,EAAO,IAAM,UAqBpD,GAnBI8d,GAAqBD,GAAiB2I,GACtCjM,GAAkBuD,EAAmBD,EAAe2I,GAGpDxmB,IACAA,EAAOA,EAAK/F,QAAQ,WAAY0F,KAAK+M,QACrC1M,EAAOA,EAAK/F,QAAQ,SAAU0F,KAAKoN,UAEnCxV,EAAQgJ,aAAa,OAAQP,IAG7BA,GAAQumB,GACRhvB,EAAQgJ,aAAa,SAAU,UAG/B0e,GAAajf,GACbzI,EAAQgJ,aAAa,QAAS0e,GAG9B+G,EACAzuB,EAAQgJ,aAAa,aAAcylB,QAAU,GACtCE,GAAqBD,EAAkB,CAC9C,MAAMS,EAAY,CAACR,EAAmBH,EAAME,GACvCzvB,QAAOoI,KAAWA,IAClBoD,KAAK,KACV0kB,GAAanvB,EAAQgJ,aAAa,aAAcmmB,EACpD,CAaA,GAXkB,eAAd1b,GACAzT,EAAQiJ,UAAUC,IAAI,eAE1BlJ,EAAQiJ,UAAUC,IAAI,WAAWuK,KAC7Bmb,IACoB,SAAhBM,EACAlvB,EAAQiJ,UAAUC,IAAI,WAAW0lB,kBAEjC5uB,EAAQiJ,UAAUC,IAAI,WAAW0lB,MAGrC9lB,EAAM,CACN,IAAIsmB,EAAY,cAChB,OAAQtmB,GACJ,IAAK,KACDsmB,EAAY,cACZ,MACJ,IAAK,KACDA,EAAY,cAGpBpvB,EAAQiJ,UAAUC,IAAI,SAASJ,IAAQsmB,EAC3C,EAEmB,YAAd3b,GAAyC,aAAdA,IAA6C,KAAhBqL,IACzD1W,KAAKY,aAAa,cAAe8V,GACjC1W,KAAKY,aAAa,WAAY,KACd,UAAhB8V,EACM9e,EAAQiJ,UAAUC,IAAI,oBACtBlJ,EAAQiJ,UAAUC,IAAI,qBAGhC2lB,GAAazmB,KAAKY,aAAa,YAAa6lB,GAC5CC,GAAc1mB,KAAKY,aAAa,aAAc8lB,GAE9C9uB,EAAQmJ,UAAY,qBACV0lB,GAAa,kBAAkBA,0CACzBL,6BAEU,YAAd/a,GAA2C,KAAhBqL,GAAuC,KAAjBiQ,EAC3C,wBAAwBA,WACxB,uBAERD,GAAc,kBAAkBA,4BAE1C1mB,KAAKe,UAAYnJ,EAAQoJ,UAEzBhB,KAAKinB,kBACLjnB,KAAKknB,cACT,CAEA9mB,WAAAA,IACuC,IAA/BJ,KAAKpJ,MAAMoX,iBACXhO,KAAKmnB,QAGH,MAAEC,SAAAA,EAAW,GAAItR,SAAAA,EAAW,GAAIuR,MAAAA,EAAQ,IAAOrnB,KAAKpJ,MAEtDwwB,GACAE,GAASvB,KAAKqB,EAAU,CAAA,GAExBtR,GACA9V,KAAK6V,MAAMC,GAEXuR,GACArnB,KAAKunB,qBAAqBF,EAElC,CAEAxR,KAAAA,CAAMC,GACFre,EAAc,CAAEC,UAAWiB,EAAkBhB,KAAM,CAAEqF,GAAI8Y,IAC7D,CAEAyR,oBAAAA,CAAqBF,GACjB5vB,EAAc,CAAEC,UjDlIK,wBiDkIqBC,KAAM,CAAEqF,GAAIqqB,IAC1D,CAEAF,KAAAA,GACU,MACFK,YAAAA,EAAc,GACdC,cAAAA,EAAgB,GAChBC,kBAAAA,EAAoB,GACpBtJ,kBAAAA,EAAoB,GACpBuJ,wBAAAA,EAA0B,GAC1BzJ,cAAAA,EACA5d,MAAAA,EACAwV,SAAAA,EAAW,GACX8R,qBAAAA,EAAuB,GACvBC,SAAAA,EAAW,IACX7nB,KAAKpJ,MAEHggB,EAAW,CACb5Z,GAAIwqB,EACJtrB,KAAMurB,EACN7Z,SAAU8Z,EACVzP,SAAUmG,GAGR0J,EAAahS,EAAW,QAAU,MAElCiS,EAAc,GAAGH,IADV5nB,KAAKomB,KAAOpmB,KAAKomB,KAAO9lB,IAE/B0nB,EAAgBL,EAA0B,MAAMA,IAA4B,GAG9EM,IAAAA,EAF0B9wB,KAAKC,MAAM4I,KAAKpJ,OAAOsxB,kBAAoB,SAGnE,GAAGJ,EAAaE,OACZhoB,KAAKpJ,MAAMiwB,SAAS3M,MAAM,KAAK,QAC7B6N,IACN,GAAGD,EAAaE,OAAmBD,IAOzC,GALAvO,GAAiB,CACb5C,SAAAA,EACA6C,SAAUwO,IAGVnS,GAAY+R,EAAU,CACtB,MAAM/rB,EAAU3E,KAAKC,MAAMywB,GACrBM,EACFjK,EAAcrjB,QAAQ,UAAcqjB,EAAchE,MAAM,OAAO,GAAKgE,EACxElG,GAA0B,CACtBC,SAAUjY,KAAKpJ,MAAMwnB,mBAAqB,GAC1ClG,WAAYiQ,EAAcnjB,cAAgB,cAC1CuP,gBAAiBzY,EAAQyY,gBACzB4D,kBAAmBrc,EAAQqc,kBAC3BC,YAAatc,EAAQwB,KACrB+a,WAAYvc,EAAQuc,WACpBxH,SAAU/U,EAAQ+U,SAClB4D,SAAU3Y,EAAQ2Y,SAClB6D,YAAa6P,EAAgB,eAErC,CACJ,CAEAC,wBAAAA,CAAyBlsB,GACR,SAATA,GACA8D,KAAKC,SAEI,aAAT/D,IACA8D,KAAKa,UAAUC,IAAI,WACnBkjB,YAAW,KACFnjB,KAAAA,UAAU0W,OAAO,UAAS,GjD3ItB,MiD8IrB,CAEA2P,YAAAA,GACS/mB,KAAAA,iBAAiB,QAASH,KAAKmmB,iBACxC,CAEAc,eAAAA,GACSzP,KAAAA,oBAAoB,QAASxX,KAAKmmB,iBAC3C,CAEA1f,oBAAAA,GACIzG,KAAKinB,iBACT,EAGJhmB,eAAeC,IAAI,WAAaD,eAAeE,OAAO,SAAU8kB,ICxOzD,MAAMoC,GAAkB,SAGlBC,GAAW,CACpB,CACIpsB,KAAM,QACNqsB,MAAO,CACH,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAClF,IAAK,IAAK,IAAK,IAAK,IAAK,MAGjC,CACIrsB,KAAM,SACNqsB,MAAO,CACH,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACjF,KAAM,KAAM,KAAM,IAAM,KAAM,KAAM,IAAM,KAAM,MAGxD,CACIrsB,KAAM,QACNqsB,MAAO,CAAC,IAAK,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,OAE3D,CACIrsB,KAAM,UACNqsB,MAAO,CACH,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,qDCZhG,MAAMC,WAAY1oB,YACduB,WAAAA,WAUAonB,EAAAzoB,KAAA0oB,IA8CAD,EAAAzoB,KAAA2oB,IAyBAF,EAAAzoB,KAAA4oB,IAKAH,EAAAzoB,KAAA6oB,IAkBAJ,EAAAzoB,KAAA8oB,IAoBAL,EAAAzoB,KAAA+oB,IAgBAN,EAAAzoB,KAAAgpB,GA1IA,CAEAjpB,iBAAAA,GACSnJ,KAAAA,MAAQP,EAAY2J,KAAK1J,YAC9B0J,KAAKC,SACLgpB,EAAAjpB,KAAK0oB,GAAAQ,IAAL3jB,KAAAvF,KACJ,CAaAC,MAAAA,GACU,MACFkpB,KAAAA,EAAO,GACP/sB,YAAAA,EAAc,GACdgtB,SAAAA,EAAWf,GACXgB,cAAAA,EAAgB,IAChBrpB,KAAKpJ,MAEI,KAATuyB,IAKJnpB,KAAKopB,SAAWA,EAChBppB,KAAKmpB,KAAOA,EAAOF,EAAAjpB,KAAK2oB,GAAAW,IAAL/jB,WAEnB0jB,EAAAjpB,KAAK+oB,GAAAQ,IAALhkB,KACAvF,MAAAA,KAAKa,UAAUC,IAAI,UACnBd,KAAKe,UAAY,uCAEPf,KAAKopB,WAAaf,GAAkB,SAAW,QAAQroB,KAAKmpB,4BAC5C,KAAhB/sB,EAAqB,QAAQA,KAAiB,qDDvDjC,WCwDb4D,KAAKopB,SAA+B,iBAAmB,uBACrC,KAAlBC,EAAuB,iBAAiBA,IAAkB,uDAIpErpB,KAAKwpB,YAAcxpB,KAAKwf,aAAa,SAAStF,MAAM,KAAK,GAGhC,KAArBla,KAAKwpB,aACLxpB,KAAKypB,kBAAkB5oB,UAAUC,IAAId,KAAKwpB,YAAc,YAEhE,EA5CAd,GAAA,IAAAgB,QAAAR,GAAaS,WACL3pB,KAAKopB,WAAaf,IAOtB7f,EAASxI,KAAKypB,kBAAmB,MAAO,GAAGzpB,KAAKmpB,OAAQnpB,KAAKmpB,KACjE,EAqCAR,GAAA,IAAAW,QAAAA,GAAiBM,WACP,MAAEC,aAAAA,EAAcC,YAAAA,EAAaC,aAAAA,EAAcC,SAAAA,GAAW,GAAShqB,KAAKpJ,MAE1E,GAAiB,UAAbozB,EACO,MAAA,GAGX,IAAIC,EAAQjqB,KAAKkqB,YAEbJ,GAAAA,GAA+B,KAAhBA,IACfG,EAAQ3gB,OAAOwgB,IAGfC,GAAiC,KAAjBA,EAAqB,CACrC,MAAOI,EAAGC,GAAKP,EAAa3P,MAAM,KAClC+P,EAAQvnB,KAAK2P,MAAO/I,OAAOygB,GAAgBI,EAAKC,EACpD,CAEA,IAAIC,EAAapB,EAAAjpB,KAAK4oB,GAAA0B,IAAL/kB,KAAqB0kB,KAAAA,GAI/B,MAAA,aAFiBhB,EAAAjpB,KAAK6oB,GAAA0B,IAALhlB,KAAyB8kB,KAAAA,cAEFA,eACnD,EAEAzB,GAAA,IAAAc,QAAAY,GAAeE,SAACP,GACN,MAAEljB,iBAAAA,GAAqBlP,OACtBkP,OAAAA,EAAmB,EAAY,EAARkjB,EAAYA,CAC9C,EAEApB,GAAA,IAAAa,QAAAa,GAAmBE,SAACR,GACV,MAAES,WAAAA,EAAYC,SAAAA,GAAa1B,EAAAjpB,KAAK8oB,GAAA8B,IAALrlB,KAAkB0kB,KAAAA,GAE/CS,GAAAA,EACA,OAAOA,EAAWxuB,KACf,CACH,IAAI2uB,EAAWF,EAAS,GAAGG,KACvBC,EAAU,KACdJ,OAAAA,EAAS/kB,SAAQqU,IACTA,EAAK6Q,MAAQD,IACbA,EAAW5Q,EAAK6Q,KAChBC,EAAU9Q,EAAAA,IAGX8Q,EAAQ7uB,IACnB,CACJ,EAEA4sB,GAAA,IAAAY,QAAAkB,GAAYI,SAACf,GACLS,IAAAA,EAAa,KACbC,EAAW,GACfrC,OAAAA,GAASzmB,OAAMopB,IACX,MAAMC,EAAQD,EAAQ1C,MAAM/xB,MAAK20B,GAAMA,GAAMlB,IAE7C,GAAIiB,EAAO,CACP,GAAIA,IAAUjB,EACVS,OAAAA,EAAaO,GACN,EAGXN,EAASpnB,KAAK,CAAErH,KAAM+uB,EAAQ/uB,KAAM4uB,KAAMI,EAAQjB,GACtD,CAEO,OAAA,CAAA,IAEJ,CAAES,WAAAA,EAAYC,SAAAA,EACzB,EAEA5B,GAAA,IAAAQ,QAAAA,GAAiB6B,WACP,MACFvB,aAAAA,EACAwB,WAAAA,EACAC,wBAAAA,EACAC,uBAAAA,EACAC,cAAAA,GACAxrB,KAAKpJ,MAETqyB,EAAAjpB,KAAKgpB,GAAAyC,IAALlmB,UAAqB,uBAAwBskB,GAC7CZ,EAAAjpB,KAAKgpB,GAAAyC,IAALlmB,KAAAvF,KAAqB,qBAAsBqrB,GAC3CpC,EAAAjpB,KAAKgpB,GAAAyC,IAALlmB,KAAAvF,KAAqB,kCAAmCsrB,GACxDrC,EAAAjpB,KAAKgpB,GAAAyC,IAALlmB,KAAqBvF,KAAA,iCAAkCurB,GACvDtC,EAAAjpB,KAAKgpB,GAAAyC,IAALlmB,KAAqBvF,KAAA,iCAAkC,IAAMwrB,EAAgB,IACjF,EAEAxC,GAAA,IAAAU,QAAA+B,GAAeC,SAACxvB,EAAM+C,IACbA,GAAmB,gBAAVA,GAIde,KAAK4e,MAAM+M,YAAYzvB,EAAM+C,EACjC,EAGJgC,eAAeC,IAAI,WAAaD,eAAeE,OAAO,SAAUqnB,ICvKhE,MAAMoD,WAAa9rB,YACfuB,WAAAA,GACIyC,QACA9D,KAAKomB,KAAOpmB,KAAKe,UACjBf,KAAKmmB,iBAAmBnmB,KAAKI,YAAYgC,KAAKpC,MAC9CA,KAAK+M,OAASD,KACd9M,KAAKoN,SAAWH,IACpB,CAEAlN,iBAAAA,GACIC,KAAKpJ,MAAQ,IACNP,EAAY2J,KAAK1J,YACpB0X,gBAAiBhO,KAAK6d,aAAa,yBAEvC7d,KAAKC,SACLD,KAAK6rB,iBACL7rB,KAAK8rB,YACT,CAEA7rB,MAAAA,GACU,MACFS,KAAAA,EAAO,QACPb,MAAAA,EAAQ,OACRQ,KAAAA,EAAO,GACPqmB,WAAAA,EAAa,GACbD,UAAAA,EAAY,GACZ9b,MAAAA,EAAQ,GACRohB,UAAAA,EAAY,IACZ/rB,KAAKpJ,MAGT8J,GAAQV,KAAKY,aAAa,OAAQF,GAClCb,GAASG,KAAKY,aAAa,QAASf,GACpC8K,GAAS3K,KAAKY,aAAa,QAAS+J,GACpCohB,GAAa/rB,KAAKY,aAAa,YAAamrB,GAC5CtF,GAAazmB,KAAKY,aAAa,YAAa6lB,GAC5CC,GAAc1mB,KAAKY,aAAa,aAAc8lB,GAEjC,KAATrmB,EACAL,KAAKgsB,eAELhsB,KAAK4L,aAGT5L,KAAKK,KAAOL,KAAKypB,iBACrB,CAEA7d,UAAAA,GACU,MACFtL,MAAAA,EACAgf,UAAAA,EAAY,GACZ2M,eAAAA,EAAiB,GACjBrF,aAAAA,EAAe,QACfsF,mBAAAA,EAAqB,GACrBxF,WAAAA,EAAa,GACb/b,MAAAA,EAAQ,GACRohB,UAAAA,EAAY,GACZtF,UAAAA,EAAY,GACZhmB,SAAAA,EAAW,GACX0rB,QAAAA,EAAU,IACVnsB,KAAKpJ,MACL,IAAEyJ,KAAAA,GAASL,KAAKpJ,MAEpB,MAAMwvB,EAAOpmB,KAAKomB,KAAOpmB,KAAKomB,KAAO9lB,EAEjCD,IACAA,EAAOA,EAAK/F,QAAQ,WAAY0F,KAAK+M,QACrC1M,EAAOA,EAAK/F,QAAQ,SAAU0F,KAAKoN,WAGvCpN,KAAKe,UAAY,mCAELV,mBACW,SAAjBumB,EAA0B,kBAAoB,mBAE3B,SAAjBA,GAAkD,KAAvBsF,EACrB,qBAAqBA,KACrB,mBAERD,GAAkB,mBAAmBA,qBACrC3M,EAAY,UAAUA,KAAe,mBACrC8G,EAAO,eAAeA,KAAU,mBACnB,SAAb3lB,EAAsB,sBAAwB,mBAClC,SAAZ0rB,EAAqB,YAAY/F,KAAU,8BAE3CK,GAAa,kBAAkBA,gCAC/B9b,GAAS,aAAaA,WAAeohB,6BAC/B3F,yBACNM,GAAc,kBAAkBA,+BAE1C,CAEAsF,YAAAA,GACU,MACF1rB,MAAAA,EACA2rB,eAAAA,EAAiB,GACjBvF,WAAAA,EAAa,GACbD,UAAAA,EAAY,GACZhmB,SAAAA,EAAW,GACXkK,MAAAA,EAAQ,GACRohB,UAAAA,EAAY,GACZI,QAAAA,EAAU,IACVnsB,KAAKpJ,MAEHwvB,EAAOpmB,KAAKomB,KAAOpmB,KAAKomB,KAAO9lB,EAErCN,KAAKe,UAAY,kCAEXkrB,GAAkB,mBAAmBA,qBACxB,SAAbxrB,EAAsB,uBAAyB,mBACnC,SAAZ0rB,EAAqB,YAAY/F,KAAU,8BAE3Czb,GAAS,aAAaA,WAAeohB,uBACrCtF,GAAa,kBAAkBA,sCACzBL,yBACNM,GAAc,kBAAkBA,oCAE1C,CAEAmF,cAAAA,GACU,MAAEnrB,KAAAA,EAAO,QAAS0rB,cAAAA,EAAgB,SAAYpsB,KAAKpJ,MACzD,IAAIy1B,EAAY,GAEhB,OAAQ3rB,GACJ,IAAK,SACD2rB,EAAY,eACZ,MACJ,IAAK,QACDA,EAAY,cACZ,MACJ,IAAK,SACDA,EAAY,cACZ,MAIJ,QACIA,EAAY,cAIE,SAAlBD,IACAC,EAAY,cACZrsB,KAAKY,aAAa,YAAa,UAGnCZ,KAAKuM,cAAc,aAAa1L,UAAUC,IAAIurB,EAClD,CAEAjsB,WAAAA,IACuC,IAA/BJ,KAAKpJ,MAAMoX,iBACXhO,KAAKmnB,QAGH,MACFrR,SAAAA,EAAW,GACX1b,IAAAA,EAAM,GACN+jB,kBAAAA,EAAoB,GACpBD,cAAAA,EAAgB,GAChBoO,WAAAA,GACAtsB,KAAKpJ,MAELkf,GAAY1b,EACZ4F,KAAKusB,UAAUzW,EAAU1b,EAAK+jB,EAAmBD,EAAeoO,GAIhExW,GACA9V,KAAK6V,MAAMC,EAEnB,CAEAD,KAAAA,CAAMC,GACFre,EAAc,CAAEC,UAAWiB,EAAkBhB,KAAM,CAAEqF,GAAI8Y,IAC7D,CAEAyW,SAAAA,CAAUzW,EAAU1b,EAAK+jB,EAAmBD,EAAetc,GACjD,MAAEimB,SAAAA,GAAa7nB,KAAKpJ,MAa1B,GAXAa,EAAc,CACVC,UpD/JwB,+BoDgKxBC,KAAM,CACF20B,WAAY1qB,EACZ5E,GAAI8Y,EACJ1b,IAAKA,EACL+jB,kBAAmBA,EACnBD,cAAeA,KAInB2J,EAAU,CACV,MAAM/rB,EAAU3E,KAAKC,MAAMywB,GACrBM,EACFjK,EAAcrjB,QAAQ,UAAcqjB,EAAchE,MAAM,OAAO,GAAKgE,EACxElG,GAA0B,CACtBC,SAAUjY,KAAKpJ,MAAMwnB,mBAAqB,GAC1ClG,WAAYiQ,EAAcnjB,cAAgB,cAC1CuP,gBAAiBzY,EAAQyY,gBACzB4D,kBAAmBrc,EAAQqc,kBAC3BC,YAAatc,EAAQwB,KACrB+a,WAAYvc,EAAQuc,WACpBxH,SAAU/U,EAAQ+U,SAClB4D,SAAU3Y,EAAQ2Y,SAClB6D,YAAa6P,EAAgB,eAErC,CACJ,CAEAhB,KAAAA,GACU,MACFK,YAAAA,EAAc,GACdC,cAAAA,EAAgB,GAChBC,kBAAAA,EAAoB,GACpBtJ,kBAAAA,EAAoB,GACpBuJ,wBAAAA,EAA0B,GAC1BrnB,MAAAA,EACAwV,SAAAA,EAAW,GACX+Q,SAAAA,EAAW,GACX3I,cAAAA,EAAgB,GAChBC,kBAAAA,EAAoB,IACpBne,KAAKpJ,MAEHggB,EAAW,CACb5Z,GAAIwqB,EACJtrB,KAAMurB,EACN7Z,SAAU8Z,EACVzP,SAAUmG,GAGRoO,EAAc1W,EAAW,QAAU,OACnCsQ,EAAOpmB,KAAKomB,KAAOpmB,KAAKomB,KAAO9lB,EAE/B0nB,EACFL,GAAuD,IAA5BA,EACrB,MAAMA,IACN,GAENzJ,GAAiBC,EACjBhD,GAAagD,EAAmBD,EAAe2I,GAE/CrN,GAAiB,CACb5C,SAAAA,EACA6C,SAAU,GAAG+S,EAAcxE,OAAmB5B,EAAKnb,UAG/D,CAEA6gB,UAAAA,GACI9rB,KAAKysB,eACLzsB,KAAKK,KAAKF,iBAAiB,QAASH,KAAKmmB,iBAC7C,CAEAsG,YAAAA,GACIzsB,KAAKK,KAAKmX,oBAAoB,QAASxX,KAAKmmB,iBAChD,CAEA1f,oBAAAA,GACIzG,KAAKysB,cACT,EAGJxrB,eAAeC,IAAI,YAAcD,eAAeE,OAAO,UAAWyqB,IC7QnD,MAAAc,GACXrrB,WAAAA,CAAYwD,EAAMtO,GACdyJ,KAAK2sB,SAAW,IAAIljB,sBAChBmjB,GAA6B5sB,KAAK6sB,SAASD,IAC3C,CAAEE,UAAW,CAAC,GAAIC,WAAY,UAGlC/sB,KAAKmrB,GAAKtmB,EACV7E,KAAKzJ,KAAOA,EAENyJ,KAAKmrB,cAAc6B,SAIzBhtB,KAAK2sB,SAAS5iB,QAAQ/J,KAAKmrB,GAC/B,CAQA0B,QAAAA,CAASI,GACLA,EAAYrnB,SAAQsnB,IACXA,EAAWtjB,iBAIhB5J,KAAKmnB,MAAM+F,GACXltB,KAAK2sB,SAAS9iB,UAAUqjB,EAAWpjB,QAAM,GAEjD,CAEAqd,KAAAA,GAEQ,wBAAyBtvB,OACzBA,OAAOs1B,qBAAoB,IAAMntB,KAAKotB,aAEtCv1B,OAAOmsB,YAAW,IAAMhkB,KAAKotB,YAAY,EAEjD,CAEAA,QAAAA,IACSptB,KAAKzJ,KAAKyG,IAA6B,OAApBgD,KAAKzJ,KAAKyG,IAAsC,KAApBgD,KAAKzJ,KAAKyG,IAG9Dic,GAAc,IAAKjZ,KAAKzJ,MAC5B,EC9CW,SAAA82B,GAAUxoB,EAAM+R,GAC3B,MAAM0W,EAAW,IAAIC,GAAa1oB,EAAM+R,GAEjC,MAAA,CACH4W,QAASA,KACAF,EAASG,SAASC,2BACnBJ,EAASE,SAAO,EAIhC,CAEA,MAAMD,WAAqBb,GACvBrrB,WAAAA,CAAYwD,EAAMtO,GACRsO,MAAAA,GACN7E,KAAKzJ,KAAOA,CAChB,CAEA62B,QAAAA,GACU1T,MAAAA,EAAczR,EAAkBjI,KAAKzJ,M5C0XtBo3B,IAACn2B,E4CzXlBkiB,I5CyXkBliB,E4CzXYkiB,E5C0XH,IAA5Blb,OAAOC,KAAKjH,GAAKqH,S4CzXhBoa,GAAc,IAAKS,GAE3B,ECvBJ,MAAMkU,WAAkB9tB,YACpBuB,WAAAA,WAEIrB,KAAKomB,KAAOpmB,KAAKe,SACrB,CAEAhB,iBAAAA,GACSnJ,KAAAA,MAAQ,IAAIoJ,KAAK1J,YAAYQ,QAAO,CAACC,EAAKC,KACpC,IAAKD,EAAK,CAACC,EAAKN,UAAWM,EAAKC,aACxC,CAAE,GACL+I,KAAKC,SACLD,KAAK6tB,eACL7tB,KAAK8tB,cACT,CAEAD,YAAAA,GACU,MACFrG,YAAAA,EAAc,KACdC,cAAAA,EAAgB,KAChBC,kBAAAA,EAAoB,KACpBtJ,kBAAAA,EAAoB,MACpBpe,KAAKpJ,MACTy2B,GAAartB,KAAM,CACfhD,GAAIwqB,EACJtrB,KAAMurB,EACN7Z,SAAU8Z,EACVzP,SAAUmG,GAElB,CAEA0P,YAAAA,GACU3C,MAAAA,EAAKnrB,KAAKuM,cAAc,cAC9B,IAAK4e,EACD,OAGE1iB,MAAAA,EAAMzI,KAAK+tB,cACjB,IAAKtlB,EACD,OAGE,MAAEulB,UAAAA,GAAchuB,KAAKpJ,MACT,UAAdo3B,EAKJxlB,EACI2iB,EACA,QACA,yBAAyB1iB,OAAS0iB,EAAG3L,aAAa,UAAY,KAC9D/W,GARA0iB,EAAGvqB,aAAa,QAAS,yBAAyB6H,KAU1D,CAEAslB,WAAAA,GACU,MACFE,kBAAAA,EAAoB,GACpBC,kBAAAA,EAAoB,GACpBC,mBAAAA,EAAqB,GACrBC,kBAAAA,EAAoB,IACpBpuB,KAAKpJ,MAET,IAAI6R,EAAM,GACV,OAAIkD,EAAe/E,GAAGI,QAAUinB,EAC5BxlB,EAAMwlB,EACCtiB,EAAe/E,GAAGM,QAAUgnB,EACnCzlB,EAAMylB,GACEviB,EAAe/E,GAAGO,QAAUwE,EAAe/E,GAAGM,SAAWknB,EACjE3lB,EAAM2lB,GAELziB,EAAe/E,GAAGtD,SAAWqI,EAAe/E,GAAGO,QAAUwE,EAAe/E,GAAGM,SAC5EinB,IAEA1lB,EAAM0lB,GAGH1lB,CACX,CAEAxI,MAAAA,GACU,MACFouB,OAAAA,EAAS,GACT7H,SAAAA,EACA8H,iBAAAA,EAAmB,GACnBC,UAAAA,EAAY,GACZC,cAAAA,EAAgB,GAChBpI,KAAAA,GACApmB,KAAKpJ,MAGT,IAAI63B,EAAkB,QACL,cAAbjI,EACAxmB,KAAKY,aAAa,WAAY6tB,GAE9BA,EAAkBjI,EAGtBxmB,KAAKe,UAAY,kDAEAwtB,iCACGE,8BACHJ,sCAEPC,GAAoBtuB,KAAK0uB,aAAe1uB,KAAK2uB,WAAa,4CACrCH,4BACjBpI,mDAGlB,CAEAsI,UAAAA,GACU,MAAET,kBAAmB7jB,EAAG+jB,mBAAoBS,EAAGR,kBAAmBS,GAAM7uB,KAAKpJ,MACnF,QAASwT,KAAOwkB,KAAOC,CAC3B,CAEAF,QAAAA,GACU,MAAEL,iBAAAA,EAAmB,IAAOtuB,KAAKpJ,MAEhC,MAAA,2BAA2B03B,GAAsC,uBAChEtuB,KAAK0uB,aAAe,gCAAkC,IAClE,EAGJztB,eAAeC,IAAI,iBAAmBD,eAAeE,OAAO,eAAgBysB,IC5H5E,MAAMkB,WAAahvB,YACfuB,WAAAA,GACIyC,QACA9D,KAAKomB,KAAOpmB,KAAKe,UACjBf,KAAK+uB,SAAW,IACpB,CAEA,6BAAW7I,GACA,MAAA,CAAC,WAAY,UACxB,CAEAnmB,iBAAAA,GACIC,KAAKpJ,MAAQP,EAAY2J,KAAK1J,YAC9B0J,KAAKgvB,aAAehvB,KAAKivB,cACzBjvB,KAAKC,SACLD,KAAK6tB,cACT,CAEAA,YAAAA,GACU,MAAErG,YAAAA,EAAaC,cAAAA,EAAerJ,kBAAAA,EAAmBsJ,kBAAAA,GAAsB1nB,KAAKpJ,MAE5EyJ,EAAOL,KAAKuM,cAAc,SAE5BlM,IACAA,EAAK6uB,QAAU,KACXvV,GAAgB,CACZF,SAAUzZ,KAAKgvB,aACfhyB,GAAIwqB,EACJtrB,KAAMurB,EACNxP,SAAUmG,EACVxQ,SAAU8Z,GACb,EAGb,CAEAuH,WAAAA,GACU,MAAEE,QAAAA,GAAYnvB,KAAKpJ,MACzB,OAAQoJ,KAAKomB,KAAOpmB,KAAKomB,KAAO+I,GAASlkB,MAC7C,CAEAhL,MAAAA,GACU,MACF/B,KAAAA,EAAO,GACP2B,MAAAA,EAAQ,GACRuvB,iBAAAA,EAAmB,GACnBC,gBAAAA,EAAkB,SAClBC,QAAAA,EAAU,OACVC,QAAAA,EAAU,QACVC,SAAAA,EAAW,QACXxyB,GAAAA,EACAM,KAAAA,EAAO,YACP0C,KAAKpJ,MAEHwvB,EAAOpmB,KAAKgvB,aAGlB,MAAMS,EAA0B,SAAZF,EAAqB,UAAY,GAC/CG,EAA4B,SAAbF,EAAsB,WAAa,GAClDG,EAAU,kBAAoB3yB,G9CoCrC,SAAkBqJ,GACjBupB,IACA/nB,EADA+nB,EAAO,EAGX,IAAKvpB,EACMupB,OAAAA,EAEX,IAAK/nB,EAAI,EAAGA,EAAIxB,EAAIxH,OAAQgJ,IAEhB+nB,GAAAA,GAAQ,GAAKA,EADfvpB,EAAIwpB,WAAWhoB,GAEb+nB,GAAA,EAEZ,MAAO,MAAQA,CACnB,C8CjDkDE,CAAS1J,IAEnDpmB,KAAKe,UAAY,8BACEzD,yBAA4BqyB,kBAAwBvJ,KAAQiJ,MAAoBI,KAAeC,wCAC/EC,wBAEvBzxB,GACA,kBAAkBA,sDAIlB2B,GACA,6CAA6CA,kDAI7CuvB,GACA,0BACgB,SAAZE,EAAqB,UAAY,oCACHF,2GAGmBhJ,MAASA,2CAI1EpmB,KAAK+uB,SAAW/uB,KAAK+vB,qBAAqB,SAAS,EACvD,CAEA3H,wBAAAA,CAAyBlsB,EAAMgZ,EAAG8a,GACzBhwB,KAAK+uB,WAIG,aAAT7yB,EACA8D,KAAK+uB,SAASS,SAAwB,SAAbQ,EACT,YAAT9zB,IACP8D,KAAK+uB,SAASQ,QAAuB,SAAbS,GAEhC,ECtGG,SAASC,GAA0BtrB,EAAMurB,GACtCC,MAAAA,EAASxrB,EAAKe,WAGpB,GAAIyqB,IAFS/3B,SAAS23B,qBAAqB,QAAQ,GAG/C,OAGJ,MAAMK,EAAWD,EAAOE,SACxB,IAAA,MAAWC,KAAWF,EACdE,IAAY3rB,IACZurB,EACMI,EAAQ1vB,aAAa,cAAesvB,GACpCI,EAAQC,gBAAgB,gBAGtCN,GAA0BE,EAAQD,EACtC,CAEO,SAASM,GAAQh4B,EAAG2yB,EAAIsF,GACtBtF,EAAGuF,SAASl4B,EAAEsR,QAOfqhB,EAAGwF,YAAcn4B,EAAEsR,OANfqhB,EAAGwF,cAAgBxF,EAAGyF,eACtBH,EAAOtF,EAAG0F,cAAcC,QAAU3F,EAAGyF,eAAeE,QAEpDL,EAAOtF,EAAGyF,eAAeE,QAAU3F,EAAG0F,cAAcC,OAKhE,CAEO,SAASC,GAAyB5F,GAC/B6F,MAAAA,EAAY7F,EAAG1K,iBAAiB,2DACtC0K,EAAGyF,eAAiBI,EAAU,GAC9B7F,EAAG0F,cAAgBG,EAAUA,EAAUnyB,OAAS,GAChDssB,EAAGwF,YAAcxF,EAAGyF,cACxB,CDqEA3vB,eAAeC,IAAI,YAAcD,eAAeE,OAAO,UAAW2tB,IE/FlE,MAAMmC,WAAiBnxB,YACnBuB,WAAAA,GACIyC,QACA9D,KAAKkxB,QAAS,EACdlxB,KAAKS,SAAW,KAChBT,KAAKmxB,cAAgB,KACrBnxB,KAAKoxB,eAAiBpxB,KAAKoxB,eAAehvB,KAAKpC,KACnD,CAEAD,iBAAAA,GACSnJ,KAAAA,MAAQP,EAAY2J,KAAK1J,YAC9B0J,KAAKa,UAAUC,IAAI,eACnBd,KAAKC,QACT,CAEAA,MAAAA,GACID,KAAKmxB,cAAgB,KACf,MAAE7wB,MAAAA,EAAQ,GAAI+wB,eAAAA,GAAmBrxB,KAAKpJ,MACxC,IAAEmb,QAAAA,EAAU,GAAIuf,WAAAA,EAAYC,aAAAA,GAAiBvxB,KAAKpJ,MAGtDmb,EAAUA,EAAQrV,KAAI6V,IAClB,MAAMmM,EAAU,IAAKnM,GACrBmM,OAAAA,EAAQ6Q,QAAU7Q,EAAQ6Q,SAAW7Q,EAAQje,SAEtCie,CAAAA,IAGX1e,KAAKqgB,cAELrgB,KAAKe,UAAY,+IAIQf,KAAKkxB,wCACR5wB,KAASyR,GAAW/R,KAAKwxB,sCAClB,KAAnBH,EAAwB,qBAAqBA,KAAoB,iFACR/wB,2GAErDgxB,EAAa,SAASA,KAAgB,kCAC/Bvf,GAAW/R,KAAKwxB,0HAGAD,EAAe,OAAOA,KAAkB,gGAG3Dxf,GAAWA,EAAQlT,OAAS,GAAKmB,KAAKyxB,mGAKxDzxB,KAAKmxB,cAAgBnxB,KAAKuM,cAAc,wBACxCvM,KAAK0xB,mBAAqB1xB,KAAKuM,cAAc,+BAC7CvM,KAAK2xB,aAAe3xB,KAAKuM,cAAc,4BACvCvM,KAAK4xB,eAAiB5xB,KAAKuM,cAAc,8BACpCvM,KAAKS,WACNT,KAAKS,SAAWsR,EAAQ,IAE5Bgf,GAAyB/wB,KAAK2xB,cAC9B3xB,KAAKkd,WACT,CAGAuU,aAAAA,GACU,MACFnxB,MAAAA,EACAuxB,uBAAAA,EACAC,sBAAAA,EACAC,YAAAA,EACAhgB,QAAAA,EAAU,IACV/R,KAAKpJ,MACFmb,OAAAA,EACFrV,KAAI6V,GACM,uEAEYA,EAAOvV,oDACIuV,EAAOjS,0CACpBqL,EAAe/E,GAAGI,OAAS,cAAgB,8FAEtC1G,EAAQ,IAAMiS,EAAOjS,0CAC1BiS,EAAOvV,IAAMuV,EAAOjS,kDACZiS,EAAOgd,qCACtBhd,EAAOlS,KAAO,cAAckS,EAAOlS,QAAU,+BAE3CkS,EAAOgd,aAC0BnsB,IAA3ByuB,GACA,qBAAqBA,UACKzuB,IAA1B0uB,GACA,qBAAqBA,8BAEjCC,GAAe,kBAAkBA,mBAA6Bxf,EAAOjS,gEAI9E+B,KAAK,GACd,CAGAmvB,cAAAA,GACU,MAAEzf,QAAAA,EAAU,IAAO/R,KAAKpJ,MAI9B,MAAO,GAHemb,EAAQvb,MAC1B+b,IAA6B,IAAnBA,EAAOgd,UAAwC,IAApBhd,EAAO9R,YAEvBH,OAASyR,EAAQ,IAAIzR,OAClD,CAEA4c,SAAAA,GACSiJ,KAAAA,iBAAmBnmB,KAAKI,YAAYgC,KAAKpC,MAC9CA,KAAKgyB,sBAAwBhyB,KAAKiyB,iBAAiB7vB,KAAKpC,MACxDA,KAAKkyB,uBAAyBlyB,KAAKmyB,kBAAkB/vB,KAAKpC,MAC1DA,KAAKoyB,WAAapyB,KAAK8wB,MAAM1uB,KAAKpC,MAClCA,KAAKqyB,aAAeryB,KAAKwwB,QAAQpuB,KAAKpC,MACtCA,KAAKsyB,YAActyB,KAAKuyB,OAAOnwB,KAAKpC,MAEpCA,KAAKmxB,cAAchxB,iBAAiB,QAASH,KAAKmmB,kBAClDnmB,KAAKygB,iBAAiB,6BAA6B7a,SAAQqU,IACvDA,EAAK9Z,iBAAiB,QAASH,KAAKgyB,sBAAqB,IAE7DhyB,KAAK2xB,aAAaxxB,iBAAiB,QAASH,KAAKkyB,wBACjDr6B,OAAOsI,iBAAiB,QAASH,KAAKoxB,eAC1C,CAEA/Q,WAAAA,GACSrgB,KAAKmxB,gBAGVnxB,KAAKmxB,cAAc3Z,oBAAoB,QAASxX,KAAKmmB,kBACrDnmB,KAAKygB,iBAAiB,6BAA6B7a,SAAQqU,IACvDA,EAAKzC,oBAAoB,QAASxX,KAAKgyB,sBAAqB,IAEhEhyB,KAAK2xB,aAAana,oBAAoB,QAASxX,KAAKkyB,wBACpDr6B,OAAO2f,oBAAoB,QAASxX,KAAKoxB,gBACzCh5B,SAASof,oBAAoB1e,EAAsBkH,KAAKsyB,aAC5D,CAEAlyB,WAAAA,GACSoyB,KAAAA,gBAAgBxyB,KAAKkxB,OAC9B,CAEAiB,iBAAAA,GACInyB,KAAKwyB,gBAAe,EACxB,CAEApB,cAAAA,CAAe54B,GACPwH,KAAKkxB,SAAWlxB,KAAK0wB,SAASl4B,EAAEsR,SAChC9J,KAAKwyB,gBAAe,EAE5B,CAEAP,gBAAAA,CAAiBz5B,GACbwH,KAAKkxB,QAAS,EAGVlxB,KAAK4xB,gBACL5xB,KAAK4xB,eAAehxB,aAAa,gBAAiB,SAetDZ,KAAK4xB,eAAiBp5B,EAAEsR,OACxB9J,KAAK4xB,eAAehxB,aAAa,gBAAiB,QAGlDZ,KAAKpJ,MAAMmb,QAAU/R,KAAKpJ,MAAMmb,QAAQrV,KAAI6V,IAAW,IAAKA,EAAQgd,SAAS,MAGvEkD,MAAAA,EAAmBzyB,KAAK4xB,eAAec,QAAQ11B,GAGrDgD,KAAKS,SAAWT,KAAKpJ,MAAMmb,QAAQvb,MAAK+b,GAAUA,EAAOvV,KAAOy1B,IAE3DzyB,KAAKS,WAENT,KAAKS,SAAWT,KAAKpJ,MAAMmb,QAAQ,IAGvC/R,KAAKS,SAAS8uB,SAAU,EACxB/2B,EAAEsR,OAAOihB,QAAQ,gBAAgBlqB,UAAUC,IAAI,0BAE/Cd,KAAK2yB,WAEL3yB,KAAKwyB,gBAAe,GAEpB/6B,EAAc,CACVC,UAAWsB,EACXrB,KAAM,CAAEoa,QAAS/R,KAAKpJ,MAAMmb,QAAStR,SAAUT,KAAKS,UACpD7I,QAASoI,MAEjB,CAEA2yB,QAAAA,GACU,MAAEryB,MAAAA,EAAOuxB,uBAAAA,EAAwBC,sBAAAA,GAA0B9xB,KAAKpJ,MACjE86B,KAAAA,mBAAmB9wB,aAAa,QAASZ,KAAK4xB,eAAec,QAAQE,eAC1E5yB,KAAKmxB,cAAcvwB,aAAa,aAAcN,EAAQ,IAAMN,KAAKwxB,kBACjExxB,KAAK2xB,aAAalR,iBAAiB,UAAU7a,SAAQqU,IACjDA,EAAKrZ,aAAa,mBAAoBkxB,EAAqB,IAE/D9xB,KAAK4xB,eAAehxB,aAAa,mBAAoBixB,EACzD,CAEAgB,WAAAA,CAAY5zB,EAAO6zB,GAAiB,GAC1B,MAAE/gB,QAAAA,EAAU,IAAO/R,KAAKpJ,MACxBm8B,EAAchhB,EAAQvb,MAAK+b,GAAUA,EAAOtT,QAAUA,IACxD8zB,IACA/yB,KAAKS,SAAS8uB,SAAU,EACxBvvB,KAAKS,SAAWsyB,EAChB/yB,KAAKS,SAAS8uB,SAAU,GAGxBvvB,KAAK4xB,gBACL5xB,KAAK4xB,eAAehxB,aAAa,gBAAiB,SAGtDZ,KAAK2xB,aAAalR,iBAAiB,UAAU7a,SAAQqU,IAC7CA,EAAKhb,QAAUe,KAAKS,SAASH,QAC7BN,KAAK4xB,eAAiB3X,EACtBja,KAAK4xB,eAAehxB,aAAa,gBAAiB,QAAM,IAIhEZ,KAAKa,UAAUC,IAAI,0BAEfd,KAAK4xB,gBACL5xB,KAAK2yB,WAGLG,GACAr7B,EAAc,CACVC,UAAWsB,EACXrB,KAAM,CAAEoa,QAAAA,EAAStR,SAAUT,KAAKS,UAChC7I,QAASoI,MAGrB,CAEAwyB,cAAAA,CAAevzB,GACXA,EAAQe,KAAKgzB,OAAShzB,KAAK+V,QAC3B/V,KAAKkxB,QAAUlxB,KAAKkxB,OAGpBlxB,KAAKizB,kBACLjzB,KAAKmxB,cAAcvwB,aAAa,gBAAiBZ,KAAKkxB,OAC1D,CAEA+B,eAAAA,GAEStB,KAAAA,aAAa/wB,aAAa,aAAcZ,KAAKkxB,QAElDjB,GAA0BjwB,KAAK2xB,aAAc3xB,KAAKkxB,OACtD,CAEA8B,IAAAA,GAGSrB,KAAAA,aAAaxxB,iBAAiB,gBAAiBH,KAAKoyB,YACzDh6B,SAAS+H,iBAAiB,UAAWH,KAAKqyB,cAC1Cj6B,SAAS+H,iBAAiBrH,EAAsBkH,KAAKsyB,aACrDtyB,KAAKmxB,cAActwB,UAAUC,IAAI,UACjCd,KAAKkzB,cAAgB96B,SAAS+6B,aAClC,CAEApd,KAAAA,GAGI/V,KAAK2xB,aAAaxxB,iBAAiB,gBAAiBH,KAAKoyB,YACzDh6B,SAASof,oBAAoB,UAAWxX,KAAKqyB,cAC7Cj6B,SAASof,oBAAoB1e,EAAsBkH,KAAKsyB,aACxDtyB,KAAKmxB,cAActwB,UAAU0W,OAAO,UACpCvX,KAAKmxB,cAAcvwB,aAAa,iBAAiB,EACrD,CAEAkwB,KAAAA,GACSa,KAAAA,aAAana,oBAAoB,gBAAiBxX,KAAKoyB,YACxDpyB,KAAKkxB,QAAUlxB,KAAK4xB,gBACpB5xB,KAAK4xB,eAAed,QACpB9wB,KAAK2xB,aAAahB,YAAc3wB,KAAK4xB,gBAErC5xB,KAAKmxB,cAAcL,OAE3B,CAEAN,OAAAA,CAAQh4B,GAEJg4B,GAAQh4B,EAAGwH,KAAK2xB,cAAclB,EAClC,CAEA8B,MAAAA,CAAO/5B,GACH,OAAQA,EAAE+F,KACN,IAAK,SACDyB,KAAKwyB,gBAAe,GACpB,MACJ,IAAK,UACDh6B,EAAE4nB,iBACFpgB,KAAKozB,aACL,MACJ,IAAK,YACD56B,EAAE4nB,iBACFpgB,KAAKqzB,aACL,MACJ,IAAK,OACL,IAAK,SACD76B,EAAE4nB,iBACFpgB,KAAKszB,cACL,MACJ,IAAK,MACL,IAAK,WACD96B,EAAE4nB,iBACFpgB,KAAKuzB,aAKjB,CAEAH,UAAAA,GACI,GAAIpzB,KAAK2xB,aAAahB,cAAgB3wB,KAAK2xB,aAAaf,eAAgB,CAC9D4C,MAAAA,EAAcxzB,KAAK2xB,aAAahB,YAAY8C,uBAClDD,EAAY1C,QACZ9wB,KAAK2xB,aAAahB,YAAc6C,CACpC,CACJ,CAEAH,UAAAA,GACI,GAAIrzB,KAAK2xB,aAAahB,cAAgB3wB,KAAK2xB,aAAad,cAAe,CAC7D6C,MAAAA,EAAc1zB,KAAK2xB,aAAahB,YAAYgD,mBAClDD,EAAY5C,QACZ9wB,KAAK2xB,aAAahB,YAAc+C,CACpC,CACJ,CAEAJ,WAAAA,GACQtzB,KAAK2xB,aAAahB,cAAgB3wB,KAAK2xB,aAAaf,iBACpD5wB,KAAK2xB,aAAaf,eAAeE,QACjC9wB,KAAK2xB,aAAahB,YAAc3wB,KAAK2xB,aAAaf,eAE1D,CAEA2C,UAAAA,GACQvzB,KAAK2xB,aAAahB,cAAgB3wB,KAAK2xB,aAAad,gBACpD7wB,KAAK2xB,aAAad,cAAcC,QAChC9wB,KAAK2xB,aAAahB,YAAc3wB,KAAK2xB,aAAad,cAE1D,CAEApqB,oBAAAA,GACIzG,KAAKqgB,aACT,EAGJpf,eAAeC,IAAI,gBAAkBD,eAAeE,OAAO,cAAe8vB,ICjW1E,MAAM2C,WAAwBlH,GAC1BrrB,WAAAA,CAAYwD,EAAMtO,EAAMkD,EAAUo6B,EAAOjmB,GACrC9J,MAAMe,GACN7E,KAAK6E,KAAOA,EACZ7E,KAAKzJ,KAAOA,EACZyJ,KAAKvG,SAAWA,EAChBuG,KAAK6zB,MAAQA,EACb7zB,KAAK4N,SAAWA,CACpB,CAEA,cAAMwf,GAEF,MAAM0G,EACF9zB,KAAK6E,KAAKkmB,QAAQ,6BAA6BvL,aAAa,4BAC5D,EACED,EACFvf,KAAK6E,KAAKkmB,QAAQ,wBAAwBvL,aAAa,sBAAwB,EAC7E3E,EAAO7a,KAAK6E,KAAKkmB,QAAQ,oBAAoBvL,aAAa,kBAAoB,GAE/D,SAAjBsU,SACMlZ,GAAkB2E,EAAc1E,EAAM7a,KAAKzJ,KAAKyG,GAE9D,CAEA,oBAAM+2B,CAAe5iB,GACjB,aAActZ,OAAOm8B,cAAcz9B,KAAK09B,cAAcC,cAActjB,WAAWpa,MAC3Eqa,GAAYA,EAAS7T,KAAOmU,GAEpC,CAEA,8BAAMgjB,CAAyB15B,GAC3B,MAAMX,EAAiC,kBAUjC8W,EAAa,IACXnW,EAAY25B,UAAY,MACxB35B,EAAY45B,SAAW,MACvB55B,EAAY65B,QAAU,MACtB75B,EAAYE,cAAgB,IAepC,aAZ4B8B,QAAQ1F,IAChC6Z,EAAWlU,KAAI1C,MAAMmX,IACjB,MAAMojB,QAAqBv0B,KAAK+zB,eAAe5iB,GAE3C,OAACojB,GApBgBpjB,CAAAA,QACzBA,EAAWtW,QAAQf,GAmBM06B,CAAqBrjB,GAjBxBA,CAAAA,GACtBA,EAAW5H,OACP4H,EAAWtW,QAAQf,GACfA,IAeOU,CAAkB2W,GAGtBojB,EAAar4B,IAAAA,MAIPmG,KAAK,IAC9B,CAEA,mBAAMoyB,CAAch6B,GACXA,OAAAA,EAID5C,OAAOm8B,WACAh0B,KAAKm0B,yBAAyB15B,GAGlCgC,QAAQ1F,IACX0D,EAAY+B,gBAAgBE,KAAIg4B,GAC5B78B,OAAOoC,KAAKI,UAAUuC,YAAY83B,MAExCjW,MAAK7N,IACH,MAAM2J,EAAc,GACpB,IAAA,MAAW1J,KAAYD,EAAY,CAC/B,MAAMrQ,EAAOsQ,EAAStQ,KACtB,IAAKA,EACD,SAGCA,EAAK1F,QAAQ,eACb0F,EAAK1F,QAAQ,aACb0F,EAAK1F,QAAQ,uBACb0F,EAAK1F,QAAQ,yBACb0F,EAAK1F,QAAQ,oBACb0F,EAAK1F,QAAQ,2BACb0F,EAAK1F,QAAQ,0BAEd0f,EAAYhX,KAAKsN,EAAS3U,KAAK8I,cAEvC,CACOuV,OAAAA,EAAYlY,KAAK,IAAG,IA9BpB,EAgCf,CAEAsyB,qBAAAA,CAAsBl6B,EAAa8f,GAC3B1J,IAAAA,EACqB,YAArBpW,EAAY6C,KACZuT,EAAW,WACiB,cAArBpW,EAAY6C,KACnBuT,EAAW,cACiB,YAArBpW,EAAY6C,OACnBuT,EAAW,YAGf,IAAI2J,EAAc,KACd/f,EAAYE,eACZ6f,EAAc/f,EAAYE,aACrB+B,KAAI2b,GjDnHLuc,SAAWC,EAAI,IAC3B,OAAOA,EAAE,GAAGC,cAAgBD,EAAEpxB,MAAM,EACxC,CiDiHmCmxB,CAAWvc,EAAW6B,MAAM,KAAK,MACnD7X,KAAK,QAGd,IAAI0yB,EAAe,GACkB,MAAjCt6B,EAAYu6B,oBACZD,EAAet6B,EAAYu6B,kBAAkB3yB,KAAK,MAGtD,MAAM4yB,EAA0B,CAC5Bta,MAAO,YACP9J,SAAAA,EACAqkB,YAAa,QACb9a,YAAa,QACbC,YAAa5f,EAAYwZ,SACzBqG,YAAahT,EAAU7M,EAAYyB,MAAM,GAAGiJ,YAC5CoV,YAAAA,EACAC,YAAAA,EACAC,YAAaza,KAAKlF,UAAUL,GAAe,UAAY,SACvDs6B,aAAAA,EACA/3B,GAAIvC,EAAY8Z,gBAChBrY,KAAMoL,EAAU7M,EAAY0d,mBAAmB,GAAGhT,YAClDlI,MAAOxC,EAAYwC,OAEvB,OAAI+C,KAAK6zB,QACLoB,EAAwBpa,KAAO7a,KAAK6zB,OAEpC7zB,KAAK4N,WACLqnB,EAAwBrnB,SAAWhP,SAASoB,KAAK4N,WAE9CqnB,CACX,CAKAn6B,SAAAA,CAAUL,GACN,IAAIkN,EAAuC,IAA9BlN,EAAYO,eAAuBP,EAAYU,aAAe,EAE3E,OAAIV,EAAYkD,QACZgK,EAASlN,EAAYkD,QACdlD,EAAYO,cAAgB,GAAkC,IAA7BP,EAAYU,eACpDwM,GAAS,GAGNA,CACX,EC3KJ,MAAMwtB,GAAN,MAAMA,UAAkBr1B,YAGpBC,iBAAAA,GACIC,KAAK5F,KAAO4F,KAAKwf,aAAa,QAAU,IAAIvU,OAC5CjL,KAAK6zB,MAAQ7zB,KAAKwf,aAAa,SAC/Bxf,KAAK4N,SAAW5N,KAAKwf,aAAa,YAClCxf,KAAKjD,SAAWiD,KAAKwf,aAAa,YAAc,IAAIvU,OACpDjL,KAAKiO,WAAajO,KAAKwf,aAAa,eAAiB,QACrDxf,KAAK6N,aAAe7N,KAAKwf,aAAa,iBAAmB,UACzDxf,KAAKo1B,UAAY,YAAYD,EAAUE,mBACvCr1B,KAAKgO,gBAAkBhO,KAAKwf,aAAa,qBAAsB,EAE/Dxf,KAAKC,SAEAD,KAAKs1B,uBAIVz9B,OAAOoC,KACFs7B,YACA9W,MAAK,KACFze,KAAKw1B,YAAU,IAElB7W,OAAMnmB,GAAKlB,QAAQD,MAAMmB,KAEzBwH,KAAKgO,iBACNhO,KAAKstB,WACA7O,MAAK,SACLE,OAAMnmB,GAAKlB,QAAQD,MAAMmB,KAEtC,CAEAyH,MAAAA,GACSc,KAAAA,UAAY,iCAAiCf,KAAKo1B,yLAK3D,CAEAE,kBAAAA,GACW,QAAEz9B,OAAOoC,IACpB,CAEAu7B,UAAAA,GACI,IAAKp9B,SAASq9B,eAAez1B,KAAKo1B,WAC9B,OAGJ,MAAMnnB,EAAajO,KAAKiO,WAExBpW,OAAO69B,GAAK79B,OAAO69B,IAAM,GACzB79B,OAAO69B,GAAGnyB,KAAK,CACXvG,GAAIgD,KAAKo1B,UACTO,OAAQ,iBACR1B,cAAe,CAAEr9B,MAAO,CAAEg/B,UAAW51B,KAAKjD,QAASkR,WAAAA,IACnDkL,cAAe,CAAE0c,WAAW,IAEpC,CAEA,cAAMvI,GACE,IAACttB,KAAKs1B,qBACN,OAAO74B,QAAQ0lB,WD9DZ,SAAUtd,EAAMpK,EAAahB,EAAUo6B,EAAOjmB,GACzD,MAAM0f,EAAW,IAAIsG,GAAgB/uB,EAAMpK,EAAahB,EAAUo6B,EAAOjmB,EAS7E,CCyDQkoB,CAAgB91B,WAFGA,KAAK+1B,iBACPl+B,OAAOA,OAAOuB,OAAOC,KAAKC,WAAWC,UAAUC,IAAIA,IAAIC,SAClCuG,KAAK6zB,MAAO7zB,KAAK4N,SAC3D,CAEAooB,SAAAA,CAAU57B,GACN,WAAOA,EAAIS,QAAQ,SAAkB,KAAO,UAChD,CAEA,oBAAMk7B,GACF,IAAIE,EAAU,KACVp+B,GAAqB,MAArBA,OAAOm8B,aACPiC,QAAgBp+B,OAAOm8B,cAEvBiC,EAAS,CAEHC,MAAAA,EAAU,CADDl2B,KAAKg2B,UAAUh2B,KAAK5F,KACV,kBAAmB,KAAM,YAC9C+7B,IAAAA,EAAkB,EAClB5/B,EAAO,KAEX,MAAQA,GAAQ4/B,EAAkBD,EAAQr3B,OAAS,GAAG,CAC5CN,MAAAA,EAAM23B,EAAQC,GAEpB5/B,EAAO0/B,EAAQ1/B,KAAK09B,cAAcC,cAAcngB,SAASvd,MACrDsF,GAAWA,EAAQyC,KAASyB,KAAK5F,MAGrC+7B,GACJ,CAEO5/B,OAAAA,CACX,CAAA,GAAWyJ,KAAKs1B,qBACL,aAAMn7B,EAAW6F,KAAKjD,SAGjCzF,QAAQD,MAAM,4BAClB,GArGA++B,EADEjB,GACKE,mBAAmB,GAD9B,IAAMF,GAANkB,GAyGAp1B,eAAeC,IAAI,mBAAqBD,eAAeE,OAAO,iBAAkBg0B,ICpGhF,MAAMmB,GAAkB,uBAExB,MAAMC,WAAqBz2B,YACvBuB,WAAAA,GACIyC,QACA9D,KAAKw2B,kBAAoBx2B,KAAKy2B,aAAar0B,KAAKpC,MAChDA,KAAK02B,eAAiB12B,KAAK22B,UAAUv0B,KAAKpC,KAC9C,CAEAD,iBAAAA,GACSnJ,KAAAA,MAAQP,EAAY2J,KAAK1J,YAE9B0J,KAAKG,iBAAiBpH,EAAoBiH,KAAKw2B,mBAC/Cx2B,KAAKC,SAELD,KAAK42B,gBAAkB52B,KAAKygB,iBAAiB,6BACzCzgB,KAAK42B,iBACL52B,KAAK42B,gBAAgBhxB,SAAQqU,IACzBA,EAAK9Z,iBAAiB,QAASH,KAAK02B,eAAc,GAG9D,CAEAz2B,MAAAA,GACU,MAAE42B,WAAAA,EAAa,GAAIC,mBAAAA,EAAqB,IAAO92B,KAAKpJ,MAC1DoJ,KAAKa,UAAUC,IAAI,qBAEnBd,KAAKe,UAAY,0CACXf,KAAK+2B,kBAAkBF,mBACvB72B,KAAKg3B,kBAAkBF,qBAG7B92B,KAAKi3B,SAAWj3B,KAAKuM,cAAc,eACnCvM,KAAKk3B,iBAAmBl3B,KAAKuM,cAAc,yBAI3CvM,KAAKY,aAAa,cAAe,OACrC,CAEAm2B,iBAAAA,CAAkBI,GACd,GAAIxrB,EAAe/E,GAAGI,SAAWmwB,GAASA,EAAMt4B,QAAU,EAC/C,MAAA,GAGLtI,MAAAA,EAAO4gC,EAAMz6B,KAAIlE,IACnBA,EAAE+2B,QAAU/2B,EAAEiI,SACPjI,KAGJ,MAAA,qDAESyR,EAAsB,CAAE8nB,YAAa,kBAAmBhgB,QAASxb,6CAGrF,CAEAygC,iBAAAA,CAAkB9+B,GACR,MAAEk/B,4BAAAA,EAA8B,GAAIC,wBAAAA,EAA0B,IAAOr3B,KAAKpJ,MAEzE,MAAA,sDACc0/B,qDACkBc,gDACJC,2CACLntB,EAAWhS,iDAE7B8H,KAAKpJ,MAAM0gC,yBAA2B,8BAEtD,CAEAC,gBAAAA,GAGI,GAAIv3B,KAAKi3B,SAAU,CACTO,MAAAA,EAAgBx3B,KAAKi3B,SAAS/M,YAE9BuN,EADiBz3B,KAAKuM,cAAc,gBAAgB2d,YACXsN,EAE/Cx3B,KAAKk3B,iBAAiBtY,MAAM+M,YACxB,QACG8L,E7DuBY,G6DvBf,MAER,CACJ,CAEAhB,YAAAA,CAAaj+B,GACH,MAAEwE,GAAAA,GAAOzE,EAAUC,GACrBwE,IAAOs5B,KAGXt2B,KAAKu3B,mBACL/+B,EAAEsR,OAAO4tB,aACb,CAEAf,SAAAA,CAAU5+B,GACNA,EAAMqoB,iBAEN,MAAM/f,EAAOtI,EAAM4/B,cAAcnY,aAAa,aAC1Cnf,IACAxI,OAAO+/B,SAASC,KAAOx3B,GAG3B,MAAM8E,EAAcpN,EAAM4/B,cAAcnY,aAAa,SACrDxI,GAAY,CACRsB,YAAa,kBACbU,WAAY7T,GAEpB,CAEAsB,oBAAAA,GACS+Q,KAAAA,oBAAoBze,EAAoBiH,KAAKw2B,mBAE9Cx2B,KAAK42B,iBACL52B,KAAK42B,gBAAgBhxB,SAAQqU,IACzBA,EAAKzC,oBAAoB,QAASxX,KAAK02B,eAAc,GAGjE,EAGJz1B,eAAeC,IAAI,sBAAwBD,eAAeE,OAAO,oBAAqBo1B;;;;;;;;;ACtHtF,MAAMuB,GAAcA,CAACjgC,EAAoCO,EAAoB2/B,KACzE,GAAIlgC,EAAOmgC,eACP,OAEJngC,EAAOmgC,gBAAiB,EAef73B,EAAAA,iBAAiB,cAyJ1B,SAA0B3H,GACtB,MAAMsR,EAAStR,EAAEsR,OAEgC,SAA7CA,EAAO0V,aAAa,uBAId1V,EAAAA,EA3Gd,SAAwCqhB,GACpC,QAAe/nB,IAAX20B,GAAyBA,EAAOrH,SAASvF,GAK7C,IAFA8M,EAAiB,GACjBC,EAAkB,GACX/M,IAAO4M,GACKx0B,EAAAA,KAAK4nB,EAAGgN,WACP50B,EAAAA,KAAK4nB,EAAGiN,YACxBjN,EAAKA,EAAGzlB,UAEhB,CAiGI2yB,CAA+BC,GAE/BC,EAAWlX,KAAK8B,MACR3qB,EAAAA,EAAEggC,QAAQ,GAAGC,QACbjgC,EAAAA,EAAEggC,QAAQ,GAAGE,QACbC,EAAA,EACAC,EAAA,EACZ,IAxK0D,GACjDz4B,EAAAA,iBAAiB,aA8K1B,SAAyB3H,GACjB,IAACqgC,IAAUC,EACX,OAGAC,IAAAA,EAAMvgC,EAAEggC,QAAQ,GAAGC,QACnBO,EAAMxgC,EAAEggC,QAAQ,GAAGE,QAEvBC,EAAQE,EAAQE,EAChBH,EAAQE,EAAQE,CACpB,IAxLwD,GAC/C74B,EAAAA,iBAAiB,YAyE1B,SAAwB3H,GAEhB8/B,GAAAA,IAAY9/B,EAAEsR,OACd,OAIEmvB,MAAAA,EAAuC,IAArBphC,EAAO0rB,YACzB2V,EAAwC,GAApBrhC,EAAOgP,WAEjC,IAAIsyB,EACAC,EAAoBd,EAAU,uBAAwBW,GAEtDI,EACAD,EAAoBd,EAAU,uBAAwBY,GAEtDI,EAAeF,EAAoBd,EAAU,qBAAsB,KACnEiB,EAAWlY,KAAK8B,MAAQoV,EACxBiB,EAAY,GACZC,EAAiBjhC,EAAEihC,gBAAkBjhC,EAAEggC,SAAW,GAElD91B,GAAAA,KAAKghB,IAAIiV,GAAUj2B,KAAKghB,IAAIkV,GAExBl2B,KAAKghB,IAAIiV,GAAUU,GAA4BE,EAAWD,IACtDX,EAAS,EACLe,EAAqB,OAAQlhC,KACjBghC,EAAA,eAGZE,EAAqB,QAASlhC,KAClBghC,EAAA,iBAIjB92B,KAAKghB,IAAIkV,GAAUO,GAA0BI,EAAWD,IAC3DV,EAAS,EACLc,EAAqB,KAAMlhC,KACfghC,EAAA,aAGZE,EAAqB,OAAQlhC,KACjBghC,EAAA,gBAKN,KAAdA,EAAkB,CAClB,IAAI7hB,EAAY,CACZgiB,IAAKH,EAAUl/B,QAAQ,UAAW,IAClCs/B,UAAYH,EAAe,IAAsCG,WAAa,SAC9EC,OAAQhB,EACRiB,MAAOL,EAAe,IAAM,IAAIhB,UAAW,EAC3CsB,OAAQjB,EACRkB,MAAOP,EAAe,IAAM,IAAIf,UAAW,GAItCjhC,EAAAA,cACL,IAAIO,YAAY,SAAU,CAAEE,SAAS,EAAM+e,YAAY,EAAMhf,OAAQ0f,KAIhElgB,EAAAA,cACL,IAAIO,YAAYwhC,EAAW,CAAEthC,SAAS,EAAM+e,YAAY,EAAMhf,OAAQ0f,IAE9E,CAGQkhB,EAAA,KACAC,EAAA,KACGP,EAAA,IACf,IAhJsD,GAEtD,IAAIM,EAAuB,KACvBC,EAAuB,KACvBH,EAAuB,KACvBC,EAAuB,KACvBL,EAA0B,KAC1BD,EAA8B,KAG9BL,EAA2B,GAC3BC,EAA4B,GAOvBwB,SAAAA,EAAqB11B,EAA4CxL,GACtE,QAAe4K,IAAX20B,EACO,OAAA,EAGX,IAAI5M,EAAK3yB,EAAEsR,OACPnC,GAAS,EACTE,EAAI,EACDsjB,KAAAA,IAAO4M,GAAUpwB,GAAQ,CACxBsyB,GAAAA,EAAa9O,GACb,OAAQnnB,GACJ,IAAK,KACD2D,EAASswB,EAAepwB,KAAOsjB,EAAG+O,aAAe/O,EAAG1H,aACpD,MACJ,IAAK,OACQwU,EAAsB,IAAtBA,EAAepwB,GACxB,MACJ,IAAK,OACDF,EAASuwB,EAAgBrwB,KAAOsjB,EAAGgP,YAAchP,EAAGiP,YACpD,MACJ,IAAK,QACQlC,EAAuB,IAAvBA,EAAgBrwB,GACzB,MACJ,QACaF,GAAA,EAGrBwjB,EAAKA,EAAGzlB,WACRmC,GACJ,CACOF,OAAAA,CACX,CAeA,SAASsyB,EAAa9O,GAClB,OAAOA,EAAG+O,aAAe/O,EAAG1H,cAAgB0H,EAAGgP,YAAchP,EAAGiP,WACpE,CA8HShB,SAAAA,EAAoBjO,EAAiBkP,EAAgC17B,GAEnEwsB,KAAAA,GAAMA,IAAO/yB,EAASkiC,iBAAiB,CAC1C,IAAIC,EAAiBpP,EAAG3L,aAAagb,OAAOH,IAExCE,GAAAA,EACO37B,OAAAA,SAAS27B,EAAgB,IAGpCpP,EAAKA,EAAGzlB,UACZ,CAEO/G,OAAAA,CACX,GCjNW87B,GAvBF3kB,IACH4kB,MAAAA,EAAUtiC,SAASuI,cAAc,OACvC+5B,EAAQ75B,UAAUC,IAAI,cACtB45B,EAAQv6B,iBAAiB,SAAS,KAC9B1I,EAAc,CAAEC,UAAWkB,EAAmBjB,KAAM,CAAEqF,GAAI8Y,IAAY,IAE1E1d,SAASoO,KAAKV,YAAY40B,GAC1B1W,YAAW,KACP0W,EAAQ75B,UAAUC,IAAI,SAAQ,G/D0EV,E+DzET,EAcJ25B,GAXD1kB,KACV,IAAK3d,SAASuiC,uBAAuB,cAAc97B,OAC/C,OAEJ,MAAM67B,EAAUtiC,SAASuiC,uBAAuB,cAAc,GAC9DD,EAAQ75B,UAAU0W,OAAO,UACzByM,YAAW,KACP0W,EAAQnjB,QAAM,G/DkEG,K+DjET,ECHVqjB,GAAa,SACbC,GAAc,cAEpB,MAAMC,WAAch7B,YAChBuB,WAAAA,WAEIrB,KAAKpJ,MAAQ,GACboJ,KAAK+6B,UAAY,KACjB/6B,KAAKg7B,QAAU,KAEfh7B,KAAKi7B,UAAYj7B,KAAKgzB,KAAK5wB,KAAKpC,MAChCA,KAAKk7B,WAAal7B,KAAK+V,MAAM3T,KAAKpC,MAClCA,KAAKm7B,iBAAmBn7B,KAAKo7B,YAAYh5B,KAAKpC,MAC9CA,KAAKoyB,WAAapyB,KAAK8wB,MAAM1uB,KAAKpC,MAClCA,KAAKqyB,aAAeryB,KAAKwwB,QAAQpuB,KAAKpC,KAC1C,CAEAD,iBAAAA,GACIC,KAAK4e,MAAMC,QAAU,OACrB7e,KAAKpJ,MAAQP,EAAY2J,KAAK1J,YAEzB0J,KAAKhD,KACNgD,KAAKhD,GAAKgD,KAAKpJ,MAAMoG,KAGpBgD,KAAKmvB,UAAYnvB,KAAKomB,OACvBpmB,KAAKomB,KAAOpmB,KAAKe,WAGrBf,KAAK+6B,WAAY,EACjB/6B,KAAKg7B,SAAU,EACfh7B,KAAKC,QACT,CAEAmoB,wBAAAA,CAAyBlsB,EAAMm/B,EAAUrL,GAChCp5B,KAAAA,MAAQP,EAAY2J,KAAK1J,YAEjB,YAAT4F,IACA8D,KAAKpJ,MAAMu4B,QAAUa,EAE7B,CAEA,6BAAW9J,GACP,MAAO,CAAC,UACZ,CAEAzf,oBAAAA,GACSzG,KAAKs7B,UAGVt7B,KAAKqgB,aACT,CAEApgB,MAAAA,GACQD,KAAKs7B,UACLt7B,KAAKqgB,cAEH,MACFre,QAAAA,EAAU,GACVu5B,WAAAA,EAAa,GACbC,QAAAA,EAAU,YACV96B,KAAAA,EAAO,IACP+6B,YAAAA,EAAc,QACd9wB,MAAAA,EAAQ,GACRohB,UAAAA,EAAY,GACZ1gB,UAAAA,EAAY,SACZ8jB,QAAAA,EAAU,GACVuM,cAAAA,GAAgB/vB,EAAe/E,GAAGI,OAAS,cAAgB,YAC3D20B,WAAAA,EAAa,iBACb37B,KAAKpJ,MACHwvB,EAAO+I,GAAWnvB,KAAKomB,KAE7B,GAAa,KAATA,EACKlJ,OAAAA,KAAAA,YACLld,KAAKa,UAAU0W,OAAOqjB,IACtB56B,KAAKkxB,QAAS,GACP,EAEXlxB,KAAK47B,aAAaxV,GAClBpmB,KAAKY,aAAa,OAAQZ,KAAKg7B,QAAU,IAAMt6B,GAG/CV,KAAKY,aAAa,OAAQ,UAC1BZ,KAAKY,aAAa,cAAe,QACjCZ,KAAKY,aAAa,UAAW46B,GAC7Bx7B,KAAKY,aAAa,YAAayK,GAG/BrL,KAAKe,UAAY,kFAGK,UAAZy6B,EAAsB,uBAAyB,4FAExCC,oEAGLz5B,GACA,iDAEQA,GACA,WAAW25B,aAAsBD,MAAkB15B,2DAK3Du5B,GACA,uDACUA,GAAc,uBAAuBA,8HAM3C5wB,GACA,0DAA0DA,WAAeohB,aAAqBA,+DAEhG3F,8CAEJpmB,KAAKid,mDAETjd,KAAKg7B,SAAWrvB,EAAe/E,GAAGI,OAAS,mCAAqC,eAItFgd,YAAW,KACPhkB,KAAK4e,MAAMC,QAAU,SAAA,GACtB,KAGHkS,GAAyB/wB,MAEzBA,KAAKmxB,cAAgBnxB,KAAKuM,cAAc,UACxCvM,KAAKkd,WACT,CAEAD,YAAAA,GACU,MAAEjH,OAAAA,GAAWhW,KAAKpJ,MACjBilC,OlEvIU58B,EkEuIA+W,IlEvI8B,UAAV/W,EkEuIV,oBAAsB,GlEvIhCA,IAAAA,CkEwIrB,CAEA28B,YAAAA,CAAaxV,GACH0V,MAAAA,EAAS1jC,SAASuI,cAAc,OACtCm7B,EAAO/6B,UAAYqlB,EACY,IAA3B0V,EAAOzL,SAASxxB,QAA+C,aAA/Bi9B,EAAOzL,SAAS,GAAGtrB,UACnD/E,KAAKg7B,SAAU,EACfh7B,KAAKY,aAAa,QAAS,QAEnC,CAEAm7B,OAAAA,GACI3jC,SAAS23B,qBAAqB,QAAQ,GAAGlvB,UAAUC,IAAI+5B,IACvDJ,GAAaz6B,KAAKhD,GACtB,CAEAg/B,UAAAA,GAEwBh8B,KAAK0F,WAAWqlB,QAAQ,aAExC3yB,SAAS23B,qBAAqB,QAAQ,GAAGlvB,UAAU0W,OAAOsjB,IAE9DJ,IACJ,CAEAxH,eAAAA,GACIjzB,KAAK+6B,WAAa/6B,KAAK+6B,UAEvB/6B,KAAKY,aAAa,aAAcZ,KAAK+6B,WAErC9K,GAA0BjwB,KAAMA,KAAK+6B,UACzC,CAEA,UAAM/H,CAAKx6B,GACDT,MAAAA,EAAQQ,EAAUC,GACpBT,EAAMiF,KAAOgD,KAAKhD,KAKtBgD,KAAKG,iBAAiB,gBAAiBH,KAAKoyB,YAC5Ch6B,SAAS+H,iBAAiB,UAAWH,KAAKqyB,cAC1CryB,KAAKkzB,cAAgB96B,SAAS+6B,cAE9BnzB,KAAK+7B,UACL/7B,KAAKizB,kBACLjzB,KAAKY,aAAa,cAAe,SACjCZ,KAAKkxB,QAAUlxB,KAAKkxB,OAGpBz5B,EAAc,CACVC,UhE5LsB,6BgE6LtBC,KAAMI,UAGJ,IAAI0E,SAAQ0lB,IACd6B,YAAW,KACPhkB,KAAKa,UAAUC,IAAI85B,IACnBzY,MhElIS,IgEmID,IAEpB,CAEApM,KAAAA,CAAMhe,GACFA,GAAAA,EAAMkkC,cAAe,EACjBlkC,EAAM+oB,iBACN/oB,EAAM+oB,kBAIV9gB,KAAKG,iBAAiB,gBAAiBH,KAAKoyB,YAC5Ch6B,SAASof,oBAAoB,UAAWxX,KAAKqyB,cAC7CryB,KAAKg8B,aACDh8B,KAAKg7B,QAAS,CACRkB,MAAAA,EAAiBl8B,KAAK+qB,QAAQ,mBAChCmR,GACAA,EAAer7B,UAAU0W,OAAO,iBAExC,CACAvX,KAAKizB,kBACLjzB,KAAKY,aAAa,cAAe,QACjCZ,KAAKkxB,QAAUlxB,KAAKkxB,OACpBlxB,KAAKa,UAAU0W,OAAOqjB,IAEtBnjC,EAAc,CACVC,UAAWmB,EACXlB,KAAM,CAAEqF,GAAIgD,KAAKhD,KAEzB,CAEA8zB,KAAAA,GACI9wB,KAAKwX,oBAAoB,gBAAiBxX,KAAKoyB,YAC3CpyB,KAAKkxB,OACLlxB,KAAKmxB,cAAcL,QAEnB9wB,KAAKkzB,cAAcpC,OAE3B,CAEAN,OAAAA,CAAQh4B,GACJg4B,GAAQh4B,EAAGwH,MAAM,EACrB,CAEAo7B,WAAAA,CAAY5iC,GACM,WAAVA,EAAE+F,KAAoByB,KAAKkxB,QAC3BlxB,KAAK+V,MAAMvd,EAEnB,CAEA2jC,SAAAA,CAAU3jC,GACFwH,KAAKkxB,QACLlxB,KAAK+V,MAAMvd,EAEnB,CAEA4jC,2BAAAA,GACI3kC,EAAc,CACVC,UhE5OsB,6BgE6OtBC,KAAM,CAAEqF,GAAIgD,KAAKhD,KAEzB,CAEAkgB,SAAAA,GACIld,KAAKs7B,UAAW,EACM,MAAtBt7B,KAAKmxB,eAAyBnxB,KAAKmxB,cAAchxB,iBAAiB,QAASH,KAAKk7B,YAChFrjC,OAAOsI,iBAAiBxH,EAAkBqH,KAAKi7B,WAC/CpjC,OAAOsI,iBAAiBvH,EAAmBoH,KAAKk7B,YAChD9iC,SAAS+H,iBAAiBrH,EAAsBkH,KAAKm7B,kBAEjDxvB,EAAe/E,GAAGI,SAClB8wB,GAAYjgC,OAAQO,SAAU4H,MAC9BA,KAAKq8B,eAAiBr8B,KAAKm8B,UAAU/5B,KAAKpC,MAC1C5H,SAAS+H,iBAAiBlH,EAAmB+G,KAAKq8B,gBAC9Cr8B,KAAKg7B,UACLh7B,KAAKs8B,aAAet8B,KAAKuM,cAAc,iBACvCvM,KAAKu8B,iCAAmCv8B,KAAKo8B,4BAA4Bh6B,KAAKpC,MAC9EA,KAAKs8B,aAAan8B,iBAAiB,QAASH,KAAKu8B,mCAG7D,CAEAlc,WAAAA,GACSib,KAAAA,UAAW,EACM,MAAtBt7B,KAAKmxB,eACDnxB,KAAKmxB,cAAc3Z,oBAAoB,QAASxX,KAAKk7B,YACzDrjC,OAAO2f,oBAAoB7e,EAAkBqH,KAAKi7B,WAClDpjC,OAAO2f,oBAAoB5e,EAAmBoH,KAAKk7B,YACnD9iC,SAASof,oBAAoB1e,EAAsBkH,KAAKm7B,kBACpDn7B,KAAKq8B,iBACLjkC,SAASof,oBAAoBve,EAAmB+G,KAAKq8B,gBACrDr8B,KAAKq8B,eAAiB,MAEtBr8B,KAAKu8B,mCACLv8B,KAAKs8B,aAAa9kB,oBAAoB,QAASxX,KAAKu8B,kCACpDv8B,KAAKu8B,iCAAmC,KAEhD,EAGJt7B,eAAeC,IAAI,aAAeD,eAAeE,OAAO,WAAY25B,IC3TpE,MAAM0B,WAAkB18B,YACpBuB,WAAAA,WAEIrB,KAAKpJ,MAAQ,EACjB,CAEAmJ,iBAAAA,GACIC,KAAKpJ,MAAQP,EAAY2J,KAAK1J,YAC9B0J,KAAKC,QACT,CAEAA,MAAAA,GAGQ,IACAiQ,EACAmN,EACAlN,EACAmN,EACAhN,EACAiN,EACA/M,EACAgN,EACA/M,EACAgN,EACAlN,EACAmN,GAZE1Z,UAAAA,EAAY,MAAO2Z,MAAAA,GAAU3d,KAAKpJ,MAcnCiK,KAAAA,UAAUC,IACX,IAAiB,WAAdkD,EAAyB,mBAAqB,aAAeA,IAGpE,IAAIy4B,EAAa,GACJ,MAAT9e,GACAzN,EAAalQ,KAAKpJ,OAAOsZ,WACzBmN,EAAiBrd,KAAKpJ,OAAOymB,eAC7BlN,EAAanQ,KAAKpJ,OAAOuZ,WACzBmN,EAActd,KAAKpJ,OAAO0mB,YAC1BhN,EAAmBtQ,KAAKpJ,OAAO0Z,iBAC/BiN,EAAkBvd,KAAKpJ,OAAO2mB,gBAC9B/M,EAAgBxQ,KAAKpJ,OAAO4Z,cAC5BgN,EAAiBxd,KAAKpJ,OAAO4mB,eAC7B/M,EAAiBzQ,KAAKpJ,OAAO6Z,eAC7BgN,EAAkBzd,KAAKpJ,OAAO6mB,gBAC9BlN,EAAyBvQ,KAAKpJ,OAAO2Z,uBACrCmN,EAA8B1d,KAAKpJ,OAAO8mB,kCAClBta,IAAjBua,EAAM9e,QAEbqR,EAAayN,GAAOzN,WACpBmN,EAAiBM,GAAON,eACxBlN,EAAawN,GAAOxN,WACpBmN,EAAcK,GAAOL,YACrBhN,EAAmBqN,GAAOrN,iBAC1BiN,EAAkBI,GAAOJ,gBACzB/M,EAAgBmN,GAAOnN,cACvBgN,EAAiBG,GAAOH,eACxB/M,EAAiBkN,GAAOlN,eACxBgN,EAAkBE,GAAOF,gBACzBlN,EAAyBoN,GAAOpN,uBAChCmN,EAA8BC,GAAOD,6BAC9BC,EAAM9e,SACb49B,EAAa,IAAI9e,IAIpB,CACG,CAACzN,EAAY,aAAcmN,EAAgBof,GAC3C,CAACtsB,EAAY,aAAcmN,EAAamf,GACxC,CAACnsB,EAAkB,mBAAoBiN,EAAiBkf,GACxD,CAACjsB,EAAe,gBAAiBgN,EAAgBif,GACjD,CAAChsB,EAAgB,iBAAkBgN,EAAiBgf,GACpD,CACIlsB,EACA,yBACAmN,EACA+e,IAEN72B,SAAQ82B,GAAS18B,KAAK28B,WAAWC,MAAM58B,KAAM08B,KAE/C18B,KAAKe,UAAY07B,EACZ//B,KAAImgC,GAAQ,aAAa5sB,GAAa4sB,EAAK3gC,eAAe2gC,EAAKC,yBAC/Dz6B,KAAK,GACd,CAEAs6B,UAAAA,CAAWD,EAAOxgC,EAAM4gC,EAAKjiB,GACnB6hB,IAAU18B,KAAK+8B,QAAQliB,EAAM3e,IAC/B2e,EAAKtX,KAAK,CAAErH,KAAAA,EAAM4gC,IAAAA,GAE1B,CAEAC,OAAAA,CAAQC,EAAWC,GACf,OAAOD,EAAUvuB,MAAKouB,GAAQA,EAAK3gC,OAAS+gC,GAChD,EAGJh8B,eAAeC,IAAI,kBAAoBD,eAAeE,OAAO,gBAAiBq7B,IClGvE,MAEMU,GAAkB,sBAElBC,GAAO,kBACPC,GAAO,iBAKPC,GACN,UCPP,IAAAC,GAAA,MASIj8B,WAAAA,CAAYzJ,EAASma,EAAU,IAC3B,OAAA/R,KAAKu9B,eAAiBv9B,KAAKw9B,YAAYp7B,KAAKpC,MAC5CA,KAAKy9B,eAAiBz9B,KAAK09B,YAAYt7B,KAAKpC,MAC5CA,KAAK02B,eAAiB12B,KAAK29B,YAAYv7B,KAAKpC,MAC5CA,KAAK49B,cAAgB59B,KAAK69B,WAAWz7B,KAAKpC,MAC1CA,KAAK89B,kBAAkD,SAA9B/rB,EAAQ+rB,oBAAgC,EACjE99B,KAAK+9B,eAAiB,KAEf,IAAIthC,SAAQ0lB,IACfniB,KAAKg+B,SAAWpmC,EAChBoI,KAAKi+B,QAAU,GAAGx6B,MAAM8B,KAAK3N,EAAQy4B,UACrCrwB,KAAKk+B,SAAW1/B,OAAOge,OACnB,CAAA,EACA,CACIxf,GAAI,OACJmhC,2BAA4B,EAC5BC,SAAS,EACTC,sBAAuB,GACvBC,kBAAkB,EAClBC,qBAAsB,IACtBC,aAAc,KAElBzsB,GAGJ/R,KAAKy+B,WACLtc,EAAQniB,MAGRgkB,YAAW,KACF0a,KAAAA,uBACL1+B,KAAK2+B,6BAA2B,GACjC,EAAC,GAEZ,CAKA,WAAI/mC,GACA,OAAOoI,KAAKg+B,QAChB,CAGAS,QAAAA,GACSG,KAAAA,MAAQ5+B,KAAKW,cAAc,MD1DpB,iBC2DZX,KAAK6+B,WAAa7+B,KAAKW,cAAc,KD1DpB,yBC2DjBX,KAAK8+B,aAAe,KACpB9+B,KAAK++B,wBAA0B,KAE3B/+B,KAAKg/B,iBACLh/B,KAAK++B,wBAA0B/+B,KAAKW,cAAc,MAAOs+B,KAG7Dj/B,KAAKk/B,YACLl/B,KAAK4+B,MAAM94B,YAAY9F,KAAK6+B,YAExB7+B,KAAK++B,yBACL/+B,KAAKg+B,SAASl4B,YAAY9F,KAAK++B,yBAInC/+B,KAAKg+B,SAASmB,aAAan/B,KAAK4+B,MAAO5+B,KAAKg+B,SAAS94B,WAAW,IAEhElF,KAAKo/B,iBACT,CAEAJ,YAAAA,GACQ5mC,QAAAA,SAASmU,cAAc,oBAG/B,CAEA2yB,SAAAA,GACI,MAAMzgC,EAAO,GACRw/B,KAAAA,QAAQvhC,KAAI2iC,IACPC,MAAAA,EAAS53B,EAAO,GAElB,GAAA1H,KAAKg/B,gBACDK,EAAMx+B,UAAU6vB,SAAS,sBACrB2O,EAAMhP,UACFgP,EAAMhP,SAASxxB,QACd,IAAIwgC,EAAMhP,UAAUzqB,SAAQ,CAACulB,EAAItjB,KACpB,IAANA,IACAsjB,EAAGvM,MAAMC,QAAU,QAGvBsM,EAAGnuB,GAAKyB,EAAKoJ,GAEb7H,KAAK++B,wBAAwBj5B,YAAYqlB,EAAE,IAIvDkU,EAAM9nB,WAIT8nB,EAAMx+B,UAAU6vB,SAAS,eAAgB,CAC1C,MAAMzW,EAAOja,KAAKW,cAAc,MD5G5B,4BC6GJsZ,EAAKnU,YAAYu5B,GACjBplB,EAAKrZ,aAAa,wBAAyB0+B,GAC3C7gC,EAAK8E,KAAK+7B,GAEVt/B,KAAK6+B,WAAW/4B,YAAYmU,EAChC,IAER,CAEAtZ,aAAAA,CAAc4+B,EAAKC,GACXC,IAAAA,EAAMrnC,SAASuI,cAAc4+B,GACjCE,OAAAA,EAAI7+B,aAAa,QAAS4+B,GACnBC,CACX,CAGAL,eAAAA,GACIp/B,KAAK0/B,SAAW,GAChB1/B,KAAK8+B,aAAe9+B,KAAKW,cAAc,MD5HpB,0BC6HnBX,KAAK6+B,WAAW/4B,YAAY9F,KAAK8+B,cAEjC9+B,KAAK0/B,SAAWr6B,MAAMs6B,KAAK3/B,KAAK6+B,WAAWpe,iBAAiB,cAE5DzgB,KAAK0/B,SAAS95B,SAAQhO,IAClBA,EAAQuI,iBAAiB,QAASH,KAAK02B,eAAc,IAGnDkJ,MAAAA,EAAiBxnC,SAASq9B,eAAe,GAAGwJ,MAAkBj/B,KAAKk+B,SAASlhC,MAC9E4iC,GACAA,EAAez/B,iBAAiB,QAASH,KAAKy9B,gBAG5CoC,MAAAA,EAAkBznC,SAASq9B,eAAe,GAAGwJ,MAAkBj/B,KAAKk+B,SAASlhC,MAC/E6iC,GACAA,EAAgB1/B,iBAAiB,QAASH,KAAKu9B,gBAG/Cv9B,KAAK4+B,OACL5+B,KAAK6+B,WAAW1+B,iBAAiB,WAAYH,KAAK49B,cAE1D,CAEAD,WAAAA,CAAYnlC,GACHsnC,KAAAA,YAAYtnC,EAAEm/B,cACvB,CAEAoI,SAAAA,CAAUl6B,GACN7F,KAAK8/B,YAAY9/B,KAAKi+B,QAAQp4B,GAClC,CAEAm6B,WAAAA,CAAYhjC,GACR,MAAMkgC,EAAkB9kC,SAASmU,cAAc,IAAI0yB,MAE/C/B,EAAgB7M,UACf,IAAI6M,EAAgB7M,UAAUzqB,SAAQulB,GAAOA,EAAGvM,MAAMC,QAAU,SAGrEzmB,SAASq9B,eAAez4B,GAAI4hB,MAAMC,QAAU,OAChD,CAEAihB,WAAAA,CAAYloC,GACJ,GAAAoI,KAAKg/B,eAAgB,CACrB,MAAMiB,EAAYroC,EACbmzB,QAAQ,2BACRvL,aAAa,yBAElBxf,KAAKggC,YAAYC,EACrB,CAKA,GAHAjgC,KAAKkgC,mBAAmBtoC,GACxBA,EAAQgJ,aAAa,eAAgB,SAEhChJ,IAAYoI,KAAK+9B,eAClB,OAGJ,IAAIoC,EAAW,EAEJx2B,IAAAA,MAAAA,KAAS3J,KAAK+9B,eAAgB,CACrC,GAAIp0B,EAAMG,OAAO0V,aAAa,eAAiB5nB,EAAQ4nB,aAAa,aAChE,MAEA2gB,EAAWA,EAAWx2B,EAAMy2B,mBAAmBnW,MD3LpB,EC6LnC,CAEKjqB,KAAK89B,mBACN99B,KAAK4+B,MAAMyB,OAAO,CAAEC,KAAMH,EAAUI,SAAU,UAEtD,CAEAL,kBAAAA,CAAmBtoC,GACV8nC,KAAAA,SAAS95B,SAAQulB,IACdA,IAAOvzB,GACPuzB,EAAGvqB,aAAa,eAAgB,QAAO,GAGnD,CAEA4/B,UAAAA,CAAW5oC,EAASoM,EAAWy8B,EAAON,EAAUtc,GAC5C7jB,KAAK0+B,uBAEL,IAAIF,EAAe,EACfkC,EAAaC,aAAY,WACP,SAAd38B,EACApM,EAAQwgC,YAAcvU,EAEtBjsB,EAAQwgC,YAAcvU,EAE1B2a,GAAgB3a,EACZ2a,GAAgB2B,GAChBtoC,OAAO+oC,cAAcF,EAE5B,GAAED,GACI,MAAA,CAAEC,WAAAA,EACb,CAEAhD,WAAAA,GACS8C,KAAAA,WAAWxgC,KAAK4+B,MAAO,OAAQ,GAAI5+B,KAAKk+B,SAASM,aAAc,IACpExa,YAAW,KACPhkB,KAAK0+B,sBAAoB,GDhON,ICkO3B,CAEAlB,WAAAA,GACSgD,KAAAA,WAAWxgC,KAAK4+B,MAAO,QAAS,GAAI5+B,KAAKk+B,SAASM,aAAc,IACrExa,YAAW,KACPhkB,KAAK0+B,sBAAoB,GDvON,ICyO3B,CAEAb,UAAAA,GACI79B,KAAK0+B,sBACT,CAEAC,2BAAAA,GACI,MAAMl+B,EAAWT,KAAK4+B,MAAMryB,cAAc,yBAGtC9L,GACAT,KAAK6gC,cAAcpgC,EAAU48B,GAErC,CAEAyD,iBAAAA,CAAkB3R,EAAS4R,GACvB,IAAIC,EAAmBD,EAAUje,wBAC7Bme,EAAwBv+B,KAAKqF,MAAMi5B,EAAiBE,OACpDC,EAAuBz+B,KAAKqF,MAAMi5B,EAAiBV,MAEnDc,EAAiBjS,EAAQrM,wBACzBue,EAAsB3+B,KAAKqF,MAAMq5B,EAAeF,OAChDI,EAAqB5+B,KAAKqF,MAAMq5B,EAAed,MAG/Ca,OAAAA,EAAuBG,GACvBL,EAAwBI,EAEjB,OACAC,EAAqBH,EACrB,OACAE,EAAsBJ,EACtB,QAEA,MAEf,CAEAJ,aAAAA,CAAc5mB,EAAMpa,GAChB,IAAKG,KAAK8+B,aACN,OAGJ,IAAIyC,EAAetnB,EAAK6I,wBACpBie,EAAY/gC,KAAK6+B,WAAW/b,wBAAwBwd,KACpDH,EAAWoB,EAAajB,KAAOS,EAEnC/gC,KAAK8+B,aAAalgB,MAAM4iB,UACpB,eACCrB,EAAWngC,KAAK6+B,WAAWzG,WD3RG,IC4R/B,cACyD,KAAxDmJ,EAAatX,MAAQwX,IACtB,IAEJzhC,KAAK4+B,MAAMxG,WAAa11B,KAAKqF,MACzBo4B,EAAWngC,KAAK6+B,WAAW/b,wBAAwBwd,KAAO,GAG1DzgC,IACAG,KAAK8+B,aAAalgB,MAAM8iB,gBAAkB7hC,EAElD,CAEA8hC,QAAAA,GACSjD,KAAAA,uBACL1+B,KAAK2+B,6BACT,CAEAiD,cAAAA,GAKI,GAJA5hC,KAAK0/B,SAAS95B,SAAQhO,IAClBA,EAAQ4f,oBAAoB,QAASxX,KAAK02B,eAAc,WAGjDt+B,SAAa,IAAa,CAC3BwnC,MAAAA,EAAiBxnC,SAASq9B,eAAe,GAAGwJ,MAAkBj/B,KAAKk+B,SAASlhC,MAC9E4iC,GACAA,EAAepoB,oBAAoB,QAASxX,KAAKy9B,gBAG/CoC,MAAAA,EAAkBznC,SAASq9B,eAAe,GAAGwJ,MAAkBj/B,KAAKk+B,SAASlhC,MAC/E6iC,GACAA,EAAgBroB,oBAAoB,QAASxX,KAAKu9B,eAE1D,CACJ,CAEAsE,IAAAA,GACI7hC,KAAK4hC,gBACT,CAEAlD,oBAAAA,GACI1+B,KAAKg+B,SAASp9B,aACV,mBACAZ,KAAK8gC,kBAAkB9gC,KAAK6+B,WAAY7+B,KAAK4+B,QAGjD5+B,KAAK+J,SACT,CAEAA,OAAAA,GACI,KAAM,yBAA0BlS,QACrB,OAAA,EAGXmI,KAAK+9B,eAAiB,GAGtB,MAAMpR,EAAW,IAAIljB,sBACjBC,IACI,IAAA,MAAWC,KAASD,EAChB1J,KAAK+9B,eAAex6B,KAAK,CACrBuG,OAAQH,EAAMG,OACdg4B,aACIn4B,EAAMy2B,mBAAmBc,OACrBrpC,OAAOgP,WD5VI,IC6Vf8C,EAAMy2B,mBAAmBE,MD7VV,GC8VnBF,mBAAoBz2B,EAAMy2B,qBAIlCzT,EAASoV,YAAU,GAEvB,CAAEC,KAAMhiC,KAAK6+B,aAGjB7+B,KAAKi+B,QAAQvhC,KAAI9E,GAAW+0B,EAAS5iB,QAAQnS,IACjD,CAEAqqC,YAAAA,CAAarqC,GACJ,QAAAoI,KAAK+9B,gBAII/9B,KAAK+9B,eAAevnC,MAAK0rC,GAActqC,IAAYsqC,EAAWp4B,SAE/Dg4B,YACjB,GCnXJ,MAAMK,WAAmBriC,YACrBuB,WAAAA,GACIyC,QACA9D,KAAKomB,KAAOpmB,KAAKe,UACjBf,KAAKs+B,kBAAmB,EACxBt+B,KAAK89B,mBAAoB,EACzB99B,KAAKq+B,sBAAwB,GAC7Br+B,KAAKu+B,qBAAuB,IAC5Bv+B,KAAKoiC,SAAW,KAChBpiC,KAAKqiC,WAAa,KAClBriC,KAAKsiC,cAAgBtiC,KAAK2hC,SAASv/B,KAAKpC,MACxCA,KAAKuiC,OAASviC,KAAKuiC,OAAOngC,KAAKpC,MAC/BA,KAAKwiC,kB1DkMGC,SAAYC,EAAsBC,EAAO,KACjDC,IAAAA,EACJ,OAAO,SAAU7qC,GACT6qC,GACA/qC,OAAOgrC,aAAaD,GAExBA,EAAQ/qC,OAAOmsB,WAAW0e,EAAMC,EAAM5qC,EAAK,CAEnD,C0D1MiC0qC,CAASziC,KAAKsiC,cAAe,IAC1D,CAEA,6BAAWpc,GACA,MAAA,CAAC,mBAAoB,wBAAyB,uBACzD,CAEAjmB,MAAAA,GACI,MAAM42B,EAAiD,SAApC72B,KAAKwf,aAAa,eAAkC,GACjE4X,EAA8Bp3B,KAAKwf,aAAa,gCAAkC,GAClF6X,EAA0Br3B,KAAKwf,aAAa,4BAA8B,GAEhFxf,KAAKe,UAAY,uCACWf,KAAKoiC,yCAAyCpiC,KAAKoiC,+BAEnEvL,GACA,8BAA8B72B,KAAKoiC,wSAMtBhL,mCAEfp3B,KAAKomB,yBAEHyQ,GACA,+BAA+B72B,KAAKoiC,0SAMvB/K,yDAEOr3B,KAAKoiC,8HAMrCpiC,KAAK8iC,YACT,CAEA/iC,iBAAAA,GACSqiC,KAAAA,SAAWpiC,KAAKwf,aAAa,UAC5Bxf,KAAKwf,aAAa,UAClB,cAAc9X,EAAO,KAC3B1H,KAAKs+B,iBAAmBt+B,KAAKwf,aAAa,qBAAuBxf,KAAKs+B,iBACtEt+B,KAAKq+B,sBACDr+B,KAAKwf,aAAa,0BAA4Bxf,KAAKq+B,sBACvDr+B,KAAKu+B,qBACDv+B,KAAKwf,aAAa,yBAA2Bxf,KAAKu+B,qBACtDv+B,KAAK89B,kBAAoB99B,KAAKwf,aAAa,wBAA0B,GAErExf,KAAKC,SACLpI,OAAOsI,iBAAiB,SAAUH,KAAKwiC,kBAC3C,CAEAM,UAAAA,GACI,IAAIzE,EAAwBr+B,KAAKq+B,sBAC7BE,EAAuBv+B,KAAKu+B,qBAE3B8D,KAAAA,WAAa,IAAIU,GAAc/iC,KAAKuM,cAAc,IAAMvM,KAAKoiC,UAAW,CACzEplC,GAAIgD,KAAKoiC,SACTv8B,MAAO7F,KAAK6F,MACZw4B,sBAAuBA,EACvBE,qBAAsBA,EACtBT,kBAAmB99B,KAAK89B,oBAG5B99B,KAAKqiC,WAAW5jB,MAAK,KACjBze,KAAKa,UAAUC,IAAI,WAEnBrJ,EAAc,CACVC,UAAWqB,EACXpB,KAAM,CAAE6nC,UAAWx/B,KAAKoiC,UACxBxqC,QAASoI,MACZ,IAI0B5H,SAASqoB,iBAAiB,6BAClC7a,SAAQ65B,IACrBuD,MAAAA,EAAK5qC,SAASuI,cAAc,MAElC,IADAqiC,EAAGniC,UAAUC,IAAI,4BACV2+B,EAAIwD,YACPD,EAAGl9B,YAAY25B,EAAIwD,YAEvBxD,EAAI/5B,WAAWM,aAAag9B,EAAIvD,EAAG,GAE3C,CAEAr/B,WAAAA,GACI3I,EAAc,CAAEC,UpEnEU,+BiC9BPC,CAAAA,IAChBigB,OAAAA,cAAgB/f,OAAO+f,eAAiB,GAC/C,MAAMD,EAAY,CACd5f,MAAO,cACP+f,cAAeJ,GACfY,YAAa,QACb4qB,UAAW,CAAC,eACTvrC,GAEPE,OAAO+f,cAAcrU,KAAKoU,GAC1BZ,GAAgB,cAAeY,EAAS,EmC0FpCwrB,CAAY,CAAEC,YAAa,CAAC,mBAChC,CAEAb,MAAAA,GACIviC,KAAKqiC,WAAW5jB,MAAK4kB,GAAUA,EAAOd,UAC1C,CAEAZ,QAAAA,GACI3hC,KAAKqiC,WAAW5jB,MAAK4kB,GAAUA,EAAO1B,YAC1C,CAEA2B,iBAAAA,CAAkB9qC,GACd,IAAI0D,EAAO,GAGP1D,EAAEsR,QACFtR,EAAEsR,OAAOihB,QAAQ,UACjBvyB,EAAEsR,OAAOihB,QAAQ,SAASvL,aAAa,oBAEvCtjB,EAAO1D,EAAEsR,OAAOihB,QAAQ,SAASvL,aAAa,mBAGlDxI,GAAY,CAAEsB,YAAa,kBAAmBU,WAAY9c,GAC9D,CAEAuK,oBAAAA,GACI5O,OAAO2f,oBAAoB,SAAUxX,KAAKwiC,mBAC1CxiC,KAAKqiC,WAAW5jB,MAAK4kB,GAAUA,EAAOxB,QAC1C,EAGJ5gC,eAAeC,IAAI,mBAAqBD,eAAeE,OAAO,iBAAkBghC,kPCvIhF,MAAMoB,WAAsBzjC,YACxBuB,WAAAA,WAiDAonB,EAAAzoB,KAAAwjC,IAiBA/a,EAAAzoB,KAAAyjC,IAOAhb,EAAAzoB,KAAA0jC,IAYAjb,EAAAzoB,KAAA2jC,IAqFAlb,EAAAzoB,KAAA4jC,IAIAnb,EAAAzoB,KAAA6jC,IAqBApb,EAAAzoB,KAAA8jC,IA0BArb,EAAAzoB,KAAA+jC,IA4BAtb,EAAAzoB,KAAAgkC,IAIAvb,EAAAzoB,KAAAikC,IA6BAxb,EAAAzoB,KAAAkkC,IAiBAzb,EAAAzoB,KAAAmkC,IAoBA1b,EAAAzoB,KAAAokC,IAyBA3b,EAAAzoB,KAAAqkC,IAiBA5b,EAAAzoB,KAAAskC,IAIA7b,EAAAzoB,KAAAukC,IAWA9b,EAAAzoB,KAAAwkC,IAQA/b,EAAAzoB,KAAAykC,IAMAhc,EAAAzoB,KAAA0kC,IAMAjc,EAAAzoB,KAAA2kC,IAMAlc,EAAAzoB,KAAA4kC,IAIAnc,EAAAzoB,KAAA6kC,IAeApc,EAAAzoB,KAAA8kC,IAOArc,EAAAzoB,KAAA+kC,IAKAtc,EAAAzoB,KAAAglC,IAiBAvc,EAAAzoB,KAAAilC,IAYAxc,EAAAzoB,KAAAklC,IAYAzc,EAAAzoB,KAAAmlC,IAoCA1c,EAAAzoB,KAAAolC,IAOA3c,EAAAzoB,KAAAqlC,IA0CA5c,EAAAzoB,KAAAslC,IAYA7c,EAAAzoB,KAAAulC,IA0CA9c,EAAAzoB,KAAAwlC,IAeA/c,EAAAzoB,KAAAylC,IAQAhd,EAAAzoB,KAAA0lC,IAQAjd,EAAAzoB,KAAA2lC,IAMAld,EAAAzoB,KAAA4lC,IAQAnd,EAAAzoB,KAAA6lC,IAiBApd,EAAAzoB,KAAA8lC,IAhqBI9lC,KAAKwmB,SAAWttB,EAChB8G,KAAK+lC,gBAAkB,EACvB/lC,KAAKgmC,gBAAiB,EACtBhmC,KAAKimC,YAAa,EAClBjmC,KAAKkmC,gBAAiB,EACtBlmC,KAAKmmC,kBAAmB,EACxBnmC,KAAKomC,cAAgB,EACrBpmC,KAAKqmC,UAAW,EAChBrmC,KAAKsmC,gBAAkB,IACvBtmC,KAAKumC,UAAW,EAEhBvmC,KAAKy9B,eAAiBxU,EAAAjpB,KAAKylC,GAAAe,IAAapkC,KAAKpC,MAC7CA,KAAKu9B,eAAiBtU,EAAAjpB,KAAK0lC,GAAAe,IAAarkC,KAAKpC,MAC7CA,KAAK0mC,cAAgBzd,EAAAjpB,KAAK2lC,GAAAgB,IAAYvkC,KAAKpC,MAC3CA,KAAK4mC,YAAc3d,EAAAjpB,KAAKqlC,GAAAwB,IAAUzkC,KAAKpC,KAC3C,CAEAD,iBAAAA,GACSqmB,KAAAA,KAAOpmB,KAAKe,UACjBf,KAAKpJ,MAAQP,EAAY2J,KAAK1J,YAC9B2yB,EAAAjpB,KAAK4jC,GAAAkD,IAALvhC,aAGKvF,KAAKhD,IAAkB,cAAZgD,KAAKhD,MACjBgD,KAAKhD,GAAKgD,KAAKpJ,MAAMmwC,OAAS/mC,KAAKpJ,MAAMmwC,OAAS,kBAAkBr/B,EAAO,MAG/EuhB,EAAAjpB,KAAK2jC,GAAAqD,IAALzhC,KAEAvF,MAAAA,KAAKinC,MAAQ,EACbhe,EAAAjpB,KAAKwjC,GAAA0D,IAAL3hC,KACKkZ,MAAAA,MAAK,KACFze,KAAK03B,aACLzO,EAAAjpB,KAAK4lC,GAAAuB,IAAL5hC,KAAAvF,KAAA,IAEH2e,OAAWnmB,IACRlB,QAAQD,MAAMmB,EAAC,IAElBktB,SAAQ,KACD1lB,KAAKonC,OACLxG,cAAc5gC,KAAKonC,MACnBpnC,KAAKonC,KAAO,KAAA,GAG5B,CAmFA1P,UAAAA,GAES2P,KAAAA,eAAiBrnC,KAAKygB,iBAAiB,sCAC5CzgB,KAAKsnC,WAAatnC,KAAKqnC,eAAexoC,OAGtCoqB,EAAAjpB,KAAKyjC,GAAA8D,IAALhiC,KAAAvF,KAAU,aAAcA,KAAK+R,QAAQy1B,YACrCve,EAAAjpB,KAAKyjC,GAAA8D,IAALhiC,KAAUvF,KAAA,kBAAmBA,KAAK+R,QAAQ01B,iBAIf,SAAvBznC,KAAKomC,eACLnd,EAAAjpB,KAAKokC,GAAAsD,IAALniC,KAAAvF,MAEJipB,EAAAjpB,KAAKukC,GAAAoD,IAALpiC,KACA0jB,MAAAA,EAAAjpB,KAAK4kC,GAAAgD,IAALriC,KACA0jB,MAAAA,EAAAjpB,KAAK0kC,GAAAmD,IAALtiC,KAAAvF,MAGAA,KAAK8nC,UAAY9nC,KAAKsnC,WAAatnC,KAAKomC,cAGxCnd,EAAAjpB,KAAK6jC,GAAAkE,IAALxiC,KAAAvF,MACAipB,EAAAjpB,KAAK+jC,GAAAiE,IAALziC,KACA0jB,MAAAA,EAAAjpB,KAAKikC,GAAAgE,IAAL1iC,KAAAvF,MACAipB,EAAAjpB,KAAKkkC,GAAAgE,IAAL3iC,KAAAvF,MAGAipB,EAAAjpB,KAAK6kC,GAAAsD,IAAL5iC,KACA0jB,MAAAA,EAAAjpB,KAAKqkC,GAAA+D,IAAL7iC,KAAAvF,MACAipB,EAAAjpB,KAAKslC,GAAA+C,IAAL9iC,KAAAvF,MACAipB,EAAAjpB,KAAKulC,GAAA+C,IAAL/iC,KACA0jB,MAAAA,EAAAjpB,KAAK8kC,GAAAyD,IAALhjC,KAAAvF,MACAipB,EAAAjpB,KAAK6lC,GAAA2C,IAALjjC,KAAAvF,MACAipB,EAAAjpB,KAAKolC,GAAAqD,IAALljC,KAGA0jB,MAAAA,EAAAjpB,KAAKmkC,GAAAuE,IAALnjC,KAAAvF,KACJ,CAwPA2oC,YAAAA,CAAa9iC,EAAO+iC,GAAY,GAC5B3f,EAAAjpB,KAAKqkC,GAAA+D,IAAL7iC,KAAAvF,MACAA,KAAK+/B,UAAUnhC,SAASiH,GAAQ+iC,EACpC,CA0EA7I,SAAAA,CAAUl6B,EAAO+iC,GAAY,QACXxlC,IAAVyC,IACA7F,KAAK6oC,aAAehjC,GAIpBA,EAAQ7F,KAAK8nC,WACb7e,EAAAjpB,KAAK8kC,GAAAyD,IAALhjC,KAIJvF,MAAAA,KAAK8oC,SAASzmB,SAAS,CACnBie,KAAMtgC,KAAK+oC,gBAAgBnqC,SAASoB,KAAK6oC,aAAc,KACvDtI,SAAUqI,EAAY,OAAS,UAEvC,CAsLAniC,oBAAAA,GACIwiB,EAAAjpB,KAAK8lC,GAAAkD,IAALzjC,KAAAvF,KACJ,EAnoBAwjC,GAAA,IAAA9Z,QAAAwd,GAAuB+B,WACnB,OAAO,IAAIxsC,SAAQ,CAAC0lB,EAASC,KACpBglB,KAAAA,KAAOzG,aAAY,IAChB3gC,KAAK8oC,SAAS5e,YAAc,EACrB/H,KAGXniB,KAAKinC,OAAS,EA3DL,KA4DLjnC,KAAKinC,MACE7kB,EACH,6EAFR,IAKD,IAAG,GAEd,EAEAqhB,GAAA,IAAA/Z,QAAA6d,GAAI2B,SAAC3qC,EAAKU,GACN,MAAMkqC,EAAkBlgB,EAAAjpB,KAAK0jC,GAAA0F,IAAL7jC,KAAgBtG,KAAAA,QAChBmE,IAApB+lC,IACAnpC,K3DhEsBqpC,CAAChjC,IACzBijC,MAAAA,EAAMjjC,EAAIkjC,MAAM,gBACtB,OAAKD,EACEA,EAAI5sC,KAAI,CAAC0N,EAAGvC,KACX2hC,IAAAA,EAAMp/B,EAAEpF,cACR6C,OAAM,IAANA,IACA2hC,EAAMA,EAAItvB,MAAM,IAAIxd,KAAI,CAACm4B,EAAG4U,IAAa,IAANA,EAAU5U,EAAEC,cAAgBD,IAAIxyB,KAAK,KAErEmnC,CAAAA,IACRnnC,KAAK,IAPWgE,CAAAA,E2D8DNgjC,CAAmB9qC,IAAQ4qC,EAExC,EAEAzF,GAAA,IAAAha,QAAA0f,GAAUM,SAACzqC,GACF0qC,OAAAA,MAAM1qC,GAEU,SAAVA,GAEU,UAAVA,GAGAA,EANAE,WAAWF,EAQ1B,EAEA0kC,GAAA,IAAAqD,QAAAA,GAAc4C,WACJ,MAAE73B,QAAAA,EAAS83B,YAAAA,GAAgB7pC,KAAKpJ,MAGtCoJ,KAAK+gC,UAAY/gC,KAAKuM,cAAc,cACpCvM,KAAK8pC,QAAU9pC,KAAKuM,cAAc,YAClCvM,KAAK8oC,SAAW9oC,KAAKuM,cAAc,MAGnCvM,KAAK6oC,aAAe,EACpB7oC,KAAK6pC,YAAcA,EACfl+B,EAAe/E,GAAGI,OAClBhH,KAAK+R,QAAUA,EAAQ/K,OAChB2E,EAAe/E,GAAGM,OACzBlH,KAAK+R,QAAUA,EAAQ7K,OAEvBlH,KAAK+R,QAAUA,EAAQzO,QAI3B,IAAA,MAAWymC,KAAY/pC,KAAK+R,QACxBkX,EAAAjpB,KAAKyjC,GAAA8D,IAALhiC,UAAUwkC,EAAU/pC,KAAK+R,QAAQg4B,IAIjC/pC,KAAKkmC,iBACLlmC,KAAKimC,WAAajmC,KAAKgmC,gBAAiB,GAIxChmC,KAAKqmC,UACLrmC,KAAK+gC,UAAUlgC,UAAUC,IAAI,YAIjCd,KAAKgqC,gBAAsChqC,KAAKwmB,WCjIhCttB,EtE+GK,OsE/G4BA,EDkIjD8G,KAAKY,aAAa,WAAYZ,KAAKwmB,UAGnCyC,EAAAjpB,KAAKwkC,GAAAyF,IAAL1kC,KACA0jB,MAAAA,EAAAjpB,KAAKykC,GAAAyF,IAAL3kC,WACA0jB,EAAAjpB,KAAK2kC,GAAAwF,IAAL5kC,KAAAvF,KACJ,EA2CA4jC,GAAA,IAAAkD,QAAAA,GAAOsD,WACErpC,KAAAA,UAAY,uEAAuEf,KAAKomB,uBACjG,EAEAyd,GAAA,IAAAkE,QAAAA,GAAcsC,YAEWrqC,KAAKgmC,gBAAkBhmC,KAAK8nC,WAAa,EAGtD9nC,KAAKsqC,YAActqC,KAAKuqC,aACxBvqC,KAAKsqC,WAAW/yB,SAChBvX,KAAKuqC,WAAWhzB,WAMnBvX,KAAKsqC,aACNtqC,KAAKsqC,WAAarhB,EAAAjpB,KAAK8jC,GAAA0G,IAALjlC,KAAAvF,KAAmB,SAEpCA,KAAKuqC,aACNvqC,KAAKuqC,WAAathB,EAAAjpB,KAAK8jC,GAAA0G,IAALjlC,KAAmBvF,KAAA,SAE7C,EAEA8jC,GAAA,IAAA0G,QAAAA,GAAaC,SAACC,EAAKC,GAAkB,GAC3B,MAAE1yB,SAAAA,EAAW,GAAIjb,GAAAA,EAAK,GAAId,KAAAA,EAAO,GAAI0R,SAAAA,EAAW,IAAO5N,KAAKpJ,MAAMggB,UAAY,GAC9Eg0B,EAAiBD,EAAkB3qC,KAAKwmB,SAAWxmB,KAAKgqC,gBACxDa,EAAiB,SAARH,EAETI,EAAW1yC,SAASuI,cAAc,UACxCmqC,OAAAA,EAASjqC,UAAUC,IAAI4pC,GACvBngC,EAAcugC,EAAU,CACpBz/B,UAAW,aACXmb,SAAUokB,EACVlqC,KAAM,KACNgmB,WAAYmkB,EAAS,yBAA2B,0BAChDvqC,MAAON,KAAK6pC,YAAYa,GACxBtsB,kBAAmBnG,EACnBuP,YAAaxqB,EACbyqB,cAAevrB,EACfwrB,kBAAmB9Z,IAElB+8B,EAGDE,EAAS7qC,KAAK+qC,QAAQC,QAAQF,GAAY9qC,KAAK+qC,QAAQE,OAAOH,GAF9DD,EAAS7qC,KAAK+gC,UAAUiK,QAAQF,GAAY9qC,KAAK+gC,UAAUkK,OAAOH,GAI/DA,CACX,EAEA/G,GAAA,IAAAiE,QAAAA,GAAUkD,WACN,IAAKlrC,KAAKimC,YAAiC,IAAnBjmC,KAAK8nC,UAKzB,YAHI9nC,KAAKmrC,KACLnrC,KAAKmrC,IAAI5zB,UAMbvX,KAAKmrC,KACLnrC,KAAKmrC,IAAI5zB,SAGP4zB,MAAAA,EAAM/yC,SAASuI,cAAc,OAEnC,IAAIyqC,EAAU,GACd,IAAA,IAASvjC,EAAI,EAAGA,GAAK7H,KAAK8nC,UAAWjgC,IACjCujC,GAAWniB,EAAAjpB,KAAKgkC,GAAAqH,IAAL9lC,KAAmBsC,KAAAA,GAGlCsjC,EAAIpqC,UAAY,GAAGqqC,IAEnBprC,KAAK8F,YAAYqlC,GACjBnrC,KAAKmrC,IAAMnrC,KAAKuM,cAAc,OAC9BvM,KAAKsrC,YAActrC,KAAKygB,iBAAiB,aAC7C,EAEAujB,GAAA,IAAAta,QAAA2hB,GAAaE,SAAC1lC,GACV,MAAO,sBAAsBA,kBAAsB7F,KAAK6pC,YAAYsB,OAAOtlC,2BAC/E,EAEAo+B,GAAA,IAAAgE,QAAAA,GAAcuD,WACLxrC,KAAKkmC,gBAAqC,IAAnBlmC,KAAK8nC,WAS7B9nC,KAAK+qC,SACL/qC,KAAK+qC,QAAQxzB,SAGjBvX,KAAK+qC,QAAU3yC,SAASuI,cAAc,OACtCX,KAAK+qC,QAAQlqC,UAAUC,IAAI,WAC3Bd,KAAK+qC,QAAQlqC,UAAUC,IAAI,YAC3Bd,KAAK+qC,QAAQnqC,aAAa,cAAe,QAEzCZ,KAAK+qC,QAAQhqC,UAAY,yBAAyBf,KAAK6oC,aAAe,mDAE9D7oC,KAAK8nC,UAAY,WAEzB9nC,KAAKsqC,WAAarhB,EAAAjpB,KAAK8jC,GAAA0G,IAALjlC,KAAmBvF,KAAA,QAAQ,GAC7CA,KAAKuqC,WAAathB,EAAAjpB,KAAK8jC,GAAA0G,IAALjlC,KAAmBvF,KAAA,QAAQ,GAE7CA,KAAK8F,YAAY9F,KAAK+qC,UAvBd/qC,KAAK+qC,SACL/qC,KAAK+qC,QAAQxzB,QAuBzB,EAEA2sB,GAAA,IAAAgE,QAAAA,GAAgBuD,YACPzrC,KAAKmmC,kBAAoBnmC,KAAKqmC,WAI/BrmC,KAAK0rC,gBACLziB,EAAAjpB,KAAKskC,GAAAqH,IAALpmC,KAAavF,KAAA,oBAAqBA,KAAK0rC,gBAAgB,GAGvD1rC,KAAK4rC,iBACL3iB,EAAAjpB,KAAKskC,GAAAqH,IAALpmC,KAAavF,KAAA,oBAAqBA,KAAK4rC,gBACvC3iB,EAAAjpB,KAAKskC,GAAAqH,IAALpmC,KAAavF,KAAA,gCAAiCA,KAAK4rC,eAAiB,OAGxE5rC,KAAK+gC,UAAUlgC,UAAUC,IAAI,gBACjC,EAEAqjC,GAAA,IAAAuE,QAAAA,GAAgBmD,WAIZ,IAAK7rC,KAAKqmC,WEvRMyF,MAGd1iC,MAAAA,EAAQvR,OAAOqR,UAAUC,UACxB,MAAA,iCAAiCF,KAAKG,EAAK,EFmRvB0iC,GACnB,OAIC9rC,KAAK+rC,YACN/rC,KAAK+rC,UAAY3zC,SAASuI,cAAc,MACxCX,KAAK+rC,UAAUlrC,UAAUC,IAAI,cAC7Bd,KAAK+rC,UAAUnrC,aAAa,eAAe,GAC3CZ,KAAK8oC,SAAShjC,YAAY9F,KAAK+rC,YAGnC,MAAMC,GAAkBhsC,KAAKisC,kBAAoBjsC,KAAKksC,WrExN/B,GqEyNvBlsC,KAAK+rC,UAAUntB,MAAM+M,YAAY,QAASqgB,EAAiB,MAC/D,EAEA5H,GAAA,IAAAsD,QAAAA,GAAuByE,WAEdrD,KAAAA,SAASjoC,UAAU0W,OAAO,aAE/B,IAAI60B,EAAYpsC,KAAKosC,gBAGEhpC,IAAnBpD,KAAKosC,WAA8C,SAAnBpsC,KAAKosC,aACrCA,GACKpsC,KAAK8oC,SAAS3O,YAAcn6B,KAAKksC,WAAalsC,KAAKsnC,WAAa,IACjEtnC,KAAKsnC,YAGbtnC,KAAKomC,cAAgB1jC,KAAKqF,MAAM/H,KAAK8oC,SAAS5e,YAAckiB,EAUhE,EAEA/H,GAAA,IAAA+D,QAAAA,GAAmBiE,WAIf,GAHArsC,KAAK+oC,gBAAkB,GACvB/oC,KAAKssC,UAAYtsC,KAAK8oC,SAAS3O,YAAcn6B,KAAK8oC,SAAS5e,YAExB,IAA/BlqB,KAAKqnC,eAAexoC,OACpB,OAKJ,MAAM0tC,EAAsBvsC,KAAKqnC,eAAe,GAAGmF,WAEnDxsC,KAAKygB,iBAAiB,sCAAsC7a,SAAQhO,IAChEoI,KAAK+oC,gBAAgBxlC,KAAK3L,EAAQ40C,WAAaD,EAAmB,GAE1E,EAEAjI,GAAA,IAAAqH,QAAAA,GAAOc,SAACvwC,EAAM+C,EAAOytC,GAAQ,GACzB1sC,KAAK4e,MAAM+M,YAAYzvB,EAAMwwC,EAAQztC,ErEvQd,GqEuQwC,MAAQA,EAC3E,EAEAslC,GAAA,IAAAoD,QAAAA,GAAiBgF,WACT,GAAmB,SAAnB3sC,KAAKosC,UAAsB,CACrBQ,MAAAA,GACD5sC,KAAK+gC,UAAU3G,aAAep6B,KAAKomC,cAAgB,GAAKpmC,KAAKksC,YAC7DlsC,KAAKomC,eAAiB,GAC3Bnd,EAAAjpB,KAAKskC,GAAAqH,IAALpmC,KAAAvF,KAAa,eAAgB4sC,GAAe,EAChD,MAAW5sC,KAAKosC,WACZnjB,EAAAjpB,KAAKskC,GAAAqH,IAALpmC,KAAAvF,KAAa,eAAgBA,KAAKosC,WAAW,EAErD,EAEA5H,GAAA,IAAAyF,QAAAA,GAAqB4C,WACW,SAAxB7sC,KAAK8sC,eACL7jB,EAAAjpB,KAAKskC,GAAAqH,IAALpmC,UAAa,qBAAsB,aACJnC,IAAxBpD,KAAK8sC,gBACZ7jB,EAAAjpB,KAAKskC,GAAAqH,IAALpmC,KAAavF,KAAA,qBAAsBA,KAAK8sC,gBAAgB,EAEhE,EAEArI,GAAA,IAAAyF,QAAAA,GAAgB6C,YACR/sC,KAAKksC,WAAgC,IAAnBlsC,KAAKksC,YACvBjjB,EAAAjpB,KAAKskC,GAAAqH,IAALpmC,KAAAvF,KAAa,eAAgBA,KAAKksC,WAAW,EAErD,EAEAxH,GAAA,IAAAmD,QAAAA,GAAemF,WACPhtC,KAAKumC,UACLvmC,KAAK8oC,SAASjoC,UAAUC,IAAI,YAEpC,EAEA6jC,GAAA,IAAAwF,QAAAA,GAAkB8C,WACVjtC,KAAKktC,uBACLjkB,EAAAjpB,KAAKskC,GAAAqH,IAALpmC,KAAAvF,KAAa,2BAA4BA,KAAKktC,sBAEtD,EAEAtI,GAAA,IAAAgD,QAAAA,GAAoBuF,WAChBlkB,EAAAjpB,KAAKskC,GAAAqH,IAALpmC,KAAAvF,KAAa,oBAAqBA,KAAKomC,cAC3C,EAEAvB,GAAA,IAAAsD,QAAAA,GAAoBiF,WACZptC,KAAK8nC,UAAY,GAKrB9nC,KAAK8oC,SAASjoC,UAAUC,IAAI,YAChC,EAQAgkC,GAAA,IAAAyD,QAAAA,GAAa8E,WACTpkB,EAAAjpB,KAAKglC,GAAAsI,IAAL/nC,KACA0jB,MAAAA,EAAAjpB,KAAKilC,GAAAsI,IAALhoC,KACA0jB,MAAAA,EAAAjpB,KAAKklC,GAAAsI,IAALjoC,WACA0jB,EAAAjpB,KAAKmlC,GAAAsI,IAALloC,KAAAvF,KACJ,EAEA+kC,GAAA,IAAArb,QAAAgkB,GAAmBC,SAAC9nC,GAChBojB,EAAAjpB,KAAKglC,GAAAsI,IAAL/nC,UAAuBM,GACvBojB,EAAAjpB,KAAKklC,GAAAsI,IAALjoC,KAAAvF,KACJ,EAEAglC,GAAA,IAAAtb,QAAA4jB,GAAiBM,SAAC/E,KACR7oC,KAAKgmC,gBAAkBhmC,KAAK8nC,WAAa,KAAO9nC,KAAKkmC,iBAK3DlmC,KAAKsqC,WAAWzpC,UAAU0W,OAAO,QACjCvX,KAAKuqC,WAAW1pC,UAAU0W,OAAO,QAGP,IAAtBvX,KAAK6oC,aACL7oC,KAAKsqC,WAAWzpC,UAAUC,IAAI,SACvBd,KAAK6oC,eAAiB7oC,KAAK8nC,WAAae,IAAiB7oC,KAAK8nC,YACrE9nC,KAAKuqC,WAAW1pC,UAAUC,IAAI,QAEtC,EAEAmkC,GAAA,IAAAsI,QAAAA,GAAgBM,YACP7tC,KAAKimC,YAAcjmC,KAAK8nC,WAAa,IAI1C9nC,KAAKsrC,YAAY1lC,SAAQqU,IACrBA,EAAKpZ,UAAU0W,OAAO,SAAQ,IAGlCvX,KAAKsrC,YAAYtrC,KAAK6oC,cAAchoC,UAAUC,IAAI,UACtD,EAEAokC,GAAA,IAAAsI,QAAAA,GAAWM,YACF9tC,KAAKkmC,gBAAqC,IAAnBlmC,KAAK8nC,WAI5B9nC,KAAKkmC,iBAIVlmC,KAAK+qC,QAAQx+B,cAAc,YAAYpH,YAAcvG,SAASoB,KAAK6oC,aAAe,GACtF,EAEA1D,GAAA,IAAAsI,QAAAA,GAAgBM,WAEZ,IAAK/tC,KAAKqmC,SACN,OAGCgB,KAAAA,eAAezhC,SAAQhO,IACxBA,EAAQgJ,aAAa,gBAAiB,OAAM,IAG5CotC,IAAAA,EAAYpvC,SAASoB,KAAK6oC,cAC9B,IAAA,IAAShhC,EAAI,EAAGA,EAAI7H,KAAKomC,cAAev+B,IAChC7H,KAAKqnC,eAAe2G,EAAYnmC,IAChC7H,KAAKqnC,eAAe2G,EAAYnmC,GAAG0oB,gBAAgB,gBAG/D,EAoBA6U,GAAA,IAAAqD,QAAAA,GAAoBwF,WACa,IAAzBjuC,KAAK+lC,iBAAyB/lC,KAAK+lC,gBAAkB/lC,KAAK8nC,UAAY,GAG1E9nC,KAAK+/B,UAAU//B,KAAK+lC,iBAAiB,EACzC,EAEAV,GAAA,IAAAwB,QAAAA,GAASqH,WAEDluC,KAAKmuC,aACLtL,aAAa7iC,KAAKmuC,aAGtBllB,EAAAjpB,KAAKulC,GAAA+C,IAAL/iC,KAAAvF,MAGAA,KAAKmuC,YAAcnqB,YAAW,KAE1BiF,EAAAjpB,KAAKqkC,GAAA+D,IAAL7iC,KAAAvF,MAEA,MAAMouC,EAAqB1rC,KAAK2P,MAAMrS,KAAK8oC,SAAS1Q,YAGpD,IAAIvyB,EAAQ7F,KAAK+oC,gBAAgBluC,QAAQuzC,IAOrCvoC,IADAA,IACAA,EAAQ7F,KAAK+oC,gBAAgBluC,QAAQuzC,EAAqB,SAE1DvoC,IACAA,EAAQ7F,KAAK+oC,gBAAgBluC,QAAQuzC,EAAqB,IAI1DA,IAAuBpuC,KAAKssC,YAC5BzmC,EAAQ7F,KAAK8nC,WAGbjiC,GAAS,GACTojB,EAAAjpB,KAAKwlC,GAAA6I,IAAL9oC,UAAoBM,GAAO,GAG/BojB,EAAAjpB,KAAK+kC,GAAA2I,IAALnoC,KAAyBM,KAAAA,EAAAA,GAC1B,IACP,EAEAy/B,GAAA,IAAA+C,QAAAA,GAAiBiG,YACRtuC,KAAKqmC,WAAarmC,KAAKqnC,eAAexoC,SAI3CmB,KAAKisC,kBAAoBrtC,SACrB2vC,iBAAiBvuC,KAAK8oC,UAAU0F,iBAAiB,iBAGrDxuC,KAAKyuC,kBAAoBzuC,KAAKqnC,eAAe,GAAGnd,YAAclqB,KAAKksC,UACvE,EAEA3G,GAAA,IAAA+C,QAAAA,GAAWoG,WACP,IAAK1uC,KAAKqmC,SACN,OAEEsI,MAAAA,EAAU3uC,KAAK8oC,SAAS1Q,WAE9Bp4B,KAAKqnC,eAAezhC,SAAQ,CAACqU,EAAMpU,KAI/B,IAAI+oC,EAFmB30B,EAAKuyB,WAAaxsC,KAAKisC,kBAEjBjsC,KAAKyuC,kBAG9BI,EAAa,IAEbF,EAAUC,EAEVC,EAAa,EACNF,GAAW3uC,KAAKyuC,kBAAoB5oC,EAE3CgpC,EAAansC,KAAK2P,OAAQu8B,EAAQD,GAAW3uC,KAAKyuC,kBAAqB,KAChEE,EAAUC,GAAS,EAAI5uC,KAAKomC,eAAiBpmC,KAAKyuC,kBAEzDI,EAAa,EACNF,GAAWC,EAAQ5uC,KAAKomC,cAAgBpmC,KAAKyuC,oBAEpDI,EAAansC,KAAK2P,MACa,KAA1BrS,KAAKomC,cAAgB,IAChBwI,EAAQD,GAAW3uC,KAAKyuC,kBAAqB,MAI3D,MAAMK,EAAoBD,EAAa,IACnCE,IAAAA,EACArsC,KAAK2P,MACyE,KAAzEy8B,GAAqB,EAAI9uC,KAAKsmC,iBAAmBtmC,KAAKsmC,kBACvD,IAERrsB,EAAKwP,kBAAkB7K,MAAM+M,YAAY,UAAWojB,EAAY,GAExE,EAEAvJ,GAAA,IAAA6I,QAAAA,GAAcW,SAACnpC,EAAOopC,GAAkB,GAC/BjvC,KAAKqnC,eAAexhC,KAIzB7F,KAAK6oC,aAAehjC,EAGfopC,EAGDhmB,EAAAjpB,KAAK8kC,GAAAyD,IAALhjC,KAAAvF,MAFAA,KAAK+/B,YAIb,EAEA0F,GAAA,IAAAe,QAAAA,GAAY0I,WACJlvC,KAAK6oC,aAAe,IACpB7oC,KAAK6oC,aAAe7oC,KAAK6oC,aAAe,EACxC5f,EAAAjpB,KAAK8kC,GAAAyD,IAALhjC,KAAAvF,OAEJA,KAAK+/B,WACT,EAEA2F,GAAA,IAAAe,QAAAA,GAAY0I,WACJnvC,KAAK6oC,aAAe7oC,KAAK8nC,YACzB9nC,KAAK6oC,aAAe7oC,KAAK6oC,aAAe,EACxC5f,EAAAjpB,KAAK8kC,GAAAyD,IAALhjC,KAAAvF,OAEJA,KAAK+/B,WACT,EAEA4F,GAAA,IAAAjc,QAAAid,GAAWyI,SAAC52C,GACRwH,KAAK6oC,aAAejqC,SAASpG,EAAEsR,OAAO4oB,QAAQzY,MAC9CgP,EAAAjpB,KAAKilC,GAAAsI,IAALhoC,KACA0jB,MAAAA,EAAAjpB,KAAKwlC,GAAA6I,IAAL9oC,UAAoBvF,KAAK6oC,aAC7B,EAEAjD,GAAA,IAAAuB,QAAAA,GAAckI,WACV53C,EAAc,CACVC,UAAWqB,EACXpB,KAAM,CAAEqF,GAAIgD,KAAKhD,IACjBpF,QAASoI,MAEjB,EAEA6lC,GAAA,IAAA2C,QAAAA,GAAU8G,WACNrmB,EAAAjpB,KAAK8lC,GAAAkD,IAALzjC,KAAAvF,MAEAA,KAAK8oC,SAAS3oC,iBAAiB,SAAUH,KAAK4mC,aAC1C5mC,KAAKsqC,YACLtqC,KAAKsqC,WAAWnqC,iBAAiB,QAASH,KAAKy9B,gBAE/Cz9B,KAAKuqC,YACLvqC,KAAKuqC,WAAWpqC,iBAAiB,QAASH,KAAKu9B,gBAE/Cv9B,KAAKsrC,aACLtrC,KAAKsrC,YAAY1lC,SAAQhO,IACrBA,EAAQuI,iBAAiB,QAASH,KAAK0mC,cAAa,GAGhE,EAEAZ,GAAA,IAAAkD,QAAAA,GAAYuG,WACRvvC,KAAK8oC,SAAStxB,oBAAoB,SAAUxX,KAAK4mC,aAC7C5mC,KAAKsqC,YACLtqC,KAAKsqC,WAAW9yB,oBAAoB,QAASxX,KAAKy9B,gBAElDz9B,KAAKuqC,YACLvqC,KAAKuqC,WAAW/yB,oBAAoB,QAASxX,KAAKu9B,gBAElDv9B,KAAKsrC,aACLtrC,KAAKsrC,YAAY1lC,SAAQhO,IACrBA,EAAQ4f,oBAAoB,QAASxX,KAAK0mC,cAAa,GAGnE,EAOJzlC,eAAeC,IAAI,sBAAwBD,eAAeE,OAAO,oBAAqBoiC,IGnsBtF,MAAMiM,GAAaljC,GAAa,IAAIA,EAAUmU,iBAAiB,eAAe3pB,OAAO24C,GAAS,CAAA,GAExFA,GAAUA,CAACC,EAAMC,KACb,MAAEtoC,IAAAA,GAAQsoC,EAAKjd,QAGfkd,EAAWvoC,EAAIkiC,MAAM,iBAE3B,OAAiB,OAAbqG,EACOC,GAAYH,EAAMC,EAAMC,GAExB,IAAKF,EAAM,CAACC,EAAKjd,QAAQrrB,KAAMsoC,IAIxCE,GAAcA,CAACH,EAAMC,GAAM,CAAGzzC,EAAM2J,WACnBzC,IAAfssC,EAAKxzC,KACLwzC,EAAKxzC,GAAQ,IAEjBwzC,EAAKxzC,GAAM2J,GAAS8pC,EACbD,GCVEI,GAAcA,CAACC,EAAS,UAAW9lB,EAAQ,OACpD,MAAM+lB,EAAQ,GAEd,OAAID,GACAC,EAAMzsC,KAAK,YAAYwsC,KAGvB9lB,GACA+lB,EAAMzsC,KAAK,WAAW0mB,KAGnB,IAAI+lB,EAAM3tC,KAAK,MAAI,ECnBjB4tC,GAAiB,WCM9B,MAAMC,WAAepwC,YACjBuB,WAAAA,GACIyC,QACA9D,KAAKa,UAAUC,IAAI,YACvB,CAEA,6BAAWolB,GACP,MAAO,CAAC,QACZ,CAEAkC,wBAAAA,CAAyBlsB,GACR,UAATA,GACA8D,KAAKmwC,UAEb,CAEApwC,iBAAAA,GACIC,KAAKpJ,MAAQP,EAAY2J,KAAK1J,YAC9B0J,KAAKC,SACLD,KAAK0vC,KAAOF,GAAWxvC,MACvBA,KAAK8tB,eACL9tB,KAAK6tB,cACT,CAEAA,YAAAA,GACU,MAAEvtB,MAAAA,EAAOsW,SAAAA,GAAa5W,KAAKpJ,MAE3ByJ,EAAOL,KAAKuM,cAAc,KAE5BlM,IACAA,EAAK6uB,QAAU,KACXvV,GAAgB,CACZF,SAAUnZ,KACPsW,GACN,EAGb,CAEAkX,YAAAA,GACQ,IAAEhlB,IAAAA,EAAM,GAAIsnC,WAAAA,EAAa,IAAOpwC,KAAKpJ,MAAMy5C,OACzC,MAAEA,OAAAA,GAAWrwC,KAAK0vC,KAGL,KAAfU,IACAA,EAAatnC,GAGjBsnC,GFvB6BE,EACjCP,EAAS,SACTQ,EAAc,MACdC,EAAc,OACdC,EAAe,OACfC,EAAc,SAEV/kC,EAAe/E,GAAGI,OACX8oC,GAAYC,EAAQQ,GACpB5kC,EAAe/E,GAAGM,OAClB4oC,GAAYC,EAAQS,GACpB7kC,EAAe/E,GAAGtD,QAClBwsC,GAAYC,EAAQU,GAEpBX,GAAYC,EAAQW,GESbJ,CAAsB,QAAS,MAAO,MAAO,KAAM,OACjEF,GAAc,eAEVC,GAAUD,GACV5nC,EAAS6nC,EAAQ,MAAO,GAAGD,IAAcA,EAEjD,CAEAnwC,MAAAA,GACU,MAAEK,MAAAA,EAAOD,KAAAA,EAAMswC,MAAAA,EAAOC,cAAAA,EAAgB,aAAgB5wC,KAAKpJ,OACzD2R,WAAAA,EAAYD,SAAAA,GAAaD,EAAYhI,GAE7CL,KAAKe,UAAY,iBAET4vC,IAAUV,GACJjwC,KAAK2c,eACL,YAAYrU,iBAAwBC,kBAA2BqoC,KAAiBtwC,wBACpFN,KAAK2c,qDAIT3c,KAAK6wC,0BAGX7wC,KAAKK,KAAOL,KAAKuM,cAAc,KAC/BvM,KAAKM,MAAQN,KAAKuM,cAAc,QAChCokC,GAAS3wC,KAAKY,aAAa,QAAS+vC,GACpC3wC,KAAK8wC,UACT,CAEAX,QAAAA,GACUQ,MAAAA,EAAQ3wC,KAAKwf,aAAa,SDtFV,aCwFlBmxB,GACA3wC,KAAKK,KAAKO,aAAa,eAAgB,QACvCZ,KAAKM,MAAMO,UAAUC,IAAI,eACzBd,KAAKM,MAAMO,UAAU0W,OAAO,iBAExBo5B,IAAUV,IACVjwC,KAAKK,KAAKkwB,gBAAgB,gBAG9BvwB,KAAKM,MAAMO,UAAU0W,OAAO,eAC5BvX,KAAKM,MAAMO,UAAUC,IAAI,eAEjC,CAEAgwC,QAAAA,GACU,MAAEjmC,MAAAA,GAAU7K,KAAKpJ,MAEnBiU,GAAmB,KAAVA,GACT7K,KAAK4e,MAAM+M,YAAY,2BAA4B9gB,EAE3D,CAEA8R,YAAAA,GACQ,IAAE7T,IAAAA,EAAM,GAAIsnC,WAAAA,EAAa,IAAOpwC,KAAKpJ,MAAMy5C,OACzC,MAAEM,MAAAA,GAAU3wC,KAAKpJ,MAEnBkS,MAAQ,KAARA,GAA6B,KAAfsnC,EACP,GAIJ,2DACHO,IAAUV,GAAiB,sBAAwB,MAE3D,CAEAY,WAAAA,GACU,MAAEvwC,MAAAA,EAAOqwC,MAAAA,GAAU3wC,KAAKpJ,MAEzB0J,GAAAA,EAIL,MAAO,4BACHqwC,IAAUV,GAAiB,cAAgB,OAC1C3vC,UACT,EAGJW,eAAeC,IAAI,cAAgBD,eAAeE,OAAO,YAAa+uC,ICnItE,MAAMa,GACF1vC,WAAAA,GACS2vC,KAAAA,cAAgBC,GACzB,CAQAC,MAAAA,CAAOjkB,GACHA,EAAYrnB,SAAQ,EAAGgb,SAAAA,EAAUkF,SAAAA,EAAU/T,QAAAA,MACvC,GAAI/R,KAAKgxC,UAAUG,IAAIvwB,GAEnB,YADQwwB,QAAAA,KAAK,0BAA0BxwB,qBAIrCywB,MAAAA,EAAUj5C,SAASqoB,iBAAiBG,GAEtCywB,GAAmB,IAAnBA,EAAQxyC,OAER,YADQuyC,QAAAA,KAAK,mCAAmCxwB,MAIpD,MAAM+L,EAAW,IAAIljB,qBAAqBqc,EAAU/T,GACpDs/B,EAAQzrC,SAAQhO,GAAW+0B,EAAS5iB,QAAQnS,KAC5CoI,KAAKgxC,UAAUM,IAAI1wB,EAAU,CAAE+L,SAAAA,EAAU0kB,QAAAA,GAAS,GAE1D,CAMAxnC,SAAAA,CAAU+W,GACN,MAAMjX,EAAQ3J,KAAKgxC,UAAU9vC,IAAI0f,GAEjC,GAAIjX,EAAO,CACD,MAAEgjB,SAAAA,EAAU0kB,QAAAA,GAAY1nC,EAC9B0nC,EAAQzrC,SAAQhO,GAAW+0B,EAAS9iB,UAAUjS,IAClD,MACYw5C,QAAAA,KAAK,mCAAmCxwB,KAExD,CAMA4M,OAAAA,CAAQ5M,GACJ,MAAMjX,EAAQ3J,KAAKgxC,UAAU9vC,IAAI0f,GAEjC,GAAIjX,EAAO,CACD,MAAEgjB,SAAAA,GAAahjB,EACrBgjB,EAASoV,aACT/hC,KAAKgxC,UAAUO,OAAO3wB,EAC1B,MACYwwB,QAAAA,KAAK,mCAAmCxwB,KAExD,CAKA4wB,UAAAA,GACSR,KAAAA,UAAUprC,SAAQ+D,IACnBA,EAAMgjB,SAASoV,gBAGnB/hC,KAAKgxC,UAAUS,OACnB,EC9EG,MAAMC,GAAkC,kCAOlCC,GAAmB,OAEnBC,GAA8B,CAAC,GAAK,IAMpCC,GAAwB,CACjCC,kBAAmB,OACnBC,YAAa,QACb1L,SAAU,QACV2L,uBAAwB,cACxBC,iBAAkB,OAClBC,WAAY,KCGhB,MAAMC,WAA0BryC,YAC5BuB,WAAAA,GACIyC,QACA9D,KAAKoyC,SAAWv6C,OAAOgP,WAAanO,EAGpCsH,KAAKmuC,aAAc,EACnBnuC,KAAKqyC,eAAiB,IAAItB,EAC9B,CAEAhxC,iBAAAA,GACIC,KAAKpJ,MAAQP,EAAY2J,KAAK1J,YAC9B0J,KAAKa,UAAUC,IAAI,yBACnBd,KAAKsyC,OAAStyC,KAAKuyC,WACnBvyC,KAAK1C,KAAO0C,KAAKsyC,OAAS,OAAS,SACnCtyC,KAAKwyC,gBAAkBxyC,KAAKpJ,MAAM67C,kBAAoB,OAAS,QAC/DzyC,KAAKY,aAAa,OAAQZ,KAAK1C,KAAK0H,eACpChF,KAAKY,aAAa,oBAAqBZ,KAAKwyC,iBAC5CxyC,KAAK0yC,MACT,CAEAH,QAAAA,GACI,IAAKvyC,KAAKpJ,MACC,OAAA,EAEL,MAAE07C,OAAAA,EAAS,SAAYtyC,KAAKpJ,MAClC,MAAkB,SAAX07C,CACX,CAEAI,IAAAA,GACSzyC,KAAAA,SACLD,KAAK0vC,KAAOF,GAAWxvC,MACvBA,KAAKqjC,OAASrjC,KAAKuM,cAAc,qBACjCvM,KAAK2yC,gBCjDSvP,CAAAA,IACZwP,MAAAA,EAAwBvP,IAE1BD,EAAYyP,SAAWzP,EAAY0P,cAE7B3b,MAAAA,EAAQkM,EAAO5iB,iBAAiB,KAEtC,IAAA,MAAY5a,EAAOxF,KAAS82B,EAAMztB,UAC9BrJ,EAAKF,iBAAiB,QAAS4yC,EAAkB3wC,KAAKpC,WAAM6F,GAAM,EAIpEktC,EAAoBA,CAACltC,EAAOjC,KAC9BA,EAAOwc,iBAEP,MAAM/f,EAAOuD,EAAOkG,OAAOihB,QAAQ,KAEnC,GAAI1qB,EAAM,CACN5I,EAAc,CACVC,UAAWg6C,GACX/5C,KAAM,CAAEq7C,UAAW3yC,EAAKmf,aAAa,aAAc3Z,MAAAA,KAGvDu9B,EAAY/C,QAAU+C,EAAY/C,OAAOhgC,EAAMwF,GAC/ChO,OAAO+/B,SAAShI,KAAOvvB,EAAKmf,aAAa,aAEzC,IAAIyzB,EAAa,GACbC,EAAe,GACfC,EAAc,GACd/P,EAAYrY,QAAQ,sBACpBooB,EAAc9yC,EAAKkM,cAAc,sBAAsBpH,YACvD+tC,EAAe9P,EAAYxsC,MAAM0gC,yBAA2B,KAE5D4b,EAAe9P,EAAYxsC,MAAM0gC,yBAA2B,GAExD6b,EADA9yC,EAAKszB,mBAAmBxuB,YACV9E,EAAKszB,mBAAmBxuB,YAExB9E,EAAKmf,aAAa,eAGxCyzB,EAAaC,EAAe,GAAGA,OAAkBC,IAAgB,GAAGA,IACpE/P,EAAYjc,MAAM8rB,EACtB,GAGEG,EAAkBxvC,IACd,MAAEovC,UAAAA,EAAWntC,MAAAA,GAAUtN,EAAUqL,GAEvCw/B,EAAYiQ,eAAiBjQ,EAAYiQ,cAAcL,GACvD5P,EAAYkQ,aAAelQ,EAAYkQ,YAAYN,GACnD5P,EAAYuF,cAAgBvF,EAAYuF,aAAaqK,EAAWntC,EAAK,EA8BlE,MAAA,CAAE0tC,gBA3BelQ,IACpB,MAAMjsB,EAAiB,GAEnBisB,OAAAA,GACAjsB,EAAe7T,KAAK,CAChB3L,QAASwrC,EACT9lC,KAAMvE,EACNue,SAAUs7B,EAAsBxwC,KAAKpC,WAAMqjC,GAC3CtxB,QAAS,CAAEyhC,MAAM,KAGzBp8B,EAAe7T,KAAK,CAChB3L,QAASC,OACTyF,KAAMo0C,GACNp6B,SAAU87B,IAEdh8B,EAAe7T,KAAK,CAChB3L,QAASC,OACTyF,K/EjBiC,gC+EkBjCga,SAAU8rB,EAAYqQ,aAAarxC,KAAKghC,KAG5CjsB,GAAiBC,GAEVA,CAAAA,ID5BgBs8B,CAAc1zC,MAAMuzC,gBAAgBvzC,KAAKqjC,QAChErjC,KAAKqyC,eAAenB,OAAO,CACvB,CACItwB,SAAU,YACVkF,SAAU9lB,KAAKozC,gBACfrhC,QAAS,CACL+a,UAAW8kB,GACX7kB,WAAY,wBAI5B,CAEA9sB,MAAAA,GACID,KAAKe,UAAY,GAAGf,KAAK2zC,oBAC7B,CAEAC,gBAAAA,GACW,MAAA,CACHC,UAAW7zC,KAAKsyC,OAAS,OAAS,QAClCwB,gBAAiB9zC,KAAKsyC,O9EmCF,e8EnC8BlvC,EAClD2wC,gBAAiB/zC,KAAKsyC,ODjEJ,SCiE8BlvC,KAC7CyuC,GAEX,CAEA8B,gBAAAA,GACU,MACFK,UAAAA,EACA5c,4BAAAA,EACAC,wBAAAA,EACA4c,gBAAAA,EAAkB,aAClBr9B,SAAAA,GACA5W,KAAKpJ,MAGHikB,EAAO7a,KAAKk0C,WAAW,SAASl0C,KAAK1C,QAErC62C,EAAgBn0C,KAAK4zC,mBACrBQ,EAAa,CACfriC,QAAS,CACL/K,OAAQ,CACJygC,gBAAiBznC,KAAKsyC,OAASX,GD/FnB,OCgGZnK,WAAYxnC,KAAKsyC,OAAS,ODzFX,MC0Ff+B,gBAAiB,WACdF,GAEPjtC,OAAQ,CACJugC,gBAAiBznC,KAAKsyC,OAASX,GDpGnB,OCqGZnK,WAAYxnC,KAAKsyC,OAAS,OD9FH,MC+FvB+B,gBAAiB,UACdF,GAEP7wC,QAAS,CACLmkC,gBAAiBznC,KAAKsyC,OAASX,GDzGlB,EC0GbnK,WAAYxnC,KAAKsyC,OAAS,ODpGH,SCqGpB6B,IAGXtK,YAAa,CACTzM,KAAMhG,EACN+F,KAAM9F,EACN8T,IAAK8I,GAETr9B,SAAAA,GAGEysB,EAAS,uCACL2Q,yBACE/pC,EAAsBmqC,oCACZp0C,KAAK1C,uBACrBud,kCAGN,OAAI7a,KAAKsyC,OACEjP,EAGJ,kCAAkCA,kBAC7C,CAEA6Q,UAAAA,CAAWI,GACD,MAAEp8C,QAAAA,EAAU,IAAO8H,KAAKpJ,MAEfsB,OAAAA,EACVwE,KAAI63C,IAAW,IAAKA,EAAQ39B,SAAU5W,KAAKpJ,MAAMggB,eAAYxT,MAC7D1G,KAAI63C,GAAUv0C,KAAKs0C,GAAgBC,KACnClyC,KAAK,GAGd,CAEAmyC,YAAAA,CAAaD,GACL,IAAEl0C,KAAAA,EAAMuW,SAAAA,GAAa29B,EACzB,IAAKl0C,EACM,OAAA,KAEL,MAAEkI,WAAAA,GAAeF,EAAYhI,GAE7Bo0C,EAAqB,IAAKF,EAAQ39B,SAAAA,GAEjC,MAAA,wDAEoB3M,EACfwqC,yBACoBlsC,+CAGpC,CAEAmsC,UAAAA,CAAWC,GACD,MAAEt0C,KAAAA,GAASs0C,EACjB,IAAKt0C,EACM,OAAA,KAEL,MAAEkI,WAAAA,EAAYD,SAAAA,GAAaD,EAAYhI,GAEtC,MAAA,gDAEYiI,iBAAwBC,+GAEPosC,EAAKtE,OAAOvnC,iDACdP,sFAEHosC,EAAK/9B,UAAU5Z,+CACb23C,EAAK/9B,UAAU1a,qDACXy4C,EAAK/9B,UAAUqB,yDACf08B,EAAK/9B,UAAUhJ,6DAElC+mC,EAAKr0C,0FAK3B,CAGAmzC,YAAAA,GACSZ,KAAAA,SAAW7yC,KAAK8yC,aACzB,CAEAO,aAAAA,CAAcL,GACJ,MAAE96C,QAAAA,EAAU,CAAC,GAAM8H,KAAK0vC,KAC9B,IAAA,MAAWkF,KAAY18C,EAAS,CAC5B,MAAMq8C,EAASr8C,EAAQ08C,GACjBjE,EAAQiE,IAAa5B,EAAY,WAAa,UACjB,mBAAxBuB,EAAO3zC,cACd2zC,EAAO3zC,aAAa,QAAS+vC,EAErC,CACJ,CAEA2C,WAAAA,CAAYN,GACF,MAAE6B,MAAAA,EAAQ,CAAC,GAAM70C,KAAK0vC,KAC5B,IAAA,MAAWoF,KAAUD,EAAO,CACxB,MAAMF,EAAOE,EAAMC,GACbC,EAAYD,IAAW9B,EAAY,OAAS,QAClD2B,EAAK/zC,cAAgB+zC,EAAK/zC,aAAa,UAAWm0C,EACtD,CACJ,CAEA,kBAAMpM,CAAaqK,EAAWgC,GAC1B,IAAInvC,EAAQmvC,EACN3R,MAAAA,QAAerjC,KAAK0vC,KAAKuF,WAC3B5R,WACW2R,EAAW,KACJ3R,EAAO5iB,iBAAiB,gBAChC7a,SAAQ,CAACvF,EAAMwH,KACbxH,EAAKmf,aAAa,eAAiBwzB,IACnCntC,EAAQgC,EAAAA,IAIhBhC,GAASw9B,GAAUA,EAAOtD,WAC1BsD,EAAOtD,UAAUl6B,GAG7B,CAEAqvC,IAAAA,CAAKn9C,GACDN,EAAc,CAAEG,QAASoI,QAASjI,GACtC,CAEA,YAAMsoC,CAAOhgC,EAAMwF,GACf7F,KAAKmuC,aAAc,EAEnB,MAAMrkC,EADWzJ,EAAKmf,aAAa,cAE3B21B,OAAAA,EAAQN,MAAAA,GAAU70C,KAAK6yC,SAGzBuC,EAA4B,IAAVvvC,EAAc,EAAIgvC,EAAMQ,OAG1CC,EAAgB,CAAE3yB,iBADCwyB,EAAOpyB,IAAMoyB,EAAOE,OAASD,SAGhD/yB,GAAS,aAAavY,MAAYwrC,GACxCt1C,KAAKmuC,aAAc,EAGF/1C,SAASmU,cAAc,aAAazC,OAC5CgnB,MAAM,CAAEykB,eAAe,GACpC,CAEApuB,KAAAA,GACI,CAGJ2rB,WAAAA,GACI,MAAM0C,EAAUp9C,SAASmU,cAAc,gBACjCkpC,EAAar9C,SAASmU,cAAc,qBAEpCmpC,EAAaF,GAAS1yB,yBAA2B,CAAEuyB,OAAQ,EAAGM,EAAG,GACjEC,EAAgBH,GAAY3yB,yBAA2B,CAAEuyB,OAAQ,EAAGM,EAAG,GAEtE,MAAA,CACHR,OAAQ,CAAEE,OAAQK,EAAWL,OAAQtyB,IAAK2yB,EAAWC,GACrDd,MAAO,CAAEQ,OAAQO,EAAcP,OAAQtyB,IAAK6yB,EAAcD,GAElE,CAEAvC,eAAAA,CAAgB1pC,GACNC,MAAAA,EAAQD,EAAQ,GAEtB,GAAIC,EAAMC,iBAAmB5J,KAAKmuC,YAAa,CACrC,MAAEnxC,GAAAA,EAAK,IAAO2M,EAAMG,OAAO4oB,QAEjCj7B,EAAc,CACVC,UAAWg6C,GACX/5C,KAAM,CAAEq7C,UAAWh2C,GAAM2M,EAAMG,OAAO0V,aAAa,aAE3D,CACJ,CAEA/Y,oBAAAA,GACI0Q,GAAoBnX,KAAK2yC,iBACzB3yC,KAAKqyC,eAAe7kB,QAAQ,YAChC,EE/RGxzB,eAAeg6B,KAClB,aAAan8B,OAAOo+B,OACxB,CFgSAh1B,eAAeC,IAAI,0BACfD,eAAeE,OAAO,wBAAyBgxC,IGzSnD,MAAM0D,OAAyBC,IAExB,SAASC,GAAkBC,GACvBH,OAAAA,GAAmB1E,IAAI6E,EAClC,CAaO,MAAMC,GAAmB,mBChBnBC,GAAuB,aACvBC,GAAe,gBAEfC,GAAW,mBACXC,GAA2B,gBAC3BC,GAA8B,kBAC9BC,GAAiC,qBAGjCC,GAAsB,sBACtBC,GAAwB,qBAGxBC,GAA8B,UAC9BC,GAA2B,OCmBlCC,GAAU,CACZC,mBAAezzC,EACf0zC,UAAW,GAEXpE,KAAM14C,eAAgB+8C,GACXC,OAAAA,OAAAA,YAAcD,EACrBl/C,OAAOm8B,WAAan8B,OAAOm8B,YAAcA,GACzCh0B,KAAKsxC,IAAI,aAAc5uC,KAAKsF,SAAW,GAAGsC,SAAS,IAAI1P,UAAU,IACjEoF,KAAKsxC,IAAI,kBAAmB,IAC5BtxC,KAAKsxC,IAAI,cAAe,CAAA,GACxBtxC,KAAKsxC,IAAI,cAAe,IACxBtxC,KAAKsxC,IAAI,UAAW,CAAA,GAEbz5C,OAAOm8B,YACjB,EAED,YAAMijB,GACF,OAAAj3C,KAAKsxC,IAAI,aAAc5uC,KAAKsF,SAAW,GAAGsC,SAAS,IAAI1P,UAAU,IACjEoF,KAAKsxC,IAAI,WAAY,IACrBtxC,KAAKsxC,IAAI,UAAW,IACpBtxC,KAAKsxC,IAAI,kBAAmB,IAC5BtxC,KAAKsxC,IAAI,UAAW,CAAA,GAEpBtxC,KAAK62C,mBAAgBzzC,EAEdvL,OAAOm8B,YACjB,EAGDsd,IAAK,SAAU/yC,EAAKU,GAChBe,KAAKzB,GAAOU,CACf,EACDiC,IAAK,SAAU3C,GACJ,OAAAyB,KAAKzB,IAAQ,IACvB,EACD24C,mBAAoB,WAChB,OHpDDl9C,iBACH,OAAOC,KAAKC,aAChB,CGkDeH,EACV,EACDo9C,aAAc,WACV,OH/DDn9C,iBACIC,OAAAA,KAAK8S,SAASqqC,MACzB,CG6DerqC,EACV,EACDsqC,QAAS,GACTtjC,SAAU,GACVujC,aAAc,WACV,OAAOt3C,KAAK+T,QACf,EAEDwjC,WAAAA,GACQ,OAAAv3C,KAAK62C,eAAiB72C,KAAK62C,cAAch4C,SAI7CmB,KAAK62C,cAAgB72C,KAAK+T,SAASjd,QAAO,CAAC0gD,EAAK17C,IACrC07C,EAAIC,OAAO37C,EAAQiY,WAC3B,KALQ/T,KAAK62C,aAQnB,EAEDa,qBAAsB,UAAYC,SAAAA,GAAW,GAAS,IAC5CC,MAAAA,EAAkB53C,KAAKkB,IAAI,mBAC3B22C,EAAkB9B,GAAkBE,IACpC6B,GAA2BF,GAmMzC,SAAoCP,EAAU,IACnC,MAAA,CAACv7C,EAAS+J,EAAOkO,IAGhBsjC,EAAQx1C,OAAMhL,GACHkhD,GAAuBj8C,EAASjF,MACrCkd,EAASzC,WAAUwJ,GAAKA,EAAE9d,KAAOlB,EAAQkB,OAAQ6I,CAGnE,CA3McmyC,CAA2BJ,GAC3BK,EAAej4C,KAAKu3C,cAAc1gD,OAAOghD,GACzCK,EAAcl4C,KAAKkB,IAAI,gBAAkB,CAAA,EAE/C,OAAOy2C,EAwPf,SAAsB5jC,GAAYxV,IAAAA,EAAK45C,MAAAA,IACnC,MAAMC,EAfV,UAAwB75C,IAAAA,EAAK45C,MAAAA,IACzB,MAAME,EAAwB,QAAVF,EAEb,MAAA,CAACG,EAAGC,IACHD,EAAE/5C,GAAOg6C,EAAEh6C,GACJ85C,KAAmB,EAE1BC,EAAE/5C,GAAOg6C,EAAEh6C,GACJ85C,EAAc,GAElB,EAAA,CAEf,CAGmBG,CAAa,CAAEj6C,IAAAA,EAAK45C,MAAAA,IAC5B,MAAA,IACApkC,EAASld,QAAOikB,GAAKA,EAAEd,UAASy+B,KAAKL,MACrCrkC,EAASld,QAAOikB,IAAMA,EAAEd,UAASy+B,KAAKL,GAEjD,CA9P0BM,CAAaT,EAAcC,GAAeD,CAC/D,EACDU,sBAAuB,WACnB,OAAO34C,KAAK03C,qBAAqB,CAAEC,UAAU,IAAS94C,MACzD,EAOD+5C,cAAe,SAAUC,EAAiBC,GAAU,GAC1CjiD,MAAAA,EAASmJ,KAAKkB,IAAI,WAAW1K,MAAKuiD,GAAKA,EAAEx6C,MAAQs6C,EAAgBt6C,MAElE1H,IAILmiD,GACIh5C,KAAKkB,IAAI,mBACTrK,EACAgiD,EAAgB55C,MAChB45C,EAAgBp4C,UAGhBs1C,GAAkBE,KAClBj2C,KAAKi5C,oBAGTH,GAAW94C,KAAK+lB,OACnB,EACDmzB,qBAAAA,CAAsB36C,EAAK46C,EAAkBlI,OACzC,MAAMp6C,EAASmJ,KAAKkB,IAAI,WAAW1K,MAAKuiD,GAAKA,EAAEx6C,MAAQA,IACjD66C,EAAkBp5C,KAAKkB,IAAI,mBAEjCi4C,EAAgBvzC,SAAQ,CAACnF,EAAUxB,KACLm6C,EAAgB5iD,MACtCuiD,GAAKA,EAAEx6C,MAAQ1H,EAAO0H,KAAO86C,GAAmBN,EAAG95C,MAG9BwB,GACzBu4C,GAAeI,EAAiBviD,EAAQoI,EAAOwB,EAAQ,IAG3DT,KAAKi5C,oBACLj5C,KAAK+lB,MACR,EACDuzB,yBAA0B,WACtB,OAAOt5C,KAAKkB,IAAI,mBAAmBxE,KAAI7F,IAC7B,MAAE0H,IAAKg7C,EAAWt6C,MAAOu6C,GAAgB3iD,EACzC4iD,EAAcz5C,KAAKkB,IAAI,WAAW1K,MAAKuiD,GAAKA,EAAEx6C,MAAQg7C,IACtDG,EAAcD,GAAaE,OAAOnjD,MAAKojD,GAAKA,EAAE36C,QAAUu6C,KAAcl5C,MACrE,MAAA,CACHu5C,cAAeJ,GAAaK,MAC5Bx5C,MAAOo5C,EACPn7C,IAAKg7C,EACLt6C,MAAOu6C,KAGlB,EACDO,qBAAsB,WAClB,OAAO/5C,KAAKkB,IAAI,oBAAoBrC,QAAU,CACjD,EAEDm7C,0BAA2B,WACjB3C,MAAAA,EAAU,CAACr3C,KAAKkB,IAAI,kBAAmBlB,KAAKkB,IAAI,oBACtD,OAAO+I,EAAsBotC,EAChC,EACD4C,aAAc,WACL3I,KAAAA,IAAI,kBAAmB,IAC5BtxC,KAAKkB,IAAI,WAAW0E,SAAQ/O,IACxBA,EAAO8iD,OAAO/zC,SAAQ3G,IAClBA,EAAMwB,UAAW,EACjBxB,EAAMuwB,UAAW,CAAA,GACpB,IAEC0oB,MAAAA,EAAcl4C,KAAKkB,IAAI,eAC7Bg3C,GAAar5C,QAAUmB,KAAKsxC,IAAI,cAAe4G,EAAY,IAEvDnC,GAAkBE,KAClBj2C,KAAKi5C,oBAGTj5C,KAAK+lB,MACR,EACDkzB,iBAAAA,GACI,MAAMrB,EAAkB53C,KAAKkB,IAAI,mBAC3Bo2C,EAAet3C,KAAKu3C,cAC1Bv3C,KAAKkB,IAAI,WAAW0E,SAAQ/O,IACxBA,EAAO8iD,OAAO/zC,SAAQs0C,IAElBA,EAAWC,aAAe,KAM1B,MACMC,EAAYtC,GADQ,IAHLF,EAAgB/gD,QACjC4J,GAAYA,EAASlC,MAAQ27C,EAAWX,YAEAW,IAE5CA,EAAW1qB,UAAY8nB,EAAa9gD,KAAK4jD,EAAS,GACrD,GAER,EAEDpJ,UAAW,GACXqJ,UAAW,SAAUC,GACZtJ,KAAAA,UAAUztC,KAAK+2C,EACvB,EACDC,YAAa,SAAUC,GACnBx6C,KAAKgxC,UAAYhxC,KAAKgxC,UAAUn6C,QAAOyjD,IACnC,GAAIA,IAAOE,EACAF,OAAAA,CAAAA,GAGlB,EACDv0B,KAAM,WACGirB,KAAAA,UAAUprC,SAAQ00C,IACnBA,EAAG/0C,MAAI,GAEf,GAKJ,SAASwyC,GAAuBj8C,EAASjF,GAC/B2iD,MAAAA,EAAc3iD,EAAOoI,MACrBw7C,EAAmB3+C,EAAQjF,EAAO0iD,WAAa1iD,EAAO0H,KAC5D,cAAek8C,GACX,IAAK,SACD,OAAOA,IAAqBjB,EAChC,IAAK,SACD,OAAOriD,KAAKC,MAAM,IAAIoiD,MAAgBpxC,SAASqyC,GACnD,QACQjB,OAAAA,IAAgB/C,IACeG,GAAQ11C,IAAI,mBAAmB6S,UAAY,IAC5CtF,MAAKqM,GAAKA,EAAE9d,KAAOlB,EAAQkB,KAKtDy9C,GAAkBryC,SAASoxC,KAAgB,EAG9D,CAoBA,SAAS1B,GAA2BT,GAChC,MAAMqD,EAnBV,SAA4BrD,EAAU,IAQlC,OAAOA,EAAQvgD,QAAO,CAACC,EAAKF,KACxB,MAAM0iD,EAAY1iD,EAAO0H,IACnBo8C,EAAU5jD,EAAIwiD,IAAc,GAC3B,MAAA,IACAxiD,EACH89B,CAAC0kB,GAAY,IAAIoB,EAAS9jD,MAE/B,CAAE,EACT,CAGmB+jD,CAAmBvD,GAC5BwD,EAAQr8C,OAAOC,KAAKi8C,GAC1B,MAAO,CAAC5+C,EAAS+J,EAAOkO,IAab8mC,EAAMh5C,OAAMvE,KACNo9C,EAAOp9C,GAAM9G,MAAKK,GAEnBkhD,GAAuBj8C,EAASjF,IAChCkd,EAASzC,WAAUwJ,GAAKA,EAAE9d,KAAOlB,EAAQkB,OAAQ6I,KAKrE,CAaA,SAASwzC,GAAmBG,EAAav6C,GACrC,OAAOoG,MAAMmJ,QAAQgrC,EAAYv6C,OAC3Bu6C,EAAYv6C,MAAMoD,KAAK,OAASpD,EAChCu6C,EAAYv6C,QAAUA,CAChC,CAEA,SAAS+5C,GAAeI,EAAiBviD,EAAQoI,EAAOwB,GACpD5J,EAAO8iD,OAAO/zC,SAAQ4zC,IAECH,GAAmBG,EAAav6C,KAKnDu6C,EAAY/4C,SAAWA,EACnBA,EACA24C,EAAgB71C,KAAK,CACjBhF,IAAK1H,EAAO0H,IACZU,MAAOA,EACPY,MAAO25C,EAAY35C,OAAS,OAGhCu5C,EAAgB35C,OACZ,EACA25C,EAAgBv6C,UACbu6C,EAAgBviD,QACfikD,KAAeA,EAAUv8C,MAAQ1H,EAAO0H,KAAOu8C,EAAU77C,QAAUA,MAE3E,GAGZ,CCxUA,MAQa87C,GAAoBA,CAACC,EAAUC,KAElC,MAACC,GAAQrjD,OAAO+/B,SAASC,KAAK3d,MAAM,KAEpCzR,EAZyB0yC,EAACC,EAAK78C,EAAKU,KAC1C,MAAMo8C,EAAK,IAAIpqC,OAAO,SAAW1S,EAAM,YAAa,KAC9C+8C,OAAYF,EAAIvgD,QAAQ,KAAc,IAAM,IAClD,OAAOugD,EAAI7R,MAAM8R,GACXD,EAAI9gD,QAAQ+gD,EAAI,KAAO98C,EAAM,IAAMU,EAAQ,MAC3Cm8C,EAAME,EAAY/8C,EAAM,IAAMU,CAAAA,EAOxBk8C,CAA2BD,EAAMF,EAD/BO,mBAAmBpkD,KAAKgT,UAAU8wC,KAExCO,QAAAA,UAAU,KAAM,KAAM/yC,EAAG,EAGxBgzC,GAAiBl9C,IACpBm9C,MAAAA,EAAc7jD,OAAO+/B,SAAS+jB,OAC9Bjf,EAAQ,IAAIkf,gBAAgBF,GAAax6C,IAAI3C,GAEnD,IAAKm+B,EACM,OAAA,KAGP,IACA,OAAOvlC,KAAKC,MAAMykD,mBAAmBnf,GACxC,CAAa,MACFrlC,OAAAA,QAAAA,MAAM,kDACP,IACX,GAGEykD,GAAkB,gBAElBC,GAAkBxlD,IACd,MAAEylD,SAAAA,EAAUC,QAAAA,EAASC,UAAAA,GAAc3lD,EACzC,MAAO,QAAQylD,EAAW,GAAGE,KAAaD,IAAYH,IAAe,EAGnEK,GAAoB5lD,IAChB,MAAE6lD,WAAAA,EAAYhD,gBAAAA,GAAoB7iD,EACxC,MAAO,mBACH6lD,EAEM,IAAI,IAAItG,IAAIsD,EAAgB18C,KAAI7F,GAAUA,EAAO0H,QAAO8D,KAAK,KAC7Dy5C,IAAe,ECrB7BjkD,OAAOwkD,kBAAoBxkD,OAAOwkD,mBAAqB,CACnDC,eAAgBrL,IAChBsL,YAAa,CACTC,aAAcC,OAAOr5C,GACrBs5C,eAAgBD,OAAOr5C,GACvBu5C,iBAAkBF,OAAOr5C,KAIjC,MAAMk5C,GAAazkD,OAAOwkD,kBAAkBC,WACtCC,GAAc1kD,OAAOwkD,kBAAkBE,YAc7BK,SAAAA,GAAYn0C,EAAaiE,GACvBmwC,GAASp0C,GACjBq0C,SAAWpwC,CACrB,CAEO,SAASqwC,GAAcC,GAC1B,OAAOT,GAAYS,EACvB,CAEgBC,SAAAA,GAAcD,EAAwBzmD,GACtCymD,GAAAA,GAAY/9C,MAAQ1I,CACpC,CAEA,SAASsmD,GAASp0C,GACd,OAAK6zC,GAAWnL,IAAI1oC,IACL6oC,GAAAA,IAAI7oC,EAAK,CAAA,GAGjB6zC,GAAWp7C,IAAIuH,EAC1B,CCpEA,MAAMy0C,GAAS,IAAI52C,UAWG62C,eAAAA,GAAY10C,EAAa20C,GAAqB,GAChE,OAAOC,GAAMrjD,UACL0S,IAAAA,ED+BL,SAAqBjE,GACVo0C,OAAAA,GAASp0C,GACVq0C,QACjB,CClCmBQ,CAAkB70C,GAE7B,IAAKiE,EACG,IACOA,QAyDvB1S,eAAyByO,GACb80C,QAAAA,MAAM,qBAAsB90C,GAC9B+0C,MAAAA,QAAiBC,MAAMh1C,GAEzB,IAAC+0C,EAASE,GACJ,MAAA,IAAI5lD,MAAM,yBAAyB2Q,QAAU+0C,EAASG,UAAUH,EAASI,cAGtE,aAAMJ,EAASr1C,MAGhC,CApE6B01C,CAAUp1C,GACjBm0C,GAAYn0C,EAAKiE,SAClBrV,GAEL,YADQkmD,QAAAA,MAAM,sBAAuBlmD,EAEzC,CAGC+lD,IACDE,GAAoB,mBAAoBQ,GAAgBpxC,EAAM,wBAC9D4wC,GAAoB,eAAgBQ,GAAgBpxC,EAAM,gBAC1D4wC,GAAoB,iBAAkBQ,GAAgBpxC,EAAM,mBAAiB,GAGzF,CAiCA,SAASoxC,GAAgBpxC,EAAcswC,GAC/B,IACMe,MAAAA,EAqBd,SAAmBrxC,EAAcswC,GAGvBgB,MAAAA,EAFWd,GAAO32C,gBAAgBmG,EAAM,aAErB+T,iBAAiB,UAC1C,IAAA,MAAWw9B,KAAUD,EAAS,CACpB7uB,MAAAA,EAAU8uB,EAAO94C,aAAe,GACtC,GAAIgqB,EAAQ/mB,SAAS,aAAa40C,MAAuB7tB,OAAAA,CAC7D,CAEA,MAAM,IAAIr3B,MAAM,0BAA0BklD,KAC9C,CA/B6BkB,CAAUxxC,EAAMswC,GACrC,OAgCR,SAA4BiB,GAClBE,MAAAA,EAAQF,EAAO/jC,MAAM,MAC3B,IAAA,MAAWkkC,KAAQD,EAAO,CAChBE,MAAAA,EAAUD,EAAKnzC,OACjBozC,GAAAA,EAAQC,WAAW,mBAAoB,CACjCC,MAAAA,EAAaF,EAAQ/jD,QAAQ,kBAAmB,IAAImJ,MAAM,GAAK,GAC9DtM,OAAAA,KAAKC,MAAMmnD,EACtB,CACJ,CAEM,MAAA,IAAIzmD,MAAM,mCACpB,CA3Ce0mD,CAAmBT,GACd,MAEL36C,MACX,CACJ,CC5DA,IAAI6yB,GAAU,CAAA,EACVwoB,GAAY,CAAA,EAEhB,MAAMzC,GAAWzlD,GAETA,EAAK2K,IAAI,eAAe3C,MAAQhI,EAAK2K,IAAI,eAAe,GAAG3C,KAC3DhI,EAAK2K,IAAI,eAAei3C,QAAU5hD,EAAK2K,IAAI,eAAe,GAAGi3C,MAI/DiE,GAAa7lD,GAAwC,IAAhCA,EAAKwjD,uBAEjB2E,GAAA,CACX31C,OAAQ,CACJ41C,QAAS,SAAUnmD,EAAGomD,GACZ,MAAE7H,QAAAA,EAAS8H,iBAAAA,GAAqBrmD,EAAEP,OAAOgH,MAE/Cw/C,GAAYI,EAGNnM,MAAAA,EAAOkE,GAAQlE,KAAKqE,GAC1BH,GAAQtF,IAAI,UAAWyF,GAAW,MAClCH,GAAQtF,IAAI,aAAcz5C,OAAOgP,YACjC+vC,GAAQtF,IAAI,cAAez5C,OAAO0rB,aAGlC,MAAM9pB,EAAWm9C,GAAQO,eACnBx7C,EAAiBi7C,GAAQM,qBAEvBngD,QAAAA,IAAI,CAAC27C,EAAMj5C,EAAUkC,IACxB8iB,MAAKk7B,IACF1jB,GAAU0jB,EAAO,GACjB/C,GAAQtF,IAAI,WAAYqI,EAAO,GAAGlgD,UAClCm9C,GAAQtF,IAAI,iBAAkBqI,EAAO,IACrCiF,EAAgB,IAAI5mD,YAAY,iBAAgB,IAEnD2mB,OAAMqD,IACH1qB,QAAQD,MAAM2qB,GACd48B,EAAgB,IAAI5mD,YAAY,cAAe,CAAEC,OAAQ,CAAE+pB,IAAAA,KAAQ,IAGvE+zB,GAAkBE,KDpB3B,SAAsBp+C,GACzBwlD,GAAM,KACI3wC,MAAAA,EAAO7U,EAAOO,SAASkiC,gBAAgBv5B,UAE7Cu8C,GAAoB,mBAAoBQ,GAAgBpxC,EAAM,wBAC9D4wC,GAAoB,eAAgBQ,GAAgBpxC,EAAM,gBAC1D4wC,GAAoB,iBAAkBQ,GAAgBpxC,EAAM,mBAIxD4wC,GAAoB,oBAAoBr+C,QACvCq+C,GAAoB,gBAAgBr+C,OACjCq+C,GAAoB,kBAAkBr+C,QAE1Cq+C,GAAkBzlD,EAAO+/B,SAASC,KAAMnrB,EAAI,GAGxD,CCIgBoyC,CAAajnD,OAErB,GAEJknD,SAAU,CACN,aAAMJ,CAAQnmD,EAAGomD,GACP,MAAE7H,QAAAA,EAAStuC,IAAAA,GAAQjQ,EAAEP,OAAOgH,MAE9B1I,IAAAA,EACA,UACM4mD,GAAY10C,GAClBlS,EDZL+mD,GAAoB,gBCYUr+C,KAC5B,OAAQ+iB,GACL1qB,OAAAA,QAAQD,MAAM2qB,GACP48B,EAAgB,IAAI5mD,YAAY,cAAe,CAAEC,OAAQ,CAAE+pB,IAAAA,KACtE,CAEOiU,OAAAA,QAAUx5B,QAAQ0lB,QAAQ,CAC7BznB,OAAQ,UACRnE,KAAAA,IA6JhB,SAA4BkS,GACpB,IACA,MAAMu2C,EAAS,IAAIC,IAAIpnD,OAAO+/B,UAC9BonB,EAAOE,SAAWz2C,EAClB5Q,OAAOsnD,QAAQ3D,UAAU,CAAE,EAAE,GAAIwD,EAEpC,OAAQ3nD,GACGA,QAAAA,MAAM,iCAAkCA,EACpD,CACJ,CAnKY+nD,CAAmB32C,GAEf,IAEA,MAAO42C,EAAO5lD,EAAUkC,SAAwBc,QAAQ1F,IAAI,CACxD6/C,GAAQK,OAAOF,GACfH,GAAQO,eACRP,GAAQM,uBAEZjhB,GAAUopB,EACVzI,GAAQtF,IAAI,UAAWyF,GAAW,MAClCH,GAAQtF,IAAI,aAAcz5C,OAAOgP,YACjC+vC,GAAQtF,IAAI,cAAez5C,OAAO0rB,aAClCqzB,GAAQtF,IAAI,WAAY73C,EAASA,UACjCm9C,GAAQtF,IAAI,iBAAkB31C,GAC9BijD,EAAgB,IAAI5mD,YAAY,kBAChC4+C,GAAQ7wB,MACX,OAAQ1uB,GACLC,QAAQD,MAAMA,GACdunD,EAAgB,IAAI5mD,YAAY,cAAe,CAAEC,OAAQ,CAAEZ,MAAAA,KAC/D,CACJ,GAEJioD,cAAe,CACXC,UAAW,SAAU/mD,GACVimD,OAAAA,GAAUa,cAAc9mD,EACnC,GAEJgnD,YAAa,CACTD,UAAW,SAAU/mD,GACVimD,OAAAA,GAAUgB,UAAUjnD,EAC/B,GAEJknD,YAAa,CAET,aAAMf,CAAQnmD,EAAGomD,GACP,MACFe,eAAAA,EACAC,eAAAA,EACAC,gBAAAA,EACAhuC,iBAAAA,EACAiuC,sBAAAA,GACAtnD,EAAEP,OAAOgH,MAEP8gD,EAAyBD,EAAsBjuC,GAcrD,GAPAmuC,EANoBJ,EAChB3pB,GACApkB,EACAkuC,GAAwBE,iBAUxBF,GAAwBG,wBAAyB,OAC3CH,EAAuBI,eAC7B,MAAMC,EAAUR,EACZ3pB,GACApkB,EACAkuC,GAAwBE,gBAE5BrJ,GAAQtF,IAAI,iBAAkByO,EAAuBE,gBACrDD,EAAUI,GACVxJ,GAAQ7wB,MACZ,CAESi6B,SAAAA,EAAUzpD,EAAO,KA+FtC,SAA0BA,EAAMsb,GAC5B+kC,GAAQtF,IAAI,sBAAuB/6C,EAAK8pD,qBACxCzJ,GAAQtF,IACJ,oBACA/6C,EAAK8pD,qBACCxpD,QAAO6X,GAAQA,EAAK4xC,aAAY,IAChCtjD,IAAIkd,MAAM,KACXqmC,IAAG,IAAO,MAGnB3J,GAAQtF,IAAI,WAAY/6C,EAAKqa,YAC7BgmC,GAAQtF,IAAI,eAAgB/6C,EAAKiqD,cACjC5J,GAAQtF,IAAI,YAAa/6C,EAAKkqD,WAC9B7J,GAAQtF,IAAI,UAAW/6C,EAAK2B,SAC5B0+C,GAAQtF,IAAI,uBAAwBz/B,EAAiBE,SAAS2uC,sBAC9D9J,GAAQtF,IAAI,UAAWz/B,EAAiBE,SACxC6kC,GAAQtF,IAAI,eAAgB/6C,EAAKoqD,cACjC/J,GAAQtF,IAAI,WCtQT,SAAyBz/B,GAEtB,MACF2V,YAAAA,EACAC,cAAAA,EACArJ,kBAAAA,EAAoB,KACpBsJ,kBAAAA,GACA7V,EAEJ,IAAKuM,EAAmB,CACd,MAAExH,SAAAA,EAAW,MAAS/E,EACrB+E,OAAAA,CACX,CAEO,MAAA,CACH5Z,GAAIwqB,EACJtrB,KAAMurB,EACN7Z,SAAU8Z,EACVzP,SAAUmG,EAElB,CDkP4BwiC,CAAgB/uC,GAC5C,EAhHgBgvC,CAAiBtqD,EAAMsb,GAkHvC,SAAsBtb,GAAQsb,iBAAAA,EAAkBguC,gBAAAA,EAAiBF,eAAAA,IAC7D,MAAMlH,EAAOoH,EAAgBhuC,GACvBwlC,EAAUsI,EACZ/I,GAAQ11C,IAAI,YACZ2Q,EACAtb,EAAKuqD,oBACLvqD,EAAKiqD,aACL,CACI7kD,eAAgBi7C,GAAQ11C,IAAI,kBAC5BzH,SAAUm9C,GAAQ11C,IAAI,cAI9B01C,GAAQtF,IAAI,UAAW+F,GACvBT,GAAQtF,IAAI,cAAemH,GAC3B7B,GAAQtF,IAAI,cAAemH,EAAK,GACpC,CAjIgBsI,CAAaxqD,EAAM,CAAEsb,iBAAAA,EAAkBguC,gBAAAA,EAAiBF,eAAAA,IAmIxE,WACUqB,MAAAA,EAAavF,GAAe/E,IAC9BsK,GAAAA,GAAcA,EAAWniD,OAAS,EAAG,CACrC,MAAMoiD,EH9MoBC,EAACC,EAAQ5qD,KACvC,MAAM6qD,EAAY,GAClB7qD,OAAAA,EAAKqP,SAAQqU,IACTknC,EAAOv7C,SAAQy7C,IACPA,EAAW9iD,MAAQ0b,EAAK1b,KACxB8iD,EAAW1H,OAAO/zC,SAAQ3G,IAClBgb,EAAKhb,QAAUA,EAAMA,OACrBmiD,EAAU79C,KAAK,CACXhF,IAAK8iD,EAAW9iD,IAChBU,MAAOA,EAAMA,MACbwB,UAAU,GACb,GAER,GAER,IAGE2gD,CAAAA,EG4LgBF,CAAmBtK,GAAQ11C,IAAI,WAAY8/C,GAC1DC,EAAWpiD,OAAS,GACpBoiD,EAAWr7C,SAAQ,CAAC/O,EAAQgP,KAClBy7C,MAAAA,EAASz7C,IAAUo7C,EAAWpiD,OAAS,EAC7C+3C,GAAQgC,cAAc/hD,EAAQyqD,EAAM,GAGhD,CAEMC,MAAAA,EAAU9F,GAAe9E,IAC/B,GAAI4K,EAAS,CACT,MAAMC,EHrMkBC,EAACN,EAAQ5qD,IAC9B,IAAI4qD,GAAQtqD,QAAOojB,GAAQA,EAAK1b,MAAQhI,EAAKgI,KAAO0b,EAAKk+B,QAAU5hD,EAAK4hD,QGoM1DsJ,CAAiB7K,GAAQ11C,IAAI,eAAgBqgD,GAC1DC,EAAS3iD,OAAS,GAClB+3C,GAAQtF,IAAI,cAAekQ,EAAS,GAE5C,CACJ,CArJgBE,GAuJhB,WACQ3L,GAAAA,GAAkBE,IAAmB,CACrCW,GAAQqC,oBAER,MAAM0I,EAAiB/K,GAClB11C,IAAI,uBACJ1K,MAAKkY,GAAQA,EAAKjG,MAAQ5Q,OAAO+/B,SAASsnB,WAC3CyC,GACAxE,GAAYwE,EAAel5C,KAAK,EAExC,CACJ,CAjKgBm5C,GHlFSC,MACfjrC,MAAAA,EAAWggC,GAAQ11C,IAAI,YACvB2D,EAAOhN,OAAOO,SAASq9B,eAAeygB,IACxCt/B,GACAyW,GAAaxoB,EAAM+R,EAAQ,EG+EnBirC,GACAjD,EAAgB,IAAI5mD,YAAY,sBACpC,CACJ,GAEJ8pD,mBAAoB,CAChBvC,UAAW,SAAU/mD,GACjB,OAAIwjD,GAASpF,KAAYwF,GAAWxF,IACzB6H,GAAUsD,oBAAoBvpD,GAE9BimD,GAAUuD,aAAaxpD,EAEtC,GAEJypD,iBAAkB,CACd1C,UAAW,SAAU/mD,GACVimD,OAAAA,GAAUgB,UAAUjnD,EAC/B,GAEJ0pD,SAAU,CACNvD,QAASA,CAACnmD,EAAGomD,KACHxF,MAAAA,EAAkBxC,GAAQ11C,IAAI,mBAEpC65C,GAAkBrE,GAA6BE,GAAQ11C,IAAI,oBAC3D65C,GAAkBpE,GAA0B,CACxCp4C,IAAKq4C,GAAQ11C,IAAI,eAAe3C,IAChC45C,MAAOvB,GAAQ11C,IAAI,eAAei3C,QAGtCyG,EAAgB,IAAI5mD,YAAY,uBAG5B+9C,GAAkBE,KAAqBmD,EAAgBv6C,QACvDwc,GACI,kBtDqJb,SAAsC+9B,GACnC+I,MAAAA,EAkDV,SAA8B/I,EAAkB,IACrCA,OAAAA,EAAgBtiD,QAAO,CAACqrD,GAAW5jD,IAAAA,EAAKU,MAAAA,MACtCkjD,EAAQ5jD,KAAM4jD,EAAQ5jD,GAAO,CAAEA,IAAAA,EAAKo7C,OAAQ,KACjDwI,EAAQ5jD,GAAKo7C,OAAOp2C,KAAKtE,EAAMmjD,WAAW,IAAK,MACxCD,IACR,CAAE,EACT,CAxDoBE,CAAqBjJ,GAC/BkJ,EAAY9jD,OAAOC,KAAK0jD,GAOvB,MAAA,CANsBG,EAAUjgD,KAAK,KAAKzH,UAAU,EAAG,IAChC0nD,EACzB5lD,KAAI6B,GAAO4jD,EAAQ5jD,GAAKo7C,OAAOj9C,KAAIuC,GAASA,EAAMib,MAAM,KAAKqmC,IAAG,KAAKl+C,KAAK,OAC1EA,KAAK,KACLzH,UAAU,EAAG,IAGtB,CsD9JuB2nD,CAA6BnJ,GAChC,KACA5gD,EAAEP,OAAOgH,MACb,GAIZujD,OAAQ,CACJ7D,QAASA,CAACnmD,EAAGomD,KACT7D,GAAkBrE,GAA6BE,GAAQ11C,IAAI,oBAC3D65C,GAAkBpE,GAA0B,CACxCp4C,IAAKq4C,GAAQ11C,IAAI,eAAe3C,IAChC45C,MAAOvB,GAAQ11C,IAAI,eAAei3C,QAGtCyG,EAAgB,IAAI5mD,YAAY,uBHvJZyqD,EAAClsD,EAAO,MAC9B,MAAEylD,SAAAA,EAAUI,WAAAA,GAAe7lD,EAC3B+hB,EAAc,mBAUpBtB,GARKglC,GAAaI,EAQN,CACR9jC,YAAAA,EACAU,WAAY,CAAC+iC,GAAgBxlD,GAAO4lD,GAAkB5lD,IAAO8L,KAAK,MATtD,CACRiW,YAAAA,EACAU,WAAY8iC,IAQnB,EG0IO2G,CAAiB,CACbzG,SAAUA,GAASpF,IACnBwF,WAAYA,GAAWxF,IACvBqF,QAASrF,GAAQ11C,IAAI,eAAe3C,IACpC29C,UAAWtF,GAAQ11C,IAAI,eAAei3C,MACtCiB,gBAAiBxC,GAAQ11C,IAAI,oBAChC,GAGTwhD,aAAc,CACV/D,QAAS,SAAUnmD,EAAGomD,GAClBA,EAAgB,IAAI5mD,YAAY,sBAAuB,CAAEC,OAAQ,CAAEO,EAAAA,KAEvE,GAEJmqD,oBAAqB,CACjBpD,UAAW,SAAU/mD,GACVimD,OAAAA,GAAUmE,eAAepqD,EACpC,GAEJqqD,kBAAmB,CACftD,UAAW,SAAU/mD,GACVimD,OAAAA,GAAUgB,UAAUjnD,EAC/B,IEpOR,MAAesqD,GAAA,CAACC,EAAiBprC,EAAWqrC,EAAU,QAClDC,GACI,IAAIjrD,YAAY+qD,EAAiB,CAC7B9qD,OAAQ,CACJgH,MAAO0Y,EACP2iC,GAAI0I,KAGhB,EAGEC,GAA0BlrD,IAC5B2mD,GAAU3mD,EAAMuF,OAAOqhD,QAAQ5mD,EAAO6mD,GAAe,EAGnDA,GAAkBpmD,IACpBkmD,GAAUlmD,EAAE8E,OAAOiiD,UAAU/mD,EAAC,YCV9B0qD,GAAA,IAAAC,QAyCJliD,eAAeC,IAAI,2BACfD,eAAeE,OAAO,yBA3C1B,cAA2CgD,EAGvC9C,WAAAA,WAFAonB,EAAAzoB,KAAAkjD,GRL+B,wBQS3BljD,KAAKojD,oBAAsB,KAC3BxM,GAAQyD,UAAUr6C,KAAKqjD,iBAAiBjhD,KAAKpC,OAC7CA,KAAKsjD,kBAAoBtjD,KAAKujD,aAAanhD,KAAKpC,KACpD,CAEAsE,OAAAA,GACI,MAAM/N,EAAO6B,SAASq9B,eAAe0gB,KAAe32B,aAAa,QAC7DjpB,IACAyJ,KAAKoE,SAAW,2DAEFo/C,EAAAxjD,KAAKkjD,2FAEHh5C,EAAW3T,qBAEnC,CAEAiO,OAAAA,GACIxE,KAAKyjD,WAAarrD,SAASq9B,eAAe+tB,EAAAxjD,KAAKkjD,KAC/CljD,KAAKyjD,YAAYtjD,iBAAiBnH,EAAsBgH,KAAKsjD,kBACjE,CAEAD,gBAAAA,GACU,MAAE9kD,IAAAA,EAAK45C,MAAAA,GAAUvB,GAAQ11C,IAAI,eAC9BuiD,KAAAA,YAAY5wB,YAAY,GAAGt0B,IAAMyB,KAAKojD,sBAAsBjL,IACrE,CAEAoL,YAAAA,CAAa/qD,GACH,MAAC+F,EAAK45C,GAAS3/C,EAAEP,OAAOwI,SAASxB,MAAMib,MAAMla,KAAKojD,qBACxDxM,GAAQtF,IAAI,cAAe,CAAE/yC,IAAAA,EAAK45C,MAAAA,GACtC,CAEAzxC,SAAAA,GACS+8C,KAAAA,YAAYjsC,oBAAoBxe,EAAsBgH,KAAKsjD,mBAChE1M,GAAQ2D,YAAYv6C,KAAKqjD,iBAC7B,ICvCAK,GAAA,IAAAP,QAiIJliD,eAAeC,IAAI,6BACfD,eAAeE,OAAO,2BAnI1B,cAAoCgD,EAGhC9C,WAAAA,WAFAonB,EAAAzoB,KAAA0jD,GAAW,IA4DXC,EAAAA,KAAaA,cAAAA,CAACrmD,EAAM2B,IAcF,IAbd23C,GAAQc,qBAAqB,CAAEC,UAAU,IAAS9gD,QAAOiF,KAChDA,EAAQwB,KAGgB,iBAAlBxB,EAAQwB,GACRxB,EAAQwB,KAAU2B,EACO,iBAAlBnD,EAAQwB,IAAuC,iBAAV2B,EAC5CA,IAAUnD,EAAQwB,GACO,iBAAlBxB,EAAQwB,GACfnG,KAAKC,MAAM,IAAM6H,EAAQ,KAAKmJ,SAAStM,EAAQwB,MAE7CxB,EAAQwB,GAAM8K,SAASnJ,MAErCJ,SAEPk2C,EAAAA,KAAYA,aAAAA,CAACx2C,EAAKU,IACd23C,GACK11C,IAAI,mBACJrK,QAAOikD,GAAaA,EAAUv8C,MAAQA,GAAOu8C,EAAU77C,QAAUA,IAAOJ,OAAS,IA3EtF+3C,GAAQyD,UAAUr6C,KAAK4jD,eAAexhD,KAAKpC,MAC/C,CAEA4jD,cAAAA,GACQ7N,GAAkBE,KAEduN,EAAAxjD,KAAK0jD,MAAa9M,GAAQ11C,IAAI,aAC9BlB,KAAKsE,UACLtE,KAAKC,QAAO,GACZD,KAAKwE,WAIbxE,KAAKygB,iBAAiB,WAAW7a,SAAQ+uC,IAUrC,GATAA,EAAK/zC,aACD,WACA,GAAKZ,KAAK2jD,WAAWhP,EAAKjiB,QAAQ6mB,UAAW5E,EAAKjiB,QAAQ8mB,cAE9D7E,EAAK/zC,aACD,UACA,GAAKZ,KAAK+0C,UAAUJ,EAAKjiB,QAAQ6mB,UAAW5E,EAAKjiB,QAAQ8mB,cAGzDzD,GAAkBE,IAAmB,CACrC,MAAM4N,EAAUlP,EAAKpoC,cAAc,cAC7BjM,EAAQN,KAAK8jD,SAASnP,EAAKjiB,QAAQ6mB,UAAW5E,EAAKjiB,QAAQ8mB,aACjEqK,EAAQ1+C,YAAc7E,EACtBujD,EAAQjjD,aAAa,UAAWN,EACpC,IAER,CAEAgE,OAAAA,GACIy/C,EAAA/jD,KAAK0jD,GAAW9M,GAAQ11C,IAAI,YAE5BlB,KAAKoE,SACDo/C,EAAAxjD,KAAK0jD,KACChnD,KAAI7F,GACK,GAAGA,EAAOmtD,mCACnBntD,EAAO8iD,OACJj9C,KAAIuC,IACDA,EAAMuwB,SAAWxvB,KAAK2jD,WAAW9sD,EAAO0H,IAAKU,EAAMA,OAC5CA,EAAMgB,YAEhBoC,KAAK,oBACZxL,EAAOotD,kBAEJ5hD,KAAK,KAAO,EACzB,CAEAmC,OAAAA,GACIxE,KAAKygB,iBAAiB,WAAW7a,SAAQ+uC,IACrCA,EAAKx0C,iBAAiB,SAAUH,KAAKkkD,gBAAe,GAE5D,CAuBAJ,QAAAA,CAASvlD,EAAKU,GACNu6C,IAAAA,EACJ5C,GAAQ11C,IAAI,WAAWuN,MAAKwL,GACpBA,EAAK1b,MAAQA,IAGjBi7C,EAAcv/B,EAAK0/B,OAAOnjD,MAAK2tD,GACI,iBAApBA,EAAUllD,MACVklD,EAAUllD,QAAUA,EACO,iBAApBklD,EAAUllD,OAAuC,iBAAVA,EAC9CA,IAAUklD,EAAUllD,MACO,iBAApBklD,EAAUllD,MACjB9H,KAAKC,MAAM,IAAM6H,EAAQ,KAAKmJ,SAAS+7C,EAAUllD,SAE/CklD,EAAUllD,MAAMmJ,SAASnJ,OAGtCu6C,QAXJA,KAgBJ,MAAM/zC,EAAQ+zC,GAAaW,aAAe,KAAKX,EAAYW,gBAAkB,GAC7E,MAAO,GAAGX,EAAYl5C,QAAQmF,GAClC,CAEAiB,SAAAA,GACIkwC,GAAQ2D,YAAYv6C,KAAK4jD,gBAEzB5jD,KAAKygB,iBAAiB,WAAW7a,SAAQ+uC,IACrCA,EAAKn9B,oBAAoB,SAAUxX,KAAKkkD,gBAAe,GAE/D,CAEAA,eAAAA,CAAgB1rD,GACZA,EAAEsoB,kBAEF,MAAMjqB,EAAS,CACX0H,IAAK/F,EAAEsR,OAAOpE,WAAWgtB,QAAQ6mB,UACjCt6C,MAAOzG,EAAEsR,OAAOpE,WAAWgtB,QAAQ8mB,YACnC/4C,SAAUjI,EAAEsR,OAAOylB,QACnBjvB,MAAO9H,EAAEsR,OAAOpE,WAAWgtB,QAAQgnB,aAGvC9C,GAAQgC,cAAc/hD,EAC1B,IC/HJ,MAAMutD,GAAsB,QAkH5BnjD,eAAeC,IAAI,4BACfD,eAAeE,OAAO,0BAjH1B,cAAmCgD,EAC/B9C,WAAAA,GACIyC,QACA8yC,GAAQyD,UAAUr6C,KAAKqjD,iBAAiBjhD,KAAKpC,MACjD,CAEAsE,OAAAA,GACUk8C,MAAAA,EAAe5J,GAAQ4J,cACrB6D,6BAAAA,GAAiCrkD,KAAKpJ,MAC9CoJ,KAAKoE,SAAW,sNAONo8C,EAAa,sQAMK6D,oDAIhC,CAEAC,qBAAAA,GACU,MAAEC,wBAAAA,EAAyBC,4BAAAA,GAAgCxkD,KAAKpJ,MAChE+hD,EAAwB/B,GAAQ+B,wBAGtC,OAD8B,IAA1BA,EAA8B6L,EAA8BD,IAClDjqD,QAAQ,kBAAmB,GAAKq+C,EAClD,CAEAn0C,OAAAA,GACS6+C,KAAAA,mBACLrjD,KAAKuM,cAAc,+BAA+BpM,iBAAiB,SAAS,KAClEskD,MAAAA,EAAkBzkD,KAAKykD,kBAC7BztC,GAAY,CACRa,WAAW,EACX9f,MAAO,aACPygB,YAAa,eACbqD,YAAa4oC,EAAgB5J,MAC7B/+B,cAAe2oC,EAAgB9K,SAEnC/C,GAAQqD,eACRj6C,KAAKY,aAAa,eAAgB,OAAM,IAE5CZ,KAAKuM,cAAc,iCAAiCpM,iBAAiB,SAAS,KAC1EtI,OAAOJ,cAAc,IAAIO,YAAYY,IAC/B6rD,MAAAA,EAAkBzkD,KAAKykD,kBAC7BztC,GAAY,CACRa,WAAW,EACX9f,MAAO,aACPygB,YAAa,eACbqD,YAAa4oC,EAAgB5J,MAC7B/+B,cAAe2oC,EAAgB9K,QAClC,GAET,CAEA8K,eAAAA,GACI,IAAI5J,EAAQ,GACRlB,EAAS,GACPP,MAAAA,EAAkBxC,GAAQ11C,IAAI,mBACpC,GAAIk4C,GAAmBA,EAAgBv6C,OACnC,IAAA,IAASgJ,EAAI,EAAGA,EAAIuxC,EAAgBv6C,OAAQgJ,IAAK,CACvChR,MAAAA,EAASuiD,EAAgBvxC,GACzB5I,EACFpI,EAAOoI,MAAMpE,QAAQupD,KAAuB,EACtCvtD,EAAOoI,MAAMrE,UACT/D,EAAOoI,MAAMpE,QAAQupD,IAAuBA,GAEhDvtD,EAAOoI,MACb47C,EAAMhgD,QAAQhE,EAAO0H,MACrBo7C,EAAAA,EAAOkB,EAAMhgD,QAAQhE,EAAO0H,OAAS,IAAMU,GAE3C47C,EAAMt3C,KAAK1M,EAAO0H,KAClBo7C,EAAOp2C,KAAKtE,GAEpB,CAGG,MAAA,CACH47C,MAAOA,EAAMx4C,KAAK,KAClBs3C,OAAQA,EAAOt3C,KAAK,KAE5B,CAEAghD,gBAAAA,GACI,MAAM1K,EAAwB/B,GAAQ+B,wBAChCoB,EAAuBnD,GAAQmD,uBAE/B2K,EAAW1kD,KAAKuM,cAAc,8BAC9Bo4C,EAAY3kD,KAAKuM,cAAc,gCAErCm4C,EAAS9lC,MAAMgmC,WACX7K,GAAwBA,EAAuB,EAAI,UAAY,SACnE4K,EAAU/lC,MAAMgmC,WACZjM,GAAyBA,EAAwB,EAAI,UAAY,SAErEgM,EAAUp4C,cAAc,QAAQpH,YAAcnF,KAAKskD,wBACnDK,EAAUp4C,cAAc,UAAU3L,aAAa,aAAcZ,KAAKskD,wBACtE,CAEA59C,SAAAA,GACIkwC,GAAQ2D,YAAYv6C,KAAK4jD,eAC7B,IClDJ3iD,eAAeC,IAAI,qBAAuBD,eAAeE,OAAO,mBAzDhE,cAA6BgD,EACzBG,OAAAA,GACS1N,KAAAA,MAAQoJ,KAAKqE,aACdjM,SAASq9B,eAAeygB,IAAsBj2B,cAAc3pB,YAG1D,MACFiuD,wBAAAA,EAA0B,8BAC1BM,6BAAAA,EAA+B,YAC/BL,4BAAAA,EAA8B,iBAC9BH,6BAAAA,EAA+B,8BAC/BrkD,KAAKpJ,MAAMigB,aAAe7W,KAAKpJ,MAI7Bw7C,EACFwE,GAAQ/vC,WAAanO,EACf,oDACA,GAEVsH,KAAKoE,SAAW,qBACNguC,gIAGgCwE,GAAQ4J,aAAa,0XAQhB+D,iEACKM,gEACDL,iEACCH,gHAIxD,CAEA7/C,OAAAA,GACWrE,OAAAA,iBAAiBtH,EAAoBmH,KAAK8kD,gBACrD,CAEAp+C,SAAAA,GACW8Q,OAAAA,oBAAoB3e,EAAoBmH,KAAK8kD,gBACxD,CAEAA,eAAAA,CAAgBtsD,GACZA,EAAEsoB,kBACEtoB,EAAEP,OAAO+E,KAAOo5C,IAChB0M,GAAe,WAEvB,ICVJ7hD,eAAeC,IAAI,mBAAqBD,eAAeE,OAAO,iBAjD9D,cAA2BgD,EAA3B,WAAA9C,GAAAyC,SAAAihD,WACIC,EAAAA,KAAgB,gBAAA,KAAA,CAEhB,6BAAW9+B,GACP,MAAO,CAAC,sBACZ,CAEAkC,wBAAAA,CAAyBlsB,EAAM+oD,EAAQC,GACrB,MAAVA,GAAkBA,EAAOrmD,OAAS,GAAKqmD,IAAWD,GACrC,wBAAT/oD,GACA8D,KAAKmlD,oBAAoBD,EAGrC,CAEA5gD,OAAAA,GACItE,KAAKoE,SAAW,yFAAyFpE,KAAKpJ,MAAMwuD,2BACxH,CAEA5gD,OAAAA,GACIpM,SAASq9B,eAAe,cAAct1B,iBAAiB,SAAS,KAC5D2iD,GAAe,eAAgB,CAAA,GAC/B9rC,GAAY,CACRa,WAAW,EACX9f,MAAO,aACPygB,YAAa,eAChB,IAGLxY,KAAKmxB,cAAgBnxB,KAAKuM,cAAc,iBACxCvM,KAAKglD,cAAgB5sD,SAASuI,cAAc,OAC5CX,KAAKglD,cAAcnkD,UAAUC,IAAI,gBACjCd,KAAKglD,cAAcnkD,UAAUC,IAAI,iBACjCd,KAAKglD,cAAcjkD,UAAY,IAC/Bf,KAAKijC,WAAWA,WAAWn9B,YAAY9F,KAAKglD,cAChD,CAEAG,mBAAAA,CAAoBpa,GAChB,IAAK/qC,KAAKglD,cACC,OAAA,KAGXhlD,KAAKglD,cAAcjkD,UAAYgqC,EACnB,MAAZA,EACM/qC,KAAKmxB,cAActwB,UAAU0W,OAAO,gBACpCvX,KAAKmxB,cAActwB,UAAUC,IAAI,eAC3C,IC5CJ,MAAMukD,GAAsB,kCAqH5BpkD,eAAeC,IAAI,qBAAuBD,eAAeE,OAAO,mBAnHhE,cAA6BgD,EACzB9C,WAAAA,GACIyC,QACA9D,KAAKw2B,kBAAoBx2B,KAAKy2B,aAAar0B,KAAKpC,KACpD,CAEAsE,OAAAA,GACSnE,KAAAA,iBAAiBpH,EAAoBiH,KAAKw2B,mBAE/C,MAAM4d,EAAa,CACfriC,QAAS,CACL/K,OAAQ,CACJygC,gBAAiB,OACjBD,WAAY,OACZyK,iBAAkB,KAClBC,WAAY,IACZmC,gBAAiB,QACjBtC,YAAa,QACb1L,SAAU,QACVwN,UAAW,OACX/B,kBAAmB,OACnBgC,gBAAiB,UACjBC,gBAAiB,IACjB/B,uBAAwB,eAE5B9qC,OAAQ,CACJugC,gBAAiB,OACjBD,WAAY,OACZyK,iBAAkB,KAClBC,WAAY,IACZmC,gBAAiB,OACjBtC,YAAa,QACb1L,SAAU,QACVwN,UAAW,OACX/B,kBAAmB,OACnBgC,gBAAiB,UACjB9B,uBAAwB,eAE5B1uC,QAAS,CACLmkC,gBAAiB,OACjBD,WAAY,OACZyK,iBAAkB,KAClBC,WAAY,IACZmC,gBAAiB,OACjBtC,YAAa,QACb1L,SAAU,QACVwN,UAAW,OACX/B,kBAAmB,OACnBgC,gBAAiB,UACjB9B,uBAAwB,gBAGhCnI,YAAa,CACTzM,KAAMp9B,KAAKpJ,MAAMwgC,4BACjB+F,KAAMn9B,KAAKpJ,MAAMygC,wBACjB8T,IAAK,gBAIbnrC,KAAKoE,SAAW,uDACUihD,0CACEp7C,EAAsBmqC,qCAC5Bp0C,KAAKslD,8DAE/B,CAEAA,eAAAA,GACU,MAAEzuB,WAAAA,EAAa,IAAO72B,KAAKpJ,MAE1BigC,OAAAA,EACFn6B,KACG,EACI2D,KAAAA,EAAO,GACPomB,UAAAA,EAAY,GACZnH,UAAAA,EAAY,GACZ2M,eAAAA,EAAiB,GACjB3rB,MAAAA,EAAQ,GACRG,SAAAA,GAAW,KAEX,mDACgBJ,6KAIGI,kCACT6e,GAAa,cAAcA,qCAC3B2M,GAAkB,mBAAmBA,qCACrCxF,GAAa,cAAcA,8BAClCnmB,qBAEV+B,KAAK,GACd,CAEAo0B,YAAAA,CAAaj+B,GACH,MAAEwE,GAAAA,GAAOzE,EAAUC,GACrBwE,IAAOqoD,IAGX7sD,EAAEsR,OAAO4tB,YACb,CAWAjxB,oBAAAA,GACS+Q,KAAAA,oBAAoBze,EAAoBiH,KAAKw2B,kBACtD,IC/GA0sB,GAAA,IAAAC,QAgFJliD,eAAeC,IAAI,oBAAsBD,eAAeE,OAAO,kBAjF/D,cAA4BgD,EAGxB9C,WAAAA,WAFAonB,EAAAzoB,KAAAkjD,GAAgB/M,IAIZn2C,KAAKojD,oBAAsB,KAC3BxM,GAAQyD,UAAUr6C,KAAKqjD,iBAAiBjhD,KAAKpC,OAC7CA,KAAKsjD,kBAAoBtjD,KAAKujD,aAAanhD,KAAKpC,KACpD,CAEAsE,OAAAA,GACS1N,KAAAA,MAAQoJ,KAAKqE,aACdjM,SAASq9B,eAAeygB,IAAsBj2B,cAAc3pB,YAG1D,MACFivD,cAAAA,EAAgB,UAChBC,uBAAAA,EAAyB,qHACzBC,+BAAAA,EAAiC,4GACjCC,8BAAAA,EAAgC,kDAChCC,oBAAAA,EAAsB,SACtB3lD,KAAKpJ,MAEHmb,EAAU6kC,GAAQ11C,IAAI,eAAexE,KAAI6V,IAAW,CACtDjS,MAAOiS,EAAOjS,MACdrB,MAAOe,KAAK4lD,iBAAiBrzC,EAAOhU,IAAKgU,EAAO4lC,OAChD5oB,QAAShd,EAAOgd,YAGhBqnB,GAAQ11C,IAAI,eAAe3C,MAAQq4C,GAAQ11C,IAAI,eAAe,GAAG3C,KACjEwT,EAAQnM,SAAQ2M,IACZA,EAAOgd,QACHhd,EAAOtT,QACPe,KAAK4lD,iBACDhP,GAAQ11C,IAAI,eAAe3C,IAC3Bq4C,GAAQ11C,IAAI,eAAei3C,MAC/B,IAIZ,MAAM5hD,EAAO,CACT+J,MAAOilD,EACPl0B,eAAgBm0B,EAChB3zB,uBAAwB4zB,EACxB3zB,sBAAuB4zB,EACvB3zB,YAAa,kBACb0J,YAAakqB,EACb5zC,QAASA,GAGR3N,KAAAA,SAAW,oBAAoBo/C,EAAAxjD,KAAKkjD,cAAwBj5C,EAC7D1T,OAER,CAEAiO,OAAAA,GACIxE,KAAKyjD,WAAarrD,SAASq9B,eAAe+tB,EAAAxjD,KAAKkjD,KAC/CljD,KAAKyjD,YAAYtjD,iBAAiBnH,EAAsBgH,KAAKsjD,kBACjE,CAEAD,gBAAAA,GACU,MAAE9kD,IAAAA,EAAK45C,MAAAA,GAAUvB,GAAQ11C,IAAI,eACnClB,KAAKyjD,YAAY5wB,YAAY7yB,KAAK4lD,iBAAiBrnD,EAAK45C,GAC5D,CAEAoL,YAAAA,CAAa/qD,GACH,MAAC+F,EAAK45C,GAAS3/C,EAAEP,OAAOwI,SAASxB,MAAMib,MAAMla,KAAKojD,qBACxDxM,GAAQtF,IAAI,cAAe,CAAE/yC,IAAAA,EAAK45C,MAAAA,IAClC2K,GAAe,SACnB,CAEAp8C,SAAAA,GACS+8C,KAAAA,YAAYjsC,oBAAoBxe,EAAsBgH,KAAKsjD,mBAChE1M,GAAQ2D,YAAYv6C,KAAKqjD,iBAC7B,CAEAuC,gBAAAA,CAAiBrnD,EAAK45C,GAClB,MAAO,GAAG55C,IAAMyB,KAAKojD,sBAAsBjL,GAC/C,ICOJl3C,eAAeC,IAAI,eAAiBD,eAAeE,OAAO,aApF1D,cAAwBgD,EACpB,6BAAW+hB,GACA,MAAA,CAAC,eAAgB,sBAC5B,CAEAkC,wBAAAA,CAAyBlsB,EAAM+oD,EAAQC,GACrB,MAAVA,GAAkBA,IAAWD,GAAUC,EAAOrmD,OAAS,IAC1C,iBAAT3C,EACA8D,KAAK6lD,kBACW,wBAAT3pD,GACP9D,SACKq9B,eAAe,kBACf70B,aAAa,sBAAuBskD,GAGrD,CAEA5gD,OAAAA,GACS1N,KAAAA,MAAQoJ,KAAKqE,aAAarE,KAAKigB,cAAc3pB,YAClD0J,KAAKa,UAAUC,IAAI,aACvB,CAEA+kD,eAAAA,GACI,MAAMpF,EAAY7J,GAAQ11C,IAAI,aAGxB0V,EAAW,CACb5Z,GAAIgD,KAAKpJ,MAAM4wB,YACfvP,SAAUjY,KAAKpJ,MAAMwnB,kBACrBliB,KAAM8D,KAAKpJ,MAAM6wB,cACjB7Z,SAAU5N,KAAKpJ,MAAM8wB,mBAGnBo+B,EAAO,oKAKG9lD,KAAKpJ,MAAMigB,aAAauuC,kBAAoBplD,KAAKpJ,MAAMwuD,sKAKjDn7C,EAAsB,CAC5B4sB,WAAY4pB,EACZrpB,4BAA6Bp3B,KAAKpJ,MAAMwgC,4BACxCC,wBAAyBr3B,KAAKpJ,MAAMygC,wBACpCzgB,SAAU5W,KAAKpJ,MAAMggB,UAAYA,sHAK5CrS,KAAAA,aAAauhD,GAClB9lD,KAAK+lD,YAAc/lD,KAAKygB,iBAAiB,+BACzCzgB,KAAK8rB,YACT,CAEA6K,SAAAA,EAAYxxB,YAAAA,IACR6R,GAAY,CACRsB,YAAa,kBACbU,WAAY7T,GAEpB,CAEA2mB,UAAAA,GACSW,KAAAA,eACDzsB,KAAK+lD,aAAalnD,QAClBmB,KAAK+lD,YAAYngD,SAAQhO,IACrB,MAAMuN,EAAcvN,EAAQ2U,cAAc,QAAQpH,YAClDvN,EAAQ8+B,eAAiB12B,KAAK22B,UAAUv0B,KAAKpC,KAAM,CAAEmF,YAAAA,IACrDvN,EAAQuI,iBAAiB,QAASvI,EAAQ8+B,eAAc,GAGpE,CAEAjK,YAAAA,GACQzsB,KAAK+lD,aAAalnD,QAClBmB,KAAK+lD,YAAYngD,SAAQhO,IACrBA,EAAQ4f,oBAAoB,QAAS5f,EAAQ8+B,eAAc,GAGvE,ICzFJ,MA4FMsvB,GA5FgBC,MAClB,IAAIruD,EAAU,KACVsuD,EAAgB,EAChBC,EAAwB,GACxBC,EAAa,EAEXC,MAgBAC,EAAeA,KACjB,MAAMhU,EAAS16C,EAAQ4nB,aAAa,WAAa,QACjD,IAAI+mC,EAAgB,EAChBC,GAAU,EACVr2B,EAAS,CAAA,EACb,IAAA,IAAStoB,EAAI,EAAGA,EAAIjQ,EAAQqoB,cAAc/a,WAAWrG,SAE7CjH,EAAQqoB,cAAc/a,WAAW2C,GAAG9C,SACpCnN,EAAQqoB,cAAc/a,WAAW2C,GAAG9C,UAAYnN,EAAQmN,UAExDorB,EAASv4B,EAAQqoB,cAAc/a,WAAW2C,EAAIu+C,GAC1Cj2B,IAEAo2B,EAAgBp2B,EAAOs2B,UAAY,GACnCD,GAAU,KAGdA,GAZqD3+C,KAiBzD2+C,GAA6B,IAAlBD,IACXA,EAAgB3uD,EAAQqoB,cAAcwmC,UAAY7uD,EAAQqoB,cAAcymC,cAGtEnU,MAAAA,EADW16C,OAAOgrB,QAAU0jC,EACN,EAEZ,SAAXjU,IAAuBC,IACxB36C,EAAQgJ,aAAa,SAAU2xC,GAC3B2T,EAAgB,IAChB9tD,SAASoO,KAAKoY,MAAM+nC,WAAapU,EAAW2T,EAAgB,KAAO,OAAA,EASzEhpC,EAAYA,KACP/c,OAAAA,iBAAiB,SAAUmmD,EAAY,EAG5CjmC,EAAcA,KACT7I,OAAAA,oBAAoB,SAAU8uC,EAAY,EAsB9C,MAAA,CAAED,WAnFUA,CACfO,EACAC,EAAiBX,EACjBY,EAAyBX,EACzBY,EAAcX,KAEdxuD,EAAUgvD,EACVV,EAAgBW,EAChBV,EAAwBW,EACxBV,EAAaW,EACbnvD,EAAQgJ,aAAa,SAAU,SAC/BhJ,EAAQiJ,UAAUC,IAAI,uBACtBwlD,IACAppC,KAsEiBsQ,QA/BLA,KACZnN,KA8B0B2mC,eAnBPA,CAACC,EAAS,KAC7B,IAAI97B,EAAKvzB,EAIT,GAH8B,KAA1BuuD,IACAh7B,EAAKvzB,EAAQ2U,cAAc45C,KAE1Bh7B,EACD,OAIJ,MAAMuqB,EADUt9C,SAASmU,cAAc,iBACXuW,yBAA2B,CAAEuyB,OAAQ,EAAGM,EAAG,GACjER,EAAmBO,EAAWL,OAE9BtyB,EAAM,GAFqC2yB,EAAWC,EAEhCR,EAAgB8R,MAC5C97B,OAAAA,EAAGvM,MAAMmE,IAAMA,EAER,CAAA,IAMCkjC,GClEHhmD,GAASA,CAACrJ,EAAOggB,KACpB,MAAEwgB,4BAAAA,EAA6BC,wBAAAA,GAA4BzgC,EAC3D6pD,EAAY7J,GAAQ11C,IAAI,cAAgB,GACxChJ,EAAU0+C,GAAQ11C,IAAI,YAAc,GAEpCo2B,EADoBmpB,EAAUjqD,MAAK0wD,GAAYA,EAASzmD,YACXH,MAE7C6mD,EA5B6BC,GACnClvD,QAAAA,EAGAk/B,4BAAAA,EACAC,wBAAAA,EACAzgB,SAAAA,EACA0gB,wBAAAA,KAEOp/B,EACD+R,EAAsB,CAClBmtB,4BAAAA,EACAC,wBAAAA,EACAn/B,QAASA,EACTmvD,kBAAmB,kBACnBzwC,SAAAA,EACA0gB,wBAAAA,IAEJ,GAU0B8vB,CAA+B,CAC3DlvD,QAAAA,KACGtB,EACHggB,SAAAA,EACA0gB,wBAAAA,IAGG,MAAA,0CAC4B6vB,8EAxCTG,CAAAA,GACnBA,EAAWr9C,EAAsB,CAAE4sB,WAAYywB,IAAc,GAyCpDC,CAAsB9G,iDACCrpB,4CACJC,uCACL8vB,4CACK7vB,yCAAuB,SCpC1DkwB,GAAA,IAAArE,QAkDJliD,eAAeC,IAAI,mBAAqBD,eAAeE,OAAO,iBAnD9D,cAA4BgD,EAA5B,WAAA9C,GAAAyC,SAAAihD,WACIt8B,EAAAzoB,KAAAwnD,IAAY,EAAA,CAEZljD,OAAAA,GACItE,KAAKpJ,MAAQoJ,KAAKqE,aAAarE,KAAKigB,cAAc3pB,YAGlD,MAAM8vD,EAAapmD,KAAK1J,WAAWmxD,aAAa,eAC1Cn+C,OAAOtJ,KAAK1J,WAAWmxD,aAAa,eAAexoD,YACnDmE,EAENogD,EAAAxjD,KAAKwnD,KAAavB,GAAcI,WAAWrmD,KAAM,EAAG,oBAAqBomD,EAC7E,CAEA,6BAAWlgC,GACA,MAAA,CAAC,SAAU,eACtB,CAEAkC,wBAAAA,CAAyBlsB,EAAM+oD,EAAQC,GACpB,OAAXA,GAAmBA,IAAWD,GAAUC,EAAOrmD,SAClC,WAAT3C,GACAsnD,EAAAxjD,KAAKwnD,KAAavB,GAAce,iBAEvB,iBAAT9qD,GACA8D,KAAK6lD,kBAGjB,CAEAA,eAAAA,GAGI,MAAMjvC,EAAW,CACb5Z,GAAIgD,KAAKpJ,MAAM4wB,YACfvP,SAAUjY,KAAKpJ,MAAMwnB,kBACrBliB,KAAM8D,KAAKpJ,MAAM6wB,cACjB7Z,SAAU5N,KAAKpJ,MAAM8wB,mBAEnBo+B,EAAO4B,GACT1nD,KAAKpJ,MAAMigB,YAAc7W,KAAKpJ,MAAMigB,YAAc7W,KAAKpJ,MACvDoJ,KAAKpJ,MAAMggB,UAAYA,GAG3B5W,KAAKuE,aAAauhD,EACtB,CAEAp/C,SAAAA,GACI88C,EAAAxjD,KAAKwnD,KAAavB,GAAcz4B,SACpC,ICxBJvsB,eAAeC,IAAI,qBAAuBD,eAAeE,OAAO,mBAhChE,cAA6BgD,EACzBG,OAAAA,GACU,MAAE9D,WAAAA,EAAYX,MAAAA,EAAO6mB,WAAAA,EAAYpmB,MAAAA,EAAO+K,UAAAA,GAAcrL,KAAKpJ,MAE3D+wD,EAAY9nD,EAAQ,6CAA6CA,YAAkB,GAEzFG,KAAKoE,SAAW,sDAEMsiB,kCACDrb,8DAEC7K,KAAcF,uCAE1BqnD,IAAYrnD,qCAG1B,CACAkE,OAAAA,GACU,MAAEvF,MAAAA,EAAO3B,KAAAA,EAAMgD,MAAAA,GAAUN,KAAKpJ,MAC/BuJ,KAAAA,iBAAiB,SAAS,KAC3By2C,GAAQgC,cAAc,CAClBr6C,IAAKjB,EACLgD,MAAOA,EACPG,UAAU,EACVxB,MAAOA,IAEXe,KAAKuX,SACLurC,GAAe,WAAU,GAEjC,IC5BJ,MCAA8E,GAAe,CAAC9rD,EAAS+R,EAAe,GAAIgN,EAAO,GAAIhV,EAAQ,KAC3D,MAAMtP,EAAO,IAAKuF,EAAc+R,aAAAA,GAC1BD,EAAW/H,EAAQ,EAGzBtP,EAAKqX,SAAWA,EAGhBrX,EAAK0G,MAAQ25C,GAAQj7C,eAAegE,MAAMi3C,GAAQn9C,SAAUqC,EAAQmB,OACpE1G,EAAKke,SAAW3Y,EAAQmB,MACpB1G,EAAKunB,cACLvnB,EAAKunB,YAAc84B,GAAQj7C,eAAegE,MAAMi3C,GAAQn9C,SAAUqC,EAAQgiB,cAI1EvnB,EAAK4b,oBACL5b,EAAK4b,kBAAoBykC,GAAQj7C,eAAegE,MAC5Ci3C,GAAQn9C,SACRqC,EAAQqW,oBAKhB5b,EAAK8U,UAAYH,EACjB3U,EAAK0f,gBACD2gC,GAAQ11C,IAAI,YAAY+U,iBACxB2gC,GAAQ4J,aAAa,+CACzBjqD,EAAKqgB,SAAWggC,GAAQ11C,IAAI,YAEtBq+B,MAAAA,E9E3B2BsoB,GAAGvqD,KAAAA,EAAMwqD,eAAAA,MAC1C,IAAIngD,EAAS,SAETrK,OAAAA,IAAS5D,EACTiO,EAAS,gBACFrK,IAAS3D,GAAsBmuD,EACtCngD,EAAS,qBACFrK,IAAS3D,EAChBgO,EAAS,iBACFrK,IAAS1D,EAChB+N,EAAS,mBACFrK,IAASzD,IAChB8N,EAAS,oBAGNA,CAAAA,E8EYKkgD,CAAsBtxD,GAElC,MAAO,IAAIgpC,qCACkB1kB,0CACIjN,2BACfrX,EAAK6D,+BACH6P,EAAsB1T,wBAC5BA,EAAKme,YAAc,gBAAgBne,EAAKme,eAAiB,qBAC3D6qB,IAAG,YClCfwoB,GAAA,YACAC,GAAA,IAAA7E,QA0EJliD,eAAeC,IAAI,gBAAkBD,eAAeE,OAAO,cA5E3D,cAAyBgD,EAAzB,WAAA9C,GAAAyC,SAAAihD,WACIt8B,EAAAzoB,KAAA+nD,GAAkB,oDAClBt/B,EAAAzoB,KAAAgoD,GAAiB,mCAAA,CAEjB1jD,OAAAA,GACS1N,KAAAA,MAAQoJ,KAAKqE,aAAarE,KAAKigB,cAAc3pB,YAClD0J,KAAKioD,iBAAwD,SAArCjoD,KAAKwf,aAAa,eAC1Cxf,KAAKkoD,eAAiB,GACtBloD,KAAKa,UAAUC,IAAI,cACvB,CAEA,6BAAWolB,GACP,MAAO,CAAC,eACZ,CAEAkC,wBAAAA,CAAyBlsB,EAAM+oD,EAAQC,GACpB,OAAXA,GAAmBA,IAAWD,GAAYC,EAAOrmD,QACpC,iBAAT3C,GACA8D,KAAK6lD,iBAGjB,CAEAA,eAAAA,GACI,MAAMsC,EAAenoD,KAAKioD,iBAAmB,GF1BtC,EAACG,EAAmB,MACzB,MACFC,gCAAAA,EAAkC,eAClCC,+BAAAA,EAAiC,UACjCC,iCAAAA,EAAmC,kDACnCC,oBAAAA,EAAsB,wBACtBC,0BAAAA,EAA4B,YAC5BC,4BAAAA,EAA8B,UAC9BC,gCAAAA,EAAkC,SAClCC,iCAAAA,EAAmC,WACnCR,EAEES,EAAQjS,GAAQ+B,wBAChBmQ,EAAelS,GAAQmD,wBAA0BnD,GAAQ0C,2BAYxD,MAAA,uHAKKwP,EACM,mCAAmCN,0DACHM,EACzBpsD,KAAI7F,GAAU,GAAGA,EAAOgjD,kBAAkBhjD,EAAOyJ,YACjD+B,KAAK,0CACRymD,EACDpsD,KACG7F,GACI,sKAGKA,EAAOoI,6CACRpI,EAAO0H,4CACN1H,EAAOyJ,8CACPzJ,EAAOgJ,OAAS,gDACXwoD,gCACfxxD,EAAOyJ,6BAET+B,KAAK,MACR,4KAMQimD,sCAEZG,yHAGsBF,6CACZ/R,OAAwBqS,YA/CzBE,MACnB,OAAQF,GACJ,KAAK,EACMD,OAAAA,EACX,KAAK,EACMD,OAAAA,EACX,QACWD,OAAAA,EACf,EAuC4DK,sDAAgB,EEnC1BnsC,CAAa5c,KAAKpJ,OACpE,GAAIoJ,KAAKgpD,eAAehpD,KAAKkoD,eAAgBtR,GAAQc,wBAIjD,OAFSnrC,SAAAA,cAAci3C,EAAAxjD,KAAK+nD,KAAiBkB,UAAYd,OACzDnoD,KAAK8rB,aAIJo8B,KAAAA,eAAiBtR,GAAQc,uBAC9B,MAAMwR,EAAatS,GAAQmD,uBAAyB,EAC9CiC,EAAWpF,GAAQ11C,IAAI,gBAAgB3C,MAAQq4C,GAAQ11C,IAAI,iBAAiB,GAAG3C,IAC/E4qD,EAAW,GAAGD,EAAa,eAAiB,KAAKlN,GAAYkN,EAAa,KAAO,KACnFlN,EAAW,mBAAqB,KAGpCh8C,KAAKuE,aACD,iBACE4jD,8GAEIvR,GACGc,uBACAh7C,KAAI,CAACZ,EAAS+J,IACJ+hD,GAAc9rD,EAAS,UAAWqtD,GAAYtjD,KAExDxD,KAAK,8CAGd,GAGJrC,KAAK8rB,YACT,CAEAk9B,cAAAA,CAAe1Q,EAAI,GAAIC,EAAI,IACvB,OAAOD,EAAEz5C,SAAW05C,EAAE15C,QAAiBy5C,EAAEz2C,OAAM,CAAC5C,EAAO4G,IAAU5G,IAAUs5C,EAAE1yC,IACjF,CAEAa,SAAAA,GACa6F,SAAAA,cAAci3C,EAAAxjD,KAAKgoD,MAAiBxwC,oBAAoB,QAASxX,KAAKopD,WACnF,CAEAt9B,UAAAA,GACavf,SAAAA,cAAci3C,EAAAxjD,KAAKgoD,MAAiB7nD,iBAAiB,QAASH,KAAKopD,WAChF,CAEAA,UAAAA,GACI/tC,GAAkB,eAAgB,GAAI,GAAI,iBAC1Cu7B,GAAQqD,eACR6I,GAAe,WACnB,IChDJ7hD,eAAeC,IAAI,iBAAmBD,eAAeE,OAAO,eA3B5D,cAA0BgD,EACtB,6BAAW+hB,GACP,MAAO,CAAC,eACZ,CAEAkC,wBAAAA,CAAyBlsB,EAAM+oD,EAAQC,GACpB,OAAXA,GAAmBA,IAAWD,GAAUC,EAAOrmD,QAClC,iBAAT3C,GACA8D,KAAK6lD,iBAGjB,CAEAA,eAAAA,GAEI,MAAMC,GADalP,GAAQ11C,IAAI,aAAe,IACtBpK,QAAO,CAAC0gD,EAAK3mC,KACjC2mC,GChBG5gD,CAAAA,IACL,MACFoG,GAAAA,EAAK,KACLoxB,kBAAAA,EACAD,mBAAAA,EACAF,kBAAAA,EACAC,kBAAAA,EACA1H,SAAAA,EAAW,OACXtqB,KAAAA,EAAO,KACPE,YAAAA,EACA2X,SAAAA,EAAW,IACXnd,EAWJ,MAAO,sCAAsCoG,wIAGjBwpB,8CACS4H,+CACCD,8CACDF,8CACAC,gFAf1BhyB,EAAO,6CAA6CA,SAAc,oGAIlEE,EAAc,mCAAmCA,QAAoB,8bAyBtD2X,EACGrX,KAAI,CAACZ,EAAS+J,IACX+hD,GAAc9rD,OAASsH,EAAWlH,EAAM2J,KAE3CxD,KAAK,wJAAG,ED/BtBgnD,CAAiBx4C,GACjB2mC,IACR,IACCzB,GAAkBE,IAClBj2C,KAAKuE,aAAauhD,GAAM,GAExB9lD,KAAKuE,aAAauhD,EAE1B,IEfJ,MAAMwD,WAAenlD,EACjB9C,WAAAA,GACIyC,QACA9D,KAAKupD,qBAAuB,IAAM,GAClCvpD,KAAKwpD,mBAAqB,IAAM,GAChCxpD,KAAK6/C,gBAAkB,IAAM,GAC7B7/C,KAAK8/C,sBAAwB,OAC7B9/C,KAAKy+C,UAAY,GACjBz+C,KAAK+2C,QAAU,KACnB,CAEA,6BAAW7wB,GACA,MAAA,CAAC,cAAe,OAC3B,CAEAkC,wBAAAA,CAAyBlsB,EAAM+oD,EAAQC,GAE/BhpD,GAAS,SAATA,GACW,OAAX+oD,GACW,OAAXC,GACAA,IAAWD,GACTC,EAAOrmD,OAGT,YADAmB,KAAKD,oBAGH0pD,MAAAA,EAAuB,gBAATvtD,EACdwtD,EAA0B,OAAXxE,GAAmBA,IAAWD,KAAYC,EAAOrmD,OAElE4qD,GAAeC,GACf5G,GAAe,cAAe,CAC1BjD,gBAAiB7/C,KAAK6/C,gBACtBF,eAAgB3/C,KAAKwpD,mBACrB5J,eAAgB5/C,KAAKupD,qBACrBzJ,sBAAuB9/C,KAAK8/C,sBAC5BjuC,iBAAkB7R,KAAKpJ,OAGnC,CAEA+yD,cAAAA,GACI3pD,KAAKoE,SAAW,iCACM8xC,6EACIG,+EACFC,4EACDC,qDAE3B,CAEAjyC,OAAAA,IAC+BtE,KAAKpJ,MAAMmb,SAAS63C,oBAAsB,IAClDhkD,SAAQowC,IAAc6T,O1B3DhB7T,E0B2DiCA,E1B1D9DH,GAAmB/0C,IAAIk1C,QACvB1+C,QAAQwyD,KAAK,0BAA2BjU,GAAmB8D,UAFxD,IAA0B3D,C0B2D4C,IAErE8M,GAAe,SAAU,CACrB/L,QAAS/2C,KAAK+2C,QACd8H,iBAAkB7+C,KAAKy+C,YAG3Bz+C,KAAKa,UAAUC,IAAI,UAAW,WAAWd,KAAK+2C,WACxCgT,MAAAA,EAAc/pD,KAAKpJ,MAAMmb,SAASi4C,cACpCD,EAAc,KACd/pD,KAAKa,UAAUC,IAAI,WAAWipD,KAGlC/pD,KAAK2pD,gBACT,EC9EW,MAAMM,GAuBjB5oD,WAAAA,CAAYwP,EAAUq5C,GAtBtBC,EAAAA,KAAM,MAAA,IACNC,EAAAA,KAAQ,QAAA,IACRC,EAAAA,KAAe,eAAA,IACfC,EAAAA,iBAAY,IACZC,EAAAA,KAAiB,iBAAA,MACjBC,EAAAA,KAAe,eAAA,MACfC,EAAAA,KAAQ,QAAA,MACRC,EAAAA,KAAqB,sBAAA,GACrBC,EAAAA,KAAa,aAAA,MACbC,EAAAA,sBAAiB,IACjBC,EAAAA,wBAAmB,IACnBC,EAAAA,KAAO,OAAA,IACPC,EAAAA,KACI,qBAAA,wFACJC,EAAAA,KACI,sBAAA,uFACJC,EAAAA,KACI,qBAAA,uFACJC,EAAAA,KAAqB,qBAAA,IACrBC,EAAAA,KAAY,YAAA,QACZC,EAAAA,KAAa,cAAA,GAGTprD,KAAKmqD,IAAMt5C,EAAS7T,IAAMgD,KAAKmqD,IAC/BnqD,KAAKoqD,MAAQv5C,EAAS3U,MAAQ8D,KAAKoqD,MACnCpqD,KAAKuqD,eAAiB15C,EAASw6C,eAAiBrrD,KAAKuqD,eACrDvqD,KAAKqqD,aAAex5C,EAASzU,aAAe4D,KAAKqqD,aACjDrqD,KAAKwqD,aAAe35C,EAASy6C,aAAetrD,KAAKwqD,aACjDxqD,KAAKyqD,MAAQ55C,EAAS3S,MAAQ8B,KAAKyqD,MACnCzqD,KAAK2qD,WAAa95C,EAAS06C,WAAavrD,KAAK2qD,WAC7C3qD,KAAK4qD,eAAiB/5C,EAAS26C,eAAiBxrD,KAAK4qD,eACrD5qD,KAAK6qD,iBAAmBh6C,EAAS46C,iBAAmBzrD,KAAK6qD,iBACzD7qD,KAAK8qD,KAAOj6C,EAASpI,KAAOzI,KAAK8qD,KACjC9qD,KAAKgrD,oBAAsBd,GAAiB/7B,oBAAsBnuB,KAAKgrD,oBACvEhrD,KAAKirD,mBAAqBf,GAAiBj8B,mBAAqBjuB,KAAKirD,mBACrEjrD,KAAK+qD,mBAAqBb,GAAiB97B,mBAAqBpuB,KAAK+qD,mBACrE/qD,KAAKkrD,mBAAqBhB,GAAiBh8B,mBAAqBluB,KAAKkrD,mBACrElrD,KAAKmrD,UAAYjB,GAAiB1jC,UAAYxmB,KAAKmrD,SACvD,CAEA,MAAInuD,GACA,OAAOgD,KAAKmqD,GAChB,CACA,YAAIp2C,GACA,OAAO/T,KAAKsqD,SAChB,CACA,YAAIv2C,CAASA,GACT/T,KAAKsqD,UAAYv2C,CACrB,CACA,qBAAI23C,GACA,OAAO1rD,KAAK0qD,kBAChB,CACA,qBAAIgB,CAAkBA,GAClB1rD,KAAK0qD,mBAAqBgB,CAC9B,CACA,QAAIxvD,GACA,OAAO8D,KAAKoqD,KAChB,CACA,eAAIhuD,GACA,OAAO4D,KAAKqqD,YAChB,CACA,YAAI7jC,GACA,OAAOxmB,KAAKmrD,SAChB,CACA,sBAAIh9B,GACA,OAAOnuB,KAAKgrD,mBAChB,CACA,qBAAI/8B,GACA,OAAOjuB,KAAKirD,kBAChB,CACA,qBAAI78B,GACA,OAAOpuB,KAAK+qD,kBAChB,CACA,qBAAI78B,GACA,OAAOluB,KAAKkrD,kBAChB,CAEAS,iBAAAA,GACI,OAAQ3rD,KAAKorD,YAAcprD,KAAKsqD,WAAatqD,KAAKsqD,UAAUzrD,OAAS,CACzE,EC/EW,MAAM+sD,WAAwB3B,GACzC5oD,WAAAA,CAAYwP,EAAUq5C,GAClBpmD,MAAM+M,EAAUq5C,EACpB,ECHW,MAAM2B,GAqCjBxqD,WAAAA,CAAYvF,GApCZkB,EAAAA,KAAK,KAAA,IACL5C,EAAAA,KAAM,MAAA,IACN2C,EAAAA,KAAU,UAAA,IACVb,EAAAA,KAAO,OAAA,IACPqP,EAAAA,KAAc,cAAA,IACdugD,EAAAA,KAAY,aAAA,GACZ1vD,EAAAA,KAAc,cAAA,MACduR,EAAAA,KAAY,aAAA,GACZjD,EAAAA,KAAiB,iBAAA,IACjBC,EAAAA,KAAQ,QAAA,IACRqP,EAAAA,KAAU,WAAA,GACVzF,EAAAA,KAAkB,kBAAA,IAClB4D,EAAAA,KAAoB,oBAAA,IACpBlE,EAAAA,KAAW,WAAA,IACX83C,EAAAA,KAAmB,mBAAA,MACnBC,EAAAA,KAAgB,gBAAA,MAChB/uD,EAAAA,KAAQ,QAAA,MACRgvD,EAAAA,KAAoB,qBAAA,GACpB33B,EAAAA,cAAS,IACTt5B,EAAAA,KAAgB,gBAAA,MAChBL,EAAAA,oBAAe,IACf2C,EAAAA,KAAO,OAAA,IACPnC,EAAAA,KAAe,eAAA,IACfsN,EAAAA,KAAM,MAAA,IACN1E,EAAAA,cAAS,IACT0J,EAAAA,KAAgB,gBAAA,IAChBoD,EAAAA,KAAW,WAAA,MACX6D,EAAAA,KAAc,eAAA,GACdP,EAAAA,KAAsB,sBAAA,IACtBC,EAAAA,KAAqB,qBAAA,IACrBC,EAAAA,KAA0B,0BAAA,IAC1BC,EAAAA,+BAA0B,CAAA,GAC1BrY,EAAAA,KAAe,eAAA,MACf8R,EAAAA,KAAqB,qBAAA,IACrB5R,EAAAA,KAAW,WAAA,IAIF/B,KAAAA,IAAM0B,EAAQyY,iBAAmBvU,KAAK5F,IAC3C4F,KAAKjD,QAAUjB,EAAQkB,IAAMgD,KAAKjD,QAClCiD,KAAKhD,GAAKlB,EAAQkB,IAAMgD,KAAKhD,GAC7BgD,KAAK9D,KAAOJ,EAAQI,MAAQ8D,KAAK9D,KACjC8D,KAAKuL,YAAczP,EAAQyP,aAAevL,KAAKuL,YAC/CvL,KAAK8rD,UAAYhwD,EAAQgwD,WAAa9rD,KAAK8rD,UAC3C9rD,KAAK5D,YAAcN,EAAQM,aAAe4D,KAAK5D,YAC/C4D,KAAK2N,WAAYN,OAAuBvR,EAAQ6R,WAAa3N,KAAK2N,WAClE3N,KAAK0K,eAAiB5O,GAAS6O,OAAOuhD,SAAWlsD,KAAK0K,eACtD1K,KAAK2K,MAAQ7O,GAAS6O,OAAOlC,KAAOzI,KAAK2K,MACzC3K,KAAKga,QAAUle,EAAQke,QACvBha,KAAKuU,gBAAkBzY,EAAQyY,iBAAmBvU,KAAKuU,gBACvDvU,KAAKmY,kBAAoBrc,EAAQqc,mBAAqBnY,KAAKmY,kBAC3DnY,KAAKiU,SAAWnY,EAAQmY,UAAYjU,KAAKiU,SACzCjU,KAAK+rD,iBAAmBjwD,EAAQiwD,kBAAoB/rD,KAAK+rD,iBACzD/rD,KAAKgsD,cAAgBlwD,EAAQkwD,eAAiBhsD,KAAKgsD,cACnDhsD,KAAK/C,MAAQnB,EAAQmB,OAAS+C,KAAK/C,MACnC+C,KAAKisD,kBAAoBnwD,EAAQmwD,mBAAqBjsD,KAAKisD,kBAC3DjsD,KAAKs0B,OAASx4B,EAAQw4B,QAAUt0B,KAAKs0B,OACrCt0B,KAAKhF,cAAgBc,EAAQd,eAAiBgF,KAAKhF,cACnDgF,KAAKrF,aAAemB,EAAQnB,cAAgBqF,KAAKrF,aACjDqF,KAAK1C,KAAOxB,EAAQwB,MAAQ0C,KAAK1C,KACjC0C,KAAK7E,aAAeW,EAAQX,cAAgB6E,KAAK7E,aACjD6E,KAAKyI,IAAM3M,EAAQ2M,KAAOzI,KAAKyI,IAC/BzI,KAAK0U,YAAc5Y,EAAQ4Y,aAAe1U,KAAK0U,YAC/C1U,KAAKmU,oBAAsBrY,EAAQqY,qBAAuBnU,KAAKmU,oBAC/DnU,KAAKoU,mBAAqBtY,EAAQsY,oBAAsBpU,KAAKoU,mBAC7DpU,KAAKqU,wBACDvY,EAAQuY,yBAA2BrU,KAAKqU,wBAC5CrU,KAAKsU,wBACDxY,EAAQwY,yBAA2BtU,KAAKsU,wBAC5CtU,KAAK/D,aAAeH,EAAQG,cAAgB+D,KAAK/D,aACjD+D,KAAK+N,mBAAqBjS,EAAQiS,oBAAsB/N,KAAK+N,mBAC7D/N,KAAK7D,SAAWL,EAAQK,UAAY6D,KAAK7D,SACzC6D,KAAK+D,OAASjI,EAAQiI,QAAU/D,KAAK+D,OAG/BoN,MAAAA,EAAarV,EAAQqV,WAAarV,EAAQqV,WAAW+I,MAAM,KAAO,CAAC,IACpEzM,KAAAA,cAAgB0D,EAAWA,EAAWtS,OAAS,GACpDmB,KAAK6Q,SAAW/U,EAAQ+U,UAAY7Q,KAAK6Q,QAC7C,EC/EW,MAAMs7C,WAAuBN,GAWxCxqD,WAAAA,CAAYvF,GACRgI,MAAMhI,GAXVswD,EAAAA,mBAAc,IACd7nC,EAAAA,KAAe,eAAA,IACfD,EAAAA,KAAoB,oBAAA,IACpBxP,EAAAA,KAAe,gBAAA,GACfC,EAAAA,KAAiB,iBAAA,GACjBjH,EAAAA,KAAoB,qBAAA,GACpBzQ,EAAAA,cAAS,IACTgvD,EAAAA,KAAc,eAAA,GACdC,EAAAA,KAA6B,8BAAA,GAKzBtsD,KAAKosD,YAAc,GACftwD,EAAQ8F,SACR5B,KAAKsC,UAAYxG,EAAQmY,SACzBjU,KAAKwN,cAAgB1R,EAAQkB,IAAM,GACnCgD,KAAK4B,OAAS9F,EAAQ8F,OACtB5B,KAAKosD,YAActwD,EAAQ8F,OAAOlF,KAAImD,GAASA,EAAM0sD,mBAGzDvsD,KAAKukB,aAAezoB,EAAQyoB,aAC5BvkB,KAAKskB,kBAAoBxoB,EAAQwoB,kBACjCtkB,KAAKssD,6BAA+BxwD,EAAQwwD,gCACflpD,IAAzBtH,EAAQgZ,eACR9U,KAAK8U,aAAehZ,EAAQgZ,mBAED1R,IAA3BtH,EAAQiZ,iBACR/U,KAAK+U,eAAiBjZ,EAAQiZ,qBAED3R,IAA7BtH,EAAQklB,mBACRhhB,KAAKghB,iBAAmBllB,EAAQklB,uBAEF5d,IAA9BtH,EAAQgS,oBACR9N,KAAK8N,kBAAoBhS,EAAQgS,kBAEzC,ECrCJ,MAAA0+C,GAAe,CAAC/L,EAAWgM,EAA0BvC,KAEjD,MACMwC,EAAc,4BACdC,EAAW,4BAET91C,YAAAA,EAAc,CAAE,EAAE9E,QAAAA,EAAU,CAAC,GAAMm4C,EAErC0C,EAAmCjyD,GAC9BA,EAAa+B,KAAI,EAAGM,GAAAA,EAAIyL,IAAAA,EAAKvM,KAAAA,EAAMokD,WAAAA,MAAkB,CACxDjgD,KAAMoI,EACNnI,MAAOpE,EACPojB,UAAWpjB,EACXuqB,UAAWzpB,EAAK6vD,EAAoB7vD,EAAGkd,MAAM,KAAKC,OAAS,GAC3D1Z,SAAU6/C,MAGZuM,EAAsBx0C,IACxB,OAAQA,GACJ,IhHiDiB,SgHhDNq0C,OAAAA,EACX,IhHgDc,MgH/CHC,OAAAA,EACX,QACWG,MhH2CQ,WgH1CvB,EA6BAzM,IAAAA,EACAtuC,GACAsuC,EADAtuC,EAAQg7C,gCAlBqBC,MAC7B,IAAKn2C,EAAYo2C,8BACb,MAAO,GAEX,MAAMC,EAAqBT,EAAyBj2D,MAAK22D,GAAKA,EAAE7M,aAChE,OAAK4M,EAGE,CACH,CACIzkD,IAAKykD,EAAmBzkD,IACxBvM,KAAM2a,EAAYo2C,8BAClB3M,YAAY,IANT,IAaW0M,GAEAP,GAGrBhM,EAAU5hD,QAAUwhD,EAAoBxhD,OACzC,OAAO+tD,EAAiCvM,GAG5C,IAAKA,EAAoBxhD,OACd4hD,OAAAA,EAIX,MAAM2M,EAA4B,IAAI3M,GAAW5pD,QA3CjBwJ,IAC5B,GA1BkB,WA2BdA,EAAKomB,WACLpmB,EAAKomB,YAAcimC,GACnBrsD,EAAKomB,YAAckmC,EAEZtsD,OAAAA,CAAAA,IAuCf,MAAO,IAAIusD,EAAiCvM,MAAyB+M,EAAyB,ECvEnFC,GAAA,CAACn1D,EAASo1D,EAAe18C,EAAYqvC,KAC1CsN,MAAAA,EAAgBD,EACjBz2D,QAAOs0B,IAAOja,GAAiBia,EAAGha,cAClCzU,KAAIyuB,GAAMA,EAAGha,aACZq8C,EAA2B,GAE3BC,EAA2Bv1D,EAC5BwE,KAAI63C,IACD,MAAMmZ,EAAmB,IAClBnZ,EACHl0C,KAAMk0C,EAAOl0C,KAAK/F,QAAQ,IAAK,KAG/BizD,GAAAA,EAAcnlD,SAASslD,EAAiBrtD,MACjCqtD,OAAAA,CAAAA,IAGd72D,QAAO82D,UAAcA,EAAQ,MAElCJ,OAAAA,EAAc3nD,SAAQuL,IACZojC,MAAAA,EAASkZ,EAAyBj3D,MAAK,EAAG6J,KAAAA,KAAWA,IAAS8Q,IAChEojC,GAAAA,EACAiZ,EAAyBjqD,KAAKgxC,OAC3B,CACH,MAAMqZ,EAAgBh9C,EAAWpa,MAAKqa,GAAYA,EAAS7T,KAAOmU,IAClE,GAAIy8C,EAAe,CACT,MAAE1xD,KAAAA,EAAMc,GAAAA,EAAIkB,KAAAA,GAAS0vD,EACrBC,EAAc,CAChBxtD,KAAMrD,EACNivB,eAAgB/vB,EAChBoE,MAAOpE,EACPm0C,OAAQ,CACJvnC,IAAK5K,GAAMuK,KjHyCA,GiHxCXq0B,IAAK5+B,GAAMguD,SAAWhwD,IAG9BsxD,EAAyBjqD,KAAKsqD,EAClC,CACJ,KAGA5N,GACAuN,EAAyBM,QAAQ,CAC7BztD,KAAM4/C,EAAejjD,GACrBivB,eAAgBg0B,EAAe/jD,KAC/BoE,MAAO2/C,EAAe/jD,KACtBm0C,OAAQ,CACJvnC,IAAKm3C,EAAe9xB,mBACpB2O,IAAKmjB,EAAe/jD,QAKzBsxD,CAAAA,ECVLO,GAAYA,EAAGn9C,WAAAA,EAAY08C,cAAAA,EAAev5C,SAAAA,MAG5C,GAAIA,EAAStF,MAAK3S,GAAWA,EAAQiI,QAAQlF,SACzC,OAIJkV,EAASnO,SAAQ9J,IACTA,EAAQkyD,iBAAiBnvD,SACzB/C,EAAQiI,OAASjI,EAAQkyD,gBAAgBtxD,KAAI4D,IAAU,CACnDpE,KAAMoE,EAAM6H,KACZtI,MAAOS,EAAM2tD,UACb/pD,QAAS5D,EAAMohC,oBACjB,IAKJ39B,MAAAA,EAAS4M,GAAUC,GAhDT7M,CAAAA,IAChBA,EAAO6B,SAAQtF,IACP,IACAA,EAAM4tD,WAAa/2D,KAAKC,MAAMkJ,EAAMlE,YACvC,OAAQ5D,GAOL,YANAlB,QAAQD,MACJ,4CACAiJ,EAAMtD,GACNsD,EAAMlE,YACN5D,EAGR,IACH,EAoCD21D,CAAYpqD,GAEZ,MAAMqqD,EAAcd,EAAcz2D,QAAOw3D,GACrCtqD,EAAO0K,MAAKnO,GAASA,EAAMtD,KAAOqxD,EAAMl9C,eAG5Ci9C,EAAYxoD,SAAQyoD,IACV/tD,MAAAA,EAAQyD,EAAOvN,MAAK83D,GAAWA,EAAQtxD,KAAOqxD,EAAMl9C,aACrD7Q,EAAM4tD,YAIXG,EAAME,WAAW3oD,SAAQgwB,IACrB,MAAM44B,EAAOz6C,EAASvd,MAAKsF,GAAWA,EAAQkB,KAAO44B,KAChD44B,GAAQA,EAAKR,iBAAiBnvD,OAAS,IAI5C2vD,EAAKzqD,OAASyqD,EAAKzqD,QAAU,GAC7ByqD,EAAKzqD,OAAOR,KAAKjD,EAAM4tD,YAAU,GACpC,IAILE,EAAYxoD,SAAQ6oD,IACVC,MAAAA,EAAgBpB,EAAch8C,WAChCq9C,GAAgBA,EAAax9C,aAAes9C,EAAWt9C,aAE3Dm8C,EAAc7tD,OAAOivD,EAAe,EAAC,GACxC,EAGLE,GAAe,CACX34B,EACAi0B,EACAD,EACA4B,EACAgD,EACA5O,KAEA,IAAKhqB,EAAQ1/B,KACT,OAGA,IAAEqa,WAAAA,EAAY08C,cAAAA,EAAejN,oBAAAA,EAAqBtsC,SAAAA,GAClDkiB,EAAQ1/B,KAAK09B,cAAcC,cAE/Bo5B,EAuIJ,SAAmCrN,EAAgBqN,GAC/C,OAAOrN,EACD,CACI,CACI9uC,WAAY8uC,EAAejjD,GAC3BuxD,WAAYtO,EAAelsC,SAASrX,KAAIZ,GAAWA,EAAQmY,eAE5Dq5C,GAEPA,CACV,CAjJoBwB,CAA0B7O,EAAgBqN,GAmJ9D,SAAsCrN,GAAkB4L,QAAAA,EAAS3B,gBAAAA,IACxDjK,IAILA,EAAelsC,SAAWksC,EAAelsC,SAASrX,KAAIoe,GAAK,IAAI+wC,EAAQ/wC,EAAGovC,KAC9E,CAxJI6E,CAA6B9O,EAAgB,CAAE4L,QAAAA,EAAS3B,gBAAAA,IAqD5D,SAAgCn2C,EAAUm2C,GACtCn2C,EAASnO,SAAQ9J,IACbA,EAAQiS,mBAAqBihD,GAAc9E,EAAiB,sBAExD78C,OAEAvR,EAAQ6R,WAAY,GAGlBshD,MAAAA,EAAY/E,GAAiBn2C,UAAUvd,QACzC04D,GAAiBA,EAAc90D,KAAO80D,EAAc90D,MAAQ0B,EAAQmY,WAGxE,IAAKg7C,EACD,OAGEv8C,MAAAA,EAAcu8C,EAAUhzD,cAAgBH,EAAQG,aAGtDuC,OAAOge,OAAO1gB,EAAS,CACnB4Y,YAAau6C,EAAUv6C,YACvBP,oBAAqB86C,EAAU96C,oBAC/BC,mBAAoB66C,EAAU76C,mBAC9BC,wBAAyB46C,EAAU56C,wBACnCC,wBAAyB26C,EAAU36C,yBAA2B,CAAE,EAChEg4C,2BAA4B2C,EAAU3C,6BAA8B,EACpE/gD,YAAa0jD,EAAU1jD,aAAe,MAClCmH,EACE,CACI/H,MAAO,CACHlC,IAAKiK,GAAa/H,OAAS7O,EAAQ6O,OAAOlC,KAE9CvM,KAAMwW,GAAaxW,MAAQJ,EAAQI,KACnCC,SAAUuW,GAAavW,UAAYL,EAAQK,SAC3CC,YAAasW,GAAatW,aAAeN,EAAQM,YACjDH,aAAcyW,GAElB,IACT,GAET,CA7FIy8C,CAAuBp7C,EAAUm2C,GACjC6D,GAAU,CAAEn9C,WAAAA,EAAY08C,cAAAA,EAAev5C,SAAAA,IAGnC86C,IACA96C,EAAW86C,EAAoB96C,IAGnC,MAAMq7C,EAuFV,SACIx+C,EACA08C,EACAv5C,GACEm2C,gBAAAA,EAAiBD,SAAAA,EAAU4B,QAAAA,IAEtBj7C,OAAAA,EACFlU,KAAImU,IACD,MAAMw+C,EAAYL,GAAc9E,EAAiB,cAAc1zD,MAC3D84D,GAAWA,EAAQC,cAAgB1+C,EAAS7T,KAG1CwyD,EAAc,IAAIvF,EAASp5C,EAAUw+C,GAE3C/B,OAAAA,EAAc1nD,SAAQ+oD,IAEdz9C,GAAiBy9C,EAAax9C,aAC9Bw9C,EAAax9C,aAAeN,EAAS7T,IAIzC2xD,EAAaJ,WAAW3oD,SAAQ6pD,IAC5B,MAAM3zD,EAAUiY,EAASvd,MAAKskB,GAAKA,EAAE9d,KAAOyyD,IAC5C,GAAI3zD,EAAS,CACTA,EAAQqV,WAAaN,EAAS7T,GAC9BlB,EAAQ+U,SACJD,EAAWpa,MAAK+a,GAAKA,EAAEvU,KAAOlB,EAAQw4B,SAAS,MAAO,KAC1D,MAAMo7B,EAAa,IAAI7D,EAAQ/vD,EAASouD,GACxCsF,EAAYz7C,SAASxQ,KAAKmsD,EAC9B,IACH,IAGEF,EAAY7D,oBAAsB6D,EAAc,IAAA,IAE1D34D,OAAO84D,QAChB,CA3HiCC,CAAuBh/C,EAAY08C,EAAev5C,EAAU,CACrFm2C,gBAAAA,EACAD,SAAAA,EACA4B,QAAAA,IAGG,MAAA,CACHj7C,WAAYqvC,EACN,CAACA,KAAmBmP,GACpBA,EACN5O,aAAcvqB,EAAQ1/B,KAAK09B,cAAcusB,aACzCH,oBAAAA,EACAI,UAAW+L,GACPwC,GAAc9E,EAAiB,aAC/B7J,EACA6J,GAEJhyD,QAASm1D,GACL2B,GAAc9E,EAAiB,8BAC/BoD,EACA18C,EACAqvC,GAEJU,aAAc,CACVkP,SAzImB,GA0InBC,OA1ImB,MA2If75B,EAAQ1/B,KAAK09B,eAAer9B,OAAO+pD,cAAgB,CAAA,GAE3DG,oBAAqBb,EAAiB,CAACA,KAAmBrvC,GAAcA,IAQhF,SAASo+C,GAAc9E,EAAiB3rD,GAC7BA,OAAAA,EAAI2b,MAAM,KAAKpjB,QAClB,CAAC0gD,EAAKmD,IAAYnD,IAAMmD,IAExBuP,GAAiBrzC,YAAcqzC,EAAgBrzC,YAAcqzC,EAErE,CCjKA,MAAM6F,GAAqBA,CAAC7F,EAAiB8F,IACzC9F,EAAgBn4C,QAAUm4C,EAAgBn4C,QAAQi+C,GAAS9F,EAAgB8F,GAE/EC,GAAe,CAACh6B,EAASi0B,KACf,MAAEgG,aAAAA,EAAcn8C,SAAAA,EAAUnD,WAAAA,GAAeqlB,EAAQ1/B,KAAK09B,cAAcC,cAG1E,OAAIg8B,EAAarxD,QACbqxD,EAAatqD,SAAQ/F,IACA+Q,EAAWpa,MAAK25D,GAAeA,EAAYnzD,KAAO6C,EAAM7C,KAChEozD,aAAevwD,EAAMuwD,YAAAA,IAItCr8C,EAASnO,SAAQ9J,IACb,MAAMmzD,EACF/E,EAAgBn2C,UAChBm2C,EAAgBn2C,SAASvd,MACrB04D,GAAiBA,EAAc90D,KAAO80D,EAAc90D,MAAQ0B,EAAQmY,WAG5EnY,EAAQgZ,aAAei7C,GAAmB7F,EAAiB,gBAC3DpuD,EAAQiZ,eAAiBg7C,GAAmB7F,EAAiB,kBAC7DpuD,EAAQgS,kBAAoBiiD,GAAmB7F,EAAiB,qBAChEpuD,EAAQwwD,2BAA6ByD,GACjC7F,EACA,8BAEJpuD,EAAQyP,YAAczP,EAAQwwD,2BAA6BxwD,EAAQ+U,UAAU3U,MAAQ,GAAK,GAC1FJ,EAAQiS,mBAAqBm8C,EAAgBrzC,aAAa9I,mBAEtDkhD,IACAnzD,EAAQyoB,aAAe0qC,EAAU1qC,aACjCzoB,EAAQwoB,kBAAoB4lC,EAAgBn4C,QAAQuS,mBAGxD,MAAM+rC,EAAsBt8C,EAASld,QAAOy5D,GACjCA,EAAkBh8B,OAAO7lB,MAAK8hD,GACjCz0D,EAAQw4B,OAAOlsB,SAASmoD,OAG5BF,GAAuBA,EAAoBxxD,SAC3C/C,EAAQ8F,OAASyuD,EAAoB3zD,KAAI8zD,IAC9B,CACHjE,gBAAiBiE,EAAkBC,gBAC7BD,EAAkBC,gBAAgB,GAClC,GACNr2D,IAAKo2D,EAAkBv8C,SACvB/X,KAAMs0D,EAAkBttD,YAAYhH,KACpCqE,KAAMiwD,EAAkBttD,YAAYktD,iBAE3C,IAwBFxB,GAAQ34B,EAASi0B,EAAiB0B,GAAiBO,IApB9Bp4C,IAGxB,MAAM28C,EAAkB,GACxB,IAAIC,EAAe,KACnB,MAAMC,EAAkB78C,EAASld,QAAOiF,IACpC60D,EAAe70D,GAASw4B,OAAO,GAC/B,MAAMu8B,GAAeH,EAAgBtoD,SAASuoD,GAC9CD,OAAAA,EAAgBntD,KAAKotD,GACdE,CAAAA,IAGXD,OAAAA,EAAgBl0D,KAAIZ,IAChBA,EAAQ8F,OAAOlF,KAAImD,IACfA,EAAMkE,OAHO3J,CAAAA,GAAO2Z,EAASvd,MAAKsF,GAAWA,EAAQmY,WAAa7Z,IAGnD02D,CAAajxD,EAAMzF,KAAK2J,MAAAA,GAC1C,IAEE6sD,CAAAA,GAGkF,sDC1ElF,MAAMG,GAajB1vD,WAAAA,CAAY2vD,EAAU,IAZtBvoC,EAAAzoB,KAAAixD,GAAQ,IACRxoC,EAAAzoB,KAAAkxD,GAAO,IACPzoC,EAAAzoB,KAAAmxD,GAAU,CAAA,GACV1oC,EAAAzoB,KAAAoxD,GAAY,CAAA,GACZ3oC,EAAAzoB,KAAAqxD,GAAS,IACT5oC,EAAAzoB,KAAAsxD,GAAU,IACV7oC,EAAAzoB,KAAAuxD,GAAS,eACT9oC,EAAAzoB,KAAAwxD,GAAU,kFACN7lD,EAAe/E,GAAGI,OAAS,cAAgB,mCAE/CyqD,EAAAA,KAAe,eAAA,IAGX1N,EAAA/jD,KAAKixD,GAAQD,EAAQ1zD,MACrBymD,EAAA/jD,KAAKkxD,GAAOF,EAAQzyD,KACpBwlD,EAAA/jD,KAAKmxD,GAAUH,EAAQU,OAASV,EAAQU,OAAS,MACjD3N,EAAA/jD,KAAKoxD,GAAYJ,EAAQW,SAAWX,EAAQW,SAAW,MACvD,MAAM7X,EAAQkX,EAAQlX,MAAQkX,EAAQlX,MAAM90C,cAAgB,SAC5D++C,EAAA/jD,KAAKqxD,GAASvX,EAAMhyC,OAAO,GAAGgtB,cAAgBglB,EAAMr2C,MAAM,IAC1DsgD,EAAA/jD,KAAKwxD,GAAUR,EAAQY,OAASZ,EAAQY,OAASpO,EAAAxjD,KAAKwxD,KACtDzN,EAAA/jD,KAAKuxD,GAASP,EAAQa,MAAQb,EAAQa,MAAQrO,EAAAxjD,KAAKuxD,KACnDvxD,KAAKyxD,aAAeT,EAAQS,cAAgB,EAChD,CAEA,UAAI9X,CAAOA,GACPoK,EAAA/jD,KAAKsxD,GAAU3X,EACnB,CAEA,SAAIkY,CAAMA,GACN9N,EAAA/jD,KAAKuxD,GAASM,EAClB,CAEA,SAAIA,GACA,OAAOrO,EAAAxjD,KAAKuxD,GAChB,CAEA,UAAI5X,GACA,OAAO6J,EAAAxjD,KAAKsxD,GAChB,CAEA,QAAIh0D,GACA,OAAOkmD,EAAAxjD,KAAKixD,GAChB,CAEA,YAAIU,GACA,OAAOnO,EAAAxjD,KAAKoxD,GAChB,CAEA,UAAIM,GACA,OAAOlO,EAAAxjD,KAAKmxD,GAChB,CAEA,OAAI5yD,GACA,OAAOilD,EAAAxjD,KAAKkxD,GAChB,CAEA,SAAIpX,GACA,OAAO0J,EAAAxjD,KAAKqxD,GAChB,CAEArN,YAAAA,GACI,OAAOR,EAAAxjD,KAAKwxD,IAAQl3D,QAAQ,UAAWkpD,EAAAxjD,KAAKqxD,KAAQjP,WAAW,QAASoB,EAAAxjD,KAAKkxD,IACjF,CAEAjN,WAAAA,GACI,OAAOT,EAAAxjD,KAAKuxD,GAChB,CAEAO,UAAAA,CAAW7yD,IACwDukD,IAA/DA,EAAAxjD,KAAKsxD,IAAQhgD,WAAUygD,GAAKA,EAAE9yD,QAAUA,EAAMA,SAAiBukD,EAAAxjD,KAAKsxD,IAAQ/tD,KAAKtE,EACrF,EAtEAgyD,GAAA,IACAC,QAAAA,GAAA,IACAC,QAAAA,GAAA,IACAC,QAAAA,GAAA,IACAC,QAAAA,GAAA,IACAC,QAAAA,GAAA,IACAC,QAAAA,GAAA,YACAC,GAAA,IAAArO,QCVW,MAAM6O,GAUjB3wD,WAAAA,EACIpC,MAAAA,EACAqB,MAAAA,EACAgb,WAAAA,EACAi+B,UAAAA,EACAr7C,KAAAA,EAAO,GACP2B,MAAAA,EAAQ,GACRY,SAAAA,GAAW,EACX+uB,SAAAA,GAAW,IAjBf/G,EAAAzoB,KAAAiyD,GAAS,MACTxpC,EAAAzoB,KAAAkyD,GAAS,MACTzpC,EAAAzoB,KAAAmyD,GAAc,MACd1pC,EAAAzoB,KAAAoyD,GAAa,MACb3pC,EAAAzoB,KAAAyqD,GAAQ,IACRhiC,EAAAzoB,KAAAqyD,GAAS,IACT5pC,EAAAzoB,KAAAsyD,IAAY,GACZ7pC,EAAAzoB,KAAAuyD,IAAY,GAYHtzD,EAIAqB,EAIAgb,EAIAi+B,GAKLwK,EAAA/jD,KAAKiyD,GAAShzD,GACd8kD,EAAA/jD,KAAKkyD,GAAS5xD,GACdyjD,EAAA/jD,KAAKmyD,GAAc72C,GACnByoC,EAAA/jD,KAAKoyD,GAAa7Y,GAClBwK,EAAA/jD,KAAKyqD,GAAQvsD,GACb6lD,EAAA/jD,KAAKqyD,GAASxyD,GACdkkD,EAAA/jD,KAAKsyD,GAAY7xD,GACjBsjD,EAAA/jD,KAAKuyD,GAAY/iC,GAEjBxvB,KAAKm6C,aAAe,MAbhB7iD,QAAQD,MAAM,gDAJdC,QAAQD,MAAM,iDAJdC,QAAQD,MAAM,4CAJdC,QAAQD,MAAM,2CA0BtB,CAEA,YAAIm4B,CAASvwB,GACT8kD,EAAA/jD,KAAKuyD,KAActzD,EACvB,CAEA,YAAIuwB,GACA,OAA6B,OAAtBxvB,KAAKm6C,aAA8C,IAAtBn6C,KAAKm6C,aAAqBqJ,EAAAxjD,KAAKuyD,GACvE,CAEA,YAAI9xD,CAASxB,GACT8kD,EAAA/jD,KAAKsyD,KAAcrzD,EACvB,CAEA,YAAIwB,GACA,OAAO+iD,EAAAxjD,KAAKsyD,GAChB,CAEA,aAAI/Y,GACA,OAAOiK,EAAAxjD,KAAKoyD,GAChB,CAEA,cAAI92C,GACA,OAAOkoC,EAAAxjD,KAAKmyD,GAChB,CAEA,SAAIlzD,GACA,OAAOoG,MAAMmJ,QAAQg1C,EAAAxjD,KAAKiyD,KAAUzO,EAAAxjD,KAAKiyD,IAAO5vD,KAAK,KAAOmhD,EAAAxjD,KAAKiyD,GACrE,CAEA,SAAI3xD,GACA,OAAOkjD,EAAAxjD,KAAKkyD,GAChB,CAEA,SAAIryD,GACA,OAAO2jD,EAAAxjD,KAAKqyD,GAChB,CAEA,QAAIn0D,GACA,OAAOslD,EAAAxjD,KAAKyqD,GAChB,CAGAxqD,MAAAA,GACI,MAAMuyD,EAA0C,OAAtBxyD,KAAKm6C,aAAwB,KAAKn6C,KAAKm6C,gBAAkB,GAE5E,MAAA,qCACWqJ,EAAAxjD,KAAKoyD,OAAc5O,EAAAxjD,KAAKiyD,gDACTzO,EAAAxjD,KAAKiyD,8CACPzO,EAAAxjD,KAAKoyD,gDACH5O,EAAAxjD,KAAKkyD,sCACf1O,EAAAxjD,KAAKsyD,uCACJ9O,EAAAxjD,KAAKuyD,6BACf/O,EAAAxjD,KAAKyqD,IAAQ,SAASjH,EAAAxjD,KAAKyqD,OAAW,2BACtCjH,EAAAxjD,KAAKqyD,IAAS,UAAU7O,EAAAxjD,KAAKqyD,OAAY,wBAC5C7O,EAAAxjD,KAAKkyD,MAASM,aAC7B,EAtGAP,GAAA,IACAC,QAAAA,GAAA,IACAC,QAAAA,GAAA,IACAC,QAAAA,GAAA,IACA3H,QAAAA,GAAA,IACA4H,QAAAA,GAAA,IACAC,QAAAA,GAAA,YACAC,GAAA,IAAApP,QCRJ,MAeAsP,GAAe,CAACC,EAAkB9hD,EAAY+hD,KACtC,IAACD,IAAqB9hD,EACdvZ,OAAAA,QAAAA,MAAM,+CACP,GAGLggD,MAAAA,EAAUqb,EAAiBh2D,KAAI7F,GAAU,IAAIk6D,GAAOl6D,KAC1D+Z,OAAAA,EACK9Z,QAAO,CAAC0gD,EAAK3mC,IAAa2mC,EAAIC,OAAO5mC,EAASkD,WAAW,IACzDnO,SAAQ9J,IACLu7C,EAAQzxC,SAAQ/O,IACN0iD,MAAAA,EAAY1iD,EAAO0H,IACnB+c,EAAazkB,EAAOyG,KACpBs1D,EAAa92D,EAAQy9C,GACL,iBAAfqZ,EACDA,EAAWl2D,KAAIjG,IACLF,MAAAA,EA/BRs8D,EAACjiD,EAAY5T,KAEjC,MAAM81D,EAAeliD,GAAYpa,MAC7Bqa,GAAYA,EAAS7T,KAAOA,IAAO6T,EAAS7T,GAAGoL,SAAS,WAE5D,OAAO0qD,EACD,CAEI50D,KAAM40D,EAAa50D,MAAMA,KACzB2B,MAAOizD,EAAa1C,aAAe0C,EAAa1C,aAAe,KAC/D9vD,MAAOwyD,EAAa52D,MAExB,IAAA,EAmB6B22D,CAAgBF,EAAgBl8D,GACzCF,GACAM,EAAOi7D,WACH,IAAIE,GAAsB,CACtBzY,UAAAA,EACAj+B,WAAAA,EACArc,MAAOxI,EACPyH,KAAMrH,EAAO66D,SAASj7D,GACtB6J,MAAO/J,EAAK+J,MACZT,MAAOtJ,EAAKsJ,OAAS,OAE7B,IAGRhJ,EAAOi7D,WACH,IAAIE,GAAsB,CACtBzY,UAAAA,EACAj+B,WAAAA,EACArc,MAAO2zD,EACP10D,KAAMrH,EAAO66D,SAASnY,GACtBj5C,MAC+B,mBAApBzJ,EAAO86D,SACR96D,EAAO86D,SAASiB,GAChBA,IAElB,GACT,IAGFvb,CAAAA,ECjDE0b,GAAiBA,CAACniD,EAAYoiD,EAASxS,EAAcyS,KAC9D,IAAKriD,EACOvZ,OAAAA,QAAAA,MAAM,4DACP,GAGX,MAAM67D,EAAetiD,EAChBlU,KAAImU,GAAYA,EAASkD,SAASrX,KAAIZ,GAAWA,EAAQmB,UACzDk2D,OACA1a,MAAK,CAACH,EAAGC,IAAMp5C,WAAWm5C,GAAKn5C,WAAWo5C,KAC1C1hD,QAAO,CAACoG,EAAO4I,EAAOyjC,IAAQA,EAAIzuC,QAAQoC,KAAW4I,IAE1D,GAAIqtD,EAAar0D,OAAS,EACdxH,OAAAA,QAAAA,MAAM,sEACP,GAGL+7D,MAEAC,EAAe3wD,KAAK2P,MAtBC,IAsBK6gD,EAAar0D,QAAmC,EAC1Ey0D,EAAY5wD,KAAK2P,MAtBI,IAsBE6gD,EAAar0D,QAAmC,EAMvE00D,EAAc,IAAIxC,GAAO,CAC3BzzD,KAAM,UACNiB,IAAK,cACLu7C,MAAO0G,EAAa,6CAGlBgT,EAAe,CACjB,CACIJ,IAAKF,EAAa3S,GAjBd,GAkBJ59C,IAAKuwD,EAAa3S,GAAG8S,GACrB/yD,MAAO0yD,EAAQn8C,YAAY48C,wBAA0B,cACrDx0D,MAAO,aAEX,CACIm0D,IAAKF,EAAa3S,GAAG8S,EAAe,GACpC1wD,IAAKuwD,EAAa3S,GAAG+S,GACrBhzD,MAAO0yD,EAAQn8C,YAAY68C,2BAA6B,cACxDz0D,MAAO,aAEX,CACIm0D,IAAKF,EAAa3S,GAAG+S,EAAY,GACjC3wD,IAAKuwD,EAAa3S,IA7Bd,GA8BJjgD,MAAO0yD,EAAQn8C,YAAY88C,yBAA2B,eACtD10D,MAAO,eAIfu0D,OAAAA,EAAa5tD,SAAQ3I,IACjBs2D,EAAYzB,WACR,IAAIE,GAAsB,CACtB/yD,MAAO,CAAChC,EAAMgC,OACdqB,MAAOrD,EAAMqD,MAAMhG,QACf,UACA,IAAI24D,EAAYt3D,eAAegE,MAC3BszD,EAAYx5D,SACZwD,EAAMm2D,UACHH,EAAYt3D,eAAegE,MAAMszD,EAAYx5D,SAAUwD,EAAM0F,QAExE2Y,WAAYi4C,EAAYj2D,KACxBi8C,UAAWga,EAAYh1D,MAE/B,IAMJqS,EAAWhL,SAAQiL,IACfA,EAASkD,SAASnO,SAAQ9J,IACtBA,EAAQy3D,YAAcC,EAAa18D,QAAO,CAAC0gD,EAAK3jB,KACxC/3B,EAAQmB,OAAS42B,EAAMu/B,KAAOt3D,EAAQmB,OAAS42B,EAAMlxB,KACrD60C,EAAIj0C,KAAKswB,EAAM50B,OAEZu4C,IACR,GAAE,GACR,IAGE,CAAC+b,EAAW,EC/FVK,GAAsBA,CAC/BhjD,EACAoiD,EACAlS,EACAN,EACAyS,IAEoBnS,EAAoBryC,MAAKk/C,GAAOA,EAAIyC,eAIjD,IACAqC,GACC,CACI,CACIn1D,KAAM,UACNiB,IAAK,cACLu7C,MAAO0G,EAAa,4CAA8C,UAG1E5vC,EACAkwC,MAGDiS,GAAeniD,EAAYoiD,EAASxS,EAAcyS,IAf9C,IAAIF,GAAeniD,EAAYoiD,EAASxS,EAAcyS,ICIxDY,GAAoBb,GAAW,CACxC,CACIh2D,GAAI,UACJsD,MAAO0yD,EAAQn8C,YAAYi9C,kCAC3Bv1D,IAAK,cACL45C,MAAO,MACP5oB,SAAS,GAEb,CACIvyB,GAAI,qBACJsD,MAAO0yD,EAAQn8C,YAAYk9C,sCAC3Bx1D,IAAK,QACL45C,MAAO,MACP5oB,SAAS,GAEb,CACIvyB,GAAI,sBACJsD,MAAO0yD,EAAQn8C,YAAYm9C,uCAC3Bz1D,IAAK,QACL45C,MAAO,OACP5oB,SAAS,ICvBFkvB,GAAA,CACXa,cAAe,WACIlnD,SAASq9B,eAAe6gB,IAA6Br2B,cAC7Drf,aAAa,cAAeg2C,GAAQE,UAC9C,EAIDkL,aAAc,WACV,MAAMnrD,EAASuB,SAASq9B,eAAeygB,IACjCrf,EAAaz+B,SAASq9B,eAAe4gB,IACrC92C,EAAcnH,SAASq9B,eAAe6gB,IACtC2d,EAAkB77D,SAASq9B,eAAe8gB,IAEhD1/C,EAAO+J,aAAa,eAAgBg2C,GAAQE,WAC5CjgD,EAAO+J,aAAa,sBAAuBg2C,GAAQmD,wBACnDljB,EAAWj2B,aAAa,eAAgBg2C,GAAQE,WAChDv3C,EAAYqB,aAAa,eAAgBg2C,GAAQE,WAEjDjgD,EAAO+nB,MAAMC,QAAU,QAEvBgY,EAAWjY,MAAMC,QAAU,QAE3Btf,EAAYqf,MAAMC,QAAU,QAE5Bo1C,EAAgBr1C,MAAMC,QAAU,OAE5B+3B,GAAQ11C,IAAI,yBACZrK,EAAOgK,UAAUC,IAAI,wBAGzB1I,SAASq9B,eAAe8gB,IAAgC33B,MAAMC,QAAU,MAC3E,EAIDkjC,oBAAqB,WACXlrD,MAAAA,EAASuB,SAASq9B,eAAeygB,IACjCrf,EAAaz+B,SAASq9B,eAAe4gB,IACrC92C,EAAcnH,SAASq9B,eAAe6gB,IACtC2d,EAAkB77D,SAASq9B,eAAe8gB,IAC1C2d,EAAqB97D,SAASq9B,eAAe+gB,IAEnD3/C,EAAO+nB,MAAMC,QAAU,QACvBhoB,EAAO+J,aAAa,eAAgBg2C,GAAQE,WAC5CjgD,EAAO+J,aAAa,sBAAuBg2C,GAAQmD,wBAE/CljB,IAAYA,EAAWjY,MAAMC,QAAU,QAEvCtf,IAAaA,EAAYqf,MAAMC,QAAU,QAEzCo1C,IACAA,EAAgBrzD,aAAa,eAAgBg2C,GAAQoD,6BACrDia,EAAgBr1C,MAAMC,QAAU,SAEhCq1C,IACAA,EAAmB/uD,YAAcyxC,GAAQ+B,wBAEhD,EAIDiK,eAAgB,WAERuR,IAAAA,EAAiB/7D,SAChBuiC,uBAAuB,WAAW,IACjCpuB,cAAc,IAAI6pC,MAEnB+d,GAuBDA,EAAe5nD,cAAc,oBAAoB3L,aAAa,eAAgB,QAC9EnJ,EAAc,CAAEC,UAAWiB,EAAkBhB,KAAM,CAAEqF,GAAIo5C,QAtBzD+d,EAAiB5pD,EACbnS,SAASuI,cAAc,WAAY,CAC/BiG,GAAI3F,eAAeC,IAAI,WAE3B,CACI,eAAgB01C,GAAQE,UACxB95C,GAAIo5C,GACJtgC,SAAUsgC,GACV/qC,UAAW,SACXmwB,QAAS,QACTx5B,QAAS40C,GAAQ4J,aAAa,qCAC9B/kB,YAAa,QACbtM,QACI,2EAGZ/2B,SAASuiC,uBAAuB,WAAW,IAAI70B,YAAYquD,GAE3D18D,EAAc,CAAEC,UAAWiB,EAAkBhB,KAAM,CAAEqF,GAAIo5C,MAMhE,EAIDqJ,UAAW,SAAUjnD,GACX47D,MAAAA,EAAe57D,EAAEP,OAAO+pB,KAAO,QACrC1qB,QAAQD,MAAM+8D,EAClB,GC/GJ,MAAMC,WAAmB/K,GACrBjoD,WAAAA,GACIyC,QACA9D,KAAK+2C,QAAU,UACf/2C,KAAKupD,qBAAuB0G,GAC5BjwD,KAAKwpD,mBAAqBoK,GAC1B5zD,KAAK6/C,gBAAkBgU,GACvB7zD,KAAKy+C,UAAYA,EACrB,EAGJx9C,eAAeC,IAAI,mBAAqBD,eAAeE,OAAO,iBAAkBkzD"}