{"version":3,"file":"ProductView.min.js","sources":["ProductView.js"],"sourcesContent":["(function ($, _, root, undefined) {\r\n 'use strict';\r\n\r\n var assetId = 'uc209-productview';\r\n\r\n // Main product controller\r\n function productViewController($viewContainer, productViewModel) {\r\n var model = productViewModel;\r\n var pubsub = root.PubSub;\r\n var utils = new util();\r\n var say = new notificator(pubsub, utils);\r\n var variantProcessorsMap = {};\r\n var flags = null;\r\n var cart = null;\r\n var rating = null;\r\n var gallery = null;\r\n var priceTotals = null;\r\n var packageComponents = null;\r\n\r\n return {\r\n init: function () {\r\n var quantityDiscounts = new quantityDiscountsProcessor($viewContainer, model);\r\n var externalTracking = new externalTrackingProcessor();\r\n\r\n priceTotals = new priceTotalsProcessor($viewContainer, utils);\r\n priceTotals.init();\r\n\r\n if (model.isProductWithVariants) {\r\n var preselectedVariants = _getPreselectedVariantsFromQueryString();\r\n _initVariantsProcessor($viewContainer, model, priceTotals, quantityDiscounts, externalTracking, preselectedVariants, true);\r\n }\r\n else {\r\n quantityDiscounts.renderQuantityDiscounts();\r\n }\r\n\r\n if (model.packageComponentProducts) {\r\n _.each(model.packageComponentProducts, function (packageComponent) {\r\n if (packageComponent.isMainProductOfProductWithVariants) {\r\n var $componentProductContainer = $viewContainer.find('.js-component-products-list .js-component-product[data-uniqueid=\"' + packageComponent.uniqueId + '\"]');\r\n packageComponent.variantRelImageMatchRegExp = model.variantRelImageMatchRegExp;\r\n _initVariantsProcessor($componentProductContainer, packageComponent, priceTotals);\r\n }\r\n });\r\n packageComponents = new PackageComponentProcessor($viewContainer, model, utils);\r\n }\r\n\r\n if (model.additionalProducts) {\r\n _.each(model.additionalProducts, function (additionalProduct) {\r\n if (additionalProduct.isProductWithVariants) {\r\n var $additionalProductContainer = $viewContainer.find('.js-additional-product[data-uniqueid=\"' + additionalProduct.uniqueId + '\"]');\r\n additionalProduct.variantRelImageMatchRegExp = model.variantRelImageMatchRegExp;\r\n _initVariantsProcessor($additionalProductContainer, additionalProduct, priceTotals);\r\n }\r\n });\r\n }\r\n\r\n cart = new cartProcessor($viewContainer, model, say, pubsub, variantProcessorsMap, utils);\r\n cart.init();\r\n\r\n flags = new flagsProcessor($viewContainer, model);\r\n flags.init();\r\n\r\n rating = new ratingProcessor($viewContainer, model, pubsub);\r\n rating.init();\r\n\r\n var shoppingListHandler = new shoppingListProcessor($viewContainer, model, say, utils, variantProcessorsMap);\r\n shoppingListHandler.init();\r\n\r\n if (model.isPrintEnabled) {\r\n var printHanlder = new printProcessor($viewContainer, model);\r\n printHanlder.init();\r\n }\r\n\r\n var pdfHadnler = new pdfProcessor($viewContainer, model);\r\n pdfHadnler.init();\r\n\r\n if (model.isPriceRequestEnabled) {\r\n var priceRequestHandler = priceRequestProcessor($viewContainer);\r\n priceRequestHandler.init();\r\n }\r\n\r\n gallery = new galleryProcessor($viewContainer, model);\r\n gallery.init();\r\n\r\n externalTracking.reportProductsView($viewContainer, model);\r\n\r\n var enableRelationExtensionDataProcessing = model.isProductRelationsExtensionEnabled && model.isProductWithVariants && model.additionalProducts && model.additionalProducts.length;\r\n if (enableRelationExtensionDataProcessing) {\r\n var relExtDataProcessor = new relationExtensionDataProcessor($viewContainer, model, variantProcessorsMap, priceTotals, pubsub);\r\n relExtDataProcessor.init();\r\n }\r\n\r\n const similarProductsSelect = $viewContainer.find('select.js-similar-products-selector');\r\n if (similarProductsSelect.length) {\r\n similarProductsSelect.on('change', (e) => window.location = e.target.selectedOptions[0].dataset.url);\r\n }\r\n }\r\n };\r\n\r\n function _initVariantsProcessor($productContainer, productModel, priceTotals, quantityDiscountsProcessorInstance, externalTrackingProcessorInstance, preselectedVariants, enableHistoryState) {\r\n var processor = new variantsProcessor($productContainer, productModel, model.metadata, preselectedVariants, say, pubsub, priceTotals, quantityDiscountsProcessorInstance, externalTrackingProcessorInstance, utils, enableHistoryState);\r\n processor.init();\r\n\r\n variantProcessorsMap[productModel.uniqueId] = processor;\r\n }\r\n\r\n function _getPreselectedVariantsFromQueryString() {\r\n var result = {}, queryString = location.search.slice(1), re = /sel(?:\\:|%3a){1}([^&=]+)=([^&]*)/gi, match;\r\n\r\n while ((match = re.exec(queryString))) {\r\n var paramKey = decodeURIComponent(match[1]).toLowerCase();\r\n var paramValue = decodeURIComponent(match[2].replace(/\\+/g, ' ')).toLowerCase();\r\n result[paramKey] = paramValue;\r\n }\r\n\r\n return result;\r\n }\r\n }\r\n\r\n root.productViewController = productViewController;\r\n\r\n $(function () {\r\n if (root.umwAssets && root.umwAssets[assetId]) {\r\n root.umwAssets[assetId].forEach(function (ctx) {\r\n if (ctx) {\r\n var mainPanelId = ctx.uniqueId;\r\n var $mainPanel = $('#' + mainPanelId);\r\n\r\n if ($mainPanel.length === 1) {\r\n var controller = new productViewController($mainPanel, ctx);\r\n controller.init();\r\n } else if ($mainPanel.length === 0) {\r\n console.warn(assetId + ': product view main panel element was not found by id#' + mainPanelId);\r\n } else {\r\n console.warn(assetId + ': found >1 product view main panel elements with id#' + mainPanelId);\r\n }\r\n }\r\n });\r\n }\r\n });\r\n\r\n // Notifications processor\r\n function notificator(pubsub, utils) {\r\n function _notify(message, notificationType, timeout) {\r\n if (typeof message === 'object' && message !== null) {\r\n message = utils.extractErrorMessageFromResponse(message);\r\n }\r\n\r\n if (pubsub) {\r\n pubsub.publish('notification.' + notificationType, { text: message, timeout: timeout });\r\n } else {\r\n var notificationTypeMap = {\r\n 'error': 'error',\r\n 'alert': 'log',\r\n 'success': 'log',\r\n 'warning': 'warn'\r\n };\r\n\r\n root.console[notificationTypeMap[notificationType]].apply(this, [message]);\r\n }\r\n }\r\n\r\n return {\r\n warning: function (message) {\r\n _notify(message, 'warning', false);\r\n },\r\n error: function (message) {\r\n _notify(message, 'error', false);\r\n },\r\n success: function (message) {\r\n _notify(message, 'success', 30000);\r\n }\r\n };\r\n }\r\n\r\n // Variants processor\r\n function variantsProcessor($productContainer, product, metadata, preselectedVariants, say, pubsub, priceTotalsController, quantityDiscounts, externalTracking, utils, enableHistoryState) {\r\n var $container = $productContainer;\r\n var $declaredVariantSelectors = utils.$getProductContainerElements($container, '.js-variant-selector');\r\n\r\n var variantControllers = {};\r\n var isVariantProductShown = false;\r\n var suppressVariantProductDetailsLoading = false;\r\n\r\n var variantsState = { controlId: product.uniqueId, selectedVariantProd: null };\r\n var suppressVariantChangedEvent = false;\r\n\r\n var currentlyUnavailableVariantsMap = {};\r\n\r\n function _onVariantSelectionChanged(changedVariantType, newVariantValue) {\r\n var changedVariantController = _getVariantControllerById(changedVariantType.id);\r\n var prevVariantValue = changedVariantController.selectedValue;\r\n changedVariantController.selectedValue = newVariantValue || 0;\r\n\r\n var selectedVariants = _getSelectedVariants();\r\n\r\n var selectedVariantProduct = null;\r\n\r\n var isSelectionComplete = _.every(selectedVariants, function (x) { return x > 0; });\r\n if (isSelectionComplete) {\r\n var variantProductsForSelection = _getProductsForCurrentSelection();\r\n\r\n if (variantProductsForSelection.length === 0) {\r\n say.warning(metadata['noAvailableVariantProducts']);\r\n } else if (variantProductsForSelection.length === 1) {\r\n selectedVariantProduct = variantProductsForSelection[0];\r\n } else if (variantProductsForSelection.length > 1) {\r\n say.warning(metadata['invalidVariantsConfiguration'] + ' ' + metadata['multipleAvailableVariantProducts']);\r\n }\r\n }\r\n\r\n if (!suppressVariantProductDetailsLoading) {\r\n if (selectedVariantProduct) {\r\n _loadVariantProductDetails(selectedVariantProduct);\r\n } else if (isVariantProductShown) {\r\n // De-selection, or unavailable dimensions combination - load main product and show\r\n _loadVariantProductDetails();\r\n }\r\n }\r\n\r\n if (quantityDiscounts) {\r\n quantityDiscounts.renderQuantityDiscounts(selectedVariants);\r\n }\r\n\r\n pubsub.publish('variantprocessor.variant.changed', [newVariantValue, prevVariantValue, changedVariantController]);\r\n\r\n function _getProductsForCurrentSelection() {\r\n var availableProducts = _.filter(product.variantProducts, function (x) {\r\n return _.every(selectedVariants, function (y) { return _.indexOf(x.variants, y) !== -1; });\r\n });\r\n\r\n return availableProducts;\r\n }\r\n\r\n function _getSelectedVariants() {\r\n return _.map(variantControllers, function (currentController) {\r\n return currentController.selectedValue || 0;\r\n });\r\n }\r\n }\r\n\r\n function _filterUnavailableVariants() {\r\n var selectedVariantTypes = [];\r\n var selectedVariantOptions = [];\r\n _.each(variantControllers, variantController => {\r\n if (variantController.selectedValue > 0) {\r\n selectedVariantTypes.push(variantController.variantType.id);\r\n selectedVariantOptions.push(variantController.selectedValue);\r\n }\r\n });\r\n\r\n const isAnyVariantSelected = selectedVariantOptions.length > 0;\r\n // assuming that all variants unavailable\r\n product.variantProducts.forEach(variantProduct => {\r\n var isProductForCurrentSelection = selectedVariantOptions.every(selectedVariantOption => variantProduct.variants.find(x => x === selectedVariantOption));\r\n if (!isAnyVariantSelected || isProductForCurrentSelection) {\r\n variantProduct.variants.forEach(variantId => {\r\n currentlyUnavailableVariantsMap[variantId] = currentlyUnavailableVariantsMap[variantId] = { message: variantProduct.availabilityMessage || metadata['notAvailableProduct'], disabled: !variantProduct.exists };\r\n });\r\n }\r\n });\r\n // set available\r\n product.variantProducts.forEach(variantProduct => {\r\n var isProductForCurrentSelection = selectedVariantOptions.every(selectedVariantOption => variantProduct.variants.find(x => x === selectedVariantOption));\r\n if ((!isAnyVariantSelected || isProductForCurrentSelection) && variantProduct.isAvailable) {\r\n variantProduct.variants.forEach(variantId => {\r\n delete currentlyUnavailableVariantsMap[variantId];\r\n });\r\n }\r\n });\r\n\r\n _.each(variantControllers, function (variantController) {\r\n var preselectSingleAvailable = (_.isEmpty(preselectedVariants) || !preselectedVariants[variantController.variantType.name.toLowerCase()]) && variantController.variantType.variants.length === 1;\r\n variantController.selector.filterVariants(currentlyUnavailableVariantsMap, preselectSingleAvailable);\r\n });\r\n }\r\n\r\n function _loadVariantProductDetails(variantProduct) {\r\n var beforeLoadEvent = $.Event('variantsprocessor:beforeloadvariantproduct');\r\n $container.trigger(beforeLoadEvent, [variantProduct]);\r\n\r\n if (beforeLoadEvent.isDefaultPrevented()) {\r\n return;\r\n }\r\n\r\n $.blockUI({ message: '' });\r\n\r\n var selectedVariants = variantProduct ? variantProduct.variants : [];\r\n $.ajax({\r\n url: root.R + 'handlers/public/productdata.ashx',\r\n type: 'GET',\r\n data: {\r\n a: 'GetDimDetails',\r\n ItemID: product.itemId,\r\n Dim1: selectedVariants[0] !== undefined ? selectedVariants[0] : 0,\r\n Dim2: selectedVariants[1] !== undefined ? selectedVariants[1] : 0,\r\n Dim3: selectedVariants[2] !== undefined ? selectedVariants[2] : 0,\r\n CanHandleDisallowedBuyDims: true,\r\n ImageWidth: product.previewImageWidth,\r\n ImgMod: product.previewImageMode,\r\n InclVat: product.sellPrice ? product.sellPrice.inclVat : null\r\n }\r\n })\r\n .always($.unblockUI)\r\n .done(function (variantProductDetails) {\r\n _updateViewProductWithNewData(variantProductDetails);\r\n\r\n if (enableHistoryState === true) {\r\n _updateHistory(variantProductDetails);\r\n }\r\n\r\n pubsub.publish('variantprocessor.variantproduct.updated', variantProductDetails);\r\n })\r\n .fail(function (errorResponse) {\r\n say.error(errorResponse);\r\n });\r\n\r\n function _updateViewProductWithNewData(newData) {\r\n // Note: all raw prices, discount percent, price2, price3, ean, measurements, weight and all other dimension-specific possible values are not supported at the moment (20.09.2018)\r\n product.isMainProductOfProductWithVariants = newData.IsMainProd;\r\n product.isVariantProductOfProductWithVariants = isVariantProductShown = !newData.IsMainProd;\r\n var $priceFromText = utils.$getProductContainerElements($container, '.js-price-fromtext');\r\n if ($priceFromText.length > 0) {\r\n $priceFromText.toggle(product.isMainProductOfProductWithVariants);\r\n }\r\n\r\n product.productId = newData.ProductID;\r\n $container.data('productid', product.productId);\r\n\r\n product.prodno = newData.ProdNo;\r\n utils.$getProductContainerElements($container, '.js-product-number').text(product.prodno);\r\n\r\n product.title = newData.FullTitle;\r\n utils.$getProductContainerElements($container, '.js-product-title').text(product.title);\r\n\r\n if (externalTracking) {\r\n externalTracking.reportProductDetailsView(product.productId);\r\n }\r\n\r\n if (newData.ImageURL) {\r\n product.mainImage = {\r\n id: newData.ImageID,\r\n title: newData.ImageText,\r\n description: newData.ImageText,\r\n actualWidth: newData.ImageMaxWidth,\r\n thumbnailUrl: newData.ImageRelURL,\r\n previewUrl: newData.ImageURL,\r\n fullSizeUrl: newData.ImageLBURL,\r\n displayWidth: newData.ImagePreviewDisplayWidth,\r\n displayHeight: newData.ImagePreviewDisplayHeight\r\n };\r\n\r\n var $mainImage = utils.$getProductContainerElements($container, '.js-product-mainimage');\r\n if ($mainImage.length > 0) {\r\n $mainImage.attr('src', product.mainImage.previewUrl);\r\n $mainImage.attr('alt', product.mainImage.title);\r\n\r\n $mainImage.attr('data-imageid', product.mainImage.id);\r\n $mainImage.data('imageid', product.mainImage.id);\r\n\r\n if (product.mainImage.displayWidth && product.mainImage.displayHeight) {\r\n $mainImage.attr('width', product.mainImage.displayWidth);\r\n $mainImage.attr('height', product.mainImage.displayHeight);\r\n }\r\n\r\n if (product.galleryId) {\r\n var $mainImageGalleryLink = $mainImage.closest('[data-fancybox=\"' + product.galleryId + '\"]');\r\n if ($mainImageGalleryLink.length === 1) {\r\n $mainImageGalleryLink.attr('href', product.mainImage.fullSizeUrl);\r\n\r\n $mainImageGalleryLink.attr('data-caption', product.mainImage.description);\r\n $mainImageGalleryLink.data('caption', product.mainImage.description);\r\n\r\n $mainImageGalleryLink.attr('data-width', product.mainImage.actualWidth);\r\n $mainImageGalleryLink.data('width', product.mainImage.actualWidth);\r\n\r\n $mainImageGalleryLink.removeAttr('data-height');\r\n $mainImageGalleryLink.removeData('height');\r\n }\r\n }\r\n }\r\n }\r\n\r\n product.stockText = newData.StockText;\r\n product.stockColor = newData.StockColor;\r\n var $stockText = utils.$getProductContainerElements($container, '.js-stock-text');\r\n if ($stockText.length > 0) {\r\n $stockText.text(product.stockText);\r\n $stockText.css('color', product.stockColor || 'inherit');\r\n }\r\n\r\n if (product.sellPrice) {\r\n product.sellPrice.formatted = newData.Price;\r\n delete product.sellPrice.raw; // not available in the incoming data set\r\n\r\n var $sellPriceFormatted = utils.$getProductContainerElements($container, '.js-sellprice-formatted');\r\n if ($sellPriceFormatted.length > 0) {\r\n $sellPriceFormatted.text(product.sellPrice.formatted);\r\n }\r\n }\r\n\r\n if (product.sellPriceWithVAT) {\r\n product.sellPriceWithVAT.formatted = newData.PriceInclVat;\r\n delete product.sellPriceWithVAT.raw; // not available in the incoming data set\r\n\r\n var $sellPriceWithVatFormatted = utils.$getProductContainerElements($container, '.js-sellprice-withvat-formatted');\r\n if ($sellPriceWithVatFormatted.length > 0) {\r\n $sellPriceWithVatFormatted.text(product.sellPriceWithVAT.formatted);\r\n }\r\n }\r\n\r\n if (product.sellPriceWithoutVAT) {\r\n product.sellPriceWithoutVAT.formatted = newData.PriceExclVat;\r\n delete product.sellPriceWithoutVAT.raw; // not available in the incoming data set\r\n\r\n var $sellPriceWithoutVatFormatted = utils.$getProductContainerElements($container, '.js-sellprice-withoutvat-formatted');\r\n if ($sellPriceWithoutVatFormatted.length > 0) {\r\n $sellPriceWithoutVatFormatted.text(product.sellPriceWithoutVAT.formatted);\r\n }\r\n }\r\n\r\n if (product.beforePrice) {\r\n product.beforePrice.formatted = newData.OriginalPrice;\r\n delete product.beforePrice.raw; // not available in the incoming data set\r\n\r\n var $beforePriceFormatted = utils.$getProductContainerElements($container, '.js-beforeprice-formatted');\r\n if ($beforePriceFormatted.length > 0) {\r\n var $beforePriceElements = utils.$getProductContainerElements($container, '.js-beforeprice-value, .js-beforeprice-label').add($beforePriceFormatted);\r\n if (newData.HasDiscount) {\r\n $beforePriceFormatted.text(product.beforePrice.formatted);\r\n $beforePriceElements.show();\r\n } else {\r\n $beforePriceElements.hide();\r\n }\r\n }\r\n }\r\n\r\n if (product.discountPrice) {\r\n product.discountPrice.formatted = newData.Discount;\r\n delete product.discountPrice.raw; // not available in the incoming data\r\n\r\n var $discountPriceFormatted = utils.$getProductContainerElements($container, '.js-discountprice-formatted');\r\n if ($discountPriceFormatted.length > 0) {\r\n var $discountPriceElements = utils.$getProductContainerElements($container, '.js-discountprice-value, .js-discountprice-label').add($discountPriceFormatted);\r\n\r\n if (newData.HasDiscount && product.discountPrice.formatted) {\r\n $discountPriceFormatted.text(product.discountPrice.formatted);\r\n\r\n $discountPriceElements.show();\r\n } else {\r\n $discountPriceElements.hide();\r\n }\r\n }\r\n }\r\n\r\n if (product.discountPercent) {\r\n product.discountPercent.formatted = newData.DiscountPercent;\r\n delete product.discountPercent.raw; // not available in the incoming data\r\n\r\n var $discountPercentFormatted = utils.$getProductContainerElements($container, '.js-discountpercent-formatted');\r\n if ($discountPercentFormatted.length > 0) {\r\n var $discountPercentElements = utils.$getProductContainerElements($container, '.js-discountpercent-value, .js-discountpercent-label').add($discountPercentFormatted);\r\n\r\n if (newData.HasDiscount && product.discountPercent.formatted) {\r\n $discountPercentFormatted.text('-' + product.discountPercent.formatted + '%');\r\n\r\n $discountPercentElements.show();\r\n } else {\r\n $discountPercentElements.hide();\r\n }\r\n }\r\n }\r\n\r\n if (product.discountToDate) {\r\n product.discountToDate.formatted = newData.DiscountToDate;\r\n delete product.discountToDate.raw; // not available in the incoming data\r\n\r\n var $discountToDateFormatted = utils.$getProductContainerElements($container, '.js-discounttodate-formatted');\r\n if ($discountToDateFormatted.length > 0) {\r\n var $discountToDateElements = utils.$getProductContainerElements($container, '.js-discounttodate-value, .js-discounttodate-label').add($discountToDateFormatted);\r\n\r\n if (newData.HasDiscount && product.discountToDate.formatted) {\r\n $discountToDateFormatted.text(product.discountToDate.formatted);\r\n\r\n $discountToDateElements.show();\r\n } else {\r\n $discountToDateElements.hide();\r\n }\r\n }\r\n }\r\n\r\n if (product.comparablePrice) {\r\n product.comparablePrice.formatted = newData.ComparablePrice;\r\n delete product.comparablePrice.raw; // not available in the incoming data set\r\n\r\n var $comparablePriceFormatted = utils.$getProductContainerElements($container, '.js-comparableprice-formatted');\r\n if ($comparablePriceFormatted.length > 0) {\r\n $comparablePriceFormatted.text(product.comparablePrice.formatted);\r\n }\r\n }\r\n\r\n if (product.factorPrice) {\r\n product.factorPrice.formatted = newData.FactorPrice;\r\n delete product.factorPrice.raw; // not available in the incoming data set\r\n\r\n var $factorPriceFormatted = utils.$getProductContainerElements($container, '.js-factor-price-formatted');\r\n if ($factorPriceFormatted.length > 0) {\r\n $factorPriceFormatted.text(product.factorPrice.formatted);\r\n }\r\n }\r\n\r\n if (product.productInFactorPrice) {\r\n product.productInFactorPrice.formatted = newData.ProductInFactorPrice;\r\n delete product.productInFactorPrice.raw; // not available in the incoming data set\r\n\r\n var $productInFactorPriceFormatted = utils.$getProductContainerElements($container, '.js-product-in-factor-price-formatted');\r\n if ($productInFactorPriceFormatted.length > 0) {\r\n $productInFactorPriceFormatted.text(product.productInFactorPrice.formatted);\r\n }\r\n }\r\n\r\n var $replacementProductContainer = utils.$getProductContainerElements($container, '.js-replacement-product-container');\r\n if ($replacementProductContainer.length > 0) {\r\n if (newData.ReplacementProductInfo) {\r\n $replacementProductContainer.empty().html(newData.ReplacementProductInfo).show();\r\n } else {\r\n $replacementProductContainer.empty().hide();\r\n }\r\n }\r\n\r\n priceTotalsController.updatePriceTotals();\r\n\r\n // Supplier order info\r\n const supplierOrderInfoTooltip = utils.$getProductContainerElements($container, 'cms-tooltip').get(0);\r\n\r\n if (supplierOrderInfoTooltip) {\r\n const supplierOrderInfo = supplierOrderInfoTooltip.shadowRoot.querySelector('supplier-order-info');\r\n const $stockTextInfoIcon = utils.$getProductContainerElements($container, '.js-stock-text-info');\r\n\r\n if (supplierOrderInfo) {\r\n if (newData.InSupplierOrder === true) {\r\n supplierOrderInfoTooltip.visible = true;\r\n supplierOrderInfo.update(newData.ProductID);\r\n $stockTextInfoIcon.css('color', newData.StockColor);\r\n $stockTextInfoIcon.show();\r\n } else {\r\n supplierOrderInfoTooltip.visible = false;\r\n $stockTextInfoIcon.hide();\r\n }\r\n } else {\r\n console.warn('Supplier order info element not found.');\r\n }\r\n } else {\r\n console.warn('Supplier order info tooltip element not found.');\r\n }\r\n\r\n }\r\n\r\n function _updateHistory(variantProductDetails) {\r\n if (root.history && typeof (root.history.pushState) !== 'undefined') {\r\n var urlParts = location.href.split('#', 2);\r\n var resultUrl = variantProductDetails.IsMainProd ? $.removeQueryStringParam(urlParts[0], 'dpid') : $.setQueryStringParam(urlParts[0], 'dpid', variantProductDetails.ProductID);\r\n resultUrl = urlParts.length === 1 ? resultUrl : resultUrl + '#' + urlParts[1];\r\n\r\n if (resultUrl !== location.href) {\r\n variantsState.selectedVariantProd = variantProduct;\r\n root.history.pushState(variantsState, null, resultUrl);\r\n }\r\n }\r\n }\r\n }\r\n\r\n function _selectVariantControllersValues(variants) {\r\n _.each(variantControllers, function (x) {\r\n var preselectVariantTypeValue = _.find(x.variantType.variants, function (y) { return _.indexOf(variants, y.id) !== -1; });\r\n if (preselectVariantTypeValue && preselectVariantTypeValue.id > 0) {\r\n x.selectedValue = preselectVariantTypeValue.id;\r\n x.selector.setSelected(preselectVariantTypeValue.id);\r\n } else {\r\n say.error('Variant type \"' + x.variantType.name + '\" has no corresponding variant value for the shown variant product. Please check variants configuration for the product.');\r\n }\r\n });\r\n }\r\n\r\n function _onHistoryPopState(evt) {\r\n var state = evt.originalEvent.state;\r\n if (state && state.controlId === product.uniqueId) {\r\n variantsState = state;\r\n suppressVariantChangedEvent = true;\r\n\r\n if (state.selectedVariantProd) {\r\n _selectVariantControllersValues(state.selectedVariantProd.variants);\r\n } else {\r\n _.each(variantControllers, function (x) {\r\n x.selectedValue = 0;\r\n x.selector.setSelected(0);\r\n });\r\n }\r\n\r\n suppressVariantChangedEvent = false;\r\n _loadVariantProductDetails(variantsState.selectedVariantProd);\r\n _filterUnavailableVariants();\r\n }\r\n }\r\n\r\n function _getVariantControllerById(variantTypeId) {\r\n return variantControllers['vt' + variantTypeId];\r\n }\r\n\r\n function _getVariantControllerByTypeName(variantTypeName) {\r\n var foundController = _.find(variantControllers, function (controller) {\r\n return utils.caseInsensetiveEquals(controller.variantType.name, variantTypeName);\r\n });\r\n\r\n return foundController;\r\n }\r\n\r\n function _selectVariantByName(variantTypeName, variantValueName) {\r\n if (variantTypeName && variantValueName) {\r\n var variantController = _getVariantControllerByTypeName(variantTypeName);\r\n if (variantController) {\r\n variantController.selector.setSelectedByName(variantValueName);\r\n }\r\n }\r\n }\r\n\r\n return {\r\n init: function () {\r\n $declaredVariantSelectors.each(function () {\r\n var $selector = $(this);\r\n\r\n var viewBuilderName = $selector.data('viewbuilder') || '';\r\n var viewBuilder = root.variantViewBuilders ? root.variantViewBuilders[viewBuilderName] : null;\r\n if (typeof viewBuilder === 'function') {\r\n var variantTypeId = $selector.data('varianttypeid');\r\n\r\n var variantType = _.find(product.variantTypes, function (x) { return x.id === variantTypeId; });\r\n if (variantType) {\r\n var variantSelector = new viewBuilder($selector, variantType, metadata, product);\r\n var key = 'vt' + variantTypeId;\r\n var variantController = {\r\n variantType: variantType,\r\n selectedValue: 0,\r\n selector: variantSelector,\r\n $elem: $selector\r\n };\r\n\r\n variantControllers[key] = variantController;\r\n }\r\n } else {\r\n say.error('Unknown variant selector type: ' + viewBuilderName);\r\n }\r\n });\r\n\r\n $declaredVariantSelectors.on('variantselector:changed', function (evt, changedVariantType, newVariantValue) {\r\n if (!suppressVariantChangedEvent) {\r\n _onVariantSelectionChanged(changedVariantType, newVariantValue);\r\n\r\n // If the single available variant is changing itself, then it is nothing to filter.\r\n if (_.keys(variantControllers).length > 1) {\r\n _filterUnavailableVariants();\r\n }\r\n }\r\n });\r\n\r\n _filterUnavailableVariants(); // Initial filtering of variants that have no available products at all\r\n\r\n var initialVariantProduct = _.find(product.variantProducts, function (x) { return x.productId === product.productId; });\r\n if (initialVariantProduct) {\r\n variantsState.selectedVariantProd = initialVariantProduct;\r\n // Pre-select if variant product is shown initially\r\n suppressVariantProductDetailsLoading = true; // Suppress variant product loading while preselecting variants for already loaded variant products\r\n\r\n _selectVariantControllersValues(initialVariantProduct.variants);\r\n\r\n isVariantProductShown = true;\r\n\r\n suppressVariantProductDetailsLoading = false; // Restore variant product loading on variants change\r\n } else if (!_.isEmpty(preselectedVariants)) {\r\n _.each(preselectedVariants, function (preselectedVariantValue, preselectedVariantType) { _selectVariantByName(preselectedVariantType, preselectedVariantValue); });\r\n }\r\n\r\n if (enableHistoryState === true) {\r\n if (root.history && typeof (root.history.replaceState) !== 'undefined') {\r\n root.history.replaceState(variantsState, null, null);\r\n }\r\n\r\n $(root).on('popstate', _onHistoryPopState);\r\n }\r\n },\r\n getNotSelectedVariants: function () {\r\n var notSelectedVariantControllers = _.filter(variantControllers, function (x) { return !(x.selectedValue > 0); });\r\n\r\n return notSelectedVariantControllers;\r\n },\r\n selectVariantByName: _selectVariantByName,\r\n $selectors: $declaredVariantSelectors\r\n };\r\n }\r\n\r\n // Variant view builders\r\n (function (pubsub) {\r\n if (typeof root.variantViewBuilders === 'undefined') {\r\n root.variantViewBuilders = {};\r\n }\r\n root.variantViewBuilders['dropdownvariant'] = function ($container, variantTypeInfo, metadata) {\r\n var viewHtml = _buildViewHtml();\r\n var $dropDownContainer = $(viewHtml);\r\n var $dropDown = $dropDownContainer.find('select');\r\n\r\n $dropDown.on('change', function (evt) {\r\n var newVariantValue = parseInt(evt.target.value) || 0;\r\n\r\n _triggerSelectorChangedEvent(newVariantValue);\r\n });\r\n\r\n $container.append($dropDownContainer);\r\n\r\n return {\r\n setSelected: _setSelected,\r\n setSelectedByName: _setSelectedByName,\r\n getSelected: _getSelected,\r\n filterVariants: function (unavailableVariants, preselectSingleAvailable) {\r\n var $singleAvailableOption;\r\n\r\n var $options = $dropDown.find('option');\r\n $options.each(function () {\r\n var $option = $(this);\r\n var variantId = $option.val();\r\n if (variantId <= 0) {\r\n return; // Default option\r\n }\r\n\r\n var cleanOptionName = $option.data('cleanname');\r\n if (typeof (cleanOptionName) === 'undefined') {\r\n cleanOptionName = $option.text();\r\n\r\n $option.data('cleanname', cleanOptionName);\r\n }\r\n\r\n const unavailableVariant = unavailableVariants[variantId];\r\n if (unavailableVariant) {\r\n $option.text(cleanOptionName + ' (' + unavailableVariant.message + ')');\r\n $option.addClass('disabled');\r\n\r\n if (unavailableVariant.disabled) {\r\n $option.attr('disabled', 'disabled');\r\n }\r\n } else {\r\n $option.text(cleanOptionName);\r\n\r\n $option.removeClass('disabled');\r\n $option.removeAttr('disabled');\r\n\r\n $singleAvailableOption = typeof ($singleAvailableOption) === 'undefined' ? $option : null;\r\n }\r\n });\r\n\r\n if ($singleAvailableOption && preselectSingleAvailable) {\r\n _setSelected($singleAvailableOption.val());\r\n\r\n if ($options.length === 2 && $dropDown.is(':visible')) {\r\n $dropDown.parent().prepend('' + $singleAvailableOption.text() + '');\r\n $dropDown.css('display', 'none');\r\n }\r\n }\r\n }\r\n };\r\n\r\n function _buildViewHtml() {\r\n var templateContent = '
';\r\n var templateData = {\r\n id: new Date().valueOf() + '_vt' + variantTypeInfo.id,\r\n variantTypeName: variantTypeInfo.name,\r\n variants: _sortVariants($container, variantTypeInfo.variants),\r\n labels: { select: metadata['selectVariantPrefix'] }\r\n };\r\n\r\n var beforeVariantRenderEvent = $.Event('variantselector:beforevariantrender');\r\n $container.trigger(beforeVariantRenderEvent, [templateData, 'dropdownvariant']);\r\n\r\n return _.template(templateContent, templateData);\r\n }\r\n\r\n function _setSelected(variantId) {\r\n var newVariantValue = parseInt(variantId) || 0;\r\n var currentVariantValue = _getSelected();\r\n var isVariantAlreadySelected = newVariantValue === currentVariantValue;\r\n\r\n if (!isVariantAlreadySelected) {\r\n $dropDown.val(newVariantValue);\r\n\r\n _triggerSelectorChangedEvent(newVariantValue);\r\n }\r\n }\r\n\r\n function _setSelectedByName(variantValueName) {\r\n if (variantValueName) {\r\n var utils = new util();\r\n var foundVariantValue = _.find(variantTypeInfo.variants, function (currentVariant) {\r\n return utils.caseInsensetiveEquals(currentVariant.name, variantValueName);\r\n });\r\n\r\n if (foundVariantValue) {\r\n _setSelected(foundVariantValue.id);\r\n }\r\n }\r\n }\r\n\r\n function _getSelected() {\r\n return parseInt($dropDown.val() || 0);\r\n }\r\n\r\n function _isSelectedAvailable() {\r\n var $selected = $dropDown.find('option:selected');\r\n\r\n // Default option (or unselected state) should be marked as available. Otherwise, unavailable variants filtering will not happen on deselection.\r\n return $selected.length === 0 || $selected.is(':not(.disabled)');\r\n }\r\n\r\n function _triggerSelectorChangedEvent(newVariantValue) {\r\n var isSelectedOptionAvailable = _isSelectedAvailable();\r\n $container.trigger('variantselector:changed', [variantTypeInfo, newVariantValue, isSelectedOptionAvailable]);\r\n }\r\n };\r\n\r\n root.variantViewBuilders['tilesvariant'] = function ($container, variantTypeInfo, metadata) {\r\n var templateContent = '
'\r\n + '
'\r\n + '
'\r\n + '<% _.each(variants, function(item, idx){%>'\r\n + ''\r\n + '<%});%>'\r\n + '
';\r\n var templateData = {\r\n variantTypeName: variantTypeInfo.name,\r\n variants: _sortVariants($container, variantTypeInfo.variants),\r\n labels: { select: metadata['selectVariantPrefix'] }\r\n };\r\n return new tilesVariantController($container, variantTypeInfo, templateData, templateContent);\r\n };\r\n\r\n root.variantViewBuilders['relimgtilesvariant'] = function ($container, variantTypeInfo, metadata, product) {\r\n var templateContent = '
'\r\n + '
'\r\n + '
'\r\n + '<% _.each(variants, function(item, idx){%>'\r\n + ''\r\n + '<%});%>'\r\n + '
';\r\n var templateData = {\r\n variantTypeName: variantTypeInfo.name,\r\n variants: _sortVariants($container, variantTypeInfo.variants),\r\n labels: { select: metadata['selectVariantPrefix'] },\r\n defaultArchiveImage: '\\\\viewimage.aspx?imageid=0&width=' + product.thumbnailImageWidth + '&' + product.thumbnailImageMode,\r\n thumbnailImage: {\r\n width: product.thumbnailImageWidth,\r\n height: product.thumbnailImageWidth\r\n }\r\n };\r\n\r\n if (product.relatedImages && product.relatedImages.length > 0) {\r\n _.each(templateData.variants, function (variant) {\r\n const variantName = typeof (variant.name.normalize) === 'function' ? variant.name.normalize() : variant.name;\r\n const variantNameRegex = RegExp(product.variantRelImageMatchRegExp.replace('VARIANTNAME', variantName), 'gi');\r\n\r\n var relatedImage = _.find(product.relatedImages, function (relImg) {\r\n var imageName = typeof (relImg.title.normalize) === 'function' ? relImg.title.normalize() : relImg.title;\r\n return variantNameRegex.test(imageName);\r\n });\r\n\r\n if (relatedImage) {\r\n variant.image = relatedImage;\r\n }\r\n });\r\n }\r\n return new tilesVariantController($container, variantTypeInfo, templateData, templateContent);\r\n };\r\n\r\n root.variantViewBuilders['fancyboxrelimgtilesvariant'] = function ($container, variantTypeInfo, metadata, product) {\r\n var templateData = {\r\n variantTypeName: variantTypeInfo.name,\r\n variants: _sortVariants($container, variantTypeInfo.variants),\r\n labels: { select: metadata['selectVariantPrefix'] },\r\n variantUniqueId: product.uniqueId + '_' + variantTypeInfo.id\r\n };\r\n\r\n if (product.relatedImages && product.relatedImages.length > 0) {\r\n _.each(templateData.variants, function (variant) {\r\n const variantName = typeof (variant.name.normalize) === 'function' ? variant.name.normalize() : variant.name;\r\n const variantNameRegex = RegExp(product.variantRelImageMatchRegExp.replace('VARIANTNAME', variantName), 'gi');\r\n\r\n var relatedImage = _.find(product.relatedImages, function (relImg) {\r\n var imageName = typeof (relImg.title.normalize) === 'function' ? relImg.title.normalize() : relImg.title;\r\n return variantNameRegex.test(imageName);\r\n });\r\n\r\n if (relatedImage) {\r\n variant.image = relatedImage;\r\n }\r\n });\r\n }\r\n\r\n return new fancyboxTilesVariantController($container, variantTypeInfo, templateData);\r\n };\r\n\r\n function fancyboxTilesVariantController($container, variantTypeInfo, templateData) {\r\n var templateContent = '
'\r\n + ''\r\n + '
'\r\n + '
\">'\r\n + '
'\r\n + '
'\r\n + '<% _.each(variants, function(item, idx){%>'\r\n + ' '\r\n + '<%});%>'\r\n + '
'\r\n + '
'\r\n + '
'\r\n + '
'\r\n + '
'\r\n + ''\r\n + '
'\r\n + '
'\r\n + '
'\r\n + '
';\r\n\r\n var beforeVariantRenderEvent = $.Event('variantselector:beforevariantrender');\r\n $container.trigger(beforeVariantRenderEvent, [templateData, 'tilesvariant']);\r\n\r\n var viewHtml = _.template(templateContent, templateData);\r\n\r\n var $tiles = $(viewHtml);\r\n var $variants = $tiles.find('.js-variant');\r\n var $previewImage = $tiles.find('.js-variant-preview-image');\r\n var $previewName = $tiles.find('.js-variant-preview-name');\r\n var $selectedVariantImage = $tiles.find('.js-selected-variant-image');\r\n var $selectVariantBtn = $tiles.find('.js-select-variant-btn');\r\n\r\n $variants.on('click', function (evt) {\r\n evt.preventDefault();\r\n\r\n var $variantToSelect = $(this);\r\n _setPreview($variantToSelect);\r\n });\r\n $selectVariantBtn.on('click', function (evt) {\r\n evt.preventDefault();\r\n\r\n var $variantToSelect = $variants.filter('.selected').removeClass('selected');\r\n _setSelected($variantToSelect);\r\n\r\n $.fancybox.close();\r\n });\r\n\r\n $container.append($tiles);\r\n pubsub.publish('variantprocessor.variant.render', { variant: templateData, container: $container });\r\n\r\n return {\r\n setSelected: _setSelectedById,\r\n setSelectedByName: _setSelectedByName,\r\n getSelected: _getSelected,\r\n\r\n filterVariants: function (unavailableVariants, preselectSingleAvailable) {\r\n var $singleAvailableVariant;\r\n\r\n $variants.each(function () {\r\n var $this = $(this);\r\n var $unavailable = $this.find('.js-unavailable-text');\r\n var variantId = $this.data('variantid');\r\n\r\n if (variantId <= 0) {\r\n return; // Default option\r\n }\r\n\r\n const unavailableVariant = unavailableVariants[variantId];\r\n\r\n if (unavailableVariant) {\r\n $this.addClass('disabled');\r\n\r\n if (unavailableVariant.disabled) {\r\n $this.attr('disabled', 'disabled');\r\n }\r\n\r\n $unavailable.html(unavailableVariant.message);\r\n $unavailable.closest('.js-unavailable-text-container').show();\r\n } else {\r\n $this.removeClass('disabled');\r\n $this.removeAttr('disabled');\r\n\r\n $unavailable.html('');\r\n $unavailable.closest('.js-unavailable-text-container').hide();\r\n\r\n $singleAvailableVariant = typeof ($singleAvailableVariant) === 'undefined' ? $this : null;\r\n }\r\n });\r\n\r\n // ReSharper disable once CoercedEqualsUsing\r\n if ($singleAvailableVariant && preselectSingleAvailable) {\r\n _setSelected($singleAvailableVariant);\r\n }\r\n }\r\n };\r\n\r\n function _setSelectedById(variantId) {\r\n var $variantToSelect = $variants.filter('[data-variantid=\"' + variantId + '\"]');\r\n var isVariantAlreadySelected = $variantToSelect.hasClass('selected');\r\n\r\n if (!isVariantAlreadySelected && $variantToSelect.length === 1) {\r\n _setSelected($variantToSelect);\r\n }\r\n }\r\n\r\n function _setSelectedByName(variantValueName) {\r\n if (variantValueName) {\r\n var utils = new util();\r\n var foundVariantValue = _.find(variantTypeInfo.variants, function (currentVariant) {\r\n return utils.caseInsensetiveEquals(currentVariant.name, variantValueName);\r\n });\r\n\r\n if (foundVariantValue) {\r\n _setSelectedById(foundVariantValue.id);\r\n }\r\n }\r\n }\r\n\r\n function _setPreview($variantToSelect) {\r\n var isVariantAlreadySelected = $variantToSelect.hasClass('selected');\r\n\r\n $variants.removeClass('selected');\r\n $previewImage.removeAttr('style');\r\n $previewName.empty();\r\n\r\n if (!isVariantAlreadySelected) {\r\n $variantToSelect.addClass('selected');\r\n $previewImage.attr('style', $variantToSelect.find('.js-variant-image').attr('style'));\r\n $previewName.append($variantToSelect.find('.js-variant-name').text());\r\n }\r\n }\r\n\r\n function _setSelected($variantToSelect) {\r\n var isVariantAlreadySelected = $variantToSelect.hasClass('selected');\r\n $selectedVariantImage.removeAttr('style').hide();\r\n\r\n var currentVariantValue = null;\r\n if (!isVariantAlreadySelected) {\r\n currentVariantValue = $variantToSelect.data('variantid');\r\n if (currentVariantValue > 0 && $variantToSelect.find('.js-variant-image').css('background-image') !== 'none') {\r\n $selectedVariantImage.attr('style', $variantToSelect.find('.js-variant-image').attr('style')).show();\r\n }\r\n }\r\n\r\n _setPreview($variantToSelect);\r\n\r\n var isSelectedOptionAvailable = _isSelectedAvailable();\r\n $container.trigger('variantselector:changed', [variantTypeInfo, currentVariantValue || 0, isSelectedOptionAvailable]);\r\n }\r\n\r\n function _getSelected() {\r\n var $selected = $variants.filter('.selected');\r\n return $selected.data('variantid') || 0;\r\n }\r\n\r\n function _isSelectedAvailable() {\r\n var $selected = $variants.filter('.selected');\r\n\r\n // Default option (or unselected state) should be marked as available. Otherwise, unavailable variants filtering will not happen on deselection.\r\n return $selected.length === 0 || $selected.is(':not(.disabled)');\r\n }\r\n }\r\n\r\n function tilesVariantController($container, variantTypeInfo, templateData, templateContent) {\r\n var beforeVariantRenderEvent = $.Event('variantselector:beforevariantrender');\r\n $container.trigger(beforeVariantRenderEvent, [templateData, 'tilesvariant']);\r\n\r\n var viewHtml = _.template(templateContent, templateData);\r\n\r\n var $tiles = $(viewHtml);\r\n var $variants = $tiles.find('.js-variant');\r\n\r\n $variants.on('click', function (evt) {\r\n evt.preventDefault();\r\n\r\n var $variantToSelect = $(this);\r\n _setSelected($variantToSelect);\r\n });\r\n\r\n $container.append($tiles);\r\n pubsub.publish('variantprocessor.variant.render', { variant: templateData, container: $container });\r\n\r\n return {\r\n setSelected: _setSelectedById,\r\n setSelectedByName: _setSelectedByName,\r\n getSelected: _getSelected,\r\n filterVariants: function (unavailableVariants, preselectSingleAvailable) {\r\n var $singleAvailableVariant;\r\n\r\n $variants.each(function () {\r\n var $this = $(this);\r\n var $unavailable = $this.find('.js-unavailable-text');\r\n var variantId = $this.data('variantid');\r\n\r\n if (variantId <= 0) {\r\n return; // Default option\r\n }\r\n\r\n const unavailableVariant = unavailableVariants[variantId];\r\n\r\n if (unavailableVariant) {\r\n $this.addClass('disabled');\r\n\r\n if (unavailableVariant.disabled) {\r\n $this.attr('disabled', 'disabled');\r\n }\r\n\r\n $unavailable.html(unavailableVariant.message);\r\n $unavailable.closest('.js-unavailable-text-container').show();\r\n $this.attr('title', unavailableVariant.message);\r\n } else {\r\n $this.removeClass('disabled');\r\n $this.removeAttr('disabled');\r\n\r\n $unavailable.html('');\r\n $unavailable.closest('.js-unavailable-text-container').hide();\r\n $this.removeAttr('title');\r\n\r\n $singleAvailableVariant = typeof ($singleAvailableVariant) === 'undefined' ? $this : null;\r\n }\r\n });\r\n\r\n // ReSharper disable once CoercedEqualsUsing\r\n if ($singleAvailableVariant && preselectSingleAvailable) {\r\n _setSelected($singleAvailableVariant);\r\n }\r\n }\r\n };\r\n\r\n function _setSelectedById(variantId) {\r\n var $variantToSelect = $variants.filter('[data-variantid=\"' + variantId + '\"]');\r\n var isVariantAlreadySelected = $variantToSelect.hasClass('selected');\r\n\r\n if (!isVariantAlreadySelected && $variantToSelect.length === 1) {\r\n _setSelected($variantToSelect);\r\n }\r\n }\r\n\r\n function _setSelectedByName(variantValueName) {\r\n if (variantValueName) {\r\n var utils = new util();\r\n var foundVariantValue = _.find(variantTypeInfo.variants, function (currentVariant) {\r\n return utils.caseInsensetiveEquals(currentVariant.name, variantValueName);\r\n });\r\n\r\n if (foundVariantValue) {\r\n _setSelectedById(foundVariantValue.id);\r\n }\r\n }\r\n }\r\n\r\n function _setSelected($variantToSelect) {\r\n var isVariantAlreadySelected = $variantToSelect.hasClass('selected');\r\n\r\n $variants.removeClass('selected');\r\n\r\n var currentVariantValue = null;\r\n if (!isVariantAlreadySelected) {\r\n $variantToSelect.addClass('selected');\r\n currentVariantValue = $variantToSelect.data('variantid');\r\n }\r\n\r\n var isSelectedOptionAvailable = _isSelectedAvailable();\r\n $container.trigger('variantselector:changed', [variantTypeInfo, currentVariantValue || 0, isSelectedOptionAvailable]);\r\n }\r\n\r\n function _getSelected() {\r\n var $selected = $variants.filter('.selected');\r\n return $selected.data('variantid') || 0;\r\n }\r\n\r\n function _isSelectedAvailable() {\r\n var $selected = $variants.filter('.selected');\r\n\r\n // Default option (or unselected state) should be marked as available. Otherwise, unavailable variants filtering will not happen on deselection.\r\n return $selected.length === 0 || $selected.is(':not(.disabled)');\r\n }\r\n }\r\n\r\n function _sortVariants($container, variants) {\r\n var onVariantsSortEvent = $.Event('variantselector:onsort');\r\n $container.trigger(onVariantsSortEvent, [variants]);\r\n\r\n if (onVariantsSortEvent.isDefaultPrevented()) {\r\n return onVariantsSortEvent.result;\r\n }\r\n\r\n var sizeMap = ['xxs', '2xs', 'xx-small', 'xs', 'x-small', 's', 'small', 'm', 'medium', 'l', 'large', 'xl', 'x-large', 'xxl', '2xl', 'xx-large', 'xxxl', '3xl', 'xxx-large', '4xl', '5xl', '6xl', '7xl', '8xl', '9xl', '10xl'];\r\n var startsWithNumberRegEx = /^\\d+/g;\r\n\r\n return _.sortBy(variants, function (variant) {\r\n var variantName = (typeof (variant.name.normalize) === 'function' ? variant.name.normalize() : variant.name).replace(/[\\s,]/g, '').toLowerCase();\r\n\r\n if ($.isNumeric(variantName)) {\r\n return parseFloat(variantName);\r\n }\r\n\r\n var positionInSize = _.indexOf(sizeMap, variantName);\r\n if (positionInSize !== -1) {\r\n return positionInSize;\r\n }\r\n\r\n var matches = variantName.match(startsWithNumberRegEx);\r\n if (matches && matches.length && $.isNumeric(matches[0])) {\r\n return parseFloat(matches[0]);\r\n }\r\n\r\n return undefined;\r\n });\r\n }\r\n })(root.PubSub);\r\n\r\n // Cart processor\r\n function cartProcessor($view, model, say, pubsub, variantProcessorsMap, utils) {\r\n var estore = root.PublicEStore;\r\n var productsInCartMap = {};\r\n var productsToCustomFieldIdsForOrderMap = {};\r\n\r\n function _addToCart(addToCartContracts, $handler) {\r\n $view.addClass('buying');\r\n $.when(estore.addToCart(addToCartContracts))\r\n .always(function () { $view.removeClass('buying'); })\r\n .done(function (dataContract) {\r\n pubsub.publish('frontend.productview.product.isbought');\r\n $handler.addClass('is-bought');\r\n setTimeout(function () {\r\n $handler.removeClass('is-bought');\r\n }, 2000);\r\n\r\n if (dataContract.status.toLowerCase() !== 'ok') {\r\n if (dataContract.result.items && dataContract.result.items.length) {\r\n _.each(dataContract.result.items, function (resultItem) {\r\n var itemStatus = resultItem.status.toLowerCase();\r\n var productModel = _getFirstProductModelByProductId(resultItem.productID);\r\n var statusMessage = [productModel.title, resultItem.message].join(' - ');\r\n switch (itemStatus) {\r\n case 'error':\r\n say.error(statusMessage);\r\n break;\r\n case 'warning':\r\n say.warning(statusMessage);\r\n break;\r\n }\r\n });\r\n } else {\r\n _showPublicEStoreError(dataContract);\r\n }\r\n } else {\r\n if (model.tempOrderLineId > 0) {\r\n root.location.href = model.cartUrl;\r\n }\r\n }\r\n })\r\n .fail(_showPublicEStoreError);\r\n }\r\n\r\n function _showPublicEStoreError(pefContract) {\r\n var exractedMessage;\r\n\r\n if (typeof pefContract === 'string') {\r\n exractedMessage = pefContract;\r\n } else {\r\n exractedMessage = pefContract.result && pefContract.result.items[0] ? pefContract.result.items[0].message : pefContract.message;\r\n }\r\n\r\n say.error(exractedMessage);\r\n }\r\n\r\n function _getCustomFieldsContract($container, customFieldIdsForOrder) {\r\n var customFields = {};\r\n var $customFieldControls = utils.$getProductContainerElements($container, '.js-custom-field');\r\n\r\n $customFieldControls.each(function () {\r\n var $customFieldControl = $(this);\r\n var customFieldId = $customFieldControl.data('customfieldid');\r\n var customFieldValue = $customFieldControl.is(':checkbox') ? $customFieldControl.is(':checked').toString() : $customFieldControl.val();\r\n\r\n if (_.indexOf(customFieldIdsForOrder, customFieldId) !== -1 && typeof customFieldValue !== 'undefined') {\r\n customFields[customFieldId] = customFieldValue;\r\n }\r\n });\r\n\r\n return customFields;\r\n }\r\n\r\n function _isFormValid($container, prodTitle) {\r\n var isFormValid = true;\r\n\r\n // Trigger jquery form validation\r\n var validator = $container.validate({ ignore: [] });\r\n var $requiredFields = utils.$getProductContainerElements($container, '[data-rule-required]');\r\n $requiredFields.each(function () {\r\n var $requiredField = $(this);\r\n isFormValid &= validator.element($requiredField);\r\n });\r\n\r\n if (!isFormValid) {\r\n say.warning(prodTitle + ' - ' + model.metadata['formIsInvalid']);\r\n }\r\n\r\n return isFormValid;\r\n }\r\n\r\n function _isVariantsSelectionValid(productVariantsProcessor, prodTitle) {\r\n var isSelectionValid;\r\n\r\n if (typeof productVariantsProcessor !== 'undefined' && productVariantsProcessor !== null) {\r\n var notSelectedVariants = productVariantsProcessor.getNotSelectedVariants();\r\n isSelectionValid = notSelectedVariants.length === 0;\r\n\r\n if (!isSelectionValid) {\r\n var notSelectedVariantNames;\r\n _.each(notSelectedVariants, function (x, idx) {\r\n var name = '' + x.variantType.name + '';\r\n if (idx === 0) {\r\n notSelectedVariantNames = name;\r\n } else if (idx === notSelectedVariants.length - 1) {\r\n notSelectedVariantNames += (' ' + model.metadata['and'] + ' ' + name);\r\n } else {\r\n notSelectedVariantNames += (', ' + name);\r\n }\r\n });\r\n\r\n say.warning(prodTitle + ' - ' + model.metadata['pleaseSelect'] + ' ' + notSelectedVariantNames);\r\n }\r\n } else {\r\n isSelectionValid = true;\r\n }\r\n\r\n return isSelectionValid;\r\n }\r\n\r\n function _isQuantityValid(minQuantity, quantity, prodTitle) {\r\n\r\n var isQuantityValid = true;\r\n\r\n if (minQuantity && quantity < minQuantity) {\r\n say.warning(prodTitle + ' - ' + model.metadata['minQuantityIs'] + ' ' + minQuantity);\r\n isQuantityValid = false;\r\n }\r\n\r\n return isQuantityValid;\r\n }\r\n\r\n function _toggleCartIndicator(animate) {\r\n // Works for the general product only, not for additionals.\r\n var variantProductIds = model.variantProducts != null ? $.map(model.variantProducts, function (variant) { return variant.productId; }) : null;\r\n var displayedProductId = model.productId;\r\n var isMainProductDisplayed = model.isMainProductOfProductWithVariants;\r\n\r\n // Find if displayed product is in cart and collect its quantity-in-cart value.\r\n // If the displayed product is main product of a product with variants then sum up quantity-in-carts of all its variant products.\r\n var numberQuantityInCart = _.reduce(productsInCartMap, function (memo, qtyInCart, productId) {\r\n productId = parseInt(productId);\r\n\r\n var includeQtyInCart = productId === displayedProductId || isMainProductDisplayed && _.indexOf(variantProductIds, productId) > -1;\r\n\r\n return memo + (includeQtyInCart ? qtyInCart : 0);\r\n }, 0);\r\n\r\n var isProductInCart = numberQuantityInCart > 0;\r\n\r\n var $cartQuantity = utils.$getProductContainerElements($view, '.js-cart-quantity');\r\n var $cartIndicator = utils.$getProductContainerElements($view, '.js-cart-indicator');\r\n\r\n $cartQuantity.text(numberQuantityInCart);\r\n $cartQuantity.toggle(isProductInCart);\r\n\r\n if (isProductInCart) {\r\n if ($cartIndicator.length > 0) {\r\n $cartIndicator.show();\r\n if (animate) {\r\n $view.effect('transfer', { to: $cartIndicator }, 500, function () { $cartIndicator.effect('bounce', null, 500); });\r\n }\r\n }\r\n } else {\r\n $cartIndicator.hide();\r\n }\r\n }\r\n\r\n function _addToCartHandler(topic, dataContract) {\r\n var currentProduct = _findCurrentProductInTheContract(dataContract);\r\n if (currentProduct) {\r\n productsInCartMap[currentProduct.productID] = currentProduct.totalQuantityInTempOrderLine;\r\n _toggleCartIndicator(true);\r\n }\r\n }\r\n\r\n function _removeFromCartHandler(topic, dataContract) {\r\n _.each(dataContract.result.items, function (x) {\r\n if (x.status.toLowerCase() === 'ok') {\r\n var deletedProductId = x.productID;\r\n delete productsInCartMap[deletedProductId];\r\n\r\n var isVariantProductOfDisplayedMainProductDeleted = model.isMainProductOfProductWithVariants && _.some(model.variantProducts, function (variantProd) {\r\n return variantProd.productId === deletedProductId;\r\n });\r\n if (deletedProductId === model.productId || isVariantProductOfDisplayedMainProductDeleted) {\r\n _toggleCartIndicator();\r\n }\r\n }\r\n });\r\n }\r\n function _emptyCartHandler(topic, dataContract) {\r\n if (dataContract.status.toLowerCase() === 'ok') {\r\n productsInCartMap = {};\r\n\r\n _toggleCartIndicator();\r\n }\r\n }\r\n function _getCartInfoHandler(topic, dataContract) {\r\n var cartInfo = dataContract.result.detailedCartInfo;\r\n\r\n if (dataContract.status.toLowerCase() === 'ok') {\r\n productsInCartMap = {};\r\n\r\n if (cartInfo.products && cartInfo.products.length > 0) {\r\n _.each(cartInfo.products, function (x) {\r\n productsInCartMap[x.productID] = (productsInCartMap[x.productID] || 0) + x.quantity;\r\n });\r\n }\r\n\r\n _toggleCartIndicator();\r\n }\r\n }\r\n\r\n function _findCurrentProductInTheContract(contract) {\r\n var currentProduct = _.find(contract.result.items, function (x) {\r\n return x && x.status.toLowerCase() === 'ok' && (x.productID === model.productId || model.additionalProducts && model.additionalProducts.filter(function (value) { return value.productId === x.productID; }).length > 0);\r\n });\r\n\r\n return currentProduct;\r\n }\r\n\r\n function _getProductModelByUniqueId(uniqueId) {\r\n var productModel = null;\r\n\r\n if (uniqueId) {\r\n if (model.uniqueId === uniqueId) {\r\n // General product ᕦ(ò_óˇ)ᕤ\r\n productModel = model;\r\n } else {\r\n // Try find the product in additionals\r\n if (!productModel && model.additionalProducts) {\r\n productModel = model.additionalProducts.find(function (additionalProduct) { return additionalProduct.uniqueId === uniqueId; });\r\n }\r\n\r\n if (!productModel && model.packageComponentProducts) {\r\n productModel = model.packageComponentProducts.find(function (componentProduct) { return componentProduct.uniqueId === uniqueId; });\r\n }\r\n }\r\n }\r\n\r\n return productModel;\r\n }\r\n\r\n function _getFirstProductModelByProductId(productId) {\r\n var productModel = null;\r\n\r\n productId = parseInt(productId);\r\n\r\n if (productId) {\r\n if (model.productId === productId) {\r\n // General product ᕦ(ò_óˇ)ᕤ\r\n productModel = model;\r\n } else {\r\n // Try find the product in additionals\r\n productModel = model.additionalProducts.find(function (additionalProduct) { return additionalProduct.productId === productId; });\r\n }\r\n }\r\n\r\n return productModel;\r\n }\r\n\r\n function _getAddToCartContractFromContainer($productContainer, buyType, packageId, packageQuantity) {\r\n var addToCartContracts = null;\r\n\r\n var productUniqueId = $productContainer.data('uniqueid');\r\n var productModel = _getProductModelByUniqueId(productUniqueId);\r\n\r\n var customFieldIdsForOrder = productsToCustomFieldIdsForOrderMap[productModel.productId] ? productsToCustomFieldIdsForOrderMap[productModel.productId] : [];\r\n if (!customFieldIdsForOrder.length) {\r\n _.each(productModel.customFields, function (x) {\r\n if ((x.displayType === 'editable' || x.displayType === 'hidden') && x.includeInOrder) {\r\n customFieldIdsForOrder.push(x.id);\r\n }\r\n });\r\n productsToCustomFieldIdsForOrderMap[productModel.productId] = customFieldIdsForOrder;\r\n }\r\n\r\n var quantity = 0;\r\n var fraction = 0;\r\n\r\n switch ((buyType || '').toLowerCase()) {\r\n case 'fraction':\r\n fraction = utils.tryParseNumberOrDefault($productContainer.find('.js-fraction').val());\r\n break;\r\n case 'factor':\r\n quantity = $productContainer.find('.js-quantity').val() || 1;\r\n break;\r\n case 'package':\r\n var packageSize = productModel.packageSize || 1;\r\n var packageQty = $productContainer.find('.js-package-quantity').val() || 1;\r\n quantity = packageQty * packageSize;\r\n break;\r\n case 'package_component':\r\n quantity = productModel.initialQuantity.raw * packageQuantity;\r\n break;\r\n default:\r\n quantity = utils.tryParseNumberOrDefault($productContainer.find('.js-quantity').val(), 1);\r\n fraction = utils.tryParseNumberOrDefault($productContainer.find('.js-fraction').val());\r\n break;\r\n }\r\n\r\n var minQuantity = productModel.minQuantity ? productModel.minQuantity.raw : undefined;\r\n\r\n var productVariantsProcessor = variantProcessorsMap[productModel.uniqueId];\r\n if (_isFormValid($productContainer, productModel.title) && _isVariantsSelectionValid(productVariantsProcessor, productModel.title) && _isQuantityValid(minQuantity, quantity, productModel.title)) {\r\n var packageComponents = null, hasPackageComponentsError = false;\r\n\r\n if (productModel.packageComponentProducts) {\r\n packageComponents = [];\r\n var $packageComponentsContainer = utils.$getProductContainerElements($productContainer, '.js-component-products-list');\r\n _.each(productModel.packageComponentProducts, function (packageComponent) {\r\n var $componentProductContainer = $packageComponentsContainer.find('.js-component-product[data-uniqueid=\"' + packageComponent.uniqueId + '\"]');\r\n var componentContracts = _getAddToCartContractFromContainer($componentProductContainer, 'package_component', productModel.uniqueId, quantity);\r\n if (componentContracts) {\r\n packageComponents = packageComponents.concat(componentContracts);\r\n } else {\r\n hasPackageComponentsError = true;\r\n }\r\n });\r\n }\r\n\r\n if (!hasPackageComponentsError) {\r\n var addToCartContract = {\r\n productId: productModel.productId,\r\n quantity: quantity,\r\n fraction: fraction,\r\n customFields: _getCustomFieldsContract($productContainer, customFieldIdsForOrder),\r\n tempOrderLineId: productModel.tempOrderLineId,\r\n imageId: productModel.mainImage ? productModel.mainImage.id : undefined,\r\n componentOfPackageProductID: packageId,\r\n };\r\n\r\n addToCartContracts = [addToCartContract];\r\n\r\n if (packageComponents) {\r\n addToCartContract.packageProductID = productModel.uniqueId;\r\n addToCartContracts = addToCartContracts.concat(packageComponents);\r\n }\r\n }\r\n }\r\n\r\n return addToCartContracts;\r\n }\r\n\r\n function _processVippsHurtigkasseCheckout(vippsHurtigkasseComponent) {\r\n $.when(_prepareCartForCheckout()).then(function (proceedToCheckout) {\r\n if (proceedToCheckout) {\r\n vippsHurtigkasseComponent.startCheckout(true);\r\n }\r\n }, _showPublicEStoreError);\r\n\r\n function _prepareCartForCheckout() {\r\n const deferred = $.Deferred();\r\n\r\n $.when(estore.getTempOrderLines(null, true)).then(function (tempOrderLinesResult) {\r\n if (tempOrderLinesResult.status.toLowerCase() === 'ok') {\r\n const areOtherProductsInCart = tempOrderLinesResult.result.items.length > 0;\r\n if (areOtherProductsInCart) {\r\n const dialogHtml = _.template(model.metadata.vippsHurtigkasseBuyDlgTemplate, { productCount: tempOrderLinesResult.result.items.length, cartUrl: model.cartUrl });\r\n $(dialogHtml).dialog({\r\n resizable: false,\r\n draggable: false,\r\n modal: true,\r\n autoOpen: true,\r\n width: 400,\r\n closeOnEscape: false,\r\n title: model.metadata.payWithVippsHurtigkasse,\r\n buttons: [\r\n {\r\n 'class': 'btn btn-default',\r\n text: model.metadata.buyOnlyCurrentProduct,\r\n click: function () {\r\n $(this).dialog('close');\r\n\r\n $.when(estore.emptyCart()).then(function () {\r\n _addToCartAndResolveDeferred();\r\n }, deferred.reject);\r\n }\r\n }\r\n ],\r\n open: function (event, ui) {\r\n $('.ui-dialog-titlebar-close', ui.dialog | ui).click(function () {\r\n deferred.resolve(false);\r\n });\r\n\r\n $('.js-buy-entire-cart', ui.dialog | ui).click(function (evt) {\r\n evt.preventDefault();\r\n\r\n _addToCartAndResolveDeferred();\r\n });\r\n }\r\n });\r\n } else {\r\n _addToCartAndResolveDeferred();\r\n }\r\n } else {\r\n deferred.reject(dataContract);\r\n }\r\n }, deferred.reject);\r\n\r\n return deferred.promise();\r\n\r\n function _addToCartAndResolveDeferred() {\r\n var $productContainer = utils.$getProductContainerFor(vippsHurtigkasseComponent);\r\n var addToCartContract = _getAddToCartContractFromContainer($productContainer);\r\n\r\n $.when(estore.addToCart(addToCartContract, null, true)).then(function (addToCartResult) {\r\n if (addToCartResult.status.toLowerCase() === 'ok') {\r\n deferred.resolve(true);\r\n } else {\r\n deferred.reject(addToCartResult);\r\n }\r\n }, deferred.reject);\r\n }\r\n }\r\n }\r\n\r\n return {\r\n init: function () {\r\n estore.subscribe('estore.callback.shopcart.addtocart', _addToCartHandler);\r\n estore.subscribe('estore.callback.shopcart.removefromcart', _removeFromCartHandler);\r\n estore.subscribe('estore.callback.shopcart.emptycart', _emptyCartHandler);\r\n estore.subscribe('estore.callback.shopcart.getdetailedcartinfo', _getCartInfoHandler);\r\n\r\n $.when(estore.getDetailedCartInfo());\r\n\r\n var mainProductVariants = variantProcessorsMap[model.uniqueId];\r\n if (mainProductVariants) {\r\n pubsub.subscribe('variantprocessor.variantproduct.updated', function () { _toggleCartIndicator(); });\r\n }\r\n\r\n $view.find('.js-buy-button,.js-buy-additional-product-button').on('click', function (evt) {\r\n evt.preventDefault();\r\n\r\n var $buyButton = $(this);\r\n\r\n var $productContainer = utils.$getProductContainerFor(this);\r\n var buyType = $buyButton.data('buy-type');\r\n\r\n var addToCartContract = _getAddToCartContractFromContainer($productContainer, buyType);\r\n if (addToCartContract) {\r\n _addToCart(addToCartContract, $buyButton);\r\n }\r\n });\r\n\r\n $view.find('.js-batch-buy-button').on('click', function (evt) {\r\n evt.preventDefault();\r\n\r\n // Collect all products with quantity > 0\r\n var addToCartContracts = [];\r\n var allContractsAreValid = true;\r\n $view.find('.js-quantity').each(function () {\r\n var $quantity = $(this);\r\n var quantity = utils.tryParseNumberOrDefault($quantity.val());\r\n\r\n var contracts = null;\r\n if (quantity > 0) {\r\n var $prodContainer = utils.$getProductContainerFor($quantity);\r\n contracts = _getAddToCartContractFromContainer($prodContainer);\r\n if (contracts) {\r\n addToCartContracts = addToCartContracts.concat(contracts);\r\n } else {\r\n allContractsAreValid = false;\r\n }\r\n }\r\n });\r\n\r\n if (addToCartContracts.length) {\r\n if (allContractsAreValid) {\r\n _addToCart(addToCartContracts, $(this));\r\n }\r\n } else if (allContractsAreValid) {\r\n say.warning(model.metadata['nothingToBuy']);\r\n }\r\n });\r\n\r\n $view.find('.js-quantity-modify-btn').on('click', function () {\r\n var dataAttributes = {\r\n actionType: $(this).data('action'),\r\n quantityTxbId: $(this).data('target')\r\n };\r\n\r\n var $quantityInput = $('#' + dataAttributes.quantityTxbId);\r\n var quantity = utils.tryParseNumberOrDefault($quantityInput.val());\r\n\r\n switch (dataAttributes.actionType) {\r\n case 'decrease':\r\n quantity = --quantity;\r\n break;\r\n case 'increase':\r\n quantity = ++quantity;\r\n break;\r\n }\r\n\r\n if (quantity < 0) {\r\n $quantityInput.val(0);\r\n } else {\r\n quantity = Math.round(quantity * 10) / 10;\r\n $quantityInput.val(quantity);\r\n }\r\n $quantityInput.trigger('change');\r\n });\r\n\r\n $view.find('vipps-hurtigkasse').on('onbeforestart', function (evt) {\r\n evt.preventDefault();\r\n\r\n _processVippsHurtigkasseCheckout(evt.target);\r\n });\r\n }\r\n };\r\n }\r\n\r\n // Flags processor\r\n function flagsProcessor($view, model) {\r\n var flagsHandlerUrl = root.R + 'startup/api/v1/acrhive/flags/connections/visible';\r\n var itemId = model.itemId;\r\n\r\n function _getFlags() {\r\n $.get(flagsHandlerUrl, { itemIds: [itemId], archiveType: 20, })\r\n .done(function (data) {\r\n if (!_.isEmpty(data)) {\r\n var flags = data[itemId];\r\n\r\n var $flagsTarget = $view.find('.js-flags-target');\r\n _.each(flags, function (flagDetails) {\r\n var $flag = $('',\r\n {\r\n 'class': 'flag flag-' + flagDetails.FlagID,\r\n text: flagDetails.Name,\r\n data: flagDetails\r\n });\r\n\r\n $flag.appendTo($flagsTarget);\r\n\r\n var replaceEmptyString = flagDetails.Name.replace(/\\s+/g, \"-\").toLowerCase();\r\n $('.uc-product-view').addClass(replaceEmptyString + ' flag-' + flagDetails.FlagID + '-' + replaceEmptyString);\r\n });\r\n }\r\n });\r\n }\r\n\r\n return {\r\n init: function () {\r\n _getFlags();\r\n }\r\n }\r\n }\r\n\r\n // Rating processor\r\n function ratingProcessor($view, model, pubsub) {\r\n var itemId = model.itemId;\r\n\r\n function _updateRating() {\r\n $.ajax({\r\n url: root.R + 'handlers/public/productdata.ashx?a=getrating&itemid=' + itemId,\r\n type: 'GET'\r\n })\r\n .done(function (ratingData) {\r\n // Update data model\r\n model.rating = ratingData.rating;\r\n model.commentsCount = ratingData.commentsCount;\r\n model.ratingsCount = ratingData.ratingsCount;\r\n model.hasUserPostedReview = ratingData.hasUserPostedReview;\r\n\r\n // Update UI\r\n _buildRatingView();\r\n\r\n $view.find('.js-add-review').toggle(!model.hasUserPostedReview);\r\n\r\n $view.find('.js-rating-comments-count').text(ratingData.commentsCount);\r\n $view.find('.js-rating-ratings-count').text(ratingData.commentsCount);\r\n });\r\n }\r\n\r\n function _buildRatingView() {\r\n var ratingTemplate = '<% _.each(stars, function(star){ %>\" aria-hidden=\"true\"><% }); %>';\r\n var ratingModel = { stars: _buildStars() };\r\n\r\n var $ratingHtml = _.template(ratingTemplate, ratingModel);\r\n\r\n $view.find('.js-rating-container').empty().append($ratingHtml);\r\n\r\n function _buildStars() {\r\n var starsCount = 5;\r\n var starredRatingValue = model.rating * starsCount;\r\n\r\n var stars = [];\r\n\r\n for (var wholeStar = 1; wholeStar <= starredRatingValue; wholeStar++) {\r\n stars.push('whole');\r\n }\r\n\r\n var incompleteStarValue = starredRatingValue - stars.length;\r\n if (incompleteStarValue > 0) {\r\n stars.push(incompleteStarValue > 0.5 ? 'whole' : 'half');\r\n }\r\n\r\n var emptyStars = starsCount - stars.length;\r\n for (var emptyStar = 0; emptyStar < emptyStars; emptyStar++) {\r\n stars.push('empty');\r\n }\r\n\r\n return stars;\r\n }\r\n }\r\n\r\n return {\r\n init: function () {\r\n $(function () {\r\n _buildRatingView();\r\n\r\n pubsub.subscribe('reviewscontrol.reviewaction', function (topic, itemId) {\r\n if (itemId === model.itemId) {\r\n _updateRating();\r\n }\r\n });\r\n\r\n $view.find('.js-add-review').click(function (evt) {\r\n evt.preventDefault();\r\n\r\n pubsub.publish('reviewscontrol.focus', model.itemId);\r\n });\r\n });\r\n }\r\n }\r\n }\r\n\r\n // Print processor\r\n function printProcessor($view, model) {\r\n return {\r\n init: function () {\r\n $view.find('.js-print-button').on('click', function (evt) {\r\n evt.preventDefault();\r\n\r\n if (model.printPath) {\r\n var printUrl = root.R + model.printPath + '?ItemID=' + model.itemId + '&ProductID=' + model.productId;\r\n root.open(printUrl, 'remote', 'resizable=yes,status=0,menubar=0,scrollbars=1,left=0,top=0,width=780,height=950,location=0');\r\n } else {\r\n console.error('Print handler is not configured on the website');\r\n }\r\n });\r\n }\r\n }\r\n }\r\n\r\n // PDF processor\r\n function pdfProcessor($view, model) {\r\n return {\r\n init: function () {\r\n $view.find('.js-downloadpdf-button').on('click', function (evt) {\r\n evt.preventDefault();\r\n\r\n var pdfUrl = root.R + 'RenderToPdf.aspx?ProductID=' + model.productId;\r\n if (model.pdfTemplateId > 0) {\r\n pdfUrl += '&TemplateID=' + model.pdfTemplateId;\r\n }\r\n\r\n root.open(pdfUrl, '_blank');\r\n });\r\n }\r\n }\r\n }\r\n\r\n // Gallery processor\r\n function galleryProcessor($view, model) {\r\n var fancyboxInstance;\r\n var fancyboxOptions = {\r\n selector: '[data-fancybox=\"' + model.galleryId + '\"]',\r\n loop: true,\r\n hash: false\r\n };\r\n\r\n return {\r\n init: function () {\r\n fancyboxInstance = $view.fancybox(fancyboxOptions);\r\n }\r\n }\r\n }\r\n\r\n // Shopping list & wish list processor\r\n function shoppingListProcessor($view, model, say, utils, variantProcessorsMap) {\r\n function _isVariantsSelectionValid(productVariantsProcessor) {\r\n var isSelectionValid;\r\n\r\n if (typeof productVariantsProcessor !== 'undefined' && productVariantsProcessor !== null) {\r\n var notSelectedVariants = productVariantsProcessor.getNotSelectedVariants();\r\n isSelectionValid = notSelectedVariants.length === 0;\r\n\r\n if (!isSelectionValid) {\r\n var notSelectedVariantNames;\r\n _.each(notSelectedVariants, function (x, idx) {\r\n var name = '' + x.variantType.name + '';\r\n if (idx === 0) {\r\n notSelectedVariantNames = name;\r\n } else if (idx === notSelectedVariants.length - 1) {\r\n notSelectedVariantNames += (' ' + model.metadata['and'] + ' ' + name);\r\n } else {\r\n notSelectedVariantNames += (', ' + name);\r\n }\r\n });\r\n\r\n say.warning(model.metadata['pleaseSelect'] + ' ' + notSelectedVariantNames + ' ' + model.metadata['toAddToShoppingList']);\r\n }\r\n } else {\r\n isSelectionValid = true;\r\n }\r\n\r\n return isSelectionValid;\r\n }\r\n\r\n return {\r\n init: function () {\r\n $view.find('.js-add-to-shopping-list-btn').click(function (evt) {\r\n evt.preventDefault();\r\n\r\n var $productContainer = utils.$getProductContainerFor(this);\r\n var productUniqueId = $productContainer.data('uniqueid');\r\n var productVariantsProcessor = variantProcessorsMap[productUniqueId];\r\n\r\n if (_isVariantsSelectionValid(productVariantsProcessor)) {\r\n var addType = $(this).data('add-type');\r\n\r\n var quantity = 0;\r\n var fraction = 0;\r\n\r\n switch ((addType || '').toLowerCase()) {\r\n case 'fraction':\r\n fraction = utils.tryParseNumberOrDefault($productContainer.find('.js-fraction').val());\r\n break;\r\n case 'factor':\r\n quantity = $productContainer.find('.js-quantity').val() || 1;\r\n break;\r\n default:\r\n quantity = utils.tryParseNumberOrDefault($productContainer.find('.js-quantity').val(), 1);\r\n fraction = utils.tryParseNumberOrDefault($productContainer.find('.js-fraction').val());\r\n break;\r\n }\r\n\r\n var contractForShoppingList = [\r\n {\r\n productId: model.productId,\r\n imageId: model.mainImage.id,\r\n quantity: quantity,\r\n fraction: fraction,\r\n customFields: model.customFields\r\n }\r\n ];\r\n root.showAddToCollectionPopup(contractForShoppingList);\r\n }\r\n });\r\n\r\n $view.find('.js-add-additional-product-to-shopping-list-btn').click(function (evt) {\r\n evt.preventDefault();\r\n\r\n var additionalProductId = $(this).data(\"additional-product-id\");\r\n var additionalProductModel = model.additionalProducts.filter(function (value) {\r\n return value.productId === additionalProductId;\r\n })[0];\r\n\r\n var quantity = utils.tryParseNumberOrDefault($view.find(\".js-additional-product-quantity[data-additional-product-id='\" + additionalProductId + \"']\").val(), 1);\r\n var fraction = utils.tryParseNumberOrDefault($view.find(\".js-additional-product-fraction[data-additional-product-id='\" + additionalProductId + \"']\").val());\r\n\r\n var contractForShoppingList = [\r\n {\r\n productId: additionalProductModel.productId,\r\n imageId: additionalProductModel.mainImage.id,\r\n quantity: quantity,\r\n fraction: fraction,\r\n }\r\n ];\r\n root.showAddToCollectionPopup(contractForShoppingList);\r\n });\r\n\r\n $view.find('.js-add-to-wish-list-btn').click(function (evt) {\r\n evt.preventDefault();\r\n var $wishListControl = $(this);\r\n\r\n var isAddToWishListAction = $wishListControl.hasClass('c-wish-list-btn_add');\r\n\r\n if (model.isAvailableToBuy) {\r\n\r\n root.updateWishList(model.productId, isAddToWishListAction ? 'add' : 'remove', wishListCallback);\r\n }\r\n\r\n function wishListCallback(dataContract) {\r\n if (dataContract.status.toLowerCase() === 'ok') {\r\n _.each(dataContract.result.items,\r\n function (prod) {\r\n if (prod.status.toLowerCase() === 'ok') {\r\n say.success(model.metadata['wishListUpdated']);\r\n\r\n $wishListControl.toggleClass('c-wish-list-btn_add', !isAddToWishListAction);\r\n $wishListControl.toggleClass('c-wish-list-btn_remove',\r\n isAddToWishListAction);\r\n } else {\r\n say.error(prod.message);\r\n }\r\n });\r\n } else {\r\n say.error(dataContract.message);\r\n }\r\n }\r\n\r\n });\r\n }\r\n }\r\n }\r\n\r\n function quantityDiscountsProcessor($view, model) {\r\n var $quantityDiscountsContainer = $view.find('.js-quantity-discounts');\r\n var $quantityDiscountsInfo = $view.find('.js-quantity-discounts-info');\r\n\r\n function renderQuantityDiscounts(selectedVariants) {\r\n $.ajax({\r\n url: root.R + 'handlers/public/estoredata.ashx',\r\n type: 'GET',\r\n data: {\r\n a: 'GetQuantityDiscounts',\r\n itemId: model.itemId,\r\n dim1: selectedVariants !== undefined && selectedVariants[0] !== undefined ? selectedVariants[0] : 0,\r\n dim2: selectedVariants !== undefined && selectedVariants[1] !== undefined ? selectedVariants[1] : 0,\r\n dim3: selectedVariants !== undefined && selectedVariants[2] !== undefined ? selectedVariants[2] : 0,\r\n showPrice: model.quantityDiscountVisibility === 'Price',\r\n format: 'html'\r\n }\r\n })\r\n .done(function (result) {\r\n if (result && result.length > 0) {\r\n $quantityDiscountsContainer.show();\r\n $quantityDiscountsInfo.html(result);\r\n } else {\r\n $quantityDiscountsContainer.hide();\r\n }\r\n })\r\n .fail(function () {\r\n $quantityDiscountsContainer.hide();\r\n });\r\n }\r\n\r\n return {\r\n renderQuantityDiscounts: function (selectedVariants) {\r\n if ($quantityDiscountsContainer.length > 0) {\r\n renderQuantityDiscounts(selectedVariants);\r\n }\r\n }\r\n }\r\n }\r\n\r\n function priceRequestProcessor($view) {\r\n return {\r\n init: function () {\r\n\r\n var $feedbackControlContainer = $('.js-feedback-control');\r\n var $priceRequestContainerBtn = $view.find('.js-price-request-btn');\r\n\r\n if ($feedbackControlContainer.length > 0) {\r\n $priceRequestContainerBtn.on('click', function () {\r\n $.fancybox.open({\r\n parentEl: \"form:first\",\r\n src: $feedbackControlContainer,\r\n type: 'inline'\r\n });\r\n });\r\n }\r\n\r\n }\r\n }\r\n }\r\n\r\n function externalTrackingProcessor() {\r\n function _reportAdditionalProductsView($viewContainer, model) {\r\n var viewProductName = $.trim(model.title || document.title);\r\n\r\n var $additionalProductsContainer = $viewContainer.find('.js-additional-product-list');\r\n var $additionalProducts = $additionalProductsContainer.find('.js-additional-product');\r\n\r\n if ($additionalProducts.length > 0) {\r\n var listName = viewProductName + ' > ' + ($additionalProductsContainer.data('listname') || model.metadata['additionalProductsTab']);\r\n var additionalProductIdsWithLinks = $additionalProducts.map(function () {\r\n var $prod = $(this);\r\n var productId = $prod.data('productid');\r\n var $links = $prod.find('.js-product-link');\r\n\r\n return { productId: productId, $links: $links };\r\n }).get();\r\n\r\n root.reportProductListView(root.productListType.relatedProducts, listName, additionalProductIdsWithLinks);\r\n }\r\n }\r\n\r\n return {\r\n reportProductsView: function ($viewContainer, model) {\r\n root.reportProductDetailsView(model.productId);\r\n\r\n _reportAdditionalProductsView($viewContainer, model);\r\n },\r\n reportProductDetailsView: function (productId) {\r\n root.reportProductDetailsView(productId);\r\n },\r\n };\r\n }\r\n\r\n function relationExtensionDataProcessor($viewContainer, model, variantProcessorsMap, priceTotalsController, pubsub) {\r\n var relationExtData = null;\r\n\r\n var additionalProdMap = {}; // { relID1: { prodID1: { product1 }}}\r\n _.each(model.additionalProducts, function (prod) {\r\n if (prod.group && prod.group.groupType === 'Relation') {\r\n var relationId = prod.group.groupId;\r\n if (!additionalProdMap[relationId]) {\r\n additionalProdMap[relationId] = {};\r\n }\r\n\r\n additionalProdMap[relationId][prod.productId] = prod;\r\n }\r\n });\r\n\r\n function _applyExtensionData(variantTypeName, variantValueName) {\r\n if (variantTypeName && variantValueName) {\r\n variantTypeName = variantTypeName.toLowerCase();\r\n variantValueName = variantValueName.toLowerCase();\r\n\r\n var extData = relationExtData[variantTypeName] ? relationExtData[variantTypeName][variantValueName] : null;\r\n if (extData) {\r\n var isAnyQuantityAffected = false;\r\n\r\n _.each(extData, function (extDataItem) {\r\n var productId = extDataItem.productID;\r\n if (productId === null) {\r\n // Regular non-variant products do not store their productID in relation data. Therefore, need to resolve productID first.\r\n productId = _getSingleProductIdByItemId(extDataItem.itemID);\r\n }\r\n\r\n var additionalProduct = _getAdditionalProduct(extDataItem.relationID, productId);\r\n if (additionalProduct) {\r\n var uniqueId = additionalProduct.uniqueId;\r\n if (uniqueId) {\r\n if (typeof (extDataItem.quantityInRelation) !== 'undefined') {\r\n $viewContainer.find('[data-uniqueid=\"' + uniqueId + '\"] .js-quantity').val(extDataItem.quantityInRelation);\r\n isAnyQuantityAffected = true;\r\n }\r\n\r\n if (typeof (extDataItem.variants) !== 'undefined') {\r\n var variantsProc = variantProcessorsMap[uniqueId];\r\n if (variantsProc) {\r\n _.each(extDataItem.variants, function (variantValue, variantType) { variantsProc.selectVariantByName(variantType, variantValue); });\r\n }\r\n }\r\n }\r\n }\r\n });\r\n\r\n if (isAnyQuantityAffected) {\r\n priceTotalsController.updatePriceTotals();\r\n }\r\n }\r\n }\r\n }\r\n\r\n function _getSelectedVariantTypeToValueNamePairs(product) {\r\n var namePairs = {};\r\n\r\n var variantProduct = _.find(product.variantProducts, function (x) { return x.productId === product.productId });\r\n if (variantProduct) {\r\n _.each(product.variantTypes, function (x) {\r\n var selectVariantValue = _.find(x.variants, function (y) { return _.indexOf(variantProduct.variants, y.id) !== -1; });\r\n if (selectVariantValue && selectVariantValue.id > 0) {\r\n namePairs[x.name] = selectVariantValue.name;\r\n }\r\n });\r\n }\r\n\r\n return namePairs;\r\n }\r\n\r\n function _renderExtensionDataGrids($extDataGridsContainer) {\r\n if (_.isEmpty(relationExtData) || _.isEmpty(additionalProdMap)) {\r\n $extDataGridsContainer.remove();\r\n } else {\r\n var extensionDataGridTemplateCompiled = _.template('<\\% _.each(columns, function(column) { %><\\% }); %><\\% _.each(_.sortBy(rows, \\'position\\'), function(prod) { %>\\'><\\% _.each(columns, function(column) { %><\\% }); %><\\% }); %>
<\\%= column %>
<\\%= prod.title %><\\%= prod.extDataMap[column] ? prod.extDataMap[column].quantityInRelation : \\'-\\' %>
');\r\n\r\n // Render a separate grid for every general product's variant type with extension data.\r\n // Join extension data with existing additional products and ignore extension data for not available additional products.\r\n // Remember that there can be same products in different relations having their own relation extension data. So the key to the product should be productId + relationId.\r\n // Try follow the visible positions of the additional products shown.\r\n var visiblePositionMap = {};\r\n $viewContainer.find('.js-additional-product[data-uniqueid]').each(function (idx, elem) {\r\n var uniqueId = $(elem).data('uniqueid');\r\n if (uniqueId) {\r\n visiblePositionMap[uniqueId] = idx;\r\n }\r\n });\r\n\r\n _.each(relationExtData, function (variantTypeExtData, variantTypeName) {\r\n var gridModel = { gridTitle: variantTypeName, columns: [], rows: {} };\r\n\r\n _.each(variantTypeExtData, function (relProdExtDataArray, variantValueName) {\r\n gridModel.columns.push(variantValueName);\r\n\r\n _.each(relProdExtDataArray, function (relProdExtData) {\r\n var rowId = relProdExtData.relationID + '_' + relProdExtData.productID;\r\n // If the correpsonding product is found in additionals then add it to rows.\r\n // If the product is not found then add null value so we do not check it once more.\r\n if (typeof (gridModel.rows[rowId]) === 'undefined') {\r\n var additionalProduct = _getAdditionalProduct(relProdExtData.relationID, relProdExtData.productID);\r\n if (additionalProduct) {\r\n var visiblePosition = visiblePositionMap[additionalProduct.uniqueId];\r\n gridModel.rows[rowId] = {\r\n uniqueId: additionalProduct.uniqueId,\r\n group: additionalProduct.group.groupName,\r\n title: additionalProduct.title,\r\n position: visiblePosition > -1 ? visiblePosition : undefined,\r\n extDataMap: {}\r\n }\r\n } else {\r\n gridModel.rows[rowId] = null;\r\n }\r\n }\r\n\r\n if (gridModel.rows[rowId] !== null) {\r\n gridModel.rows[rowId].extDataMap[variantValueName] = relProdExtData;\r\n }\r\n });\r\n });\r\n\r\n //filter rows with null value before template compilation\r\n gridModel.rows = _.filter(gridModel.rows, function (row) {\r\n return row !== null;\r\n });\r\n var gridHtml = extensionDataGridTemplateCompiled(gridModel);\r\n\r\n $extDataGridsContainer.append(gridHtml);\r\n });\r\n }\r\n }\r\n\r\n function _getAdditionalProduct(relationId, productId) {\r\n return additionalProdMap[relationId] ? additionalProdMap[relationId][productId] : undefined;\r\n }\r\n\r\n function _getSingleProductIdByItemId(itemId) {\r\n var singleProduct = _.find(model.additionalProducts, function (additionalProd) { return !additionalProd.isProductWithVariants && additionalProd.itemId === itemId });\r\n\r\n return singleProduct ? singleProduct.productId : null;\r\n }\r\n\r\n function _oneTimeVariantProdUpdateHandler(topic, variantProductDetails) {\r\n pubsub.unsubscribe(_oneTimeVariantProdUpdateHandler);\r\n\r\n if (!variantProductDetails.IsMainProd) {\r\n var preselectedVariants = _getSelectedVariantTypeToValueNamePairs(model);\r\n _.each(preselectedVariants, function (valueName, typeName) { _applyExtensionData(typeName, valueName); });\r\n }\r\n }\r\n\r\n return {\r\n init: function () {\r\n var mainProductVariantsProcessor = variantProcessorsMap[model.uniqueId];\r\n\r\n if (mainProductVariantsProcessor) {\r\n $.ajax({\r\n url: root.R + 'api/archive/relation/foritem/' + model.itemId + '/variant/ext-data',\r\n type: 'GET',\r\n data: {\r\n relationIds: _.keys(additionalProdMap)\r\n }\r\n })\r\n .done(function (relationExtensionData) {\r\n relationExtData = relationExtensionData;\r\n\r\n if (relationExtData) {\r\n if (model.isVariantProductOfProductWithVariants) {\r\n // Apply extension data immediately if variant product is shown initially\r\n var preselectedVariants = _getSelectedVariantTypeToValueNamePairs(model);\r\n _.each(preselectedVariants, function (valueName, typeName) { _applyExtensionData(typeName, valueName); });\r\n } else {\r\n pubsub.subscribe('variantprocessor.variantproduct.updated', _oneTimeVariantProdUpdateHandler);\r\n }\r\n\r\n mainProductVariantsProcessor.$selectors.on('variantselector:changed', function (evt, changedVariantType, newVariantValue) {\r\n if (newVariantValue > 0) {\r\n var mainVariantValueDetails = _.find(changedVariantType.variants, function (variant) { return variant.id === newVariantValue; });\r\n\r\n _applyExtensionData(changedVariantType.name, mainVariantValueDetails.name);\r\n }\r\n });\r\n }\r\n\r\n var $extDataGridsContainer = $viewContainer.find('.js-relation-extension-data-scheme');\r\n if ($extDataGridsContainer.length > 0) {\r\n _renderExtensionDataGrids($extDataGridsContainer);\r\n }\r\n })\r\n .fail(function (errorResponse) {\r\n console.error('[UMW]: Failed to get relation extension data', errorResponse);\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n function priceTotalsProcessor($view, utils) {\r\n var additionalsGroup = 'additionals';\r\n var defaultGroup = 'default';\r\n var defaultEmptyText = '0';\r\n var valueLoadingText = '...';\r\n var updateTimer = null;\r\n\r\n var $priceTotalsElements;\r\n\r\n var cache = { empty: [] };\r\n\r\n function _buildCacheKey(products) {\r\n var cacheKey = products && products.length > 0 ? JSON.stringify(products) : 'empty';\r\n\r\n return cacheKey;\r\n }\r\n\r\n function _setResults(groupedTotals) {\r\n var totalsMap = {};\r\n _.each(groupedTotals, function (g) {\r\n g.hasDiscount = g.origPrice !== g.price;\r\n\r\n totalsMap[g.group || defaultGroup] = g;\r\n });\r\n\r\n $priceTotalsElements.each(function () {\r\n var $elem = $(this);\r\n var $elemContainer = $elem.closest('.js-price-totals-container');\r\n\r\n var group = $elem.data('price-totals-group') || defaultGroup;\r\n\r\n var totals = totalsMap[group] || {};\r\n var totalsType = $elem.data('price-totals') || 'sellprice';\r\n\r\n var totalsValue;\r\n switch (totalsType.toLowerCase()) {\r\n case 'quantity':\r\n totalsValue = totals.quantity || defaultEmptyText;\r\n break;\r\n case 'price':\r\n case 'sellprice':\r\n totalsValue = totals.price || defaultEmptyText;\r\n break;\r\n case 'originalprice':\r\n case 'beforeprice':\r\n case 'before':\r\n totalsValue = totals.hasDiscount ? totals.origPrice : null;\r\n break;\r\n case 'discount':\r\n case 'discountprice':\r\n totalsValue = totals.hasDiscount ? totals.discPrice : null;\r\n break;\r\n default:\r\n totalsValue = null;\r\n break;\r\n }\r\n\r\n if (totalsValue !== null) {\r\n $elem.text(totalsValue).show();\r\n $elemContainer.show();\r\n } else {\r\n $elem.hide();\r\n $elemContainer.hide();\r\n }\r\n });\r\n }\r\n\r\n function _getProductsWithPositiveQuantities() {\r\n return $view.find('.js-quantity').map(function () {\r\n var $quantity = $(this);\r\n var quantity = utils.tryParseNumberOrDefault($quantity.val());\r\n\r\n var productContract = null;\r\n\r\n if (quantity > 0) {\r\n var $productContainer = utils.$getProductContainerFor($quantity);\r\n var productId = $productContainer.data('productid');\r\n\r\n var groupName = $quantity.data('price-totals-group') || $productContainer.data('price-totals-group');\r\n if (!groupName) {\r\n // Auto-detect group name\r\n groupName = $productContainer.hasClass('js-additional-product') ? additionalsGroup : null;\r\n }\r\n\r\n productContract = {\r\n group: groupName,\r\n prodId: productId,\r\n quantity: quantity\r\n };\r\n }\r\n\r\n return productContract;\r\n }).get();\r\n };\r\n\r\n function _updatePriceTotals() {\r\n var products = _getProductsWithPositiveQuantities();\r\n var cacheKey = _buildCacheKey(products);\r\n\r\n if (cache[cacheKey]) {\r\n _setResults(cache[cacheKey]);\r\n } else {\r\n $priceTotalsElements.text(valueLoadingText);\r\n\r\n $.ajax({\r\n url: root.R + 'handlers/public/productdata.ashx',\r\n type: 'POST',\r\n data: {\r\n a: 'GetProductListQuantityPrice',\r\n params: JSON.stringify({ products: products })\r\n }\r\n })\r\n .done(function (result) {\r\n cache[cacheKey] = result;\r\n\r\n _setResults(result);\r\n })\r\n .fail(function (errResp) {\r\n var errorMessage = utils.extractErrorMessageFromResponse(errResp);\r\n console.error('Failed to calculate price totals. ', errorMessage);\r\n });\r\n }\r\n }\r\n\r\n return {\r\n init: function () {\r\n $priceTotalsElements = $view.find('[data-price-totals]');\r\n var isAnyElementFound = $priceTotalsElements.length > 0;\r\n\r\n if (isAnyElementFound) {\r\n $view.find('.js-quantity').on('change', function () {\r\n if (updateTimer) {\r\n root.clearTimeout(updateTimer);\r\n updateTimer = null;\r\n }\r\n\r\n updateTimer = root.setTimeout(_updatePriceTotals, 500);\r\n });\r\n\r\n // Initial calculation - some quantities may be pre-set\r\n _updatePriceTotals();\r\n }\r\n },\r\n updatePriceTotals: function () {\r\n if (updateTimer) {\r\n root.clearTimeout(updateTimer);\r\n updateTimer = null;\r\n }\r\n\r\n var isAnyElementFound = $priceTotalsElements.length > 0;\r\n\r\n if (isAnyElementFound) {\r\n _updatePriceTotals();\r\n }\r\n },\r\n }\r\n }\r\n\r\n function PackageComponentProcessor($view, model, utils) {\r\n var $packageComponentsContainer = utils.$getProductContainerElements($view, '.js-component-products-list');\r\n if (!model.packageComponentProducts || !$packageComponentsContainer.length) {\r\n return;\r\n }\r\n\r\n var $generalProdQty = utils.$getProductContainerElements($view, '.js-quantity');\r\n $generalProdQty.on('change', function () {\r\n var quantity = utils.tryParseNumberOrDefault($(this).val());\r\n _.each(model.packageComponentProducts, function (packageComponent) {\r\n var $componentProductContainer = $packageComponentsContainer.find('.js-component-product[data-uniqueid=\"' + packageComponent.uniqueId + '\"]');\r\n $componentProductContainer.find('.js-component-quantity').text(packageComponent.initialQuantity.raw * quantity);\r\n });\r\n\r\n });\r\n }\r\n\r\n function util() {\r\n function _$getProductContainerFor(elem) {\r\n // It is the requirement that every product container should have data-uniqueid attirbute\r\n return $(elem).closest('[data-uniqueid]');\r\n }\r\n return {\r\n tryParseNumberOrDefault: function (rawValue, defaultValue) {\r\n var parsed;\r\n\r\n if (typeof rawValue === 'string') {\r\n parsed = parseFloat(rawValue.replace(',', '.'));\r\n } else {\r\n parsed = rawValue;\r\n }\r\n\r\n return parsed === 0 ? parsed : parsed || defaultValue || 0;\r\n },\r\n $getProductContainerFor: _$getProductContainerFor,\r\n $getProductContainerElements: function ($container, selector) {\r\n // There might be situations when there are multiple product containers with the similar elements from differen products inside another product container.\r\n // An example: additional products that are rendered inside the general product's container.\r\n // In addition, there can be situations when the same product is rendered multiple times as additional or both as additional and as general product.\r\n // So, if we will try to find elements by selector, e.g. $view.find('.js-variant-selector') then jQuery will find variant selectors of the current product container and also all variant selectors of all nested product containers.\r\n // Therefore, we need to know for sure what elements belong to the current product container.\r\n // We can rely on the closest container with the data-uniqueid attribute (since it is a requirement to have it) and then compare the found element with the container from arguments.\r\n return $container.find(selector).filter(function () { return _$getProductContainerFor(this).is($container); });\r\n },\r\n trimAndLowerCase: function (str) {\r\n return (str || '').trim().toLowerCase();\r\n },\r\n caseInsensetiveEquals: function (str1, str2) {\r\n return typeof str1 === 'string' && typeof str2 === 'string'\r\n ? str1.trim().toLowerCase() === str2.trim().toLowerCase()\r\n : str1 === str2;\r\n },\r\n extractErrorMessageFromResponse: function (errorResponse) {\r\n var message;\r\n if (typeof errorResponse === 'object' && errorResponse !== null) {\r\n // Extract error message\r\n try {\r\n var parsedResponseBody = JSON.parse(errorResponse.responseText);\r\n message = parsedResponseBody.ExceptionMessage ? parsedResponseBody.ExceptionMessage : (parsedResponseBody.Message ? parsedResponseBody.Message : errorResponse.statusText);\r\n } catch (e) {\r\n message = errorResponse.statusText;\r\n }\r\n } else {\r\n message = errorResponse;\r\n }\r\n\r\n return message;\r\n }\r\n }\r\n }\r\n})(jQuery, _, window);"],"names":["$","_","root","undefined","pubsub","assetId","productViewController","$viewContainer","productViewModel","model","PubSub","utils","util","say","notificator","variantProcessorsMap","priceTotals","init","preselectedVariants","$view","quantityDiscounts","quantityDiscountsProcessor","externalTracking","externalTrackingProcessor","priceTotalsProcessor","isProductWithVariants","result","queryString","location","search","slice","re","match","exec","paramKey","decodeURIComponent","toLowerCase","paramValue","replace","_getPreselectedVariantsFromQueryString","_initVariantsProcessor","renderQuantityDiscounts","packageComponentProducts","each","packageComponent","$componentProductContainer","isMainProductOfProductWithVariants","find","uniqueId","variantRelImageMatchRegExp","PackageComponentProcessor","additionalProducts","additionalProduct","$additionalProductContainer","cartProcessor","flagsProcessor","ratingProcessor","shoppingListProcessor","isPrintEnabled","printProcessor","pdfProcessor","isPriceRequestEnabled","$feedbackControlContainer","$priceRequestContainerBtn","length","on","fancybox","open","parentEl","src","type","galleryProcessor","reportProductsView","isProductRelationsExtensionEnabled","relationExtensionDataProcessor","similarProductsSelect","window","e","target","selectedOptions","dataset","url","$productContainer","productModel","quantityDiscountsProcessorInstance","externalTrackingProcessorInstance","enableHistoryState","processor","variantsProcessor","metadata","_notify","message","notificationType","timeout","extractErrorMessageFromResponse","publish","text","console","error","alert","success","warning","apply","this","product","priceTotalsController","$container","$declaredVariantSelectors","$getProductContainerElements","variantControllers","isVariantProductShown","suppressVariantProductDetailsLoading","variantsState","controlId","selectedVariantProd","suppressVariantChangedEvent","currentlyUnavailableVariantsMap","_onVariantSelectionChanged","changedVariantType","newVariantValue","variantTypeId","id","variantProductsForSelection","changedVariantController","prevVariantValue","selectedValue","selectedVariants","map","currentController","selectedVariantProduct","every","x","filter","variantProducts","y","indexOf","variants","_loadVariantProductDetails","_filterUnavailableVariants","selectedVariantTypes","selectedVariantOptions","variantController","push","variantType","isAnyVariantSelected","forEach","variantProduct","isProductForCurrentSelection","selectedVariantOption","variantId","availabilityMessage","disabled","exists","isAvailable","preselectSingleAvailable","isEmpty","name","selector","filterVariants","beforeLoadEvent","Event","trigger","isDefaultPrevented","blockUI","ajax","R","data","a","ItemID","itemId","Dim1","Dim2","Dim3","CanHandleDisallowedBuyDims","ImageWidth","previewImageWidth","ImgMod","previewImageMode","InclVat","sellPrice","inclVat","always","unblockUI","done","variantProductDetails","_updateViewProductWithNewData","newData","$priceFromText","IsMainProd","isVariantProductOfProductWithVariants","$replacementProductContainer","toggle","productId","ProductID","prodno","ProdNo","title","FullTitle","reportProductDetailsView","ImageURL","mainImage","ImageID","ImageText","description","actualWidth","ImageMaxWidth","thumbnailUrl","ImageRelURL","previewUrl","fullSizeUrl","ImageLBURL","displayWidth","ImagePreviewDisplayWidth","displayHeight","ImagePreviewDisplayHeight","$mainImage","attr","galleryId","$mainImageGalleryLink","closest","removeAttr","removeData","stockText","StockText","stockColor","StockColor","$stockText","css","formatted","Price","raw","$sellPriceFormatted","sellPriceWithVAT","PriceInclVat","$sellPriceWithVatFormatted","sellPriceWithoutVAT","PriceExclVat","$sellPriceWithoutVatFormatted","beforePrice","OriginalPrice","$beforePriceFormatted","$beforePriceElements","add","HasDiscount","show","hide","discountPrice","Discount","$discountPriceFormatted","$discountPriceElements","discountPercent","DiscountPercent","$discountPercentFormatted","$discountPercentElements","discountToDate","DiscountToDate","$discountToDateFormatted","$discountToDateElements","comparablePrice","ComparablePrice","$comparablePriceFormatted","factorPrice","FactorPrice","$factorPriceFormatted","productInFactorPrice","ProductInFactorPrice","$productInFactorPriceFormatted","ReplacementProductInfo","empty","html","updatePriceTotals","supplierOrderInfoTooltip","get","supplierOrderInfo","shadowRoot","querySelector","$stockTextInfoIcon","InSupplierOrder","visible","update","warn","history","urlParts","href","split","resultUrl","removeQueryStringParam","setQueryStringParam","pushState","fail","errorResponse","_selectVariantControllersValues","preselectVariantTypeValue","setSelected","_onHistoryPopState","evt","state","originalEvent","_selectVariantByName","variantTypeName","variantValueName","controller","caseInsensetiveEquals","setSelectedByName","$selector","viewBuilderName","viewBuilder","variantViewBuilders","variantTypes","variantSelector","$elem","keys","initialVariantProduct","preselectedVariantValue","preselectedVariantType","replaceState","getNotSelectedVariants","selectVariantByName","$selectors","fancyboxTilesVariantController","variantTypeInfo","templateData","beforeVariantRenderEvent","viewHtml","template","$tiles","$variants","$previewImage","$previewName","$selectedVariantImage","$selectVariantBtn","preventDefault","_setPreview","_setSelected","removeClass","close","append","variant","container","_setSelectedById","foundVariantValue","currentVariant","getSelected","unavailableVariants","$singleAvailableVariant","$this","$unavailable","unavailableVariant","addClass","$variantToSelect","hasClass","isVariantAlreadySelected","currentVariantValue","isSelectedOptionAvailable","$selected","is","tilesVariantController","templateContent","_sortVariants","onVariantsSortEvent","sizeMap","startsWithNumberRegEx","sortBy","variantName","normalize","isNumeric","parseFloat","positionInSize","matches","estore","PublicEStore","productsInCartMap","productsToCustomFieldIdsForOrderMap","_addToCart","addToCartContracts","$handler","when","addToCart","dataContract","setTimeout","status","items","resultItem","itemStatus","statusMessage","parseInt","_getFirstProductModelByProductId","productID","join","_showPublicEStoreError","tempOrderLineId","cartUrl","pefContract","exractedMessage","_toggleCartIndicator","animate","variantProductIds","displayedProductId","isMainProductDisplayed","numberQuantityInCart","reduce","memo","qtyInCart","isProductInCart","$cartQuantity","$cartIndicator","effect","to","_addToCartHandler","topic","currentProduct","value","totalQuantityInTempOrderLine","_removeFromCartHandler","deletedProductId","isVariantProductOfDisplayedMainProductDeleted","some","variantProd","_emptyCartHandler","_getCartInfoHandler","cartInfo","detailedCartInfo","products","quantity","_getAddToCartContractFromContainer","buyType","packageId","packageQuantity","productUniqueId","componentProduct","customFieldIdsForOrder","customFields","displayType","includeInOrder","fraction","tryParseNumberOrDefault","val","packageSize","initialQuantity","hasPackageComponentsError","packageComponents","$packageComponentsContainer","notSelectedVariants","notSelectedVariantNames","isSelectionValid","prodTitle","isFormValid","validator","minQuantity","productVariantsProcessor","validate","ignore","$requiredField","element","idx","isQuantityValid","componentContracts","concat","addToCartContract","$customFieldControl","customFieldId","customFieldValue","toString","imageId","componentOfPackageProductID","packageProductID","_processVippsHurtigkasseCheckout","vippsHurtigkasseComponent","deferred","Deferred","getTempOrderLines","then","tempOrderLinesResult","dialogHtml","vippsHurtigkasseBuyDlgTemplate","productCount","dialog","resizable","draggable","modal","autoOpen","width","closeOnEscape","payWithVippsHurtigkasse","buttons","class","buyOnlyCurrentProduct","click","emptyCart","_addToCartAndResolveDeferred","reject","event","ui","resolve","promise","$getProductContainerFor","addToCartResult","_prepareCartForCheckout","proceedToCheckout","startCheckout","subscribe","getDetailedCartInfo","$buyButton","allContractsAreValid","$quantity","contracts","dataAttributes","$quantityInput","Math","round","flagsHandlerUrl","itemIds","archiveType","$flagsTarget","flags","flagDetails","FlagID","Name","appendTo","replaceEmptyString","_buildRatingView","ratingModel","stars","starredRatingValue","rating","wholeStar","incompleteStarValue","emptyStars","emptyStar","_buildStars","$ratingHtml","ratingData","commentsCount","ratingsCount","hasUserPostedReview","printPath","printUrl","pdfUrl","pdfTemplateId","fancyboxOptions","loop","hash","contractForShoppingList","showAddToCollectionPopup","additionalProductId","additionalProductModel","$wishListControl","isAddToWishListAction","isAvailableToBuy","updateWishList","prod","toggleClass","$quantityDiscountsContainer","$quantityDiscountsInfo","dim1","dim2","dim3","showPrice","quantityDiscountVisibility","format","viewProductName","$additionalProducts","trim","document","$additionalProductsContainer","listName","additionalProductIdsWithLinks","$prod","$links","reportProductListView","productListType","relatedProducts","relationExtData","additionalProdMap","_applyExtensionData","isAnyQuantityAffected","extData","extDataItem","variantsProc","itemID","singleProduct","additionalProd","_getAdditionalProduct","relationID","quantityInRelation","variantValue","_getSelectedVariantTypeToValueNamePairs","namePairs","selectVariantValue","relationId","_oneTimeVariantProdUpdateHandler","unsubscribe","valueName","typeName","group","groupType","groupId","mainProductVariantsProcessor","relationIds","relationExtensionData","mainVariantValueDetails","$extDataGridsContainer","extensionDataGridTemplateCompiled","visiblePositionMap","remove","elem","variantTypeExtData","gridModel","gridTitle","columns","rows","gridHtml","relProdExtDataArray","relProdExtData","visiblePosition","rowId","groupName","position","extDataMap","row","$priceTotalsElements","additionalsGroup","defaultGroup","defaultEmptyText","updateTimer","cache","_setResults","groupedTotals","totalsMap","g","hasDiscount","origPrice","price","totalsValue","$elemContainer","totals","discPrice","_updatePriceTotals","productContract","prodId","cacheKey","JSON","stringify","params","errResp","errorMessage","clearTimeout","_$getProductContainerFor","rawValue","defaultValue","parsed","trimAndLowerCase","str","str1","str2","parsedResponseBody","parse","responseText","ExceptionMessage","Message","statusText","umwAssets","ctx","mainPanelId","$mainPanel","Date","valueOf","labels","select","$dropDownContainer","$dropDown","_triggerSelectorChangedEvent","_getSelected","$singleAvailableOption","$options","cleanOptionName","$option","parent","prepend","defaultArchiveImage","thumbnailImageWidth","thumbnailImageMode","thumbnailImage","height","relatedImages","variantNameRegex","RegExp","relatedImage","relImg","imageName","test","image","variantUniqueId","jQuery"],"mappings":"CAAA,SAAWA,EAAGC,EAAGC,EAAMC,gBAGnB,IA0rBWC,EA1rBPC,EAAU,oBAGd,SAASC,EAAsBC,EAAgBC,GAC3C,IAAIC,EAAQD,EACRJ,EAASF,EAAKQ,OACdC,EAAQ,IAAIC,EACZC,EAAM,IAAIC,EAAYV,EAAQO,GAC9BI,EAAuB,GAKvBC,EAAc,KAGlB,MAAO,CACHC,KAAM,WACF,IAOQC,EAihEWC,EAxhEfC,EAAoB,IAAIC,EAA2Bd,EAAgBE,GACnEa,EAAmB,IAAIC,GAE3BP,EAAc,IAAIQ,EAAqBjB,EAAgBI,IAC3CM,OAERR,EAAMgB,uBACFP,EA8EhB,WACI,IAAIQ,EAAS,GAAIC,EAAcC,SAASC,OAAOC,MAAM,GAAIC,EAAK,qCAE9D,KAAQC,EAAQD,EAAGE,KAAKN,IAAe,CACnC,IAAIO,EAAWC,mBAAmBH,EAAM,IAAII,cACxCC,EAAaF,mBAAmBH,EAAM,GAAGM,QAAQ,MAAO,MAAMF,cAClEV,EAAOQ,GAAYG,EAGvB,OAAOX,EAvF2Ba,GAC1BC,EAAuBjC,EAAgBE,EAAOO,EAAaI,EAAmBE,EAAkBJ,GAAqB,IAGrHE,EAAkBqB,0BAGlBhC,EAAMiC,2BACNzC,EAAE0C,KAAKlC,EAAMiC,yBAA0B,SAAUE,GAC7C,IACQC,EADJD,EAAiBE,qCACbD,EAA6BtC,EAAewC,KAAK,oEAAsEH,EAAiBI,SAAW,MACvJJ,EAAiBK,2BAA6BxC,EAAMwC,2BACpDT,EAAuBK,EAA4BD,EAAkB5B,MAGrDkC,EAA0B3C,EAAgBE,EAAOE,IAGzEF,EAAM0C,oBACNlD,EAAE0C,KAAKlC,EAAM0C,mBAAoB,SAAUC,GACvC,IACQC,EADJD,EAAkB3B,wBACd4B,EAA8B9C,EAAewC,KAAK,yCAA2CK,EAAkBJ,SAAW,MAC9HI,EAAkBH,2BAA6BxC,EAAMwC,2BACrDT,EAAuBa,EAA6BD,EAAmBpC,MAK5E,IAAIsC,EAAc/C,EAAgBE,EAAOI,EAAKT,EAAQW,EAAsBJ,GAC9EM,OAEG,IAAIsC,EAAehD,EAAgBE,GACrCQ,OAEG,IAAIuC,EAAgBjD,EAAgBE,EAAOL,GAC7Ca,OAEmB,IAAIwC,EAAsBlD,EAAgBE,EAAOI,EAAKF,EAAOI,GACnEE,OAEhBR,EAAMiD,gBACa,IAAIC,EAAepD,EAAgBE,GACzCQ,OAGA,IAAI2C,EAAarD,EAAgBE,GACvCQ,OAEPR,EAAMoD,wBAi+DS1C,EAh+DiCZ,EAi+DrD,CACHU,KAAM,WAEF,IAAI6C,EAA4B9D,EAAE,wBAC9B+D,EAA4B5C,EAAM4B,KAAK,yBAEJ,EAAnCe,EAA0BE,QAC1BD,EAA0BE,GAAG,QAAS,WAClCjE,EAAEkE,SAASC,KAAK,CACZC,SAAU,aACVC,IAAKP,EACLQ,KAAM,eA3+DMrD,QAGd,IAAIsD,EAAiBhE,EAAgBE,GACvCQ,OAERK,EAAiBkD,mBAAmBjE,EAAgBE,GAERA,EAAMgE,oCAAsChE,EAAMgB,uBAAyBhB,EAAM0C,oBAAsB1C,EAAM0C,mBAAmBa,QAE9I,IAAIU,EAA+BnE,EAAgBE,EAAOM,EAAsBC,EAAaZ,GACnGa,OAGxB,MAAM0D,EAAwBpE,EAAewC,KAAK,uCAC9C4B,EAAsBX,QACtBW,EAAsBV,GAAG,SAAU,GAAOW,OAAOhD,SAAWiD,EAAEC,OAAOC,gBAAgB,GAAGC,QAAQC,OAK5G,SAASzC,EAAuB0C,EAAmBC,EAAcnE,EAAaoE,EAAoCC,EAAmCnE,EAAqBoE,GAClKC,EAAY,IAAIC,EAAkBN,EAAmBC,EAAc1E,EAAMgF,SAAUvE,EAAqBL,EAAKT,EAAQY,EAAaoE,EAAoCC,EAAmC1E,EAAO2E,GACpNC,EAAUtE,OAEVF,EAAqBoE,EAAanC,UAAYuC,GAuCtD,SAASzE,EAAYV,EAAQO,GACzB,SAAS+E,EAAQC,EAASC,EAAkBC,GACjB,iBAAZF,GAAoC,OAAZA,IAC/BA,EAAUhF,EAAMmF,gCAAgCH,IAGhDvF,EACAA,EAAO2F,QAAQ,gBAAkBH,EAAkB,CAAEI,KAAML,EAASE,QAASA,IAS7E3F,EAAK+F,QAPqB,CACtBC,MAAS,QACTC,MAAS,MACTC,QAAW,MACXC,QAAW,QAGkBT,IAAmBU,MAAMC,KAAM,CAACZ,IAIzE,MAAO,CACHU,QAAS,SAAUV,GACfD,EAAQC,EAAS,WAAW,IAEhCO,MAAO,SAAUP,GACbD,EAAQC,EAAS,SAAS,IAE9BS,QAAS,SAAUT,GACfD,EAAQC,EAAS,UAAW,OAMxC,SAASH,EAAkBN,EAAmBsB,EAASf,EAAUvE,EAAqBL,EAAKT,EAAQqG,EAAuBrF,EAAmBE,EAAkBX,EAAO2E,GAClK,IAAIoB,EAAaxB,EACbyB,EAA4BhG,EAAMiG,6BAA6BF,EAAY,wBAE3EG,EAAqB,GACrBC,GAAwB,EACxBC,GAAuC,EAEvCC,EAAgB,CAAEC,UAAWT,EAAQxD,SAAUkE,oBAAqB,MACpEC,GAA8B,EAE9BC,EAAkC,GAEtC,SAASC,EAA2BC,EAAoBC,GAgarBC,EA/Z0BF,EAAmBG,GAA5E,IAUQC,EAVJC,EAgaGd,EAAmB,KAAOW,GA/Z7BI,EAAmBD,EAAyBE,cAG5CC,GAFJH,EAAyBE,cAAgBN,GAAmB,EA2CjDtH,EAAE8H,IAAIlB,EAAoB,SAAUmB,GACvC,OAAOA,EAAkBH,eAAiB,KAxC9CI,EAAyB,KAEHhI,EAAEiI,MAAMJ,EAAkB,SAAUK,GAAK,OAAW,EAAJA,MAI3B,KAFvCT,EA2BoBzH,EAAEmI,OAAO5B,EAAQ6B,gBAAiB,SAAUF,GAChE,OAAOlI,EAAEiI,MAAMJ,EAAkB,SAAUQ,GAAK,OAAqC,IAA9BrI,EAAEsI,QAAQJ,EAAEK,SAAUF,QA1BjDtE,OAC5BnD,EAAIwF,QAAQZ,EAAqC,4BACH,IAAvCiC,EAA4B1D,OACnCiE,EAAyBP,EAA4B,GACT,EAArCA,EAA4B1D,QACnCnD,EAAIwF,QAAQZ,EAAuC,6BAAI,IAAMA,EAA2C,mCAI3GsB,IACGkB,EACAQ,EAA2BR,GACpBnB,GAEP2B,KAIJrH,GACAA,EAAkBqB,wBAAwBqF,GAG9C1H,EAAO2F,QAAQ,mCAAoC,CAACwB,EAAiBK,EAAkBD,IAiB3F,SAASe,IACL,IAAIC,EAAuB,GACvBC,EAAyB,GAC7B3I,EAAE0C,KAAKkE,EAAoBgC,IACe,EAAlCA,EAAkBhB,gBAClBc,EAAqBG,KAAKD,EAAkBE,YAAYtB,IACxDmB,EAAuBE,KAAKD,EAAkBhB,kBAItD,MAAMmB,EAAuD,EAAhCJ,EAAuB5E,OAEpDwC,EAAQ6B,gBAAgBY,QAAQC,IAC5B,IAAIC,EAA+BP,EAAuBV,MAAMkB,GAAyBF,EAAeV,SAASzF,KAAKoF,GAAKA,IAAMiB,IAC5HJ,IAAwBG,GACzBD,EAAeV,SAASS,QAAQI,IAC5BjC,EAAgCiC,GAAajC,EAAgCiC,GAAa,CAAE1D,QAASuD,EAAeI,qBAAuB7D,EAA8B,oBAAG8D,UAAWL,EAAeM,YAKlNhD,EAAQ6B,gBAAgBY,QAAQC,IAC5B,IAAIC,EAA+BP,EAAuBV,MAAMkB,GAAyBF,EAAeV,SAASzF,KAAKoF,GAAKA,IAAMiB,IAC3HJ,IAAwBG,IAAiCD,EAAeO,aAC1EP,EAAeV,SAASS,QAAQI,WACrBjC,EAAgCiC,OAKnDpJ,EAAE0C,KAAKkE,EAAoB,SAAUgC,GACjC,IAAIa,GAA4BzJ,EAAE0J,QAAQzI,KAAyBA,EAAoB2H,EAAkBE,YAAYa,KAAKxH,iBAAqE,IAAlDyG,EAAkBE,YAAYP,SAASxE,OACpL6E,EAAkBgB,SAASC,eAAe1C,EAAiCsC,KAInF,SAASjB,EAA2BS,GAChC,IAAIa,EAAkB/J,EAAEgK,MAAM,8CAC9BtD,EAAWuD,QAAQF,EAAiB,CAACb,IAEjCa,EAAgBG,uBAIpBlK,EAAEmK,QAAQ,CAAExE,QAAS,KAEjBmC,EAAmBoB,EAAiBA,EAAeV,SAAW,GAClExI,EAAEoK,KAAK,CACHnF,IAAK/E,EAAKmK,EAAI,mCACd/F,KAAM,MACNgG,KAAM,CACFC,EAAG,gBACHC,OAAQhE,EAAQiE,OAChBC,KAAM5C,EAAiB,KAAO3H,EAAY2H,EAAiB,GAAK,EAChE6C,KAAM7C,EAAiB,KAAO3H,EAAY2H,EAAiB,GAAK,EAChE8C,KAAM9C,EAAiB,KAAO3H,EAAY2H,EAAiB,GAAK,EAChE+C,4BAA4B,EAC5BC,WAAYtE,EAAQuE,kBACpBC,OAAQxE,EAAQyE,iBAChBC,QAAS1E,EAAQ2E,UAAY3E,EAAQ2E,UAAUC,QAAU,QAG5DC,OAAOrL,EAAEsL,WACTC,KAAK,SAAUC,GACZC,CAAAA,IAY+BC,EAZDF,EAgB9BG,GAFJnF,EAAQ1D,mCAAqC4I,EAAQE,WACrDpF,EAAQqF,sCAAwC/E,GAAyB4E,EAAQE,WAC5DjL,EAAMiG,6BAA6BF,EAAY,uBAwMhEoF,GAvMwB,EAAxBH,EAAe3H,QACf2H,EAAeI,OAAOvF,EAAQ1D,oCAGlC0D,EAAQwF,UAAYN,EAAQO,UAC5BvF,EAAW4D,KAAK,YAAa9D,EAAQwF,WAErCxF,EAAQ0F,OAASR,EAAQS,OACzBxL,EAAMiG,6BAA6BF,EAAY,sBAAsBV,KAAKQ,EAAQ0F,QAElF1F,EAAQ4F,MAAQV,EAAQW,UACxB1L,EAAMiG,6BAA6BF,EAAY,qBAAqBV,KAAKQ,EAAQ4F,OAE7E9K,GACAA,EAAiBgL,yBAAyB9F,EAAQwF,WAGlDN,EAAQa,WACR/F,EAAQgG,UAAY,CAChB/E,GAAIiE,EAAQe,QACZL,MAAOV,EAAQgB,UACfC,YAAajB,EAAQgB,UACrBE,YAAalB,EAAQmB,cACrBC,aAAcpB,EAAQqB,YACtBC,WAAYtB,EAAQa,SACpBU,YAAavB,EAAQwB,WACrBC,aAAczB,EAAQ0B,yBACtBC,cAAe3B,EAAQ4B,2BAIH,GADpBC,EAAa5M,EAAMiG,6BAA6BF,EAAY,0BACjD1C,SACXuJ,EAAWC,KAAK,MAAOhH,EAAQgG,UAAUQ,YACzCO,EAAWC,KAAK,MAAOhH,EAAQgG,UAAUJ,OAEzCmB,EAAWC,KAAK,eAAgBhH,EAAQgG,UAAU/E,IAClD8F,EAAWjD,KAAK,UAAW9D,EAAQgG,UAAU/E,IAEzCjB,EAAQgG,UAAUW,cAAgB3G,EAAQgG,UAAUa,gBACpDE,EAAWC,KAAK,QAAShH,EAAQgG,UAAUW,cAC3CI,EAAWC,KAAK,SAAUhH,EAAQgG,UAAUa,iBAG5C7G,EAAQiH,WAE6B,KADjCC,EAAwBH,EAAWI,QAAQ,mBAAqBnH,EAAQiH,UAAY,OAC9DzJ,SACtB0J,EAAsBF,KAAK,OAAQhH,EAAQgG,UAAUS,aAErDS,EAAsBF,KAAK,eAAgBhH,EAAQgG,UAAUG,aAC7De,EAAsBpD,KAAK,UAAW9D,EAAQgG,UAAUG,aAExDe,EAAsBF,KAAK,aAAchH,EAAQgG,UAAUI,aAC3Dc,EAAsBpD,KAAK,QAAS9D,EAAQgG,UAAUI,aAEtDc,EAAsBE,WAAW,eACjCF,EAAsBG,WAAW,aAMjDrH,EAAQsH,UAAYpC,EAAQqC,UAC5BvH,EAAQwH,WAAatC,EAAQuC,WAEL,GADpBC,EAAavN,EAAMiG,6BAA6BF,EAAY,mBACjD1C,SACXkK,EAAWlI,KAAKQ,EAAQsH,WACxBI,EAAWC,IAAI,QAAS3H,EAAQwH,YAAc,YAG9CxH,EAAQ2E,YACR3E,EAAQ2E,UAAUiD,UAAY1C,EAAQ2C,aAC/B7H,EAAQ2E,UAAUmD,IAGQ,GAD7BC,EAAsB5N,EAAMiG,6BAA6BF,EAAY,4BACjD1C,QACpBuK,EAAoBvI,KAAKQ,EAAQ2E,UAAUiD,YAI/C5H,EAAQgI,mBACRhI,EAAQgI,iBAAiBJ,UAAY1C,EAAQ+C,oBACtCjI,EAAQgI,iBAAiBF,IAGQ,GADpCI,EAA6B/N,EAAMiG,6BAA6BF,EAAY,oCACjD1C,QAC3B0K,EAA2B1I,KAAKQ,EAAQgI,iBAAiBJ,YAI7D5H,EAAQmI,sBACRnI,EAAQmI,oBAAoBP,UAAY1C,EAAQkD,oBACzCpI,EAAQmI,oBAAoBL,IAGQ,GADvCO,EAAgClO,EAAMiG,6BAA6BF,EAAY,uCACjD1C,QAC9B6K,EAA8B7I,KAAKQ,EAAQmI,oBAAoBP,YAInE5H,EAAQsI,cACRtI,EAAQsI,YAAYV,UAAY1C,EAAQqD,qBACjCvI,EAAQsI,YAAYR,IAGQ,GAD/BU,EAAwBrO,EAAMiG,6BAA6BF,EAAY,8BACjD1C,SAClBiL,EAAuBtO,EAAMiG,6BAA6BF,EAAY,gDAAgDwI,IAAIF,GAC1HtD,EAAQyD,aACRH,EAAsBhJ,KAAKQ,EAAQsI,YAAYV,WAC/Ca,EAAqBG,QAErBH,EAAqBI,SAK7B7I,EAAQ8I,gBACR9I,EAAQ8I,cAAclB,UAAY1C,EAAQ6D,gBACnC/I,EAAQ8I,cAAchB,IAGQ,GADjCkB,EAA0B7O,EAAMiG,6BAA6BF,EAAY,gCACjD1C,SACpByL,EAAyB9O,EAAMiG,6BAA6BF,EAAY,oDAAoDwI,IAAIM,GAEhI9D,EAAQyD,aAAe3I,EAAQ8I,cAAclB,WAC7CoB,EAAwBxJ,KAAKQ,EAAQ8I,cAAclB,WAEnDqB,EAAuBL,QAEvBK,EAAuBJ,SAK/B7I,EAAQkJ,kBACRlJ,EAAQkJ,gBAAgBtB,UAAY1C,EAAQiE,uBACrCnJ,EAAQkJ,gBAAgBpB,IAGQ,GADnCsB,EAA4BjP,EAAMiG,6BAA6BF,EAAY,kCACjD1C,SACtB6L,EAA2BlP,EAAMiG,6BAA6BF,EAAY,wDAAwDwI,IAAIU,GAEtIlE,EAAQyD,aAAe3I,EAAQkJ,gBAAgBtB,WAC/CwB,EAA0B5J,KAAK,IAAMQ,EAAQkJ,gBAAgBtB,UAAY,KAEzEyB,EAAyBT,QAEzBS,EAAyBR,SAKjC7I,EAAQsJ,iBACRtJ,EAAQsJ,eAAe1B,UAAY1C,EAAQqE,sBACpCvJ,EAAQsJ,eAAexB,IAGQ,GADlC0B,EAA2BrP,EAAMiG,6BAA6BF,EAAY,iCACjD1C,SACrBiM,EAA0BtP,EAAMiG,6BAA6BF,EAAY,sDAAsDwI,IAAIc,GAEnItE,EAAQyD,aAAe3I,EAAQsJ,eAAe1B,WAC9C4B,EAAyBhK,KAAKQ,EAAQsJ,eAAe1B,WAErD6B,EAAwBb,QAExBa,EAAwBZ,SAKhC7I,EAAQ0J,kBACR1J,EAAQ0J,gBAAgB9B,UAAY1C,EAAQyE,uBACrC3J,EAAQ0J,gBAAgB5B,IAGQ,GADnC8B,EAA4BzP,EAAMiG,6BAA6BF,EAAY,kCACjD1C,QAC1BoM,EAA0BpK,KAAKQ,EAAQ0J,gBAAgB9B,YAI3D5H,EAAQ6J,cACR7J,EAAQ6J,YAAYjC,UAAY1C,EAAQ4E,mBACjC9J,EAAQ6J,YAAY/B,IAGQ,GAD/BiC,EAAwB5P,EAAMiG,6BAA6BF,EAAY,+BACjD1C,QACtBuM,EAAsBvK,KAAKQ,EAAQ6J,YAAYjC,YAInD5H,EAAQgK,uBACRhK,EAAQgK,qBAAqBpC,UAAY1C,EAAQ+E,4BAC1CjK,EAAQgK,qBAAqBlC,IAGQ,GADxCoC,EAAiC/P,EAAMiG,6BAA6BF,EAAY,0CACjD1C,QAC/B0M,EAA+B1K,KAAKQ,EAAQgK,qBAAqBpC,YAItCzN,EAAMiG,6BAA6BF,EAAY,sCACxC,EAAtCoF,EAA6B9H,SACzB0H,EAAQiF,uBACR7E,EAA6B8E,QAAQC,KAAKnF,EAAQiF,wBAAwBvB,OAE1EtD,EAA6B8E,QAAQvB,QAI7C5I,EAAsBqK,oBAGtB,MAAMC,EAA2BpQ,EAAMiG,6BAA6BF,EAAY,eAAesK,IAAI,GAEnG,GAAID,EAA0B,CAC1B,MAAME,EAAoBF,EAAyBG,WAAWC,cAAc,uBACtEC,EAAqBzQ,EAAMiG,6BAA6BF,EAAY,uBAEtEuK,GACgC,IAA5BvF,EAAQ2F,iBACRN,EAAyBO,SAAU,EACnCL,EAAkBM,OAAO7F,EAAQO,WACjCmF,EAAmBjD,IAAI,QAASzC,EAAQuC,YACxCmD,EAAmBhC,SAEnB2B,EAAyBO,SAAU,EACnCF,EAAmB/B,QAGvBpJ,QAAQuL,KAAK,+CAGjBvL,QAAQuL,KAAK,mDAtPc,IAAvBlM,IA2PYkG,EA1PGA,EA2PnBtL,EAAKuR,cAA+C,IAA5BvR,EAAKuR,QAAiB,YAC1CC,EAAW9P,SAAS+P,KAAKC,MAAM,IAAK,GACpCC,EAAYrG,EAAsBI,WAAa5L,EAAE8R,uBAAuBJ,EAAS,GAAI,QAAU1R,EAAE+R,oBAAoBL,EAAS,GAAI,OAAQlG,EAAsBS,YACpK4F,EAAgC,IAApBH,EAAS1N,OAAe6N,EAAYA,EAAY,IAAMH,EAAS,MAEzD9P,SAAS+P,OACvB3K,EAAcE,oBAAsBgC,EACpChJ,EAAKuR,QAAQO,UAAUhL,EAAe,KAAM6K,MA/PhDzR,EAAO2F,QAAQ,0CAA2CyF,KAE7DyG,KAAK,SAAUC,GACZrR,EAAIqF,MAAMgM,MAkQtB,SAASC,EAAgC3J,GACrCvI,EAAE0C,KAAKkE,EAAoB,SAAUsB,GACjC,IAAIiK,EAA4BnS,EAAE8C,KAAKoF,EAAEY,YAAYP,SAAU,SAAUF,GAAK,OAAsC,IAA/BrI,EAAEsI,QAAQC,EAAUF,EAAEb,MACvG2K,GAA4D,EAA/BA,EAA0B3K,IACvDU,EAAEN,cAAgBuK,EAA0B3K,GAC5CU,EAAE0B,SAASwI,YAAYD,EAA0B3K,KAEjD5G,EAAIqF,MAAM,iBAAmBiC,EAAEY,YAAYa,KAAO,8HAK9D,SAAS0I,EAAmBC,GACpBC,EAAQD,EAAIE,cAAcD,MAC1BA,GAASA,EAAMvL,YAAcT,EAAQxD,WAErCmE,GAA8B,GAD9BH,EAAgBwL,GAGNtL,oBACNiL,EAAgCK,EAAMtL,oBAAoBsB,UAE1DvI,EAAE0C,KAAKkE,EAAoB,SAAUsB,GACjCA,EAAEN,cAAgB,EAClBM,EAAE0B,SAASwI,YAAY,KAI/BlL,GAA8B,EAC9BsB,EAA2BzB,EAAcE,qBACzCwB,KAgBR,SAASgK,EAAqBC,EAAiBC,GAC3C,IATqCD,EASjCA,GAAmBC,IATcD,EAUuBA,GAApD9J,EATc5I,EAAE8C,KAAK8D,EAAoB,SAAUgM,GACvD,OAAOlS,EAAMmS,sBAAsBD,EAAW9J,YAAYa,KAAM+I,OAU5D9J,EAAkBgB,SAASkJ,kBAAkBH,IAKzD,MAAO,CACH3R,KAAM,WACF0F,EAA0BhE,KAAK,WAC3B,IAKQ6E,EAEAuB,EAPJiK,EAAYhT,EAAEuG,MAEd0M,EAAkBD,EAAU1I,KAAK,gBAAkB,GACnD4I,EAAchT,EAAKiT,oBAAsBjT,EAAKiT,oBAAoBF,GAAmB,KAC9D,mBAAhBC,GACH1L,EAAgBwL,EAAU1I,KAAK,kBAE/BvB,EAAc9I,EAAE8C,KAAKyD,EAAQ4M,aAAc,SAAUjL,GAAK,OAAOA,EAAEV,KAAOD,OAEtE6L,EAAkB,IAAIH,EAAYF,EAAWjK,EAAatD,EAAUe,GASxEK,EARU,KAAOW,GACO,CACpBuB,YAAaA,EACblB,cAAe,EACfgC,SAAUwJ,EACVC,MAAON,KAMfnS,EAAIqF,MAAM,kCAAoC+M,KAItDtM,EAA0B1C,GAAG,0BAA2B,SAAUsO,EAAKjL,EAAoBC,GAClFJ,IACDE,EAA2BC,EAAoBC,GAGP,EAApCtH,EAAEsT,KAAK1M,GAAoB7C,QAC3B0E,OAKZA,IAEA,IAAI8K,EAAwBvT,EAAE8C,KAAKyD,EAAQ6B,gBAAiB,SAAUF,GAAK,OAAOA,EAAE6D,YAAcxF,EAAQwF,YACtGwH,GACAxM,EAAcE,oBAAsBsM,EAEpCzM,GAAuC,EAEvCoL,EAAgCqB,EAAsBhL,UAItDzB,IAFAD,GAAwB,IAGhB7G,EAAE0J,QAAQzI,IAClBjB,EAAE0C,KAAKzB,EAAqB,SAAUuS,EAAyBC,GAA0BhB,EAAqBgB,EAAwBD,MAG/G,IAAvBnO,IACIpF,EAAKuR,cAAkD,IAA/BvR,EAAKuR,QAAoB,cACjDvR,EAAKuR,QAAQkC,aAAa3M,EAAe,KAAM,MAGnDhH,EAAEE,GAAM+D,GAAG,WAAYqO,KAG/BsB,uBAAwB,WAGpB,OAFoC3T,EAAEmI,OAAOvB,EAAoB,SAAUsB,GAAK,QAA2B,EAAlBA,EAAEN,kBAI/FgM,oBAAqBnB,EACrBoB,WAAYnN,GAmOhB,SAASoN,EAA+BrN,EAAYsN,EAAiBC,GACjE,IA4BIC,EAA2BlU,EAAEgK,MAAM,uCAGnCmK,GAFJzN,EAAWuD,QAAQiK,EAA0B,CAACD,EAAc,iBAE7ChU,EAAEmU,SA/BK,klDA+BqBH,IAEvCI,EAASrU,EAAEmU,GACXG,EAAYD,EAAOtR,KAAK,eACxBwR,EAAgBF,EAAOtR,KAAK,6BAC5ByR,EAAeH,EAAOtR,KAAK,4BAC3B0R,EAAwBJ,EAAOtR,KAAK,8BACpC2R,EAAoBL,EAAOtR,KAAK,0BAoBpC,OAlBAuR,EAAUrQ,GAAG,QAAS,SAAUsO,GAC5BA,EAAIoC,iBAGJC,EADuB5U,EAAEuG,SAG7BmO,EAAkBzQ,GAAG,QAAS,SAAUsO,GACpCA,EAAIoC,iBAGJE,EADuBP,EAAUlM,OAAO,aAAa0M,YAAY,aAGjE9U,EAAEkE,SAAS6Q,UAGfrO,EAAWsO,OAAOX,GAClBjU,EAAO2F,QAAQ,kCAAmC,CAAEkP,QAAShB,EAAciB,UAAWxO,IAE/E,CACH2L,YAAa8C,EACbpC,kBAqDJ,SAA4BH,GACxB,CAAA,IACQjS,EACAyU,EAFJxC,IACIjS,EAAQ,IAAIC,GACZwU,EAAoBnV,EAAE8C,KAAKiR,EAAgBxL,SAAU,SAAU6M,GAC/D,OAAO1U,EAAMmS,sBAAsBuC,EAAezL,KAAMgJ,OAIxDuC,EAAiBC,EAAkB3N,OA5D3C6N,YAiGJ,WAEI,OADgBhB,EAAUlM,OAAO,aAChBkC,KAAK,cAAgB,GAjGtCR,eAAgB,SAAUyL,EAAqB7L,GAC3C,IAAI8L,EAEJlB,EAAU3R,KAAK,WACX,IAAI8S,EAAQzV,EAAEuG,MACVmP,EAAeD,EAAM1S,KAAK,wBAC1BsG,EAAYoM,EAAMnL,KAAK,aAEvBjB,GAAa,KAIXsM,EAAqBJ,EAAoBlM,KAG3CoM,EAAMG,SAAS,YAEXD,EAAmBpM,UACnBkM,EAAMjI,KAAK,WAAY,YAG3BkI,EAAa7E,KAAK8E,EAAmBhQ,SACrC+P,EAAa/H,QAAQ,kCAAkCyB,SAEvDqG,EAAMX,YAAY,YAClBW,EAAM7H,WAAW,YAEjB8H,EAAa7E,KAAK,IAClB6E,EAAa/H,QAAQ,kCAAkC0B,OAEvDmG,OAA+D,IAA9B,EAA4CC,EAAQ,SAKzFD,GAA2B9L,GAC3BmL,EAAaW,KAKzB,SAASL,EAAiB9L,GAClBwM,EAAmBvB,EAAUlM,OAAO,oBAAsBiB,EAAY,MAC3CwM,EAAiBC,SAAS,aAEI,IAA5BD,EAAiB7R,QAC9C6Q,EAAagB,GAiBrB,SAASjB,EAAYiB,GACjB,IAAIE,EAA2BF,EAAiBC,SAAS,YAEzDxB,EAAUQ,YAAY,YACtBP,EAAc3G,WAAW,SACzB4G,EAAa5D,QAERmF,IACDF,EAAiBD,SAAS,YAC1BrB,EAAc/G,KAAK,QAASqI,EAAiB9S,KAAK,qBAAqByK,KAAK,UAC5EgH,EAAaQ,OAAOa,EAAiB9S,KAAK,oBAAoBiD,SAItE,SAAS6O,EAAagB,GAClB,IAAIE,EAA2BF,EAAiBC,SAAS,YAGrDE,GAFJvB,EAAsB7G,WAAW,SAASyB,OAEhB,MAUtB4G,GATCF,GAEyB,GAD1BC,EAAsBH,EAAiBvL,KAAK,eAC0D,SAAvEuL,EAAiB9S,KAAK,qBAAqBoL,IAAI,qBAC1EsG,EAAsBjH,KAAK,QAASqI,EAAiB9S,KAAK,qBAAqByK,KAAK,UAAU4B,OAItGwF,EAAYiB,GAegB,KAHxBK,EAAY5B,EAAUlM,OAAO,cAGhBpE,QAAgBkS,EAAUC,GAAG,oBAZ9CzP,EAAWuD,QAAQ,0BAA2B,CAAC+J,EAAiBgC,GAAuB,EAAGC,KAgBlG,SAASG,EAAuB1P,EAAYsN,EAAiBC,EAAcoC,GACvE,IAAInC,EAA2BlU,EAAEgK,MAAM,uCAGnCmK,GAFJzN,EAAWuD,QAAQiK,EAA0B,CAACD,EAAc,iBAE7ChU,EAAEmU,SAASiC,EAAiBpC,IAEvCI,EAASrU,EAAEmU,GACXG,EAAYD,EAAOtR,KAAK,eAY5B,OAVAuR,EAAUrQ,GAAG,QAAS,SAAUsO,GAC5BA,EAAIoC,iBAGJE,EADuB7U,EAAEuG,SAI7BG,EAAWsO,OAAOX,GAClBjU,EAAO2F,QAAQ,kCAAmC,CAAEkP,QAAShB,EAAciB,UAAWxO,IAE/E,CACH2L,YAAa8C,EACbpC,kBAsDJ,SAA4BH,GACxB,CAAA,IACQjS,EACAyU,EAFJxC,IACIjS,EAAQ,IAAIC,GACZwU,EAAoBnV,EAAE8C,KAAKiR,EAAgBxL,SAAU,SAAU6M,GAC/D,OAAO1U,EAAMmS,sBAAsBuC,EAAezL,KAAMgJ,OAIxDuC,EAAiBC,EAAkB3N,OA7D3C6N,YAiFJ,WAEI,OADgBhB,EAAUlM,OAAO,aAChBkC,KAAK,cAAgB,GAlFtCR,eAAgB,SAAUyL,EAAqB7L,GAC3C,IAAI8L,EAEJlB,EAAU3R,KAAK,WACX,IAAI8S,EAAQzV,EAAEuG,MACVmP,EAAeD,EAAM1S,KAAK,wBAC1BsG,EAAYoM,EAAMnL,KAAK,aAEvBjB,GAAa,KAIXsM,EAAqBJ,EAAoBlM,KAG3CoM,EAAMG,SAAS,YAEXD,EAAmBpM,UACnBkM,EAAMjI,KAAK,WAAY,YAG3BkI,EAAa7E,KAAK8E,EAAmBhQ,SACrC+P,EAAa/H,QAAQ,kCAAkCyB,OACvDqG,EAAMjI,KAAK,QAASmI,EAAmBhQ,WAEvC8P,EAAMX,YAAY,YAClBW,EAAM7H,WAAW,YAEjB8H,EAAa7E,KAAK,IAClB6E,EAAa/H,QAAQ,kCAAkC0B,OACvDoG,EAAM7H,WAAW,SAEjB4H,OAA+D,IAA9B,EAA4CC,EAAQ,SAKzFD,GAA2B9L,GAC3BmL,EAAaW,KAKzB,SAASL,EAAiB9L,GAClBwM,EAAmBvB,EAAUlM,OAAO,oBAAsBiB,EAAY,MAC3CwM,EAAiBC,SAAS,aAEI,IAA5BD,EAAiB7R,QAC9C6Q,EAAagB,GAiBrB,SAAShB,EAAagB,GAClB,IAAIE,EAA2BF,EAAiBC,SAAS,YAIrDE,GAFJ1B,EAAUQ,YAAY,YAEI,MAMtBmB,GALCF,IACDF,EAAiBD,SAAS,YAC1BI,EAAsBH,EAAiBvL,KAAK,cAgBpB,KAHxB4L,EAAY5B,EAAUlM,OAAO,cAGhBpE,QAAgBkS,EAAUC,GAAG,oBAZ9CzP,EAAWuD,QAAQ,0BAA2B,CAAC+J,EAAiBgC,GAAuB,EAAGC,KAgBlG,SAASK,EAAc5P,EAAY8B,GAC/B,IAAI+N,EAAsBvW,EAAEgK,MAAM,0BAGlC,GAFAtD,EAAWuD,QAAQsM,EAAqB,CAAC/N,IAErC+N,EAAoBrM,qBACpB,OAAOqM,EAAoB7U,OAG/B,IAAI8U,EAAU,CAAC,MAAO,MAAO,WAAY,KAAM,UAAW,IAAK,QAAS,IAAK,SAAU,IAAK,QAAS,KAAM,UAAW,MAAO,MAAO,WAAY,OAAQ,MAAO,YAAa,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,QAClNC,EAAwB,QAE5B,OAAOxW,EAAEyW,OAAOlO,EAAU,SAAUyM,GAC5B0B,GAAmD,mBAA5B1B,EAAQrL,KAAc,UAAmBqL,EAAQrL,KAAKgN,YAAc3B,EAAQrL,MAAMtH,QAAQ,SAAU,IAAIF,cAEnI,GAAIpC,EAAE6W,UAAUF,GACZ,OAAOG,WAAWH,GAGtB,IAAII,EAAiB9W,EAAEsI,QAAQiO,EAASG,GACxC,IAAwB,IAApBI,EACA,OAAOA,EAGPC,EAAUL,EAAY3U,MAAMyU,GAChC,OAAIO,GAAWA,EAAQhT,QAAUhE,EAAE6W,UAAUG,EAAQ,IAC1CF,WAAWE,EAAQ,IAGvB7W,IAMnB,SAASmD,EAAcnC,EAAOV,EAAOI,EAAKT,EAAQW,EAAsBJ,GACpE,IAAIsW,EAAS/W,EAAKgX,aACdC,EAAoB,GACpBC,EAAsC,GAE1C,SAASC,EAAWC,EAAoBC,GACpCpW,EAAMyU,SAAS,UACf5V,EAAEwX,KAAKP,EAAOQ,UAAUH,IACnBjM,OAAO,WAAclK,EAAM2T,YAAY,YACvCvJ,KAAK,SAAUmM,GACZtX,EAAO2F,QAAQ,yCACfwR,EAAS3B,SAAS,aAClB+B,WAAW,WACPJ,EAASzC,YAAY,cACtB,KAEuC,OAAtC4C,EAAaE,OAAOxV,cAChBsV,EAAahW,OAAOmW,OAASH,EAAahW,OAAOmW,MAAM7T,OACvD/D,EAAE0C,KAAK+U,EAAahW,OAAOmW,MAAO,SAAUC,GACxC,IAAIC,EAAaD,EAAWF,OAAOxV,cAE/B4V,EAAgB,CA8N5C,SAA0ChM,GACtC,IAAI7G,EAAe,MAEnB6G,EAAYiM,SAASjM,MAKb7G,EAFA1E,EAAMuL,YAAcA,EAELvL,EAGAA,EAAM0C,mBAAmBJ,KAAK,SAAUK,GAAqB,OAAOA,EAAkB4I,YAAcA,KAI3H,OAAO7G,EA9OgC+S,CAAiCJ,EAAWK,WAC7B/L,MAAO0L,EAAWnS,SAASyS,KAAK,OAClE,OAAQL,GACJ,IAAK,QACDlX,EAAIqF,MAAM8R,GACV,MACJ,IAAK,UACDnX,EAAIwF,QAAQ2R,MAKxBK,EAAuBX,GAGC,EAAxBjX,EAAM6X,kBACNpY,EAAK0B,SAAS+P,KAAOlR,EAAM8X,WAItCtG,KAAKoG,GAGd,SAASA,EAAuBG,GAIxBC,EADuB,iBAAhBD,EACWA,GAEAA,EAAY9W,QAAU8W,EAAY9W,OAAOmW,MAAM,GAAKW,EAAY9W,OAAOmW,MAAM,GAAaW,GAAV7S,QAGtG9E,EAAIqF,MAAMuS,GA+Ed,SAASC,EAAqBC,GAE1B,IAAIC,EAA6C,MAAzBnY,EAAM4H,gBAA0BrI,EAAE+H,IAAItH,EAAM4H,gBAAiB,SAAU4M,GAAW,OAAOA,EAAQjJ,YAAgB,KACrI6M,EAAqBpY,EAAMuL,UAC3B8M,EAAyBrY,EAAMqC,mCAI/BiW,EAAuB9Y,EAAE+Y,OAAO7B,EAAmB,SAAU8B,EAAMC,EAAWlN,GAK9E,OAAOiN,IAJPjN,EAAYiM,SAASjM,MAEgB6M,GAAsBC,IAAqE,EAA3C7Y,EAAEsI,QAAQqQ,EAAmB5M,GAEhFkN,EAAY,IAC/C,GAECC,EAAyC,EAAvBJ,EAElBK,EAAgBzY,EAAMiG,6BAA6BzF,EAAO,qBAC1DkY,EAAiB1Y,EAAMiG,6BAA6BzF,EAAO,sBAE/DiY,EAAcpT,KAAK+S,GACnBK,EAAcrN,OAAOoN,GAEjBA,EAC4B,EAAxBE,EAAerV,SACfqV,EAAejK,OACXuJ,GACAxX,EAAMmY,OAAO,WAAY,CAAEC,GAAIF,GAAkB,IAAK,WAAcA,EAAeC,OAAO,SAAU,KAAM,QAIlHD,EAAehK,OAIvB,SAASmK,EAAkBC,EAAO/B,GAC1BgC,EA8CiBzZ,EAAE8C,KA9C+B2U,EA8CjBhW,OAAOmW,MAAO,SAAU1P,GACzD,OAAOA,GAAgC,OAA3BA,EAAEyP,OAAOxV,gBAA2B+F,EAAEgQ,YAAc1X,EAAMuL,WAAavL,EAAM0C,oBAA6H,EAAvG1C,EAAM0C,mBAAmBiF,OAAO,SAAUuR,GAAS,OAAOA,EAAM3N,YAAc7D,EAAEgQ,YAAcnU,UA9C7M0V,IACAvC,EAAkBuC,EAAevB,WAAauB,EAAeE,6BAC7DlB,GAAqB,IAI7B,SAASmB,EAAuBJ,EAAO/B,GACnCzX,EAAE0C,KAAK+U,EAAahW,OAAOmW,MAAO,SAAU1P,GACxC,IACQ2R,EADuB,OAA3B3R,EAAEyP,OAAOxV,gBACL0X,EAAmB3R,EAAEgQ,iBAClBhB,EAAkB2C,GAErBC,EAAgDtZ,EAAMqC,oCAAsC7C,EAAE+Z,KAAKvZ,EAAM4H,gBAAiB,SAAU4R,GACpI,OAAOA,EAAYjO,YAAc8N,IAEjCA,IAAqBrZ,EAAMuL,YAAa+N,GACxCrB,OAKhB,SAASwB,EAAkBT,EAAO/B,GACY,OAAtCA,EAAaE,OAAOxV,gBACpB+U,EAAoB,GAEpBuB,KAGR,SAASyB,EAAoBV,EAAO/B,GAChC,IAAI0C,EAAW1C,EAAahW,OAAO2Y,iBAEO,OAAtC3C,EAAaE,OAAOxV,gBACpB+U,EAAoB,GAEhBiD,EAASE,UAAuC,EAA3BF,EAASE,SAAStW,QACvC/D,EAAE0C,KAAKyX,EAASE,SAAU,SAAUnS,GAChCgP,EAAkBhP,EAAEgQ,YAAchB,EAAkBhP,EAAEgQ,YAAc,GAAKhQ,EAAEoS,WAInF7B,KAoDR,SAAS8B,EAAmCtV,EAAmBuV,EAASC,EAAWC,GAC/E,IAzCgC3X,EAyC5BsU,EAAqB,KAErBsD,EAAkB1V,EAAkBoF,KAAK,YACzCnF,GA3CAA,EAAe,MADanC,EA4Cc4X,KAxCtCna,EAAMuC,WAAaA,EAEnBmC,EAAe1E,IAIX0E,GADCA,GAAgB1E,EAAM0C,mBACR1C,EAAM0C,mBAAmBJ,KAAK,SAAUK,GAAqB,OAAOA,EAAkBJ,WAAaA,IAGjHmC,IAAgB1E,EAAMiC,2BACvByC,EAAe1E,EAAMiC,yBAAyBK,KAAK,SAAU8X,GAAoB,OAAOA,EAAiB7X,WAAaA,MAK3HmC,GA2BH2V,EAAyB1D,EAAoCjS,EAAa6G,YAA2E,GAUrJuO,GATCO,EAAuB9W,SACxB/D,EAAE0C,KAAKwC,EAAa4V,aAAc,SAAU5S,GACjB,aAAlBA,EAAE6S,aAAgD,WAAlB7S,EAAE6S,cAA6B7S,EAAE8S,gBAClEH,EAAuBhS,KAAKX,EAAEV,MAGtC2P,EAAoCjS,EAAa6G,WAAa8O,GAGnD,GACXI,EAAW,EAEf,QAAST,GAAW,IAAIrY,eACpB,IAAK,WACD8Y,EAAWva,EAAMwa,wBAAwBjW,EAAkBnC,KAAK,gBAAgBqY,OAChF,MACJ,IAAK,SACDb,EAAWrV,EAAkBnC,KAAK,gBAAgBqY,OAAS,EAC3D,MACJ,IAAK,UACD,IAAIC,EAAclW,EAAakW,aAAe,EAE9Cd,GADiBrV,EAAkBnC,KAAK,wBAAwBqY,OAAS,GACjDC,EACxB,MACJ,IAAK,oBACDd,EAAWpV,EAAamW,gBAAgBhN,IAAMqM,EAC9C,MACJ,QACIJ,EAAW5Z,EAAMwa,wBAAwBjW,EAAkBnC,KAAK,gBAAgBqY,MAAO,GACvFF,EAAWva,EAAMwa,wBAAwBjW,EAAkBnC,KAAK,gBAAgBqY,OAIxF,IAIkCG,EAG1BC,EACIC,EA9P8BX,EACtCC,EAsCIW,EAIIC,EAHRC,EAvB0BC,EAC1BC,EAGAC,EAiOAC,EAAc7W,EAAa6W,YAAc7W,EAAa6W,YAAY1N,IAAMnO,EAExE8b,EAA2Blb,EAAqBoE,EAAanC,UAsCjE,OA7QkB0D,EAwODxB,EAxOa2W,EAwOM1W,EAAaiH,MAvO7C0P,GAAc,EAGdC,EAAYrV,EAAWwV,SAAS,CAAEC,OAAQ,KACxBxb,EAAMiG,6BAA6BF,EAAY,wBACrD/D,KAAK,WACjB,IAAIyZ,EAAiBpc,EAAEuG,MACvBuV,GAAeC,EAAUM,QAAQD,KAGhCN,GACDjb,EAAIwF,QAAQwV,EAAY,MAAQpb,EAAMgF,SAAwB,eAG3DqW,IAGwBG,EAsNsDA,EAtN5BJ,EAsNsD1W,EAAaiH,MAnNxH,MAAO6P,GAIFL,EAF6C,KAD9CF,EAAsBO,EAAyBrI,0BACZ5P,UAInC/D,EAAE0C,KAAK+Y,EAAqB,SAAUvT,EAAGmU,GACjC1S,EAAO,WAAazB,EAAEY,YAAYa,KAAO,YACjC,IAAR0S,EACAX,EAA0B/R,EACnB0S,IAAQZ,EAAoB1X,OAAS,EAC5C2X,GAA4B,IAAMlb,EAAMgF,SAAc,IAAI,IAAMmE,EAEhE+R,GAA4B,KAAO/R,IAI3C/I,EAAIwF,QAAQwV,EAAY,MAAQpb,EAAMgF,SAAuB,aAAI,IAAMkW,IAG3EC,GAAmB,EAGhBA,KAGeI,EAyLiIA,EAzLpHzB,EAyLiIA,EAzLvHsB,EAyLiI1W,EAAaiH,MAvLvLmQ,GAAkB,EAElBP,GAAezB,EAAWyB,IAC1Bnb,EAAIwF,QAAQwV,EAAY,MAAQpb,EAAMgF,SAAwB,cAAI,IAAMuW,GACxEO,GAAkB,GAGfA,KAiLCf,EAAoB,KAAMD,GAA4B,EAEtDpW,EAAazC,2BACb8Y,EAAoB,GAChBC,EAA8B9a,EAAMiG,6BAA6B1B,EAAmB,+BACxFjF,EAAE0C,KAAKwC,EAAazC,yBAA0B,SAAUE,GAEhD4Z,EAAqBhC,EADQiB,EAA4B1Y,KAAK,wCAA0CH,EAAiBI,SAAW,MAChD,oBAAqBmC,EAAanC,SAAUuX,GAChIiC,EACAhB,EAAoBA,EAAkBiB,OAAOD,GAE7CjB,GAA4B,KAKnCA,IAWDjE,EAAqB,CAVjBoF,EAAoB,CACpB1Q,UAAW7G,EAAa6G,UACxBuO,SAAUA,EACVW,SAAUA,EACVH,cA/Q8BD,EA+Q4BA,EA9QlEC,EAAe,GACQpa,EAAMiG,6BA6QkB1B,EA7QuB,oBAErDvC,KAAK,WACtB,IAAIga,EAAsB3c,EAAEuG,MACxBqW,EAAgBD,EAAoBrS,KAAK,iBACzCuS,EAAmBF,EAAoBxG,GAAG,aAAewG,EAAoBxG,GAAG,YAAY2G,WAAaH,EAAoBvB,OAEvE,IAAtDnb,EAAEsI,QAAQuS,EAAwB8B,SAAqD,IAArBC,IAClE9B,EAAa6B,GAAiBC,KAI/B9B,GAkQKzC,gBAAiBnT,EAAamT,gBAC9ByE,QAAS5X,EAAaqH,UAAYrH,EAAaqH,UAAU/E,GAAKtH,EAC9D6c,4BAA6BtC,IAK7Bc,IACAkB,EAAkBO,iBAAmB9X,EAAanC,SAClDsU,EAAqBA,EAAmBmF,OAAOjB,MAKpDlE,EAGX,SAAS4F,EAAiCC,GACtCnd,EAAEwX,KAMF,WACI,MAAM4F,EAAWpd,EAAEqd,WAgDnB,OA9CArd,EAAEwX,KAAKP,EAAOqG,kBAAkB,MAAM,IAAOC,KAAK,SAAUC,GACN,OAA9CA,EAAqB5F,OAAOxV,cAC8C,EAA3Cob,EAAqB9b,OAAOmW,MAAM7T,QAEvDyZ,EAAaxd,EAAEmU,SAAS3T,EAAMgF,SAASiY,+BAAgC,CAAEC,aAAcH,EAAqB9b,OAAOmW,MAAM7T,OAAQuU,QAAS9X,EAAM8X,UACtJvY,EAAEyd,GAAYG,OAAO,CACjBC,WAAW,EACXC,WAAW,EACXC,OAAO,EACPC,UAAU,EACVC,MAAO,IACPC,eAAe,EACf9R,MAAO3L,EAAMgF,SAAS0Y,wBACtBC,QAAS,CACL,CACIC,MAAS,kBACTrY,KAAMvF,EAAMgF,SAAS6Y,sBACrBC,MAAO,WACHve,EAAEuG,MAAMqX,OAAO,SAEf5d,EAAEwX,KAAKP,EAAOuH,aAAajB,KAAK,WAC5BkB,KACDrB,EAASsB,WAIxBva,KAAM,SAAUwa,EAAOC,GACnB5e,EAAE,4BAA6B4e,EAAGhB,OAASgB,GAAIL,MAAM,WACjDnB,EAASyB,SAAQ,KAGrB7e,EAAE,sBAAuB4e,EAAGhB,OAASgB,GAAIL,MAAM,SAAUhM,GACrDA,EAAIoC,iBAEJ8J,UAKZA,IAGJrB,EAASsB,OAAOhH,eAErB0F,EAASsB,QAELtB,EAAS0B,UAEhB,SAASL,IACL,IACI/B,EAAoBlC,EADA7Z,EAAMoe,wBAAwB5B,IAGtDnd,EAAEwX,KAAKP,EAAOQ,UAAUiF,EAAmB,MAAM,IAAOa,KAAK,SAAUyB,GACtB,OAAzCA,EAAgBpH,OAAOxV,cACvBgb,EAASyB,SAAQ,GAEjBzB,EAASsB,OAAOM,IAErB5B,EAASsB,SAnEbO,IAA2B1B,KAAK,SAAU2B,GACzCA,GACA/B,EAA0BgC,eAAc,IAE7C9G,GAoEP,MAAO,CACHpX,KAAM,WACFgW,EAAOmI,UAAU,qCAAsC5F,GACvDvC,EAAOmI,UAAU,0CAA2CvF,GAC5D5C,EAAOmI,UAAU,qCAAsClF,GACvDjD,EAAOmI,UAAU,+CAAgDjF,GAEjEna,EAAEwX,KAAKP,EAAOoI,uBAEYte,EAAqBN,EAAMuC,WAEjD5C,EAAOgf,UAAU,0CAA2C,WAAc1G,MAG9EvX,EAAM4B,KAAK,oDAAoDkB,GAAG,QAAS,SAAUsO,GACjFA,EAAIoC,iBAEJ,IAAI2K,EAAatf,EAAEuG,MAKfmW,EAAoBlC,EAHA7Z,EAAMoe,wBAAwBxY,MACxC+Y,EAAWhV,KAAK,aAG1BoS,GACArF,EAAWqF,EAAmB4C,KAItCne,EAAM4B,KAAK,wBAAwBkB,GAAG,QAAS,SAAUsO,GACrDA,EAAIoC,iBAGJ,IAAI2C,EAAqB,GACrBiI,GAAuB,EAC3Bpe,EAAM4B,KAAK,gBAAgBJ,KAAK,WAC5B,IAAI6c,EAAYxf,EAAEuG,MAIH,EAHA5F,EAAMwa,wBAAwBqE,EAAUpE,UAM/CqE,EADQjF,EADS7Z,EAAMoe,wBAAwBS,KAG/ClI,EAAqBA,EAAmBmF,OAAOgD,GAE/CF,GAAuB,KAK/BjI,EAAmBtT,OACfub,GACAlI,EAAWC,EAAoBtX,EAAEuG,OAE9BgZ,GACP1e,EAAIwF,QAAQ5F,EAAMgF,SAAuB,gBAIjDtE,EAAM4B,KAAK,2BAA2BkB,GAAG,QAAS,WAC9C,IAAIyb,EACY1f,EAAEuG,MAAM+D,KAAK,UADzBoV,EAEe1f,EAAEuG,MAAM+D,KAAK,UAG5BqV,EAAiB3f,EAAE,IAAM0f,GACzBnF,EAAW5Z,EAAMwa,wBAAwBwE,EAAevE,OAE5D,OAAQsE,GACJ,IAAK,WACDnF,IAAaA,EACb,MACJ,IAAK,WACDA,IAAaA,EAIjBA,EAAW,EACXoF,EAAevE,IAAI,IAEnBb,EAAWqF,KAAKC,MAAiB,GAAXtF,GAAiB,GACvCoF,EAAevE,IAAIb,IAEvBoF,EAAe1V,QAAQ,YAG3B9I,EAAM4B,KAAK,qBAAqBkB,GAAG,gBAAiB,SAAUsO,GAC1DA,EAAIoC,iBAEJuI,EAAiC3K,EAAIzN,YAOrD,SAASvB,EAAepC,EAAOV,GAC3B,IAAIqf,EAAkB5f,EAAKmK,EAAI,mDAC3BI,EAAShK,EAAMgK,OA0BnB,MAAO,CACHxJ,KAAM,WAxBNjB,EAAEgR,IAAI8O,EAAiB,CAAEC,QAAS,CAACtV,GAASuV,YAAa,KACpDzU,KAAK,SAAUjB,GACZ,IAGQ2V,EAHHhgB,EAAE0J,QAAQW,KACP4V,EAAQ5V,EAAKG,GAEbwV,EAAe9e,EAAM4B,KAAK,oBAC9B9C,EAAE0C,KAAKud,EAAO,SAAUC,GACRngB,EAAE,WACV,CACIqe,MAAS,aAAe8B,EAAYC,OACpCpa,KAAMma,EAAYE,KAClB/V,KAAM6V,IAGRG,SAASL,GAPf,IASIM,EAAqBJ,EAAYE,KAAK/d,QAAQ,OAAQ,KAAKF,cAC/DpC,EAAE,oBAAoB4V,SAAS2K,EAAqB,SAAWJ,EAAYC,OAAS,IAAMG,UAclH,SAAS/c,EAAgBrC,EAAOV,EAAOL,GACnC,IAAIqK,EAAShK,EAAMgK,OAwBnB,SAAS+V,IACL,IACIC,EAAc,CAAEC,MAMpB,WAMI,IALA,IACIC,EADa,EACQlgB,EAAMmgB,OAE3BF,EAAQ,GAEHG,EAAY,EAAGA,GAAaF,EAAoBE,IACrDH,EAAM5X,KAAK,SAGf,IAAIgY,EAAsBH,EAAqBD,EAAM1c,OAC3B,EAAtB8c,GACAJ,EAAM5X,KAA2B,GAAtBgY,EAA4B,QAAU,QAIrD,IADA,IAAIC,EAda,EAcaL,EAAM1c,OAC3Bgd,EAAY,EAAGA,EAAYD,EAAYC,IAC5CN,EAAM5X,KAAK,SAGf,OAAO4X,EA1BgBO,IAEvBC,EAAcjhB,EAAEmU,SAHC,mMAGwBqM,GAE7Ctf,EAAM4B,KAAK,wBAAwB6N,QAAQoE,OAAOkM,GA0BtD,MAAO,CACHjgB,KAAM,WACFjB,EAAE,WACEwgB,IAEApgB,EAAOgf,UAAU,8BAA+B,SAAU3F,EAAOhP,GACzDA,IAAWhK,EAAMgK,QA3DjCzK,EAAEoK,KAAK,CACHnF,IAAK/E,EAAKmK,EAAI,uDAAyDI,EACvEnG,KAAM,QAELiH,KAAK,SAAU4V,GAEZ1gB,EAAMmgB,OAASO,EAAWP,OAC1BngB,EAAM2gB,cAAgBD,EAAWC,cACjC3gB,EAAM4gB,aAAeF,EAAWE,aAChC5gB,EAAM6gB,oBAAsBH,EAAWG,oBAGvCd,IAEArf,EAAM4B,KAAK,kBAAkBgJ,QAAQtL,EAAM6gB,qBAE3CngB,EAAM4B,KAAK,6BAA6BiD,KAAKmb,EAAWC,eACxDjgB,EAAM4B,KAAK,4BAA4BiD,KAAKmb,EAAWC,mBA+CvDjgB,EAAM4B,KAAK,kBAAkBwb,MAAM,SAAUhM,GACzCA,EAAIoC,iBAEJvU,EAAO2F,QAAQ,uBAAwBtF,EAAMgK,cAQjE,SAAS9G,EAAexC,EAAOV,GAC3B,MAAO,CACHQ,KAAM,WACFE,EAAM4B,KAAK,oBAAoBkB,GAAG,QAAS,SAAUsO,GACjDA,EAAIoC,iBAEAlU,EAAM8gB,WACFC,EAAWthB,EAAKmK,EAAI5J,EAAM8gB,UAAY,WAAa9gB,EAAMgK,OAAS,cAAgBhK,EAAMuL,UAC5F9L,EAAKiE,KAAKqd,EAAU,SAAU,+FAE9Bvb,QAAQC,MAAM,sDAQlC,SAAStC,EAAazC,EAAOV,GACzB,MAAO,CACHQ,KAAM,WACFE,EAAM4B,KAAK,0BAA0BkB,GAAG,QAAS,SAAUsO,GACvDA,EAAIoC,iBAEA8M,EAASvhB,EAAKmK,EAAI,8BAAgC5J,EAAMuL,UAClC,EAAtBvL,EAAMihB,gBACND,GAAU,eAAiBhhB,EAAMihB,eAGrCxhB,EAAKiE,KAAKsd,EAAQ,cAOlC,SAASld,EAAiBpD,EAAOV,GAC7B,IACIkhB,EAAkB,CAClB9X,SAAU,mBAAqBpJ,EAAMgN,UAAY,KACjDmU,MAAM,EACNC,MAAM,GAGV,MAAO,CACH5gB,KAAM,WACiBE,EAAM+C,SAASyd,KAM9C,SAASle,EAAsBtC,EAAOV,EAAOI,EAAKF,EAAOI,GA8BrD,MAAO,CACHE,KAAM,WACFE,EAAM4B,KAAK,gCAAgCwb,MAAM,SAAUhM,GACvDA,EAAIoC,iBAEJ,IA9BA+G,EAIIC,EAHRC,EA6BQ1W,EAAoBvE,EAAMoe,wBAAwBxY,MAClDqU,EAAkB1V,EAAkBoF,KAAK,YACzC2R,EAA2Blb,EAAqB6Z,GAEpD,GAnCJ,OAH2BqB,EAsCOA,IA/B7BL,EAF6C,KAD9CF,EAAsBO,EAAyBrI,0BACZ5P,UAInC/D,EAAE0C,KAAK+Y,EAAqB,SAAUvT,EAAGmU,GACjC1S,EAAO,WAAazB,EAAEY,YAAYa,KAAO,YACjC,IAAR0S,EACAX,EAA0B/R,EACnB0S,IAAQZ,EAAoB1X,OAAS,EAC5C2X,GAA4B,IAAMlb,EAAMgF,SAAc,IAAI,IAAMmE,EAEhE+R,GAA4B,KAAO/R,IAI3C/I,EAAIwF,QAAQ5F,EAAMgF,SAAuB,aAAI,IAAMkW,EAA0B,IAAMlb,EAAMgF,SAA8B,sBAG3HmW,GAAmB,EAGhBA,EAY0D,CACrD,IAEIrB,EAAW,EACXW,EAAW,EAEf,QALclb,EAAEuG,MAAM+D,KAAK,aAKP,IAAIlI,eACpB,IAAK,WACD8Y,EAAWva,EAAMwa,wBAAwBjW,EAAkBnC,KAAK,gBAAgBqY,OAChF,MACJ,IAAK,SACDb,EAAWrV,EAAkBnC,KAAK,gBAAgBqY,OAAS,EAC3D,MACJ,QACIb,EAAW5Z,EAAMwa,wBAAwBjW,EAAkBnC,KAAK,gBAAgBqY,MAAO,GACvFF,EAAWva,EAAMwa,wBAAwBjW,EAAkBnC,KAAK,gBAAgBqY,OAIpF0G,EAA0B,CAC1B,CACI9V,UAAWvL,EAAMuL,UACjB+Q,QAAStc,EAAM+L,UAAU/E,GACzB8S,SAAUA,EACVW,SAAUA,EACVH,aAActa,EAAMsa,eAG5B7a,EAAK6hB,yBAAyBD,MAItC3gB,EAAM4B,KAAK,mDAAmDwb,MAAM,SAAUhM,GAC1EA,EAAIoC,iBAEJ,IAAIqN,EAAsBhiB,EAAEuG,MAAM+D,KAAK,yBACnC2X,EAAyBxhB,EAAM0C,mBAAmBiF,OAAO,SAAUuR,GACnE,OAAOA,EAAM3N,YAAcgW,IAC5B,GAECzH,EAAW5Z,EAAMwa,wBAAwBha,EAAM4B,KAAK,+DAAiEif,EAAsB,MAAM5G,MAAO,GACxJF,EAAWva,EAAMwa,wBAAwBha,EAAM4B,KAAK,+DAAiEif,EAAsB,MAAM5G,OAEjJ0G,EAA0B,CAC1B,CACI9V,UAAWiW,EAAuBjW,UAClC+Q,QAASkF,EAAuBzV,UAAU/E,GAC1C8S,SAAUA,EACVW,SAAUA,IAGlBhb,EAAK6hB,yBAAyBD,KAGlC3gB,EAAM4B,KAAK,4BAA4Bwb,MAAM,SAAUhM,GACnDA,EAAIoC,iBACJ,IAAIuN,EAAmBliB,EAAEuG,MAErB4b,EAAwBD,EAAiBpM,SAAS,uBAElDrV,EAAM2hB,kBAENliB,EAAKmiB,eAAe5hB,EAAMuL,UAAWmW,EAAwB,MAAQ,SAGzE,SAA0BzK,GACoB,OAAtCA,EAAaE,OAAOxV,cACpBnC,EAAE0C,KAAK+U,EAAahW,OAAOmW,MACvB,SAAUyK,GAC4B,OAA9BA,EAAK1K,OAAOxV,eACZvB,EAAIuF,QAAQ3F,EAAMgF,SAA0B,iBAE5Cyc,EAAiBK,YAAY,uBAAwBJ,GACrDD,EAAiBK,YAAY,yBACzBJ,IAEJthB,EAAIqF,MAAMoc,EAAK3c,WAI3B9E,EAAIqF,MAAMwR,EAAa/R,eAS/C,SAAStE,EAA2BF,EAAOV,GACvC,IAAI+hB,EAA8BrhB,EAAM4B,KAAK,0BACzC0f,EAAyBthB,EAAM4B,KAAK,+BA6BxC,MAAO,CACHN,wBAAyB,SAAUqF,GACU,EAArC0a,EAA4Bxe,SA7BP8D,EA8BGA,EA7BhC9H,EAAEoK,KAAK,CACHnF,IAAK/E,EAAKmK,EAAI,kCACd/F,KAAM,MACNgG,KAAM,CACFC,EAAG,uBACHE,OAAQhK,EAAMgK,OACdiY,KAAM5a,IAAqB3H,GAAa2H,EAAiB,KAAO3H,EAAY2H,EAAiB,GAAK,EAClG6a,KAAM7a,IAAqB3H,GAAa2H,EAAiB,KAAO3H,EAAY2H,EAAiB,GAAK,EAClG8a,KAAM9a,IAAqB3H,GAAa2H,EAAiB,KAAO3H,EAAY2H,EAAiB,GAAK,EAClG+a,UAAgD,UAArCpiB,EAAMqiB,2BACjBC,OAAQ,UAGXxX,KAAK,SAAU7J,GACRA,GAA0B,EAAhBA,EAAOsC,QACjBwe,EAA4BpT,OAC5BqT,EAAuB5R,KAAKnP,IAE5B8gB,EAA4BnT,SAGnC4C,KAAK,WACFuQ,EAA4BnT,YAkC5C,SAAS9N,IAqBL,MAAO,CACHiD,mBAAoB,SAAUjE,EAAgBE,GArBlD,IACQuiB,EAGAC,EAkBA/iB,EAAKoM,yBAAyB7L,EAAMuL,WAtBLzL,EAwBDA,EAxBiBE,EAwBDA,EAvB9CuiB,EAAkBhjB,EAAEkjB,KAAKziB,EAAM2L,OAAS+W,SAAS/W,OAKpB,GAF7B6W,GAAsBG,EADS7iB,EAAewC,KAAK,gCACAA,KAAK,2BAEpCiB,SAChBqf,EAAWL,EAAkB,OAASI,EAA6B9Y,KAAK,aAAe7J,EAAMgF,SAAgC,uBAC7H6d,EAAgCL,EAAoBlb,IAAI,WACxD,IAAIwb,EAAQvjB,EAAEuG,MAId,MAAO,CAAEyF,UAHOuX,EAAMjZ,KAAK,aAGIkZ,OAFlBD,EAAMxgB,KAAK,uBAGzBiO,MAEH9Q,EAAKujB,sBAAsBvjB,EAAKwjB,gBAAgBC,gBAAiBN,EAAUC,KAU/EhX,yBAA0B,SAAUN,GAChC9L,EAAKoM,yBAAyBN,KAK1C,SAAStH,EAA+BnE,EAAgBE,EAAOM,EAAsB0F,EAAuBrG,GACxG,IAAIwjB,EAEAC,EAAoB,GAYxB,SAASC,EAAoBnR,EAAiBC,GAC1C,IAMYmR,EANRpR,GAAmBC,IACnBD,EAAkBA,EAAgBvQ,cAClCwQ,EAAmBA,EAAiBxQ,eAEhC4hB,EAAUJ,EAAgBjR,GAAmBiR,EAAgBjR,GAAiBC,GAAoB,QAE9FmR,GAAwB,EAE5B9jB,EAAE0C,KAAKqhB,EAAS,SAAUC,GACtB,IAiHqBxZ,EAjGLyZ,EAhBZlY,EAAYiY,EAAY9L,UAMxB/U,GALc,OAAd4I,IAgHiBvB,EA9GuBwZ,EAAYE,OAApDnY,GA+GZoY,EAAgBnkB,EAAE8C,KAAKtC,EAAM0C,mBAAoB,SAAUkhB,GAAkB,OAAQA,EAAe5iB,uBAAyB4iB,EAAe5Z,SAAWA,KAEpI2Z,EAAcpY,UAAY,MA9GbsY,EAAsBL,EAAYM,WAAYvY,KAClE5I,IACIJ,EAAWI,EAAkBJ,iBAEmB,IAApCihB,EAA8B,qBACtC1jB,EAAewC,KAAK,mBAAqBC,EAAW,mBAAmBoY,IAAI6I,EAAYO,oBACvFT,GAAwB,QAGU,IAA1BE,EAAoB,WACxBC,EAAenjB,EAAqBiC,KAEpC/C,EAAE0C,KAAKshB,EAAYzb,SAAU,SAAUic,EAAc1b,GAAemb,EAAarQ,oBAAoB9K,EAAa0b,QAOlIV,GACAtd,EAAsBqK,sBAMtC,SAAS4T,EAAwCle,GAC7C,IAAIme,EAAY,GAEZzb,EAAiBjJ,EAAE8C,KAAKyD,EAAQ6B,gBAAiB,SAAUF,GAAK,OAAOA,EAAE6D,YAAcxF,EAAQwF,YAUnG,OATI9C,GACAjJ,EAAE0C,KAAK6D,EAAQ4M,aAAc,SAAUjL,GACnC,IAAIyc,EAAqB3kB,EAAE8C,KAAKoF,EAAEK,SAAU,SAAUF,GAAK,OAAqD,IAA9CrI,EAAEsI,QAAQW,EAAeV,SAAUF,EAAEb,MACnGmd,GAA8C,EAAxBA,EAAmBnd,KACzCkd,EAAUxc,EAAEyB,MAAQgb,EAAmBhb,QAK5C+a,EAgEX,SAASL,EAAsBO,EAAY7Y,GACvC,OAAO6X,EAAkBgB,GAAchB,EAAkBgB,GAAY7Y,GAAa7L,EAStF,SAAS2kB,EAAiCrL,EAAOjO,GAC7CpL,EAAO2kB,YAAYD,GAEdtZ,EAAsBI,aACnB1K,EAAsBwjB,EAAwCjkB,GAClER,EAAE0C,KAAKzB,EAAqB,SAAU8jB,EAAWC,GAAYnB,EAAoBmB,EAAUD,MAInG,OArJA/kB,EAAE0C,KAAKlC,EAAM0C,mBAAoB,SAAUmf,GACvC,IACQuC,EADJvC,EAAK4C,OAAkC,aAAzB5C,EAAK4C,MAAMC,YACrBN,EAAavC,EAAK4C,MAAME,QACvBvB,EAAkBgB,KACnBhB,EAAkBgB,GAAc,IAGpChB,EAAkBgB,GAAYvC,EAAKtW,WAAasW,KA8IjD,CACHrhB,KAAM,WACF,IAAIokB,EAA+BtkB,EAAqBN,EAAMuC,UAE1DqiB,GACArlB,EAAEoK,KAAK,CACHnF,IAAK/E,EAAKmK,EAAI,gCAAkC5J,EAAMgK,OAAS,oBAC/DnG,KAAM,MACNgG,KAAM,CACFgb,YAAarlB,EAAEsT,KAAKsQ,MAGvBtY,KAAK,SAAUga,IACZ3B,EAAkB2B,KAGV9kB,EAAMoL,uCAEF3K,EAAsBwjB,EAAwCjkB,GAClER,EAAE0C,KAAKzB,EAAqB,SAAU8jB,EAAWC,GAAYnB,EAAoBmB,EAAUD,MAE3F5kB,EAAOgf,UAAU,0CAA2C0F,GAGhEO,EAA6BvR,WAAW7P,GAAG,0BAA2B,SAAUsO,EAAKjL,EAAoBC,GACrG,IACQie,EADc,EAAlBje,IACIie,EAA0BvlB,EAAE8C,KAAKuE,EAAmBkB,SAAU,SAAUyM,GAAW,OAAOA,EAAQxN,KAAOF,IAE7Guc,EAAoBxc,EAAmBsC,KAAM4b,EAAwB5b,UAbjF,IA/Fe6b,EAIvBC,EAMAC,EAuGYF,EAAyBllB,EAAewC,KAAK,sCACb,EAAhC0iB,EAAuBzhB,SAlHZyhB,EAmHeA,EAlH1CxlB,EAAE0J,QAAQia,IAAoB3jB,EAAE0J,QAAQka,GACxC4B,EAAuBG,UAEnBF,EAAoCzlB,EAAEmU,SAAS,oaAM/CuR,EAAqB,GACzBplB,EAAewC,KAAK,yCAAyCJ,KAAK,SAAU2Z,EAAKuJ,GACzE7iB,EAAWhD,EAAE6lB,GAAMvb,KAAK,YACxBtH,IACA2iB,EAAmB3iB,GAAYsZ,KAIvCrc,EAAE0C,KAAKihB,EAAiB,SAAUkC,EAAoBnT,GAClD,IAAIoT,EAAY,CAAEC,UAAWrT,EAAiBsT,QAAS,GAAIC,KAAM,IAmC7DC,GAjCJlmB,EAAE0C,KAAKmjB,EAAoB,SAAUM,EAAqBxT,GACtDmT,EAAUE,QAAQnd,KAAK8J,GAEvB3S,EAAE0C,KAAKyjB,EAAqB,SAAUC,GAClC,IAIQjjB,EAEIkjB,EANRC,EAAQF,EAAe9B,WAAa,IAAM8B,EAAelO,eAGtB,IAA3B4N,EAAUG,KAAKK,MACnBnjB,EAAoBkhB,EAAsB+B,EAAe9B,WAAY8B,EAAelO,aAEhFmO,EAAkBX,EAAmBviB,EAAkBJ,UAC3D+iB,EAAUG,KAAKK,GAAS,CACpBvjB,SAAUI,EAAkBJ,SAC5BkiB,MAAO9hB,EAAkB8hB,MAAMsB,UAC/Bpa,MAAOhJ,EAAkBgJ,MACzBqa,UAA6B,EAAnBH,EAAuBA,EAAkBnmB,EACnDumB,WAAY,KAGhBX,EAAUG,KAAKK,GAAS,MAIF,OAA1BR,EAAUG,KAAKK,KACfR,EAAUG,KAAKK,GAAOG,WAAW9T,GAAoByT,OAMjEN,EAAUG,KAAOjmB,EAAEmI,OAAO2d,EAAUG,KAAM,SAAUS,GAChD,OAAe,OAARA,IAEIjB,EAAkCK,IAEjDN,EAAuBzQ,OAAOmR,SA8DzBlU,KAAK,SAAUC,GACZjM,QAAQC,MAAM,+CAAgDgM,OAOtF,SAAS1Q,EAAqBL,EAAOR,GACjC,IAMIimB,EANAC,EAAmB,cACnBC,EAAe,UACfC,EAAmB,IAEnBC,EAAc,KAIdC,EAAQ,CAAErW,MAAO,IAQrB,SAASsW,EAAYC,GACjB,IAAIC,EAAY,GAChBnnB,EAAE0C,KAAKwkB,EAAe,SAAUE,GAC5BA,EAAEC,YAAcD,EAAEE,YAAcF,EAAEG,MAElCJ,EAAUC,EAAEnC,OAAS4B,GAAgBO,IAGzCT,EAAqBjkB,KAAK,WACtB,IAQI8kB,EARAnU,EAAQtT,EAAEuG,MACVmhB,EAAiBpU,EAAM3F,QAAQ,8BAE/BuX,EAAQ5R,EAAMhJ,KAAK,uBAAyBwc,EAE5Ca,EAASP,EAAUlC,IAAU,GAIjC,QAHiB5R,EAAMhJ,KAAK,iBAAmB,aAG5BlI,eACf,IAAK,WACDqlB,EAAcE,EAAOpN,UAAYwM,EACjC,MACJ,IAAK,QACL,IAAK,YACDU,EAAcE,EAAOH,OAAST,EAC9B,MACJ,IAAK,gBACL,IAAK,cACL,IAAK,SACDU,EAAcE,EAAOL,YAAcK,EAAOJ,UAAY,KACtD,MACJ,IAAK,WACL,IAAK,gBACDE,EAAcE,EAAOL,YAAcK,EAAOC,UAAY,KACtD,MACJ,QACIH,EAAc,KAIF,OAAhBA,GACAnU,EAAMtN,KAAKyhB,GAAarY,OACxBsY,EAAetY,SAEfkE,EAAMjE,OACNqY,EAAerY,UAiC3B,SAASwY,IACL,IArFoBvN,EAqFhBA,EA5BGnZ,EAAM4B,KAAK,gBAAgBgF,IAAI,WAClC,IAMQ7C,EACA8G,EAPJwT,EAAYxf,EAAEuG,MACdgU,EAAW5Z,EAAMwa,wBAAwBqE,EAAUpE,OAEnD0M,EAAkB,KAmBtB,OAjBe,EAAXvN,IAEIvO,GADA9G,EAAoBvE,EAAMoe,wBAAwBS,IACpBlV,KAAK,aAQvCwd,EAAkB,CACd5C,MAPY1F,EAAUlV,KAAK,uBAAyBpF,EAAkBoF,KAAK,wBAG/DpF,EAAkB4Q,SAAS,yBAA2B+Q,EAAmB,MAKrFkB,OAAQ/b,EACRuO,SAAUA,IAIXuN,IACR9W,MAKCgX,GAtFgB1N,EAsFUA,IArFe,EAAlBA,EAAStW,OAAaikB,KAAKC,UAAU5N,GAAY,QAuFxE2M,EAAMe,GACNd,EAAYD,EAAMe,KAElBpB,EAAqB5gB,KAlGN,OAoGfhG,EAAEoK,KAAK,CACHnF,IAAK/E,EAAKmK,EAAI,mCACd/F,KAAM,OACNgG,KAAM,CACFC,EAAG,8BACH4d,OAAQF,KAAKC,UAAU,CAAE5N,SAAUA,OAGtC/O,KAAK,SAAU7J,GAGZwlB,EAFAD,EAAMe,GAAYtmB,KAIrBuQ,KAAK,SAAUmW,GACRC,EAAe1nB,EAAMmF,gCAAgCsiB,GACzDniB,QAAQC,MAAM,qCAAsCmiB,MAKpE,MAAO,CACHpnB,KAAM,WAEoD,GADtD2lB,EAAuBzlB,EAAM4B,KAAK,wBACWiB,SAGzC7C,EAAM4B,KAAK,gBAAgBkB,GAAG,SAAU,WAChC+iB,IACA9mB,EAAKooB,aAAatB,GAClBA,EAAc,MAGlBA,EAAc9mB,EAAKyX,WAAWkQ,EAAoB,OAItDA,MAGR/W,kBAAmB,WACXkW,IACA9mB,EAAKooB,aAAatB,GAClBA,EAAc,MAGoC,EAA9BJ,EAAqB5iB,QAGzC6jB,MAMhB,SAAS3kB,EAA0B/B,EAAOV,EAAOE,GAC7C,IAAI8a,EAA8B9a,EAAMiG,6BAA6BzF,EAAO,+BACvEV,EAAMiC,0BAA6B+Y,EAA4BzX,QAI9CrD,EAAMiG,6BAA6BzF,EAAO,gBAChD8C,GAAG,SAAU,WACzB,IAAIsW,EAAW5Z,EAAMwa,wBAAwBnb,EAAEuG,MAAM6U,OACrDnb,EAAE0C,KAAKlC,EAAMiC,yBAA0B,SAAUE,GACZ6Y,EAA4B1Y,KAAK,wCAA0CH,EAAiBI,SAAW,MAC7GD,KAAK,0BAA0BiD,KAAKpD,EAAiB0Y,gBAAgBhN,IAAMiM,OAMlH,SAAS3Z,IACL,SAAS2nB,EAAyB1C,GAE9B,OAAO7lB,EAAE6lB,GAAMlY,QAAQ,mBAE3B,MAAO,CACHwN,wBAAyB,SAAUqN,EAAUC,GAIrCC,EADoB,iBAAbF,EACE1R,WAAW0R,EAASlmB,QAAQ,IAAK,MAEjCkmB,EAGb,OAAkB,IAAXE,EAAeA,EAASA,GAAUD,GAAgB,GAE7D1J,wBAAyBwJ,EACzB3hB,6BAA8B,SAAUF,EAAYmD,GAOhD,OAAOnD,EAAW3D,KAAK8G,GAAUzB,OAAO,WAAc,OAAOmgB,EAAyBhiB,MAAM4P,GAAGzP,MAEnGiiB,iBAAkB,SAAUC,GACxB,OAAQA,GAAO,IAAI1F,OAAO9gB,eAE9B0Q,sBAAuB,SAAU+V,EAAMC,GACnC,MAAuB,iBAATD,GAAqC,iBAATC,EACpCD,EAAK3F,OAAO9gB,gBAAkB0mB,EAAK5F,OAAO9gB,cAC1CymB,IAASC,GAEnBhjB,gCAAiC,SAAUoM,GAEvC,GAA6B,iBAAlBA,GAAgD,OAAlBA,EAErC,IACI,IAAI6W,EAAqBd,KAAKe,MAAM9W,EAAc+W,cAClDtjB,EAAUojB,EAAmBG,kBAA0DH,EAAmBI,SAAuCjX,EAAckX,WACjK,MAAOvkB,GACLc,EAAUuM,EAAckX,gBAG5BzjB,EAAUuM,EAGd,OAAOvM,IAn5EnBzF,EAAKI,sBAAwBA,EAE7BN,EAAE,WACME,EAAKmpB,WAAanpB,EAAKmpB,UAAUhpB,IACjCH,EAAKmpB,UAAUhpB,GAAS4I,QAAQ,SAAUqgB,GACtC,IACQC,EACAC,EAFJF,IACIC,EAAcD,EAAItmB,SAGI,KAFtBwmB,EAAaxpB,EAAE,IAAMupB,IAEVvlB,OACM,IAAI1D,EAAsBkpB,EAAYF,GAC5CroB,OACkB,IAAtBuoB,EAAWxlB,OAClBiC,QAAQuL,KAAKnR,EAAU,yDAA2DkpB,GAElFtjB,QAAQuL,KAAKnR,EAAU,uDAAyDkpB,QAujBzFnpB,EA6hBRF,EAAKQ,YA5hBoC,IAA7BR,EAAKiT,sBACZjT,EAAKiT,oBAAsB,IAE/BjT,EAAKiT,oBAAqC,gBAAI,SAAUzM,EAAYsN,EAAiBvO,GAkEzEwO,EAAe,CACfxM,IAAI,IAAIgiB,MAAOC,UAAY,MAAQ1V,EAAgBvM,GACnDkL,gBAAiBqB,EAAgBpK,KACjCpB,SAAU8N,EAAc5P,EAAYsN,EAAgBxL,UACpDmhB,OAAQ,CAAEC,OAAQnkB,EAA8B,sBAGhDyO,EAA2BlU,EAAEgK,MAAM,uCACvCtD,EAAWuD,QAAQiK,EAA0B,CAACD,EAAc,oBAzEhE,IAAIE,EA2EOlU,EAAEmU,SAXa,qlBAWaH,GA1EnC4V,EAAqB7pB,EAAEmU,GACvB2V,EAAYD,EAAmB9mB,KAAK,UAUxC,OARA+mB,EAAU7lB,GAAG,SAAU,SAAUsO,GAG7BwX,EAFsB9R,SAAS1F,EAAIzN,OAAO6U,QAAU,KAKxDjT,EAAWsO,OAAO6U,GAEX,CACHxX,YAAawC,EACb9B,kBA4EJ,SAA4BH,GACxB,CAAA,IACQjS,EACAyU,EAFJxC,IACIjS,EAAQ,IAAIC,GACZwU,EAAoBnV,EAAE8C,KAAKiR,EAAgBxL,SAAU,SAAU6M,GAC/D,OAAO1U,EAAMmS,sBAAsBuC,EAAezL,KAAMgJ,OAIxDiC,EAAaO,EAAkB3N,OAnFvC6N,YAAa0U,EACblgB,eAAgB,SAAUyL,EAAqB7L,GAC3C,IAAIugB,EAEAC,EAAWJ,EAAU/mB,KAAK,UAC9BmnB,EAASvnB,KAAK,WACV,IAMIwnB,EANAC,EAAUpqB,EAAEuG,MACZ8C,EAAY+gB,EAAQhP,MACpB/R,GAAa,SAKgB,KAD7B8gB,EAAkBC,EAAQ9f,KAAK,gBAE/B6f,EAAkBC,EAAQpkB,OAE1BokB,EAAQ9f,KAAK,YAAa6f,KAGxBxU,EAAqBJ,EAAoBlM,KAE3C+gB,EAAQpkB,KAAKmkB,EAAkB,KAAOxU,EAAmBhQ,QAAU,KACnEykB,EAAQxU,SAAS,YAEbD,EAAmBpM,UACnB6gB,EAAQ5c,KAAK,WAAY,cAG7B4c,EAAQpkB,KAAKmkB,GAEbC,EAAQtV,YAAY,YACpBsV,EAAQxc,WAAW,YAEnBqc,OAA6D,IAA7B,EAA2CG,EAAU,SAIzFH,GAA0BvgB,IAC1BmL,EAAaoV,EAAuB7O,OAEZ,IAApB8O,EAASlmB,QAAgB8lB,EAAU3T,GAAG,cACtC2T,EAAUO,SAASC,QAAQ,sDAAwDL,EAAuBjkB,OAAS,WACnH8jB,EAAU3b,IAAI,UAAW,YAqBzC,SAAS0G,EAAaxL,GACd9B,EAAkB0Q,SAAS5O,IAAc,EAEd9B,IADLyiB,MAItBF,EAAU1O,IAAI7T,GAEdwiB,EAA6BxiB,IAiBrC,SAASyiB,IACL,OAAO/R,SAAS6R,EAAU1O,OAAS,GAUvC,SAAS2O,EAA6BxiB,GAClC,IAAI0O,EAJwB,KAHxBC,EAAY4T,EAAU/mB,KAAK,oBAGdiB,QAAgBkS,EAAUC,GAAG,mBAK9CzP,EAAWuD,QAAQ,0BAA2B,CAAC+J,EAAiBzM,EAAiB0O,MAIzF/V,EAAKiT,oBAAkC,aAAI,SAAUzM,EAAYsN,EAAiBvO,GAkB9E,OAAO,IAAI2Q,EAAuB1P,EAAYsN,EAL3B,CACfrB,gBAAiBqB,EAAgBpK,KACjCpB,SAAU8N,EAAc5P,EAAYsN,EAAgBxL,UACpDmhB,OAAQ,CAAEC,OAAQnkB,EAA8B,sBAf9B,ivBAoB1BvF,EAAKiT,oBAAwC,mBAAI,SAAUzM,EAAYsN,EAAiBvO,EAAUe,GAoB1FyN,EAAe,CACftB,gBAAiBqB,EAAgBpK,KACjCpB,SAAU8N,EAAc5P,EAAYsN,EAAgBxL,UACpDmhB,OAAQ,CAAEC,OAAQnkB,EAA8B,qBAChD8kB,oBAAqB,oCAAsC/jB,EAAQgkB,oBAAsB,IAAMhkB,EAAQikB,mBACvGC,eAAgB,CACZzM,MAAOzX,EAAQgkB,oBACfG,OAAQnkB,EAAQgkB,sBAmBxB,OAfIhkB,EAAQokB,eAAgD,EAA/BpkB,EAAQokB,cAAc5mB,QAC/C/D,EAAE0C,KAAKsR,EAAazL,SAAU,SAAUyM,GACpC,IAAM0B,EAAkD,mBAA5B1B,EAAQrL,KAAc,UAAmBqL,EAAQrL,KAAKgN,YAAc3B,EAAQrL,KACxG,MAAMihB,EAAmBC,OAAOtkB,EAAQvD,2BAA2BX,QAAQ,cAAeqU,GAAc,MAEpGoU,EAAe9qB,EAAE8C,KAAKyD,EAAQokB,cAAe,SAAUI,GACnDC,EAAgD,mBAA5BD,EAAO5e,MAAe,UAAmB4e,EAAO5e,MAAMwK,YAAcoU,EAAO5e,MACnG,OAAOye,EAAiBK,KAAKD,KAG7BF,IACA9V,EAAQkW,MAAQJ,KAIrB,IAAI3U,EAAuB1P,EAAYsN,EAAiBC,EA7CzC,qmCAgD1B/T,EAAKiT,oBAAgD,2BAAI,SAAUzM,EAAYsN,EAAiBvO,EAAUe,GAClGyN,EAAe,CACftB,gBAAiBqB,EAAgBpK,KACjCpB,SAAU8N,EAAc5P,EAAYsN,EAAgBxL,UACpDmhB,OAAQ,CAAEC,OAAQnkB,EAA8B,qBAChD2lB,gBAAiB5kB,EAAQxD,SAAW,IAAMgR,EAAgBvM,IAmB9D,OAhBIjB,EAAQokB,eAAgD,EAA/BpkB,EAAQokB,cAAc5mB,QAC/C/D,EAAE0C,KAAKsR,EAAazL,SAAU,SAAUyM,GACpC,IAAM0B,EAAkD,mBAA5B1B,EAAQrL,KAAc,UAAmBqL,EAAQrL,KAAKgN,YAAc3B,EAAQrL,KACxG,MAAMihB,EAAmBC,OAAOtkB,EAAQvD,2BAA2BX,QAAQ,cAAeqU,GAAc,MAEpGoU,EAAe9qB,EAAE8C,KAAKyD,EAAQokB,cAAe,SAAUI,GACnDC,EAAgD,mBAA5BD,EAAO5e,MAAe,UAAmB4e,EAAO5e,MAAMwK,YAAcoU,EAAO5e,MACnG,OAAOye,EAAiBK,KAAKD,KAG7BF,IACA9V,EAAQkW,MAAQJ,KAKrB,IAAIhX,EAA+BrN,EAAYsN,EAAiBC,IAx5BnF,CA8gFGoX,OAAQprB,EAAG2E"}