{"version":3,"sources":["webpack:///src/modules/checkout-delivery-options/components/checkout-delivery-options.description.tsx?8620","webpack:///src/modules/checkout-delivery-options/components/checkout-delivery-options.error-message.tsx?8f25","webpack:///src/modules/checkout-delivery-options/components/checkout-delivery-options.error-title.tsx?e220","webpack:///src/modules/checkout-delivery-options/components/checkout-delivery-options.radio-button.tsx?f1bb","webpack:///src/modules/checkout-delivery-options/checkout-delivery-options.tsx?d83e","webpack:///src/modules/checkout/components/get-line-items.tsx?5207","webpack:///src/modules/quick-order/components/quick-order-drawer.tsx?25f0","webpack:///src/modules/quick-order/components/quick-order-form.tsx?61bd","webpack:///src/modules/quick-order/components/quick-order-product.ts?af99","webpack:///src/modules/quick-order/components/quick-order-table/components/quick-order-table-header-component.tsx?d661","webpack:///src/modules/quick-order/components/quick-order-table/components/quick-order-table-row-component.tsx?cb68","webpack:///src/modules/quick-order/components/quick-order-table/quick-order-table-component.tsx?a7a8","webpack:///src/modules/quick-order/quick-order.tsx?7aab","webpack:///src/modules/fabrikam/views/components/cartlineitem.component.tsx?4b07","webpack:///src/modules/checkout/methods/empty-active-cart.ts?524e","webpack:///src/modules/checkout/components/index.ts?5ba9","webpack:///src/modules/order-template-list/components/order-template-list.tsx?f2fd","webpack:///src/modules/order-template-list/components/orderTemplateList-status-message.tsx?dbea","webpack:///src/modules/checkout/methods/checkout.ts?3b66","webpack:///src/modules/search-result-container/components/title.tsx?365d","webpack:///src/modules/order-template/order-template.tsx?4281","webpack:///src/modules/search-result-container/components/utilities.ts?41e3","webpack:///src/modules/quick-order/quick-order.view.tsx?2242","webpack:///src/modules/search-result-container/search-result-container.tsx?97e0","webpack:///src/order-summary-lineitem.tsx?86d9","webpack:///../../src/index.ts?0e3e","webpack:///src/modules/search-result-container/components/error-message.tsx?c0c2","webpack:///src/modules/cart/components/cart-pick-up-in-store.tsx?f7bf","webpack:///src/modules/cart/components/cart-line-items.tsx?a1e3","webpack:///src/modules/cart/components/cart-line-groups.tsx?b88f","webpack:///src/modules/cart/utils/get-promotion-in-cart.ts?1379","webpack:///src/modules/cart/cart.tsx?f1c3","webpack:///src/modules/cart/components/cart-line-items-promotion.tsx?6882","webpack:///src/modules/product-collection/product-collection.view.tsx?9eb3","webpack:///src/modules/product-collection/product-collection.tsx?b9b8","webpack:///../../../src/module-state-manager/with-module-state.tsx?61ca","webpack:///src/modules/cart/cart.view.tsx?394b","webpack:///src/modules/checkout-gift-card/components/get-form.tsx?9f59","webpack:///src/modules/checkout-gift-card/components/get-item.tsx?ec46","webpack:///src/modules/checkout-gift-card/components/get-list.tsx?9723","webpack:///src/modules/checkout-gift-card/components/title.tsx?6d07","webpack:///src/modules/checkout-gift-card/checkout-gift-card.tsx?e6b8","webpack:///../../src/checkout-state.ts?acd8","webpack:///src/modules/search-result-container/search-result-container.view.tsx?3d61","webpack:///src/modules/promo-banner/promo-banner.view.tsx?d069","webpack:///src/modules/checkout/index.ts?1106","webpack:///src/modules/search-result-container/components/refine-item.tsx?b232","webpack:///src/modules/order-template/components/add-line/add-line.tsx?add3","webpack:///src/modules/order-template/components/add-line/spinner.tsx?28dd","webpack:///src/modules/order-template/components/add-line/dropdown.tsx?40af","webpack:///src/modules/order-template/components/add-line/not-found.tsx?00ed","webpack:///src/modules/order-template/components/common/order-template-quantity.tsx?dfc0","webpack:///src/modules/order-template/components/add-line/product-configuration.tsx?ac81","webpack:///src/modules/order-template/components/add-line/product-list.tsx?5107","webpack:///src/modules/order-template/components/order-template-actions.tsx?5f39","webpack:///src/modules/order-template/components/order-template-lines.tsx?cdf6","webpack:///src/modules/order-template/components/order-template-lines-status-message.tsx?0022","webpack:///src/modules/order-template/components/order-template-table-heading.tsx?606c","webpack:///src/modules/checkout-loyalty/checkout-loyalty.view.tsx?876d","webpack:///src/modules/search-result-container/components/index.ts?cc7a","webpack:///src/modules/checkout/checkout.view.tsx?e9a7","webpack:///src/modules/checkout/components/get-invoice-payment-summary.tsx?6271","webpack:///src/modules/checkout/checkout.tsx?baa3","webpack:///src/modules/search-result-container/components/product-search-result-items.tsx?1766","webpack:///src/modules/search-result-container/components/choice-summary.tsx?f4a7","webpack:///src/modules/search/search.view.tsx?e62d","webpack:///src/modules/gift-card-balance-check/components/get-form.tsx?f122","webpack:///src/modules/gift-card-balance-check/components/get-item.tsx?d7f7","webpack:///src/modules/gift-card-balance-check/gift-card-balance-check.tsx?6bc9","webpack:///src/modules/search-result-container/components/refine-submenu.tsx?1e62","webpack:///../../../src/module-state-manager/module-state.ts?7579","webpack:///src/modules/search-result-container/components/separator.tsx?7b76","webpack:///src/modules/order-template-list/components/create-order-template.tsx?81ed","webpack:///src/modules/order-template-list/order-template-list.tsx?bc4a","webpack:///src/modules/promo-banner/components/close-button.tsx?939d","webpack:///src/modules/promo-banner/components/links.tsx?3133","webpack:///src/modules/promo-banner/components/text.tsx?834e","webpack:///src/modules/promo-banner/promo-banner.tsx?958e","webpack:///src/index.ts?c6ae","webpack:///src/modules/search-result-container/components/range-refine-item.tsx?6e24","webpack:///src/modules/checkout/components/alert.tsx?5f0c","webpack:///src/modules/checkout-gift-card/checkout-gift-card.view.tsx?3424","webpack:///src/modules/order-template/order-template.view.tsx?f2c8","webpack:///src/modules/search-result-container/components/link.tsx?d3ce","webpack:///src/modules/checkout/components/place-order-button.tsx?c8b4","webpack:///../../../src/module-state-manager/index.ts?8e3a","webpack:///src/modules/search-result-container/actions/index.ts?3dfa","webpack:///src/modules/checkout/components/get-order-summary.tsx?6f62","webpack:///src/modules/checkout/methods/index.ts?4c8b","webpack:///src/modules/search-result-container/components/modal.tsx?afdd","webpack:///src/modules/gift-card-balance-check/gift-card-balance-check.view.tsx?ce1c","webpack:///src/modules/checkout-loyalty/components/checkout-loyalty-input.tsx?d04f","webpack:///src/modules/checkout-loyalty/components/checkout-loyalty-label.tsx?3110","webpack:///src/modules/checkout-loyalty/components/checkout-loyalty-text.tsx?0080","webpack:///src/modules/checkout-loyalty/checkout-loyalty.tsx?c94a","webpack:///src/modules/order-template/components/bulk-actions.tsx?f343","webpack:///src/modules/checkout-delivery-options/checkout-delivery-options.view.tsx?d64d","webpack:///src/modules/search-result-container/components/feature-search-result-item.tsx?98c1","webpack:///src/modules/checkout/components/guided-card.tsx?5a55","webpack:///src/search-state.ts?b5d7","webpack:///src/modules/search/actions/get-auto-suggest-suggestions.ts?6ade","webpack:///src/modules/search/components/search.categorysuggest.tsx?3bc4","webpack:///src/modules/search/components/search.form.tsx?3c4b","webpack:///src/modules/search/components/search.keywordsuggest.tsx?59ca","webpack:///src/modules/search/components/search.label.tsx?91cb","webpack:///src/modules/search/components/search.productsuggest.tsx?d6fa","webpack:///src/modules/search/search.tsx?3f45","webpack:///src/modules/order-template-list/order-template-list.view.tsx?20f7","webpack:///src/modules/checkout/components/guided-form.tsx?7fad","webpack:///src/invoice-summary-lineitem.tsx?1b66","webpack:///../../src/checkout-state-data-action.ts?8344","webpack:///src/modules/checkout/methods/place-order.ts?6d11"],"names":["CheckoutDeliveryOptionsDescription","description","React","className","CheckoutDeliveryOptionsErrorMessage","message","CheckoutDeliveryOptionsErrorTitle","title","CheckoutDeliveryOptionsRadioButton","isChecked","value","ariaSetSize","ariaPosInSet","ariaLabel","telemetryContent","onChange","payLoad","getPayloadObject","TelemetryConstant","DeliveryOptions","attributes","getTelemetryAttributes","checked","type","contentAction","etext","name","CheckoutDeliveryOptions","constructor","props","super","selectedItemId","deliveryOptions","isLoading","retailMultiplePickUpOptionEnabled","init","async","this","moduleState","onEdit","isSelectDefaultOptionEnabled","undefined","onCancel","onSubmit","status","config","useDefaultDeliveryOption","canShip","cartDeliveryMode","getSavedDeliveryOption","loadDeliveryOptions","data","checkout","result","checkoutCart","hasInvoiceLine","getCartLinesForShipping","length","isDeliveryModeExists","deliveryMode","find","deliveryOption","Code","getDeliveryOptionSelected","selectedItem","context","telemetry","error","id","typeName","priceFree","resources","price","get","DeliveryOption","DescriptionComponent","Object","Description","PriceComponent","CustomerContextualPrice","freePriceText","getErrorMessage","errorMessageTitle","CheckoutDeliveryOptionsError","tag","role","ErrorTitleComponent","ErrorMessageComponent","errorMessage","getDeliveryOptionList","count","map","index","code","radioButton","RadioButtonComponent","onDeliveryOptionChange","getSaveButton","saveBtnLabel","Button","color","disabled","onClick","onSave","getEditButton","editBtnLabel","getCancelButton","cancelBtnLabel","setError","setHasError","onUpdating","clearError","updateShouldCollapsePaymentSection","newShouldCollapsePaymentSection","updateCartDeliverySpecification","savedDeliveryOption","onReady","cartLinesForShipping","DeliveryMode","deliveryModeId","trim","checkoutState","updateCartDeliverySpecificationInput","shippingAddress","channelDeliveryOptionConfig","onPending","then","response","genericErrorMessage","setIsCancellable","catch","request","pickupDeliveryModeCode","channel","PickupDeliveryModeCode","emailDeliveryModeCode","EmailDeliveryModeCode","cart","CartLines","filter","cartLine","PickupDeliveryModeCodes","getDeliveryOptions","cartState","cartId","Id","originalDeliveryMode","shippingCartLines","hasShippingDeliveryLines","clearCartLinesDeliveryInformation","channelDeliveryOptionConfiguration","deliveryOptionFilter","filterDeliveryModeOption","FilterDeliveryModeOption","None","FilterOutNonCarrierDeliveryMode","getDeliveryOptionsAsync","callerContext","actionContext","queryResultSettings","QueryResultSettingsProxy","getPagingFromInputDataOrDefaultValue","deliveryOptionsNotFound","updateHasCartDeliveryMode","newHasCartDeliveryMode","isPaymentVerificationRedirection","getStoredDeliveryOptions","isExpressCheckoutApplied","event","currentTarget","getTelemetryObject","telemetryPageName","friendlyName","requestFormData","query","pv","when","isDataReady","reaction","shouldComponentUpdate","nextProps","nextState","state","render","isReady","isUpdating","hasError","isError","isShowList","isShowSelected","featureState","feature","Name","IsEnabled","deliveryOptionAriaLabel","viewProps","deliveryOptionsData","errorMessageData","viewState","isShowSaveButton","hasExternalSubmitGroup","isShowEditButton","isShowCancelButton","moduleProps","classname","DeliveryOptionsList","list","deliveryOptionSelected","waiting","Waiting","saveButton","editButton","cancelButton","renderView","__decorate","observable","computed","action","withModuleState","observer","getLineItems","input","_getDeliveryLocation","orgUnitLocations","FulfillmentStoreId","locationMatch","location","OrgUnitNumber","OrgUnitName","_getLineItemComponent","product","ProductId","productId","_product","RecordId","imageSettings","showShippingChargesForLineItems","quantityDisplayString","productDimensionTypeColor","productDimensionTypeSize","productDimensionTypeStyle","productDimensionTypeAmount","configString","inputQuantityAriaLabel","discountStringText","shippingCharges","gridSettings","productUrl","getProductUrlSync","MsDyn365","isBrowser","fullUrl","URL","window","href","searchParams","set","CatalogId","CartLineItemComponent","sizeString","colorString","styleString","amountString","originalPriceText","currentPriceText","shippingChargesText","isQuantityEditable","primaryImageUrl","PrimaryImageUrl","_getPickUpAtStoreComponents","pickupDeliveryLocation","pickUpAtStoreWithLocationText","PickUpAtStore","label","_getEmailDeliveryComponents","emailDeliveryText","EmailDelivery","_getLineItemsComponents","items","isPickUp","_getCartPickDeliveryMode","isEmailDelivery","LineId","LineItem","item","pickUpAtStore","emailDelivery","cartLineItem","StringExtensions","isNullOrWhitespace","_countItems","reduce","Quantity","_filterItemsByDiliveryType","_getLineItemsByDeliveryType","itemLabel","itemsLabel","inStorePickUpLabel","shippingCountCheckoutLineItem","emailDeliveryModeDesc","productDeliveryOptions","suffix","replace","toString","_getGroupTitleComponent","LineItemDeliveryGroup","classnames","LineItemList","heading","lineItems","handleLineItemHeadingChange","lineItemsHeading","text","target","_getLineItemsByDeliveryTypeWithMulitplePickupMode","multiplePickUpLabel","shippingLable","getGroupByStorePickup","groupBy","groupDelivery","cartLinesGroup","cartLinesGrp","entries","forEach","groupByDeliveryType","push","keys","key","cartLines","_filterItemsByMultiplePickupMode","lineItemDeliveryGroup","fulFillmentStoreId","pickupDeliveryModeDesc","pickupTitle","_getGroupTitleComponentWithMultiplePickUp","groupTitle","iconClass","lineItemWraperIcon","lineItemWraper","products","editCartText","EditCart","attribute","groupClass","LineItems","Header","Msdyn365","editProps","requestContext","editLink","itemsForPickup","itemsForShip","itemsForEmail","itemsGroupWithMulitplePickupMode","_getLineItems","QuickOrderDrawer","_toggle","bind","isManuallyToggled","isOpen","collapseProps","drawerGlyphClass","toggleGlyphClassName","animateGlyph","drawerOpenGlyph","openGlyph","closeGlyph","drawerCloseGlyph","children","drawerClass","toggleButtonProps","block","_generateDrawerButtonInnerMarkup","Collapse","collapseState","drawerButtonTextClass","toggleButtonClassName","moduleHeadingText","moduleDescriptionText","_generateGlyphMarkup","glyphClass","e","preventDefault","setState","onToggle","QuickOrderFormComponent","productTextInput","quantityTextInput","quickOrderState","maxChars","maxQuantity","disableAddtoCart","ariaLabelQuantity","ariaLabelProduct","ariaLabelAddtoCart","handleQuantityChange","handleInputChange","handleAddToCartClick","onInputChange","onInputChangeFunction","onQuantityInputChange","onQuantityChangeFunction","productNode","ref","quantityNode","pattern","maxLength","quantity","addToCartBtn","userMessage","stateMessage","Alert","statusCssString","messageGlyph","messageText","QuickOrderProduct","simpleProduct","isSelected","QuickOrderDesktopHeaderCellsComponent","columnWithNumberClassName","quickOrderProductNumberText","quickOrderProductText","quickOrderUnitPriceText","quickOrderUnitOfMeasureText","quickOrderQuantityText","quickOrderTotalText","quickOrderActionsText","QuickOrderMobileHeaderCellsComponent","QuickOrderTableHeaderComponent","rowClassName","headerCells","isMobile","defaultImageSettings","viewports","xs","q","w","h","lg","lazyload","cropFocalRegion","QuickOrderTableRowProductImageComponent","fallbackImageUrl","getFallbackImageUrl","ItemId","apiSettings","containerClassName","Image","altText","src","fallBackSrc","loadFailureBehavior","QuickOrderExtraActionsPopupComponent","ObjectExtensions","isNullOrUndefined","getProductPageUrlSync","QuickOrderDesktopTableRowCellComponent","Dimensions","dimension","DimensionValue","Value","dimensionValue","join","quickOrderProductDimensionsSeparator","Price","UnitOfMeasureSymbol","IncrementalQuantity","max","currentCount","quickOrderInputQuantityAriaLabel","decrementButtonAriaLabel","quickOrderDecrementButtonAriaLabel","incrementButtonAriaLabel","quickOrderIncrementButtonAriaLabel","isGiftCard","IsGiftCard","TotalAmount","quickOrderRemoveItemButtonAriaLabel","QuickOrderMobileTableRowCellComponent","format","quickOrderQuantityMobileText","QuickOrderTableRowComponent","QuickOrderTableComponent","setIsMobile","useState","isMobileView","quickOrderProducts","updateViewport","addEventListener","headerClassName","quickOrderProduct","QuickOrder","waitTime","dimensionUpdateQueue","FinitePromiseQueue","dimensions","cssClassNameConfigure","quickOrderCallbacks","dimensionSelectedAsync","selectedDimensionId","selectedDimensionValueId","enqueue","_updateDimensions","FinitePromiseQueueError","ProcessWasDiscardedFromTheQueue","getDropdownName","dimensionType","_getDropdownName","changeUpdatingDimension","isUpdatingDimension","_handleInputChange","productText","productResponse","productDimensions","cancellabelDebounce","cancel","isQuickOrderFormExpanded","getScanResult","GetScanResultInput","channelId","results","Product","ProductDimensionFull","exception","debug","setTimeout","_addItemToCart","quickOrderAddedToCartSuccessMessage","quickOrderAddedToCartFailureMessage","_validateCart","isOrderQuantityLimitsFeatureEnabledInHq","defaultOrderQuantityLimitsFeatureConfig","app","platform","enableDefaultOrderQuantityLimits","customerInfo","customerInformation","isOrderQuantityLimitsFeatureEnabledInSiteSettings","IsB2b","defaultDeliveryOption","ArrayExtensions","hasElements","isOrderQuantityLimitsFeatureEnabled","productAvailableQuantity","_updateAvailablity","addProductToCartInput","enableStockCheck","availableQuantity","ProductAvailableQuantity","AvailableQuantity","additionalProperties","orderQuantityLimitsFeatureIsEnabled","isAddEmailDeliveryItemToCart","addProductToCart","substatus","maxQtyLimitReachedMessage","_getMaxQtyMessage","errorDetails","LocalizedMessage","warning","_handleQuantityChange","currentValue","Number","parseInt","inputElement","quantityInput","current","HTMLInputElement","isNaN","setAttribute","_updateDimensionValue","productDimensionFull","newValueId","DimensionValues","productDimensionTypeConfiguration","dimensionsToUpdate","productDimensionErrorState","otherError","clearOtherErrorState","configureErrors","errorState","mappedDimensions","DimensionTypeValue","ExtensionProperties","selectedProduct","Promise","resolve","reject","newProduct","getSelectedVariant","SelectedVariantInput","MasterProductId","getDimensionsForSelectedVariant","GetDimensionsForSelectedVariantInput","variantProduct","newAvailableQuantity","getProductAvailabilitiesForSelectedVariant","ProductAvailabilitiesForSelectedVariantInput","productAvailable","_getDimensionErrorString","dimensionTypeValue","quickOrderproductDimensionTypeColorErrorMessage","quickOrderproductDimensionTypeConfigurationErrorMessage","quickOrderproductDimensionTypeSizeErrorMessage","quickOrderproductDimensionTypeAmountErrorMessage","quickOrderproductDimensionTypeStyleErrorMessage","missingDimensions","_getConfigureErrors","quickOrderWrongQuantityErrorMsg","viewport","device","Type","quickOrderFormClass","quickOrderFormProductContent","quickOrderFormMsgContent","quickOrderModuleHeading","quickOrderModuleDescription","quickOrderAddtobag","quickOrderProductQuantityInputLabel","quickOrderProductInputLabel","quickOrderProductDimensionTypeColor","quickOrderProductDimensionTypeConfiguration","quickOrderSelectDimensionFormatString","quickOrderProductDimensionTypeSize","quickOrderProductDimensionTypeStyle","quickOrderProductDimensionTypeAmount","productConfigureResources","selectDimensionFormatString","quickOrderProps","contentProps","isB2B","drawer","quickOrderForm","quickOrderList","_renderQuickOrderTable","form","configure","getProductConfigure","_initQuickOrderProducts","validValues","tableClassName","productInventoryInfo","currentQuantity","quickOrderMaxQuantityLimitText","maxQuantityForLineItem","maxQuantityForCartLineItem","minInventory","Math","min","CatalogLabelComponent","catalogId","user","isB2b","catalogs","catalog","CartLineItemFunctions","DimensionStrings","productDimension","DiscountLines","discountLine","OfferId","OfferName","isSalesLine","PeriodicDiscount","EffectiveAmount","BasePrice","EffectivePercentage","inventoryInformationLabel","inventoryCssName","inventoryLabelClassName","IsInvoiceLine","unitOfMeasureDisplayType","DefaultUnitOfMeasure","cartline","hasShippingMethod","some","shippingChargeLines","ChargeLines","chargeLine","IsShipping","freightFee","chargeTotal","CalculatedAmount","priceComponent","otherCharges","chargeline","otherCharge","CartLine","destructDimensionStrings","renderDisountLines","renderInventoryLabel","renderUnitOfMeasure","renderShippingLabel","renderOtherCharges","productAttribute","productName","imgeClassName","newValue","quantityOnChange","lineIndex","NetAmount","NetAmountWithoutTax","NetPrice","nodes","isOutOfStock","isCartStateReady","classNames","DiscountAmount","DiscountAmountWithoutTax","_generateQuantityandPrice","priceEditorResources","CartLinePriceEditor","emptyActiveCart","ctx","lineItemIdsToRemove","getCartState","getCheckoutState","Error","activeCart","activeCartLine","checkoutCartLine","removeCartLines","cartLineIds","removeAllPromoCodes","removeCheckoutCartId","OrderTemplateActions","onRemoveOrderTemplate","handlers","itemKey","removeOrderTemplateActionHandler","OrderTemplateRender","orderTemplate","removeFromOrderTemplateListText","orderTemplateState","enableImageProductLink","onDismiss","orderTemplateImage","_renderOrderTemplateImages","orderTemplateLines","orderTemplateAriaLabel","_renderAriaLabel","orderTemplateName","url","getUrlSync","separator","includes","_getOrderTemplatePageUrl","totalLines","addToCartButton","AddOrderTemplateToCartComponent","moduleTypeName","addToCartText","addToBagText","dialogStrings","removeButton","orderTemplateStatusMessage","toggle","onClickHandler","assign","xl","slice","line","fullProduct","ProductDetails","alt","OrderTemplateListStatusMessage","errorType","OPERATIONS","PayCard","PayGiftCertificate","PayLoyalty","PayCustomerAccount","getCardTypeId","cardPrefix","resolveCardTypesAsync","CardType","Unknown","TypeId","findTenderIdTypeByOperationId","tenderTypes","operationId","matchedTenderType","tenderType","OperationId","TenderTypeId","roundNumber","toFixed","updatedCartVersion","channelConfiguration","giftCardExtends","tokenizedPaymentCard","guestCheckoutEmail","billingAddress","loyaltyAmount","cardPaymentAcceptResult","shouldEnableSinglePaymentAuthorizationCheckout","Currency","cartTenderLines","amountDue","AmountDue","getTenderLinePromises","loyaltyCardNumber","LoyaltyCardId","chargedAmount","loyaltyTenderLinePromise","Amount","getTenderTypesAsync","getLoyaltyTenderLine","giftCardExtend","Balance","tenderTypeId","giftCardPin","Pin","giftCardExpirationYear","ExpirationDate","split","giftCardExpirationMonth","creditCardTenderLinePromise","GiftCardId","GiftCardPin","GiftCardExpirationYear","GiftCardExpirationMonth","getGiftCardTenderLine","customerAccountAmount","customerAccountTenderLinePromise","CustomerId","isAuthenticated","createCustomerAccountTenderLine","amount","currency","cardTenderLine","CardPaymentAcceptResult","getCreditCardTenderLineForSinglePaymentAuth","cartTypeId","CardTypeId","TenderType","TokenizedPaymentCard","House","CardTokenInfo","Phone","Country","ThreeLetterISORegionName","Address1","Street","City","State","Zip","ZipCode","getCreditCardTenderLine","all","cartVersion","Version","salesOrder","checkoutAsync","bypassCache","AdditionalContext","updateRedirectAdditionalContext","newRedirectAdditionalContext","updateIsCheckoutCallFailed","newIsCheckoutCallFailed","refreshCart","Title","OrderTemplateLines","_onRemoveSelection","removeSelectedFailureMessage","removeSelectedSuccessMessage","lines","productSelection","productListLines","productListLine","productListId","ProductListId","maxWaitTimeInMilliSeconds","removeProductListLinesAsync","reload","substr","indexOf","productList","_onAddSelectionToBag","selectedLines","productLine","ProductTypeValue","AdjustedPrice","_addItemToBag","_getCurrentUrl","reqContext","requestUrl","onCloseHandler","isItemAddedToOrderTemplateOpen","_renderItemAddedToCartDialog","itemAddedToCartDialogData","ItemAddedToCartDialog","_generateItemAddedToCartDialogResources","modalOpen","onClose","_renderPagination","itemsPerPage","skipCount","_getCurrentPageNumber","totalItems","previousText","flipperPrevious","nextText","flipperNext","UncontrolledPagination","paginationAriaLabel","qsp","startingItem","_renderPrev","_renderNext","previousAriaLabel","nextAriaLabel","_toggleDetailsDisplayed","isDetailsDisplayed","detailedProductView","OrderTemplateMobileLineView","_onDismiss","_changeQuantity","orderTemplateLinesData","orderLineIndex","findIndex","newProductListLine","prevQuantity","isQuantityDisabledForUpdate","updateProductListLinesAsync","newLine","updatedLines","updatedOrderTemplate","ProductListLines","update","ActiveOrderTemplateLinesInput","editOrderTemplateLineQuantityError","maxQuantityLimitText","addedToCartFailureMessage","getPriceForSelectedVariant","PriceForSelectedVariantInput","priceResult","AsyncResult","isMiniCart","addToCartBehavior","productPrice","maxQuantityForProductListLineItem","_removeItemFromOrderTemplateLines","token","userToken","_renameTemplate","_removeTemplate","deleteAsync","deleteOrderTemplateFailedText","newLink","_getViewport","innerWidth","sm","md","paginationPreviousText","paginationNextText","_viewport","_updateViewport","isConfirmAddSelectionToBagModalOpen","signInUrl","componentWillUnmount","removeEventListener","emptyOrderTemplateLinesText","errorGettingOrderTemplateLines","errorProps","statusMessage","OrderTemplateLinesStatusMessage","Heading","orderTemplateResult","_isFirstPage","emptyViewProps","productsStatusMessage","ProductsTable","ProductsTableRow","ProductsTableHeading","_renderProductListHeader","orderLines","_renderProductList","callbacks","updateQuantity","debounce","orderActions","_renderOrderTemplateActions","pagination","itemAddedToCartDialog","bulkOrderLineActions","_getOrderTemplateLineActions","toggleDetailsDisplayed","onSelect","updated","onSelectAll","productNumberText","productUnitPriceText","productUOMText","productQuantityText","productActionsText","selectAllRowsText","headers","productNumber","productUnitPrice","productUOM","productQuantity","productActions","clickHandler","OrderTemplateTableHeading","orderTemplateId","OrderTemplateBulkActions","onAddSelectionToBag","onRemoveSelection","isMinifiedView","_generateLinesAddedToCartDialogResources","viewCartButtonText","orderTemplateCloseButtonText","linesAddedToCartHeaderItemsOneText","linesAddedToCartHeaderLinesOneText","linesAddedToCartHeaderLinesFormatText","linesAddedToCartHeaderMessageText","itemAddedToCartHeaderItemOneText","itemAddedToCartHeaderItemFormatText","itemAddedToCartHeaderMessageText","addTemplateToBagButtonText","renameTemplateButtonText","deleteTemplateButtonText","closeWindowButtonText","addToCartFailureMessage","addToCartSuccessMessage","addToCartProcessMessage","orderTemplateActions","onRenameTemplate","onRemoveTemplate","renameOrderTemplateDialogStrings","_generateOrderTemplateNameDialogResources","linesAddedToCartDialogResources","OrderTemplateActionsView","orderTemplateHeaderLabel","renameOrderTemplateTitleText","orderTemplateTitleLabel","orderTemplateTitle","orderTemplateNameAriaLabel","orderTemplateDescription","defaultOrderTemplateName","orderTemplateButtonLabel","renameOrderTemplateButtonText","orderTemplateCancelButtonLabel","skip","selectOneRowText","moreButtonText","viewProductDetailsText","addOrderTemplateItemToBagButtonText","removeItemFromOrderTemplateButtonText","deleteButtonText","currentProductProps","orderTemplateLine","ProductPrice","moduleId","onAddToBag","onRemoveItem","onChangeQuantity","removeFromOrderTemplateLinesText","addToBagButtonText","OrderTemplateLineView","ProductRefinerValueDataTypeValue","ProductRefinerTypeValue","ProductRefinerSource","isRangeType","dataTypeValue","AttributeDataType","Decimal","Integer","findMatchingRefinementCriterion","productRefinerValue","refinementCriteria","refinementCriterion","isMatchingRefinementCriterion","RefinerRecordId","RefinerSourceValue","DataTypeValue","LeftValueBoundString","getUpdatedRefinementCriteria","itemToggleNotification","currentRefinementCriteria","updatedRefinementCriteria","toggledItemFound","selectedCriterion","isSelecting","next","rangeStart","RightValueBoundString","rangeEnd","Text","TrueFalse","parentProductRefinerHierarchy","RefinerTypeValue","RefinerType","SingleSelect","Values","child","matchingIndex","criterion","splice","renderConfigure","containerProps","dropdowns","Node","renderConfigureDropdown","dropdown","labelContainerProps","errors","select","quickOrderView","Module","quickOrderProductContent","quickOrderMsgContent","renderForm","SearchResultContainer","sortByDropdownOptions","sortOptions","sortByOptionRelevanceDesc","sortByOptionNameAsc","sortByOptionNameDesc","sortByOptionPriceAsc","sortByOptionPriceDesc","sortByOptionRatingDesc","sortByOptionBestSelling","sortByOptionNewScore","sortByOptionTrendingScore","_pageType","urlTokens","pageType","expandrefinerCount","defaultPageNumber","getCatalogId","_getProductsDimensionsAvailabilities","productsList","listPageState","activeProducts","productsDimensionAvailabilities","getDimensionAvailabilitiesForProductSearchResultAction","DimensionAvailabilitiesForProductSearchResultInput","_getActivePrice","getPriceForProductSearchResult","PriceForProductSearchResultInput","_getSearchResultModal","SearchResultModal","modalCloseButtonText","modalTitle","modalIsOpen","returnRef","_modalToggleRef","onModalToggle","_toggleModal","_getCollectionTitle","collectionTitle","category","SearchResultContainer_1","getFriendlyName","locale","NameTranslations","productCountNumber","productCountText","totalProductCount","numberOfProducts","oneProduct","pageName","toLowerCase","titlePrefix","searchTextPrefix","titleText","titleCount","TitleContainer","_getCategoryHierarchy","categoryHierarchy","CategoryHierarchyContainer","categoryHierarchyList","Link","categoryLinkAriaLabel","Url","categoryHierarchySeparator","Separator","_getSortingDropDown","activeDropdown","_getCurrentlySelectedOption","sortingState","selectedSortByOption","dropdownOptions","_getAllSortByOptions","hideRating","dropdownOption","SortingContainer","sortByDropDown","LabeledDropdown","labelClassname","labelText","sortByDropdownLabel","dropdownId","dropdownClassname","toggleColor","selectedOption","onSelectOption","_updateSortByDropdown","_sortAndFilterContainerRef","_getPagination","getCurrentUrl","currentPageNumber","_getRefineMenu","tempRangeTypeTODO","inputRange","validRefiners","updateRefinerPanel","refiners","refiner","_shouldHideFromRefiners","activeRefiners","activeFilters","_getexpandRefinerCount","expandRefinersCount","expandedRefiners","RefineMenuContainer","RefinerSectionContainer","productRefinerHierarchy","RefineSubmenu","selectedRefinerValues","refineItemCommonProps","_refineItemCommonProps","minValueSliderThumbAriaLabel","maxValueSliderThumbAriaLabel","onUpdateRefiners","_onUpdateRefiners","urlBuilder","_buildRefinerUrl","isDisabled","isExpandedOnInitialLoad","productCountAriaLabel","refineItemAriaLabel","refineItemsAriaLabel","singleProductCountAriaLabel","productListInventoryDisplay","ProductListInventoryFilteringOptions","HideOOS","channelInventoryConfigurationId","_getChoiceSummary","selectedRefiners","ChoiceSummary","clearAllText","choiceSummaryLabel","closeAriaLabel","selectedChoices","refinerHierarchy","choiceFormat","choiceRangeValueFormat","onChoiceClicked","_onChoiceClicked","_buildRefinerUrlForChoiceSummary","choiceAriaLabel","_getProducts","allowBackNavigation","breaCrumbType","breadcrumbType","allowBack","quickviewslot","slots","quickview","isPriceMinMaxFeatureState","ProductSearchResultItems","moduleType","quickviewSlot","isPriceMinMaxEnabled","notification","history","pushState","buildListPageUrl","_getSortColumnFromSelectedOption","transaction","sortingCritera","Columns","option","searchConfiguration","mappedConfiguration","sortColumn","_getSortCriteriaColumn","sortCriteria","queryColumns","parseQueryParam","mappedSearchConfiguration","mappedSearchConfig","activeSortColumn","activeMappedConfig","ColumnName","IsDescending","newRefinementCriteria","clearAll","dropdownElementId","dropdownElement","document","getElementById","focus","selectedChoice","choiceClicked","selectedRefiner","isClearAll","refinerCount","productPrices","pending","placeholderTextMax","minLabel","maxLabel","rangeNameFormat","validationErrorNaN","validationErrorNotNumber","validationErrorRange","validationErrorNotRange","querySorting","sorting","JSON","parse","decodeURIComponent","pageSize","hydrateRefinersFromUrl","GetFullProductsByCollectionInput","Paging","Top","Skip","Sorting","itemId","stringify","Recommendation","recommendation","includeAttributes","getCollectionProducts","productResults","enableAffiliationBasedPricing","refinerInput","RefinersByCollectionInput","getCollectionRefinersAction","featureProduct","listPageStateFeature","nameTranslations","nameTranslation","Language","dimensionsToDisplayOnProductCard","dimensionsInProductCard","dimensionsToDisplayAsSwatch","dimensionsAsSwatchType","DimensionTypes","none","searchProduct","errorText","resultCategoryNotFoundText","resultSearchNotFoundText","productsComponent","featureComponent","FeatureSearchResultItem","searchResultContainerViewProps","TitleViewProps","disableHierarchy","refineMenu","sortByOptions","ProductsContainer","ProductSectionContainer","CategoryNavContainer","RefineAndProductSectionContainer","choiceSummary","modalToggle","ModalToggle","innerRef","searchResultModal","ErrorMessage","FeatureSearchContainer","similarLookProduct","variant","VariantType","Browser","Viewport","OrderSummaryLine","toBeCalculatedText","freeText","cssLabel","_buildOrderSummarySection","_computedLoyaltyAmount","getDeliveryMode","featureSate","pickupDeliveryMode","dM","OrderSummary","SubtotalAmount","TaxAmount","OtherChargeAmount","hasDeliveryMethod","deliveryModes","ShippingChargeAmount","getDeliveryConfiguration","isTaxGreaterThanZero","reactNodes","subtotal","subTotalLabel","tax","taxLabel","orderTotal","orderTotalLabel","otherChargeLabel","shipping","shippingLabel","giftCardAmount","giftCardTotalValue","giftCard","_computeGiftCardAmount","totalAmountAfterGiftCard","loyalty","loyaltyLabel","giftcardLabel","totalDiscounts","totalDiscountsLabel","PickUpInStore","_toggleBOPIS","isBopisSelected","storeSelectorStateManager","storeSelectorModuleId","openDialog","alreadySelectedLocation","onLocationSelected","orgUnitLocation","updateCartLinePickupLocation","cartLineId","locationChangedHandler","_onLocationChangedCallback","ShippingAddress","clearCartLinePickupLocation","_getOrgUnitName","fulfillmentStoreId","foundLocation","toggleBopis","defaultComponent","shipItText","pickupInStoretext","changeStoreText","orgUnitName","bopisSelected","toggleBOPIS","_renderShippingMethod","shipitText","pickUpInStoreText","pickupStore","delivery","_getDeliveryOption","ContainerProps","_assembleNode","foundProductAvailability","foundProductDeliveryOptions","removeButtonText","removeItemClickHandler","moveToWishlistSuccessHandler","addToOrderTemplateButtonText","addToOrderTemplateButtonTooltip","addToOrderTemplateDialogResources","createOrderTemplateDialogResources","itemAddedToOrderTemplateDialogResources","duplicateItemsWhenAddingToOrderTemplateDialogResources","addToWishlistButtonText","removeFromWishlistButtonText","orderTemplates","wishlists","defaultWishlistName","nameOfWishlist","availableQuantityInStock","isStockCheckEnabled","productAvailability","IsProductAvailable","maxQuantityByConfig","isQuantityLimitsFeatureEnabled","maxByQuantityLimitsFeature","maxByQuantityLimitsFeatureResult","_getCartItemMaxQuantity","maxCartlineQuantity","Behavior","MaximumQuantity","shouldSkipStockCheck","ItemTypeValue","ReleasedProductType","Service","finalErrorMessages","productAvailabilites","shouldIgnoreWarehouse","InventLocationId","WarehouseId","includeErrors","outOfStockText","outOfRangeOneText","outOfRangeFormatText","cartlinesErrors","i","LineIndex","DataValidationFailure","ErrorContext","_getErrorMessage","onRemoveClickHandler","onRemoveClickFunction","payload","TelemetryEvent","RemoveFromCart","inventoryLbl","StockLevelLabel","inventoryCode","StockLevelCode","isCustomPriceSelected","getInvoiceDetailsPageUrlSync","cartlineId","updateCartLinesQuantitySuccessHandler","pickUpInStore","pickitUpText","remove","addToWishlist","AddToWishlistComponent","showButtonText","showStatusMessage","showRemoveButton","showButtonTooltip","ariaRole","onSuccess","addToOrderTemplate","AddToOrderTemplateComponent","shouldShowButtonFailedTooltip","disableButton","disableTooltip","assembleCartlines","cartlines","foundProductDeliveryOption","getProductByProductIdAndWarehouse","getProductByProductId","CartLineGroupItems","deliveryType","carLineViewProps","_assembleGroupCartlines","getPromotionData","promotionData","getPromotionOptionsForCartLineItems","PromotionOptionsForCartLineItems","promotionOptions","Cart","Component","_isMounted","promotionPopupId","promotionLinkClick","showPromotionDialog","promotionCloseButtonclick","_hidePromotionDialog","getImageSettings","removeItemFromCartHandler","cartlineToRemove","validateCart","updateCartlineQuantity","cartlineToUpdate","cartLineQuantityUpdatedAsync","cartActionResult","lineUpdateFailure","validationResults","previousState","currentErrors","fulfillmentStoreIdUpdated","getActiveCartProductsAction","ActiveCartProductsInput","isCartValid","getOrderQuantityLimitsFeatureFlag","showAvailablePromotions","guestCheckoutUrl","backToShoppingUrl","checkoutURL","getCheckoutURL","isCartEmpty","_getCartLines","validInventoryAcrossCartLines","validateCartLinesInventory","isValid","RetailMultiplePickupFeatureState","multiplePickUpEnabled","getCartLinesGroup","Checkout","checkoutBySignInAttributes","GuestCheckout","checkoutByGuestAttributes","BackToShopping","backtoShoppingAttributes","cartLineGroup","_updateCartLineErrorForInvalidInventory","cartTitle","CartlinesWrapper","OrderSummaryWrapper","OrderSummaryItems","promoCode","_getPromoCode","_getPromotions","removePromoAriaLabelFormat","orderSummaryHeading","invoiceSummaryTitle","orderSummaryTitle","orderSummaryLineitems","_getOrderSummaryLineItems","invoiceSummaryLineitems","_getInvoiceSummaryLineItems","checkoutAsSignInUserButton","checkoutButtonTitle","checkoutAsGuestButton","guestCheckoutButtonTitle","expressCheckoutButton","paymentExpress","backToShoppingButton","backToShoppingButtonTitle","createTemplateFromCartButton","_displayAddCartToTemplate","SaveCartToOrderTemplateComponent","_generateAddToOrderTemplateDialogResources","linesAddedToOrderTemplateDialogResources","_generateLinesAddedToOrderTemplateDialogResources","createOrderTemplateFromCartButton","createOrderTemplateFromCartButtonTooltip","storeSelector","waitingComponent","cartLoadingStatus","cartLoadingErrorMessage","cartDataResult","isEmpty","OrderSummaryErrors","_getOrderSummaryErrors","RetailB2BEcommerceFeatureState","showPromotionPopup","promotions","promotionLinkText","promotionPopupHeading","onCloseButtonClick","onSeeAllClick","titleId","promotionMessageWrapper","promotionMessage","promotionStringHeading","promotionSeeAllLink","tabIndex","promotionDialog","Modal","ModalHeader","ModalBody","_promotion","Promotion","ModalFooter","cartPromotions","promotionCloseButtonAriaLabel","cartLineInventoryValidationResult","productIdWithErrors","productIdWithError","element","outOfStockErrorMessage","allErrors","fullError","Wrapper","assertive","outOfStockErrorMessageHeader","header","InvoiceSummary","totalAmountLabel","invoiceLabel","itemsWithCountLabel","estimatedShippingLabel","estimatedTaxLabel","yetToBeCalculatedText","PromoCodeComponent","promoCodeHeadingText","promoPlaceholderText","promoCodeApplyButtonText","appliedPromoCodeHeadingText","collapseTimeOut","removePromoText","invalidPromoCodeErrorText","failedToAddPromoCodeErrorText","failedToRemovePromoCodeErrorText","duplicatePromoCodeErrorText","duplicatePromotionErrorText","addToOrderTemplateHeader","noOrderTemplatesMessage","noOrderTemplatesDescription","createAnOrderTemplateButtonText","createNewOrderTemplateButtonText","cancelOrderTemplateCreationButtonText","selectTemplatesText","addToTemplateButtonText","lineItemsText","_generateItemAddedToOrderTemplateDialogResources","viewOrderTemplateButtonText","continueShoppingButtonText","itemAddedToOrderTemplateHeaderItemOneText","itemAddedToOrderTemplateHeaderItemFormatText","itemAddedToOrderTemplateHeaderMessageText","linesAddedToOrderTemplateHeaderItemsOneText","linesAddedToOrderTemplateHeaderItemsFormatText","linesAddedToOrderTemplateHeaderLinesOneText","linesAddedToOrderTemplateHeaderLinesFormatText","linesAddedToOrderTemplateHeaderMessageText","linesAddedToOrderTemplateCustomPriceAlertMessageText","_generateDuplicateItemsWhenAddingToOrderTemplateDialogResources","duplicatedProductsHeader","duplicatedProductsDescription","updateQuantityButtonText","cancelDuplicateItemsButtonText","createOrderTemplateHeader","createOrderTemplateDescription","createOrderTemplateButtonText","cancelNewOrderTemplateCreationButtonText","modules","storeSelectorId","CartLineItems","warehouseAggregation","quantityDisplayText","removeCartButtonText","shipInsteadDisplayText","pickItUpDisplayText","changeStoreDisplayText","errorMessageOutOfRangeOneLeft","errorMessageOutOfRangeFormat","showOutOfStockErrors","addToOrderTemplateMessage","addItemToOrderTemplateError","isAbsoluteUrl","RegExp","test","returnURL","origin","validateCartAsync","featureStatuses","_renderCarousel","carouselContainer","_renderProduct","_renderGrid","gridContainer","ProductContainer","productComponent","ProductCollectionView","ProductCollectionContainer","SingleSlideCarouselComponentProps","GridComponentProps","isCarousel","ProductCollection","handleHeadingChange","validProducts","initProductState","productCollectionProducts","productCollection","equals","_getProduct","trace","reviewCountAriaLabelValue","TotalRatings","ratingCountAriaLabel","ratingCountAriaLabelSingleUser","priceResources","priceRangeSeparator","ProductComponent","ratingAriaLabel","quickViewButton","dimensionAvailabilities","dimensionAvailability","masterProductId","componentDidMount","layout","headingLabel","headingComponent","updatedProducts","getProductData","productCollectionViewProps","SingleSlideCarousel","flipperPrevLabel","flipperNextLabel","parentId","WrappedComponent","_super","_this","states","getModuleStates","updateModuleStates","_a","hasInitialized","isRequired","isCancellable","isSubmitContainer","childIds","validate","isPending","isSkipped","isCancelAllowed","shouldSubmitContainer","hasModuleState","setIsRequired","setIsSubmitContainer","onSkip","onDisable","getModule","getModuleStateManager","getModuleByTypeName","getModuleStateManagerByTypeName","options","__assign","moduleStates","values","_moduleState","source","module","isMatch","allMatched","skipSkippableItem","_validateLeaf","childId","_isPaymentSectionContainer","_validateContainer","enableControl","initializeState","__extends","ModuleState","_renderCartlines","cartEmptyText","renderCartLinesGroupHeader","pickUpText","shippingText","emailShippingText","titleSeparate","renderCartLinesGroupTitle","CartView","errorData","renderModuleAttributes","emailshippingText","emptyCartText","renderCartLinesGroup","invoiceSummaryLines","invoices","_renderInvoiceSummarylines","orderSummaryLines","_renderOrderSummarylines","onApplyHandler","onApplyGiftCard","onChangeNumberHandler","onEnterGiftCardNumber","onChangePinHandler","onEnterGiftCardPin","onChangeExpHandler","onEnterGiftCardExp","getForm","inputRef","inputPinRef","inputExpRef","giftCardNumber","giftCardExp","supportExternalGiftCard","additionalFields","disableAddGiftCard","applyGiftCardButton","giftCardFormLabel","giftCardNumberLabel","giftCardPinLabel","giftCardExpLabel","giftCardAlertLabel","giftCardPinPlaceholderText","giftCardExpPlaceholderText","formProps","inputPinLabel","inputExpLabel","alertFieldLabel","alert","fade","includeAlertClass","inputNumber","inputPin","placeholder","inputExp","applyButton","showGiftCardPinInput","showGiftCardExpInput","inputProps","inputNumProps","inputPinProps","inputExpProps","onRemoveHandler","onRemoveGiftCard","getItem","getFormattedPrice","canRemove","enteredGiftCardLabel","giftCardAvailableBalanceLabel","removeGiftCardButton","balance","CardCurrencyCode","giftCardLast4Digit","selectedGiftCard","itemProps","getList","giftCards","listProps","GiftCardTitle","SupportedGiftCardType","CheckoutGiftCard","isFetchingGiftCard","isEnabled","couldPaidByGiftCard","giftCardSupported","External","shouldBeEnabledForGuest","handleCancelOrSubmit","hasSelectedItem","currencyCode","cultureFormatter","formatCurrency","enterGiftCardNumber","enterGiftCardPin","enterGiftCardExp","removeGiftCard","applyGiftCard","giftCardTypes","getGiftCardTypes","giftCardType","isPinRequired","IsPinRequired","isExpRequired","IsExpirationDateRequired","PaymentMethodId","getGiftCard","addGiftCard","findGiftcardTenderTypes","giftcardType","matchedTenderTypes","Internal","ConnectorId","noBalanceError","invalidCardInfoError","invalidCardTypeError","noCardPinError","noCardExpError","supportedGiftCardType","internalGiftcardTenderTypes","externalGiftcardTenderTypes","Both","month","year","getGiftCardAsync","activeGiftCard","emptyInputError","duplicatedCodeError","invalidCodeError","card","GiftCard","getLoyaltyAmount","getGiftCardTotalAmount","showAdditionalFields","shouldPayGiftCard","moduleClassName","checkoutGiftCardProps","showGiftCard","TitleCompoent","_giftCards","_giftCardExtends","_loyaltyAmount","_guestCheckoutEmail","_isTermsAndConditionAccepted","_customerAccountAmount","CheckoutState","_tokenizedPaymentCard","_tenderLine","_billingAddress","_shippingAddress","_cardPrefix","_loyaltyCardNumber","newTokenizedPaymentCard","newTenderLine","newShippingAddress","newBillingAddress","newCardPrefix","__spreadArrays","newLoyaltyCardNumber","newAmount","newGuestCheckoutEmail","newIsTermsAndConditionAccepted","createSearchResultModal","modalProps","isRecoSearchPage","modal","modalHeader","createModalBody","modalFooter","modalBody","renderSort","renderRefiner","submenu","renderCategoryHierarchy","renderTitle","renderTitleCount","SearchResultContainerView","PromoBannerView","promoBannerProps","closeButton","bannerMessages","promoBannerTextProps","promoBannerLinksProps","carouselProps","promoBannerText","handleLinks","handleText","slides","links","RefineItem","_onClick","selectedRefinementCriterion","anchorType","attrs","isSingleSelect","itemTypeClassName","inputType","SourceValue","Rating","_renderRating","LeftValueBoundLocalizedString","productCount","Count","refineMenuItemAriaLabel","KeyName","_getRefinerUrl","_renderSwatch","toLocaleLowerCase","hasColor","SwatchColorHexCode","hasImage","SwatchImageUrl","swatchItems","checkIfShouldDisplayAsSwatch","colorHexCode","imageUrl","SwatchComponent","isSelectionEnabled","isRefineItem","ratingUserCountAriaLabel","ratingSingleUserCountAriaLabel","refinerRating","ratingRefiner","selectedRating","defaultChkProductCount","ratingComponentClass","productCountAriaLabelValue","RatingComponent","avgRating","ratingCount","hideCount","readOnly","CONTENT","msg","AddLineToTemplate","content","Search","searchTextInput","createRef","addLineButtonRef","_renderSearchForm","searchButtonAriaLabel","searchModalPlaceholderText","autoComplete","_onSearchSubmit","autoFocus","_onInputChange","Loading","_getSearchResults","NotFound","ProductList","_onQuantityChangeHandler","selectedQuantity","_onSelectItem","varianteInput","productVariant","_getProductDimensions","selectedProductDimensions","ProductConfiguration","_onBackButtonClickHandler","_highlightSearchTerm","parsedName","unescape","dangerouslySetInnerHTML","__html","_resultCountText","searchResultsCountVerbage","searchResultsCountSubject","_addItemToTemplateHandler","AddItemToOrderTemplateInput","addItemToOrderTemplate","reloadPage","_toggleModalHandler","onComponentDidMount","onComponentDidUpdate","addLineModalLinkText","backToResultsText","showBackArrow","_renderContent","addToTemplateHandler","onQuantityChangeHandler","highlightSearchTerm","searchForm","productProps","renderResultCountText","Spinner","progressNotificationText","notFoundSearchErrorNotice","notFoundSearchErrorRedediation","NotFoundComponent","searchErrorMessage","searchText","searchCriteriaInput","Context","ChannelId","IncludeAttributes","SearchCondition","searchByCriteriaAsync","Dropdown","selectMenu","_onChanged","selectedIndex","selectId","selectedValue","innerText","dropdownList","dropdownName","selected","OrderTemplateQuantity","_validateMin","minValue","currentInput","_handleChange","glyphMinusClassName","decrementGlyphClass","glyphPlusClassName","incrementGlyphClass","incDisabled","extraClass","getChangeHandler","_onIncrementalChange","onBlur","updatedQuantity","selectedDimensions","_getDimensionsError","dimensionName","dimensionMissingError","_addToTemplateHandler","isBusy","showAddConfirmation","add","addToTemplateDuplicateError","addToTemplateGenericError","_onQuantityChange","totalPrice","_onDimensionChanged","remainingDimensionsErrors","selection","buttonDisabled","dimensionInput","variantDimensions","availabilityInput","priceInput","unitPrice","sort","a","b","addItemToTemplateText","addLineProductUnitPricePrefix","quantitySelectLabel","addLineProductUnitOfMeasurePrefix","totalPriceLabel","_formatPrice","_getDimensionsNodes","_getConfirmationMessage","selectedDimensionNames","addToTemplateConfirmation","unshift","selectProductButtonText","fallBackImg","ProductSelectButton","buttonText","setBusy","getClickHandler","useCallback","removeOrderActionHandler","_removeOrderTemplate","addTemplateToBag","_getOrderTemplateAddToCartDialog","renameTemplate","_getOrderTemplateRenameControl","removeTemplate","RenameOrderTemplateComponent","OrderTemplateLineActions","getAddToBag","getRemoveItem","PopUp","showMobile","setShowMobile","getActionButton","removeButtonClassName","addButtonClassName","onSelectLineHandler","UnitOfMeasure","fallbackImage","selectLine","productImage","_renderProductImage","productInfo","renderProductInfo","_renderPrice","productUnitOfMeasure","productQuantityView","_generateQuantity","addToBagButton","popUp","onChangeHandler","image","_renderProductDimensions","dimensionsLine","componentClassName","getOnChange","checkedLines","scope","AddCheckoutLoyalty","cardNumber","rewardPoints","loyaltyAmountContainer","appliedLoyaltyAmountContainer","loyaltyAmountLabel","loyaltyAmountInput","loyaltyAmountApplyButton","showAppliedAmount","loyaltyAmountAppliedText","loyaltyAmountAppliedPrice","loyaltyAmountRemoveButton","rewardPoint","checkoutLoyaltyRewardPoint","availablePointsText","activePoints","expiringPointsText","expiringPoints","ShowCheckoutLoyalty","coveredAmountText","CheckoutLoyaltyView","checkoutLoyalty","showLoyalty","addLoyalty","isShowLoyalty","isShowAddLoyalty","PickUpAtStoreComponent","EmailDeliveryComponent","LineItemComponent","LineItemGroupComponent","lineItem","LineItemGroupComponentWithMultiplePickUp","LineItemComponentWithMultiplePickUp","PickUpAtStoreComponentWithMultiplePickUp","LineItemsComponent","OrderSummaryComponent","PaymentSummaryComponent","CheckoutView","canShow","checkoutProps","headerProps","hasSalesOrder","bodyProps","mainProps","mainControlProps","sideProps","sideControlFirstProps","sideControlSecondProps","termsAndConditionsProps","orderConfirmation","loading","guidedForm","orderSummary","invoicePaymentSummary","placeOrderButton","termsAndConditions","keepShoppingButton","getInvoicePaymentSummary","isValidationPassed","isPlaceOrderLoading","handleCheckoutHeadingChange","checkoutHeading","cartStatus","isEmptyCart","getSlotItems","triggerPaymentWithPlaceOrder","updateShouldTriggerPaymentWithPlaceOrder","newShouldTriggerPaymentWithPlaceOrder","shouldTriggerPaymentWithPlaceOrder","onPlaceOrder","checkoutOutOfStockErrorMessage","invalidCartVersionErrorMessage","isOverMaxQuantity","hasOrderConfirmation","updateCartLineEmailAddress","placeOrder","updateIsPaymentSectionContainerReady","newIsPaymentSectionContainerReady","emailDeliveryCartLines","lineDeliverySpecifications","DeliverySpecification","DeliveryModeId","DeliveryPreferenceTypeValue","DeliveryPreferenceType","ElectronicDelivery","ElectronicDeliveryEmailAddress","updateLineDeliverySpecificationsAsync","updatedCart","getAvailabilitiesForCartLineItems","ProductAvailabilitiesForCartLineItems","productInventoryInformation","productsThatShouldValidateInventory","cartlineProduct","isStockedItem","IsStockedProduct","productInventory","cartLinesInventoryValidation","getActiveChildModuleStates","onContainerReady","redirectToCartPage","notFoundEditCartLinkMessage","editCartLink","validateForCheckout","retry","validateForCheckoutAsync","ValidationFailuresByCartLines","refreshError","isEditorialMode","params","isEditor","isTermsAndConditionAccepted","isCartReady","isPaymentSectionContainerReady","redirectAdditionalContext","isPaymentVerificationRequired","isPaymentSectionContainerHasError","canPlaceOrder","updateIsPlaceOrderEnabledInRedirection","newIsPlaceOrderEnabledInRedirection","disableGuidedCheckoutFlow","backToShopping","placeOrderText","confirmPaymentText","cookieConsentRequiredMessage","checkoutClass","checkoutInformation","isConsentGiven","cookies","backToShoppingAttributes","checkoutBtnText","hasShippingAddress","hasCartDeliveryMode","hasGuestCheckoutEmail","renderMsdyn365Text","AlertComponent","GuidedFormComponent","resource","getOrderSummary","PlaceOrderButtonComponent","getInventoryLabel","AttributeValues","inventoryAttribute","TextValue","inventoryLabel","swatchItemAriaLabel","closeButtonGlyph","stopPropagation","getAttribute","_getSelectedRefinerChoice","itemClicked","nextItemToFocus","nextSibling","choice","parent","hierarchy","_getKeyForRefinerValue","selectedRefinersMap","clearAllAttributes","overallFormat","rangeFormat","refinerValueName","refinerName","UnitText","textContent","_renderForm","SearchForm","FormWrapper","cancelBtn","submitBtn","_renderKeywordSuggestions","KeywordSuggest","UlKeyword","keywordSuggestions","isLoadingAutoSuggest","isLoadingNode","_renderProductSuggestions","ProductSuggest","UlProduct","productSuggestions","LiProduct","AProduct","thumbnail","_renderCategorySuggestions","CategorySuggest","UlCategory","categorySuggestions","SearchView","AutoSuggestAriaLabel","AutoSuggestAriaLabelText","AutoSuggest","autosuggestCategory","autosuggestKeyword","autosuggestProduct","balanceCheckButton","GiftCardBalanceCheck","_isEnabled","_getFormattedPrice","_enterGiftCardNumber","_clearError","_enterGiftCardPin","_enterGiftCardExp","_setError","_applyGiftCard","_getGiftCardTypes","_getGiftCard","_findGiftcardTenderTypes","giftCardBalanceCheckProps","_onToggleItem","_onToggleSubmenu","isExpanded","expanded","timeout","_renderChildItems","_renderRange","_renderSingleMultiSelect","refinerValuesList","listItems","_getRangeType","DisplayTemplateValue","DisplayTemplate","Range","Slider","SliderWithBars","rangeType","RangeRefineItem","sliderKey","prevState","getCacheKey","getCacheObjectType","dataCacheType","cacheKey","ModuleStatesCacheKey","modalCloseButtonReference","CreateOrderTemplateButton","onCancelHandler","isCreateOrderTemplateDialogOpen","setOrderTemplateNameDialogOpen","onCreateButtonClick","createOrderTemplateText","OrderTemplateNameDialog","isUpdateDialog","setModalOpen","onOrderTemplateCreated","parentElementRef","OrderTemplateList","_reloadPage","_onRemoveFromOrderTemplateList","p","headerStatusMessage","emptyOrderTemplateText","createNewTemplateButtonText","orderTemplatesData","orderTemplateListHeading","orderTemplateListTitle","createOrderTemplateButton","CreateNewTemplateButtonComponent","templateHeaderStatusMessage","OrderTemplates","OrderTemplate","_renderOrderTemplateList","currentTemplateProps","PromoBannerCloseButton","closeButtonAriaLabel","PromoBannerClose","PromoBannerLinks","onTextChange","editableLinks","_mapEditableLinks","linkdata","link","linkText","editableLink","linkUrl","destinationUrl","openInNewTab","onTelemetryClick","PromoBannerText","PromoBanner","animating","isVisible","activeIndex","handleTextChange","handleLinkTextChange","linkIndex","_next","nextIndex","_isLastItem","_goToIndex","_previous","_isFirstItem","dismissEnabled","interval","hideFlipper","autoplay","closeButtonLabel","bannerText","Carousel","previous","onIndicatorsClickHandler","hideIndicator","_formattedPriceReverseLookup","Map","getLabels","sliderId","minPrice","maxPrice","labelId","labelString","labelPositioning","getSliderThumbs","selectedMin","selectedMinPrice","selectedMax","selectedMaxPrice","ariaValueText","_onRangeUpdate","_onRangeUpdateEnd","_handleRangeTooltipText","_changeMin","_changeMax","_finishChangeMin","_finishChangeMax","minInput","maxInput","initialMin","initialMax","String","maxValue","labels","sliderKeyString","sliderThumbs","validationErrorMin","validationErrorMax","touchedMin","touchedMax","componentDidUpdate","previousProps","updateSliderProps","_renderInputFields","_renderSlider","formAttrs","minInputClassName","maxInputClassName","formattedSelectedMin","_getFormattedSelectedValue","formattedSelectedMax","onFocus","ariaAttributes","inForm","step","orientation","showLabels","showTooltip","onChangeEnd","handleTooltipText","_changeValue","selectedKey","touchedKey","_getInputWithoutFormatting","selectedMinValue","minTouched","maxNum","_focus","_validateRange","selectedMaxValue","maxTouched","minNum","touched","validationError","inputAsNum","sliderChangeNotification","eventType","firstThumbValue","secondThumbValue","_focusOnSliderThumb","tooltip","CheckoutAlert","From","SelectedGiftCard","GiftCardList","AddResource","ShowResource","CheckoutGiftCardView","_renderItem","quantityLabel","OrderTemplateLinesView","toggleDetails","wrapClassName","applicationNode","buttonsStates","onPlaceOrderHandler","buttonSetState","CheckoutPlaceOrderButton","setIsBusy","Purchase","showLineItems","orderSummaryProps","modalNode","modalHeaderNode","modalFooterNode","returnFocusRef","zIndex","Form","Item","GiftCardBalanceCheckView","AdressInput","ariaValueMax","ariaValueMin","ariaValueNow","CheckoutLoyaltyLabel","htmlFor","CheckoutLoyaltyText","CheckoutLoyalty","_defaultLoyaltyPoints","loyaltyCard","CardNumber","updateLoyaltyCardId","shouldPayLoyalty","_dialogToggleRef","_applyLoyaltyPoints","_removeLoyaltyPoints","_onBlur","dollarsApplied","maxDollars","isFetchingLoyaltyCard","loyaltyTransactionEstimation","MaxCurrencyValueOfLoyaltyPoints","_updateEstimate","_updateLoyalty","headingTag","loyaltyHeadingText","TextComponent","loyaltyCoveredAmountText","Drawer","toggleButtonText","_drawerHeader","glyphPlacement","RewardPoints","points","_renderPointSection","availablePointsLabel","expiringLoyaltyPointsLabel","LabelComponent","payWithLoyaltyAmountLabel","InputComponent","applyCheckoutLoyaltyPaymentText","removeCheckoutLoyaltyPaymentText","point","RewardPointId","ActivePoints","PointsExpiringSoon","updateLoyaltyAmount","parseFloat","num","channelConfig","loyalPointsRequest","createGetMaxLoyaltyPointsToRedeemForTransactionBalanceInput","_query","callActionOrExecute","GetLoyaltyTransactionEstimationInput","newMaxPoints","isAddDisabled","isRemoveDisabled","addHandler","removeHandler","searchInputAriaLabel","backButtonText","addSelectedToBagButtonText","removeSelectedToBagButtonText","addLineProps","DeliveryOptionList","DeliveryOptionSelected","CheckoutDeliveryOptionsView","productRecordId","featureSimilarDescriptionTitle","featureSimilarLooksTitle","img","imageProps","renderProductPlacementImage","CheckoutGuidedCard","editButtonRef","formCardRef","renderFooder","isVisted","isSubmitting","hasControlGroup","saveAndContinueBtnLabel","canSubmit","canCancel","Save","SaveContinue","saveBtnAttributes","Cancel","cancelBtnAttributes","focusOnFirstFocusableElement","node","querySelector","focusOnEditButton","scrollToTitle","formCard","scrollIntoView","getTitle","Tag","prevProps","isActive","onNext","changeBtnLabel","CheckoutChange","changeBtnAttributes","canEdit","active","closed","visted","hidden","initialized","ready","updating","SearchState","SuggestionType","AutoSuggestInput","top","suggestionType","hitPrefix","hitSuffix","searchQuery","topResultsCount","_getAutoSuggest","autosuggest","searchCriteria","ProductSearchCriteria","HitPrefix","HitSuffix","searchSuggestions","getSearchSuggestionsAsync","ImageUrl","generateImageUrl","AllSearchResults","getSearchSuggestionsActionDataAction","createObservableDataAction","autoSuggestPromises","inputData","CategorySuggestionsComponent","suggestions","autoSuggestProps","categorySuggestionHeading","_renderTitle","categoryAutoSuggestionHeading","shouldShowFullPath","splitValue","pop","_generateLink","_getHighlightedText","suggestion","_getCategoryLink","searchPageURL","searchQsp","searchRefiners","queryUrl","categoryRefiners","Category","encodedRefiner","compressRefiners","formattedText","getRichTextHtml","compressedRefinerKeys","compressedRefiners","compressedRefiner","refinerKey","FormComponent","searchPlaceholder","hideSearchLabel","disableSubmitSearch","handleCancelSearchChange","ariaLabelCancel","ariaLabelSearch","ariaLabelSubmit","inputNode","submitBtnNode","KeywordSuggestionsComponent","formattedLink","searchLabelClass","searchLabelArialLabel","isSearchFormExpanded","searchtext","searchCollapsedLabel","ProductSuggestionsComponent","productSuggestionHeading","productAutoSuggestionHeading","Value3","DecimalValue","_renderThumbnail","_getLiWrapper","_getAWrapper","recid","adjustedPrice","basePrice","_isLoadingNode","loadingText","autoSuggestResultLoadingMessage","size","SpinnerSize","medium","labelPosition","_focusOutTarget","closest","_clearAutoSuggestState","_keyup","keyCode","KeyCodes","Escape","formReference","contains","autoSuggestResultDiv","searchState","defaultBasicSearchUrl","searchQueryStringParameter","createSearchStateInput","getSearchSuggestionsAction","_getSuggestionType","inputSuggestionType","_getSearchRefiners","autoSuggestAriaLabel","_setAutoSuggestResultCount","suggestionTypes","distinctSuggestionTypes","suggestionTypeItem","charAt","toUpperCase","_handleSubmit","searchURL","_appendQueryParams","_handleCancelSearchChange","isInitialState","route","autoSuggestResultScreenReaderDiv","ariaLiveRegion","suggestResultString","autoSuggestFoundMessage","emptyResultString","noAutoSuggestionMessage","searchKeywordSuggestClass","searchProductSuggestClass","searchCategorySuggestClass","searchInputMaxLength","suggestionTypeCriterion","searchFormClass","body","cancelBtnAriaLabel","searchBtnAriaLabel","submitBtnAriaLabel","searchplaceholderText","shouldShowFullCategoryPath","Keyword","ProductsDataActions","getProductSearchRefinersAsync","OrderTemplateListView","_renderOrderTemplate","CheckoutGuidedForm","currentStep","getEnabledModules","getStep","getId","getHeading","currentId","shouldCollapseAfterRedirect","hasMissingInfo","hasOrderError","GuidedCard","InvoiceSummaryLine","_buildPaymentSummarySection","invoiceLines","invoiceLine","InvoiceAmount","InvoiceId","CheckoutStateInput","orderedProducts","redirect","orderConfirmationUrl","updateSalesOrder","newSalesOrder","newOrderedProducts"],"mappings":"iUA6BeA,MAZgF,IAE1F,IAF2F,YAC5FC,GACC,EACD,OAAKA,EAIGC,wBAAMC,UAAU,6CACnBF,GAJM,MCWAG,MAfkF,IAE5F,IAF6F,QAC9FC,GACC,EACD,OAAKA,EAKDH,qBAAGC,UAAU,+CACRE,GALE,MCWAC,MAf8E,IAExF,IAFyF,MAC1FC,GACC,EACD,OAAKA,EAKDL,qBAAGC,UAAU,6CACRI,GALE,MC0CAC,MAjCgF,IAQ1F,IAR2F,UAC5FC,EAD4F,MAE5FC,EAF4F,YAG5FC,EAH4F,aAI5FC,EAJ4F,UAK5FC,EAL4F,iBAM5FC,EAN4F,SAO5FC,GACC,EACD,IAAKL,EACD,OAAO,KAGX,MAAMM,EAAUC,2BAAiB,QAASH,EAAmBI,oBAAkBC,iBACzEC,EAAaC,iCAAuBP,EAAmBE,GAE7D,OACId,uCACIC,UAAU,4CACVmB,QAASb,EAAS,eACJA,EACdc,KAAK,QAAO,eACEZ,EAAW,gBACVC,EAAY,aACfI,EAAQQ,cAAcC,OAASZ,EAA/B,UAA8CA,EAA9C,YAA2DG,EAAQQ,cAAcC,OAAUZ,EACvGH,MAAOA,EACPgB,KAAK,mBACDN,EAAU,CACdL,SAAUA,M,ykBCkCtB,IAAMY,EAAN,cAAsCzB,YA4BlC0B,YAAmBC,GACfC,MAAMD,GA5BU,KAAAE,eAAyB,GAEzB,KAAAC,gBAAoC,GAEpC,KAAAC,WAAqB,EAejC,KAAAC,mCAA8C,EAmHrC,KAAAC,KAAOC,UACpBC,KAAKR,MAAMS,YAAYH,KAAK,CACxBI,OAAQF,KAAKG,kCAA+BC,EAAYJ,KAAKE,OAC7DG,SAAUL,KAAKG,kCAA+BC,EAAYJ,KAAKK,SAC/DC,SAAUN,KAAKG,kCAA+BC,EAAYJ,KAAKM,SAC/DC,OAAqD,qCAA1CP,KAAKR,MAAMgB,OAAOC,0BACzBT,KAAKU,UAAa,WAAa,aAGvCV,KAAKW,iBAAmBX,KAAKY,+BAEvBZ,KAAKa,uBAGE,KAAAH,QAAU,KAAc,MAErC,QADgB,UAAGV,KAAKR,MAAMsB,KAAKC,SAASC,cAA5B,aAAG,EAAiCC,aAAaC,iBAC3ClB,KAAKmB,0BAA0BC,OAAS,GAGjD,KAAAC,qBAAwBC,MACjCA,IACItB,KAAKL,gBAAgB4B,KAAKC,GAAkBA,EAAeC,OAASH,IAO/D,KAAAI,0BAA4B,KACzC,MAAMC,EAAe3B,KAAKL,gBAAgB4B,KAAKC,GAAkBA,EAAeC,OAASzB,KAAKN,gBAC9F,IAAKiC,EAED,OADA3B,KAAKR,MAAMoC,QAAQC,UAAUC,MAAM,kEAC5B,KAGX,MAAM,GAAEC,EAAF,SAAMC,EAAN,QAAgBJ,GAAY5B,KAAKR,OACjC,UAAEyC,GAAcjC,KAAKR,MAAM0C,UAC3BC,EAAQC,IAAIT,EAAc,uBAAwB,GAExD,MAAO,CACHU,eAAgB,CAAEvE,UAAW,iDAC7BF,YAAaC,gBAACyE,EAAoBC,iBAAK,CAAE3E,YAAa+D,EAAaa,eACnEL,MAAOtE,gBAAC4E,iBAAc,CAClBV,GAAIA,EAAIC,SAAUA,EAAUJ,QAASA,EACrC9D,UAAU,sCAAsCgD,KAAM,CAAEqB,MAAO,CAAEO,wBAAyBP,IAAWQ,cAAeV,MAI/G,KAAAW,gBAAkB,KAC/B,MAAM,kBAAEC,GAAsB7C,KAAKR,MAAM0C,UACzC,MAAO,CAEHY,6BAA8B,CAAEC,IAAK,OAAQjF,UAAW,yBAA0BkF,KAAM,QAAS,YAAa,aAC9G9E,MAAOL,gBAACoF,EAAmBV,iBAAK,CAAErE,MAAO2E,KACzC7E,QAASH,gBAACqF,EAAqBX,iBAAK,CAAEvE,QAASgC,KAAKmD,kBAI3C,KAAAC,sBAAwB,KACrC,MAAMC,EAAQrD,KAAKL,gBAAgByB,QAC7B,UAAEa,GAAcjC,KAAKR,MAAM0C,WAC3B,GAAEH,EAAF,SAAMC,EAAN,QAAgBJ,GAAY5B,KAAKR,MAEvC,OAAOQ,KAAKL,gBAAgB2D,IAAI,CAAC9B,EAAgC+B,KACtD,CACHlB,eAAgB,CAAEvE,UAAW,uCAAwCkF,KAAM,YAC3EQ,KAAMhC,EAAeC,MAAQ,GAC7BgC,YACI5F,gBAAC6F,EAAoBnB,iBAEV,CACCnE,UAAWoD,EAAeC,OAASzB,KAAKN,eACxCrB,MAAOmD,EAAeC,KACtBnD,YAAa+E,EACb9E,aAAcgF,EAAQ,EACtB/E,UAAU,GAAD,OAAKgD,EAAegB,aAC7B9D,SAAUsB,KAAK2D,uBACflF,iBAAkBuB,KAAKvB,oBAKvCb,YACIC,gBAACyE,EAAoBC,iBAEV,CACC3E,YAAa4D,EAAegB,eAK5CL,MACItE,gBAAC4E,iBAAc,CACXV,GAAIA,EACJC,SAAUA,EACVJ,QAASA,EACT9D,UAAU,sCACVgD,KAAM,CAAEqB,MAAO,CAAEO,wBAAyBN,IAAIZ,EAAgB,uBAAwB,KACtFmB,cAAeV,QAOlB,KAAA2B,cAAgB,KAC7B,MAAM,aAAEC,EAAe,QAAW7D,KAAKR,MAAM0C,UAC7C,OACIrE,gBAACiG,SAAM,CACHhG,UAAU,yCACVI,MAAO2F,EACPE,MAAM,UACNC,UAAWhE,KAAKN,eAChBuE,QAASjE,KAAKkE,QAEbL,IAKI,KAAAM,cAAgB,KAC7B,MAAM,aAAEC,EAAe,UAAapE,KAAKR,MAAM0C,UAC/C,OACIrE,gBAACiG,SAAM,CACHhG,UAAU,yCACVI,MAAOkG,EACPL,MAAM,UACNE,QAASjE,KAAKE,QAEbkE,IAKI,KAAAC,gBAAkB,KAC/B,MAAM,eAAEC,EAAiB,UAAatE,KAAKR,MAAM0C,UACjD,OACIrE,gBAACiG,SAAM,CACHhG,UAAU,2CACVI,MAAOoG,EACPP,MAAM,YACNE,QAASjE,KAAKK,UAEbiE,IAKI,KAAAC,SAAYpB,IACzBnD,KAAKR,MAAMqC,UAAUC,MAAMqB,GAC3BnD,KAAKR,MAAMS,YAAYuE,aAAY,GACnCxE,KAAKR,MAAMS,YAAYwE,aACvBzE,KAAKmD,aAAeA,GAGP,KAAAuB,WAAa,KAC1B1E,KAAKR,MAAMS,YAAYuE,aAAY,GACnCxE,KAAKmD,kBAAe/C,GAGP,KAAA8D,OAASnE,gBAChBC,KAAKM,YAGE,KAAAJ,OAASH,UAA0B,MAChDC,KAAKyE,mBACL,UAAMzE,KAAKR,MAAMsB,KAAKC,SAASC,cAA/B,aAAM,EAAiC2D,mCAAmC,CAAEC,iCAAiC,MAGhG,KAAAtE,SAAWP,UAA0B,YAC5CC,KAAK6E,gCAAgC7E,KAAKN,sBAChD,UAAMM,KAAKR,MAAMsB,KAAKC,SAASC,cAA/B,aAAM,EAAiC2D,mCAAmC,CAAEC,iCAAiC,MAGhG,KAAAvE,SAAWN,UAExB,MAAM+E,EAAsB9E,KAAKY,yBACP,IAAD,EAArBkE,GACA9E,KAAKN,eAAiBoF,EACtB9E,KAAK+E,gBAEL,UAAM/E,KAAKR,MAAMsB,KAAKC,SAASC,cAA/B,aAAM,EAAiC2D,mCAAmC,CAAEC,iCAAiC,MAE7G5E,KAAKyE,cAII,KAAA7D,uBAAyB,KACtC,MAAMoE,EAAuBhF,KAAKmB,0BAClC,OAAO6D,EAAqB,IAAMA,EAAqB,GAAGC,cAG7C,KAAAJ,gCAAkC9E,UAC/C,GAA8B,KAA1BmF,EAAeC,OACf,OAGJ,MAAM,UAAEjD,GAAclC,KAAKR,MACrB4F,EAAgBpF,KAAKR,MAAMsB,KAAKC,SAASC,OACzCqE,EAAuC,CACzCH,iBACAI,gBAAiBF,EAAcE,gBAC/BC,4BAA6BvF,KAAKH,kCAAoCG,KAAKuF,iCAA8BnF,GAG7GJ,KAAK0E,aACL1E,KAAKwF,kBAECJ,EAAcnE,aAAa4D,gCAAgCQ,GAC5DI,KAAMC,IACqB,WAApBA,EAASnF,OACTP,KAAKuE,SAASrC,EAAUyD,sBAExB3F,KAAK+E,UACL/E,KAAKR,MAAMS,YAAY2F,kBAAiB,MAG/CC,MACG,KACI7F,KAAKuE,SAASrC,EAAUyD,wBAKvB,KAAAxE,wBAA0B,KACvC,MAAM,QAAE2E,GAAY9F,KAAKR,MAAMoC,QACzBmE,EAAyBD,GAAWA,EAAQE,SAAWF,EAAQE,QAAQC,uBACvEC,EAAwBJ,GAAWA,EAAQE,SAAWF,EAAQE,QAAQG,sBAE5E,OAAOnG,KAAKH,mCAAsCG,KAAKR,MAAMsB,KAAKC,SAASC,QAAUhB,KAAKR,MAAMsB,KAAKC,SAASC,OAAOC,aAAamF,KAAKC,WAAc,IAAIC,OACrJC,IAAQ,eAAMA,EAAStB,cAA0C,KAA1BsB,EAAStB,aAAwBsB,EAAStB,gBAAT,UAA0BjF,KAAKuF,mCAA/B,iBAA0B,EAAkCiB,+BAA5D,aAA0B,EAA2DjF,KAAKD,GAAgBA,IAAiBiF,EAAStB,gBAAiBsB,EAAStB,eAAiBiB,EAAyBK,KAC9QvG,KAAKR,MAAMsB,KAAKC,SAASC,QAAUhB,KAAKR,MAAMsB,KAAKC,SAASC,OAAOC,aAAamF,KAAKC,WAAc,IAAIC,OACzGC,GAAcA,EAAStB,cAA0C,KAA1BsB,EAAStB,aAAwBsB,EAAStB,eAAiBc,GAA0BQ,EAAStB,eAAiBiB,EAAyBK,IAItK,KAAAE,mBAAqB1G,UAAkD,MACpF,IAAKC,KAAKR,MAAMsB,KAAKC,SAASC,OAC1B,OAGJ,MAAM,QAAEY,EAAF,UAAWM,EAAX,OAAsB1B,GAAWR,KAAKR,MACtCkH,EAAS,UAAG1G,KAAKR,MAAMsB,KAAKC,SAASC,cAA5B,aAAG,EAAiCC,aAC7C0F,EAAUD,EAAUN,KAAcQ,GAExC,GAAIhF,EAAS,CACT5B,KAAKJ,WAAY,EACjBI,KAAKL,gBAAkB,GACvBK,KAAKN,eAAiB,GACtBM,KAAK0E,aAEL,IAEI,IAAImC,EAA+B,GACnC,MAAMC,EAAoB9G,KAAKmB,0BACzB4F,EAA4BD,GAAqBA,EAAkB1F,OAAS,GAAK0F,EAAkB,GAAG7B,aAC5G,GAAI8B,EAA0B,CAG1BF,EAAuBC,EAAkB,GAAG7B,cAAgB,GAG5D,MAAMmB,EAAOM,EAAUN,WACjBM,EAAUM,kCAAkC,CAAEZ,OAAMa,mCAAoCjH,KAAKuF,8BAIvG,IAAI2B,EACJ,OAAQ1G,EAAO2G,0BACX,IAAI,OACAD,EAAuBE,2BAAyBC,KAChD,MACJ,IAAI,kCACAH,EAAuBE,2BAAyBE,gCAChD,MACJ,QACIJ,EAAuBE,2BAAyBE,gCAExD,MAAM5B,QAAiB6B,kCAAwB,CAC3CC,cAAe5F,EAAQ6F,cACvBC,oBAAqBC,2BAAyBC,qCAAqChG,EAAQ6F,gBAE/Fd,EAAQrB,EAAiB,GAAI4B,GAAsB,GAE/CH,SACM/G,KAAK6E,gCAAgCgC,GAG3CnB,GAAYA,EAAStE,OAAS,IAC9BpB,KAAKL,gBAAkB+F,GAE7B,SACE1F,KAAKuE,SAASrC,EAAUyD,qBAG5B,GAAoC,IAAhC3F,KAAKL,gBAAgByB,OACrBpB,KAAKuE,SAASrC,EAAU2F,8BACrB,GAAI7H,KAAKW,kBAAoBX,KAAKqB,qBAAqBrB,KAAKW,kBAAmB,CAAC,IAAD,EAClFX,KAAKN,eAAiBM,KAAKW,iBAC3BX,KAAKW,sBAAmBP,EACxBJ,KAAK+E,UAGL,UAAA/E,KAAKR,MAAMsB,KAAKC,SAASC,cAAzB,SAAiC8G,0BAA0B,CAAEC,wBAAwB,IAEhF/H,KAAKgI,wCACAhI,KAAKR,MAAMsB,KAAKC,SAASC,OAAO2D,mCAAmC,CAAEC,iCAAiC,QAE7G,CAAC,IAAD,EACH5E,KAAKyE,aACLzE,KAAKN,eAAiBM,KAAKL,gBAAgByB,OAAS,GAAIpB,KAAKL,gBAAgB,GAAG8B,MAAa,GAG7F,UAAAzB,KAAKR,MAAMsB,KAAKC,SAASC,cAAzB,SAAiC8G,0BAA0B,CAAEC,yBAA0B/H,KAAKG,+BAGhGH,KAAKJ,WAAY,IAIR,KAAAqI,yBAA2BlI,UACxC,IAAKC,KAAKR,MAAMsB,KAAKC,SAASC,OAC1B,OAGJ,MAAM,QAAEY,GAAY5B,KAAKR,MACnBkH,EAAY1G,KAAKR,MAAMsB,KAAKC,SAASC,OAAOC,aAElD,GAAIW,EAAS,CACT5B,KAAKJ,WAAY,EACjBI,KAAKL,gBAAkB,GACvBK,KAAKN,eAAiB,GACtBM,KAAK0E,aAEL,IAAImC,EAA+B,GACnC,MAAMC,EAAoB9G,KAAKmB,0BACzB4F,EAA4BD,GAAqBA,EAAkB1F,OAAS,GAAK0F,EAAkB,GAAG7B,aAC5G,GAAI8B,EAA0B,CAG1BF,EAAuBC,EAAkB,GAAG7B,cAAgB,GAG5D,MAAMmB,EAAOM,EAAUN,WACjBM,EAAUM,kCAAkC,CAAEZ,OAAMa,mCAAoCjH,KAAKuF,8BAC/FwB,SACM/G,KAAK6E,gCAAgCgC,GAIvB,IAAD,EAA3B,GAAI7G,KAAKW,iBACLX,KAAKN,eAAiBM,KAAKW,iBAC3BX,KAAKW,sBAAmBP,EACxBJ,KAAK+E,UAGL,UAAA/E,KAAKR,MAAMsB,KAAKC,SAASC,cAAzB,SAAiC8G,0BAA0B,CAAEC,wBAAwB,IAEhF/H,KAAKgI,wCACAhI,KAAKR,MAAMsB,KAAKC,SAASC,OAAO2D,mCAAmC,CAAEC,iCAAiC,IAIpH5E,KAAKJ,WAAY,IAIR,KAAAiB,oBAAsBd,UAA0B,QAC7D,MAAMuF,EAAe,UAAGtF,KAAKR,MAAMsB,KAAKC,SAASC,cAA5B,aAAG,EAAiCsE,gBACnD4C,EAAwB,UAAGlI,KAAKR,MAAMsB,KAAKC,SAASC,cAA5B,aAAG,EAAiCkH,yBAE9DlI,KAAKU,WAAa4E,MACbtF,KAAKgI,kCAAoChI,KAAKG,8BAAgC+H,UACzElI,KAAKyG,mBAAmBnB,GAG9BtF,KAAKgI,wCACChI,KAAKiI,4BAGXjI,KAAKG,8BAAgC+H,IACrClI,KAAKM,aAKA,KAAAqD,uBAA0BwE,IACvC,MAAMjD,EAAiBiD,EAAMC,cAAc/J,MAC3C2B,KAAKN,eAAiBwF,GAGT,KAAAH,QAAU,KACyB,qCAA1C/E,KAAKR,MAAMgB,OAAOC,0BACpBT,KAAKR,MAAMS,YAAY8E,WAId,KAAAN,WAAa,KACsB,qCAA1CzE,KAAKR,MAAMgB,OAAOC,0BACpBT,KAAKR,MAAMS,YAAYwE,cAId,KAAAe,UAAY,KACpBxF,KAAKG,8BACNH,KAAKR,MAAMS,YAAYuF,aA9f3BxF,KAAKvB,iBAAmB4J,6BAAmBrI,KAAKR,MAAMoC,QAAQkE,QAAQwC,kBAAoBtI,KAAKR,MAAM+I,aAAcvI,KAAKR,MAAMqC,WAC9H7B,KAAKG,6BAA+BH,KAAKR,MAAMgB,OAAOC,0BACR,SAA1CT,KAAKR,MAAMgB,OAAOC,yBAvBO,kBAC7B,MAAgF,aAAxET,KAAKR,MAAMsB,KAAKC,SAASC,QAAUhB,KAAKR,MAAMsB,KAAKC,SAASR,QAGlB,uCAClD,MAAM,gBAAEiI,EAAF,MAAmBC,GAAUzI,KAAKR,MAAMoC,QAAQkE,QACtD,SAAW0C,IAAmBC,GAAsB,MAAbA,EAAMC,IAoBnB,0BAC1BC,YACI,IAAM3I,KAAK4I,YACX7I,gBACUC,KAAKF,SAInB+I,YACI,4BAAM7I,KAAKR,MAAMsB,KAAKC,SAASC,cAA/B,aAAM,EAAiCsE,iBACvCvF,UAAW,YACDC,KAAKa,sBACXb,KAAKR,MAAMS,YAAY2F,kBAAiB,SAExC,UAAM5F,KAAKR,MAAMsB,KAAKC,SAASC,cAA/B,aAAM,EAAiC2D,mCAAmC,CAAEC,iCAAiC,OAIrHiE,YACI,4BAAM7I,KAAKR,MAAMsB,KAAKC,SAASC,cAA/B,aAAM,EAAiCkH,0BACvCnI,UACqD,IAAD,EAA5CmI,GAA4BlI,KAAKU,kBAC3BV,KAAKa,sBACXb,KAAKR,MAAMS,YAAY2F,kBAAiB,SAExC,UAAM5F,KAAKR,MAAMsB,KAAKC,SAASC,cAA/B,aAAM,EAAiC2D,mCAAmC,CAAEC,iCAAiC,QAMtHkE,sBAAsBC,EACzBC,GACA,OAAIhJ,KAAKiJ,QAAUD,GAAahJ,KAAKR,MAAMsB,OAASiI,EAAUjI,KAM3DoI,SAAM,YACT,IAAKlJ,KAAKU,UAEN,OADAV,KAAKR,MAAMoC,QAAQC,UAAUC,MAAM,kEAC5B,KAGX,MACI7B,aAAa,QAAEkJ,EAAF,WAAWC,EAAX,SAAuBC,IACpCrJ,KAAKR,MACH8J,GAAWtJ,KAAKJ,WAAayJ,EAC7BE,GAAcvJ,KAAKJ,YAAcyJ,GAAYD,IAAepJ,KAAKG,6BACjEqJ,GAAkBxJ,KAAKJ,YAAcyJ,GAAYF,EAEvDnJ,KAAKuF,4BAAL,UAAmCvF,KAAKR,MAAMsB,KAAKyE,mCAAnD,aAAmC,EAA6CvE,OAChFhB,KAAKH,kCAAL,UAAyCG,KAAKR,MAAMsB,KAAK2I,oBAAzD,iBAAyC,EAA8BzI,cAAvE,iBAAyC,EACnCO,KAAKmI,GAH2B,oEAGhBA,EAAQC,aAD9B,aAAyC,EAC8BC,UAEvE,MAAM,wBAAEC,GAA4B7J,KAAKR,MAAM0C,UAEzC4H,EAAS,OACR9J,KAAKR,OADG,IAEXmE,uBAAwB3D,KAAK2D,uBAC7BjE,eAAgBM,KAAKN,eACrBqK,oBAAqB/J,KAAKL,gBAC1BC,UAAWI,KAAKJ,UAChBoK,iBAAkBhK,KAAKmD,aACvB8G,UAAW,CACPrK,UAAWI,KAAKJ,UAChB0J,UACAC,aACAC,iBACAU,iBAAkBX,IAAevJ,KAAKR,MAAMS,YAAYkK,uBACxDC,iBAAkBZ,IAAmBxJ,KAAKR,MAAMS,YAAYkK,uBAC5DE,mBAAoBd,IAAevJ,KAAKR,MAAMS,YAAYkK,0BAA4BnK,KAAKY,0BAE/FtB,wBAAyB,CACrBgL,YAAatK,KAAKR,MAClB1B,UAAWyM,IAAU,+BAAgCvK,KAAKR,MAAMgB,OAAO1C,YAE3E6B,gBAAiB,CACb6K,oBAAqB,CACjB1M,UAAW,qCACXkF,KAAM,OACN,aAAc6G,GAClBY,KAAMzK,KAAKoD,yBAEfsH,uBAAwB1K,KAAK0B,4BAC7ByB,aAAcnD,KAAK4C,kBACnB+H,QAAS9M,gBAAC+M,UAAO,MACjBC,WAAY7K,KAAK4D,gBACjBkH,WAAY9K,KAAKmE,gBACjB4G,aAAc/K,KAAKqE,kBACnBH,OAAQlE,KAAKkE,OACbhE,OAAQF,KAAKE,OACbG,SAAUL,KAAKK,WAGnB,OAAOL,KAAKR,MAAMwL,WAAWlB,KAlIrBmB,aAAXC,KAAW,qCAEAD,aAAXC,KAAW,sCAEAD,aAAXC,KAAW,gCAEAD,aAAXC,KAAW,mCAEFD,aAATE,KAAS,gCAIAF,aAATE,KAAS,qDA0HVF,aADCG,KACD,2BAvIE9L,EAAuB,aAF5B+L,kBACAC,KACKhM,GAiiBSA,a,qRClkBR,MAAMiM,EAAe,CAACC,EAAsC/M,KAAgE,QAC/H,MAAMsH,EAAyB3D,IAAIoJ,EAAO,kDACpCtF,EAAwB9D,IAAIoJ,EAAO,kDAEnC,4BAAEjG,EAAF,aAA+BkE,GAAiB+B,EAAM1K,KACtDjB,EAAoC4J,SAAH,UAAGA,EAAczI,cAAjB,iBAAG,EAAsBO,KAAKmI,GAF/B,oEAE0CA,EAAQC,aAAjD,aAAG,EAAuFC,UAE3H6B,EAAwBlF,IAC1B,MAAMmF,EAAmBtJ,IAAIoJ,EAAO,gCACpC,IAAKjF,EAASoF,qBAAuBD,EACjC,MAAO,GAGX,MAAME,GAAiBF,GAAoB,IAAInK,KAAMsK,GAC1CA,EAASC,gBAAkBvF,EAASoF,oBAG/C,OAAOC,GAAiBA,EAAcG,aAUpCC,EAAyBzF,IAC3B,MAAM0F,EAAU1F,EAAS2F,YARRC,EAQiC5F,EAAS2F,WAP1C9J,IAAIoJ,EAAO,yBAA2B,IACvCjK,KAAM6K,GACXD,IAAcC,EAASC,WAHjBF,MASjB,MAAM,GACFpK,EADE,SAEFC,EAFE,QAGFJ,EACApB,QAAQ,cAAE8L,EAAF,gCAAiBC,GACzBrK,WAAW,sBACPsK,EADO,0BAEPC,EAFO,yBAGPC,EAHO,0BAIPC,EAJO,2BAKPC,EALO,aAMPC,EANO,uBAOPC,EAPO,mBAQPC,EARO,gBASPC,GAEJpL,SACIkE,SAAS,aAAEmH,KAEfzB,EAEJ,IAAKS,EACD,OAGJ,IAAIiB,EAAaC,4BAAkBlB,EAASrK,EAAQ6F,mBAAerH,GACnE,GAAIgN,IAASC,UAAW,CAAC,IAAD,EACpB,MAAMC,EAAU,IAAIC,IAAIL,EAAYM,OAAO3B,SAAS4B,MACpDH,EAAQI,aAAaC,IAAI,YAAzB,oBAAyCpH,EAASqH,iBAAlD,QAA+D,IAC/DV,EAAaI,EAAQG,KAGzB,OACI5P,gBAACgQ,wBAAqB,CAClB9L,GAAIA,EACJC,SAAUA,EACVJ,QAASA,EACTM,UAAW,CACP4L,WAAYpB,EACZqB,YAAatB,EACbuB,YAAarB,EACbsB,aAAcrB,EACdJ,wBACAK,eACAC,yBACAC,qBACAmB,kBAAmB,GACnBC,iBAAkB,GAClBC,oBAAqBpB,GAEzBqB,oBAAoB,EACpB/B,cAAeA,EACfW,aAAcA,EACdC,WAAYA,EACZoB,gBAAiBrC,EAAQsC,gBACzBzN,KAAM,CACFyF,WACA0F,WAEJM,gCAAiCA,EACjC9N,iBAAkBA,EAClB8G,4BAA6BA,aAAF,EAAEA,EAA6BvE,UAKhEwN,EAA+BC,IACjC,MACIvM,WAAW,8BAAEwM,IACblD,EAEJ,MAAO,CACHmD,cAAe,CAAE7Q,UAAW,iCAC5B8Q,MAAO/Q,wBAAMC,UAAU,4BAClB4Q,GAEL7C,SAAUhO,uBAAKC,UAAU,+BACpB2Q,KAKPI,EAA8B,KAChC,MACI3M,WAAW,kBAAE4M,IACbtD,EAEJ,MAAO,CACHuD,cAAe,CAAEjR,UAAW,+BAC5B8Q,MAAO/Q,wBAAMC,UAAU,4BAClBgR,KAKPE,EAA2BC,GACtBA,EAAM3L,IAAIiD,IACb,MAAMkI,EAAyBhD,EAAqBlF,GAC9C2I,EAAWC,EAAyB5I,GACpC6I,KAAmB7I,EAAStB,cAA0C,KAA1BsB,EAAStB,eAAuBsB,EAAStB,eAAiBiB,EAC5G,MAAO,CACHmJ,OAAQ9I,EAAS8I,QAAU,GAC3BC,SAAU,CAAExR,UAAW,0BACvByR,KAAMvD,EAAsBzF,GAC5BiJ,cAAeN,EAAWV,EAA4BC,QAA0BrO,EAChFqP,cAAeL,EAAkBP,SAAgCzO,KAKvE+O,EAA4BO,IAAmC,QACjE,OAASC,mBAAiBC,mBAAmBF,EAAazK,gBAAkBpF,EAAoC6P,EAAazK,gBAAiBM,SAA9B,UAA8BA,EAA6BvE,cAA3D,iBAA8B,EAAqCwF,+BAAnE,aAA8B,EAA8DjF,KAAKD,GAAgBA,IAAiBoO,EAAazK,eAAiByK,EAAazK,eAAiBc,IA4B5S8J,EAAeZ,GACVA,EAAMa,OAAO,CAACzM,EAAOkM,IACjBlM,GAASkM,EAAKQ,UAAY,GAElC,GAGDC,EAA8B9Q,IAChC,MAAMkH,EAAOhE,IAAIoJ,EAAO,0CACxB,MAAa,SAATtM,EACOkH,EAAKC,UAAUC,OAClBC,IAAyBA,SAAStB,cAA0C,KAA1BsB,EAAStB,cApCrCyK,EAoCsFnJ,GAnC3GoJ,mBAAiBC,mBAAmBF,EAAazK,gBAAkBpF,EAAoC6P,EAAazK,gBAAiBM,SAA9B,UAA8BA,EAA6BvE,cAA3D,iBAA8B,EAAqCwF,+BAAnE,aAA8B,EAA8DjF,KAAKD,GAAgBA,IAAiBoO,EAAazK,eAAiByK,EAAazK,eAAiBc,IAmC7KQ,EAAStB,eAAiBiB,GAAyBK,EApCtJmJ,MAAmC,MAsC7C,WAATxQ,EACAkH,EAAKC,UAAUC,OAAQC,GAAyBA,EAAStB,cAA0C,KAA1BsB,EAAStB,aAAwBkK,EAAyB5I,GAAa,MAGpJH,EAAKC,UAAUC,OAAQC,GAAuBA,EAAStB,eAAiBiB,IAI7E+J,EAA+B/Q,IACjC,KAAgC,KAA3B6G,QAA4D3F,IAA3B2F,GAAmD,WAAT7G,GAA8B,UAATA,GACjG,OAGJ,MAAM+P,EAAQe,EAA2B9Q,GAEzC,GAAqB,IAAjB+P,EAAM7N,OACN,OAGJ,MACMlD,EAtDsB,EAACmF,EAAenE,KAA8B,MAC1E,MACIgD,WAAW,UACPgO,EADO,WAEPC,EAFO,mBAGPC,EAHO,8BAIPC,IAEJ7E,EAEJ,IAAI8E,EAAgC,GAEpC,UAAA9E,EAAM1K,KAAKnB,gBAAgBqB,cAA3B,SAAmCO,KAAKgP,IAAyB,QAC7DD,EAAwBA,IAAqB,UAA2BC,EAAuBzR,uBAAlD,iBAA2B,EAAwCyC,KAAKC,GAAkBA,EAAeC,OAASyE,UAAlH,aAA2B,EAA+G1D,eAG3L,MAAMgO,EAASnN,EAAQ,EAAI8M,EAAaD,EAExC,OADuB,SAAThR,EAAkBmR,EAA0C,WAATnR,EAAoBkR,EAApB,UAA4CE,EAA5C,aAAsEjN,EAAtE,YAA+EmN,EAA/E,MACpDC,QAAQ,UAAWpN,EAAMqN,YAAYD,QAAQ,WAAYD,IAoCxDG,CADAd,EAAYZ,GACmB/P,GAE7C,MAAO,CACH0R,sBAAuB,CAAE9S,UAAW+S,IAAW,yCAA0C3R,IACzF4R,aAAc,CAAEhT,UAAW,gCAC3BiT,QAASlT,uBAAKC,UAAU,uCACnBI,GAEL8S,UAAWhC,EAAwBC,KAkDrCgC,EAA+B9I,IACjC,MACI3H,QAAQ,iBAAE0Q,IACV1F,EACJ0F,EAAkBC,KAAOhJ,EAAMiJ,OAAO/S,OAsDpCgT,EAAoD,KACtD,GAA+B,KAA3BtL,QAA4D3F,IAA3B2F,EACjC,OAGJ,MACI7D,WAAW,oBACPoP,EADO,cAEPC,IAEJ/F,EAEEyD,EAtC+B,MACrC,MAAM7I,EAAOhE,IAAIoJ,EAAO,0CAClBgG,EAAyBvC,GAAsBwC,IAAQxC,EAAOM,GAAQA,EAAK5D,oBAE3E+F,GADsBzC,EACa7I,EAAKC,UADIoL,IAAQxC,EAAOM,GAASA,EAAKtK,eAAnDgK,MAE5B,MAAM0C,EAA6B,GAC7BC,EAA6B,GAiBnC,OAdArP,OAAOsP,QAAQH,GAAeI,QAAQ,IAAwC,IAAtCxQ,EAAcyQ,GAAwB,EAE1EL,EAAcpQ,GAAgBkQ,EAAsBO,GACpDJ,EAAeK,KAAKR,EAAsBO,MAG9CxP,OAAO0P,KAAKN,GAAgBG,QAAQI,IAChC,MAAMC,EAAYR,EAAeO,GACjC3P,OAAO0P,KAAKE,GAAWL,QAAQvO,IAC3B,MAAMgD,EAAW4L,EAAU5O,GAC3BqO,EAAaI,KAAKzL,OAInBqL,GAeOQ,GAEd,GAAqB,IAAjBnD,EAAM7N,OACN,OAGJ,MAAMiR,EAAkD,GAuBxD,OAtBApD,EAAM3L,IAAIiM,IACN,MAAMlM,EAAQwM,EAAYN,GACpBhJ,EAAWgJ,EAAK,GAChBd,EAAyBhD,EAAqBlF,GAC9CrH,EAAqBqH,EAASoF,oBAAsBpF,EAAStB,aAAe,SAA4C,KAAhCsB,EAASoF,oBAA6BpF,EAAStB,eAAiBiB,EAAwB,QAAU,OAC1LhI,EA3EoC,EAACmF,EAAenE,EAAoBoC,EAAuBgR,KAAuC,QAChJ,MACIpQ,WAAW,UACPgO,EADO,WAEPC,IAEJ3E,EAEJ,IAAI8E,EAAgC,GAChCiC,EAAiC,GAErC,UAAA/G,EAAM1K,KAAKnB,gBAAgBqB,cAA3B,SAAmCO,KAAKgP,IAAyB,QAC7DD,EAAwBA,IAAqB,UAA2BC,EAAuBzR,uBAAlD,iBAA2B,EAAwCyC,KAAKC,GAAkBA,EAAeC,OAASyE,UAAlH,aAA2B,EAA+G1D,eAG3L,UAAAgJ,EAAM1K,KAAKnB,gBAAgBqB,cAA3B,SAAmCO,KAAKgP,IAAyB,QAC7DgC,EAAyBA,IAAsB,UAA4BhC,EAAuBzR,uBAAnD,iBAA4B,EAAwCyC,KAAKC,GAAkBA,EAAeC,OAASH,UAAnH,aAA4B,EAAsGkB,eAGrL,MAAMgQ,EAAW,UAAcD,EAAd,aAAyCD,GACpD9B,EAASnN,EAAQ,EAAI8M,EAAaD,EAExC,OADuB,SAAThR,EAAA,WAAsBmE,EAAtB,YAA+BmN,EAA/B,KAAqD,WAATtR,EAAA,UAAuBsT,EAAvB,aAAuCnP,EAAvC,YAAgDmN,EAAhD,eAA+DF,EAA/D,aAAyFjN,EAAzF,YAAkGmN,EAAlG,MAC7CC,QAAQ,UAAWpN,EAAMqN,YAAYD,QAAQ,WAAYD,IAqDpDiC,CAA0CpP,EAAOnE,EAAMqH,EAAStB,aAAcwJ,GACtFiE,EAAsB,WAATxT,EAAoBoS,EAAgC,SAATpS,EAAkBqS,EAAgB,QAC1FoB,EAAS,8DAA0DzT,EAA1D,QACfmT,EAAsBL,KAAK,CACvBpB,sBAAuB,CAAE9S,UAAW+S,IAAW,yDAA0D3R,IACzG4R,aAAc,CAAEhT,UAAW,gCAC3B8U,mBAAoB/U,uBAAKC,UAAW6U,IACpCE,eAAgBhV,uBAAKC,UAAU,+DAC1B4U,GAEL3B,QAASlT,uBAAKC,UAAU,kEACnBI,GAEL8S,UAAWhC,EAAwBO,OAIpC8C,GAGX,MApJsB,MAClB,MAAM,QACFzQ,EACApB,QAAQ,iBAAE0Q,GACVpQ,MAAM,SAAEgS,GACR5Q,WAAW,aAAE6Q,IACbvH,EAEE7M,EAAUC,2BAAiB,QAASH,EAAmBI,oBAAkBmU,UACzEC,EAAYjU,iCAAuBP,EAAmBE,GACtDyH,EAAOhE,IAAIoJ,EAAO,0CAClB0H,EAAarT,EAAoC,2BAA6B,GACpF,GAAKuG,GAASA,EAAKC,WAAuC,IAA1BD,EAAKC,UAAUjF,QAAiB0R,EAIhE,MAAO,CACHK,UAAW,CAAErV,UAAU,0BAAD,OAA4BoV,IAClDE,OAAQ,CAAEtV,UAAW,kCACrBiT,QAASG,GAAoBA,EAAiBC,MAC1CtT,gBAACwV,IAAa9Q,eACVzE,UAAU,mCACNoT,EAAgB,CACpBnO,IAAKmO,EAAiBnO,KAAO,KAC7BoO,KAAMD,EAAiBC,KACvBmC,UAAW,CAAEpT,OAAQ+Q,EAA6BsC,eAAgB3R,EAAQkE,YAGlF0N,SACI3V,gBAACiG,SAAMvB,eACHzE,UAAU,yCACVI,MAAO6U,EACPhP,MAAM,OACN0J,KAAM4F,IAAoB,OAAQzR,EAAQ6F,gBAAkB,IACxDwL,GAEHF,GAGTU,eAAgBxD,EAA4B,UAC5CyD,aAAczD,EAA4B,QAC1C0D,cAAe1D,EAA4B,SAC3C2D,iCAAkC/T,EAAoCwR,SAAsDjR,IA0G7HyT,K,ygBC9YI,MAAMC,UAAyBjW,YAW1C0B,YAAYC,GACRC,MAAMD,GACNQ,KAAK+T,QAAU/T,KAAK+T,QAAQC,KAAKhU,MACjCA,KAAKiU,mBAAoB,EACzBjU,KAAKiJ,MAAQ,CAAEiL,OAAS1U,EAAM2U,eAAiB3U,EAAM2U,cAAcD,SAAW,GAC9ElU,KAAKoU,iBAAmBvD,IAAW,gBAC/B7Q,KAAKR,MAAM6U,qBAAuBrU,KAAKR,MAAM6U,qBAAuB,IAEpErU,KAAKR,MAAM8U,cACXtU,KAAKuU,gBAAkB1D,IAAW7Q,KAAKoU,iBACnCpU,KAAKR,MAAMgV,UAAYxU,KAAKR,MAAMgV,UAAaxU,KAAKR,MAAMiV,WAAazU,KAAKR,MAAMiV,WAAa,IACnGzU,KAAK0U,iBAAmB1U,KAAKuU,kBAE7BvU,KAAKuU,gBAAkB1D,IAAW7Q,KAAKoU,iBACnCpU,KAAKR,MAAMgV,UAAYxU,KAAKR,MAAMgV,UAAY,IAClDxU,KAAK0U,iBAAmB7D,IAAW7Q,KAAKoU,iBACpCpU,KAAKR,MAAMiV,WAAazU,KAAKR,MAAMiV,WAAa,KAIrD3L,sBAAsBC,EACzBC,GACA,OAAIhJ,KAAKiJ,QAAUD,GAAahJ,KAAKR,QAAUuJ,EAM5CG,SACH,MAAMiL,E,yWAAa,IAAQnU,KAAKR,MAAM2U,oBAGT/T,IAAzB+T,EAAcD,QAAwBlU,KAAKiU,kBAC3CE,EAAcD,OAASlU,KAAKiJ,MAAMiL,OAElClU,KAAKiJ,MAAMiL,OAASC,EAAcD,OAEtCC,EAAcQ,SAAW3U,KAAKR,MAAMmV,SACpC,MAAMC,EAAc/D,IAAW,SAAU7Q,KAAKR,MAAM1B,UAAYkC,KAAKR,MAAM1B,UAAY,IAEvF,OADAkC,KAAKiU,mBAAoB,EAErBpW,uBAAKC,UAAW8W,GACZ/W,gBAACiG,SAAMvB,iBACCvC,KAAKR,MAAMqV,kBAAiB,CAChC5Q,QAASjE,KAAK+T,QAAO,gBACNI,EAAcD,OAC7BY,OAAK,EACL9Q,SAAUhE,KAAKR,MAAMwE,SACrBlG,UAAU,iBACViG,MAAM,cAEL/D,KAAK+U,iCAAiCZ,EAAcD,SAEzDrW,gBAACmX,WAAQzS,iBAAK4R,KAKlBY,iCAAiCE,GACrC,MAAMC,EAAwBrE,IAAW,qBAAsB7Q,KAAKR,MAAM2V,sBAAwBnV,KAAKR,MAAM2V,sBAAwB,IACrI,OACItX,gCACIA,sBAAIC,UAAW+S,IAAWqE,EAAuB,oCAC5ClV,KAAKR,MAAM4V,mBAEhBvX,wBAAMC,UAAW+S,IAAWqE,EAAuB,wCAC9ClV,KAAKR,MAAM6V,uBAEfrV,KAAKsV,qBAAqB,qBAAsBL,IAKrDK,qBAAqBzJ,EAAkBoJ,GAC3C,IAAIM,EAAaN,EAAgBjV,KAAKuU,gBAAkBvU,KAAK0U,iBAE7D,OADAa,EAAU,UAAMA,EAAN,YAAoB1J,GAE1BhO,wBAAMC,UAAWyX,IAIjBxB,QAAQyB,GACZA,EAAEC,iBACFzV,KAAK0V,SAAS,CAAExB,QAASlU,KAAKiJ,MAAMiL,SACpClU,KAAKiU,mBAAoB,EACrBjU,KAAKR,MAAMmW,UACX3V,KAAKR,MAAMmW,SAAS3V,KAAKiJ,QClFrC,MAaa2M,EAA2BpW,IACpC,MAAM,iBACFqW,EADE,kBAEFC,EAFE,gBAGFC,EAHE,SAIFC,EAJE,YAKFC,EALE,iBAMFC,EANE,kBAOFC,EAPE,iBAQFC,EARE,mBASFC,EATE,qBAUFC,EAVE,kBAWFC,EAXE,qBAYFC,GACAhX,EAEEiX,EA7BqBF,IAAgDpO,IAC3EoO,EAAkBpO,EAAMiJ,OAAO/S,OAAS,KA4BlBqY,CAAsBH,GAEtCI,EAtBwBL,IAAmDnO,IACjFmO,EAAqBnO,EAAMiJ,OAAO/S,OAAS,KAqBbuY,CAAyBN,GAEjDO,EACFhZ,uBAAKC,UAAU,6CACXD,sBAAIC,UAAU,kDAAiD,aAAasY,GACvEA,GAELvY,yBACIC,UAAU,kDACVoB,KAAK,OAAM,aACCkX,EACZU,IAAKjB,EACLnX,SAAU+X,KAKhBM,EACFlZ,uBAAKC,UAAU,8CACXD,sBAAIC,UAAU,mDAAkD,aAAaqY,GACxEA,GAELtY,yBACIC,UAAU,mDACVkZ,QAAQ,SACRF,IAAKhB,EACLpX,SAAUiY,EACVM,UAAWjB,EACX9W,KAAK,SAAQ,YACH,SAAQ,aACNiX,EAAiB,gBACd,EAAC,gBACDF,EAAW,gBACXF,EAAgBmB,YAwB3C,MAAO,CACHjL,QAAS4K,EACTM,aApBAtZ,uBAAKC,UAAU,+CACXD,gBAACiG,SAAM,CACHhG,UAAU,qDAAqDkG,SAAUkS,EAAgB,aAAcG,EACvGpS,QAASuS,GACRH,IAiBTa,SAAUH,EACVK,YAboBrB,GAAmBA,EAAgBsB,aACvDxZ,gBAACyZ,QAAK,CAACvT,MAAOgS,EAAgBsB,aAAaE,gBAAiBrD,OAAQ6B,EAAgBsB,aAAanD,QAC7FrW,wBAAMC,UAAWiY,EAAgBsB,aAAaG,eAC9C3Z,4BACKkY,EAAgBsB,aAAaI,mBAGtCrX,IChHD,MAAMsX,EAQTnY,YAAmBgH,EAAoBoR,GACnC3X,KAAKuG,SAAWA,EAChBvG,KAAK2X,cAAgBA,EACrB3X,KAAK4X,YAAa,GATtB3M,aADCC,KACD,iC,gBC+BJ,MAAM2M,EAAgFrY,IAClF,MAAM,UAAE0C,GAAc1C,EAChBsY,EAAyB,UAAMtY,EAAM1B,UAAZ,6BAC/B,OACID,oCACIA,4BACIA,0BAAMC,UAAW+S,IAAW,GAAD,OAAIrR,EAAM1B,UAAV,qBAE/BD,4BACKqE,EAAU6V,6BAEfla,4BACKqE,EAAU8V,uBAEfna,wBAAIC,UAAWga,GACV5V,EAAU+V,yBAEfpa,4BACKqE,EAAUgW,6BAEfra,wBAAIC,UAAWga,GACV5V,EAAUiW,wBAEfta,wBAAIC,UAAWga,GACV5V,EAAUkW,qBAEfva,4BACKqE,EAAUmW,yBAWrBC,EAA+E9Y,IACjF,MAAM,UAAE0C,GAAc1C,EACtB,OACI3B,oCACIA,wBAAIC,UAAW+S,IAAW,GAAD,OAAIrR,EAAM1B,UAAV,oBACzBD,4BACKqE,EAAU6V,6BAEfla,+BAUC0a,EAAyE/Y,IAClF,MAAMgZ,EAAY,UAAMhZ,EAAM1B,UAAZ,SAElB,IAAI2a,EAOJ,OALIA,EADAjZ,EAAMkZ,SACS7a,kBAACya,EAAoC/V,iBAAK/C,IAE1C3B,kBAACga,EAAqCtV,iBAAK/C,IAI1D3B,2BAAOC,UAAW0B,EAAM1B,WACpBD,wBAAIC,UAAW0a,GACVC,K,gBCjEjB,MAAME,EAAuC,CACzCC,UAAW,CACPC,GAAI,CAAEC,EAAG,gBAAiBC,EAAG,EAAGC,EAAG,GACnCC,GAAI,CAAEH,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,IAEzCE,UAAU,EACVC,iBAAiB,GAQfC,EAA+E5Z,IAAmC,QAEpH,MAAM6Z,EAAmBC,8BAAoB9Z,EAAMsB,KAAKmL,QAAQsN,OAAQ/Z,EAAMoC,QAAQ6F,cAAc8L,eAAeiG,aAE7GC,EAAkB,UAAMja,EAAM1B,UAAZ,6BAExB,OACID,yBAAKC,UAAW2b,GACZ5b,kBAAC6b,IAAK,CACFnG,eAAgB/T,EAAMoC,QAAQ6F,cAAc8L,eAC5CzV,UAAS,UAAK2b,EAAL,mBACTE,QAASna,EAAMsB,KAAKmL,QAAQtC,KAC5BiQ,IAAG,UAAEpa,EAAMsB,KAAKmL,QAAQsC,uBAArB,QAAwC,GAC3CsL,YAAaR,EACbpM,aAAczN,EAAMoC,QAAQkE,QAAQmH,aACpCX,cAAa,UAAE9M,EAAM8M,qBAAR,QAAyBqM,EACtCmB,oBAAoB,YAW9BC,EAA4Eva,IAC9E,MAAMyM,EAAyBzM,EAAMsB,KAAKmL,QAE1C,IAAIiB,EAAa,GAKjB,GAJKyC,mBAAiBC,mBAAmB3D,EAAQtC,OAAUqQ,mBAAiBC,kBAAkBhO,EAAQI,YAClGa,EAAagN,gCAAsBjO,EAAQtC,KAAOsC,EAAQI,SAAU7M,EAAMoC,QAAQ6F,gBAGlFkI,mBAAiBC,mBAAmB1C,GACpC,OAAO,KAGX,MAAMpP,EAAS,UAAM0B,EAAM1B,UAAZ,wBAEf,OACID,yBAAKC,UAAWA,GACZD,kBAACiG,SAAM,CAAChG,UAAS,UAAKA,EAAL,gBAUhBqc,EAA8E3a,IAAmC,QAC1H,MAAMyM,EAAyBzM,EAAMsB,KAAKmL,QACpC1F,EAAqB/G,EAAMsB,KAAKyF,SAChCuR,EAAyB,UAAMtY,EAAM1B,UAAZ,wBAE/B,IAAIoP,EAAa,GAKjB,OAJKyC,mBAAiBC,mBAAmB3D,EAAQtC,OAAUqQ,mBAAiBC,kBAAkBhO,EAAQI,YAClGa,EAAagN,gCAAsBjO,EAAQtC,KAAOsC,EAAQI,SAAU7M,EAAMoC,QAAQ6F,gBAIlF5J,oCACIA,4BACIA,kBAACub,EAAuC7W,iBAChC/C,KAGZ3B,4BACKoO,EAAQsN,QAEb1b,4BACIA,yBAAKC,UAAS,UAAK0B,EAAM1B,UAAX,mBACVD,uBAAGC,UAAS,UAAK0B,EAAM1B,UAAX,kBAAsC2P,KAAMP,GACnDjB,EAAQtC,MAEb9L,0BAAMC,UAAS,UAAK0B,EAAM1B,UAAX,yBAAf,UAEQmO,EAAQmO,kBAFhB,aAEQ,EAAoB9W,IAChB+W,IAAS,uBAAIA,EAAUC,sBAAd,aAAI,EAA0BC,QAAOjU,OAC9CkU,IAAmB7K,mBAAiBC,mBAAmB4K,IAAiBC,KACxEjb,EAAM0C,UAAUwY,yCAKpC7c,wBAAIC,UAAWga,GACVvR,EAASoU,OAEd9c,4BACK0I,EAASqU,qBAEd/c,wBAAIC,UAAS,UAAK0B,EAAM1B,UAAX,uBACTD,kBAACgd,sBAAmB,CAChB9Y,GAAE,oCAA+BkK,EAAQI,SAAvC,sBAAmD9F,EAAS8I,cAA5D,QAAsE,IACxEyL,IAAK,GACLC,aAAcxU,EAASwJ,SACvBjD,uBAAwBtN,EAAM0C,UAAU8Y,iCACxCC,yBAA0Bzb,EAAM0C,UAAUgZ,mCAC1CC,yBAA0B3b,EAAM0C,UAAUkZ,mCAC1ClJ,IAAK3L,EAAS8I,OACdgM,WAAYpP,EAAQqP,cAG5Bzd,wBAAIC,UAAWga,GACVvR,EAASgV,aAEd1d,4BACIA,kBAACiG,SAAM,CACHhG,UAAS,UAAK0B,EAAM1B,UAAX,oBAAsC,aACnC0B,EAAM0C,UAAUsZ,yCAYnCC,EAA6Ejc,IACtF,MAAMyM,EAAyBzM,EAAMsB,KAAKmL,QACpC1F,EAAqB/G,EAAMsB,KAAKyF,SAEtC,OACI1I,oCACIA,4BACIA,kBAACub,EAAuC7W,iBAChC/C,KAGZ3B,4BACIA,yBAAKC,UAAS,UAAK0B,EAAM1B,UAAX,mBACVD,0BAAMC,UAAS,UAAK0B,EAAM1B,UAAX,mBACVmO,EAAQsN,QAEb1b,0BAAMC,UAAS,UAAK0B,EAAM1B,UAAX,uBACV4d,iBAAOlc,EAAM0C,UAAUyZ,6BAA8BpV,EAASwJ,aAI3ElS,4BACIA,kBAACkc,EAAoCxX,iBAC7B/C,OAYXoc,EAAmEpc,IAC5E,MAAMgZ,EAAY,UAAMhZ,EAAM1B,UAAZ,SAElB,IAAI2a,EAOJ,OALIA,EADAjZ,EAAMkZ,SACS7a,kBAAC4d,EAAqClZ,iBAAK/C,IAE3C3B,kBAACsc,EAAsC5X,iBAAK/C,IAI3D3B,2BAAOC,UAAW0B,EAAM1B,WACpBD,wBAAIC,UAAW0a,GACVC,KC3LJoD,EAA6Drc,IACtE,MAAOkZ,EAAUoD,GAAeje,IAAMke,SAASvc,EAAMwc,cAC/CC,EAAqBzc,EAAMsB,KAAKmb,mBAKhCC,EAAiB,KACnBJ,EAAYtc,EAAMwc,eAElB5O,IAASC,WACTG,OAAO2O,iBAAiB,SAAUD,GAGtC,MAAME,EAAe,UAAM5c,EAAM1B,UAAZ,YACf0a,EAAY,UAAMhZ,EAAM1B,UAAZ,SAElB,OACID,2BAAOC,UAAW0B,EAAM1B,WACpBD,kBAAC0a,EAA8B,CAC3B3W,QAASpC,EAAMoC,QACfI,SAAUxC,EAAMwC,SAChBD,GAAIqa,EACJte,UAAWse,EACX1D,SAAUA,EACVxW,UAAW1C,EAAM0C,UACjBpB,KAAM,KAGNmb,EAAmB3Y,IAAI,CAAC+Y,EAAmB9Y,IAEnC1F,kBAAC+d,EAA2B,CACxBha,QAASpC,EAAMoC,QACfI,SAAUxC,EAAMwC,SAChBD,GAAE,UAAKyW,EAAL,YAAqBjV,GACvB2O,IAAKmK,EAAkB1E,cAAc4B,OACrCzb,UAAW0a,EACXtW,UAAW1C,EAAM0C,UACjBwW,SAAUA,EACV5X,KAAM,CACFyF,SAAU8V,EAAkB9V,SAC5B0F,QAASoQ,EAAkB1E,oB,ykBCN3D,MAAM2E,UAAmBze,gBAiErB0B,YAAmBC,GACfC,MAAMD,GA1DO,KAAA+c,SAAmB,IAUnB,KAAAC,qBAA4C,IAAIC,qBAAyB,GAElF,KAAAC,WAAuC,GAE9B,KAAAC,sBAAgC,oCAKhC,KAAAC,oBAAkD,CAQ/DC,uBAAwB9c,MAAO+c,EAA6BC,KACxD/c,KAAK0c,WAAWI,GAAuBC,EAChC/c,KAAKwc,qBAAqBQ,QAAQjd,SAC9BC,KAAKid,qBACbpX,MAAO/D,IACN,GAAIA,IAAUob,0BAAwBC,gCAClC,MAAMrb,KAWlBsb,gBAAiB,CAACC,EAAuBnb,IAC9BlC,KAAKsd,iBAAiBD,EAAenb,GAOhDqb,wBAA0BC,IACtBxd,KAAK0V,SAAS,CAAE8H,0BA6KP,KAAAC,mBAAsBhV,IACnC,GAAKA,KAASA,EAAMrH,OAAS,GASzB,OARApB,KAAK0V,SAAS,CAAEgI,YAAajV,EAAOyO,SAAU,EAAGyG,qBAAiBvd,EAAWwd,kBAAmB,KAChG5d,KAAK0V,SAAS,CAAE2B,aAAc,CAC1BI,YAAa,GACbF,gBAAiB,GACjBC,aAAc,GACdtD,QAAQ,KAMZlU,KAAK6d,qBAEL7d,KAAK6d,oBAAoBC,SAG7B,MAAM,UACFjc,EADE,QAEFD,GACA5B,KAAKR,MAET,GAAIoC,EACA,GAAK+N,mBAAiBC,mBAAmBnH,GAiCrCzI,KAAK0V,SAAS,CAAEgI,YAAa,GAAIC,qBAAiBvd,EAAW2d,0BAA0B,QAjC1C,CAC7C,GAAItV,EAAMrH,OAHF,GAIJ,OAGJpB,KAAK6d,oBAAsB,IAAS,KAChCG,wBACI,IAAIC,qBACArc,EAAQ6F,cAAc8L,eAAeiG,YACrC/Q,EACA7G,EAAQ6F,cAAc8L,eAAeiG,YAAY0E,WAErDle,KAAKR,MAAMoC,QAAQ6F,eAClBhC,KAAK0Y,IACFne,KAAK0V,SAAS,CACViI,gBAAiBQ,aAAF,EAAEA,EAASC,QAC1BR,kBAAmBO,aAAF,EAAEA,EAASE,qBAC5BN,0BAA0B,MAGjClY,MAAM/D,IACH9B,KAAK0V,SAAS,CAAEgI,YAAa,KAC7B7b,EAAUyc,UAAUxc,GACpBD,EAAU0c,MAAM,iCAEzBve,KAAKuc,UAERiC,WAAW,KAEPxe,KAAK6d,uBACN,GACH7d,KAAK0V,SAAS,CAAEgI,YAAajV,EAAOsV,0BAA0B,MAUzD,KAAAU,eAAiB1e,UAC9B,MAAM,QAAE6B,EAAF,KAAWd,EAAX,UAAiBoB,EAAjB,UAA4BL,GAAc7B,KAAKR,OAC/C,KAAE4G,GAAStF,GACX,oCAAE4d,EAAF,oCAAuCC,GAAwCzc,GAC/E,gBAAEyb,EAAF,SAAmBzG,GAAalX,KAAKiJ,MAQ3C,GAPAjJ,KAAK0V,SAAS,CAAE2B,aAAc,CAC1BI,YAAa,GACbF,gBAAiB,GACjBC,aAAc,GACdtD,QAAQ,KAGRtS,QAA+BxB,IAApBud,GAAiC3d,KAAK4e,cAAcjB,EAAiBzG,IAAa9Q,EAAKpF,OAAQ,CAAC,IAAD,QAC1G,MAAM6d,GAA0C,UAAA7e,KAAKR,MAAMsB,KAAK2I,aAAazI,cAA7B,mBAC1CO,KAAKkI,GAAsC,oEAAtBA,EAAaE,aADQ,eACqEC,aAAa,EAE5HkV,EAAuC,UAAG9e,KAAKR,MAAMoC,QAAQkE,QAAQiZ,IAAIC,gBAAlC,aAAG,EAAyCC,iCACnFC,EAAelf,KAAKR,MAAMsB,KAAKqe,oBAAoBne,OAEnDoe,EAAgG,QAA5CN,GACjDI,IAC6C,QAA5CJ,GAAqDI,EAAaG,OACvB,QAA5CP,IAAsDI,EAAaG,OAGtE1f,QAAwB4H,kCAC1B,CACIC,cAAexH,KAAKR,MAAMoC,QAAQ6F,cAClCC,oBAAqBC,2BAAyBC,qCAAqC5H,KAAKR,MAAMoC,QAAQ6F,gBAE1G,CAACkW,EAAgBtR,WACfnG,EAAqB,UAAGlG,KAAKR,MAAMoC,QAAQ6F,cAAc8L,eAAevN,eAAnD,aAAG,EAAyDG,sBACjFmZ,EAAwBC,kBAAgBC,YAAY7f,IAC1D4f,kBAAgBC,YAAY7f,EAAgB,GAAGb,iBAAmBa,EAAgB,GAAGb,gBAAgB,GAAG2C,UAAOrB,EAEzGqf,EAAsCZ,GAA2CO,OAC3Chf,IAAxCJ,KAAKiJ,MAAMyW,gCACL1f,KAAK2f,qBAEf,MAAM,yBAAED,GAA6B1f,KAAKiJ,MACpC2W,EAAwB,CAC1B3T,QAAS0R,EACTta,MAAO6T,EAEP2I,iBAAkBje,EAAQmd,IAAIve,OAAOqf,iBACrCC,kBAAmBJ,EAA2BA,EAAyBK,yBAAyBC,kBAAoB,EACpHC,qBAAsB,CAAEC,oCAAqCT,GAC7DU,kCAAwD/f,IAA1Bkf,GAAuCA,IAA0BpZ,EAC/F5E,aAAcge,GAGlBlZ,EAAKpF,OAAOof,iBAAiBR,GACxBna,KAAK1F,UACF,GAAsB,YAAlBiB,EAAOT,OACPP,KAAKR,MAAMqC,UAAU0c,MAAM,8BAE3Bve,KAAK0V,SAAS,CAAE2B,aAAc,CAC1BI,YAAaiH,EACbnH,gBAAiB,UACjBC,aAAc,eACdtD,QAAQ,UAET,GAAyB,gBAArBlT,EAAOqf,UAA6B,CAC3CrgB,KAAKR,MAAMqC,UAAU0c,MAAM,gEAAiErH,GAC5F,MAAMoJ,EAA4BtgB,KAAKugB,kBAAkBb,EAA0BxI,GAEnFlX,KAAK0V,SAAS,CAAE2B,aAAc,CAC1BI,YAAa6I,EACb/I,gBAAiB,SACjBC,aAAc,8BACdtD,QAAQ,UAET,GAAyB,mBAArBlT,EAAOqf,WAAkCZ,EAAqC,CAAC,IAAD,EACrF,MAAMa,EAAyB,UAAGtf,EAAOwf,oBAAV,aAAG,EAAqBC,iBACvDzgB,KAAKR,MAAMqC,UAAU0c,MAAM,gEAAiE+B,GAE5FtgB,KAAK0V,SAAS,CAAE2B,aAAc,CAC1BI,YAAa6I,GAA6B3B,EAC1CpH,gBAAiB,SACjBC,aAAc,8BACdtD,QAAQ,UAGZlU,KAAKR,MAAMqC,UAAU0c,MAAM,iEAE3Bve,KAAK0V,SAAS,CAAE2B,aAAc,CAC1BI,YAAakH,EACbpH,gBAAiB,SACjBC,aAAc,8BACdtD,QAAQ,OAInBrO,MAAM/D,IACHD,EAAU6e,QAAQ5e,GAClBD,EAAU0c,MAAM,uEAEhBve,KAAK0V,SAAS,CAAE2B,aAAc,CAC1BI,YAAakH,EACbpH,gBAAiB,SACjBC,aAAc,8BACdtD,QAAQ,SAgCX,KAAAyM,sBAAyBtiB,IACtC,MAAMuiB,EAAeC,OAAOC,SAAUziB,EAAQ,IACxC0iB,EAAe/gB,KAAKghB,cAAcC,mBAAmBC,kBAAoBlhB,KAAKghB,cAAcC,QAElGjhB,KAAK0V,SACD,CAAEwB,SAAU0J,GACZ,KACI,IACI,KACSO,MAAMnhB,KAAKiJ,MAAMiO,WAAelX,KAAKiJ,MAAMiO,SAAW,IAAM6J,IAC7DA,EAAaK,aAAa,gBAAiBR,EAAalQ,YACxDqQ,EAAaK,aAAa,QAASR,EAAalQ,cAGxD,IAPJ,MAYK,KAAA2Q,sBAAwB,CAACC,EAA4CC,KAClF,GAAIA,GAAcD,EAAqBE,gBACnC,OAAOF,EAAqBE,gBAAgBjgB,KAAK8Y,GAAaA,EAAUhO,YAAckV,IAM7E,KAAAjE,iBAAmB,CAACD,EAAuBnb,KAA0D,MAClH,MAAMmZ,EAAU,UAAGrb,KAAKiJ,MAAM0U,uBAAd,aAAG,EAA4BrC,WAE/C,OAAQ+B,GACJ,KAAK,EACD,OAAOnb,EAAUuK,0BACrB,KAAK,EACD,OAAOvK,EAAUuf,kCACrB,KAAK,EACD,OAAOvf,EAAUwK,yBACrB,KAAK,EACD,OAAO2O,EAAanZ,EAAU0K,2BAA6B1K,EAAUyK,0BACzE,QACI,MAAO,KAOF,KAAAsQ,kBAAoBld,UACjC,MACI6B,SAAS,cACL6F,EACA3B,SACI0T,aAAa,UACT0E,MAIZle,KAAKR,OACH,kBAAEoe,EAAF,gBAAqBD,GAAoB3d,KAAKiJ,MACpD,IAAK0U,IAAoBC,EACrB,OAGJ,MAAM8D,EAAkB,KAAkC1hB,KAAK0c,YAI/D,GAHA1c,KAAK0V,SAAS,CAAE8H,qBAAqB,IAGjCxd,KAAKiJ,MAAM0Y,2BAA2BC,WAAY,CAClD,MAAMC,EAAoB,KAAQ7hB,KAAKiJ,MAAM0Y,4BAC7CE,EAAqBD,gBAAaxhB,EAClCJ,KAAK0V,SAAS,CAAEiM,2BAA4BE,IAIhD,IAAK,MAAM3P,KAAO3P,OAAO0P,KAAKyP,GAC1B,GAAI1hB,KAAKiJ,MAAM0Y,2BAA2BG,gBAAgB5P,GAAM,CAC5D,MAAM6P,EAAU,KAAQ/hB,KAAKiJ,MAAM0Y,4BACnCI,EAAWD,gBAAgB5P,QAAO9R,EAElCJ,KAAK0V,SAAS,CAAEiM,2BAA4BI,IAMpD,MAAMC,EAAmBpE,EAAkBta,IAAI+W,IACpC,CACH4H,mBAAoB5H,EAAU4H,mBAC9B3H,eAAgBta,KAAKqhB,sBAAsBhH,EAAWqH,EAAmBrH,EAAU4H,sBAAwB5H,EAAUC,eACrH4H,oBAAqB7H,EAAU6H,uBAEpC5b,OAAO+T,GACCA,EAAUC,gBAKf6H,EAAkB,IAAIC,QAA8BriB,MAAOsiB,EAASC,KACtE,MAAMC,QAAoBC,6BACtB,IAAIC,uBACA9E,EAAgB+E,gBAAkB/E,EAAgB+E,gBAAkB/E,EAAgBtR,SACpF6R,EACA8D,OAAkB5hB,EAClBJ,KAAKR,MAAMoC,QAAQkE,SAEvB2B,GAEA8a,SACMI,0CACF,IAAIC,uCACAL,EAAWG,gBAAkBH,EAAWG,gBAAkBH,EAAWlW,SACrE6R,EACA8D,EACAhiB,KAAKR,MAAMoC,QAAQkE,SAEvB2B,GAIR4a,EAAQE,KAGNM,QAAuBV,EAE7B,GADAniB,KAAK0V,SAAS,CAAEiI,gBAAoC,OAAnBkF,EAA0BA,OAAiBziB,IACxEyiB,EAAgB,CAGhB,MAAMC,QAA6BC,qDAC/B,IAAIC,+CACAH,EAAexW,SACf6R,GAEJzW,GAGAqb,GAAwBA,EAAqB1hB,OAAS,EACtDpB,KAAK0V,SAAS,CAAEgK,yBAA0BoD,EAAqB,KAE/D9iB,KAAK0V,SAAS,CAAEgK,8BAA0Btf,MAQrC,KAAAuf,mBAAqB5f,UAClC,MACI6B,SAAS,cACL6F,EACA3B,SACI0T,aAAa,UACT0E,MAIZle,KAAKR,OACH,gBAAEme,GAAoB3d,KAAKiJ,MACjC,IAAK0U,EACD,OAGJ,MAAMmF,QAA6BC,qDAC/B,IAAIC,+CACArF,EAAgBtR,SAChB6R,GAEJzW,GAGJ,GAAIqb,GAAwBvD,kBAAgBC,YAAYsD,GAAuB,CAC3E,MAAMG,EAAmBH,EAAqBvhB,KAAK2V,GAAYA,EAAS6I,yBAAyB7T,YAAcyR,EAAgBtR,UAC/HrM,KAAK0V,SAAS,CAAEgK,yBAA0BuD,SAE1CjjB,KAAK0V,SAAS,CAAEgK,8BAA0Btf,KAWjC,KAAA8iB,yBAA2B,CAACC,EAA4BjhB,EAAiCmZ,KACtG,OAAQ8H,GACJ,KAAK,EACD,OAAOjhB,EAAUkhB,gDACrB,KAAK,EACD,OAAOlhB,EAAUmhB,wDACrB,KAAK,EACD,OAAOnhB,EAAUohB,+CACrB,KAAK,EACD,OAAOjI,EAAanZ,EAAUqhB,iDAAmDrhB,EAAUshB,gDAC/F,QACI,MAAO,KAUF,KAAA5E,cAAgB,CAACjB,EAAgCzG,KAA6B,MAC3F,MAAMuM,EAAiB,UAAG9F,EAAgBvD,kBAAnB,aAAG,EAA4B9T,OACjD+T,IAAD,cAAiC,UAAEA,EAAUC,sBAAZ,OAAE,EAA0BC,SAEjE,GAAIkJ,GAAqBA,EAAkBriB,OAAS,EAAG,CACnD,MAAMgW,EAAcpX,KAAK0jB,oBAAoBD,GAAmB,GAChE,GAAIzjB,KAAKiJ,MAAM0Y,2BAA2BG,gBAAiB,CACvD,MAAMC,EAAU,KAAQ/hB,KAAKiJ,MAAM0Y,4BAInC,OAHAI,EAAWD,gBAAkB1K,EAE7BpX,KAAK0V,SAAS,CAAEiM,2BAA4BI,KACrC,GAIf,GAAI7K,GAAY,EAAG,CACf,MAAMhV,EAAYlC,KAAKR,MAAM0C,UAO7B,OANAlC,KAAK0V,SAAS,CAAE2B,aAAc,CAC1BI,YAAavV,EAAUyhB,gCACvBpM,gBAAiB,SACjBC,aAAc,8BACdtD,QAAQ,MAEL,EAEX,OAAO,GAplBPlU,KAAK6V,iBAAmBhY,cACxBmC,KAAKghB,cAAgBnjB,cACrBmC,KAAK4jB,SAAiD,WAAtCpkB,EAAMoC,QAAQkE,QAAQ+d,OAAOC,KAAoB,KAAO,KAExE9jB,KAAKvB,iBAAmB4J,6BAAmBrI,KAAKR,MAAMoC,QAAQkE,QAAQwC,kBAAoBtI,KAAKR,MAAM+I,aAAcvI,KAAKR,MAAMqC,WAC9H7B,KAAKiJ,MAAQ,CACTyU,YAAa,GACbK,0BAA0B,EAC1B2B,8BAA0Btf,EAC1B8W,SAAU,EACVyG,qBAAiBvd,EACjBwd,uBAAmBxd,EACnBuhB,2BAA4B,CACxBG,gBAAiB,IAErBpJ,SAAU1Y,KAAK0Y,SACf5F,SAAU,IAEd9S,KAAKyd,mBAAqBzd,KAAKyd,mBAAmBzJ,KAAKhU,MACvDA,KAAK2gB,sBAAwB3gB,KAAK2gB,sBAAsB3M,KAAKhU,MAC7DA,KAAK+jB,oBAAsB,+BAC3B/jB,KAAKgkB,6BAA+B,oCACpChkB,KAAKikB,yBAA2B,mCAGd,eAClB,MAA0B,OAAlBjkB,KAAK4jB,UAAuC,OAAlB5jB,KAAK4jB,SAGpC1a,SAEH,MAAM,KAAEpI,GAASd,KAAKR,MACtB,IAAKsB,EAAKqe,oBAAoBne,OAC1B,OAAO,KAGX,MAAM,UAAElD,EAAY,GAAd,YAAkBmY,GAAgBjW,KAAKR,MAAMgB,OAC7C0e,EAAelf,KAAKR,MAAMsB,KAAKqe,oBAAoBne,QACnD,wBAAEkjB,EAAF,4BAA2BC,EAA3B,mBACFC,EADE,oCACkBC,EADlB,4BAEFC,EAFE,oCAE2BC,EAF3B,4CAGFC,EAHE,sCAG2CC,EAH3C,mCAIFC,EAJE,oCAIkCC,EAJlC,qCAKFC,GACA5kB,KAAKR,MAAM0C,UAET2iB,EAAiE,CACnEC,4BAA6BL,EAC7BhY,0BAA2B8X,EAC3B9C,kCAAmC+C,EACnC9X,yBAA0BgY,EAC1B/X,0BAA2BgY,EAC3B/X,2BAA4BgY,IAG1B,yBACF7G,EADE,YAEFL,EAFE,2BAGFiE,EAHE,gBAIFhE,EAJE,kBAKFC,GACA5d,KAAKiJ,MAIHa,EAAS,OACP9J,KAAKR,OADE,IAGXulB,gBAAiB,CAAEjnB,UAAW+S,IAAW,iBAAkB/S,GAAYwM,YAAatK,KAAKR,OACzFwlB,aAAc,CAAElnB,UAAW,2BAC3BmnB,MAAO/F,aAAF,EAAEA,EAAcG,MACrB6F,OAAQ,CACJniB,IAAK+Q,EACLhW,UAAU,GAAD,OAVe,iBAUf,YACTqW,cAAe,CAAED,OAAQlU,KAAKiJ,MAAM8U,0BACpC3I,kBAAmB8O,EACnB7O,sBAAuB8O,EACvB5Q,eAAgBvT,KAAKR,MAAMoC,QAAQkE,QACnCrH,iBAAkBuB,KAAKvB,kBAE3B0mB,eAAgB,CACZrnB,UAAU,GAAD,OAAKkC,KAAK+jB,oBAAV,YAAiChG,EAA2B,UAAY,YAErFiG,6BAA8B,CAC1BlmB,UAAWkC,KAAKgkB,8BAEpBC,yBAA0B,CACtBnmB,UAAWkC,KAAKikB,0BAEpBvG,cACA0H,eAAgB7F,kBAAgBC,YAAYxf,KAAKiJ,MAAM6J,UAAY9S,KAAKqlB,uBAAuB,uBAAoBjlB,EACnHklB,KAAM1P,EAAwB,CAC1BC,iBAAkB7V,KAAK6V,iBACvBC,kBAAmB9V,KAAKghB,cACxB9K,kBAAmByH,EACnBtH,mBAAoB+N,EACpBhO,iBAAkBkO,EAClBnO,kBAAmBkO,EACnBrO,SAAU,GACVC,cACAF,gBAAiB/V,KAAKiJ,MACtBsN,kBAAmBvW,KAAKyd,mBACxBjH,qBAAsBxW,KAAKye,eAC3BnI,qBAAsBtW,KAAK2gB,wBAE/B4E,UAAW5H,GAAmBC,EAAoB4H,8BAAoBxlB,KAAK2c,sBAAuB3c,KAAKR,MAAMoC,QAAS5B,KAAKR,MAAM+I,aAC7HvI,KAAKR,MAAMqC,UAAW4iB,EACtBI,EAA2B7kB,KAAK4c,oBAAqBe,EACrDC,EAAmB+D,QAA8BvhB,EACrD2d,yBAA0B/d,KAAKiJ,MAAM8U,yBACrC/B,aAAchc,KAAKiJ,MAAMyP,WAG7B,OAAO1Y,KAAKR,MAAMwL,WAAWlB,GAOzB2b,0BAAuB,MAC3B,MACI3kB,MACIsF,MAAQpF,OAAQoF,KAEpBpG,KAAKR,MAEHsT,EAA4B9S,KAAKiJ,MAAM6J,SAEvCmJ,EAAqB7V,SAAH,UAAGA,EAAMA,KAAKC,iBAAd,aAAG,EAAsB/C,IAAKiD,IAClD,MAAM8V,EAAoBvJ,EAASvR,KAAK0K,GAAWA,EAAQI,WAAa9F,EAAS2F,WACjF,IAAI8N,mBAAiBC,kBAAkBoC,GAIvC,OAAO,IAAI3E,EAAkBnR,EAAU8V,KAG3C,OAAOkD,kBAAgBmG,YAAYzJ,GAQ/BoJ,uBAAuBvnB,GAC3B,MAAM6nB,EAAc,UAAM7nB,EAAN,gBAEpB,OACID,gBAACge,EAAwB,CACrB9Z,GAAI4jB,EACJ3jB,SAAUhC,KAAKR,MAAMwC,SACrBkQ,IAAKyT,EACL7nB,UAAW6nB,EACX7kB,KAAM,CAAEmb,mBAAoBjc,KAAKylB,2BACjC7jB,QAAS5B,KAAKR,MAAMoC,QACpBM,UAAWlC,KAAKR,MAAM0C,UACtB8Z,aAAchc,KAAKiJ,MAAMyP,WAqL7B6H,kBAAkBqF,EAAgEC,GACtF,MAAM,QAAEjkB,EAAF,UAAWM,GAAclC,KAAKR,OAC9B,+BAAEsmB,GAAmC5jB,EAGrC6jB,EAAyBnkB,EAAQmd,IAAIve,OAAOwlB,4BAA8B,GAGhF,IAAKJ,IAAyBA,EAAqB7F,yBAAyBC,oBAAsBpe,EAAQmd,IAAIve,OAAOqf,iBACjH,OAAOiG,EAA+BrV,QAClC,gBAEAsV,EAAuBrV,YAAYD,QAAQ,gBAC3CoV,EAAgBnV,YAIxB,MAAMuV,EAAeC,KAAKC,IAAIJ,EAAwBH,EAAqB7F,yBAAyBC,mBAEpG,OAAO8F,EAA+BrV,QAAQ,gBAAiBwV,EAAavV,YAAYD,QAAQ,gBAAiBoV,EAAgBnV,YAuP7HgT,oBAAoB1iB,EAAwCqa,GAChE,IAAKra,EACD,MAAO,GAEX,MAAM0b,EAA4D,GAC5Dxa,EAAYlC,KAAKR,MAAM0C,UAC7B,IAAK,MAAMmY,KAAarZ,EACpB0b,EAAWrC,EAAU4H,oBAAsBjiB,KAAKkjB,yBAAyB7I,EAAU4H,mBAAoB/f,EAAWmZ,GAEtH,OAAOqB,GAvqBXzR,aADCC,KACD,+BA0FUD,aAATE,KAAS,6BAilBCmR,a,2KCphBf,MAAM8J,EAAmD5mB,IACrD,MAAM6mB,EAAY7mB,EAAMsB,KAAKyF,SAASqH,UAEtC,IAAKpO,EAAMoC,QAAQkE,QAAQwgB,KAAKC,QAAUF,IAAc9G,kBAAgBC,YAAYhgB,EAAMsB,KAAK0lB,UAC3F,OAAO,KAGX,MAAMC,EAAUjnB,EAAMsB,KAAK0lB,SAASjlB,KAAKgO,GAAQA,EAAKlD,WAAaga,GAEnE,OAAKI,GAAYA,EAAQ9c,KAKrB9L,uBAAKC,UAAU,gCACV2oB,EAAQ9c,MALN,MAUT+c,EACuB,CAACtI,EAAwBuI,IACzCvI,GAAYA,EAAQhE,WAIlBgE,EAAQhE,WAAW9W,IAAIsjB,GAEkB,IAAxCA,EAAiB3E,mBAEbpkB,uBAAKqU,IAAG,UAAKkM,EAAQ/R,SAAb,sBAA2CvO,UAAU,uCACzDD,wBAAMC,UAAU,wCACX6oB,EAAiB5Y,YADtB,IAGIlQ,wBAAMC,UAAU,QACX8oB,EAAiBtM,gBAAkBsM,EAAiBtM,eAAeC,SAO5C,IAAxCqM,EAAiB3E,mBAEbpkB,uBAAKqU,IAAG,UAAKkM,EAAQ/R,SAAb,sBAA2CvO,UAAU,uCACzDD,wBAAMC,UAAU,wCACX6oB,EAAiB9Z,aADtB,IAGIhP,wBAAMC,UAAU,QACX8oB,EAAiBtM,gBAAkBsM,EAAiBtM,eAAeC,SAO5C,IAAxCqM,EAAiB3E,mBAEbpkB,uBAAKqU,IAAG,UAAKkM,EAAQ/R,SAAb,sBAA2CvO,UAAU,uCACzDD,wBAAMC,UAAU,uCACX6oB,EAAiB7Y,WADtB,IAGIjQ,wBAAMC,UAAU,QACX8oB,EAAiBtM,gBAAkBsM,EAAiBtM,eAAeC,SAO5C,IAAxCqM,EAAiB3E,mBAEbpkB,uBAAKqU,IAAG,UAAKkM,EAAQ/R,SAAb,sBAA2CvO,UAAU,uCACzDD,wBAAMC,UAAU,wCACXsgB,EAAQ9C,WAAaqL,EAAiB1Y,aAAe0Y,EAAiB3Y,YAD3E,IAGInQ,wBAAMC,UAAU,QACX8oB,EAAiBtM,gBAAkBsM,EAAiBtM,eAAeC,SAMjF,MA5DA,GAHbmM,EAmEoBlnB,GAEbA,EAAMsB,KAAKyF,SAASsgB,eAA8D,IAA7CrnB,EAAMsB,KAAKyF,SAASsgB,cAAczlB,OAIrE5B,EAAMsB,KAAKyF,SAASsgB,cAAcvjB,IAAI,CAACwjB,EAAcvjB,IAEpD1F,uBAAKqU,IAAK4U,EAAaC,SAAWxjB,EAAOzF,UAAU,uCAC/CD,4BACKipB,EAAaE,UAAYF,EAAaE,UAAY,GADvD,eAGSxnB,EAAM0C,UAAU6K,oBAAsB,WAH/C,MAKAlP,wBAAMC,UAAU,yCACZD,gBAAC4E,iBAAc,CACX3B,KAAMtB,EAAMynB,YAAc,CACtB9kB,MAAO,CAEHO,wBAAyBlD,EAAMsB,KAAKyF,SAAS2gB,mBAEjD,CACA/kB,MAAO,CACHO,wBAAyBokB,EAAaK,gBACtCC,UAAWN,EAAaK,kBAGhCvlB,QAASpC,EAAMoC,QACfG,GAAIvC,EAAMuC,GACVC,SAAUxC,EAAMwC,YAGxBnE,6CAC+CuC,IAArC0mB,EAAaO,oBAAoCP,EAAaO,oBAAsB,GAD9F,SA7BD,KAtEbX,EA0GqBlnB,IACnB,IAAKA,EAAM8nB,0BACP,OAAO,KAEX,MAAMC,EAAmB/nB,EAAMgoB,wBAAN,iDAA0EhoB,EAAMgoB,yBAA4B,yCACrI,OACI3pB,wBAAMC,UAAWypB,GACZ/nB,EAAM8nB,4BAjHjBZ,EA2HoBlnB,IAElB,GAAIA,EAAMsB,KAAKyF,SAASkhB,cACpB,OAAO,KAIX,IAAKjoB,EAAMoC,QAAQmd,IAAIve,OAAOknB,0BAAkF,SAAtDloB,EAAMoC,QAAQmd,IAAIve,OAAOknB,yBAC/E,OAGJ,MAAMzb,EAAUzM,EAAMsB,KAAKmL,QAC3B,OAAKA,GAAYA,EAAQ0b,qBAKrB9pB,uBAAKC,UAAU,yCACXD,4BACKoO,EAAQ0b,4BAPrB,GAvIFjB,EAmJoBlnB,IAAyB,MAC3C,MAAMuG,EAAsB,UAAGvG,EAAMoC,QAAQkE,QAAQE,eAAzB,aAAG,EAA+BC,uBACxDV,EAA8B/F,EAAM+F,4BACpCqiB,EAAWpoB,EAAMsB,KAAKyF,SAC5B,IAAIshB,GAAoB,EACwB,IAAD,OAAXznB,IAAhCmF,EACAsiB,KAAuBD,EAAS3iB,cAAT,UACnBM,EAA4BiB,+BADT,QACnB,EAAqDshB,KAAKxmB,GAAgBA,IAAiBsmB,EAAS3iB,eAExG4iB,KAAuBD,EAAS3iB,cAAgB2iB,EAAS3iB,eAAiBc,GAE9E,IAAK8hB,EACD,OAGJ,MAAME,GAAuBH,EAASI,aAAe,IAAI1hB,OAAO2hB,GAAcA,EAAWC,YAEzF,GAAmC,IAA/BH,EAAoB3mB,OACpB,OAGJ,MAAM+mB,EAAaJ,EAAoBjY,OAAO,CAACsY,EAAaH,IACjDG,GAAeH,EAAWI,kBAAoB,GACtD,GAEGC,EACFzqB,gBAAC4E,iBAAc,CACX3B,KAAM,CACFqB,MAAO,CACHO,wBAAyBylB,IAGjCxlB,cAAc,OACdf,QAASpC,EAAMoC,QACfG,GAAIvC,EAAMuC,GACVC,SAAUxC,EAAMwC,SAChBlE,UAAU,kCAGlB,OACID,gCACIA,yBAAOC,UAAU,gCAAjB,UACQ0B,EAAM0C,UAAUkM,oBADxB,MAGAvQ,wBAAMC,UAAU,kBACXwqB,KAhMf5B,EAqMmBlnB,IAAyB,MAC1C,MACM+oB,EAAY,UADD/oB,EAAMsB,KAAKyF,SACEyhB,mBAAZ,aAAG,EAAsB1hB,OAAQkiB,IAAgBA,EAAWN,YAE9E,OAAOK,GAAgBA,EAAajlB,IAAI,CAACmlB,EAAavW,IAC3CuW,GAAeA,EAAYJ,iBAC9BxqB,uBAAKC,UAAU,+BAA+BoU,IAAKA,GAC/CrU,yBAAOC,UAAU,sCAAjB,UACQ2qB,EAAYjmB,YADpB,MAGA3E,wBAAMC,UAAU,sBACZD,gBAAC4E,iBAAc,CACX3B,KAAM,CACFqB,MAAO,CACHO,wBAAyB+lB,EAAYJ,mBAG7CzmB,QAASpC,EAAMoC,QACfG,GAAIvC,EAAMuC,GACVC,SAAUxC,EAAMwC,SAChBlE,UAAU,0CAItB,UACFsC,GAkOCsoB,UA9N6BlpB,IAAyB,MACjE,MAAM,YAAEynB,EAAF,WAAe/Z,EAAf,UAA2BhL,GAAc1C,GACzC,QAAEyM,EAAF,SAAW1F,GAAa/G,EAAMsB,KAE9B6nB,EAA2B,CAC7B7a,WAAY5L,EAAU4L,WACtBC,YAAa7L,EAAU6L,YACvBC,YAAa9L,EAAU8L,YACvBnB,aAAc3K,EAAU2K,aACxBoB,aAAc/L,EAAU+L,cAGtBoL,EAAmBpN,GAAWqN,8BAAoBrN,EAAQsN,OAAQ/Z,EAAMoC,QAAQ6F,cAAc8L,eAAeiG,aAC7GoE,EAAoB3R,GAAWya,EAA8Cza,EAAS0c,GACtFrc,EAAgB9M,EAAM8M,cACxBA,IACAA,EAAc6M,iBAAkB,GAEpC,MAAMyP,EAAqBlC,EAA0ClnB,GAC/DqpB,EAAuBnC,EAA2ClnB,GAClEspB,EAAsBpC,EAA0ClnB,GAChEupB,EAAsBrC,EAA0ClnB,GAChEwpB,EAAqBtC,EAAyClnB,GAC9Db,EAAUC,2BAAiB,QAASY,EAAMf,iBAAmB,GAAIwN,aAAvC,EAAuCA,EAASI,SAASqE,YACnFuY,EAAmBjqB,iCAAuBQ,EAAMf,iBAAmBE,GACnEuqB,GAAcjd,aAAA,EAAAA,EAAStC,OAAQpD,EAAS/D,YACxC2mB,EAAgB3pB,EAAMsB,KAAKyF,SAASkhB,cAAgB,+BAAiC,+BAErF/oB,EAAY0qB,IACV5pB,EAAM6pB,kBACC7pB,EAAM6pB,iBAAiB7pB,EAAMsB,KAAKyF,SAAU6iB,EAAU5pB,EAAM8pB,WAsH3E,OACIzrB,gCACIA,uBAAKC,UAAU,iBACXD,uBAAKC,UAAWqrB,GACZtrB,gBAAC6b,IAAK,CACFnG,eAAgB/T,EAAMoC,QAAQ6F,cAAc8L,eAC5CqG,IAAG,UAAEpa,EAAM8O,uBAAR,QAA2B,QAASuL,YAAaR,EAAkBM,QAASuP,EAC/Ejc,aAAczN,EAAMyN,aAAcX,cAAeA,EAAewN,oBAAoB,WAE5Fjc,uBAAKC,UAAU,0BACXD,uBAAKC,UAAU,0BACXD,gBAACuoB,EAAqB7jB,iBACd/C,IAGJ4N,IAASC,UAAYxP,mCACjBC,UAAU,gCACNmrB,EAAgB,CACpBxb,KAAMP,EACNgF,IAAKhF,IAEJgc,GACE,KAEV3J,kBAAgBC,YAAY5B,GAAqB/f,uBAAKC,UAAU,mCAC5D8f,GACI,GACRkL,EACDjrB,uBAAKC,UAAU,gCACXD,gBAAC4E,iBAAc,CACX3B,KAAMmmB,EAAc,CAChB9kB,MAAO,CAEHO,wBAAyBlD,EAAMsB,KAAKyF,SAASgjB,UAC7CnC,UAAW5nB,EAAMsB,KAAKyF,SAASoU,QAEnC,CACAxY,MAAO,CACHO,wBAAyBlD,EAAMsB,KAAKyF,SAASijB,oBAC7CpC,UAAW5nB,EAAMsB,KAAKyF,SAASkjB,WAGvC7nB,QAASpC,EAAMoC,QACfG,GAAIvC,EAAMuC,GACVC,SAAUxC,EAAMwC,SAChBlE,UAAU,oBAGjB8qB,EACAC,EACArpB,EAAM+M,iCAAmC1O,uBAAKC,UAAU,0BACpDirB,GAEJC,GAvJa,MAC9B,MAAMU,EAAQ,GACd,OAAIlqB,EAAMmqB,aACC,MAINnqB,EAAMsB,KAAKyF,SAASkhB,gBACjBjoB,EAAMsB,KAAKmL,SAAWzM,EAAM6O,mBAC5Bqb,EAAM1X,KACFnU,uBAAKC,UAAU,mCACXD,uBAAKC,UAAU,yCACVoE,EAAUsK,uBAEf3O,gBAACgd,sBAAmB,CAChB9Y,GAAE,kCAA6BvC,EAAMsB,KAAKmL,QAAQI,SAAhD,YAA4D7M,EAAMsB,KAAKyF,SAAStB,aAAhF,YAAgGzF,EAAMsB,KAAKyF,SAAS8I,QACtHyL,IAAKtb,EAAMyW,aAAe,GAC1B8E,aAAcvb,EAAMqmB,gBACpBnnB,SAAUA,EACVoO,uBAAwB5K,EAAU4K,uBAClCmO,yBAA0B/Y,EAAU+Y,yBACpCE,yBAA0BjZ,EAAUiZ,yBACpCjJ,IAAK1S,EAAMsB,KAAKyF,SAAS8I,OACzBrL,UAAWxE,EAAMoqB,iBACjBvO,WAAY7b,EAAMsB,KAAKmL,QAAQqP,WAC/B7c,iBAAkBe,EAAMf,qBAKpCirB,EAAM1X,KACFnU,uBAAKC,UAAW+rB,IAAW,0BAA2B,CAAE,kBAAoD,IAAjCrqB,EAAMsB,KAAKyF,SAASwJ,YAC3FlS,yBAAOC,UAAU,kBACZoE,EAAUsK,sBADf,KAIA3O,wBAAMC,UAAU,kBACX0B,EAAMsB,KAAKyF,SAASwJ,aAOzC2Z,EAAM1X,KACFnU,uBAAKC,UAAU,kCACXD,gBAAC4E,iBAAc,CACX3B,KAAMmmB,EAAc,CAChB9kB,MAAO,CAEHO,wBAAyBlD,EAAMsB,KAAKyF,SAASgjB,UAC7CnC,UAAW5nB,EAAMsB,KAAKyF,SAASoU,QAEnC,CACAxY,MAAO,CACHO,wBAAyBlD,EAAMsB,KAAKyF,SAASijB,oBAC7CpC,UAAW5nB,EAAMsB,KAAKyF,SAASkjB,WAGvC7nB,QAASpC,EAAMoC,QACfG,GAAIvC,EAAMuC,GACVC,SAAUxC,EAAMwC,SAChBlE,UAAU,wCACVoQ,kBAAmBhM,EAAUgM,kBAC7BC,iBAAkBjM,EAAUiM,mBAG5B3O,EAAMsB,KAAKyF,SAASujB,gBAAkBtqB,EAAMsB,KAAKyF,SAASujB,eAAiB,GAC3EjsB,gCACIA,wBAAMC,UAAU,wCAAhB,WACS0B,EAAM0C,UAAU6K,oBAAsB,WAD/C,MAGAlP,gBAAC4E,iBAAc,CACX3B,KAAMtB,EAAMynB,YAAc,CACtB9kB,MAAO,CAEHO,wBAAyBlD,EAAMsB,KAAKyF,SAAS2gB,mBAEjD,CACA/kB,MAAO,CACHO,wBAAyBlD,EAAMsB,KAAKyF,SAASwjB,yBAC7C3C,UAAW5nB,EAAMsB,KAAKyF,SAASujB,iBAGvCloB,QAASpC,EAAMoC,QACfG,GAAIvC,EAAMuC,GACVC,SAAUxC,EAAMwC,SAChBlE,UAAU,0CAGlB,OAKL4rB,IA2DSM,GAGAxqB,EAAMsB,KAAKyF,SAASkhB,eAAiBjoB,EAAMsB,KAAK4F,WAAalH,EAAM0C,UAAU+nB,sBAAwBpsB,gBAACqsB,sBAAmB,CACrHpsB,UAAU,wCACV8D,QAASpC,EAAMoC,QACfM,UAAW1C,EAAM0C,UAAU+nB,qBAC3BvjB,UAAWlH,EAAMsB,KAAK4F,UACtBH,SAAU/G,EAAMsB,KAAKyF,aAhLrC/G,EAAM2D,aAEFtF,uBAAKC,UAAU,kDACXD,wBAAMC,UAAU,6BAChBD,4BACK2B,EAAM2D,eAMhB,Q,+FCheAgnB,IAxCfpqB,eAA+BqqB,GAC3B,IAAI1jB,EACAtB,EACJ,MAAMilB,EAAsB,GAE5B,IACI3jB,QAAkB4jB,uBAAaF,GAC/BhlB,QAAsBmlB,2BAAiBH,GACzC,MAAOtoB,GACL,MAAMA,EAGV,IAAK4E,IAAcA,EAAUN,KACzB,MAAM,IAAIokB,MAAM,6BAGpB,IAAKplB,IAAkBA,EAAcnE,aACjC,MAAM,IAAIupB,MAAM,mCAGpB,MAAMC,EAAa/jB,EAAUN,KACvBnF,EAAemE,EAAcnE,aAAamF,KAEhD,IAAK,MAAMskB,KAAkBD,EAAWpkB,WAAa,GACjD,IAAK,MAAMskB,KAAoB1pB,EAAaoF,WAAa,GACjDqkB,EAAerb,QAAUqb,EAAerb,SAAWsb,EAAiBtb,QACpEgb,EAAoBrY,KAAK0Y,EAAerb,QAKpD,UACU3I,EAAUkkB,gBAAgB,CAAEC,YAAaR,UACzC3jB,EAAUokB,oBAAoB,UAC9B1lB,EAAc2lB,qBAAqB,IAC3C,MAAOjpB,GACL,MAAMA,K,oCCvCd,6D,yMCgDA,MAOMkpB,EAPoCxrB,IACtC,MAAM,sBAAEyrB,GAA0BzrB,EAAM0rB,UAClC,QAAEC,GAAY3rB,EAEpByrB,GAAyBE,GAAWF,EAAsBE,IAYxDC,EAAoC5f,GAAqC,KAC3Ewf,EAAyCxf,IAGhC6f,EAAuB7f,IAChC,MAAM,GAAE5E,EAAF,cAAM0kB,EAAN,gCAAqBC,EAArB,mBAAsDC,EAAtD,SAA0EN,EAA1E,KAAoF7rB,EAApF,cAA0FiN,EAA1F,QAAyG1K,EAAzG,iBAAkHnD,EAAlH,uBAAoIgtB,GAA2BjgB,EAErK,IAAK5E,EACD,OAAO,KAGX,MAUM,UAAE8kB,GAAcR,EAEtB,MAAO,CACHhZ,IAAI,GAAD,OAAKtL,EAAL,aACH+kB,mBAAoBC,EAA2BhqB,EAAS0pB,EAAcO,mBAAoBvf,EAAemf,GACzGK,uBAAwBC,EAAiBvgB,GACzCwgB,kBAEInuB,2BACIA,uBAAKC,UAAU,sCACXD,qBAAG4P,KApBc,MAAa,MAC1C,MAAMwe,EAAG,UAAGC,YAAW,gBAAiBtqB,EAAQ6F,sBAAvC,QAAyD,GAC5D0kB,EAAYF,EAAIG,SAAS,KAAO,IAAM,IAC5C,OAAIxlB,EACM,GAAN,OAAUqlB,GAAV,OAAgBE,EAAhB,cAA+BvlB,GAE5B,IAccylB,GAA0B,aAAchtB,GAC5CA,IAGTxB,uBAAKC,UAAU,iCACVwtB,EAAcgB,WACd,IAFL,cAKAzuB,sBAAIkG,MAAM,aAGlBwoB,gBAEI1uB,uBAAKC,UAAU,4CACXD,gBAAC2uB,kCAA+B,CAC5BzqB,GAAI6E,EACJhF,QAASA,EACTI,SAAUwJ,EAAMihB,eAChB3rB,KAAM,CACFwqB,cAAe9f,EAAM8f,eAEzBxtB,UAAU,uCACV4uB,cAAelhB,EAAMmhB,aACrBC,cAAephB,EAAMtJ,UACrBzD,iBAAkBA,KAI9BouB,aAEIhvB,gBAACiG,SAAM,CACHhG,UAAU,iCAAgC,aAC9BytB,EACZtnB,QAASmnB,EAAiC5f,KAGlDshB,2BAA4BtB,GAAsBA,EAAmBtX,QAAUsX,EAAmBpU,aAE9FvZ,uBAAKC,UAAU,4BACXD,gBAACyZ,QAAK,CAACvT,MAAOynB,EAAmBjU,gBAAiBrD,OAAQsX,EAAmBtX,OAAQ6Y,OAAQrB,GACzF7tB,4BACK2tB,EAAmBpU,iBAetC4V,EAAkB9f,GAAuB,KAC3CM,OAAO3B,SAASohB,OAAO/f,IAGrB0e,EAA6B,CAAChqB,EAAuBiqB,EACvDvf,EAAgCmf,KAChC,MAAM9S,EAAuC,CACzCC,UAAW,CACPC,GAAI,CAAEC,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,GACrCC,GAAI,CAAEH,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,GACrCkU,GAAI,CAAEpU,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,IAEzCE,UAAU,GAGd,GAAI2S,EAAoB,CACpB,MAAMxoB,EAAQwoB,EAAmBzqB,OAAS,EAAIyqB,EAAmBzqB,OAAS,EAE1E,OACIvD,uBAAKC,UAAU,sCACV+tB,aADL,EACKA,EAAoBsB,MAAM,EAAG9pB,GAAOC,IAAI8pB,IAAO,sBAC5C,MAAMlgB,EAAakgB,EAAKC,YAAclgB,4BAAkBigB,EAAKC,YAAYC,eAAgB1rB,EAAQ6F,mBAAerH,GAAa,GAE7H,OAAQvC,gBAAC6b,IAAK,CACV6T,IAAG,oBAAEH,EAAKC,mBAAP,aAAE,EAAkBC,eAAe3jB,YAAnC,QAA2C,QAC9CgQ,QAAO,oBAAEyT,EAAKC,mBAAP,aAAE,EAAkBC,eAAe3jB,YAAnC,QAA2C,QAClD4J,eAAgB3R,EAAQ6F,cAAc8L,eACtCrB,IAAG,UAAEkb,EAAKC,mBAAP,aAAE,EAAkBC,eAAe3jB,KACtCiQ,IAAG,oBAAEwT,EAAKC,mBAAP,aAAE,EAAkBC,eAAe/e,uBAAnC,QAAsD,GACzDsL,YAAW,UAAEP,8BAAmB,UAAC8T,EAAKC,mBAAN,aAAC,EAAkBC,eAAe/T,OAAQ3X,EAAQ6F,cAAc8L,eAAeiG,oBAApG,QAAoH,GAC/HvM,aAAcrL,EAAQkE,QAAQmH,aAC9BX,cAAeA,UAAiBqM,EAChCmB,oBAAoB,QACpB7V,QAASwnB,GAA0BuB,EAAe9f,GAClDpP,UAAW2tB,EAAyB,eAAiB,QAMzE,OACI5tB,uBAAKC,UAAU,wCAKjBiuB,EAAoBvsB,IACtB,MAAM,KAAEH,GAASG,EACjB,MAAM,GAAN,OAAWH,I,yBC7LR,MAAMmuB,EAAiF,IAAmC,IAAlC,UAAE1vB,EAAF,UAAa2vB,EAAb,KAAwBtc,GAAU,EAC7H,OAAQsc,GACJ,IAAK,QACD,OACI5vB,qBAAGC,UAAW+S,IAAW,sCAAuC/S,IAC1DqT,GAGd,IAAK,SACD,OACItT,qBAAGC,UAAW+S,IAAW,uCAAwC/S,IAC3DqT,GAGd,IAAK,UACL,QACI,OACItT,qBAAGC,UAAU,yCACPqT,M,uxBCnBf,MAAMuc,EAAa,CACtBC,QAAS,IACTC,mBAAoB,IACpBC,WAAY,IACZC,mBAAoB,KAGlBC,EAAgBhuB,eAAOqqB,GAA6E,IAAxD4D,EAAwD,uDAAnC,GACnE,IACI,MAAMtoB,QAAiBuoB,gCAAsB,CAAEzmB,cAAe4iB,GAAO4D,EAAYE,IAASC,SAC1F,GAAIzoB,GAAYA,EAAStE,OAAS,EAC9B,OAAOsE,EAAS,GAAG0oB,OAEzB,MAAOtsB,GACLsoB,EAAIvoB,UAAUC,MAAM,wCAAyCA,KAK/DusB,EAAgC,CAACC,EAA2BC,KAC9D,MAAMC,EAAoBF,EAAY/sB,KAAKktB,GAAcA,EAAWC,cAAgBH,GACpF,GAAIC,EACA,OAAOA,EAAkBG,cAK3BC,EAAevwB,GAAkBwiB,OAAOxiB,EAAMwwB,QAAQ,IAqM7C,UAAOzE,EAAqB0E,EAA6B9mB,KACpE,MAAM5C,QAAsBmlB,2BAAiBH,GAAKvkB,MAAM/D,IACpD,MAAMA,IAGJ4E,EAAYtB,EAAcnE,aAE1B8tB,EAAuB3E,EAAI7W,eAAevN,QAEhD,IAAKU,GAA+C,IAAlCnE,OAAO0P,KAAKvL,GAAWtF,SAAiB2tB,EACtD,MAAM,IAAIvE,MAAM,sBAGpB,MAAM,gBACFwE,EADE,qBAEFC,EAFE,WAGFjB,EAHE,mBAIFkB,EAJE,eAKFC,EALE,cAMFC,EANE,wBAOFC,EAPE,+CAQFC,GACAlqB,GACE,SAAEmqB,GAAaR,EAErB,IACIS,EADAC,EAAY/oB,EAAUN,KAAKspB,WAAa,EAE5C,MAAMC,EAAwB,GACxBC,EAAoBlpB,EAAUN,KAAKypB,cAGzC,GAAIT,GAAiBQ,EAAmB,CACpC,MAAME,EAAgBlB,EAAY1I,KAAKC,IAAIiJ,EAAeK,IACpDM,EApOdhwB,eACIqqB,EACAyF,GAEwB,IADxBG,EACwB,uDADP,EACjBT,EAAwB,uDAAL,MAEnB,MAAMjB,QAAoB2B,8BAAoB,CAAEzoB,cAAe4iB,EAAK1iB,oBAAqB,KAAM7B,MAAM/D,IACjG,MAAMA,IAGV,IAAKwsB,EACD,MAAM,IAAI9D,MAAM,qCAGpB,MAAMmE,EAAeN,EAA8BC,EAAaZ,EAAWG,YAC3E,MAAO,CAEH,cAAe,gEAEf,oBAAqB,WACrB0B,WACAZ,eACAqB,SACAH,iBA6MiCK,CAAqB9F,EAAKwF,EAAmBE,EAAeP,GAC7FI,EAAsB3d,KAAK+d,GAC3BN,EAAYb,EAAYa,EAAYK,GAqBxC,GAjBId,GAAmBA,EAAgB5tB,OAAS,GAC5C4tB,EAAgBlH,KAAKqI,IACjB,GAAIA,EAAeC,SAAWX,EAAY,EAAG,CAAC,IAAD,IACzC,MAAMK,EAAgBlB,EAAY1I,KAAKC,IAAIgK,EAAeC,QAASX,IAC7DY,EAAeF,EAAexB,aAC9B2B,EAAcH,EAAeI,IAC7BC,EAAyBL,EAAeM,eAAiB5P,OAAOC,SAAP,UAAgBqP,EAAeM,sBAA/B,aAAgB,EAA+BC,MAAM,KAAK,GAAI,SAAMtwB,EAC7HuwB,EAA0BR,EAAeM,eAAiB5P,OAAOC,SAAP,UAAgBqP,EAAeM,sBAA/B,aAAgB,EAA+BC,MAAM,KAAK,GAAI,SAAMtwB,EAC9HwwB,EAvNtB7wB,eACIqqB,GAOgC,IANhCyG,EAMgC,uDANX,GACrBb,EAKgC,uDALf,EACjBT,EAIgC,uDAJb,MACnBc,EAGgC,uCAFhCC,EAEgC,uCADhCE,EACgC,uCAAhCG,EAAgC,uCAE5BhC,EAAe0B,EAEnB,IAAK1B,EAAc,CACf,MAAML,QAAoB2B,8BAAoB,CAAEzoB,cAAe4iB,EAAK1iB,oBAAqB,KAAM7B,MAAM/D,IACjG,MAAMA,IAEV,IAAKwsB,EACD,MAAM,IAAI9D,MAAM,qCAEpBmE,EAAeN,EAA8BC,EAAaZ,EAAWE,oBAMzE,MAAO,CAEH,cAAe,gEACf,oBAAqB,WACrB2B,WACAZ,eACAqB,SACAa,aACAC,YAXgBR,EAYhBS,uBAX2BP,EAY3BQ,wBAX4BL,GA+LgBM,CAAsB7G,EAAK+F,EAAevpB,GAAIkpB,EAAeP,EAAUc,EAAcC,EAAaE,EAAwBG,GAC9JhB,EAAsB3d,KAAK4e,GAC3BnB,EAAYb,EAAYa,EAAYK,GAExC,OAAqB,IAAdL,IAKXrqB,EAAc8rB,sBAAwB,EAAG,CACzC,MAAMpB,EAAgBlB,EAAY1I,KAAKC,IAAI/gB,EAAc8rB,sBAAuBzB,IAC1E0B,EA5FdpxB,eACIqqB,EACA4F,GACwB,IAAxBT,EAAwB,uDAAL,MAEnB,MAAM6B,EAAa,KACdhH,EAAI7W,eAAe+S,KAAK+K,iBACzBjH,EAAIvoB,UAAUC,MAAM,0DAGxB,MAAMwsB,QAAoB2B,8BAAoB,CAAEzoB,cAAe4iB,EAAK1iB,oBAAqB,KAAM7B,MAAM/D,IACjG,MAAMA,IAGLwsB,GACDlE,EAAIvoB,UAAUC,MAAM,0CAGxB,MAAM6sB,EAAeN,EAA8BC,EAAaZ,EAAWI,oBAI3E,OAHKa,GACDvE,EAAIvoB,UAAUC,MAAM,mCAEjB,CACH,cAAe,gEACf,oBAAqB,WACrBytB,WACAZ,eACAqB,SAGAoB,cA8DyCE,CAAgClH,EAAK0F,EAAeP,GAC7FI,EAAsB3d,KAAKmf,GAC3B1B,EAAYb,EAAYa,EAAYK,GAIxC,GAAIL,EAAY,EAAG,CACf,IAAImB,EAEJ,GAAItB,IAAmDlqB,EAAc8C,yBACjE0oB,EA/HZ7wB,eACI6B,GAGiD,IAFjD2vB,EAEiD,uDAFhC,EACjBC,EACiD,uDAD9B,MACnBnC,EAAiD,uCAEjD,MAAMf,QAAoB2B,8BAAoB,CAAEzoB,cAAe5F,EAAS8F,oBAAqB,KAAM7B,MAAM/D,IACrG,MAAMA,IAGJuuB,EAAehC,EAA8BC,EAAaZ,EAAWC,SAErE8D,EAAiC,CAEnC,cAAe,gEACf,oBAAqB,WACrBlC,SAAUiC,EACVxB,OAAQuB,EACR5C,aAAc0B,EACdqB,wBAAyBrC,GAG7B,OAAOoC,EAyG+BE,CAC1BvH,EACAqF,EACAF,EACAF,OAED,CACH,IAAKJ,EACD,MAAM,IAAIzE,MAAM,sCAEpBoG,EA/MZ7wB,eACIqqB,EACA6E,GAIwB,UAHxBjB,EAGwB,uDAHH,GACrBgC,EAEwB,uDAFP,EACjBT,EACwB,uDADL,MACnBJ,EAAwB,uCAExB,MAAMb,QAAoB2B,8BAAoB,CAAEzoB,cAAe4iB,EAAK1iB,oBAAqB,KAAM7B,MAAM/D,IACjG,MAAMA,IAGV,IAAI8vB,EAAa3C,EAAqB4C,WAMtC,GAJKD,IACDA,QAAmB7D,EAAc3D,EAAK4D,KAGrCM,EACD,MAAM,IAAI9D,MAAM,gCAGpB,IAAKoH,EACD,MAAM,IAAIpH,MAAM,4BAGpB,MAAMmE,EAAY,UAAGM,EAAqB6C,kBAAxB,QAAsCzD,EAA8BC,EAAaZ,EAAWC,SACxG8D,EAAiC,CAEnC,cAAe,gEACf,oBAAqB,WACrBlC,WACAS,SACArB,eACAkD,WAAYD,GAyBhB,OAvBAH,EAAeM,qBAAf,SACO9C,GADP,IAEI4C,WAAYD,EAGZ,cAAe,sEACfI,MAAO/C,EAAqB+C,OAAS,OACjC/C,EAAqBgD,eAAiB,CACtCA,cAAc,EAAD,KACNhD,EAAqBgD,eADf,IAET,cAAe,mEAGnB9C,GAAkB,CAClB+C,MAAO/C,EAAe+C,MACtBC,QAAShD,EAAeiD,yBACxBC,SAAUlD,EAAemD,OACzBC,KAAMpD,EAAeoD,KACrBC,MAAOrD,EAAeqD,MACtBC,IAAKtD,EAAeuD,UAIrBjB,EAoJ+BkB,CAC1BvI,EACA6E,EACAjB,EACAyB,EACAF,EACAJ,GAIRQ,EAAsB3d,KAAK4e,GAG/B,GAAIjB,EAAsBvuB,OAAS,IAE/BouB,QAAwBpN,QAAQwQ,IAAIjD,GAAuB9pB,MAAM/D,IAC7D,MAAMA,KAGL0tB,GAA8C,IAA3BA,EAAgBpuB,QACpC,MAAM,IAAIopB,MAAM,qDAIxB,MAAMqI,EAAc/D,GAAsBpoB,EAAUN,KAAK0sB,QAGnDC,QAAmBC,wBACrB,CAAExrB,cAAe4iB,EAAK6I,YAAa,OACnCvsB,EAAUN,KAAKQ,GACfsoB,OACA9uB,OACAA,EACAovB,GAAmB,KACnBqD,GACFhtB,MAAM9F,UAC+D,IAAD,EAE3B,EAFnCqF,EAAckqB,iDAEd,UAAIxtB,EAAMhB,YAAV,OAAI,EAAYoyB,yBACN9tB,EAAcT,mCAAmC,CAAEC,iCAAiC,UAEpFQ,EAAc+tB,gCAAgC,CAAEC,6BAA8BtxB,SAAF,UAAEA,EAAOhB,YAAT,aAAE,EAAaoyB,4BAE3F9tB,EAAciuB,2BAA2B,CAAEC,yBAAyB,IAEtEtrB,UACM5C,EAAcnE,aAAasyB,YAAY,UACvCnuB,EAAcT,mCAAmC,CAAEC,iCAAiC,OAKtG,MAAM9C,IAGV,IAAKixB,EACD,MAAM,IAAIvI,MAAM,wCAGpB,OAAOuI,I,oCCnXX,kDAOO,MAAMS,EAA0B,QAAC,KAAEriB,EAAF,UAAQrT,GAAT,SAA0BD,wBAAMC,UAAWA,GAC7E,IACAqT,EACA,O,s8BCmFL,IAAMsiB,EAAN,cAAiC51B,YAY7B0B,YAAYC,EAAgDyJ,GACxDxJ,MAAMD,GAuPO,KAAAk0B,mBAAqB,KAClC,MAAM,QAAE9xB,EAAF,UAAWM,GAAclC,KAAKR,OAC9B,UAAEqC,GAAcD,GAChB,6BAAE+xB,EAAF,6BAAgCC,GAAiC1xB,EACjE2xB,EAAQ7zB,KAAKiJ,MAAM6qB,iBACnBC,EAAmBF,GAASA,EAAMzyB,QAAUyyB,EAC7CvtB,OAAO8mB,GAAQA,EAAKhvB,WACpBkF,IAAI8pB,GAAQA,EAAK4G,iBAEtB,GAAID,GAAoBA,EAAiB3yB,OAAS,EAAG,CACjD,MAAM6yB,EAAgBF,EAAiB,GAAGG,cACpCC,EAAoC,IAC1CC,sCAA4B,CAAE5sB,cAAe5F,EAAQ6F,eAAiBwsB,EAAgBF,GACjFtuB,KAAK1F,UACFC,KAAK0V,SAAS,CACV0B,YAAawc,EACbrc,gBAAiB,UACjBC,aAAc,eACdtD,QAAQ,UAGN,IAAIkO,QAAQC,GAAW7D,WAAW6D,EAAS8R,IACjD3mB,OAAO3B,SAASwoB,WAEnBxuB,MAAM/D,IACHD,EAAU6e,QAAQ,4EAClB7e,EAAUC,MAAMA,GAChB9B,KAAK0V,SAAS,CACV0B,YAAauc,EACbpc,gBAAiB,UACjBC,aAAc,eACdtD,QAAQ,QAMX,KAAAmY,yBAA2B,KAAa,QACrD,IAAIJ,EAAMC,YAAW,gBAAiBlsB,KAAKR,MAAMoC,QAAQ6F,gBAAkB,GAE3E,OADAwkB,EAAMA,EAAIG,SAAS,KAAOH,EAAIqI,OAAO,EAAGrI,EAAIsI,QAAQ,MAAQtI,EAC5D,UAAIjsB,KAAKR,MAAMsB,KAAKwqB,qBAApB,iBAAI,EAA+BtqB,cAAnC,OAAI,EAAuCwzB,YAAY5tB,GAC7C,GAAN,OAAUqlB,EAAV,eAAoBjsB,KAAKR,MAAMsB,KAAKwqB,cAActqB,OAAOwzB,YAAY5tB,IAElE,IAIM,KAAA6tB,qBAAuB10B,UACpC,MACM20B,EADQ10B,KAAKiJ,MAAM6qB,iBACGxtB,OAAO8mB,GAAQA,EAAKhvB,WAChD,GAAIs2B,EAActzB,OAAS,EACvB,IAAK,MAAMuzB,KAAeD,EAAe,CAAC,IAAD,UACrC,MAAMvJ,EAAO,oBAAGwJ,EAAYtH,mBAAf,aAAG,EAAyBC,eAAe/T,cAA3C,QAAqD,GAC5DtN,EAAO,oBAAG0oB,EAAYtH,mBAAf,aAAG,EAAyBC,sBAA5B,QAA8C,CAAEjhB,SAAU,EAAGuoB,iBAAkB,EAAGxN,UAAW,EAAGzM,MAAO,EAAGka,cAAe,GAChI3d,EAAQ,UAAGyd,EAAYX,gBAAgBjkB,gBAA/B,QAA2C,EACzD/P,KAAK80B,cAAc7oB,EAASiL,EAAUiU,GAG9C,OAAO/I,QAAQC,aAAQ,IAqDV,KAAA0S,eAAkBC,GAC3B5nB,IAASC,UACF,IAAIE,IAAIC,OAAO3B,SAAS4B,MAE5B,IAAIF,IAAIynB,EAAW/I,IAAIgJ,WAAWxnB,MAM5B,KAAAynB,eAAiB,KAC9Bl1B,KAAK0V,SAAS,CACVyV,QAASnrB,KAAKiJ,MAAMkiB,QACpB/T,YAAapX,KAAKiJ,MAAMmO,YACxBG,gBAAiBvX,KAAKiJ,MAAMsO,gBAC5BC,aAAcxX,KAAKiJ,MAAMuO,aACzBtD,OAAQlU,KAAKiJ,MAAMiL,OACnBihB,gCAAgC,KAIvB,KAAAC,6BAA+B,IACvCp1B,KAAKiJ,MAAMosB,0BAKZx3B,gBAACy3B,wBAAqB,CAClBx3B,UAAU,gCACViE,GAAI/B,KAAKR,MAAMuC,GACfC,SAAUhC,KAAKR,MAAMwC,SACrBJ,QAAS5B,KAAKR,MAAMoC,QACpBgrB,cAAe5sB,KAAKu1B,0CACpBz0B,KAAMd,KAAKiJ,MAAMosB,0BACjBG,UAAWx1B,KAAKiJ,MAAMksB,+BACtBM,QAASz1B,KAAKk1B,iBAZX,KA0BE,KAAAQ,kBAAoB,KACjC,MAAM,OAAEl1B,EAAF,QAAUoB,EAAV,KAAmBd,EAAnB,UAAyBoB,GAAclC,KAAKR,MAC5C8rB,EAAgBxqB,GAAQA,EAAKwqB,eAAiBxqB,EAAKwqB,cAActqB,OACvE,IAAKsqB,EACD,OAAO,KAGX,MAAMhe,EAAUtN,KAAK+0B,eAAenzB,EAAQkE,SACtC6vB,EAAen1B,EAAOm1B,cAAgB,GAEtCC,EADoB51B,KAAK61B,wBACOF,EAChCG,EAAaxK,GAAiBA,EAAcgB,WAC5CyJ,EAAe7zB,EAAU8zB,gBACzBC,EAAW/zB,EAAUg0B,YAE3B,OAAIJ,GAAcH,EACP,KAIP93B,gBAACs4B,yBAAsB,CACnBr4B,UAAS,UAAKkC,KAAKlC,UAAV,gBACTkF,KAAK,aAAY,aACLd,EAAUk0B,oBACtBnK,IAAK3e,EAAQG,KACb4oB,IAAI,OACJpnB,MAAO6mB,EACPH,aAAcA,EACdW,aAAcV,EACdG,aAAc/1B,KAAKu2B,YAAYR,GAC/BE,SAAUj2B,KAAKw2B,YAAYP,GAC3BQ,kBAAmBV,EACnBW,cAAeT,KAwEV,KAAAU,wBAA2Bn3B,IACxC,IAAIyJ,EAAQ,CACR2tB,oBAAqB52B,KAAKiJ,MAAM2tB,oBAEhCp3B,IACAyJ,EAAK,OAAQA,GAAU,CACnB4tB,oBAAqBC,sCAA4Bt3B,MAGzDQ,KAAK0V,SAASzM,IAID,KAAA8tB,WAAa,KAC1B/2B,KAAK0V,SAAS,CACVxB,QAAQ,KAIC,KAAA8iB,gBAAkB,CAAC7L,EAAiBjU,EAAkB1X,KACnE,MAAM,QAAEoC,EAAF,KAAWd,EAAX,UAAiBe,EAAjB,OAA4BrB,EAA5B,UAAoC0B,GAAclC,KAAKR,OACvD,cAAE8rB,GAAkBxqB,EAE1B,GAAIc,GACI0pB,WAAetqB,OAAQ,CACvB,MAAMi2B,EAAyB3L,EAActqB,OAAO6qB,mBACpD,GAAIoL,EAAwB,CACxB,MAAMC,EAAiBD,EAAuBE,UAAWtD,GAA6BA,EAAMG,gBAAgB3kB,SAAW8b,GACjHiM,EAAkB,KAAQH,EAAuBC,IACvD,GAAID,EAAuBC,GAAgBlD,gBAAgBjkB,WAAamH,EACpE,OAEJ,MAAMmgB,EAAeD,EAAmBpD,gBAAgBjkB,SACxDqnB,EAAmBpD,gBAAgBjkB,SAAWmH,EAC9C,MAAM,YAAEmW,GAAyB+J,EAAThK,EAAxB,YAAiCgK,EAAjC,GAGI53B,IACAA,EAAM0X,SAAWA,EACjBlX,KAAK0V,SAAS,CACVmhB,oBAAqBC,sCAA4Bt3B,MAIzDQ,KAAK0V,SAAS,CACV4hB,6BAA6B,IAGjCC,sCAA4B,CAAE/vB,cAAe5F,EAAQ6F,eAAiB6jB,EAActqB,OAAOwzB,YAAY5tB,GAAI,CAACwmB,EAAK4G,kBAC5GvuB,KAAKgF,IASF,GARAzK,KAAK0V,SAAS,CACVyV,UACA/T,YAAa,GACbG,gBAAiB,UACjBC,aAAc,eACd8f,6BAA6B,EAC7BpjB,QAAQ,IAERzJ,EAAM,CACN,MAAM+sB,EAAU/sB,EAAKlJ,KAAKsyB,GAASA,EAAMxkB,SAAW8b,GACpD8L,EAAuBC,GAAgBlD,gBAAkBwD,EACzD,MAAMC,EAAe,IAAIR,GACzBQ,EAAaP,GAAkB,CAAE7J,cAAa2G,gBAAiBwD,GAC/D,MAAME,EAAoB,OAAQpM,EAActqB,QAAtB,IAA8B22B,iBAAkBF,IAC1E71B,EAAQ6F,cAAcmwB,OAAO,IAAIC,gCAA8Bj2B,EAAQ6F,cAAc8L,eAAgB/S,GAASk3B,MAGrH7xB,MAAM/D,IACHD,EAAU6e,QAAQ,6DAClB7e,EAAUC,MAAMA,GAChB,MAAMsV,EAAclV,EAAU41B,mCAC1Bt4B,GACAA,IAAUA,EAAMw0B,gBAAgBjkB,SAAWsnB,GAC3Cr3B,KAAK0V,SAAS,CACVyV,UACA/T,cACAG,gBAAiB,SACjBC,aAAc,8BACd8f,6BAA6B,EAC7BpjB,QAAQ,EACR2iB,oBAAqBC,sCAA4Bt3B,OAGrD43B,EAAmBpD,gBAAgBjkB,SAAWsnB,EAC9Cr3B,KAAK0V,SAAS,CACVyV,UACA/T,cACAG,gBAAiB,SACjBC,aAAc,8BACd8f,6BAA6B,EAC7BpjB,QAAQ,UASvB,KAAA4gB,cAAgB,CAAC7oB,EAAwBiL,EAAkBiU,KACxE,MAAM,QAAEvpB,EAAF,KAAWd,EAAX,UAAiBoB,EAAjB,UAA4BL,GAAc7B,KAAKR,OAC/C,KAAE4G,GAAStF,GACX,qBAAEi3B,EAAF,0BAAwBC,GAA8B91B,EAE5D,GAAIN,GACIwE,EAAKpF,OAAQ,CACb,MAAM4e,EAAwB,CAC1B3T,UACA5I,MAAO6T,GAGX9Q,EAAKpF,OACAof,iBAAiBR,GACjBna,KAAMzE,GACmB,YAAlBA,EAAOT,OACA03B,qCACH,IAAIC,+BACAjsB,EAAQI,SACRrM,KAAKR,MAAMoC,QAAQ6F,cAAc8L,eAAeiG,YAAY0E,UAC5DjS,GACJjM,KAAKR,MAAMoC,QAAQ6F,eAAehC,KAAK0yB,IACvC,IAAKA,EACD,OAAOC,IAAY9V,OAAO,oCAG9B,MAAM+V,EAAsD,iBAAzCz2B,EAAQmd,IAAIve,OAAO83B,kBAetC,OAdAt4B,KAAK0V,SAAS,CACVyV,UACA/T,YAAa,GACbG,gBAAiB,UACjBC,aAAc,eACdtD,QAAQ,EACRihB,gCAAiCkD,EACjChD,0BAA2B,CACvBppB,UACAssB,aAAcJ,EACdjhB,YAEJ0f,oBAAoB,IAEjBwB,IAAY/V,YAEK,gBAArBrhB,EAAOqf,WACdrgB,KAAK0V,SAAS,CACVyV,UACA/T,YACI2gB,EACKtnB,QAAQ,gBAAiByG,EAASxG,YAClCD,QAAQ,gBAAiB7O,EAAQmd,IAAIve,OAAOg4B,kCAAkC9nB,aAFnF,2BAGoB9O,EAAQmd,IAAIve,OAAOg4B,kCAHvC,sCAIJjhB,gBAAiB,SACjBC,aAAc,8BACdtD,QAAQ,IAELkkB,IAAY/V,YAEvBxgB,EAAU0c,MAAM,mFAChBve,KAAK0V,SAAS,CACVyV,UACA/T,YAAa4gB,EACbzgB,gBAAiB,SACjBC,aAAc,8BACdtD,QAAQ,IAELkkB,IAAY/V,YAGtBxc,MAAO/D,IACJD,EAAU6e,QAAQ5e,EAAM9D,SACxB6D,EAAU0c,MAAM,yFAChBve,KAAK0V,SAAS,CACVyV,UACA/T,YAAa4gB,EACbzgB,gBAAiB,SACjBC,aAAc,8BACdtD,QAAQ,QAOf,KAAAukB,kCAAqCrL,IAClD,MAAM,QAAExrB,EAAF,KAAWd,EAAX,UAAiBe,GAAc7B,KAAKR,OACpC,cAAE8rB,GAAkBxqB,EAE1B,GAAIc,GAAWA,EAAQ6F,cAAe,CAClC,MAAM0sB,EAAoC,IACxBvyB,EAAQkE,QAAQwgB,KAAK+K,iBAAmBzvB,EAAQkE,QAAQwgB,KAAKoS,OAC3EC,MAAarN,KAAetqB,QAAUosB,EACtCgH,sCAA4B,CAAE5sB,cAAe5F,EAAQ6F,eAAiB2lB,EAAK4G,gBAAgBE,cAAgB,CAAC9G,EAAK4G,kBAC5GvuB,KAAK1F,gBAEI,IAAIqiB,QAAQC,GAAW7D,WAAW6D,EAAS8R,IACjD3mB,OAAO3B,SAASwoB,WAEnBxuB,MAAM/D,IACHD,EAAU6e,QAAQ,4EAClB7e,EAAUC,MAAMA,KAGxBD,EAAU6e,QACN,qHAMC,KAAAkY,gBAAkB74B,UAC/ByN,OAAO3B,SAASwoB,SACTjS,QAAQC,WAGF,KAAAwW,gBAAkB,KAC/B,MAAM,QAAEj3B,EAAF,KAAWd,EAAX,UAAiBe,EAAjB,UAA4BK,GAAclC,KAAKR,OAC/C,cAAE8rB,GAAkBxqB,EAE1B,GAAIc,GAAWA,EAAQ6F,cAAe,CAElC,GADkB7F,EAAQkE,QAAQwgB,KAAK+K,iBAAmBzvB,EAAQkE,QAAQwgB,KAAKoS,OAC9DpN,GAAiBA,EAActqB,OAAQ,CACpD83B,sBAAY,CAAEtxB,cAAe5F,EAAQ6F,eAAiB6jB,EAActqB,OAAOwzB,aACtE/uB,OACAI,MAAO/D,IAAiB,MACrBD,EAAU6e,QAAQ,qDAClB7e,EAAUC,MAAMA,GAChB9B,KAAK0V,SAAS,CACVyV,SAAS,UAAAG,EAActqB,cAAd,eAAsBwzB,YAAY5tB,KAAM,GACjDwQ,YAAalV,EAAU62B,8BACvBxhB,gBAAiB,SACjBC,aAAc,8BACdtD,QAAQ,MAGpB,MAAM8kB,EAAU9M,YAAW,oBAAqBlsB,KAAKR,MAAMoC,QAAQ6F,eAC/DuxB,GACAxrB,OAAO3B,SAASohB,OAAO+L,QAG3Bn3B,EAAU6e,QAAQ,uFAGtB7e,EAAU6e,QAAQ,sDAQT,KAAAuY,aAAe,KAC5B,MAAM,QAAEr3B,GAAY5B,KAAKR,MAGzB,GAAIoC,EAAQkE,SAAWlE,EAAQkE,QAAQ+d,QAA0C,WAAhCjiB,EAAQkE,QAAQ+d,OAAOC,KACpE,MAAO,KAGX,GAAI1W,IAASC,WAAaG,OAAO0rB,WAAY,CACzC,MAAMjsB,EAAerL,EAAQkE,QAAQmH,aACrC,GAAIA,EACA,OAAIA,EAAa4L,IAAMrL,OAAO0rB,YAAcjsB,EAAa4L,GAAGE,EACjD,KACA9L,EAAaksB,IAAM3rB,OAAO0rB,YAAcjsB,EAAaksB,GAAGpgB,EACxD,KACA9L,EAAamsB,IAAM5rB,OAAO0rB,YAAcjsB,EAAamsB,GAAGrgB,EACxD,KACA9L,EAAagM,IAAMzL,OAAO0rB,YAAcjsB,EAAagM,GAAGF,EACxD,KAEJ,KAKf,MAAO,MAQM,KAAAwd,YAAe8C,GAExBx7B,uBAAKC,UAAU,wBACXD,wBAAMC,UAAS,UAAKkC,KAAKR,MAAMgB,OAAO1C,UAAvB,qBAAmD,cAAc,SAChFD,wBAAMC,UAAU,aACXu7B,IAWA,KAAA7C,YAAe8C,GAExBz7B,uBAAKC,UAAU,wBACXD,wBAAMC,UAAU,aACXw7B,GAELz7B,wBAAMC,UAAS,UAAKkC,KAAKR,MAAMgB,OAAO1C,UAAvB,sBAAoD,cAAc,UA9yBzFkC,KAAKlC,UAAY,oBACjBkC,KAAKu5B,UAAY/5B,EAAMoC,QAAQkE,SAAWtG,EAAMoC,QAAQkE,QAAQ+d,QAAgD,WAAtCrkB,EAAMoC,QAAQkE,QAAQ+d,OAAOC,KAAoB,KAAO,KAClI9jB,KAAKw5B,gBAAkBx5B,KAAKw5B,gBAAgBxlB,KAAKhU,MAEjDA,KAAKiJ,MAAQ,CACTkiB,QAAS,GACT/T,YAAa,GACbG,gBAAiB,UACjBC,aAAc,eACdtD,QAAQ,EACRihB,gCAAgC,EAChCsE,qCAAqC,EACrC3F,iBAAkB,GAClB8C,oBAAoB,EACpBU,6BAA6B,GAEjCt3B,KAAKvB,iBAAmB4J,6BAAmBrI,KAAKR,MAAMoC,QAAQkE,QAAQwC,kBAAoBtI,KAAKR,MAAM+I,aAAcvI,KAAKR,MAAMqC,WAC9H7B,KAAKw5B,kBAEDpsB,IAASC,YAAcrN,KAAKR,MAAMoC,QAAQkE,QAAQwgB,KAAK+K,iBACvD7jB,OAAO3B,SAASohB,OAAOjtB,KAAKR,MAAMoC,QAAQkE,QAAQwgB,KAAKoT,WAAa,KA1BtD,eAClB,MAA2B,OAAnB15B,KAAKu5B,WAAyC,OAAnBv5B,KAAKu5B,UA8Bd,0BAC1Bv5B,KAAK0V,SAAS,IACd,MAAM4V,QAAsBtrB,KAAKR,MAAMsB,KAAKwqB,cAC5CtrB,KAAKR,MAAMgB,OAAOuQ,QAASI,MAAOma,aAAA,EAAAA,EAAekJ,YAAY7qB,OAAQ,GACrE3J,KAAK0V,SAAS,CACVoe,iBAAkBxI,aAAF,EAAEA,EAAeO,qBAGjCze,IAASC,YACTG,OAAO2O,iBAAiB,SAAUnc,KAAKw5B,iBACvCx5B,KAAKw5B,mBAING,uBACCvsB,IAASC,WACTG,OAAOosB,oBAAoB,SAAU55B,KAAKw5B,iBAI3C1wB,sBAAsBC,EACzBC,GACA,OAAIhJ,KAAKiJ,QAAUD,GAAahJ,KAAKR,QAAUuJ,EAM5CG,SACH,MAAM,QAAE6H,EAAF,UAAWjT,GAAckC,KAAKR,MAAMgB,QACpC,4BAAEq5B,EAAF,+BAA+BC,GAAmC95B,KAAKR,MAAM0C,WAC7E,cAAEopB,EAAF,KAAiBllB,GAASpG,KAAKR,MAAMsB,KAE3C,GAAoB,YAAhBsF,EAAK7F,QAAwByZ,mBAAiBC,kBAAkBqR,IAA2C,YAAzBA,EAAc/qB,OAAsB,CACtH,MAAMw5B,EAAU,OACR/5B,KAAKR,OADG,IAEZi0B,mBAAoB,CAChBnpB,YAAatK,KAAKR,MAClB1B,UAAW+S,IAAW7Q,KAAKlC,UAAWA,IAE1CyC,OAAQ,UACRy5B,cAAen8B,gBAACo8B,kCAA+B,CAACxM,UAAU,UAAUtc,KAAK,eACzEJ,QAASA,GAAWlT,gBAACq8B,UAAO33B,eAACzE,UAAS,UAAKkC,KAAKlC,UAAV,cAAoCiT,IAC1E7O,UAAWlC,KAAKR,MAAM0C,YAE1B,OAAOlC,KAAKR,MAAMwL,WAAW+uB,GAGjC,GAAoB,WAAhB3zB,EAAK7F,QAAgD,WAAzB+qB,EAAc/qB,OAAqB,CAC/D,MAAMw5B,EAAU,OACR/5B,KAAKR,OADG,IAEZi0B,mBAAoB,CAChBnpB,YAAatK,KAAKR,MAClB1B,UAAW+S,IAAW,GAAD,OAAI7Q,KAAKlC,WAAaA,IAE/CyC,OAAQ,SACRy5B,cAAen8B,gBAACo8B,kCAA+B,CAACxM,UAAU,SAAStc,KAAM2oB,IACzE/oB,QAASA,GAAWlT,gBAACq8B,UAAO33B,eAACzE,UAAS,UAAKkC,KAAKlC,UAAV,cAAoCiT,IAC1E7O,UAAWlC,KAAKR,MAAM0C,YAG1B,OAAOlC,KAAKR,MAAMwL,WAAW+uB,GAGjC,MAAMI,EAAsB7O,GAAiBA,EAActqB,OACrD6qB,EAAqBsO,GAAuBA,EAAoBtO,mBAEtE,IAAKsO,IAAwBtO,GAAoD,IAA9BA,EAAmBzqB,OAAc,CAChF,GAAI+4B,IAAwBn6B,KAAKo6B,gBAAkBhtB,IAASC,UAExD,OADAG,OAAO3B,SAAS4B,KAAOzN,KAAKqsB,2BACrB,KAGX,MAAMgO,EAAc,OACZr6B,KAAKR,OADO,IAEhBi0B,mBAAoB,CAChBnpB,YAAatK,KAAKR,MAClB1B,UAAW+S,IAAW,GAAD,OAAI7Q,KAAKlC,WAAaA,IAE/CyC,OAAQ,QACRy5B,cAAen8B,gBAACo8B,kCAA+B,CAACxM,UAAU,QAAQtc,KAAM0oB,IACxE9oB,QAASA,GAAWlT,gBAACq8B,UAAO33B,eAACzE,UAAS,UAAKkC,KAAKlC,UAAV,cAAoCiT,IAC1E7O,UAAWlC,KAAKR,MAAM0C,YAG1B,OAAOlC,KAAKR,MAAMwL,WAAWqvB,GAGjC,MAAMvwB,EAAS,OACP9J,KAAKR,OADE,IAEXi0B,mBAAoB,CAChBnpB,YAAatK,KAAKR,MAClB1B,UAAW+S,IAAW,GAAD,OAAI7Q,KAAKlC,WAAaA,IAE/CyC,OAAQ,UACR+5B,sBAAuBt6B,KAAKiJ,MAAMiL,QAC9BrW,uBAAKC,UAAS,UAAKkC,KAAKlC,UAAV,qBACVD,gBAACyZ,QAAK,CAACvT,MAAO/D,KAAKiJ,MAAMsO,gBAAiBrD,OAAQlU,KAAKiJ,MAAMiL,OAAQ6Y,OAAQ/sB,KAAK+2B,YAC9El5B,oCAAgB,aACXmC,KAAKiJ,MAAMmO,eAK5BrG,QAASA,GAAWlT,gBAACq8B,UAAO33B,eAACzE,UAAS,UAAKkC,KAAKlC,UAAV,cAAoCiT,IAC1Eia,qBAAsB,CAClBltB,UAAU,GAAD,OAAKkC,KAAKlC,UAAV,eACTiF,IAAK,OAETw3B,cAAe,CACXz8B,UAAU,GAAD,OAAKkC,KAAKlC,UAAV,WACTiF,IAAK,QACLC,KAAM,QAEVw3B,iBAAkB,CACd18B,UAAU,GAAD,OAAKkC,KAAKlC,UAAV,eACTiF,IAAK,MAET03B,qBAAsBz6B,KAAK06B,yBAAyB16B,KAAKR,MAAM0C,WAC/DorB,eAAgB,CACZxvB,UAAU,GAAD,OAAKkC,KAAKlC,UAAV,qBACTiF,IAAK,KAET43B,WAAY36B,KAAK46B,qBACjBC,UAAW,CAAEC,eAAgBC,IAAS/6B,KAAKg3B,gBAAiB,MAC5DgE,aAAch7B,KAAKi7B,4BAA4Bd,GAC/Ce,WAAYl7B,KAAK01B,oBACjByF,sBAAuBn7B,KAAKo1B,+BAC5BgG,qBAAsBp7B,KAAKq7B,6BAA6BlB,EAAoB3F,YAAY5tB,IACxFgwB,mBAAoB52B,KAAKiJ,MAAM2tB,mBAC/B0E,uBAAwBt7B,KAAK22B,wBAC7BE,oBAAqB72B,KAAKiJ,MAAM4tB,oBAChCne,SAAU1Y,KAAK0Y,WAGnB,OAAO1Y,KAAKR,MAAMwL,WAAWlB,GAG1ByxB,SAASnO,EAAmChvB,GAC/CgvB,EAAKhvB,UAAYA,EAEjB,MAAMo9B,EAAUx7B,KAAKiJ,MAAM6qB,iBAAiBxwB,IAAI2I,IAAU,QAItD,OAHI,UAAAA,EAAQohB,mBAAR,eAAqBC,eAAe/T,WAApC,UAA+C6T,EAAKC,mBAApD,aAA+C,EAAkBC,eAAe/T,UAChF6T,EAAKhvB,UAAYA,GAEd6N,KACL,GAENjM,KAAK0V,SAAS,CACVoe,iBAAkB0H,IAInBC,YAAYr9B,GACf,MAAMo9B,EAAUx7B,KAAKiJ,MAAM6qB,iBAAiBxwB,IAAI8pB,IAC5CA,EAAKhvB,UAAYA,EACVgvB,KACL,GAENptB,KAAK0V,SAAS,CACVoe,iBAAkB0H,IAIlBd,yBAAyBx4B,GAC7B,MAAM,kBAAEw5B,EAAF,YAAqBhe,EAArB,qBAAkCie,EAAlC,eAAwDC,EAAxD,oBAAwEC,EAAxE,mBAA6FC,EAA7F,kBAAiHC,GAAsB75B,EACvI85B,EAA2C,CAC7CC,cAAeP,EACfxS,YAAaxL,EACbwe,iBAAkBP,EAClBQ,WAAYP,EACZQ,gBAAiBP,EACjBQ,eAAgBP,EAChBC,oBACAlI,MAAO7zB,KAAKiJ,MAAM6qB,iBAClBpb,SAAU1Y,KAAK0Y,SACf4jB,aAAel+B,IACX4B,KAAKy7B,YAAYr9B,KAIzB,OAAOP,gBAAC0+B,4BAAyBh6B,iBAAKy5B,IAGlCX,6BAA6BmB,GACjC,OACI3+B,gBAAC4+B,IAAwBl6B,iBACjBvC,KAAKR,MAAK,CACdg9B,gBAAiBA,EACjB9H,cAAe10B,KAAKiJ,MAAM6qB,iBAAiBxtB,OAAO8mB,GAAQA,EAAKhvB,WAC/Ds+B,oBAAqB18B,KAAKy0B,qBAC1BkI,kBAAmB38B,KAAK0zB,mBACxBkJ,eAAgB58B,KAAK0Y,YAKzBmkB,2CACJ,MAAO,CACHC,mBAAoB98B,KAAKR,MAAM0C,UAAU46B,mBACzCC,6BAA8B/8B,KAAKR,MAAM0C,UAAU66B,6BACnDC,mCAAoCh9B,KAAKR,MAAM0C,UAAU86B,mCACzDC,mCAAoCj9B,KAAKR,MAAM0C,UAAU+6B,mCACzDC,sCAAuCl9B,KAAKR,MAAM0C,UAAUg7B,sCAC5DC,kCAAmCn9B,KAAKR,MAAM0C,UAAUi7B,mCAIxD5H,0CACJ,MAAO,CACHuH,mBAAoB98B,KAAKR,MAAM0C,UAAU46B,mBACzCC,6BAA8B/8B,KAAKR,MAAM0C,UAAU66B,6BACnDK,iCAAkCp9B,KAAKR,MAAM0C,UAAUk7B,iCACvDC,oCAAqCr9B,KAAKR,MAAM0C,UAAUm7B,oCAC1DC,iCAAkCt9B,KAAKR,MAAM0C,UAAUo7B,iCACvD36B,cAAe3C,KAAKR,MAAM0C,UAAUS,cACpCuL,kBAAmBlO,KAAKR,MAAM0C,UAAUgM,kBACxCC,iBAAkBnO,KAAKR,MAAM0C,UAAUiM,kBAiEvC8sB,4BAA4B3P,GAChC,MAAM,GAAEvpB,EAAF,SAAMC,EAAN,QAAgBJ,EAAhB,UAAyBM,GAAclC,KAAKR,OAC5C,2BACF+9B,EADE,yBAEFC,EAFE,yBAGFC,EAHE,sBAIFC,EAJE,wBAKFC,EALE,wBAMFC,EANE,wBAOFC,GACA37B,EAEE47B,EAAmD,CACrDh9B,KAAM,CAAEwqB,iBACRvpB,KACAC,WACAJ,UACAnD,iBAAkBuB,KAAKvB,iBACvBysB,SAAU,CACN6S,iBAAkB/9B,KAAK44B,gBACvBoF,iBAAkBh+B,KAAK64B,iBAE3BoF,iCAAkCj+B,KAAKk+B,0CAA0Ch8B,GACjFA,UAAW,CACPq7B,6BACAC,2BACAC,2BACAE,0BACAC,0BACAC,0BACAH,wBACAS,gCAAiCn+B,KAAK68B,6CAI9C,OAAOuB,mCAAyBN,GAG5BI,0CAA0Ch8B,GAC9C,MAAO,CACHm8B,yBAA0Bn8B,EAAUo8B,6BACpCC,wBAAyBr8B,EAAUs8B,mBACnCC,2BAA4Bv8B,EAAUs8B,mBACtCE,yBAA0B,GAC1BC,yBAA0Bz8B,EAAUy8B,yBACpCC,yBAA0B18B,EAAU28B,8BACpCC,+BAAgC58B,EAAUoC,gBA4C1C81B,eACJ,OAAwC,IAAjCp6B,KAAK61B,wBAGRA,wBACJ,MAAMF,EAAe31B,KAAKR,MAAMgB,OAAOm1B,cAAgB,GACvD,OAAO31B,KAAKR,MAAMoC,QAAQkE,QAAQ2C,QAAWzI,KAAKR,MAAMoC,QAAQkE,QAAQ2C,MAAMs2B,KAAOpJ,GAAiB,EAwClGiF,qBACJ,MAAM,iBACFoE,EADE,eAEFC,EAFE,uBAGFC,EAHE,UAIFj9B,EAJE,kBAKFiM,EALE,iBAMFC,EANE,oCAOFgxB,EAPE,sCAQFC,EARE,0BASF3yB,EATE,yBAUFC,EAVE,0BAWFC,EAXE,uBAYFG,EAZE,iBAaFuyB,EAbE,yBAcFlkB,EAdE,yBAeFF,GACAjb,KAAKR,MAAM0C,WAET,QAAEN,EAAF,UAAWC,GAAc7B,KAAKR,OAC9B,cAAE8M,GAAkBtM,KAAKR,MAAMgB,OAErC,OAAOR,KAAKiJ,MAAM6qB,iBAAiBxwB,IAAI,CAAC8pB,EAAM7pB,KAAS,MACnD,MAAM+7B,EAA+C,CACjDC,kBAAmBnS,EACnB4G,gBAAiB5G,EAAK4G,gBACtB7xB,MAAK,UAAEirB,EAAKC,mBAAP,aAAE,EAAkBmS,aACzB59B,UACA01B,4BAA6Bt3B,KAAKiJ,MAAMquB,4BACxCpqB,WAAYkgB,EAAKC,YAAclgB,4BAAkBigB,EAAKC,YAAYC,eAAgB1rB,EAAQ6F,mBAAerH,GAAa,GACtHkM,gBACAzK,YACA49B,SAAUz/B,KAAKR,MAAMuC,GACrB0qB,eAAgBzsB,KAAKR,MAAMwC,SAC3BkV,SAAUkW,EAAK4G,gBAAgBjkB,SAC/Bmb,SAAU,CACNwU,WAAY1/B,KAAK80B,cACjB6K,aAAc3/B,KAAKy4B,kCACnBmH,iBAAkB5/B,KAAKg3B,gBACvBuE,SAAUv7B,KAAKu7B,SAASvnB,KAAKhU,OAEjCkC,UAAW,CACP88B,mBACAC,iBACAC,yBACAzyB,4BACAC,2BACAC,4BACAhK,cAAeV,EACfiM,oBACAC,mBACArB,yBACA+yB,iCAAkCT,EAClCU,mBAAoBX,EACpBE,mBACAlkB,2BACAF,4BAEJ1X,QACAmV,SAAU1Y,KAAK0Y,SACf4iB,uBAAwBt7B,KAAK22B,yBAGjC,OAAOoJ,gCAAsBT,KAyP7B9F,kBACJx5B,KAAKu5B,UAAYv5B,KAAKi5B,iBA5vB1BhuB,aADCC,KACD,gCAEUD,aAATE,KAAS,6BA+BVF,aADCG,KACD,sCAvCEqoB,EAAkB,aADvBnoB,KACKmoB,GAk0BSA,a,mMCl5BHuM,EAoDAC,EA+BAC,E,6mBAyDL,SAASC,EAAYC,GACxB,OAAOA,IAAkBC,oBAAkB9Q,UACvC6Q,IAAkBC,oBAAkBC,SACpCF,IAAkBC,oBAAkBE,QAQrC,SAASC,EACZC,EACAC,GAGA,OAAOA,EAAmBn/B,KACrBo/B,GAA6CC,EAA8BH,EAAqBE,IAUlG,SAASC,EACZH,EACAE,GAGA,OAAOA,EAAoBE,kBAAoBJ,EAAoBI,iBAC/DF,EAAoBG,qBAAuBL,EAAoBK,oBAC/DH,EAAoBI,gBAAkBN,EAAoBM,gBACzDZ,EAAYQ,EAAoBI,gBAAkBJ,EAAoBK,uBAAyBP,EAAoBO,sBAGrH,SAASC,EACZC,EACAC,GACA,MAAMC,EAAmD,GACzD,IAAIC,GAAmB,EAmBvB,GAlBAF,EAA0BrvB,QAASwvB,IAC/B,GAAIV,EAA8BM,EAAuBT,oBAAqBa,IAE1E,GADAD,GAAmB,EACfH,EAAuBK,YAAa,CACpC,MAAMC,EAAI,OACHF,GADG,IAENN,0BAA4D5gC,IAAtC8gC,EAAuBO,YAAvB,UAAsDP,EAAuBO,aAAgBH,EAAkBN,qBACrIU,2BAA2DthC,IAApC8gC,EAAuBS,UAAvB,UAAoDT,EAAuBS,WAAcL,EAAkBI,wBAEtIN,EAA0BpvB,KAAKwvB,SAKnCJ,EAA0BpvB,KAAKsvB,MAIlCD,EAAkB,CACnB,MAAMG,EAAI,OACHN,EAAuBT,qBADpB,IAENO,0BAA4D5gC,IAAtC8gC,EAAuBO,YAAvB,UAAsDP,EAAuBO,aAAgBP,EAAuBT,oBAAoBO,qBAC9JU,2BAA2DthC,IAApC8gC,EAAuBS,UAAvB,UAAoDT,EAAuBS,WAAcT,EAAuBT,oBAAoBiB,wBAE/JN,EAA0BpvB,KAAKwvB,GAG1BN,EAAuBT,oBAAoBM,gBAAkBV,oBAAkBuB,MAAQV,EAAuBT,oBAAoBM,gBAAkBV,oBAAkBwB,WACvKX,EAAuBY,8BAA8BC,mBAAqBC,cAAYC,cACtFf,EAAuBY,8BAA8BI,OAAOpwB,QAASqwB,IACjE,GAAIA,EAAMtB,kBAAoBW,EAAKX,iBAAmBsB,EAAMnB,uBAAyBQ,EAAKR,0BAEnF,CACH,MAAMoB,EAAgBhB,EAA0BjK,UAAWkL,GAAmCzB,EAA8BuB,EAAOE,IAC/HD,GAAiB,GACjBhB,EAA0BkB,OAAOF,EAAe,MAOpE,OAAOhB,GAjOX,SAAYpB,GAURA,qBAWAA,+BAUAA,mBAUAA,yBAzCJ,CAAYA,MAAgC,KAoD5C,SAAYC,GAURA,uBAUAA,qBApBJ,CAAYA,MAAuB,KA+BnC,SAAYC,GAURA,mBAUAA,6BAUAA,2BAUAA,qBAUAA,uBAlDJ,CAAYA,MAAoB,M,+ECpFhC,MAAMqC,EAAmBhd,IACrB,QAAkBnlB,IAAdmlB,EAAyB,CACzB,MAAM,eAAEid,EAAF,UAAkBC,GAAcld,EAEtC,OACI1nB,gBAAC6kC,OAAIngC,iBAAKigC,GACLC,EAAUn/B,IAAIq/B,IAI3B,OAAO,MASLA,EAA2BC,IAC7B,MAAM,eAAEJ,EAAF,oBAAkBK,EAAlB,QAAuC9xB,EAAvC,OAAgD+xB,EAAhD,OAAwDC,GAAWH,EAEzE,OACI/kC,gBAAC6kC,OAAIngC,iBAAKigC,GACN3kC,gBAAC6kC,OAAIngC,iBAAKsgC,GACL9xB,GAEJ+xB,EACAC,IA6DEC,UA5BwCxjC,IACnD,MAAM,MACFylB,EADE,gBAEFF,EAFE,aAGFC,EAHE,KAIFM,EAJE,eAKFH,EALE,OAMFD,EANE,UAOFK,EAPE,6BAQFvB,EARE,yBASFC,EATE,eAUFmB,EAVE,aAWFpJ,GACAxc,EAEJ,OAAOylB,EACHpnB,gBAAColC,SAAM1gC,iBAAKwiB,GACRlnB,gBAAC6kC,OAAIngC,iBAAK2iB,GACNrnB,gBAAC6kC,OAAIngC,iBAAKyiB,GA9CP,EAACM,EAAgCtJ,EAAuBmJ,EAA4B+d,EAAsCC,EAAkC5d,IACpKvJ,EACHne,gBAAC6kC,OAAIngC,iBAAK4iB,GACNtnB,gBAAC6kC,OAAIngC,iBAAM2gC,GACN5d,EAAKrZ,QACLs2B,EAAgBhd,GAChBD,EAAKpO,SACNrZ,gBAAC6kC,OAAIngC,iBAAK4gC,GACL7d,EAAKlO,aAETkO,EAAKnO,eAIdtZ,gBAAC6kC,OAAIngC,iBAAK4iB,GACNtnB,gBAAC6kC,OAAIngC,iBAAK4gC,GACL7d,EAAKlO,aAEVvZ,gBAAC6kC,OAAIngC,iBAAM2gC,GACN5d,EAAKrZ,QACLs2B,EAAgBhd,GAChBD,EAAKpO,SACLoO,EAAKnO,eAyBDisB,CAAW9d,EAAkCtJ,EAAcmJ,EACxDnB,EAA8BC,EAA0BsB,KAInEH,GAEL,O,q1BCER,IAAqBie,EAAqB,EAA1C,cAAmDxlC,gBAuC/C0B,YAAmBC,EAAgEyJ,GAAkC,MACjHxJ,MAAMD,GAlCO,KAAA8jC,sBAAkD,CAC/D,CAAEpxB,IAAKqxB,IAAYC,0BAA2BnlC,MAAO2B,KAAKR,MAAM0C,UAAUshC,2BAC1E,CAAEtxB,IAAKqxB,IAAYE,oBAAqBplC,MAAO2B,KAAKR,MAAM0C,UAAUuhC,qBACpE,CAAEvxB,IAAKqxB,IAAYG,qBAAsBrlC,MAAO2B,KAAKR,MAAM0C,UAAUwhC,sBACrE,CAAExxB,IAAKqxB,IAAYI,qBAAsBtlC,MAAO2B,KAAKR,MAAM0C,UAAUyhC,sBACrE,CAAEzxB,IAAKqxB,IAAYK,sBAAuBvlC,MAAO2B,KAAKR,MAAM0C,UAAU0hC,uBACtE,CAAE1xB,IAAKqxB,IAAYM,uBAAwBxlC,MAAO2B,KAAKR,MAAM0C,UAAU2hC,wBACvE,CAAE3xB,IAAKqxB,IAAYO,wBAAyBzlC,MAAO2B,KAAKR,MAAM0C,UAAU4hC,yBACxE,CAAE5xB,IAAKqxB,IAAYQ,qBAAsB1lC,MAAO2B,KAAKR,MAAM0C,UAAU6hC,sBACrE,CAAE7xB,IAAKqxB,IAAYS,0BAA2B3lC,MAAO2B,KAAKR,MAAM0C,UAAU8hC,4BAK7D,KAAAC,UAAgCjkC,KAAKR,MAAMoC,QAAQkE,QAAQo+B,UAAUC,SAG9E,KAAA5K,UAAsB,KAMtB,KAAA6K,mBAAyC,EAMhC,KAAAC,kBAAoB,EAEpB,KAAAhe,UAAYie,YAAatkC,KAAKR,MAAMoC,QAAQkE,SAsP5C,KAAAy+B,qCAAuCxkC,UAA0B,QAC9E,MAAMykC,EAAY,oBAAIxkC,KAAKR,MAAMsB,KAAK2jC,cAAczjC,cAAlC,aAAI,EAAsC0jC,sBAA1C,QAA6D,GAEzEC,QAAwCC,iEAC1C,IAAIC,qDAAmDL,EAAcxkC,KAAKR,MAAMoC,SAChF5B,KAAKR,MAAMoC,QAAQ6F,eAEnB8X,kBAAgBC,YAAYmlB,IAC5B3kC,KAAK0V,SAAS,CAAEivB,qCAOP,KAAAG,gBAAkB/kC,UAA0B,QACzD,MAAMykC,EAAY,oBAAIxkC,KAAKR,MAAMsB,KAAK2jC,cAAczjC,cAAlC,aAAI,EAAsC0jC,sBAA1C,QAA6D,GACzE5xB,QAAiBiyB,yCACnB,IAAIC,mCAAiCR,GACrCxkC,KAAKR,MAAMoC,QAAQ6F,sBAEKzH,KAAKR,MAAMsB,KAAK2jC,eAC9BC,eAAiB5xB,GAGlB,KAAAmyB,sBAAwB,KACrC,MAAM,UAAE/iC,GAAclC,KAAKR,MAC3B,OAAO0lC,4BACH,CACIhjC,UAAW,CACPijC,qBAAsBjjC,EAAUijC,qBAChCC,WAAYljC,EAAUkjC,YAE1BlxB,OAAQlU,KAAKiJ,MAAMo8B,YACnBC,UAAWtlC,KAAKulC,gBAChBC,cAAexlC,KAAKylC,gBAIf,KAAAC,oBAAsB,KACnC,MAAM,KAAE5kC,EAAF,QAAQc,EAAR,UAAiBM,GAAclC,KAAKR,MAE1C,IAAImmC,EAAsC,GAEtCA,EADA/jC,GAAWA,EAAQkE,SAAWlE,EAAQkE,QAAQ2C,OAAS7G,EAAQkE,QAAQ2C,MAAMqQ,EAC9D,WAAOlX,EAAQkE,QAAQ2C,MAAMqQ,EAA7B,KAEIhY,EAAK8kC,SAAS5kC,QAAU6kC,EAAsBC,gBAAgBlkC,EAAQkE,QAAQigC,OAAQjlC,EAAK8kC,SAAS5kC,OAAOglC,mBACzHllC,EAAK8kC,SAAS5kC,QAAUF,EAAK8kC,SAAS5kC,OAAO2I,KAEtD,IACIs8B,EADAC,EAAmB,GAEnBplC,EAAK2jC,eAAiB3jC,EAAK2jC,cAAczjC,aAA0DZ,IAAhDU,EAAK2jC,cAAczjC,OAAOmlC,kBAC7EF,EAAqBnlC,EAAK2jC,cAAczjC,OAAOmlC,kBACxCrlC,EAAKgS,UAAYhS,EAAKgS,SAAS9R,SACtCilC,EAAqBnlC,EAAKgS,SAAS9R,OAAOqC,OAI1C6iC,EADAD,GAA6C,IAAvBA,EACoB,IAAvBA,EAA2BvqB,iBAAO1b,KAAKR,MAAM0C,UAAUkkC,iBAAkBH,GAAsBjmC,KAAKR,MAAM0C,UAAUmkC,WAEpH3qB,iBAAO1b,KAAKR,MAAM0C,UAAUkkC,iBAAkB,GAErE,MAAME,EAAW1kC,EAAQkE,QAAQwC,kBAAhB,uBAAoD1G,EAAQkE,QAAQwC,kBAAkBi+B,eAAkB,GACnHC,EAAc3oC,gBAAC21B,QAAK,CAAC11B,UAAU,4CAA4CqT,KAAMjP,EAAUukC,mBAC3FC,EAAYf,GAAmB9nC,gBAAC21B,QAAK,CAAC11B,UAAU,0CAA0CqT,KAAMw0B,IAChGgB,EAAa9oC,gBAAC21B,QAAK,CAAC11B,UAAU,2CAA2CqT,KAAM+0B,IAErF,MAAO,CACHU,eAAgB,CAAE9oC,UAAU,qCAAD,OAAuCwoC,IAClEpoC,MAAO,CACHsoC,cACAE,YACAC,gBAMK,KAAAE,sBAAwB,KACrC,MAAM,KAAE/lC,GAASd,KAAKR,MAChBsnC,EAAoBhmC,EAAKgmC,kBAAkB9lC,OAejD,MAAO,CACH+lC,2BAA4B,CAAEhkC,IAAK,MAAOjF,UAAW,kDACrDkpC,sBAfAF,GAAqBA,EAAkBxjC,IAAI,CAACjF,EAA8BkF,IAGlE1F,gBAACopC,OAAI,CACD/0B,IAAK3O,EACL4N,KAAM9S,EAAMsL,KACZnL,UAAS,UAAKwB,KAAKR,MAAM0C,UAAUglC,sBAA1B,YAAmD7oC,EAAMsL,MAClE8D,KAAMpP,EAAM8oC,OASxBC,2BAL0BvpC,gBAACwpC,YAAS,CAAClb,UAAU,QAUtC,KAAAmb,oBAAsB,KACnC,MAAM,UAAEplC,GAAclC,KAAKR,MACrB+nC,EAAiBvnC,KAAKwnC,+BAAiCxnC,KAAKiJ,MAAMw+B,aAAaC,qBACrF,IAAIC,EAAkB3nC,KAAK4nC,uBAEvB5nC,KAAKR,MAAMoC,QAAQmd,IAAIve,OAAOqnC,aAC9BF,EAAkBA,EAAgBrhC,OAAQwhC,GAAmBA,EAAe51B,MAAQqxB,IAAYM,yBAepG,MAAO,CACHkE,iBAAkB,CAAEjqC,UAAW,gDAC/BkqC,eAbAnqC,gBAACoqC,kBAAe,CACZC,eAAe,uBACfC,UAAWjmC,EAAUkmC,oBACrBC,WAAW,yBACXC,kBAAkB,wBAClBC,YAAY,OACZZ,gBAAiBA,EACjBa,eAAgBjB,EAChBkB,eAAgBzoC,KAAK0oC,sBACrB5xB,IAAK9W,KAAK2oC,+BAQL,KAAAC,eAAiB,KAC9B,MAAM,OAAEpoC,EAAF,QAAUoB,EAAV,KAAmBd,EAAnB,UAAyBoB,GAAclC,KAAKR,MAC5CilC,EAAgB3jC,GAAQA,EAAK2jC,eAAiB3jC,EAAK2jC,cAAczjC,OACjEsM,EAAUu7B,YAAcjnC,EAAQkE,SAChC6vB,EAAen1B,EAAOm1B,cAAgB,GAEtCC,EAAY6O,GAAqD,OAApCA,EAAcqE,kBAA8BrE,EAAcqE,mBAAqB9oC,KAAKR,MAAMgB,OAAOm1B,cAAgB,IAAS31B,KAAKR,MAAMoC,QAAQkE,QAAQ2C,QAAUzI,KAAKR,MAAMoC,QAAQkE,QAAQ2C,MAAMs2B,MAAS,EACtOjJ,EAAa2O,GAAiBA,EAAc0B,mBAAqB,EACjEpQ,EAAe7zB,EAAU8zB,gBACzBC,EAAW/zB,EAAUg0B,YAE3B,OAAIJ,GAAcH,EACP,KAGP93B,gBAACs4B,yBAAsB,CACnBr4B,UAAU,yCACVkF,KAAK,aAAY,aACLd,EAAUk0B,oBACtBnK,IAAK3e,EAAQG,KACb4oB,IAAI,OACJpnB,MAAO6mB,EACPH,aAAcA,EACdW,aAAcV,EACdG,aAAc/1B,KAAKu2B,YAAYR,GAC/BE,SAAUj2B,KAAKw2B,YAAYP,GAC3BQ,kBAAmBV,EACnBW,cAAeT,EACfx3B,iBAAkBuB,KAAKvB,oBAIlB,KAAAsqC,eAAiB,KAC9B,MAAM,KAAEjoC,EAAF,QAAQc,EAAR,OAAiBpB,GAAWR,KAAKR,MACjCwpC,EAAoBpnC,EAAQkE,QAAQ2C,OAAS7G,EAAQkE,QAAQ2C,MAAMwgC,WAAa,QAAU,SAC1FC,EAAgBlpC,KAAKR,MAAMgB,OAAO2oC,oBAAsB5pB,kBAAgBC,YAAYxf,KAAKiJ,MAAMmgC,UAAYppC,KAAKiJ,MAAMmgC,SAAS9iC,OAAO+iC,GACjI9pB,kBAAgBC,YAAY6pB,EAAQnH,UAAYliC,KAAKspC,wBAAwBD,IACnFvoC,EAAKsoC,SAASpoC,QAAUF,EAAKsoC,SAASpoC,OAAOsF,OAAO+iC,GAC9C9pB,kBAAgBC,YAAY6pB,EAAQnH,UAAYliC,KAAKspC,wBAAwBD,IAGlFE,EAAkBzoC,EAAK2jC,cAAczjC,QAAUF,EAAK2jC,cAAczjC,OAAOwoC,eAAkB,GAEjGxpC,KAAKypC,uBAAuBP,GAAiBA,EAAc9nC,OAAQZ,EAAOkpC,qBAC1E,MAAMC,EAAmB3pC,KAAKokC,mBA4B9B,MAAO,CACHwF,oBAAqB,CAAE9rC,UAAW,2CAClC+rC,wBAAyB,CAAE/rC,UAAW,+CACtCsrC,SA9BaF,GAAiBA,EAAc5lC,IAAI,CAACwmC,EAAmDvmC,IAEhG1F,gBAACksC,IAAa,CACVD,wBAAyBA,EACzBE,sBAAuBT,EACvBU,sBAAuBjqC,KAAKkqC,uBAC5BC,6BAA8BnqC,KAAKR,MAAM0C,UAAUioC,6BACnDC,6BAA8BpqC,KAAKR,MAAM0C,UAAUkoC,6BACnDl4B,IAAK3O,EACL8mC,iBAAkBrqC,KAAKsqC,kBACvBC,WAAYvqC,KAAKwqC,iBACjBC,YAAY,EACZC,2BAA4Bf,GAAoBA,EAAmBpmC,GACnEylC,kBAAmBA,EACnBpnC,QAASA,EACT69B,SAAUz/B,KAAKR,MAAMuC,GACrB0qB,eAAgBzsB,KAAKR,MAAMwC,SAC3BvD,iBAAkBuB,KAAKvB,iBACvBksC,sBAAuB3qC,KAAKR,MAAM0C,UAAUyoC,sBAC5CC,oBAAqB5qC,KAAKR,MAAM0C,UAAU0oC,oBAC1CC,qBAAsB7qC,KAAKR,MAAM0C,UAAU2oC,qBAC3CC,4BAA6B9qC,KAAKR,MAAM0C,UAAU4oC,4BAClDpyB,SAAU1Y,KAAK0Y,cAkBd,KAAA4wB,wBAA2BD,IAA8C,MAGtF,OAAOrpC,KAAKR,MAAMoC,QAAQmd,IAAIve,OAAOuqC,8BAAgCC,IAAqCC,SACtG5B,EAAQh9B,YAAR,UAAqBrM,KAAKR,MAAMsB,KAAKgS,SAAS9R,cAA9C,aAAqB,EAAiCkqC,kCAG7C,KAAAC,kBAAoB,KAAsB,MACvD,MAAM,UAAEjpC,EAAF,KAAapB,EAAb,UAAmBe,GAAc7B,KAAKR,MACtC4rC,EAAoBtqC,EAAK2jC,cAAczjC,QAAUF,EAAK2jC,cAAczjC,OAAOwoC,eAAkB,GACnG,OACI3rC,gBAACwtC,IAAa,CACVxhB,WAAW,gCACXyhB,aAAcppC,EAAUopC,aACxB18B,MAAO1M,EAAUqpC,mBACjBC,eAAgBtpC,EAAUspC,eAC1BC,gBAAiBL,EAGjBM,iBAAkB5qC,EAAKsoC,SAASpoC,OAChC2qC,aAAczpC,EAAUypC,aACxBC,uBAAwB1pC,EAAU0pC,uBAClC/pC,UAAWA,EACXgqC,gBAAiB7rC,KAAK8rC,iBACtBvB,WAAYvqC,KAAK+rC,iCACjBC,gBAAiB9pC,EAAU8pC,gBAC3BvtC,iBAAkBuB,KAAKvB,iBACvBmD,QAAS5B,KAAKR,MAAMoC,QACpBspC,gCAA+B,UAAElrC,KAAKR,MAAMsB,KAAKgS,SAAS9R,cAA3B,aAAE,EAAiCkqC,mCAM7D,KAAAe,aAAe,KAAkB,QAC9C,MAAM,cAAE3/B,EAAF,oBAAiB4/B,GAAwBlsC,KAAKR,MAAMgB,QACpD,UAAE0B,GAAclC,KAAKR,MACrB2sC,EAAgBnsC,KAAKR,MAAMoC,QAAQmd,IAAIve,OAAO4rC,eAC9CC,EAAYH,IAA0C,SAAlBC,GAA8C,oBAAlBA,GAChEr5B,EAAY9S,KAAKR,MAAMsB,KAAK2jC,cAAczjC,QAAUhB,KAAKR,MAAMsB,KAAK2jC,cAAczjC,OAAO0jC,gBAAmB,GAC5G4H,EAAgBtsC,KAAKR,MAAM+sC,OAASvsC,KAAKR,MAAM+sC,MAAMC,WAAaxsC,KAAKR,MAAM+sC,MAAMC,UAAU,GAC7FC,EAAyB,UAAGzsC,KAAKR,MAAMsB,KAAK2I,aAAazI,cAAhC,aAAG,EAAqCO,KACnEkI,GAAsC,0DAAtBA,EAAaE,MACjC,OACI9L,gBAAC6uC,2BAAwB,CACrB55B,SAAUA,EACVlR,QAAS5B,KAAKR,MAAMoC,QACpB0K,cAAeA,EACfpK,UAAWA,EACXyqC,WAAY3sC,KAAKR,MAAMwC,SACvBy9B,SAAUz/B,KAAKR,MAAMuC,GACrBmqC,oBAAqBG,EACrB5tC,iBAAkBuB,KAAKvB,iBACvBmuC,cAAeN,EACfpB,gCAA+B,UAAElrC,KAAKR,MAAMsB,KAAKgS,SAAS9R,cAA3B,aAAE,EAAiCkqC,gCAClE2B,qBAAsBJ,aAAF,EAAEA,EAA2B7iC,UACjD+6B,gCAAiC3kC,KAAKiJ,MAAM07B,mCAKvC,KAAA+D,sBAAyBoE,IACtC,MAAM,QAAElrC,GAAY5B,KAAKR,MACnB+T,EAAiB3R,GAAWA,EAAQkE,QACpC2B,EAAgB7F,GAAWA,EAAQ6F,cAEzC,IAAK8L,IAAmB9L,IAAkBzH,KAAKR,MAAMsB,KAAK2jC,cAAczjC,OAAQ,CAE5E,MAAMc,EAAK,0DAAuDyR,EAAqC,GAApB,kBAAxE,YAAmG9L,EAAmC,GAAnB,iBAAnH,uBACXzH,KAAKR,MAAMqC,UAAU6e,QAAQ5e,GAGjC0L,OAAOu/B,QAAQC,UAAU,GAAI,GAAIC,YAAiBpE,YAAc7oC,KAAKR,MAAMoC,QAAQkE,cAAU1F,EAAW,CAACJ,KAAKktC,iCAAiCJ,EAAatE,sBAAkBpoC,IAC9K+sC,YAAY,KACRntC,KAAKR,MAAMsB,KAAK2jC,cAAczjC,OAAQ8nC,kBAAoB,EAC1D9oC,KAAKR,MAAMsB,KAAK2jC,cAAczjC,OAAQosC,eAAiB,CAAEC,QAAS,CAACrtC,KAAKktC,iCAAiCJ,EAAatE,qBAI7G,KAAA0E,iCAAoCI,IACjD,MAAM,KAAExsC,GAASd,KAAKR,MAEtB,IAAKsB,EAAKysC,oBAAoBvsC,OAC1B,MAAO,GAGX,MAAMwsC,EAAsB1sC,EAAKysC,oBAAoBvsC,OAAOO,KAAMgsC,GACvDA,EAAoBr7B,MAAQo7B,EAAOp7B,KAG9C,OAAIs7B,EACOA,EAAoBC,WAGxB,IAOM,KAAAC,uBAAyB,KAA6B,MACnE,MAAMC,EAAY,UAAG3tC,KAAKR,MAAMsB,KAAK2jC,cAAczjC,cAAjC,aAAG,EAAsCosC,eAC3D,GAAI7tB,kBAAgBC,YAAYmuB,aAA5B,EAA4BA,EAAcN,SAC1C,OAAOM,EAAcN,QAAQ,GAGjC,MAAMO,EAAeC,YAA8B,UAAW7tC,KAAKR,MAAMoC,QAAQkE,SACjF,OAAIyZ,kBAAgBC,YAAYouB,GACrBA,EAAa,QADxB,GAWa,KAAAhG,qBAAuB,KACpC,MAAM2F,EAAsBvtC,KAAKR,MAAMsB,KAAKysC,oBAAoBvsC,OAEhE,IAAKusC,EACD,MAAO,GAGX,MAAMO,EAA4B9tC,KAAKsjC,sBAAsBh9B,OACzDynC,GAAsBR,EAAoBhsC,KAAKgO,GAAQw+B,EAAmB77B,MAAQ3C,EAAK2C,MAG3F,OAAOqN,kBAAgBmG,YAAYooB,IAOtB,KAAAtG,4BAA8B,KAC3C,MAAMwG,EAAmBhuC,KAAK0tC,yBAExBH,EAAsBvtC,KAAKR,MAAMsB,KAAKysC,oBAAoBvsC,OAEhE,IAAKgtC,IAAqBT,EACtB,OAGJ,MAAMU,EAAqBV,EAAoBhsC,KAAKwsC,GAAsBA,EAAmBN,WAAWS,aAAeF,EAAiBE,YACpIH,EAAmBN,WAAWU,eAAiBH,EAAiBG,cAEpE,OAAKF,EAIEjuC,KAAKsjC,sBAAsB/hC,KAAKumC,GAAkBA,EAAe51B,MAAQ+7B,EAAmB/7B,UAJnG,GAOa,KAAAo4B,kBAAqBpJ,IAClC,MAAM,QAAEt/B,GAAY5B,KAAKR,MACnB+T,EAAiB3R,GAAWA,EAAQkE,QACpC2B,EAAgB7F,GAAWA,EAAQ6F,cAEzC,IAAK8L,IAAmB9L,IAAkBzH,KAAKR,MAAMsB,KAAK2jC,cAAczjC,OAAQ,CAC5E,MAAMc,EAAK,qDAAkDyR,EAAqC,GAApB,kBAAnE,YAA8F9L,EAAmC,GAAnB,iBAA9G,uBACXzH,KAAKR,MAAMqC,UAAU6e,QAAQ5e,GAGjC,MAAMs/B,EAA4BH,uCAA6BC,EAAwBlhC,KAAKR,MAAMsB,KAAK2jC,cAAczjC,QAAUhB,KAAKR,MAAMsB,KAAK2jC,cAAczjC,OAAOwoC,eAAiB,IAErLh8B,OAAOu/B,QAAQC,UAAU,GAAI,GAAIC,YAAiBpE,YAAc7oC,KAAKR,MAAMoC,QAAQkE,SAAUs7B,IAC7F+L,YAAY,KACRntC,KAAKR,MAAMsB,KAAK2jC,cAAczjC,OAAQ8nC,kBAAoB,EAC1D9oC,KAAKR,MAAMsB,KAAK2jC,cAAczjC,OAAQwoC,cAAgBpI,KAI7C,KAAAoJ,iBAAoBtJ,IACjC,GAAIlhC,KAAKR,MAAMsB,KAAK2jC,cAAczjC,OAAQ,CACtC,MAAMotC,EAAwBnN,uCAA6BC,EAAwBlhC,KAAKR,MAAMsB,KAAK2jC,cAAczjC,OAAOwoC,eAAiB,IAEzI,OAAOyD,YAAiBpE,YAAc7oC,KAAKR,MAAMoC,QAAQkE,SAAUsoC,GAGvE,OADApuC,KAAKR,MAAMqC,UAAU6e,QAAQ,uFACtB,IAIM,KAAAorB,iBAAoBgB,IACjC,MAAM,KAAEhsC,EAAF,UAAQe,GAAc7B,KAAKR,MAEjC,IAAKsB,EAAK2jC,cAAczjC,OAEpB,YADAa,EAAU6e,QAAQ,sGAItB,IAAIygB,EAA6BrgC,EAAK2jC,cAAczjC,QAAUF,EAAK2jC,cAAczjC,OAAOwoC,eAAkB,GAE1G,GAAKsD,EAAauB,SASX,CACHlN,EAA4B,GAG5B,MAAMmN,EAAoBtuC,KAAK2oC,2BAA2B1nB,SAAWjhB,KAAK2oC,2BAA2B1nB,QAAQzhB,MAAM6oC,WAC7GkG,EAAkBD,GAAqBE,SAASC,eAAeH,GACrE9vB,WAAW,KACP+vB,GAAmBA,EAAgBG,SAEvC,QAlBwB,CACxB,MAAMC,EAAiB7B,EAAa8B,cACpC,IAAKD,EAED,YADA9sC,EAAU6e,QAAQ,gFAGtBygB,EAA4BA,EAA0B76B,OACjDg7B,IAA4CV,wCAA8B+N,EAAgBrN,IAcnG,MAAMh0B,EAAUu7B,YAAc7oC,KAAKR,MAAMoC,QAAQkE,SACjD0H,OAAOu/B,QAAQC,UAAU,GAAI,GAAIC,YAAiB3/B,EAAS6zB,IAC3DrgC,EAAK2jC,cAAczjC,OAAO8nC,kBAAoB,EAC9ChoC,EAAK2jC,cAAczjC,OAAOwoC,cAAgBrI,GAG7B,KAAA4K,iCAAmC,CAAC8C,EAAsCC,KACvF,MAAM,KAAEhuC,EAAF,UAAQe,GAAc7B,KAAKR,MAC3B8N,EAAUu7B,YAAc7oC,KAAKR,MAAMoC,QAAQkE,SAEjD,IAAKhF,EAAK2jC,cAAczjC,OAEpB,OADAa,EAAU6e,QAAQ,yGACXpT,EAAQG,KAGnB,IAAI0zB,EAA6BrgC,EAAK2jC,cAAczjC,QAAUF,EAAK2jC,cAAczjC,OAAOwoC,eAAkB,GAE1G,GAAKsF,EASD3N,EAA4B,OATf,CACb,IAAK0N,EAED,OADAhtC,EAAU6e,QAAQ,wFACXpT,EAAQG,KAEnB0zB,EAA4BA,EAA0B76B,OACjDg7B,IAA4CV,wCAA8BiO,EAAiBvN,IAMpG,OAAO2L,YAAiB3/B,EAAS6zB,IAwBpB,KAAAsI,uBAAyB,CAACP,EAAwB6F,KAC/D,OAAQA,GACJ,IAAI,MACA/uC,KAAKokC,mBAAqB8E,EAC1B,MACJ,IAAI,MACAlpC,KAAKokC,mBAAqB,EAC1B,MACJ,IAAI,MACApkC,KAAKokC,mBAAqB,EAC1B,MACJ,IAAI,QACApkC,KAAKokC,mBAAqB,EAC1B,MACJ,IAAI,OACApkC,KAAKokC,mBAAqB,EAC1B,MACJ,QACIpkC,KAAKokC,mBAAqB,IASrB,KAAA7N,YAAe8C,GAExBx7B,uBAAKC,UAAU,wBACXD,wBAAMC,UAAU,oCAAmC,cAAa,SAChED,wBAAMC,UAAU,aACXu7B,IAWA,KAAA7C,YAAe8C,GAExBz7B,uBAAKC,UAAU,wBACXD,wBAAMC,UAAU,aACXw7B,GAELz7B,wBAAMC,UAAU,qCAAoC,cAAa,UAxwBzEkC,KAAKu5B,UAAY/5B,EAAMoC,QAAQkE,SAAWtG,EAAMoC,QAAQkE,QAAQ+d,QAAgD,WAAtCrkB,EAAMoC,QAAQkE,QAAQ+d,OAAOC,KAAoB,KAAO,KAClI9jB,KAAKulC,gBAAkB1nC,cACvBmC,KAAK2oC,2BAA6B9qC,cAClCmC,KAAKylC,aAAezlC,KAAKylC,aAAazxB,KAAKhU,MAC3CA,KAAKw5B,gBAAkBx5B,KAAKw5B,gBAAgBxlB,KAAKhU,MACjDA,KAAKgvC,cAAgB,GACrBhvC,KAAKiJ,MAAQ,CACTw+B,aAAc,CACVwH,SAAS,EACTvH,qBAAsB1nC,KAAKsjC,sBAAsB,IAErD+B,aAAa,EACb+D,SAAU,IAEd,MAAM,mBACF8F,EADE,SAEFC,EAFE,SAGFC,EAHE,gBAIFC,GACArvC,KAAKR,MAAM0C,UAET6jC,EAAS/lC,KAAKR,MAAMoC,QAAQkE,QAAQigC,OACpClkC,EAAY7B,KAAKR,MAAMqC,UACvBytC,EAAqBtvC,KAAKR,MAAM0C,UAAUqtC,yBAC1CC,EAAuBxvC,KAAKR,MAAM0C,UAAUutC,wBAClDzvC,KAAKkqC,uBAAyB,CAC1BroC,YACAkkC,SACAmJ,qBACAC,WACAC,WACAC,kBACAC,qBACAE,wBAEJxvC,KAAKvB,iBAAmB4J,6BAAmBrI,KAAKR,MAAMoC,QAAQkE,QAAQwC,kBAAoBtI,KAAKR,MAAM+I,aAAcvI,KAAKR,MAAMqC,WAK9H7B,KAAKR,MAAMsB,KAAKgS,SAASrN,KAAMqN,IAC3B9S,KAAKR,MAAMsB,KAAK2jC,cAAch/B,KAAMg/B,IACT,aAAnBzkC,KAAKikC,UACLQ,EAAcN,SAAW,WAEzBM,EAAcN,SAAW,SAG7B,IAAIuL,EAA6B,GAE7B1vC,KAAKR,MAAMoC,QAAQkE,QAAQ2C,OAASzI,KAAKR,MAAMoC,QAAQkE,QAAQ2C,MAAMknC,UACrED,EAAeE,KAAKC,MAAMC,mBAAmB9vC,KAAKR,MAAMoC,QAAQkE,QAAQ2C,MAAMknC,WAIlFlL,EAAcqE,kBAAoB9oC,KAAKR,MAAMoC,QAAQkE,QAAQ2C,QAAWzI,KAAKR,MAAMoC,QAAQkE,QAAQ2C,MAAMs2B,MAAQ/+B,KAAKR,MAAMgB,OAAOm1B,cAAgB,KAAQ,EAC3J8O,EAAc2I,eAAiB,CAAEC,QAASqC,GAC1CjL,EAAcsL,SAAW/vC,KAAKR,MAAMgB,OAAOm1B,cAAgB,GAC3D8O,EAAcC,eAAiB5xB,EAASA,SACxC2xB,EAAc0B,kBAAoBrzB,EAASzP,MAC3CohC,EAAc+E,cAAgBwG,YAAuBhwC,KAAKR,MAAMoC,QAAQkE,SAGxE+C,YACI,IAEW,CAAC47B,EAAc+E,eAAiB/E,EAAc+E,cAAcpoC,OAAQqjC,EAAcqE,kBAAmBrE,EAAc2I,gBAAkB3I,EAAc2I,eAAeC,SAAW5I,EAAc2I,eAAeC,QAAQjsC,QAE7N,KAAK,QACD,MAAMoK,EAAQ,IAAIykC,IACdxL,EAAcN,SACdnkC,KAAKR,MAAMoC,QAAQkE,QAAQ0T,YAE3B,CAAE02B,OAAQ,CAAEC,IAAKnwC,KAAKR,MAAMgB,OAAOm1B,aAAcya,KAAMlqB,KAAKpL,IAAK2pB,EAAcsL,UAAYtL,EAAcqE,mBAAqB,GAAK,IAAMzlC,OAAO,EAAMgtC,QAAS5L,EAAc2I,gBAAkB,IAC/L3I,EAAc+E,eAAiB,KAC7BxpC,KAAKR,MAAMoC,QAAQkE,QAAQo+B,UAAUoM,QAAU,GAGjDtwC,KAAKR,MAAMoC,QAAQkE,QAAQ2C,OAASzI,KAAKR,MAAMoC,QAAQkE,QAAQ2C,MAAMqQ,EAAI9Y,KAAKR,MAAMoC,QAAQkE,QAAQ2C,MAAMqQ,EAAI82B,KAAKW,UAAU,CAAErkC,UAAS,UAAElM,KAAKR,MAAMoC,QAAQkE,QAAQ2C,aAA7B,aAAE,EAAkC0D,UAAWqkC,eAAc,UAAExwC,KAAKR,MAAMoC,QAAQkE,QAAQ2C,aAA7B,aAAE,EAAkCgoC,oBACtOzwC,KAAKR,OAASQ,KAAKR,MAAMgB,aAAkDJ,IAAxCJ,KAAKR,MAAMgB,OAAOkwC,mBAAmC1wC,KAAKR,MAAMgB,OAAOkwC,mBAC7G1wC,KAAKR,MAAMgB,OAAO2oC,mBAClBnpC,KAAKR,MAAMoC,QAAQkE,QAAQigC,OAC3B/lC,KAAKqmB,WAWT,GATAsqB,YAAsBnlC,EAAOxL,KAAKR,MAAMoC,QAAQ6F,eAAehC,KAAKmrC,IAAiB,QACjFnM,EAAcC,eAAiBkM,EAAe99B,SAC9C2xB,EAAc0B,kBAAoByK,EAAevtC,MAE7CrD,KAAKR,MAAMgB,OAAOqwC,+BAAlB,UAAmD7wC,KAAKR,MAAMoC,QAAQ6F,cAAc8L,sBAApF,iBAAmD,EAAiD+S,YAApG,OAAmD,EAAuD+K,iBAC1GrxB,KAAK8kC,oBAIT9kC,KAAKR,MAAMgB,OAAO2oC,mBAAoB,CAAC,IAAD,YACtC,MAAM2H,EAAe,IAAIC,IACrBtM,EAAcN,SACdnkC,KAAKR,MAAMoC,QAAQkE,QAAQ0T,YAC3B,CACI02B,OAAQ,CACJC,IAAKnwC,KAAKR,MAAMgB,OAAOm1B,aACvBya,KAAMlqB,KAAKpL,IAAK2pB,EAAcsL,UAAd,UAA0BtL,EAAcqE,yBAAxC,QAA6D9oC,KAAKqkC,mBAC9ErkC,KAAKqkC,oBAEbhhC,OAAO,EAAMgtC,QAAO,UAAE5L,EAAc2I,sBAAhB,QAAkC,IATzC,UAWjB3I,EAAc+E,qBAXG,QAWc,KAC/B,UAAExpC,KAAKR,MAAMoC,QAAQkE,QAAQo+B,UAAUoM,cAAvC,QAAiD,GACjD,UAAAtwC,KAAKR,MAAMoC,QAAQkE,QAAQ2C,aAA3B,SAAkCqQ,EAAI9Y,KAAKR,MAAMoC,QAAQkE,QAAQ2C,MAAMqQ,EAAvE,UAA2E9Y,KAAKR,MAAMoC,QAAQkE,QAAQ2C,aAAtG,aAA2E,EAAkC0D,WAC7G,EACAnM,KAAKR,MAAMgB,OAAO2oC,wBAClB/oC,EACAJ,KAAKqmB,WAGT2qB,YAA4BF,EAAc9wC,KAAKR,MAAMoC,QAAQ6F,eAAehC,KAAM2jC,IAC9EppC,KAAK0V,SAAS,CAAE0zB,eACjBvjC,MAAM/D,IACL9B,KAAKR,MAAMqC,UAAUC,MAAMA,YAWnD,UAAI9B,KAAKR,MAAMoC,QAAQkE,QAAQ2C,aAA/B,OAAI,EAAkC0D,WAClCnM,KAAKR,MAAMsB,KAAKmwC,eAAexrC,KAAMqN,IACjC9S,KAAKR,MAAMsB,KAAK2jC,cAAch/B,KAAMyrC,IAChCA,EAAqBD,eAAiBn+B,MAIlD9S,KAAKw5B,kBA9Ka,eAClB,MAA2B,OAAnBx5B,KAAKu5B,WAAyC,OAAnBv5B,KAAKu5B,UAgLf,uBAACwM,EAAgBoL,GAAyC,MACnF,IAAIC,EAKJ,OAJIrL,GAAUoL,GAAoB5xB,kBAAgBC,YAAY2xB,KAC1DC,EAAkBD,EAAiB5vC,KAAKgO,GAAQA,EAAK8hC,SAAU9K,gBAAkBR,EAAOQ,gBAG5F,UAAO6K,SAAP,aAAO,EAAiBxP,KAGE,kCACtBx0B,IAASC,WAAaG,OAAO2O,mBAC7B3O,OAAO2O,iBAAiB,SAAUnc,KAAKw5B,iBACvCx5B,KAAKw5B,mBAELx5B,KAAKR,MAAMgB,OAAOqwC,+BAAlB,UACA7wC,KAAKR,MAAMoC,QAAQ6F,cAAc8L,sBADjC,iBACA,EAAiD+S,YADjD,OACA,EAAuD+K,iBACvDrxB,KAAK8kC,kBAGT,MAAMljC,EAAU5B,KAAKR,MAAMoC,QACrB0vC,EAAmC1vC,EAAQmd,IAAIve,OAAO+wC,wBACtDC,EAA8B5vC,EAAQmd,IAAIve,OAAOixC,uBACnDlyB,kBAAgBC,YAAY8xB,KAAsCA,EAAiCllB,SAASslB,iBAAeC,OAC3HpyB,kBAAgBC,YAAYgyB,KAAiCA,EAA4BplB,SAASslB,iBAAeC,OACjH3xC,KAAKR,MAAMgB,OAAOkwC,yBACZ1wC,KAAKukC,uCAIZ5K,uBACCvsB,IAASC,WAAaG,OAAOosB,qBAC7BpsB,OAAOosB,oBAAoB,SAAU55B,KAAKw5B,iBAI3CtwB,SAAM,MACT,MAAM,cAAEoD,EAAF,UAAiBxO,GAAckC,KAAKR,MAAMgB,QAC1C,UAAE0B,GAAclC,KAAKR,MACrBsT,EAAY9S,KAAKR,MAAMsB,KAAK2jC,cAAczjC,QAAUhB,KAAKR,MAAMsB,KAAK2jC,cAAczjC,OAAO0jC,gBAAmB,GAC5GkN,EAAiB5xC,KAAKR,MAAMsB,KAAK2jC,cAAczjC,QAAUhB,KAAKR,MAAMsB,KAAK2jC,cAAczjC,OAAOiwC,gBAAmB,KACvH,IAAIY,EAAY,GACX/+B,GAAgC,IAApBA,EAAS1R,SACtBywC,EAA+B,aAAnB7xC,KAAKikC,UAA2B/hC,EAAU4vC,2BAA6B5vC,EAAU6vC,0BAGjG,MAAMC,EAAoBhyC,KAAKisC,eACzBgG,EACFp0C,gBAACq0C,0BAAuB,CACpBjmC,QAAS2lC,EACThwC,QAAS5B,KAAKR,MAAMoC,QACpB0K,cAAeA,EACfpK,UAAWA,EACXyqC,WAAY3sC,KAAKR,MAAMwC,SACvBy9B,SAAUz/B,KAAKR,MAAMuC,GACrBtD,iBAAkBuB,KAAKvB,iBACvBgyC,eAAgBzwC,KAAKR,MAAMoC,QAAQkE,QAAQ2C,QAA3B,UAAoCzI,KAAKR,MAAMoC,QAAQkE,QAAQ2C,aAA/D,aAAoC,EAAkCgoC,kBAIxF0B,EAA8B,OAC7BnyC,KAAKR,OADwB,IAEhCsT,SAAUk/B,EACVI,eAAgBpyC,KAAK0lC,sBACrBoB,mBAAoB9mC,KAAKR,MAAMgB,OAAO6xC,kBAAoBryC,KAAK6mC,wBAC/DyL,WAAYtyC,KAAK+oC,iBACjBjrC,UAAW+S,IAAW,6BAA8B/S,GACpDulC,sBAAuB,CACnB/4B,YAAatK,KAAKR,MAClB1B,UAAW+S,IAAW,6BAA8B/S,IAGxDy0C,cAAevyC,KAAKR,MAAMsB,KAAK2jC,cAAczjC,QAAqE,IAA3DhB,KAAKR,MAAMsB,KAAK2jC,cAAczjC,OAAOmlC,kBAA0BnmC,KAAKsnC,sBAAwB,KACnJpM,WAAYl7B,KAAK4oC,iBACjB4J,kBAAmB,CAAE10C,UAAW,wCAChC20C,wBAAyB,CAAE30C,UAAW,+CACtC40C,qBAAsB,CAAE50C,UAAW,oDACnC60C,iCAAkC,CAAE70C,UAAW,sDAC/C80C,cAAe5yC,KAAKmrC,oBACpB0H,YAAa7yC,KAAKR,MAAMsB,KAAK2jC,cAAczjC,QAAqE,IAA3DhB,KAAKR,MAAMsB,KAAK2jC,cAAczjC,OAAOmlC,kBACtFtoC,gBAACi1C,cAAW,CACR3hC,KAAMjP,EAAUkjC,WAChB5mC,UAAW0D,EAAUkjC,WACrB2N,SAAU/yC,KAAKulC,gBACfthC,QAASjE,KAAKylC,aACd1jC,GAAG,wBAEP,KACJixC,kBAAmBhzC,KAAKilC,wBACxBvsB,SAAU1Y,KAAK0Y,SACfvV,aAAc0uC,GACVh0C,gBAACo1C,eAAY,CAAC9hC,KAAM0gC,IAExBqB,uBAAwB,CAAEp1C,UAAW,4BAErCq1C,mBAAoBnzC,KAAKR,MAAMsB,KAAK2jC,cAAczjC,QAAmE,OAAxDhB,KAAKR,MAAMsB,KAAK2jC,cAAczjC,OAAOiwC,qBAAmF7wC,IAAxDJ,KAAKR,MAAMsB,KAAK2jC,cAAczjC,OAAOiwC,eAAgCgB,EAAmB,KACrNjD,cAAehvC,KAAKgvC,gBAExB,OAAOhvC,KAAKR,MAAMwL,WAAWmnC,GAudzBlZ,eACJ,OAAI7rB,IAASC,UACFqL,mBAAS,CAAE06B,QAASC,cAAYC,QAAS1xC,QAAS5B,KAAKR,MAAMoC,QAAQkE,UAEzE4S,mBAAS,CAAE06B,QAASC,cAAYE,SAAU3xC,QAAS5B,KAAKR,MAAMoC,QAAQkE,UAGzE2/B,eACJzlC,KAAK0V,SAAS,CACV2vB,aAAcrlC,KAAKiJ,MAAMo8B,cAIzB7L,kBACJx5B,KAAKu5B,UAAYv5B,KAAKi5B,eAElBj5B,KAAKiJ,MAAMo8B,cAAgBrlC,KAAK0Y,UAChC1Y,KAAKylC,iBA1vBHx6B,aAATE,KAAS,6BAqBVF,aADCC,KACD,gCAvBiBm4B,EAAqB,eADzC/3B,KACoB+3B,GAAA,a,+rBCzCrB,MAAMmQ,EAAqD,IAStD,IATuD,MACxDrxC,EADwD,MAExDyM,EAFwD,QAGxDhN,EAHwD,GAIxDG,EAJwD,SAKxDC,EALwD,mBAMxDyxC,EANwD,SAOxDC,EAPwD,SAQxDC,GACC,EACD,OACI91C,qBAAGC,UAAS,kCAA6B61C,IACrC91C,wBAAMC,UAAU,4BACX8Q,GAEJzM,GAAmB,IAAVA,EACNtE,gBAAC4E,iBAAc,CACX3B,KAAM,CACFqB,MAAO,CAAEO,wBAAyBP,IAEtCQ,cAAe+wC,EACf9xC,QAASA,EACTG,GAAIA,EACJC,SAAUA,EACVlE,UAAU,6BAGdD,wBAAMC,UAAU,4BACX21C,KAOfG,EAA4B,SAC9Bp0C,EACA2C,EACAwxC,GAEiB,IADjB/kC,EACiB,uDADD,GAEhB,OACI/Q,gBAAC21C,EAAgB,CACbrxC,MAAOA,EACPyM,MAAOA,EACPhN,QAASpC,EAAMoC,QACfG,GAAIvC,EAAMuC,GACVC,SAAUxC,EAAMwC,SAChByxC,mBAAoBj0C,EAAMi0C,mBAC1BC,SAAUl0C,EAAMk0C,SAChB7xC,UAAWrC,EAAMqC,UACjB8xC,SAAUA,KAKhBE,EAA0BzuC,GACpBA,GAAiBA,EAAcgqB,eAAkB,EAgCvD0kB,EAAkB,SAACxyC,GAAsJ,UAA/HyyC,EAA+H,wDAAjGxuC,EAAiG,uCAA/ByuC,EAA+B,uCAC3K,OAAKD,EAGExuC,SAAP,UAAOA,EAA6BiB,+BAApC,aAAO,EAAsDjF,KAAK0yC,GAAMA,IAAO3yC,GAFpE0yC,GAMFE,EAAgB10C,IACzB,MAAM,eAAE20C,EAAF,UAAkBC,EAAlB,yBAA6BrqB,EAA2B,EAAxD,YAA2DxO,EAA3D,kBAAwE84B,GAAsB70C,EAAM4G,MACpG,QAAE1F,EAAF,kBAAW4zC,EAAX,kBAA8BzsB,EAA9B,WAAiDM,GA7B1B,EAAC/hB,EAAY2oB,EAA4CxpB,EAAkE1F,KAExJ,MAAMkG,EAAyBgpB,GAAwBA,EAAqB9oB,uBACtEC,EAAwB6oB,GAAwBA,EAAqB5oB,sBAErEouC,GADYnuC,EAAKC,WAAa,IACJ/C,IAAIiD,GAAYA,EAAStB,cAEnDkjB,EAAa/hB,EAAKouC,qBAIxB,MAAO,CACH9zC,QAJY6zC,EAAczsB,KAAKxmB,KAAqC,KAAjBA,IAAwBA,IAAiBwyC,EAAgBxyC,EAAczB,EAAmC0F,EAA6BQ,IAA2BzE,IAAiB4E,KAKtOouC,kBAJsBC,EAAczsB,KAAKxmB,KAAkBA,GAAgBA,IAAiB4E,GAK5F2hB,kBAJsB0sB,EAAczsB,KAAKxmB,KAAkBA,GAAgBA,IAAiBwyC,EAAgBxyC,EAAczB,EAAmC0F,EAA6BQ,IAA2BzE,IAAiB4E,GAKtOiiB,eAckEssB,CAAyBj1C,EAAM4G,KAAM5G,EAAMuvB,qBAAsBvvB,EAAM+F,4BAA6B/F,EAAMK,mCAC1K60C,OAAqCt0C,IAAdg0C,GAA2BA,EAAY,EAC9DO,EAAiC,CACnCC,SAAUhB,EAA0Bp0C,EAAO20C,EAAgB,YAAa30C,EAAMq1C,eAC9EC,IAAKlB,EAA0Bp0C,EAAO80C,GAAqBI,EAAuBN,OAAYh0C,EAAW,aAAcZ,EAAMu1C,UAC7HC,WAAYpB,EAA0Bp0C,EAAO+b,EAAa,QAAS/b,EAAMy1C,iBACzExsB,YAAa4rB,GAAqBT,EAA0Bp0C,EAAO60C,EAAmB,gBAAiB70C,EAAM01C,wBAAqB90C,GAMtI,GAHIM,IACAi0C,EAAWQ,SAAWvB,EAA0Bp0C,EAAOqoB,EAAoBM,OAAa/nB,EAAW,WAAYZ,EAAM41C,gBAErH51C,EAAM4F,cAAe,CACrB,MAAMiwC,EApDiB,EAACjwC,EAA+BgB,KAE3D,MAGMkvC,GAAsBlwC,EAAc4pB,iBAAmB,IAAIlf,OAHzC,CAACzM,EAAekyC,IAC7BlyC,GAASkyC,EAASnlB,SAAW,GAEiD,GACnFmB,GAAUnrB,EAAKmV,aAAe,GAAKs4B,EAAuBzuC,GAChE,OAAO8gB,KAAKC,IAAImvB,EAAoB/jB,IA6CTikB,CAAuBh2C,EAAM4F,cAAe5F,EAAM4G,MACnEgpB,EAAgBykB,EAAuBr0C,EAAM4F,eAC7CqwC,GAA4Bl6B,GAAe,GAAK85B,EAAiBjmB,EAEnEA,EAAgB,IAChBulB,EAAWe,QAAU9B,EAA0Bp0C,GAAQ4vB,EAAe,UAAW5vB,EAAMm2C,cAAgB,mBAGvGN,EAAiB,IACjBV,EAAWY,SAAW3B,EAA0Bp0C,GAAQ61C,EAAgB,YAAa71C,EAAMo2C,eAAiB,qBAGhHjB,EAAWK,WAAapB,EAA0B,EAAD,KAAMp0C,GAAN,IAAak0C,cAAUtzC,IAAaq1C,EAA0B,QAASj2C,EAAMy1C,iBAOlI,OAJIlrB,EAA2B,IAC3B4qB,EAAWkB,eAAiBjC,EAA0Bp0C,GAAQuqB,EAA0B,kBAAmBvqB,EAAMs2C,sBAG9GnB,I,kCCpMX,+H,kCCKA,kDAMO,MAAM1B,EAAwC,IAAa,IAAZ,KAAE9hC,GAAU,EAC9D,OACItT,wBAAMC,UAAU,kDACZD,sBAAIC,UAAU,cACT,IACAqT,EACA,Q,sYCoBV,MAAM4kC,EAAiBv2C,IAC1B,MAaMw2C,EAAgBC,IAClB,MAAM,0BAAEC,EAAF,QAA6BjqC,EAA7B,SAAsC2b,EAAtC,UAAgDlhB,EAAhD,sBAA2DyvC,GAA0B32C,EAE3F,GAAIy2C,EAAiB,CACjB,IAAKC,EACD,OAEJA,EAA0BE,WAAW,CACjCr0C,GAAIo0C,EACJlqC,UACAoqC,wBAAyB,CACrBvqC,cAAe8b,EAASjc,oBAE5BhM,gBAAiBH,EAAMG,gBACvB22C,mBAAoBv2C,MAAOw2C,EAAiBj1C,IA3BrBvB,OAAOw2C,EAAkC7vC,EAAmCkhB,EAAoBtmB,IAC1HoF,EAGEA,EAAU8vC,6BAA6B,CAAEC,WAAY7uB,EAASvY,OAASxD,SAAU0qC,EAAiBj1C,iBACpGmE,KAAKzE,IACoB,YAAlBA,EAAOT,QACPf,EAAMk3C,2BAGb7wC,MAAM/D,OARAsgB,QAAQC,UA0BAs0B,CAA2BJ,EAAiB7vC,EAAWkhB,EAAUtmB,KAG3EuE,MAAM/D,WACR,CACH,IAAK4E,EACD,OAEJkhB,EAAS3iB,aAAe,GACxB2iB,EAASjc,mBAAqB,GAC9Bic,EAASgvB,gBAAkB,GAC3BlwC,EAAUmwC,4BAA4B,CAAEJ,WAAY7uB,EAASvY,SACxD5J,KAAKzE,IACoB,YAAlBA,EAAOT,QACPf,EAAMk3C,2BAGb7wC,MAAM/D,SAIbg1C,EAAkB,CAACC,EAAwCrrC,KAC7D,IAAKA,IAAqBqrC,GAAkD,IAA5BrrC,EAAiBtK,OAC7D,MAAO,GAGX,MAAM41C,EAAgBtrC,EAAiBnK,KAAKg1C,GACjCA,EAAgBzqC,gBAAkBirC,GAG7C,OAAIC,EACOA,EAAcjrC,YAElBgrC,GAuEX,GAAKv3C,EAAMG,iBACNH,EAAMG,gBAAgBb,iBACtBU,EAAMuG,wBACNvG,EAAMG,gBAAgBb,gBAAgByC,KAAK+rC,GAAUA,EAAO7rC,OAASjC,EAAMuG,wBAIhF,MAAO,CACH80B,UAAW,CACPoc,YAAajB,GAEjBkB,iBA9E0B,EAC1B3wC,EACA4wC,EACAC,EACAC,EACA3rC,KAEA,MAAM4rC,EAAcR,EAAgBvwC,EAASoF,mBAAoBD,GAC3D6rC,IAAkBhxC,EAASoF,mBAE3B6rC,EAAevB,GACV,KACHD,EAAaC,IAIrB,OACIp4C,gCACIA,yBAAOC,UAAU,iCACbD,yBACIkE,GAAE,oCAA+BwE,EAAS8I,QAC1CnQ,KAAK,QACLG,KAAI,uBAAkBkH,EAAS8I,QAC/B3Q,SAAU84C,GAAY,GACtBn5C,MAAO84C,EACPl4C,SAAUs4C,EAAa,gBACRA,EACfrlC,IAAG,UAAK3L,EAAS8I,OAAd,aAEN8nC,GAELt5C,yBAAOC,UAAU,qCACbD,yBACIkE,GAAE,sCAAiCwE,EAAS8I,QAC5CnQ,KAAK,QACLG,KAAI,uBAAkBkH,EAAS8I,QAC/B3Q,SAAU84C,GAAY,GACtBn5C,MAAO+4C,EACPn4C,QAASs4C,EAAa,eACRA,EACdrlC,IAAG,UAAK3L,EAAS8I,OAAd,aAEN+nC,GAGD7wC,EAASoF,mBACL9N,uBAAKC,UAAU,qCACXD,wBAAMC,UAAU,2CACXw5C,GAELz5C,0BAAQC,UAAU,uCAAuCmG,QAASuzC,GAAY,IACzEH,IAGT,OAwBEI,CAAsBj4C,EAAMooB,SAAUpoB,EAAMk4C,WAAYl4C,EAAMm4C,kBAAmBn4C,EAAM63C,gBAAiB73C,EAAMkM,kBAChI4rC,YAAaR,EAAgBt3C,EAAMooB,SAASjc,mBAAoBnM,EAAMkM,kBACtEuqC,kBAAmBz2C,EAAMooB,SAASjc,mBAClCnK,eArBuB,EAACo2C,EAAkCj4C,KAA2C,MACrG,MAAMk4C,EAAWl4C,SAAH,UAAGA,EAAiBb,uBAApB,aAAG,EAAkCyC,KAAK+rC,GAAUA,EAAO7rC,OAASm2C,EAAY7xC,wBAC9F,OAAO8xC,aAAP,EAAOA,EAAUr1C,aAmBDs1C,CAAmBt4C,EAAOA,EAAMG,iBAChDo4C,eAAgB,CACZj6C,UAAW,oCC6BjBk6C,EAAgB,CAClBpwB,EACA3b,EACAzM,EACA+D,EACA00C,EACAC,KAA6E,gBAC7E,MAAM,cAAE5rC,EAAF,aAAiBW,EAAjB,GAA+BlL,EAA/B,SAAmCC,EAAnC,QAA6CJ,EAA7C,UAAsDM,EAAtD,iBAAiEi2C,EAAjE,uBACFC,EADE,6BACsBC,EADtB,6BACoDC,EADpD,gCACkFC,EADlF,kCAEFC,EAFE,mCAEiCC,EAFjC,wCAGFC,EAHE,uDAGuCC,EAHvC,wBAIFC,EAJE,6BAIuBC,EAJvB,eAIqDC,EAJrD,oBAIqE35B,EAJrE,UAKF45B,EALE,oBAKSC,EALT,sBAK8B7C,GAA0B32C,EAExD6xB,EAAkBzvB,EAAQkE,QAAQwgB,KAAK+K,gBACvC4nB,EAAiBF,GAAaA,EAAU33C,OAAS,GAAK23C,EAAU,GAAGpvC,KAAOovC,EAAU,GAAGpvC,KAAOqvC,EAC9FE,GAlH6BC,EAkH4B35C,EAAM25C,oBAlHJC,EAkHyBnB,EAjHrFkB,GACAC,GACAA,EAAoBr5B,0BACpBq5B,EAAoBC,oBACpBD,EAAoBr5B,yBAAyBC,kBAI3Co5B,EAAoBr5B,yBAAyBC,kBAHzC,GANuB,IAACm5B,EAA8BC,EAoHjE,MAAMnjC,EAAchK,GAxGQ,EAC5BqtC,EACAH,EACAD,EACAK,EACAC,KACA,GAAID,EAAgC,CAChC,IAAIE,EAAmCD,EAQvC,OAJKA,IACDC,EAAmCH,GAAuB,IAGvDH,EAAuBM,EAAmCP,EAA2BO,EAAmCP,EAA4BO,EAE/J,OAAIN,GACOD,EAA2BI,EAAsBJ,EAErDI,GAoFwBI,CAC3Bl6C,EAAMm6C,oBACNn6C,EAAM25C,oBACND,EACA15C,EAAM+5C,gCACNttC,SAAA,UAAAA,EAAS2tC,gBAAT,eAAmBC,kBAAmB,GAGpCC,GAAuB7tC,aAAA,EAAAA,EAAS8tC,iBAAkBC,IAAoBC,WAAaryB,EAASH,cAE5FtkB,EAAe6W,mBAAiBC,kBAAkBhE,QAAe7V,EA1FlD,EAAC84C,EAAkCrzB,EACxDrmB,EAA4B8pB,EAAmBwwB,EAA+BvzC,KAA0C,MACxH,MAAM2zC,EAA+B,GAGrC,GADuE,aAAtC,UAAA16C,EAAM45C,2BAAN,eAA2B74C,QAExD,OAGJ,IAAI03C,EACJ,OAAIz4C,EAAM26C,sBAAwB56B,kBAAgBC,YAAYhgB,EAAM26C,wBAChElC,EAA2Bz4C,EAAM26C,qBAAqB54C,KAAM63C,GACpD55C,EAAM46C,sBACChB,EAAoBr5B,yBAAyB7T,YAAc3F,EAAS2F,UAExEktC,EAAoBr5B,yBAAyB7T,YAAc3F,EAAS2F,WAC3EktC,EAAoBiB,mBAAqB9zC,EAAS+zC,kBAErBl6C,IAA7B63C,QARR,GAaIz4C,EAAM+6C,eAAiB/6C,EAAM25C,sBAAwBW,IACjDZ,GAA4B,EAC5BgB,EAAmBloC,KAAKxS,EAAMg7C,gBACvBtB,EAA2BrzB,IACD,IAA7BqzB,EACAgB,EAAmBloC,KAAKxS,EAAMi7C,mBAE9BP,EAAmBloC,KAAKxS,EAAMk7C,qBAAqBjqC,QAAQ,YAAayoC,EAAyBxoC,eAM7GlR,EAAMm7C,gBACDr0C,OAAOs0C,GAAKA,EAAEC,YAAcvxB,GAC5BxX,QAAQ8oC,IAAI,MACT,UAAIA,EAAEE,6BAAN,OAAI,EAAyBC,cACzBb,EAAmBloC,KAAK4oC,EAAEE,sBAAsBC,gBAIxDb,EAAmB94C,OAAS,EACrB84C,EAAmBz/B,KAAK,UADnC,IA8CmFugC,CAAiB9B,EAA0BtxB,EAAS7X,SAAWvQ,EAAO+D,EAAOu2C,EAAsBlyB,GAEhLqzB,EAnCoB,EAAC7C,EAA8DxwB,IAAuB,KAChHwwB,EAAuBxwB,IAkCMszB,CAAsB9C,EAAwBxwB,GAErEuzB,EAAUv8C,2BAAiBw8C,IAAeC,eAAgB77C,EAAMf,iBAAmB05C,EAAkB,IACrGp5C,EAAaC,iCAAuBQ,EAAMf,iBAAmB08C,GAE7DG,EAAerD,aAAH,EAAGA,EAA0BsD,gBACzCC,GAAgBvD,EAAwB,iDAAmCA,EAAyBwD,sBAA5D,aAAmC,EAAyClV,oBAAkBnmC,EAGtIs7C,GAAqJ,YAA7HzvC,SAAA,UAAAA,EAASmO,kBAAT,mBAAqB7Y,KAAK8Y,GAF/B,IAE4CA,EAAU4H,2BAAjD,mBAAmG3H,sBAAnG,eAAmHC,OAEjJ,IAAIrN,GACJ,GAAIjB,GAGA,GAFAiB,GAAaC,4BAAkBlB,EAASzM,EAAMoC,QAAQ6F,mBAAerH,GAEjEgN,IAASC,UAAW,CAAC,IAAD,GACpB,MAAMC,EAAU,IAAIC,IAAIL,GAAYM,OAAO3B,SAAS4B,MACpDH,EAAQI,aAAaC,IAAI,YAAzB,qBAAyCia,EAASha,iBAAlD,UAA+D,IAC/DV,GAAaI,EAAQG,WAGzBP,GAAayuC,uCAA6B/zB,EAASplB,aAAe,GAAIhD,EAAMoC,QAAQ6F,eAGxF,MAAO,CACH3G,KAAM,CACFmL,UACA2b,YAEJg0B,WAAYh0B,EAASvY,OACrBvN,MAAOqB,EACPkG,WAAYywC,IAAwBt6C,EAAM25C,sBAAuBvxB,EAAS7X,UAAakG,UAAe,GACtG2R,SACI/pB,gBAACgQ,wBAAqB,CAClB/M,KAAM,CACFyF,SAAUqhB,EACVlhB,UAAWlH,EAAMkH,UACjBuF,UACAua,SAAUhnB,EAAMgnB,UAEpBX,gBAAiB+B,EAAS7X,SAC1BkG,YAAaA,EACb0T,eAAgBmwB,IAAwBt6C,EAAM25C,sBAAwBD,GAA4B,EAClGjsC,aAAcA,EACdX,cAAeA,EACfvK,GAAIA,EACJC,SAAUA,EACVkL,WAAYA,GACZtL,QAASA,EACTM,UAAWA,EACXgQ,IAAG,UAAK3O,EAAL,YAAc2J,IACjBoc,UAAW/lB,EACX8K,oBAAqB2L,mBAAiBC,kBAAkBhO,GACxDod,iBAAkB7pB,EAAMq8C,sCACxBvtC,gBAAiBrC,aAAF,EAAEA,EAASsC,gBAC1BpL,aAAcA,EACdmkB,0BAA2Bg0B,EAC3B9zB,wBAAyBg0B,GACzB5xB,iBAA8C,WAA5B,UAAApqB,EAAMkH,iBAAN,eAAiBnG,QACnCgM,gCAAiC/M,EAAM+M,gCACvC9N,iBAAkBe,EAAMf,iBACxB8G,4BAA6B/F,EAAM+F,8BAE3Cu2C,cAAe7vC,EACX8pC,EAAc,CACVI,wBACAzvC,UAAWlH,EAAMkH,UACjBkhB,WACA3b,UACAyrC,WAAYl4C,EAAM23C,WAClBQ,kBAAmBn4C,EAAMu8C,aACzB1E,gBAAiB73C,EAAM63C,gBACvBnB,0BAA2B12C,EAAM02C,0BACjCxqC,iBAAkBlM,EAAMkM,iBACxB/L,gBAAiBu4C,EACjBnyC,uBAAgE,KAAxC6hB,EAAS3iB,aAAqC2iB,EAAS3iB,aAAezF,EAAMuG,uBACpG2wC,uBAAwBl3C,EAAMk3C,8BAElCt2C,EACJ47C,OACIn+C,gBAACiG,SAAMvB,eACHzE,UAAU,6BACVmG,QAASg3C,EACT/8C,MAAOi6C,GACHp5C,GAEHo5C,GAGT8D,cACI5qB,GAAmBplB,IAAYyvC,GAC3B79C,gBAACq+C,yBAAsB,CACnBp+C,UAAU,iCACV86C,wBAAyBA,EACzBC,6BAA8BA,EAC9Bj3C,QAASA,EACTG,GAAIA,EACJmQ,IAAK0V,EAASvY,OACdrN,SAAUA,EACVi3C,eAAgBA,EAChBrxB,SAAUA,EACVu0B,gBAAc,EACdC,mBAAmB,EACnBC,kBAAkB,EAClBC,mBAAmB,EACnBC,SAAS,SACTz7C,KAAM,CACFi4C,YACA9sC,WAEJuwC,UAAWnE,SAEfj4C,EAERq8C,mBACIprB,GAAmBynB,GAAkB7sC,EACjCpO,gBAAC6+C,8BAA2B,CACxB5+C,UAAW+S,IAAW,uCAAwC6qC,GAAwB,WAAa,IACnGpD,6BAA8BA,EAC9BC,gCAAiCA,EACjCC,kCAAmCA,EACnCC,mCAAoCA,EACpCC,wCAAyCA,EACzCC,uDAAwDA,EACxD73C,KAAM,CAAEmL,UAASiL,SAAU0Q,EAAS7X,UAAY,EAAG+oC,iBAAgB35B,uBACnEvd,QAASA,EACTu6C,gBAAc,EACdQ,8BAA+BjB,GAC/BkB,cAAelB,GACf35C,GAAIA,EACJC,SAAUA,EAEVs6C,mBAAoB98C,EAAMoC,QAAQmd,IAAIve,OAAOq8C,iBAAkB,SAEnEz8C,IAKH08C,EAAoB,CAC7BC,EACAjqC,EACAtT,KACA,MAAMm1C,EAAoC,GA8B1C,OA5BAoI,EAAUz5C,IAAI,CAACskB,EAAUrkB,KACrB,IAAI0I,EAQAgsC,EAUA+E,EAdA/wC,EAHAzM,EAAM+5C,+BAGI0D,YAAkCr1B,EAAS1b,UAAW4G,EAAU8U,EAAS0yB,YAAa96C,EAAMkH,WAE5Fw2C,YAAsBt1B,EAAS1b,UAAW4G,GAGpDtT,EAAM26C,sBAAwB56B,kBAAgBC,YAAYhgB,EAAM26C,wBAChElC,EAA2Bz4C,EAAM26C,qBAAqB54C,KAAM63C,IAAuB,MAC9C,EAAjC,OAAI55C,EAAM46C,uBACC,UAAAhB,EAAoBr5B,gCAApB,eAA8C7T,aAAc0b,EAAS1b,WAEzE,UAAAktC,EAAoBr5B,gCAApB,eAA8C7T,aAAc0b,EAAS1b,WAC5EktC,EAAoBiB,mBAAqBzyB,EAAS0yB,eAItD96C,EAAM+Q,wBAA0B/Q,EAAM+Q,uBAAuBnP,OAAS,IACtE47C,EAA6Bx9C,EAAM+Q,uBAAuBhP,KAAMC,GACrDA,GAAkBA,EAAe0K,YAAc0b,EAAS1b,YAGvEyoC,EAAW3iC,KAAKgmC,EAAcpwB,EAAU3b,EAASzM,EAAO+D,EAAO00C,EAA0B+E,MAGtFrI,GCjXEwI,EAAsB39C,IAC/B,MAAM,SAAEsT,EAAF,UAAYiqC,GAAcv9C,EAChC,MAzC4B,EAACu9C,EAAuBjqC,EAAuCtT,KAC3F,MAAMm1C,EAAsC,GAC5C,IAAK7hC,GAAgC,IAApBA,EAAS1R,OAEtB,OADA5B,EAAMoC,QAAQC,UAAUC,MAAM,iDACvB,KAGX,MAAM0P,EAAyBvC,GAAsBwC,IAAQxC,EAAOM,GAAQA,EAAK5D,oBAE3E+F,GADsBzC,EACa8tC,EADStrC,IAAQxC,EAAOM,GAASA,EAAKtK,eAAnDgK,MAE5B,MAAM0C,EAA6B,GAsBnC,OAnBApP,OAAOsP,QAAQH,GAAeI,QAAQ,IAAwC,IAAtCsrC,EAAcrrC,GAAwB,EAE1EL,EAAc0rC,GAAgB5rC,EAAsBO,GACpDJ,EAAeK,KAAKR,EAAsBO,MAI9CxP,OAAO0P,KAAKN,GAAgBG,QAAQI,IAChC,MAAMC,EAAYR,EAAeO,GACjC3P,OAAO0P,KAAKE,GAAWL,QAAQvO,IAC3B,MAAMgD,EAAW4L,EAAU5O,GACrB85C,EAAmBP,EAAkBv2C,EAAUuM,EAAUtT,GACtC,OAArB69C,GACA1I,EAAW3iC,KAAKqrC,OAMrB1I,GAUH2I,CAAwBP,EAAWjqC,EAAUtT,IChC9CO,eAAew9C,EAAiBnzB,GACnC,MAAMozB,EAAgC,GAetC,aAbMC,8CACF,IAAIC,mCAAiCtzB,EAAI7W,eAAeiG,aACxD4Q,GACF3kB,KAAKk4C,IACCA,IACAH,EAAcG,iBAAmBA,KAGpC93C,MAAM/D,IACHsoB,EAAIvoB,UAAUyc,UAAUxc,GACjB,KAGR07C,E,ykBC0DX,IAAMI,EAAN,cAAmB//C,IAAMggD,UAcrBt+C,YAAmBC,GACfC,MAAMD,GAPF,KAAA+5C,gCAA0C,EAE1C,KAAAuE,YAAsB,EAEb,KAAAC,iBAA2B,uBA+M3B,KAAAC,mBAAsB71C,IACnCnI,KAAK0V,SAAS,CACVuoC,qBAAsBj+C,KAAKiJ,MAAMg1C,uBAOxB,KAAAC,0BAA4B,KACzCl+C,KAAKm+C,wBAkcQ,KAAAC,iBAAoB9xC,GAC1BA,GAAiB,CACpBsM,UAAW,CACPC,GAAI,CAAEC,EAAG,gBAAiBC,EAAG,EAAGC,EAAG,GACnCmgB,GAAI,CAAErgB,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,GACrCC,GAAI,CAAEH,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,IAEzCE,UAAU,GAQD,KAAAmlC,0BAA6BC,IAC1C,GAAIt+C,KAAKR,MAAMsB,KAAKsF,KAAKpF,OAAQ,CAC7B,MAAMwK,EAAQ,CACVqf,YAAa,CAACyzB,EAAiBjvC,OAAQqB,aAE3C1Q,KAAKR,MAAMsB,KAAKsF,KAAKpF,OAAO4pB,gBAAgBpf,GACvC/F,KAAK,KACFzF,KAAKu+C,eACA14C,MAAO/D,IACJ9B,KAAKR,MAAMqC,UAAU6e,QAAQ5e,GAC7B9B,KAAKR,MAAMqC,UAAU0c,MAAM,+BAGtC1Y,MAAO/D,IACJ9B,KAAKR,MAAMqC,UAAU6e,QAAQ5e,GAC7B9B,KAAKR,MAAMqC,UAAU0c,MAAM,kCAU1B,KAAA85B,6BAA+B,CAACr3C,EAAsC4mB,KAC7D,UAAlB5mB,EAAOT,QAAsBqnB,GAC7B5nB,KAAKq+C,0BAA0Bz2B,IAWtB,KAAA42B,uBAAyB,CAACC,EAA4BvnC,EAAkBoS,KACrFo1B,YACI1+C,KAAKu5C,+BACLv5C,KAAKR,MAAMsB,KAAKsF,KAAKpF,OACrBhB,KAAKR,MAAMqC,UACX7B,KAAKR,MAAMsB,KAAKgS,SAAS9R,OACzBy9C,EACAvnC,GACCzR,KAAMk5C,IACH,GAAiC,aAA7BA,aAAA,EAAAA,EAAkBp+C,QAMlB,OALAP,KAAKu+C,eAAe14C,MAAO/D,IACvB9B,KAAKR,MAAMqC,UAAU6e,QAAS5e,EAAgB9D,SAC9CgC,KAAKR,MAAMqC,UAAU0c,MAAM,8BAGxB,EAGX,IAAKvE,mBAAiBC,kBAAkB0kC,GAAmB,CAAC,IAAD,EAEvD,MAAMC,EAA+C,CACjD/D,UAAW7gC,mBAAiBC,kBAAkBqP,GAAa,EAAIA,EAC/DwxB,sBAAuB,CACnBC,aACJx7B,kBAAgBC,YAAYm/B,EAAiBE,mBAAqBF,EAAiBE,kBAAkB,GAAG9D,aAAe,GACnHt6B,iBAAgB,UAAEk+B,EAAiBn+B,oBAAnB,aAAE,EAA+BC,mBAIzDzgB,KAAK0V,SAAUopC,IACX,MAAMC,EAA6CD,EAAcnE,gBAAgBr0C,OAAOxE,GAASA,EAAM+4C,YAAcvxB,GAErH,OADAy1B,EAAc/sC,KAAK4sC,GACZ,CAAEjE,gBAAiBoE,KAIlC,OAAO,IAEVl5C,MAAM,KACI,IAGR,GAMM,KAAAm5C,0BAA4B,KACrCh/C,KAAKu5C,gCAEL0F,sCAA4B,IAAIC,0BAA2Bl/C,KAAKR,MAAMoC,QAAQ6F,eACzEhC,KAAK1F,SAAYC,KAAKu+C,gBACtB14C,MAAO/D,IACJ9B,KAAKR,MAAMqC,UAAU6e,QAAQ5e,EAAM9D,SACnCgC,KAAKR,MAAMqC,UAAU0c,MAAM,8BAnwBvCve,KAAKvB,iBAAmB4J,6BAAmBrI,KAAKR,MAAMoC,QAAQkE,QAAQwC,kBAAoBtI,KAAKR,MAAM+I,aAAcvI,KAAKR,MAAMqC,WAC9H7B,KAAKrB,QAAUC,2BAAiB,QAASoB,KAAKvB,iBAAkB,IAChEuB,KAAKg+C,mBAAqBh+C,KAAKg+C,mBAAmBhqC,KAAKhU,MACvDA,KAAKk+C,0BAA4Bl+C,KAAKk+C,0BAA0BlqC,KAAKhU,MACrEA,KAAKiJ,MAAQ,CACT0xC,gBAAiB,GACjBsD,qBAAqB,EACrBT,cAAe,GACf2B,aAAa,GAOS,0BAC1Bn/C,KAAK89C,YAAa,EAClB,MAAM,OACFt9C,EACAoB,SAAS,cACL6F,IAEJzH,KAAKR,MAO4B,IAAD,GALpCQ,KAAKu5C,qCAAuCv5C,KAAKo/C,oCAC7Cp/C,KAAKu5C,sCACCv5C,KAAKu+C,eAGX/9C,EAAO6+C,2BACHr/C,KAAK89C,YAAL,UAAmB99C,KAAKR,MAAMsB,KAAKsF,KAAKpF,cAAxC,OAAmB,EAA6BoF,KAAKC,WACrDrG,KAAK0V,SAAS,CAAE8nC,oBAAqBD,EAAiB91C,KAG1DoB,YACI,4BAAM7I,KAAKR,MAAMsB,KAAKsF,KAAKpF,cAA3B,aAAM,EAA6BoF,KAAKC,WACxCtG,UACQC,KAAK89C,YACL99C,KAAK0V,SAAS,CAAE8nC,oBAAqBD,EAAiB91C,QAUnEkyB,uBACH35B,KAAK89C,YAAa,EASfh1C,sBAAsBC,EACzBC,GACA,OAAIhJ,KAAKiJ,QAAUD,GAAahJ,KAAKR,MAAMsB,OAASiI,EAAUjI,KAO3DoI,SAAM,YACT,MACIpI,MACIsF,MAAQpF,OAAQoF,GAChB0M,UAAY9R,OAAQ8R,IAExBlR,SACIkE,SACIwgB,MAAM,gBACF+K,EADE,UAEFqI,KATV,UAaFx3B,GACAlC,KAAKR,MAEH8/C,EAAmBpzB,YAAW,WAAYlsB,KAAKR,MAAMoC,QAAQ6F,gBAAkB,GAC/E83C,EAAoBrzB,YAAW,OAAQlsB,KAAKR,MAAMoC,QAAQ6F,gBAAkB,GAC5E+3C,EAAcx/C,KAAKy/C,eAAepuB,EAAiBiuB,EAAkB5lB,GAAa,IAClFgmB,EAAct5C,GAAQA,EAAKA,KAAKC,WAA4C,IAA/BD,EAAKA,KAAKC,UAAUjF,OACjE+Q,EAAYnS,KAAK2/C,gBACjBz5C,EAAqB,UAAGlG,KAAKR,MAAMoC,QAAQkE,QAAQE,eAA9B,aAAG,EAAoCG,sBAC5Dy5C,EAAgCC,qCAA0B,UAC5Dz5C,aAD4D,EAC5DA,EAAMA,KAAKC,iBADiD,QACpC,GADoC,UAE5DrG,KAAKR,MAAMsB,KAAKq5C,qBAAqBn5C,cAFuB,QAEb,GAC/ChB,KAAKR,MAAMoC,QAAQ6F,cACnBqL,UAAY,GACZ5M,GAEEmD,IAAYu2C,WAA+BE,WAAYF,IAAkC5/C,KAAKiJ,MAAMk2C,eAAgBhtC,GAAYA,EAAU2V,KAAKF,GAAYA,EAASve,UACpK02C,EAAgC,UAAG//C,KAAKR,MAAMsB,KAAK2I,aAAazI,cAAhC,aAAG,EAAqCO,KAAKkI,GAAsC,oEAAtBA,EAAaE,MAC1Gq2C,IAAyB55C,WAAMlF,kBAAkB6+C,aAAzB,EAAyBA,EAAkCn2C,WACnF+H,EAAiBquC,EAAwBhgD,KAAKigD,oBAAsB,KAC1EjgD,KAAKrB,QAAQQ,cAAcC,MAAQP,oBAAkBqhD,SACrD,MAAMC,EAA6BnhD,iCAAuBgB,KAAKvB,iBAAkBuB,KAAKrB,SACtFqB,KAAKrB,QAAQQ,cAAcC,MAAQP,oBAAkBuhD,cACrD,MAAMC,EAA4BrhD,iCAAuBgB,KAAKvB,iBAAkBuB,KAAKrB,SACrFqB,KAAKrB,QAAQQ,cAAcC,MAAQP,oBAAkByhD,eACrD,MAAMC,EAA2BvhD,iCAAuBgB,KAAKvB,iBAAkBuB,KAAKrB,SAGpF,GAAIihD,IAAkCA,EAA8BE,QAAS,CACzE,GAAIE,GAA4C,OAAnBruC,EACzB,IAAK,MAAM6uC,KAAiB7uC,EACxB3R,KAAKygD,wCAAwCD,EAAeZ,GAIpE5/C,KAAKygD,wCAAwCtuC,EAAWytC,GAG5D,MAAM91C,EAAS,OACR9J,KAAKR,OADG,IAEX1B,UAAW+S,IAAW,WACtB3S,MAAOL,wBAAIC,UAAU,qBAChBoE,EAAUw+C,WAEft6C,KAAMpG,KAAKR,MAAMsB,KAAKsF,KAAKpF,OAC3B2/C,iBAAkB,CAAE7iD,UAAW,uBAC/B8iD,oBAAqB,CAAE9iD,UAAWsI,WAAMlF,eAAiB,8BAAgC,6BACzF2/C,kBAAmB,CAAE/iD,UAAWsI,WAAMlF,eAAiB,6BAA+B,4BACtF67C,UAAW5qC,EACXR,iBACAmvC,UAAW9gD,KAAK+gD,gBAChBpD,iBAAkB39C,KAAKghD,iBACvBp/C,QAAS5B,KAAKR,MAAMoC,QACpBI,SAAUhC,KAAKR,MAAMwC,SACrBH,UAAW7B,KAAKR,MAAMqC,UACtBE,GAAI/B,KAAKR,MAAMuC,GACfi+C,wBACAiB,2BAA4B/+C,EAAU++C,2BACtCC,oBAAqB3hC,kBAAgBC,YAAYpZ,aAA5B,EAA4BA,EAAMA,KAAKC,WACxDD,WAAMlF,eAAiBrD,wBAAIC,UAAU,gCAC/BoE,EAAUi/C,qBACRtjD,wBAAIC,UAAU,8BAChBoE,EAAUk/C,mBAEhB,KACJC,sBAAuBrhD,KAAKshD,4BAC5BC,wBAAyBvhD,KAAKwhD,8BAC9BC,2BAA8B/B,EAM1B,KALA7hD,kBAACiG,SAAMvB,eACHyB,SAAUqF,EAAUvL,UAAU,yBAAyB2P,KAAM+xC,EAC7DthD,MAAOgE,EAAUw/C,qBAAyBvB,GACzCj+C,EAAUw/C,qBAGnBC,sBAAyBjC,GAAgBruB,EAMrC,KALAxzB,kBAACiG,SAAMvB,eACHyB,SAAUqF,EAAUvL,UAAU,8BAA8B2P,KAAM6xC,EAClEphD,MAAOgE,EAAU0/C,0BAA8BvB,GAC9Cn+C,EAAU0/C,0BAGnBC,sBAAwBnC,EAAkD,KAAnC1/C,KAAKR,MAAM+sC,MAAMuV,eACxDC,qBAAsBlkD,kBAACiG,SAAMvB,eACzBzE,UAAU,gCAAmCyiD,EAAwB,CAAE9yC,KAAM8xC,EAC7ErhD,MAAOgE,EAAU8/C,4BAChB9/C,EAAU8/C,2BAEfC,6BAA+BjiD,KAAKkiD,6BAA+BpvC,EAC/DjV,kBAACskD,mCAAgC,CAC7B3J,kCAAmCx4C,KAAKoiD,2CAA2ClgD,GACnFu2C,mCAAoCz4C,KAAKk+B,0CAA0Ch8B,GACnFmgD,yCAA0CriD,KAAKsiD,kDAAkDpgD,GACjGqgD,kCAAmCrgD,EAAUqgD,kCAC7CC,yCAA0CtgD,EAAUsgD,yCACpD5gD,QAAS5B,KAAKR,MAAMoC,QACpBG,GAAI/B,KAAKR,MAAMuC,GACfC,SAAUhC,KAAKR,MAAMwC,SACrBlB,KAAM,CACFg4C,eAAgB94C,KAAKR,MAAMsB,KAAKg4C,eAAe93C,OAC/CmR,UAAWnS,KAAKR,MAAMsB,KAAKsF,KAAKpF,OAAQoF,KAAKC,UAC7C8Y,oBAAqBnf,KAAKR,MAAMsB,KAAKqe,oBAAoBne,UAGjE,KACJyhD,cAAeziD,KAAKR,MAAM+sC,MAAMkW,eAAiBziD,KAAKR,MAAM+sC,MAAMkW,cAAcrhD,OAAS,EAAIpB,KAAKR,MAAM+sC,MAAMkW,cAAc,GAAK,KACjIrK,uBAAwBp4C,KAAKq+C,0BAC7BhG,6BAA8Br4C,KAAKq4C,6BACnCqK,iBAAkB7kD,kBAAC+M,UAAO,CAAC9M,UAAU,wCACrC6kD,kBAAmD,WAAhC3iD,KAAKR,MAAMsB,KAAKsF,KAAK7F,OAAsBP,KAAKR,MAAM0C,UAAU0gD,wBAA0B,KAC7GC,eAAgB7iD,KAAKR,MAAMsB,KAAKsF,KAAKpF,QAAUhB,KAAKR,MAAMsB,KAAKsF,KAAKpF,OAAO8hD,QAC3EC,mBAAoB/iD,KAAKgjD,uBAAuB7wC,GAChD1T,iBAAkBuB,KAAKvB,mBAG3B,OAAOuB,KAAKR,MAAMwL,WAAWlB,GAwBzBq0C,uBACJn+C,KAAK0V,SAAS,CACVuoC,qBAAqB,IAQrBiE,4BAAyB,YAC7B,MAAM97C,EAAI,UAAGpG,KAAKR,MAAMsB,KAAKsF,YAAnB,aAAG,EAAsBpF,OACnC,GAAIgZ,mBAAiBC,kBAAkB7T,IAASA,EAAKlF,eACjD,OAAO,EAGX,MAAM+hD,EAA8B,UAAGjjD,KAAKR,MAAMsB,KAAK2I,aAAazI,cAAhC,aAAG,EAAqCO,KAAKkI,GAAsC,sDAAtBA,EAAaE,MAC9G,SAAIs5C,WAAgCr5C,WAAhC,UAA6C5J,KAAKR,MAAMsB,KAAKqe,oBAAoBne,cAAjF,OAA6C,EAA4Cqe,OAASrf,KAAKR,MAAMsB,KAAKg4C,eAAe93C,QACjIue,kBAAgBC,YAAhB,UAA4BpZ,EAAKA,YAAjC,aAA4B,EAAWC,YAAcrG,KAAKR,MAAMsB,KAAKqe,oBAAoBne,QAWzFggD,iBACJ,OACIhhD,KAAKR,MAAMgB,OAAO6+C,yBCvUC7/C,KAE3B,MAAM,GACFuC,EADE,mBAEFmhD,EAFE,WAGFC,EACAjhD,WAAW,kBACPkhD,EADO,sBAEPC,GANF,mBAQFC,EARE,cASFC,GACA/jD,EAEJ,IAAK+f,kBAAgBC,YAAY2jC,GAC7B,OAGJ,MAAMK,EAAO,UAAMzhD,EAAN,UACPjE,EAAY,sBAClB,MAAO,CACH2lD,wBAAyB,CACrB3lD,UAAW,uBAEf4lD,iBACI7lD,oCACIA,0BAAMC,UAAU,uBAChBD,8BACK,IACA2B,EAAM0C,UAAUyhD,yBAI7BC,oBACI/lD,uBACIC,UAAU,2BAA2B+lD,SAAU,EAAG7gD,KAAK,OACvDiB,QAASs/C,GACR,IACAH,EACA,KAETU,gBACIjmD,kBAACkmD,QAAK,CAAC7vC,OAAQgvC,EAAoBplD,UAAS,UAAKA,GAAaivB,OAAQu2B,GAClEzlD,kBAACmmD,cAAW,CAAClmD,UAAS,UAAKA,EAAL,oBAAkCivB,OAAQu2B,GAC5DzlD,wBAAIkE,GAAIyhD,EAAS1lD,UAAU,mCACtBulD,IAGTxlD,kBAAComD,YAAS,CAACnmD,UAAS,UAAKA,EAAL,mBAChBD,4BACKslD,EAAW7/C,IAAI4gD,IAAa,MACzB,OACIrmD,wBAAIC,UAAU,iCAAiCoU,IAAKgyC,EAAW70C,QAA/D,UACK60C,EAAWC,iBADhB,aACK,EAAsBn9B,UACtB,SAOrBnpB,kBAACumD,cAAW,CAACtmD,UAAS,UAAKA,EAAL,yBD2Q1BumD,CAAe,CACXtiD,GAAI/B,KAAK+9C,iBACTmF,mBAAoBljD,KAAKiJ,MAAMg1C,oBAC/BsF,cAAevjD,KAAKg+C,mBACpBsF,mBAAoBtjD,KAAKk+C,0BACzBiF,WAAYnjD,KAAKiJ,MAAMu0C,cAAcG,iBACrCz7C,UAAW,CACPyhD,uBAAwB3jD,KAAKR,MAAM0C,UAAUyhD,uBAC7CP,kBAAmBpjD,KAAKR,MAAM0C,UAAUkhD,kBACxCC,sBAAuBrjD,KAAKR,MAAM0C,UAAUmhD,sBAC5CiB,8BAA+BtkD,KAAKR,MAAM0C,UAAUoiD,iCAW5D7D,wCACJtuC,EAAyCoyC,GACzC,MAAM,UAAEriD,GAAclC,KAAKR,MAE3B,GAAI+f,kBAAgBC,YAAYrN,KAC3BoyC,EAAkCzE,SACnCvgC,kBAAgBC,YAAY+kC,EAAkCC,qBAE9D,IAAK,MAAMC,KAAsBF,EAAkCC,oBAAqB,CACpF,MAAMj+C,EAAW4L,EAAU5Q,KAAKmjD,IAAO,aAAI,UAAAA,EAAQ5jD,YAAR,eAAc8mB,SAAS1b,aAAcu4C,IAC5El+C,IACAA,EAASzE,MAAQI,EAAUyiD,uBAC3Bp+C,EAAS8C,UAAW,IAW5B25C,uBAAuB7wC,GAC3B,MAAMyyC,EAAYzyC,GAAaA,EAAU7O,IAAIskB,IAAW,QAKpD,MAFsB,UAAAA,EAAS9mB,YAAT,mBAAemL,eAAf,eAAwB8tC,iBAAkBC,IAAoBC,UAE9DryB,EAAS9lB,MAAO,CAAC,IAAD,EAClC,MAAM+iD,EAAaj9B,EAAS9mB,MAAT,UAAiB8mB,EAAS9mB,KAAKmL,eAA/B,OAAiB,EAAuBtC,KAAzC,UAAoDie,EAAS9mB,KAAKmL,QAAQtC,KAA1E,aAAmFie,EAAS9lB,OAAU8lB,EAAS9lB,MAEjI,OACIjE,yBAAKC,UAAU,mBACV+mD,GAKb,OAAO,OACRv+C,OAAQ8mB,KAAgCA,IAAS,GAEpD,MAAO,CACH03B,QAAS,CACL/hD,IAAKuU,QACLxZ,UAAW,YACXoW,OAAQ0wC,EAAUxjD,OAAS,EAC3B2C,MAAO,SACPghD,WAAW,EACX,aAAc/kD,KAAKR,MAAM0C,UAAU8iD,8BAEvCC,OACIpnD,yBAAKC,UAAU,oBAAmB,cAAa,QAC3CD,0BAAMC,UAAU,6BAChBD,8BACKmC,KAAKR,MAAM0C,UAAU8iD,+BAIlCliB,OAAQ8hB,GAQRpD,8BACJ,MACI1gD,MACIsF,MAAQpF,OAAQoF,IAFlB,UAIFvE,EAJE,UAKFK,GACAlC,KAAKR,MAET,OAAO4G,WAAMlF,eACTgkD,YAAe,CACXjQ,gBAAiB/yC,EAAUijD,iBAC3BC,aAAcljD,EAAUkjD,aACxBh/C,KAAMA,EAAKA,KACXxE,QAAS5B,KAAKR,MAAMoC,QACpBI,SAAUhC,KAAKR,MAAMwC,SACrBH,YACAE,GAAI/B,KAAKR,MAAMuC,UAEnB3B,EAOAkhD,4BAAyB,YAC7B,MACIxgD,MACIsF,MAAQpF,OAAQoF,GADd,4BAEFb,GAHF,UAKF1D,EALE,UAMFK,GACAlC,KAAKR,MAEHuvB,EAAuB/uB,KAAKR,MAAMoC,SAAW5B,KAAKR,MAAMoC,QAAQkE,SAAW9F,KAAKR,MAAMoC,QAAQkE,QAAQE,QAEtGyD,EAAY,UAAGzJ,KAAKR,aAAR,iBAAG,EAAYsB,YAAf,aAAG,EAAkB2I,aACjC5J,EAAoC4J,SAAH,UAAGA,EAAczI,cAAjB,iBAAG,EAAsBO,KAAKgO,GAF/B,oEAEuCA,EAAK5F,aAA3C,aAAG,EAAiFC,UAE3H,OAAOmlB,IAAwBxP,kBAAgBC,YAAYpZ,aAA5B,EAA4BA,EAAMA,KAAKC,YAAeD,WAAMlF,oBAmBvFd,EAlBA8zC,YAAa,CACT9tC,KAAMA,EAAMA,KACZyuC,cAAe3yC,EAAUmjD,oBACzBjQ,cAAelzC,EAAUojD,uBACzBpQ,iBAAkBhzC,EAAUqmB,aAC5BwsB,SAAU7yC,EAAUqjD,kBACpBtQ,gBAAiB/yC,EAAU8yC,WAC3Bc,oBAAqB5zC,EAAU4zC,oBAC/Bl0C,QAAS5B,KAAKR,MAAMoC,QACpBI,SAAUhC,KAAKR,MAAMwC,SACrBD,GAAI/B,KAAKR,MAAMuC,GACf0xC,mBAAoBvxC,EAAUsjD,sBAC9B9R,SAAUxxC,EAAUD,UACpB8sB,uBACAlvB,oCACA0F,4BAA6BA,aAAF,EAAEA,EAA6BvE,OAC1Da,cASJk/C,gBACJ,MACIjgD,MACIsF,MAAQpF,OAAQoF,IAFlB,UAIFlE,GACAlC,KAAKR,MAET,OAAO4G,GACHvI,kBAAC4nD,qBAAkB,CACfr/C,KAAMA,EACNs/C,qBAAsBxjD,EAAUwjD,qBAChCC,qBAAsBzjD,EAAUyjD,qBAChCC,yBAA0B1jD,EAAU0jD,yBACpCC,4BAA6B3jD,EAAU2jD,4BACvCC,gBAAiB,IACjB7E,2BAA4B/+C,EAAU++C,2BACtC8E,gBAAiB7jD,EAAU6jD,gBAC3BC,0BAA2B9jD,EAAU8jD,0BACrCC,8BAA+B/jD,EAAU+jD,8BACzCC,iCAAkChkD,EAAUgkD,iCAC5CC,4BAA6BjkD,EAAUkkD,4BACvCxkD,QAAS5B,KAAKR,MAAMoC,QACpBG,GAAI/B,KAAKR,MAAMuC,GACfC,SAAUhC,KAAKR,MAAMwC,SACrBlB,KAAM,GACNrC,iBAAkBuB,KAAKvB,mBAU3B2jD,2CAA2ClgD,GAC/C,MAAO,CACHmkD,yBAA0BnkD,EAAUmkD,yBAEpCC,wBAAyBpkD,EAAUokD,wBACnCC,4BAA6BrkD,EAAUqkD,4BAEvCC,gCAAiCtkD,EAAUskD,gCAC3CC,iCAAkCvkD,EAAUukD,iCAC5CC,sCAAuCxkD,EAAUwkD,sCAEjDC,oBAAqBzkD,EAAUykD,oBAC/BC,wBAAyB1kD,EAAU0kD,wBACnCC,cAAe3kD,EAAU2kD,eASzBC,iDAAiD5kD,GACrD,MAAO,CACH6kD,4BAA6B7kD,EAAU6kD,4BACvCC,2BAA4B9kD,EAAU8kD,2BACtCC,0CAA2C/kD,EAAU+kD,0CACrDC,6CAA8ChlD,EAAUglD,6CACxDC,0CAA2CjlD,EAAUilD,0CACrDxkD,cAAeT,EAAUS,cACzBuL,kBAAmBhM,EAAUgM,kBAC7BC,iBAAkBjM,EAAUiM,kBAS5Bm0C,kDAAkDpgD,GACtD,MAAO,CACH6kD,4BAA6B7kD,EAAU6kD,4BACvCC,2BAA4B9kD,EAAU8kD,2BACtCI,4CAA6CllD,EAAUklD,4CACvDC,+CAAgDnlD,EAAUmlD,+CAC1DC,4CAA6CplD,EAAUolD,4CACvDC,+CAAgDrlD,EAAUqlD,+CAC1DC,2CAA4CtlD,EAAUslD,2CACtDC,qDAAsDvlD,EAAUulD,sDAShEC,gEAAgExlD,GACpE,MAAO,CACHylD,yBAA0BzlD,EAAUylD,yBACpCC,8BAA+B1lD,EAAU0lD,8BACzCC,yBAA0B3lD,EAAU2lD,yBACpCC,+BAAgC5lD,EAAU4lD,gCAS1C5pB,0CAA0Ch8B,GAC9C,MAAO,CACHm8B,yBAA0Bn8B,EAAU6lD,0BACpCxpB,wBAAyBr8B,EAAUs8B,mBACnCC,2BAA4Bv8B,EAAUu8B,2BACtCC,yBAA0Bx8B,EAAU8lD,+BAEpCrpB,yBAA0Bz8B,EAAUy8B,yBAEpCC,yBAA0B18B,EAAU+lD,8BACpCnpB,+BAAgC58B,EAAUgmD,0CAQ1CvI,gBAAa,MACjB,MACI7+C,MACIsF,MAAQpF,OAAQoF,GAChB2yC,WAAa/3C,OAAQ+3C,GACrBD,gBAAkB93C,OAAQ83C,GAC1B35B,qBAAuBne,OAAQme,IAEnCvd,SACIkE,SACIE,SAAS,uBACLC,GACA,CAAEA,4BAAwB7F,KAXpC,OAcFI,EAdE,UAeFqB,EAfE,UAgBFK,EAhBE,QAiBFimD,GACAnoD,KAAKR,MAEH8M,EAAgBtM,KAAKo+C,iBAAiB59C,EAAO8L,eAE7CquC,EAA+C36C,KAAKiJ,MAAM0xC,gBAChE,IAAIyN,EAA0B,GAI9B,OAHID,GAAW5lD,OAAO0P,KAAKk2C,GAAS/mD,OAAS,GAAK+mD,EAAQ1F,eAAiB0F,EAAQ1F,cAAcrhD,OAAS,IACtGgnD,EAAkBD,EAAQ1F,cAAc,GAAG1gD,IAExCwd,kBAAgBC,YAAYpZ,aAA5B,EAA4BA,EAAMA,KAAKC,WHrPxB7G,KAC1B,MAAM,SAAEsT,EAAF,UAAYiqC,GAAcv9C,EAChC,OACIs9C,EAAkBC,EAAWjqC,EAAUtT,IGmPnC6oD,CAAc,CACVtL,UAAW32C,EAAMA,KAAKC,UACtB8vC,sBAAuBiS,EACvBzN,kBACA7nC,SAAU9S,KAAKR,MAAMsB,KAAKgS,SAAS9R,OACnCm5C,qBAAsBn6C,KAAKR,MAAMsB,KAAKq5C,qBAAqBn5C,OAC3DuP,uBAAwBvQ,KAAKR,MAAMsB,KAAKnB,gBAAgBqB,OACxDwlB,SAAQ,UAAExmB,KAAKR,MAAMsB,KAAK0lB,gBAAlB,aAAE,EAA0BxlB,OACpCsL,gBACA6sC,oBAAqBn5C,KAAKR,MAAMoC,QAAQmd,IAAIve,OAAOqf,mBAAoB,EACvE85B,oBAAqB35C,KAAKR,MAAMoC,QAAQmd,IAAIve,OAAOwlB,2BACnDo0B,sBAA8E,aAAvDp6C,KAAKR,MAAMoC,QAAQmd,IAAIve,OAAO8nD,qBACrDr7C,aAAcjN,KAAKR,MAAMoC,QAAQkE,QAAQmH,aACzCrL,QAAS5B,KAAKR,MAAMoC,QACpBI,SAAUhC,KAAKR,MAAMwC,SACrBD,GAAI/B,KAAKR,MAAMuC,GACfG,UAAW,CACP4L,WAAY5L,EAAUwK,yBACtBqB,YAAa7L,EAAUuK,0BACvBI,aAAc3K,EAAUuf,kCACxBzT,YAAa9L,EAAUyK,0BACvBsB,aAAc/L,EAAU0K,2BACxBJ,sBAAuBtK,EAAUqmD,oBACjCz7C,uBAAwB5K,EAAU4K,uBAClCmO,yBAA0B/Y,EAAU+Y,yBACpCE,yBAA0BjZ,EAAUiZ,yBACpCpO,mBAAoB7K,EAAU6K,mBAC9BmB,kBAAmBhM,EAAUgM,kBAC7BC,iBAAkBjM,EAAUiM,iBAC5BC,oBAAqBlM,EAAU8K,gBAC/Bid,qBAAqB,EAAD,GACb/nB,IAGXL,YACA+2C,wBAAyB12C,EAAU02C,wBACnCC,6BAA8B32C,EAAU22C,6BACxCV,iBAAkBj2C,EAAUsmD,qBAC5BrR,WAAYj1C,EAAUumD,uBACtB1M,aAAc75C,EAAUwmD,oBACxBrR,gBAAiBn1C,EAAUymD,uBAC3BzS,0BAA2Bl2C,KAAKR,MAAMsB,KAAKo1C,0BAA0Bl1C,OACrEw5C,eAAgBt4C,EAAUyiD,uBAC1BlK,kBAAmBv4C,EAAU0mD,8BAC7BlO,qBAAsBx4C,EAAU2mD,6BAChCniD,UAAW1G,KAAKR,MAAMsB,KAAKsF,KAAKpF,OAChC0K,iBAAkB1L,KAAKR,MAAMsB,KAAK4K,iBAAiB1K,OACnDo3C,uBAAwBp4C,KAAKq+C,0BAC7BhG,6BAA8Br4C,KAAKq4C,6BACnCwD,sCAAuC77C,KAAKw+C,uBAC5C9H,uBAAwB12C,KAAKg/C,0BAC7BjG,YACAC,oBAAqB92C,EAAU82C,oBAC/BjzC,uBAAwBE,EACxBs0C,cAAe/5C,EAAOsoD,qBACtBv8C,gCAAiC/L,EAAO+L,gCACxC9N,iBAAkBuB,KAAKvB,iBACvB86C,+BAAgCv5C,KAAKu5C,+BAErCf,kCAAmCx4C,KAAKoiD,2CAA2ClgD,GACnFu2C,mCAAoCz4C,KAAKk+B,0CAA0Ch8B,GACnFw2C,wCAAyC14C,KAAK8mD,iDAAiD5kD,GAC/Fy2C,uDAAwD34C,KAAK0nD,gEAAgExlD,GAE7Ho2C,6BAA8Bp2C,EAAUo2C,6BACxCC,gCAAiCr2C,EAAUq2C,gCAC3CwQ,0BAA2B7mD,EAAU6mD,0BACrCC,4BAA6B9mD,EAAU8mD,4BACvClQ,iBACA35B,sBACAi6B,oBAAqBp5C,KAAKR,MAAMsB,KAAKq5C,uBAEzC,KAUAsF,eAAepuB,EAA0BiuB,EAA0B5lB,GACvE,GAAIrI,EACA,OAAOiuB,EAGX,MACM2J,EADoB,IAAIC,OAAO,kBAAmB,KAChBC,KAAK7J,GAC7C,IAAI8J,EAAY9J,EAKhB,OAJIlyC,IAASC,YAAc47C,IACvBG,EAAS,UAAM57C,OAAO3B,SAASw9C,QAAtB,OAA+B/J,IAGtC,GAAN,OAAU5lB,GAAV,OAAuBA,EAAUtN,SAAS,KAAa,IAAN,IAAjD,cAAgEg9B,GA6H1C,qBACtB,MACItoD,MAAM,KAAEsF,GADN,UAEFvE,EAFE,QAGFD,GACA5B,KAAKR,MAEHq/C,QAAmEyK,YAAkBtpD,KAAKu5C,+BAC5FnzC,EACAvE,EACAD,GACA,GAEJ,GAAIi9C,EAAmB,CACnB,MAAMiB,GAAWvgC,kBAAgBC,YAAYq/B,GAC7C7+C,KAAK0V,SAAS,CACVilC,gBAAiBkE,EACjBM,YAAaW,SAGjB9/C,KAAK0V,SAAS,CAAEypC,aAAa,IAGjC,OAAO/mB,cAAY/V,UAOwB,sDAC3C,MAAMvD,EAAuC,UAAG9e,KAAKR,MAAMoC,eAAd,iBAAG,EAAoBkE,eAAvB,iBAAG,EAA6BiZ,WAAhC,iBAAG,EAAkCC,gBAArC,aAAG,EAA4CC,iCAC5F,GAAgD,SAA5CH,EACA,OAAO,EAGX,IAAK,IAAD,EACA,MAAMyqC,QAAwBvpD,KAAKR,MAAMsB,KAAK2I,aAG9C,MAF2C,UAAA8/C,EACtChoD,KAAKkI,GAAsC,oEAAtBA,EAAaE,aADI,eACyEC,aAAa,GAE7H,OAAO,EAEb,MAAO9H,GAGL,OAFA9B,KAAKR,MAAMqC,UAAU6e,QAAQ5e,GAC7B9B,KAAKR,MAAMqC,UAAU0c,MAAM,iCACpB,EAGX,GAAgD,QAA5CO,EACA,OAAO,EAEX,IACI,MAAMI,QAAqBlf,KAAKR,MAAMsB,KAAKqe,oBAC3C,QAASD,IACqC,QAA5CJ,GAAqDI,EAAaG,OACvB,QAA5CP,IAAsDI,EAAaG,OACtE,MAAOvd,GAGL,OAFA9B,KAAKR,MAAMqC,UAAU6e,QAAQ5e,GAC7B9B,KAAKR,MAAMqC,UAAU0c,MAAM,gCACpB,GAQP0hC,oBAAiB,UACrB,MACIn/C,MACIsF,MAAQpF,OAAQoF,GAChB2yC,WAAa/3C,OAAQ+3C,GACrBD,gBAAkB93C,OAAQ83C,GAC1B35B,qBAAuBne,OAAQme,IAEnCvd,SACIkE,SACIE,SAAS,uBACLC,GACA,CAAEA,4BAAwB7F,KAXpC,OAcFI,EAdE,UAeFqB,EAfE,UAgBFK,EAhBE,QAiBFimD,GACAnoD,KAAKR,MAEH8M,EAAgBtM,KAAKo+C,iBAAiB59C,EAAO8L,eAC7CquC,EAA+C36C,KAAKiJ,MAAM0xC,gBAChE,IAAIyN,EAA0B,GAK9B,OAJID,GAAW5lD,OAAO0P,KAAKk2C,GAAS/mD,OAAS,GAAK+mD,EAAQ1F,eAAiB0F,EAAQ1F,cAAcrhD,OAAS,IACtGgnD,EAAkBD,EAAQ1F,cAAc,GAAG1gD,IAGxC/B,KAAKR,MAAMsB,KAAKgS,UAAY9S,KAAKR,MAAMsB,KAAKgS,SAAS9R,QAAUoF,GAAQA,EAAKA,KAAKC,WAAaD,EAAKA,KAAKC,UAAUjF,OAAS,GAA3H,UAAgIpB,KAAKR,MAAMsB,KAAKyE,mCAAhJ,OAAgI,EAA6CvE,OAChLm8C,EAAmB,CACfJ,UAAW32C,EAAKA,KAAKC,UACrB8vC,sBAAuBiS,EACvBzN,kBACA7nC,SAAU9S,KAAKR,MAAMsB,KAAKgS,SAAS9R,OACnCm5C,qBAAsBn6C,KAAKR,MAAMsB,KAAKq5C,qBAAqBn5C,OAC3DuP,uBAAwBvQ,KAAKR,MAAMsB,KAAKnB,gBAAgBqB,OACxDwlB,SAAQ,UAAExmB,KAAKR,MAAMsB,KAAK0lB,gBAAlB,aAAE,EAA0BxlB,OACpCsL,gBACA6sC,oBAAqBn5C,KAAKR,MAAMoC,QAAQmd,IAAIve,OAAOqf,mBAAoB,EACvE85B,oBAAqB35C,KAAKR,MAAMoC,QAAQmd,IAAIve,OAAOwlB,2BACnD/Y,aAAcjN,KAAKR,MAAMoC,QAAQkE,QAAQmH,aACzCrL,QAAS5B,KAAKR,MAAMoC,QACpBI,SAAUhC,KAAKR,MAAMwC,SACrBD,GAAI/B,KAAKR,MAAMuC,GACfG,UAAW,CACP4L,WAAY5L,EAAUwK,yBACtBqB,YAAa7L,EAAUuK,0BACvBI,aAAc3K,EAAUuf,kCACxBzT,YAAa9L,EAAUyK,0BACvBsB,aAAc/L,EAAU0K,2BACxBJ,sBAAuBtK,EAAUqmD,oBACjCz7C,uBAAwB5K,EAAU4K,uBAClCmO,yBAA0B/Y,EAAU+Y,yBACpCE,yBAA0BjZ,EAAUiZ,yBACpCpO,mBAAoB7K,EAAU6K,mBAC9BmB,kBAAmBhM,EAAUgM,kBAC7BC,iBAAkBjM,EAAUiM,iBAC5BC,oBAAqBlM,EAAU8K,gBAC/Bid,qBAAqB,EAAD,GACb/nB,IAGXL,YACA+2C,wBAAyB12C,EAAU02C,wBACnCC,6BAA8B32C,EAAU22C,6BACxCV,iBAAkBj2C,EAAUsmD,qBAC5BrR,WAAYj1C,EAAUumD,uBACtB1M,aAAc75C,EAAUwmD,oBACxBrR,gBAAiBn1C,EAAUymD,uBAC3BzS,0BAA2Bl2C,KAAKR,MAAMsB,KAAKo1C,0BAA0Bl1C,OACrEw5C,eAAgBt4C,EAAUyiD,uBAC1BlK,kBAAmBv4C,EAAU0mD,8BAC7BlO,qBAAsBx4C,EAAU2mD,6BAChCniD,UAAW1G,KAAKR,MAAMsB,KAAKsF,KAAKpF,OAChC0K,iBAAkB1L,KAAKR,MAAMsB,KAAK4K,iBAAiB1K,OACnDo3C,uBAAwBp4C,KAAKq+C,0BAC7BhG,6BAA8Br4C,KAAKq4C,6BACnCwD,sCAAuC77C,KAAKw+C,uBAC5C9H,uBAAwB12C,KAAKg/C,0BAC7BjG,YACAC,oBAAqB92C,EAAU82C,oBAC/BjzC,uBAAwBE,EACxBs0C,cAAe/5C,EAAOsoD,qBACtBv8C,gCAAiC/L,EAAO+L,gCACxC9N,iBAAkBuB,KAAKvB,iBACvB86C,+BAAgCv5C,KAAKu5C,+BAErCf,kCAAmCx4C,KAAKoiD,2CAA2ClgD,GACnFu2C,mCAAoCz4C,KAAKk+B,0CAA0Ch8B,GACnFw2C,wCAAyC14C,KAAK8mD,iDAAiD5kD,GAC/Fy2C,uDAAwD34C,KAAK0nD,gEAAgExlD,GAE7Ho2C,6BAA8Bp2C,EAAUo2C,6BACxCC,gCAAiCr2C,EAAUq2C,gCAC3CwQ,0BAA2B7mD,EAAU6mD,0BACrCC,4BAA6B9mD,EAAU8mD,4BACvClQ,iBACA35B,sBACA5Z,4BAA2B,UAAEvF,KAAKR,MAAMsB,KAAKyE,mCAAlB,aAAE,EAA6CvE,OAC1Eo5C,sBAA8E,aAAvDp6C,KAAKR,MAAMoC,QAAQmd,IAAIve,OAAO8nD,qBACrDlP,oBAAqBp5C,KAAKR,MAAMsB,KAAKq5C,uBAEzC,OAt8BNyD,EAAI,aADTtyC,KACKsyC,GA08BSA,a,+EE9hCf,MAgBM4L,EAAkB,CAACC,EAA+Bx6C,IAEhDpR,gBAAC6kC,OAAIngC,iBAAKknD,GACLx6C,GAASA,EAAM3L,IAAIomD,IAK1BC,EAAc,CAACC,EAA2B36C,IAExCpR,gBAAC6kC,OAAIngC,iBAAKqnD,GACL36C,GAASA,EAAM3L,IAAIomD,IAK1BA,EAAkBz9C,IACpB,MAAM,iBAAE49C,EAAF,iBAAoBC,GAAqB79C,EAE/C,OACIpO,gBAAC6kC,OAAIngC,iBAAKsnD,GACLC,IAKEC,UA1CsDvqD,IACjE,MAAM,QAAEuR,EAAF,2BAAWi5C,EAAX,SAAuCl3C,EAAvC,kCAAiDm3C,EAAjD,mBAAoFC,EAApF,WAAwGC,GAAe3qD,EAC7H,OAAIsT,EAEIjV,gBAAColC,SAAM1gC,iBAAKynD,GACPj5C,EAEGo5C,EAAaX,EAAgBS,EAAmCn3C,GAAY62C,EAAYO,EAAoBp3C,KAK5HtT,EAAMoC,QAAQC,UAAUC,MAAM,4DACvB,Q,wwBCsBX,MAAMsoD,UAA0BvsD,gBAK5B0B,YAAYC,GACRC,MAAMD,GA6EH,KAAA6qD,oBAAuBliD,GAAyCnI,KAAKR,MAAMgB,OAAOuQ,QAASI,KAAOhJ,EAAMiJ,OAAO/S,MAOrG,KAAAkmC,qCAAuCxkC,UACpD,MAAM6B,EAAU5B,KAAKR,MAAMoC,QACrB0vC,EAAmC1vC,EAAQmd,IAAIve,OAAO+wC,wBACtDC,EAA8B5vC,EAAQmd,IAAIve,OAAOixC,uBACjD6Y,EAAgB/qC,kBAAgBmG,YAAY5S,GAClD,GAAIyM,kBAAgBC,YAAY8qC,IAC5B/qC,kBAAgBC,YAAY8xB,KAAsCA,EAAiCllB,SAASslB,iBAAeC,OAC3HpyB,kBAAgBC,YAAYgyB,KAAiCA,EAA4BplB,SAASslB,iBAAeC,MAAO,CACxH,MAAMhN,QAAwCC,iEAC1C,IAAIC,qDACAylB,EAAetqD,KAAKR,MAAMoC,SAC9B5B,KAAKR,MAAMoC,QAAQ6F,eAEnB8X,kBAAgBC,YAAYmlB,IAC5B3kC,KAAK0V,SAAS,CAAEivB,sCASX,KAAA4lB,iBAAmBxqD,UAChC,IAAI+S,EAAW9S,KAAKiJ,MAAM6J,SAC1B,MAAM03C,EAA4BC,EAAkB33C,WAC/CyM,kBAAgBC,YAAY1M,IAAayM,kBAAgBC,YAAYgrC,IAG/DjrC,kBAAgBC,YAAY1M,IAAayM,kBAAgBC,YAAYgrC,KAE/EjrC,kBAAgBmrC,OAAO53C,EAAU03C,MAJ9B13C,EAAW03C,EACXxqD,KAAK0V,SAAS,CAAE5C,cAQfyM,kBAAgBC,YAAYxf,KAAKiJ,MAAM07B,wCAClC3kC,KAAKukC,qCAAqCzxB,IAIvC,KAAA63C,YAAc,CAAC1+C,EAA8B1I,KAAoD,QAC9G,IAAK0I,IAAYA,EAAQtC,KAErB,OADA3J,KAAKR,MAAMqC,UAAU+oD,MAAM,wDACpB,KAEX,MAAMnsD,EAAmB4J,6BAAmBrI,KAAKR,MAAMoC,QAAQkE,QAAQwC,kBACnEtI,KAAKR,MAAM+I,aACXvI,KAAKR,MAAMqC,YACT,cAAEyK,EAAF,oBAAiB4/B,GAAwBlsC,KAAKR,MAAMgB,OACpD0B,EAAYlC,KAAKR,MAAM0C,UACvBiqC,EAAgBnsC,KAAKR,MAAMoC,QAAQmd,IAAIve,OAAO4rC,eAC9CC,EAAYH,IAA0C,SAAlBC,GAA8C,oBAAlBA,GAChES,EAAgB5sC,KAAKR,MAAM+sC,OAASvsC,KAAKR,MAAM+sC,MAAMC,WAAaxsC,KAAKR,MAAM+sC,MAAMC,UAAUprC,OAAS,EAAIpB,KAAKR,MAAM+sC,MAAMC,UAAU,GAAK,KAG1Iqe,EADqBhqC,OAAO5U,EAAQ6+C,cADtB,EAEiD5oD,EAAU6oD,qBAAuB7oD,EAAU8oD,+BAC1Gne,EAAoB,UAAG7sC,KAAKR,MAAMsB,KAAK2I,aAAazI,cAAhC,aAAG,EAAqCO,KAC9DkI,GAAsC,0DAAtBA,EAAaE,MAC3BshD,EAA2C,CAC7CC,oBAAqBhpD,EAAUgpD,qBAEnC,MAAO,CACHrB,iBAAkB,CACd9mD,IAAK,KACLjF,UAAW,8BACXkF,KAAM,WACNkP,IAAK3O,GAETumD,iBACIjsD,gBAACstD,mBAAgB,CACbvpD,QAAS5B,KAAKR,MAAMoC,QACpBnD,iBAAkBA,EAClB6N,cAAeA,EACf3J,cAAeT,EAAUD,UACzBiM,kBAAmBhM,EAAUgM,kBAC7BC,iBAAkBjM,EAAUiM,iBAC5Bi9C,gBAAiBlpD,EAAUkpD,gBAC3BL,qBAAsBF,EACtBxe,UAAWA,EACXtqC,GAAI/B,KAAKR,MAAMuC,GACfC,SAAUhC,KAAKR,MAAMwC,SACrBlB,KAAM,CAAEmL,WACRo/C,gBAAiBze,EACjBC,qBAAsBA,aAAF,EAAEA,EAAsBjjC,UAC5CqhD,eAAgBA,EAChBK,wBAAuB,UAAEtrD,KAAKiJ,MAAM07B,uCAAb,aAAE,EAA4CpjC,KACjEgqD,IAAqB,aAAIhsC,kBAAgBC,YAAY+rC,IAErDA,EAAsB,GAAGC,mBAAzB,UAA8Cv/C,EAAQyW,uBAAtD,QAAyEzW,EAAQI,gBASpF,KAAAy4B,gBAAkB/kC,UAC/B,MAAMykC,EAAexkC,KAAKiJ,MAAM6J,SAC1BA,QAAiBiyB,yCACnB,IAAIC,mCAAiCR,GACrCxkC,KAAKR,MAAMoC,QAAQ6F,qBAEjBzH,KAAKukC,qCAAqCzxB,GAEhD9S,KAAK0V,SAAS,CAAE5C,cA7LhB9S,KAAKgvC,cAAgB,GACrBhvC,KAAKiJ,MAAQ,CACT6J,SAAU9S,KAAKR,MAAMgB,OAAOiqD,kBAAkB33C,UAElD9S,KAAKvB,iBAAmB4J,6BAAmBrI,KAAKR,MAAMoC,QAAQkE,QAAQwC,kBAClEtI,KAAKR,MAAM+I,aACXvI,KAAKR,MAAMqC,WAGZ4pD,oBACCzrD,KAAKR,MAAMgB,OAAOqwC,+BAClB7wC,KAAKR,MAAMoC,QAAQ6F,cAAc8L,eAAe+S,KAAK+K,iBAErDrxB,KAAK8kC,kBAIN57B,SACH,MAAM,QAAE6H,EAAF,UAAWjT,GAAckC,KAAKR,MAAMgB,QACpC,UAAE0B,GAAclC,KAAKR,MAI3BQ,KAAKuqD,iBAAiBvqD,KAAKR,MAAMgB,OAAOiqD,mBAExC,MAAM33C,EAAW9S,KAAKiJ,MAAM6J,SACtBq3C,EAAqC,aAAxBnqD,KAAKR,MAAMgB,OAAOkrD,OAC/BC,EAAe56C,EAAUA,EAAQI,KAAO,GACxCy6C,EAAmB76C,GACrBlT,gBAACwV,IAAa,CACVvV,UAAU,iCACViF,IAAKgO,EAAQhO,KAAO,KACpBoO,KAAMw6C,EACNr4C,UAAW,CAAEpT,OAAQF,KAAKqqD,oBAAqB92C,eAAgBvT,KAAKR,MAAMoC,QAAQkE,WAKpF+lD,EAAkB/4C,aAAH,EAAGA,EAAUxP,IAC9B,CAACiM,EAA2BhM,KACxB,MAAMuoD,EAAiB9rD,KAAK2qD,YAAYp7C,EAAMhM,GAC9C,OAAQyW,mBAAiBC,kBAAkB6xC,QAAmC1rD,EAAjB0rD,IAI/DC,EAA0B,OACzB/rD,KAAKR,OADoB,IAE5BuR,QAAS66C,EACT3B,kCAAmC,CAC/BlnD,IAAKipD,sBACLluD,UAAW,GACXmuD,iBAAiB,GAAD,OAAKN,EAAL,YAAqBzpD,EAAU8zB,iBAC/Ck2B,iBAAiB,GAAD,OAAKP,EAAL,YAAqBzpD,EAAUg0B,aAC/Ci2B,SAAUnsD,KAAKR,MAAMuC,GACrBtD,iBAAkBuB,KAAKvB,kBAE3BurD,2BAA4B,CACxB1/C,YAAatK,KAAKR,MAClB1B,UAAW+S,IAAW,wBAAyB/S,IAEnDosD,mBAAoB,CAChBnnD,IAAK,KACLjF,UAAW,gCAEfqsD,aAEAr3C,SAAUyM,kBAAgBC,YAAYqsC,IAAoBA,EAAgBvlD,OACrEiJ,QACmBnP,IAATmP,GAGfy/B,cAAehvC,KAAKgvC,gBAExB,OAAOhvC,KAAKR,MAAMwL,WAAW+gD,IAwHtB3B,a,iIC6CA/+C,IA7QS,SAAmB+gD,GA0QvC,OAnQA,YACI,WAAY5sD,GAAZ,MACI6sD,YAAM7sD,IAAM,KACZ,OAea8sD,kBAAkB,iBACzB,EAA4BA,EAAK9sD,MAA/BuC,EAAE,KAAEC,EAAQ,WAAEJ,EAAO,UACvB2qD,EAASC,YAAgB5qD,EAAQ6F,eAClC8kD,EAKDA,EAAOxqD,IAKX0qD,YAAmB,2BAERF,KAAMG,MACR3qD,GAAK,CACFA,GAAE,EACFC,SAAQ,EACR2qD,gBAAgB,EAChBtjD,UAAU,EACVujD,YAAY,EACZC,eAAe,EACfC,mBAAmB,EACnBvsD,YAAQH,EACR2sD,SAAU,IACbL,IAEL9qD,EAAQ6F,eAxBR6kD,EAAK9sD,MAAMqC,UAAUC,MAAM,yDAiClBwqD,wBAAwB,SAACvqD,GACtC,IAAM9B,EAAcqsD,EAAKlqD,MAAML,GAC/B,OAAO,2BACA9B,GAAY,CACf0sD,eAAgBL,EAAKU,SAASjrD,EAAI,CAAE4qD,gBAAgB,IAAQ,GAC5DtjD,SAAUijD,EAAKU,SAASjrD,EAAI,CAAEsH,UAAU,IACxCF,QAASmjD,EAAKU,SAASjrD,EAAI,CAAExB,OAAQ,UAAW,GAAM,GACtD6I,WAAYkjD,EAAKU,SAASjrD,EAAI,CAAExB,OAAQ,aACxC0sD,UAAWX,EAAKU,SAASjrD,EAAI,CAAExB,OAAQ,YACvC2sD,UAAWZ,EAAKU,SAASjrD,EAAI,CAAExB,OAAQ,YAAa,GAAM,GAC1DkqC,WAAY6hB,EAAKU,SAASjrD,EAAI,CAAExB,OAAQ,aAAc,GACtD4sD,gBAAiBb,EAAKU,SAASjrD,EAAI,CAAE8qD,eAAe,IAAQ,GAAM,GAClEO,sBAAuBd,EAAKU,SAASjrD,EAAI,CAAE+qD,mBAAmB,IAC9D3iD,uBAAwBmiD,EAAKniD,yBAC7BkjD,eAAgBf,EAAKe,eAAetrD,GACpCurD,cAAe,SAACjvD,GACZiuD,EAAK10B,OAAO71B,EAAI,CAAE6qD,WAAYvuD,KAElCuH,iBAAkB,SAACvH,GACfiuD,EAAK10B,OAAO71B,EAAI,CAAE8qD,cAAexuD,KAErCkvD,qBAAsB,SAAClvD,GACnBiuD,EAAK10B,OAAO71B,EAAI,CAAE+qD,kBAAmBzuD,KAEzCmG,YAAa,SAACnG,GACViuD,EAAK10B,OAAO71B,EAAI,CAAEsH,SAAUhL,KAEhC0G,QAAS,WACLunD,EAAK10B,OAAO71B,EAAI,CAAExB,OAAQ,WAE9BkE,WAAY,WACR6nD,EAAK10B,OAAO71B,EAAI,CAAExB,OAAQ,cAE9BiF,UAAW,WACP8mD,EAAK10B,OAAO71B,EAAI,CAAExB,OAAQ,aAE9BitD,OAAQ,WACJlB,EAAK10B,OAAO71B,EAAI,CAAExB,OAAQ,aAE9BktD,UAAW,WACPnB,EAAK10B,OAAO71B,EAAI,CAAExB,OAAQ,cAE9BmtD,UAAW,SAACjuB,GAA0C,SAAKkuB,sBAAsBluB,IACjFmuB,oBAAqB,SAAC5rD,GAA0C,SAAK6rD,gCAAgC7rD,IACrGlC,KAAM,SAACguD,IACC7tD,aAAW,EAAXA,EAAa0sD,iBAIjBL,EAAK10B,OAAO71B,EAAEgsD,aACVpB,gBAAgB,GACbmB,QAWFxB,kCAAkC,SAACtqD,GAChD,IAAMgsD,EAAexB,YAAgBF,EAAK9sD,MAAMoC,QAAQ6F,eAClDxH,EAAcsC,OAAO0rD,OAAOD,GAAczsD,MAAK,SAAA2sD,GAAgB,OAAAA,aAAY,EAAZA,EAAclsD,YAAaA,KAChG,OAAOsqD,EAAKqB,sBAAuB1tD,GAAeA,EAAY8B,IAAO,KAOxDuqD,MAAM,WACnB,OAAOE,YAAgBF,EAAK9sD,MAAMoC,QAAQ6F,gBAS7B6kD,SAAS,SAACvqD,EAAY1D,GAEnC,IAAM8pD,EAAUmE,EAAKlqD,MAChB+lD,EAAQpmD,GAIbomD,EAAQpmD,GAAGgsD,2BACJ5F,EAAQpmD,IACR1D,GALHiuD,EAAK9sD,MAAMqC,UAAUC,MAAM,mDAAmDC,EAAE,mBASvEuqD,gBAAgB,SAACvqD,EAAYosD,GAC1C,IACMC,EADU9B,EAAKlqD,MACEL,GACvB,QAAKqsD,GAGEC,IAAQD,EAAQD,IAGV7B,qBAAqB,SAClCvqD,EACAosD,EACAG,EACAC,GAEA,IACMH,EADU9B,EAAKlqD,MACEL,GACvB,IAAKqsD,EAED,QAASE,EAGb,GAAIC,IAAwC,aAAlBH,EAAO7tD,QAA2C,YAAlB6tD,EAAO7tD,QAE7D,QAAS+tD,EAIb,IAAKF,EAAOrB,UAAuC,IAA3BqB,EAAOrB,SAAS3rD,OACpC,OAAOkrD,EAAKkC,cAAczsD,EAAIosD,GAGlC,IAAIpB,EAAWqB,EAAOrB,SAUtB,OAPIT,EAAK9sD,MAAMoC,QAAQmd,IAAIve,OAAO8uB,iDAE9By9B,EAAWA,EAASzmD,QAAO,SAAAmoD,GAAW,OAACnC,EAAKoC,2BAA2BD,OAKpE1B,EADQuB,EAAa,QAAU,SACd,SAAAG,GAAW,SAAKE,mBAAmBF,EAASN,EAAQG,EAAYC,OAQ3EjC,6BAA6B,SAAC7sB,GAC3C,IAAKA,EAASrT,SAnNO,qBAoNjB,OAAO,EAGX,IACMgiC,EADU9B,EAAKlqD,MACEq9B,GAEvB,SAAI2uB,IAAU7uC,kBAAgBC,YAAY4uC,EAAOrB,SAASzmD,QAAO,SAAAmoD,GAAW,OAAAA,EAAQriC,SAzN9D,4BAwOTkgC,WAAW,SAACvqD,EAAYosD,EAA+BG,EAAsBC,GAC1F,IACMH,EADU9B,EAAKlqD,MACEL,GACvB,QAAKqsD,IAKAA,EAAOrB,UAAuC,IAA3BqB,EAAOrB,SAAS3rD,OAKjCkrD,EAAKqC,mBAAmB5sD,EAAIosD,EAAQG,EAAYC,GAJ5CjC,EAAKkC,cAAczsD,EAAIosD,KAWrB7B,yBAAyB,WACtC,QAASA,EAAK9sD,MAAMovD,eAQPtC,iBAAiB,SAACvqD,GAG/B,QAFgBuqD,EAAKlqD,MACEL,IA3PvBuqD,EAAKuC,kBAAL,EA8PR,OAjQ0BC,iBAMfC,kCAAP,SAA6BhmD,GACzB,OAAI/I,KAAKR,QAAUuJ,GAMhBgmD,mBAAP,WACY,IAAAhtD,EAAO/B,KAAKR,MAAKuC,GACzB,OAAOlE,gBAACuuD,EAAgB2B,eAAK/tD,KAAKR,MAAK,CAAES,YAAaD,KAAK2tD,sBAAsB5rD,OAfnFgtD,EAAW,aADhBzjD,IACgB,2CAAXyjD,GAAN,CAA0BlxD,e,iHCZ9B,MAAMmxD,EAAmB,CAAC78C,EAA8C88C,EAAuBtO,EAA8B8B,EACzHV,EAAuCW,EAAmCC,EAA2BE,IAEjGF,EACQ9kD,gCACH8kD,GAGLxwC,EACOA,EAAU7O,IAAKiD,IAAY,MAC9B,OACI1I,uBAAKC,UAAU,sBAAsBoU,IAAG,oBAAK3L,EAASq1C,kBAAd,QAA4B,GAA5B,YAAkCxuC,IAASC,UAAUqD,aACxFnK,EAASqhB,SAEN66B,GAAiBl8C,EAASu1C,cAAgBj+C,gBAAC6kC,OAAIngC,iBAAKgE,EAASu1C,cAAc/D,gBACtExxC,EAASu1C,cAAc5E,kBAClB,KAGV3wC,EAASk2C,mBACL5+C,gBAAC6kC,OAAI,CAAC5kC,UAAU,gCACXyI,EAASy1C,OACTz1C,EAAS01C,cACT11C,EAASk2C,oBAGd5+C,gCACK0I,EAASy1C,OACTz1C,EAAS01C,kBAQ9B4G,EACJhlD,uBAAKC,UAAU,wBACXD,qBAAGC,UAAU,iBACRmxD,GAEJlN,GAELlkD,gCACC6kD,GA0HHwM,EAA6B,CAACC,EAAoBC,EAAsBC,EAC1EC,EAAuB/oD,EAA+BL,KAAkC,MAExF,IAAIwM,EAKJ,OAHAA,GAHqB,UAAwBnM,EAASu1C,qBAAjC,aAAwB,EAAwB7F,iBAGtCkZ,EAAaC,EAC5C18C,EAAanM,EAASzF,MAAQyF,EAASzF,KAAK8mB,SAAS3iB,eAAiBiB,EAAwBmpD,EAAoB38C,EAG9G7U,gCACIA,uBAAKC,UAAU,8CACXD,qBAAGC,UAAS,qDAAgD4U,EAAW6zB,cAA3D,WACZ1oC,qBAAGC,UAAS,qDAAgD4U,EAAW6zB,gBAClE7zB,GAtCa,EAACnM,EAA+B+oD,KAAyB,UACvF,MAAMrZ,EAAe,UAAwB1vC,EAASu1C,qBAAjC,aAAwB,EAAwB7F,gBACrE,OACIp4C,gCACIA,gBAAC6kC,OAAI,CAAC5kC,UAAU,oDACXm4C,EAAkBp4C,qBAAGC,UAAU,uDAAb,UACdyI,EAASu1C,qBADK,aACd,EAAwBt6C,eACxB8tD,EAFc,UAGd/oD,EAASu1C,qBAHK,aAGd,EAAwBxE,aACtB,QA+BNiY,CAA0BhpD,EAAU+oD,MAkEtCE,UAvB6BhwD,IAAD,QAzKhBiwD,EAkEAtM,EAuGgB,OACvCtlD,qCAAKC,UAAW0B,EAAM1B,UAAWiE,GAAIvC,EAAMuC,IAAQvC,EAAMkwD,uBAAuBlwD,IAC3EA,EAAMtB,QACN,UAACsB,EAAM4G,YAAP,OAAC,EAAYlF,iBAAkB1B,EAAMm+C,mBA1GnBwF,EA0GyD3jD,EAAMm+C,iBAxGlF9/C,gCACIA,gBAAC6kC,OAAIngC,iBAAK4gD,EAAWM,yBAChBN,EAAWO,iBACXP,EAAWS,oBACXT,EAAWW,mBAqGnBtkD,EAAMwgD,sBApCexgD,IACtBA,EAAMmS,gBAAkB4N,kBAAgBC,YAAYhgB,EAAMmS,gBAEtD9T,uBAAKC,UAAU,wBACT0B,EAAMmS,eAAerO,IAAIy5C,IAAY,MACnC,OAAQl/C,uBAAKqU,IAAK6qC,EAAU,GAAGnB,WAAY99C,UAAU,+BAChDoxD,EAA2B1vD,EAAM0C,UAAUitD,WAAY3vD,EAAM0C,UAAUktD,aACpE5vD,EAAM0C,UAAUytD,kBAAmBnwD,EAAM0C,UAAUotD,cAAevS,EAAU,GADrD,UAEvBv9C,EAAMoC,QAAQ6F,cAAc8L,eAAevN,eAFpB,aAEvB,EAAoDG,uBACvD6oD,EAAiBjS,EAAWv9C,EAAM0C,UAAU0tD,cAAepwD,EAAMmhD,iBAAkBnhD,EAAMijD,cACtFjjD,EAAMuiD,qBAAsBviD,EAAMkjD,iBAAkBljD,EAAMmjD,kBAAmBnjD,EAAMqjD,oBAMnGrjD,EAAMqjD,eACVhlD,uBAAKC,UAAU,uBACXD,uBAAKC,UAAU,wBACXD,qBAAGC,UAAU,iBACR0B,EAAM0C,UAAU0tD,eAEpBpwD,EAAMuiD,uBAGflkD,gCACC2B,EAAMkjD,kBAUwBmN,CAAqBrwD,GAAS3B,gBAAC6kC,OAAIngC,iBAAK/C,EAAMmhD,kBACxEqO,EAAiBxvD,EAAMu9C,UAAWv9C,EAAM0C,UAAU0tD,cAAepwD,EAAMmhD,iBAAkBnhD,EAAMijD,cAC5FjjD,EAAMuiD,qBAAsBviD,EAAMkjD,iBAAkBljD,EAAMmjD,kBAAmBnjD,EAAMqjD,iBAE1FrjD,EAAM0hD,qBACHrjD,gBAAC6kC,OAAIngC,iBAAK/C,EAAMohD,qBACXphD,EAAM0hD,oBACN,UAAA1hD,EAAM4G,YAAN,SAAYlF,eAjKM,EAAC4uD,EAAuDjP,EAA+BrhD,IAEjHswD,EAKDjyD,gBAAC6kC,OAAIngC,iBAAKs+C,GACLiP,EAAoBC,SACpBD,EAAoBva,SACpBua,EAAoBpa,QACpBoa,EAAoB9a,aARzBx1C,EAAMoC,QAAQC,UAAUC,MAAM,uDACvB,MA6J+BkuD,CAA2BxwD,EAAM+hD,wBAAyB/hD,EAAMqhD,kBAAmBrhD,GA1IhG,EAACywD,EAAmDpP,EAA+BrhD,IAE3GywD,EAKDpyD,gBAAC6kC,OAAIngC,iBAAKs+C,GACLrhD,EAAMshD,UACNmP,EAAkBrb,SAClBqb,EAAkB9a,SAClB8a,EAAkBxnC,YAClBwnC,EAAkBnb,IAClBmb,EAAkBpa,eAAiBoa,EAAkBpa,eAAiB,KACtEoa,EAAkBjb,aAXvBx1C,EAAMoC,QAAQC,UAAUC,MAAM,qDACvB,MAsI2HouD,CAAyB1wD,EAAM6hD,sBAAuB7hD,EAAMqhD,kBAAmBrhD,IApL9LiwD,EAqLQjwD,EAAMujD,qBApLlBxjC,kBAAgBC,YAAYiwC,EAAU3sB,QAIrDjlC,gBAAC6kC,OAAIngC,iBAAKktD,EAAU3K,SACf2K,EAAUxK,OACVwK,EAAU3sB,QALR,KAoLEtjC,EAAMiiD,2BACNjiD,EAAMmiD,sBACNniD,EAAMqiD,sBACNriD,EAAMuiD,qBACNviD,EAAMyiD,8BAEdziD,EAAMijD,iB,2cCpMf,MAAM0N,EAAkBC,GAAyCrwD,UAC7DoI,EAAMsN,uBACA26C,KAQJC,EAAyBC,GAA6DnoD,IACxF,MAAM9J,GAAS8J,EAAMiJ,OAAO/S,OAAS,IAAIoS,QAAQ,IAAIy4C,OAAO,OAAQ,MAAO,IAC3EoH,EAAsBjyD,IAQpBkyD,EAAsBC,GAAuDroD,IAC/E,MAAM9J,GAAS8J,EAAMiJ,OAAO/S,OAAS,IAAIoS,QAAQ,IAAIy4C,OAAO,OAAQ,MAAO,IAC3EsH,EAAmBnyD,IASjBoyD,EAAsBC,GAAuDvoD,IAC/E,MAAM9J,GAAS8J,EAAMiJ,OAAO/S,OAAS,IAAIoS,QAAQ,IAAIy4C,OAAO,OAAQ,MAAO,IAC3EwH,EAAmBryD,IAGVsyD,EAAW7C,IACpB,MAAM,aACF3qD,EADE,SAEFytD,EAFE,YAGFC,EAHE,YAIFC,EAJE,eAKFC,EALE,YAMFzgC,EANE,YAOF0gC,EAPE,sBAQFV,EARE,mBASFE,EATE,mBAUFE,EAVE,gBAWFN,EAXE,wBAYFa,EAZE,iBAaFC,EAbE,mBAcFC,EACAjvD,WAAW,oBAAEkvD,EAAF,kBAAuBC,EAAvB,oBAA0CC,EAA1C,iBAA+DC,EAA/D,iBAAiFC,EAAjF,mBACPC,EADO,2BACaC,EADb,2BACyCC,IACpD7D,EAEE8D,EAAY,CACd9zD,UAAW+S,IAAW,8BAA+B,CAAE,eAAgB1N,IACvE7C,SAAU6vD,EAAeC,GACzBrtD,IAAK,QAGH6L,EACF/Q,yBAAOkE,GAAG,+BAA+BjE,UAAU,sCAC9CuzD,GAIHQ,EACFh0D,yBAAOkE,GAAG,yCAAyCjE,UAAU,0CACxDyzD,GAIHO,EACFj0D,yBAAOkE,GAAG,yCAAyCjE,UAAU,0CACxD0zD,GAIHO,EACFl0D,yBAAOkE,GAAG,qCAAqCjE,UAAU,4CACpD2zD,GAIHO,EACFn0D,gBAACyZ,QAAK,CACFvU,IAAI,OACJhB,GAAG,+BACHjE,UAAU,qCACVkF,KAAK,QACL+hD,WAAW,EACXkN,MAAM,EACNC,mBAAmB,EACnBh+C,SAAU/Q,GAETA,GAoBHgvD,EACFt0D,yBACIiZ,IAAK85C,EACL1xD,KAAK,OACLpB,UAAU,iDAAgD,aAC9CwzD,EACZ5yD,SAAU2xD,EAAsBC,GAChCjyD,MAAO0yD,EAAc,kBACL,8DAIlBqB,EACFv0D,yBACIiZ,IAAK+5C,EACL3xD,KAAK,OACLpB,UAAU,oDAAmD,aACjDyzD,EACZc,YAAaX,EACbhzD,SAAU6xD,EAAmBC,GAC7BnyD,MAAOiyB,EAAW,kBACF,8DAIlBgiC,EACFz0D,yBACIiZ,IAAKg6C,EACL5xD,KAAK,OACLpB,UAAU,oDAAmD,uBAC9C0zD,EAD8C,YAC1BG,GACnCU,YAAaV,EACbjzD,SAAU+xD,EAAmBC,GAC7BryD,MAAO2yD,EAAW,mBACD,8DAInBuB,EACF10D,gBAACiG,SAAM,CACHhG,UAAU,mCACVmG,QAASksD,EAAeC,GAAgB,aAC5BgB,EACZptD,SAAUmtD,IAAuBJ,GAEhCK,GAIT,IAAIoB,GAAuB,EACvBC,GAAuB,EAE3B,OAAQvB,GACJ,IAAI,MACAsB,GAAuB,EACvB,MACJ,IAAI,iBACAC,GAAuB,EACvB,MACJ,IAAI,uBACAD,GAAuB,EACvBC,GAAuB,EAK/B,MAAO,CACHb,YACAhjD,QACAijD,gBACAC,gBACAE,QACAU,WAxFe,CACf50D,UAAW,uCAwFX60D,cArFkB,CAClB70D,UAAW,2CAqFX80D,cAlFkB,CAClB90D,UAAW,2CAkFX+0D,cA/EkB,CAClB/0D,UAAW,2CA+EXq0D,cACAC,WACAE,WACAC,cACAtB,0BACAuB,uBACAC,uBACAV,oBCrOFe,EAAkB,CAACC,EAAoDxd,IAA8B,KAAW,MAClHwd,EAAgB,UAACxd,EAAS3uC,UAAV,QAAgB,KAgBvBosD,EAAU,IAMI,IANH,SACpBzd,EADoB,kBAEpB0d,EAFoB,UAGpBC,EAHoB,iBAIpBH,EACA7wD,WAAW,qBAAEixD,EAAF,8BAAwBC,EAAxB,qBAAuDC,IAC3C,EACvB,MAAMC,EAAUL,EAAkB1d,EAASnlB,QAASmlB,EAASge,kBACvDC,GAAsBje,EAAS3uC,IAAM,IAAI0tB,QAAQ,GAMjDm/B,EACF51D,wBAAMC,UAAU,oCACXq1D,EACA,IACAK,EACA,KACAJ,EACA,IACDv1D,wBAAMC,UAAU,kCACXw1D,GAEJ,KAIHzmC,EAAeqmC,GACjBr1D,gBAACiG,SAAM,CAAChG,UAAU,oCAAoCmG,QAAS6uD,EAAgBC,EAAkBxd,IAC5F8d,GAIT,MAAO,CACHK,UA1Bc,CACd51D,UAAW,+BA0BXiE,GAAIwzC,EAAS3uC,GACb6sD,mBACA5mC,iBC/DK8mC,EAAU,IAA+G,IAA9G,UAAEC,EAAF,UAAaV,EAAb,UAAwBhxD,EAAxB,kBAAmC+wD,EAAnC,iBAAsDF,GAAwD,EAClI,IAAKa,GAAkC,IAArBA,EAAUxyD,OACxB,OAgBJ,MAAO,CACHyyD,UAdc,CACd/1D,UAAW,+BAcX2M,KAXSmpD,EAAUtwD,IAAIiyC,GAAYyd,EAAQ,CAC3CE,YACAD,oBACA1d,WACAwd,mBACA7wD,iBC1BO4xD,ICuBVC,EDvBUD,EAJsC,QAAC,MAAE51D,GAAH,SAAgBL,yBAAOC,UAAU,gCACjFI,I,0kBC0BL,SAAK61D,GACDA,sBACAA,sBACAA,cAHJ,CAAKA,MAAqB,KA2C1B,IAAaC,EAAb,cAAsCn2D,YAAtC0B,+CACW,KAAA0J,MAAgC,CACnCgrD,oBAAoB,EACpB9wD,aAAc,GACd4tD,eAAgB,GAChBzgC,YAAa,GACb0gC,YAAa,IAGA,KAAAJ,SAA8C/yD,cAE9C,KAAAgzD,YAAiDhzD,cAEjD,KAAAizD,YAAiDjzD,cA4JjD,KAAAiC,KAAO,KAAW,MAC/BE,KAAKR,MAAMS,YAAYH,KAAvB,GACII,OAAQF,KAAKE,OACbG,SAAUL,KAAKK,SACfC,SAAUN,KAAKM,SACfssD,YAAY,IACP5sD,KAAKk0D,aAAe,CAAE3zD,OAAQ,cAGvC,MAAMqzD,EAAS,UAAG5zD,KAAKR,MAAMsB,KAAKC,SAASC,cAA5B,aAAG,EAAiCguB,gBAC/C4kC,GAAaA,EAAUxyD,OAAS,EAChCpB,KAAKR,MAAMS,YAAY8E,UAChB/E,KAAKgI,kCACZhI,KAAKR,MAAMS,YAAYutD,UAKd,KAAA2G,oBAAsB,KACnC,MAAM/tD,EAAOpG,KAAKR,MAAMsB,KAAKC,SAASC,OAAShB,KAAKR,MAAMsB,KAAKC,SAASC,OAAOC,aAAamF,UAAOhG,EACnG,QAAKgG,IAKGA,EAAKmV,aAAe,GAAK,GAGpB,KAAA24C,UAAY,OACpBl0D,KAAKR,MAAMoC,QAAQkE,QAAQwgB,KAAK+K,iBACjCrxB,KAAKR,MAAMoC,QAAQmd,IAAIve,OAAO4zD,oBAAsBL,EAAsBM,WACzEr0D,KAAKR,MAAMgB,OAAO8zD,0BAGhBt0D,KAAKm0D,sBAGC,KAAAj0D,OAAS,KAEtBF,KAAKR,MAAMS,YAAYwE,cAGV,KAAApE,SAAW,KACxBL,KAAKu0D,wBAGQ,KAAAj0D,SAAW,KACxBN,KAAKu0D,wBAGQ,KAAAA,qBAAuB,KAChCv0D,KAAKw0D,gBAELx0D,KAAKR,MAAMS,YAAY8E,UAGvB/E,KAAKR,MAAMS,YAAYutD,UAId,KAAAyF,kBAAoB,WAA4D,IAA3D9wD,EAA2D,uDAA3C,EAAGsyD,EAAwC,uDAAjB,MAC5E,OAAO,EAAKj1D,MAAMoC,QAAQ8yD,iBAAiBC,eAAexyD,EAAOsyD,IAGpD,KAAAG,oBAAuB7D,IACpC/wD,KAAK0V,SAAS,CACVq7C,mBAEJ/wD,KAAK0E,cAGQ,KAAAmwD,iBAAoBvkC,IACjCtwB,KAAK0V,SAAS,CACV4a,gBAEJtwB,KAAK0E,cAGQ,KAAAowD,iBAAoB9D,IACjChxD,KAAK0V,SAAS,CACVs7C,gBAEJhxD,KAAK0E,cAGQ,KAAAH,SAAYpB,IACzBnD,KAAKR,MAAMqC,UAAUC,MAAM,QAASqB,GACpCnD,KAAKR,MAAMqC,UAAU0c,MAAM,QAASpb,GACpCnD,KAAKR,MAAMS,YAAYuE,aAAY,GACnCxE,KAAK0V,SAAS,CACVvS,kBAIS,KAAAuB,WAAa,KAC1B1E,KAAKR,MAAMS,YAAYuE,aAAY,GACnCxE,KAAK0V,SAAS,CACVvS,aAAc,MAIL,KAAA4xD,eAAiBh1D,UAC9B,MAAMqF,EAAgBpF,KAAKR,MAAMsB,KAAKC,SAASC,OAC1CoE,SAICA,EAAc2vD,eAAe,CAAEhE,oBAGxB,KAAAiE,cAAgBj1D,UAC7B,GAAIC,KAAKiJ,MAAMgrD,mBACX,OAEJj0D,KAAK0V,SAAS,CACVu+C,oBAAoB,IAGxB,MAAM7uD,EAAgBpF,KAAKR,MAAMsB,KAAKC,SAASC,OACzC+vD,EAAiB/wD,KAAKiJ,MAAM8nD,eAAe5rD,OAC3CmrB,EAActwB,KAAKiJ,MAAMqnB,YAAYnrB,OACrC6rD,EAAchxD,KAAKiJ,MAAM+nD,YAAY7rD,OAErC8vD,QAAsBj1D,KAAKk1D,iBAAiBnE,GAC5CoE,EAAeF,GAAiBA,EAAc,GAC9CG,EAAgBD,GAAgBA,EAAaE,cAC7CC,EAAgBH,GAAgBA,EAAaI,yBAC7CllC,EAAe8kC,GAAgBA,EAAaK,gBAC5CjgB,QAAiBv1C,KAAKy1D,YAAY1E,EAAgBzgC,EAAa0gC,EAAaoE,EAAeE,EAAejlC,GAEhH,GAAIjrB,GAAiBmwC,EASjB,aARMnwC,EAAcswD,YAAY,CAAEngB,WAAUt1B,qBAAsB,CAAEsQ,IAAKD,EAAaG,eAAgBugC,EAAariC,aAAc0B,KACjIrwB,KAAK0E,aACL1E,KAAK0V,SAAS,CACVq7C,eAAgB,GAChBzgC,YAAa,GACb0gC,YAAa,GACbiD,oBAAoB,IAEjB7xC,QAAQC,UAEnB,MAAM7W,EACExL,KAAK4wD,UAAY5wD,KAAK4wD,SAAS3vC,SAAWjhB,KAAK4wD,SAAS3vC,QAAQytB,OAAU1uC,KAAK4wD,SAAS3vC,QAChGzV,GAASA,EAAMkjC,QACf1uC,KAAK0V,SAAS,CACVu+C,oBAAoB,KAKX,KAAA0B,wBAA0B,CAACrnC,EAA2BC,EAA8BqnC,KACjG,IAAIC,EAEJ,OAAQD,GACJ,KAAK7B,EAAsB+B,SACvBD,EAAqBvnC,EAAYhoB,OAAOmoB,GAAeA,EAAWC,cAAgBH,GAA0C,KAA3BE,EAAWsnC,aAC5G,MACJ,KAAKhC,EAAsBM,SACvBwB,EAAqBvnC,EAAYhoB,OAAOmoB,GAAeA,EAAWC,cAAgBH,GAA0C,KAA3BE,EAAWsnC,aAC5G,MACJ,QACI,MAAM,IAAIvrC,MAAM,0BAGxB,GAAIqrC,EACA,OAAOA,EAAmBvyD,IAAImrB,GAAcA,EAAWE,cAAgB,KAK9D,KAAA8mC,YAAc11D,MAAOgxD,EAAwBzgC,EAAqB0gC,EAAqBoE,EAAoCE,EAAoCjlC,KAC5K,MACInuB,WAAW,eAAE8zD,EAAF,qBAAkBC,EAAlB,qBAAwCC,EAAxC,eAA8DC,EAA9D,eAA8EC,IACzFp2D,KAAKR,MAEH62D,EAAwBr2D,KAAKR,MAAMoC,QAAQmd,IAAIve,OAAO4zD,kBAE5D,IAAK/jC,EACD,OAGJ,MAAM/B,QAAoB2B,8BAAoB,CAAEzoB,cAAexH,KAAKR,MAAMoC,QAAQ6F,cAAeC,oBAAqB,KAAM7B,MAAM/D,IAC9H,MAAMA,IAGV,IAAKwsB,EACD,MAAM,IAAI9D,MAAM,qCAEpB,MAAM8rC,EAA8Bt2D,KAAK21D,wBAAwBrnC,EAAaZ,aAAWE,mBAAoBmmC,EAAsB+B,UAC7HS,EAA8Bv2D,KAAK21D,wBAAwBrnC,EAAaZ,aAAWE,mBAAoBmmC,EAAsBM,UAEnI,OAAQgC,GACJ,UAAKj2D,EACL,KAAK2zD,EAAsB+B,SACvB,GAAKQ,YAA6BlqC,SAASiE,GAEvC,YADArwB,KAAKuE,SAAS2xD,GAGlB,MACJ,KAAKnC,EAAsBM,SACvB,GAAKkC,YAA6BnqC,SAASiE,GAEvC,YADArwB,KAAKuE,SAAS2xD,GAGlB,MACJ,KAAKnC,EAAsByC,KACvB,KAAKF,WAA6BlqC,SAASiE,IAAkBkmC,WAA6BnqC,SAASiE,IAE/F,YADArwB,KAAKuE,SAAS2xD,GAGlB,MACJ,QACI,MAAM,IAAI1rC,MAAM,8BAGxB,GAAI4qC,GAAiC,KAAhB9kC,EAEjB,YADAtwB,KAAKuE,SAAS4xD,GAIlB,GAAIb,GAAiC,KAAhBtE,EAEjB,YADAhxD,KAAKuE,SAAS6xD,GAIlB,MAAMK,EAAQ51C,OAAOC,SAASkwC,EAAYtgC,MAAM,KAAK,GAAI,IACnDgmC,EAAO71C,OAAOC,SAASkwC,EAAYtgC,MAAM,KAAK,GAAI,IAExD,OAAOimC,2BAAiB,CAAEnvD,cAAexH,KAAKR,MAAMoC,QAAQ6F,eAAiBspD,EAAgB1gC,EAAcC,EAAammC,EAAOC,GAC1HjxD,KAAKmxD,IACF,GAAKA,EAAexmC,SAAsC,IAA3BwmC,EAAexmC,QAI9C,OAAOwmC,EAHH52D,KAAKuE,SAASyxD,KAKrBnwD,MAAM/D,IACH9B,KAAKuE,SAAS0xD,MAKT,KAAAf,iBAAmBn1D,UAChC,MACImC,WAAW,gBAAE20D,EAAF,oBAAmBC,EAAnB,iBAAwCC,GACnDj2D,MAAM,SAAEC,IACRf,KAAKR,MAET,IAAKuxD,EAED,YADA/wD,KAAKuE,SAASsyD,GAKlB,IADqB91D,EAASC,SAAUD,EAASC,OAAOguB,gBAAgBlH,KAAMkvC,GAAmBA,EAAKpwD,KAAOmqD,GAM7G,OAAO9iC,gCAAsB,CAAEzmB,cAAexH,KAAKR,MAAMoC,QAAQ6F,eAAiBspD,EAAgB7iC,IAAS+oC,UACtGxxD,KAAKwvD,IACF,GAAKA,GAA0C,IAAzBA,EAAc7zD,aAAqChB,IAArB60D,EAAc,GAIlE,OAAOA,EAHHj1D,KAAKuE,SAASwyD,KAKrBlxD,MAAM/D,IACH9B,KAAKuE,SAASwyD,KAblB/2D,KAAKuE,SAASuyD,IAzZG,kBACrB,MAAgF,aAAxE92D,KAAKR,MAAMsB,KAAKC,SAASC,QAAUhB,KAAKR,MAAMsB,KAAKC,SAASR,QAG1C,uBAC1B,MAAM6E,EAAgBpF,KAAKR,MAAMsB,KAAKC,SAASC,OAC/C,OAAKoE,GAAkBA,EAAcgqB,cAG9BhqB,EAAcgqB,cAFV,EAKqB,6BAChC,MAAMhqB,EAAgBpF,KAAKR,MAAMsB,KAAKC,SAASC,OAC/C,OAAKoE,GAAkBA,EAAc4pB,gBAG9B5pB,EAAc4pB,gBAAgBlf,OAAO,CAACzM,EAAekyC,IAEjDlyC,GADiBkyC,EAASnlB,SAAW,GAE7C,GALQ,EAQiB,yBAC5B,MAAMhqB,EAAOpG,KAAKR,MAAMsB,KAAKC,SAASC,OAAShB,KAAKR,MAAMsB,KAAKC,SAASC,OAAOC,aAAamF,UAAOhG,EACnG,OAAKgG,IAGGA,EAAKmV,aAAe,GAAKvb,KAAKk3D,iBAAmBl3D,KAAKm3D,wBAA0B,EAG7D,wBAC3B,MAAM/wD,EAAOpG,KAAKR,MAAMsB,KAAKC,SAASC,OAAShB,KAAKR,MAAMsB,KAAKC,SAASC,OAAOC,aAAamF,UAAOhG,EACnG,IAAKgG,EACD,OAAO,EAKX,OADmBA,EAAKmV,aAAe,GAAKvb,KAAKk3D,iBAC9B,EAGM,sBACzB,MACIp2D,MAAM,SAAEC,IACRf,KAAKR,MACHo0D,EAAY7yD,EAASC,QAAUD,EAASC,OAAOguB,gBACrD,QAAS4kC,GAAaA,EAAUxyD,OAAS,EAGC,uCAC1C,MAAM,gBAAEoH,EAAF,MAAmBC,GAAUzI,KAAKR,MAAMoC,QAAQkE,QACtD,SAAW0C,IAAmBC,GAAsB,MAAbA,EAAMC,IAG1C+iD,oBACH9iD,YACI,IAAM3I,KAAK4I,YACX,KACI5I,KAAKF,SAKVgJ,sBAAsBC,EACzBC,GACA,OAAIhJ,KAAKiJ,QAAUD,GAAahJ,KAAKR,MAAMsB,OAASiI,EAAUjI,KAM3DoI,SACH,MACIjJ,aAAa,QAAEkJ,GACfrI,MAAM,SAAEC,GACRP,QAAQ,UAAE1C,EAAF,qBAAas5D,GAHnB,UAIFl1D,GACAlC,KAAKR,OACH,aAAE2D,EAAF,eAAgB4tD,EAAhB,YAAgCzgC,EAAhC,YAA6C0gC,GAAgBhxD,KAAKiJ,MAClE2qD,EAAY7yD,EAASC,QAAUD,EAASC,OAAOguB,gBAC/CkiC,EAAmBkG,EACnBf,EAAwBr2D,KAAKR,MAAMoC,QAAQmd,IAAIve,OAAO4zD,kBAE5D,IAAKp0D,KAAKk0D,cAAiBl0D,KAAKq3D,oBAAsBluD,EAElD,OADAnJ,KAAKR,MAAMoC,QAAQC,UAAUC,MAAM,0DAC5B,KAGX,MAAMmvD,EAA0BoF,IAA0BtC,EAAsB+B,SAE1EwB,EAAkB/sD,IAAU,wBAAyBzM,EAAWqL,EAAU,OAAS,OAEnFW,EAAS,SACR9J,KAAKR,OACLQ,KAAKiJ,OAFG,IAGXnL,UAAWw5D,EAEXC,sBAAuB,CAAEjtD,YAAatK,KAAKR,MAAO1B,UAAWw5D,GAC7DnD,oBAAqBn0D,KAAKm0D,sBAC1BD,UAAWl0D,KAAKk0D,YAChBh0D,OAAQF,KAAKE,OACbG,SAAUL,KAAKK,SACfC,SAAUN,KAAKM,SACfs0D,oBAAqB50D,KAAK40D,oBAC1BC,iBAAkB70D,KAAK60D,iBACvBC,iBAAkB90D,KAAK80D,iBACvBC,eAAgB/0D,KAAK+0D,eACrBC,cAAeh1D,KAAKg1D,cACpBwC,aAAcruD,EACV,CACIjL,MAAOL,gBAAC45D,EAAa,CAACv5D,MAAOgE,EAAUmvD,oBACvC5mD,KAAMkpD,EAAQ,CACVT,WAAW,EACXD,kBAAmBjzD,KAAKizD,kBACxBW,UAAWA,GAAa,IAAIA,GAC5Bb,iBAAkB/yD,KAAK+0D,eACvB7yD,oBAGR9B,EACJs1D,YAAcvsD,OA2BV/I,EA1BA,CACIklB,KAAMqrC,EAAQ,CACVxtD,eACA4tD,iBACAzgC,cACA0gC,cACAJ,SAAU5wD,KAAK4wD,SACfC,YAAa7wD,KAAK6wD,YAClBC,YAAa9wD,KAAK8wD,YAClB5uD,YACAouD,sBAAuBtwD,KAAK40D,oBAC5BpE,mBAAoBxwD,KAAK60D,iBACzBnE,mBAAoB1wD,KAAK80D,iBACzB1E,gBAAiBpwD,KAAKg1D,cACtB/D,0BACAC,mBACAC,mBAAoBnxD,KAAKmxD,qBAE7B1mD,KAAMkpD,EAAQ,CACVT,WAAW,EACXD,kBAAmBjzD,KAAKizD,kBACxBW,UAAWA,GAAa,IAAIA,GAC5Bb,iBAAkB/yD,KAAK+0D,eACvB7yD,iBAMhB,OAAOlC,KAAKR,MAAMwL,WAAWlB,KAvJvBmB,aAATE,KAAS,gCAIAF,aAATE,KAAS,qCAQAF,aAATE,KAAS,2CAWAF,aAATE,KAAS,uCAQAF,aAATE,KAAS,sCAWAF,aAATE,KAAS,oCAQAF,aAATE,KAAS,qDAjED6oD,EAAgB,aAD5B1oD,KACY0oD,GA2bE3oD,oCAAgB2oD,I,kCC5gB/B,8DAYA,0BA+BwB,KAAA0D,WAAyB,GAMzB,KAAAC,iBAAsC,GAYtC,KAAAC,eAAyB,EAMzB,KAAAC,oBAA8B,GAM9B,KAAAC,8BAAwC,EAMxC,KAAAC,uBAAiC,EA2EzD,OA3Icx1D,sBAAWy1D,YAAA,uBAAoB,KAA/B,WACN,OAAOh4D,KAAKi4D,uBADyB,gCAM/B11D,sBAAWy1D,YAAA,aAAU,KAArB,WACN,OAAOh4D,KAAKk4D,aADe,gCAMrB31D,sBAAWy1D,YAAA,iBAAc,KAAzB,WACN,OAAOh4D,KAAKm4D,iBADmB,gCAMzB51D,sBAAWy1D,YAAA,kBAAe,KAA1B,WACN,OAAOh4D,KAAKo4D,kBADoB,gCAM1B71D,sBAAWy1D,YAAA,aAAU,KAArB,WACN,OAAOh4D,KAAKq4D,aADe,gCAMrB91D,sBAAWy1D,YAAA,YAAS,KAApB,WACN,OAAOh4D,KAAK03D,YADc,gCAMpBn1D,sBAAWy1D,YAAA,kBAAe,KAA1B,WACN,OAAOh4D,KAAK23D,kBADoB,gCAM1Bp1D,sBAAWy1D,YAAA,oBAAiB,KAA5B,WACN,OAAOh4D,KAAKs4D,oBADsB,gCAM5B/1D,sBAAWy1D,YAAA,gBAAa,KAAxB,WACN,OAAOh4D,KAAK43D,gBADkB,gCAMxBr1D,sBAAWy1D,YAAA,qBAAkB,KAA7B,WACN,OAAOh4D,KAAK63D,qBADuB,gCAM7Bt1D,sBAAWy1D,YAAA,8BAA2B,KAAtC,WACN,OAAOh4D,KAAK83D,8BADgC,gCAMtCv1D,sBAAWy1D,YAAA,wBAAqB,KAAhC,WACN,OAAOh4D,KAAK+3D,wBAD0B,gCAKnCC,uCAAP,SAAkCO,GAC9Bv4D,KAAKi4D,sBAAwBM,GAI1BP,6BAAP,SAAwBQ,GACpBx4D,KAAKk4D,YAAcM,GAIhBR,kCAAP,SAA6BS,GACzBz4D,KAAKo4D,iBAAmBK,GAIrBT,iCAAP,SAA4BU,GACxB14D,KAAKm4D,gBAAkBO,GAIpBV,6BAAP,SAAwBW,GACpB34D,KAAKq4D,YAAcM,GAIhBX,2BAAP,SAAsBjH,GAClB/wD,KAAK03D,WAAa13D,KAAK03D,WAAWpxD,QAAO,SAAAivC,GAAY,OAAAA,EAAS3uC,KAAOmqD,MAIlEiH,iCAAP,SAA4BjH,GACxB/wD,KAAK23D,iBAAmB33D,KAAK23D,iBAAiBrxD,QAAO,SAAAivC,GAAY,OAAAA,EAAS3uC,KAAOmqD,MAI9EiH,wBAAP,SAAmBziB,GACfv1C,KAAK03D,WAAUkB,aAAIrjB,GAAav1C,KAAK03D,aAIlCM,8BAAP,SAAyBziB,GACrBv1C,KAAK23D,iBAAgBiB,aAAIrjB,GAAav1C,KAAK03D,aAIxCM,oCAAP,SAA+Ba,GAC3B74D,KAAKs4D,mBAAqBO,GAIvBb,gCAAP,SAA2Bc,GACvB94D,KAAK43D,eAAiBkB,GAInBd,qCAAP,SAAgCe,GAC5B/4D,KAAK63D,oBAAsBkB,GAIxBf,+CAAP,SAA0CgB,GACtCh5D,KAAK83D,6BAA+BkB,GAIjChB,wCAAP,SAAmCc,GAC/B94D,KAAK+3D,uBAAyBe,GA3ItB7tD,aAAXC,IAAW,+EAEFD,aAATE,IAAS,gHAIEF,aAAXC,IAAW,qEAEFD,aAATE,IAAS,sGAIEF,aAAXC,IAAW,yEAEFD,aAATE,IAAS,0GAIEF,aAAXC,IAAW,0EAEFD,aAATE,IAAS,2GAIEF,aAAXC,IAAW,qEAEFD,aAATE,IAAS,sGAIEF,aAAXC,IAAW,mEAEFD,aAATE,IAAS,oGAIEF,aAAXC,IAAW,yEAEFD,aAATE,IAAS,0GAIEF,aAAXC,IAAW,4EAEFD,aAATE,IAAS,6GAIEF,aAAXC,IAAW,wEAEFD,aAATE,IAAS,yGAIEF,aAAXC,IAAW,6EAEFD,aAATE,IAAS,8GAIEF,aAAXC,IAAW,uFAEFD,aAATE,IAAS,uHAIEF,aAAXC,IAAW,gFAEFD,aAATE,IAAS,iHAKVF,aADCG,IACD,sKAKAH,aADCG,IACD,4JAKAH,aADCG,IACD,iKAKAH,aADCG,IACD,gKAKAH,aADCG,IACD,4JAKAH,aADCG,IACD,0JAKAH,aADCG,IACD,gKAKAH,aADCG,IACD,uJAKAH,aADCG,IACD,6JAKAH,aADCG,IACD,mKAKAH,aADCG,IACD,+JAKAH,aADCG,IACD,oKAKAH,aADCG,IACD,+KAKAH,aADCG,IACD,uKAGJ,EA9IA,I,+ECDA,MAkDM6tD,EAA0B,CAACC,EAAyC5mB,EACtEtK,EAAkCmxB,IAC3Bt7D,eAAmBq7D,EAAWE,MAAO,GAAIF,EAAWG,YACvDC,EAAgBJ,EAAY5mB,EAAYtK,EAAgBmxB,GAAmBD,EAAWK,aAGxFD,EAAkB,CAAC95D,EAAoC8yC,EACzDtK,EAAkCmxB,IAC9BnxB,EACOnqC,eAAmB2B,EAAMg6D,UAAW,GAAIC,EAAWzxB,EAAgBmxB,GAAmBO,EAAcpnB,IAExG,KAGLonB,EAAiBl6D,IACnB,MAAM,SAAE4pC,EAAF,oBAAYQ,EAAZ,wBAAiCC,GAA4BrqC,EACnE,OAAI4pC,EAEIvrC,gBAAC6kC,OAAIngC,iBAAKsnC,GACNhsC,gBAAC6kC,OAAIngC,iBAAKqnC,GACLR,EAAS9lC,IAAI,CAACq2D,EAASp2D,IACpB1F,gBAACA,WAAc,CAACqU,IAAK3O,GAChBo2D,MAOlB,MAGLF,EAAa,CAACj6D,EAAyB25D,KACzC,MAAM,iBAAEpxB,EAAF,eAAoBC,GAAmBxoC,EAC7C,OAAIwoC,IAAmBmxB,EAEft7D,gBAAC6kC,OAAIngC,iBAAKwlC,GACLC,GAIN,MAGL4xB,EAA2Bp6D,IAC7B,MAAM,2BAAEunC,EAAF,sBAA8BC,EAA9B,2BAAqDI,GAA+B5nC,EAC1F,OAAIwnC,EAEInpC,gBAAC6kC,OAAIngC,iBAAKwkC,GACLC,EAAsB1jC,IAAI,CAACsiC,EAAUriC,IAClC1F,gBAACA,WAAc,CAACqU,IAAK3O,GAChBqiC,EACAoB,GAAyBA,EAAsBzjC,EAAQ,IAAM6jC,KAO3E,MAGLyyB,EAAer6D,IACjB,MAAM,MAAEtB,EAAF,eAAS0oC,GAAmBpnC,EAClC,OAAItB,EAEIL,gBAAC6kC,OAAIngC,iBAAKqkC,GACN/oC,0BACKK,EAAMsoC,YACNtoC,EAAMwoC,YAKhB,MAGLozB,EAAoBt6D,IACtB,MAAM,MAAEtB,EAAF,eAAS0oC,GAAmBpnC,EAClC,OAAItB,EAEIL,gBAAC6kC,OAAIngC,iBAAKqkC,GACN/oC,0BACKK,EAAMyoC,aAKhB,MAGIozB,UA7I8Dv6D,IAAQ,MACjF,MAAM,sBAAE6jC,EAAF,SAAyBvwB,EAAzB,WAAmCooB,EAAnC,kBAA+CsX,EAA/C,wBAAkEC,EAAlE,cAA2FG,EAA3F,SAA0Gl6B,EAA1G,YAAoHm6B,EAApH,kBAAiIG,EAAjI,eAAoJZ,EAApJ,WACFE,EADE,kBACUxL,EADV,cAC6ByL,EAD7B,qBAC4CG,EAD5C,iCACkEC,EADlE,aACoGxvC,EADpG,uBACkH+vC,EADlH,mBAC0IC,GAAuB3zC,EACjK25D,EAAgB,UAAG35D,EAAMoC,QAAQ6F,cAAc8L,eAAe9K,aAA9C,aAAG,EAAkDgoC,eAC3E,OAAI/3B,EAEI7a,gBAAColC,SAAM1gC,iBAAK8gC,GACPu2B,EAAwB9yB,GACxB+yB,EAAYznB,GACZQ,EACAC,EACAomB,EAAwBjmB,EAAmBV,EAAYC,EAAe4mB,GACvEt7D,gBAAC6kC,OAAIngC,iBAAK2wC,GACLC,GAELt1C,gBAAC6kC,OAAIngC,iBAAKiwC,GACLrvC,EACA2P,GAEJooB,GAKTr9B,gBAAColC,SAAM1gC,iBAAK8gC,GACRxlC,gBAAC6kC,OAAIngC,iBAAKmwC,GACL5L,GAAqB8yB,EAAwB9yB,GAC7CsL,GAAkB0nB,EAAiB1nB,IAExCv0C,gBAAC6kC,OAAIngC,iBAAKowC,GACLL,GAAconB,EAAcpnB,GAC7Bz0C,gBAAC6kC,OAAIngC,iBAAKkwC,GACLL,GAAkBynB,EAAYznB,GAC9BQ,EACAL,IAAkB4mB,GAAoBM,EAAWlnB,GAClD10C,gBAAC6kC,OAAIngC,iBAAK2wC,GACLC,GAELt1C,gBAAC6kC,OAAIngC,iBAAKiwC,GACLrvC,EACA2P,GAEJooB,O,iFCNN8+B,UArC0Cx6D,IACrD,MAAM,iBACFy6D,EADE,aAEFj1C,EAFE,YAGFk1C,EAHE,eAIFC,EAJE,qBAKFC,EALE,sBAMFC,EANE,cAOFC,EAPE,gBAQFC,EARE,YASFC,EATE,WAUFC,GACAj7D,EAEEk7D,EAASP,GAAkBA,EAAe72D,IAAI,CAACtF,EAASuF,IAEtD1F,gBAAC6kC,OAAIngC,iBACGyiB,EAAY,CAChB9S,IAAK3O,EAAK,YACA,SACVP,KAAK,YACLnF,wBAAMC,UAAU,WACXy8D,GAEJv8D,EAAQmT,MAAQtT,gBAAC6kC,OAAIngC,iBAAK63D,EAAoB,CAAEjpD,KAAMnT,EAAQmT,KAAMlN,QAASw2D,KAC7Ez8D,EAAQ28D,OAAS38D,EAAQ28D,MAAMv5D,OAAS,GAAKvD,gBAAC6kC,OAAIngC,iBAAK83D,EAAqB,CAAEM,MAAO38D,EAAQ28D,MAAO12D,QAASu2D,OAK1H,OACI38D,gBAAColC,SAAM1gC,iBAAK03D,GACRp8D,gBAAC6kC,OAAIngC,iBAAK+3D,EAAa,CAAErrD,MAAOyrD,KAC/BR,K,kCCtCb,4R,ucCmDe,MAAMU,UAAmB/8D,YAKpC0B,YAAmBC,GACfC,MAAMD,GA+IO,KAAAq7D,SAAYrlD,IACzBA,EAAEC,iBAEF,MAAM,8BAAEqsB,EAAF,oBAAiCrB,EAAjC,4BAAsDq6B,GAAgC96D,KAAKR,MAC7FihC,IACAzgC,KAAKR,MAAMmW,SAAS,CAChBmsB,gCACArB,sBACAc,aAAcu5B,IAGlBt8C,WACI,KACIxe,KAAK+6D,WAAW95C,SAAWjhB,KAAK+6D,WAAW95C,QAAQytB,SAEvD,KA7JR1uC,KAAK66D,SAAW76D,KAAK66D,SAAS7mD,KAAKhU,MACnCA,KAAKiJ,MAAQ,CACT7K,YAAa4B,KAAKR,MAAMs7D,6BAE5B96D,KAAK+6D,WAAal9D,cAClBmC,KAAKrB,QAAUC,2BAAiB,QAASoB,KAAKR,MAAMf,iBAAmB,IAGpEqK,sBAAsBC,EACzBC,GACA,OAAIhJ,KAAKiJ,QAAUD,GAAahJ,KAAKR,QAAUuJ,EAM5CG,SAAM,MACT,MAAM,EAgBFlJ,KAAKR,OAhBH,WACFirC,EADE,sBAEFR,EAFE,8BAGFnI,EAHE,oBAIFrB,EAJE,4BAKFq6B,EALE,sBAMFnwB,EANE,4BAOFG,EAPE,MAQFvnC,EARE,SASFoR,EATE,SAUFgB,EAVE,QAWF/T,EAXE,iBAYFnD,EAZE,oBAaFmsC,EAbE,qBAcFC,GAdJ,EAeOmwB,EAfP,iBAiBA,IAAKv6B,EAED,YADAwJ,EAAsBpoC,UAAUC,MAAM,sEAGrC2+B,EAAoBO,sBACrBiJ,EAAsBpoC,UAAU6e,QAAhC,kEAAmGkvB,KAAKW,UAAU9P,KAEtH,MAAMw6B,EAAiBn5B,EAA8BC,mBAAqBC,cAAYC,aACtF,IAAIi5B,EAAoBD,EAAiB,gBAAkB,eAC3DC,EAAiB,iCAA6BA,GAC9C,MAAMC,EAAYF,EAAiB,QAAU,WACvC78D,IAAc08D,EAEpB,GADAI,EAAoB98D,EAAS,UAAM88D,EAAN,YAAoCA,EAC7Dp5B,EAA8Bs5B,cAAgBl7B,uBAAqBm7B,OACnE,OAAOr7D,KAAKs7D,cAAc76B,EAAqBqB,EAA+B1jC,EAAWwD,EAAS2B,EAAO9E,EACrGksC,EAAuBG,GAG/B9qC,KAAKrB,QAAQQ,cAAcC,MAA3B,UAAmCqhC,EAAoB86B,qCAAvD,QAAwF96B,EAAoBO,qBAC5G,MAAM/tB,EAAYjU,iCAAuBP,EAAmBuB,KAAKrB,SAE3D+e,EAAc+iB,EAAoB86B,+BAAiC96B,EAAoBO,sBAAwB,GAE/Gw6B,EAAe/6B,EAAoBg7B,OAAS,EAClD,IAAIC,EAOJ,OALIA,EADiB,IAAjBF,EAC0B5wB,EAAsBlvB,iBAAOkvB,EAAqB9I,EAA8B65B,QAASj+C,GAAe,GAG9HmtB,EAAuBnvB,iBAAOmvB,EAAsB/I,EAA8B65B,QAASj+C,EAAa89C,GAAgB,GAG5H39D,sBAAIC,UAAU,yBAAyBiE,GAAE,UAAK+/B,EAA8B65B,QAAnC,YAA+Cp4D,IACpF1F,mCACIqU,IAAK4oD,EAA8B,OAAS,QAC5ChkD,IAAK9W,KAAK+6D,WACVttD,KAAMzN,KAAK47D,iBACX/X,SAAU,EACV5/C,QAASjE,KAAK66D,SACd/8D,UAAWo9D,EACXl4D,KAAMm4D,EAAS,aACHO,EAAuB,iBACnBZ,GACZ7nD,EACA+nD,GAEHh7D,KAAK67D,gBACNh+D,wBAAMC,UAAU,gCAA+B,cAAa,QAEvD2iC,EAAoB86B,+BAAiC96B,EAAoBO,0BAC3C5gC,IAA9BqgC,EAAoBg7B,OAApB,YAAgDh7B,EAAoBg7B,MAApE,QAQbI,gBAAa,UACjB,MAAMp7B,EAAsBzgC,KAAKR,MAAMihC,oBAEjCtvB,EAAOsvB,EAAoB86B,+BAAiC96B,EAAoBO,sBAAwB,GAExG3jB,EAAa,oBAAIrd,KAAKR,MAAMsiC,8BAA8B65B,eAA7C,aAAI,EAAkDG,2BAAtD,QAA6E,GAC1FC,GAAYpsD,mBAAiBC,mBAAmB6wB,EAAoBu7B,oBACpEC,GAAYtsD,mBAAiBC,mBAAmB6wB,EAAoBy7B,gBAIpEC,GAHiBJ,GAAYE,IACaG,uCAC5C/+C,EAAerd,KAAKR,MAAMoC,SACc,CACxC,CACI0uC,OAAO,GAAD,iBAAK7P,EAAoBI,uBAAzB,QAA4C,GAA5C,YAAkDxjB,EAAlD,YAAmElM,GACzE9S,MAAO8S,EACPkM,gBACAg/C,aAAc57B,EAAoBu7B,mBAClCM,SAAU77B,EAAoBy7B,sBAElC97D,EAEJ,OAAK+7D,EAKDt+D,gBAAC0+D,kBAAe,CACZz+D,UAAU,iCACV0b,YAAaxZ,KAAKR,MAAMoC,QAAQkE,QAAQ0T,YACxC/O,KAAM0xD,EACNK,oBAAoB,EACpBC,cAAY,IATT,KAcPb,iBACJ,MAAM,WAAErxB,EAAF,8BAAczI,EAAd,oBAA6CrB,EAA7C,4BAAkEq6B,GAAgC96D,KAAKR,MAE7G,OAAIihC,EACO8J,EAAW,CACdzI,gCACArB,sBACAc,aAAcu5B,IAIf,GAuBHQ,cAAc76B,EAA0CqB,EAC5D1jC,EAAoBwD,EAAuB2B,EAAgB9E,EAC3Di+D,EAAmCC,GACnC,GAAIl8B,EAAoBO,qBAAsB,CAAC,IAAD,IAC1ChhC,KAAKrB,QAAQQ,cAAcC,MAAQqhC,EAAoB86B,8BACvD,MAAMtoD,EAAYjU,iCAAuBP,EAAmBuB,KAAKrB,SAC3Di+D,EAAgB/7C,OAAOC,SAAS2f,EAAoBO,qBAAsB,IAC1E67B,EAAa,UAAG78D,KAAKR,MAAMwqC,6BAAd,aAAG,EAAkCzoC,KAAKlD,GAASA,EAAM0iC,gBAAkBN,EAAoBM,eAE5G+7B,EAAiBj8C,OAAOC,UAAS+7C,aAAA,EAAAA,EAAe77B,uBAAwB,IAAK,IAC7E+7B,EAAyB,EAC/B,IAAIC,EAA+B,sBAE/BA,EAAoB,UAAMA,EAD1BJ,EAAgBE,EACI,OACbF,EAAgBE,EACH,SAEA,aAExB,MAAMG,OAA4D78D,IAA9BqgC,EAAoBg7B,OACpDh7B,EAAoBg7B,QAAUsB,EAA2BJ,GACzDjhD,iBAAOihD,EAAgCl8B,EAAoBg7B,OAAWiB,GACtEhhD,iBAAOghD,EAA0Bj8B,EAAoBg7B,OACzD,OACI59D,sBACIC,UAAU,yBACVkF,KAAOhD,KAAKR,MAAMwc,kBAAgC5b,EAAjB,eACjC2B,GAAE,UAAK+/B,EAA8B65B,QAAnC,YAA+Cp4D,IAEjD1F,mCACI4P,KAAMzN,KAAK47D,iBACX54D,KAAK,SAAQ,gBACE5E,EAAS,uBACT0jC,EAA8B65B,QADrB,YACiCl7B,EAAoB86B,8BADrD,qCAEtB0B,GACFh5D,QAASjE,KAAK66D,UACV5nD,GAEJpV,gBAACq/D,kBAAe,CACZp/D,UAAWk/D,EACXG,UAAWP,EACXQ,YAAW,UAAE38B,EAAoB86B,qCAAtB,QAAuD96B,EAAoBO,qBACtFq8B,WAAW,EACXC,UAAQ,EACR9+D,UAAU,GACVoD,QAASA,EACTG,GAAI/B,KAAKR,MAAMigC,SACfz9B,SAAUhC,KAAKR,MAAMitB,eACrB3rB,KAAM,KAEVjD,wBAAMC,UAAU,8BAA6B,cAAckC,KAAKR,MAAMwc,aAAe,YAAS5b,QAC3DA,IAA9BqgC,EAAoBg7B,OAApB,WAA+Ch7B,EAAoBg7B,MAAnE,Y,4PCpNxB8B,E,4LCzDW/9D,KACZ3B,gCACIA,uBAAKC,UAAS,UAAK0B,EAAM1B,UAAX,sBACb0B,aAAA,EAAAA,EAAOg+D,MAAO3/D,uBAAKC,UAAS,UAAK0B,EAAM1B,UAAX,mBACxB0B,aADU,EACVA,EAAOg+D,M,0kBDqDpB,SAAKD,GACDA,uBACAA,iCACAA,mDACAA,2BACAA,qBACAA,yBANJ,CAAKA,MAAO,KAuBL,MAAME,UAA0B5/D,IAAMggD,UAsBzCt+C,YAAYC,GACRC,MAAMD,GAtBH,KAAAyJ,MAAiC,CACpCiL,QAAQ,EACRzL,MAAO,GACPqK,SAAU,GACV4qD,QAASH,EAAQI,OACjBx7C,gBAAiB,MAGd,KAAAxJ,qBAAuC,CAC1CC,UAAW,CACPC,GAAI,CAAEC,EAAG,gBAAiBC,EAAG,EAAGC,EAAG,GACnCC,GAAI,CAAEH,EAAG,gBAAiBC,EAAG,EAAGC,EAAG,GACnCkU,GAAI,CAAEpU,EAAG,gBAAiBC,EAAG,EAAGC,EAAG,IAEvCE,UAAU,GAGP,KAAA0kD,gBAAqD//D,IAAMggE,YAEjD,KAAAC,iBAAuDjgE,IAAMggE,YAkE7D,KAAAE,kBAAoB,KACjC,MACI77D,WAAW,sBAAE87D,EAAF,2BAAyBC,IACpCj+D,KAAKR,MAET,OACI3B,0BACIC,UAAU,wCAAuC,aACrCkgE,EACZ3+D,KAAK,mCACL2D,KAAK,OACLk7D,aAAa,MACb59D,SAAUN,KAAKm+D,iBAEftgE,2BACIqB,KAAK,OACLk/D,WAAS,eACGH,EACZngE,UAAU,0DACVu0D,YAAa4L,EACb5/D,MAAO2B,KAAKiJ,MAAMR,MAClB/J,SAAUsB,KAAKq+D,eACfvnD,IAAK9W,KAAK49D,gBACV3mD,UAAW,MAEfpZ,4BACIC,UAAU,0CAAyC,aACvCkgE,EACZj6D,MAAM,cAML,KAAAo6D,gBAAmBh2D,IAChCA,EAAMsN,iBAEN,MAAMhN,EAAQ,IAAIzI,KAAM,gCAAiC,MAEpDyI,IAILzI,KAAK0V,SAAS,CACVgoD,QAASH,EAAQe,UAGrBt+D,KAAKu+D,kBAAkB91D,GAClBhD,KAAKzE,IACoB,IAAlBA,EAAOI,OACPpB,KAAK0V,SAAS,CACV5C,SAAU9R,EACV08D,QAASH,EAAQiB,WAGrBx+D,KAAK0V,SAAS,CACV5C,SAAU9R,EACV08D,QAASH,EAAQkB,gBAI5B54D,MAAM/D,IACH9B,KAAK0V,SAAS,CACVgoD,QAASH,EAAQ/yC,YAKhB,KAAAk0C,yBAA4Bv2D,IACzCnI,KAAK0V,SAAS,CACVipD,kBAAmBx2D,EAAMiJ,OAAO/S,SAIvB,KAAAugE,cAAgB7+D,UAC7B,MAAM,cACF0H,EACA3B,SACI0T,aAAa,UAAE0E,KAEnBle,KAAKR,MAAMoC,QACTi9D,EAAgB,IAAIp8C,uBAAqBxW,EAAQI,SAAU6R,EAAW,QAAI9d,EAC5EJ,KAAKR,MAAMoC,QAAQkE,SACjBg5D,QAAuBt8C,6BAAmBq8C,EAAep3D,GAE/D,IAAKq3D,EAED,OADA9+D,KAAKR,MAAMoC,QAAQC,UAAUC,MAAM,oCAC5BsgB,QAAQC,QAAQ,IAG3B,MAAM3F,QAAmB1c,KAAK++D,sBAAsB9yD,GAQpD,OANAjM,KAAK0V,SAAS,CACVspD,0BAA2BtiD,EAC3BghD,QAASH,EAAQ0B,qBACjB98C,gBAAiB28C,IAGdpiD,GAGM,KAAA2hD,eAAkBl2D,IAC/BnI,KAAK0V,SAAS,CACVjN,MAAON,EAAMiJ,OAAO/S,SAIX,KAAA6gE,0BAA4B,KACzCl/D,KAAK0V,SAAS,CACVgoD,QAASH,EAAQkB,eAIR,KAAAU,qBAAwB9/D,IACrC,MAAM+/D,EAAa//D,GAAQggE,SAAShgE,EAAKoR,QAAQ,IAAIy4C,OAAOlpD,KAAKiJ,MAAMR,MAAO,KAAM,oBAEpF,OAAO5K,yBAAKC,UAAU,0CAA0CwhE,wBAAyB,CAAEC,OAAQH,GAAc,OAGpG,KAAAI,iBAAmB,IACzBx/D,KAAKR,MAAM0C,UAAUu9D,0BACvBhvD,QAAQ,UAAWzQ,KAAKiJ,MAAM6J,SAAS1R,OAAOsP,YAC9CD,QAAQ,YAFN,UAEsBzQ,KAAKR,MAAM0C,UAAUw9D,2BAF3C,OAEwE1/D,KAAKiJ,MAAM6J,SAAS1R,OAAS,EAAI,IAAM,KA6EzG,KAAAu+D,0BAA4B5/D,UACzC,MAAM,gBAAEy8B,EAAiB56B,SAAS,cAAE6F,IAAoBzH,KAAKR,MACvDgM,EAAQ,IAAIo0D,8BACdpjC,EACAh8B,EAAOyL,QAAQI,SACf7L,EAAO0W,SACP1W,EAAOyL,QAAQ0b,sBAAwB,MAGrC3mB,QAAe6+D,iCAAuBr0D,EAAO/D,GAMnD,OAJAzH,KAAK0V,SAAS,CACVoqD,YAAY,IAGT9+D,GA0CM,KAAA++D,oBAAsB,KAE/B//D,KAAKiJ,MAAMiL,QACXlU,KAAK89D,iBAAiB78C,QAASytB,QAGnC1uC,KAAK0V,SAAS,CACVxB,QAASlU,KAAKiJ,MAAMiL,OACpBwpD,QAASH,EAAQI,SAGjB39D,KAAKiJ,MAAM62D,aACXtyD,OAAO3B,SAASwoB,SAChBr0B,KAAK0V,SAAS,CACVoqD,YAAY,MA1UjBE,sBAAmB,MACtB,UAAAhgE,KAAK49D,gBAAgB38C,eAArB,SAA8BytB,QAG3BuxB,uBAAoB,MACvB,UAAAjgE,KAAK49D,gBAAgB38C,eAArB,SAA8BytB,QAGP,oBACvB,OAAO1uC,KAAKiJ,MAAMy0D,UAAYH,EAAQ0B,qBAGnCn2D,sBAAsBC,EACzBC,GACA,OAAIhJ,KAAKiJ,QAAUD,GAAahJ,KAAKR,QAAUuJ,EAM5CG,SACH,MACIhH,WAAW,qBAAEg+D,EAAF,kBAAwBC,IACnCngE,KAAKR,MAEH05D,EAAU,OACTl5D,KAAKR,OADI,IAEZ1B,UAAW,2BACXivB,OAAQ/sB,KAAK+/D,oBACb7rD,OAAQlU,KAAKiJ,MAAMiL,OACnB1V,UAAW0hE,IAGf,OACIriE,oCACIA,kBAACkmD,QAAKxhD,iBAAK22D,GACPr7D,kBAACmmD,cAAW,CAACj3B,OAAQ/sB,KAAK+/D,qBACrB//D,KAAKogE,eAAiBviE,4BACnBqB,KAAK,SACLpB,UAAU,yBAAwB,aACtBqiE,EACZl8D,QAASjE,KAAKk/D,4BAEjBgB,GAEJlgE,KAAKqgE,kBAEVxiE,4BACIqB,KAAK,SACLpB,UAAU,2CAA0C,aACxCoiE,EACZj8D,QAASjE,KAAK+/D,oBACdjpD,IAAK9W,KAAK89D,kBACVjgE,+BACCqiE,IAmITG,iBACJ,OAAQrgE,KAAKiJ,MAAMy0D,SACf,KAAKH,EAAQ0B,qBACT,MAAM,gBAAE98C,EAAF,0BAAmB68C,GAA8Bh/D,KAAKiJ,MACtDa,EAAS,OACR9J,KAAKR,OADG,IAEX8M,cAAetM,KAAKR,MAAM8M,eAAiBtM,KAAK2Y,qBAChD1M,QAASkW,EACTzF,WAAYsiD,EACZsB,qBAAsBtgE,KAAK2/D,0BAC3BY,wBAAyBvgE,KAAK0+D,yBAC9B8B,oBAAqBxgE,KAAKm/D,qBAC1BsB,WAAYzgE,KAAK+9D,sBAGrB,OAAOlgE,kBAACohE,EAAoB18D,iBAAKuH,IAErC,KAAKyzD,EAAQkB,YACT,MAAMiC,EAAY,OACX1gE,KAAKR,OADM,IAEd8M,cAAetM,KAAKR,MAAM8M,eAAiBtM,KAAK2Y,qBAChD2jB,aAAct8B,KAAK4+D,cACnB9rD,SAAU9S,KAAKiJ,MAAM6J,SACrB0tD,oBAAqBxgE,KAAKm/D,qBAC1BsB,WAAYzgE,KAAK+9D,oBACjB4C,sBAAuB3gE,KAAKw/D,mBAGhC,OACI3hE,kBAAComD,YAAS,KACNpmD,kBAAC4gE,EAAWl8D,iBAAKm+D,KAI7B,KAAKnD,EAAQe,QACT,OACIzgE,kBAAComD,YAAS,KACLjkD,KAAK+9D,oBACNlgE,kBAAC+iE,EAAO,CAAC9iE,UAAU,2BAA2B0/D,IAAKx9D,KAAKR,MAAM0C,UAAU2+D,4BAIpF,KAAKtD,EAAQiB,SACT,MAAM,0BAAEsC,EAAF,+BAA6BC,GAAmC/gE,KAAKR,MAAM0C,UAEjF,OACIrE,kBAAComD,YAAS,KACNpmD,uBAAGC,UAAU,iDACRkC,KAAKw/D,oBAETx/D,KAAK+9D,oBACNlgE,kBAACmjE,EAAiB,CAACl/D,MAAOg/D,EAA2BtD,IAAKuD,KAItE,KAAKxD,EAAQ/yC,MACT,OACI3sB,kBAAComD,YAAS,KACLjkD,KAAK+9D,oBACNlgE,yBAAKC,UAAU,mBAAkB,YAAW,aACvCkC,KAAKR,MAAM0C,UAAU++D,qBAKtC,QACI,OACIpjE,kBAAComD,YAAS,KACLjkD,KAAK+9D,sBAwBlBQ,kBAAkB2C,GACtB,MACIt/D,SAAS,cACL6F,EACA3B,SACI0T,aAAa,UAAE0E,MAGvBle,KAAKR,MACH2hE,EAA6C,GASnD,OAPAA,EAAoBC,QAAU,CAC1BC,UAAWnjD,EACXtQ,UAAW02B,YAAatkC,KAAKR,MAAMoC,QAAQkE,UAE/Cq7D,EAAoBG,mBAAoB,EACxCH,EAAoBI,gBAAkBL,EAE/BM,gCAAsB,CAAEh6D,cAAeC,GAAiB05D,GAGhC,4BAACl1D,GAChC,MACIrK,SAAS,cACL6F,EACA3B,SACI0T,aAAa,UAAE0E,MAGvBle,KAAKR,MACHuC,EAAKkK,EAAQyW,gBAAkBzW,EAAQyW,gBAAkBzW,EAAQI,SAEvE,OAAOsW,0CACH,IAAIC,uCAAqC7gB,EAAImc,EAAW,GACpDle,KAAKR,MAAMoC,QAAQkE,SACvB2B,IAhTEwD,aAATE,KAAS,kCEhFP,MAAMs2D,UAAiB5jE,gBAG1B0B,YAAYC,EAAuByJ,GAC/BxJ,MAAMD,GAHO,KAAAkiE,WAAiD7jE,cAwCjD,KAAA8jE,WAAcx5D,IAC3BnI,KAAK0V,SAAS,CAAEksD,cAAez5D,EAAMiJ,OAAO/S,QAExC2B,KAAKR,MAAMd,UACXsB,KAAKR,MAAMd,SAAS,CAChB2pC,WAAYroC,KAAKR,MAAM6oC,WACvBw5B,SAAU15D,EAAMiJ,OAAO/S,MACvByjE,cAAe35D,EAAMiJ,OAAO2wD,aA3CpC/hE,KAAKiJ,MAAQ,CACT24D,cAAe,IAIhBnW,oBACCzrD,KAAK0hE,WAAWzgD,UAChBjhB,KAAK0hE,WAAWzgD,QAAQ2gD,cAAgB,GAIzC14D,SACH,MAAM,WAAEm/B,EAAF,aAAc25B,EAAd,aAA4BC,GAAiBjiE,KAAKR,MAExD,OACI3B,0BACIkE,GAAE,8BAAyBsmC,GAC3BvxB,IAAK9W,KAAK0hE,WAAU,aACRO,EACZnkE,UAAU,uBACVY,SAAUsB,KAAK2hE,YAEdK,EAAa1+D,IAAKiM,GAA8BA,GAC7C1R,0BACIQ,MAAOkR,EAAKxN,GACZmQ,IAAK3C,EAAKxN,GACVmgE,UAAWliE,KAAKiJ,MAAM24D,gBAAmBryD,EAAKxN,GAAE,iBAChC/B,KAAKiJ,MAAM24D,gBAAmBryD,EAAKxN,IAElDwN,EAAKlR,UCpEvB,MAAM2iE,EAAqBxhE,GAC9B3B,gCACIA,uBAAKC,UAAU,8CACfD,uBAAKC,UAAU,4CACV0B,EAAMsC,OAEXjE,uBAAKC,UAAU,iEACV0B,EAAMg+D,M,oGCkBnB,IAAqB2E,EAArB,cAAmDtkE,gBAS/C0B,YAAYC,GACRC,MAAMD,GAHO,KAAAoxD,SAA8C/yD,cAkH9C,KAAAukE,aAAe,KAC5B,MAAMC,OAA8BjiE,IAAnBJ,KAAKR,MAAM2mB,IAAoB,EAAInmB,KAAKR,MAAM2mB,IAE3DhF,MAAMnhB,KAAKiJ,MAAMq5D,eAAkBtiE,KAAKiJ,MAAMq5D,aAAeD,EAC7DriE,KAAKR,MAAMd,UAAYsB,KAAKR,MAAMd,SAAS2jE,GAE3CriE,KAAKR,MAAMd,UAAYsB,KAAKR,MAAMd,SAASsB,KAAKiJ,MAAMq5D,eApH1DtiE,KAAKiJ,MAAQ,CAAEq5D,aAAc9iE,EAAMub,cAAgB,GACnD/a,KAAKuiE,cAAgBviE,KAAKuiE,cAAcvuD,KAAKhU,MAE7C6I,YACI,IAAM7I,KAAKR,MAAMub,aACjB,KACI/a,KAAK0V,SAAS,CAAE4sD,aAActiE,KAAKR,MAAMub,cAAgB,MAK9D7R,SACH,MAAMs5D,EAAmB,UAAcxiE,KAAKR,MAAMijE,oBAAzB,6BACnBC,EAAkB,UAAc1iE,KAAKR,MAAMmjE,oBAAzB,6BAClB3+D,EAAWhE,KAAKR,MAAMub,eAAiB/a,KAAKR,MAAM2mB,IAClDy8C,EAAc5iE,KAAKR,MAAMub,eAAiB/a,KAAKR,MAAMsb,IACrD8F,EAAe5gB,KAAKiJ,MAAMq5D,aAChC,IAAIO,EAAa,GACb7+D,EAEA6+D,EAAa,WAEN7iE,KAAKR,MAAMwE,WAElB6+D,EAAa,cAEjB,MAAMC,EAAoBvxC,GAAmB,KACzCvxB,KAAK+iE,qBAAqBxxC,IAG9B,OACI1zB,uBAAKC,UAAU,YACXD,0BACImG,SAAUhE,KAAKR,MAAMwE,UAAYA,EACjC9F,MAAO8F,EAAW,GAAKhE,KAAKR,MAAMyb,yBAClCnd,UAAS,uCAAkC+kE,GAC3C5+D,QAAS6+D,GAAkB,GAAE,wCAEd9iE,KAAKR,MAAMyb,0BAC1B4oC,UAAW,EACX9/C,MAAM,aAENlG,wBAAMC,UAAW0kE,KAErB3kE,yBACIqB,KAAK,SACLpB,UAAU,iBACVkZ,QAAQ,SACR3Y,MAAOuiB,EACPliB,SAAUsB,KAAKuiE,cACfS,OAAQhjE,KAAKoiE,aAAY,YACf,SAAQ,uBACHpiE,KAAKR,MAAMsN,wBAC1B9J,KAAK,aAAY,gBACF,EAAC,gBACDhD,KAAKR,MAAMsb,IAAG,gBACd8F,EACf9J,IAAK9W,KAAK4wD,SACV5sD,SAAUhE,KAAKR,MAAMwE,WAEzBnG,0BACImG,SAAUhE,KAAKR,MAAMwE,UAAY4+D,EACjC1kE,MAAO0kE,EAAc,GAAK5iE,KAAKR,MAAM2b,yBACrCrd,UAAS,uCAAkC8kE,EAAc,WAAa,IACtE3+D,QAAS6+D,EAAiB,GAAE,wCAEb9iE,KAAKR,MAAM2b,0BAC1B0oC,UAAW,EACX9/C,MAAM,aAENlG,wBAAMC,UAAW4kE,MAMzBK,qBAAqBxxC,GACzB,MAAM0xC,EAAkBjjE,KAAKiJ,MAAMq5D,aAAe/wC,EAE9C0xC,GAAmB,GAAKA,GAAmBjjE,KAAKR,MAAMsb,KACtD9a,KAAKR,MAAMd,UAAYsB,KAAKR,MAAMd,SAASukE,GAI3CV,cAAc/sD,GAClB,MAAMoL,EAAeC,OAAOC,SAAUtL,EAAEpE,OAAO/S,MAAQ,IACjDgkE,OAA8BjiE,IAAnBJ,KAAKR,MAAM2mB,IAAoB,EAAInmB,KAAKR,MAAM2mB,IACzDpF,EAAe/gB,KAAK4wD,UAAY5wD,KAAK4wD,SAAS3vC,SAAWjhB,KAAK4wD,SAAS3vC,mBAAmBC,kBAAoBlhB,KAAK4wD,SAAS3vC,QAE9HL,EAAe5gB,KAAKR,MAAMsb,IAC1B9a,KAAK0V,SACD,CAAE4sD,aAActiE,KAAKR,MAAMsb,MAG/B9a,KAAK0V,SACD,CAAE4sD,aAAc1hD,GAChB,KACI,IACI,KACSO,MAAMnhB,KAAKiJ,MAAMq5D,eAAmBtiE,KAAKiJ,MAAMq5D,aAAeD,IAAathD,IAC5EA,EAAaK,aAAa,gBAAiBR,EAAalQ,YACxDqQ,EAAaK,aAAa,QAASR,EAAalQ,cAGxD,IAPJ,OA3GFyxD,eAAwC,CAClDh8C,IAAK,EACLs8C,oBAAqB,eACrBE,oBAAqB,eAJRR,EAAqB,aADzC72D,KACoB62D,GAAA,Q,ykBCwBd,MAAMlD,UAA6BphE,IAAMggD,UAG5Ct+C,YAAYC,GACRC,MAAMD,GAHF,KAAA0jE,mBAAyB,GA0LhB,KAAAC,oBAAuBC,GAA0BpjE,KAAKR,MAAM0C,UAAUmhE,sBAAsB5yD,QAAQ,mBAAoB2yD,GAExH,KAAAE,sBAAwBvjE,UAErCC,KAAK0V,SAAS,CACV6tD,QAAQ,EACRC,qBAAqB,EACrB1gC,OAAO,OAAM9iC,KAAKiJ,MAAM65B,QAAlB,IAA0B2gC,SAAKrjE,MAGzC,MAAMqjB,EAAoBzjB,KAAKiJ,MAAMyT,WAAWpZ,IAAI+W,GAAaA,EAAU4H,mBAAmBvR,YAAYpK,OAAOpH,IAASc,KAAKkjE,mBAAmBhkE,IAElJc,KAAK0V,SAAS,CACVotB,OAAQ,CAAEzoB,UAAWoJ,KAErBA,EAAkBriB,OAAS,EAC3BpB,KAAK0V,SAAS,CACV6tD,QAAQ,IAKhBvjE,KAAKR,MAAM8gE,qBAAX,KAAqCtgE,KAAKiJ,QACrCxD,KAAKlF,IAEEA,EAAO2zB,eACPl0B,KAAK0V,SAAS,CACV6tD,QAAQ,EACRC,qBAAqB,MAIhC39D,MAAM/D,IACH,MAAM,4BAAE4hE,EAAF,0BAA+BC,GAA8B3jE,KAAKR,MAAM0C,UAC9E,IAAIiB,EAGAA,EADqB,wDAArBrB,EAAMA,MAAMzC,KACGqkE,EAEAC,EAGnB3jE,KAAK0V,SAAS,CACV6tD,QAAQ,EACRzgC,OAAO,OAAM9iC,KAAKiJ,MAAM65B,QAAlB,IAA0B2gC,IAAKtgE,MAEzCnD,KAAKR,MAAMoC,QAAQC,UAAUC,MAAM,0CAI9B,KAAA8hE,kBAAqBx6C,IAClCppB,KAAK0V,SAAS,CACVwB,SAAUkS,EACVy6C,WAAYz6C,EAAWppB,KAAKR,MAAMyM,QAAQ0O,SAIjC,KAAA0G,sBAAwB,CAACC,EAA4CC,KAClF,GAAIA,GAAcD,EAAqBE,gBACnC,OAAOF,EAAqBE,gBAAgBjgB,KAAK8Y,GAAaA,EAAUhO,YAAckV,IAO7E,KAAAuiD,oBAAsB/jE,UAAyD,QAC5F,MAAM,QAAEkM,EAAF,WAAWyQ,EAAX,QAAuB9a,GAAY5B,KAAKR,OACxC,cACFiI,EACA3B,SAAW0T,aAAa,UAAE0E,KAC1Btc,EAGEmiE,EAAyB,UAAG/jE,KAAKiJ,MAAM65B,cAAd,iBAAG,EAAmBzoB,iBAAtB,aAAG,EAA8B/T,OAAOvE,GAAMA,IAAOiiE,EAAU37B,WAAW33B,YAEzG1Q,KAAK0V,SAAS,CACV6tD,QAAQ,EACRC,qBAAqB,EACrBS,gBAAgB,EAChBnhC,OAAQ,CAAE2gC,SAAKrjE,EAAWia,UAAW0pD,KAIzC/jE,KAAKkjE,mBAAmBc,EAAU37B,aAAe27B,EAAUnC,SAE3D,MAAM7/C,EAAmBtF,aAAH,EAAGA,EAAYpZ,IAAI+W,IAC9B,CACH4H,mBAAoB5H,EAAU4H,mBAC9B3H,eAAgBta,KAAKqhB,sBAAsBhH,EAAWra,KAAKkjE,mBAAmB7oD,EAAU4H,sBAAwB5H,EAAUC,eAC1H4H,oBAAqB7H,EAAU6H,uBAEpC5b,OAAO+T,GACCA,GAAaA,EAAUC,gBAG5BuI,QAAwBL,6BAC1B,IAAIC,uBACAxW,EAAQyW,gBAAkBzW,EAAQyW,gBAAkBzW,EAAQI,SAC5D6R,EACA8D,OAAkB5hB,EAClBJ,KAAKR,MAAMoC,QAAQkE,SAEvB2B,GAGJ,IAAKob,EAED,YADA7iB,KAAKR,MAAMoC,QAAQC,UAAUC,MAA7B,uDAAmFmK,EAAQyW,gBAAkBzW,EAAQyW,gBAAkBzW,EAAQI,WAInJ,MAAM63D,EAAiB,IAAIthD,uCACvBC,EAAexW,SACf6R,EACA8D,EACAhiB,KAAKR,MAAMoC,QAAQkE,SAEjBq+D,QAA0BxhD,0CAAgCuhD,EAAgBz8D,GAEhF,IAAK08D,EAKD,OAJAnkE,KAAKR,MAAMoC,QAAQC,UAAUC,MAAM,qEACnC9B,KAAK0V,SAAS,CACVuuD,gBAAgB,IAKxB,MAAMG,EAAoB,IAAIphD,+CAC1B/W,EAAQyW,gBAAkBzW,EAAQyW,gBAAkBzW,EAAQI,SAC5D6R,GAIE4E,QAA6BC,qDAA2CqhD,EAAmB38D,GAC3F48D,EAAa,IAAInsC,+BAA6BjsB,EAAQI,SAAU6R,GAChEqa,QAAqBN,qCAA2BosC,EAAY58D,GAElE,IAAK8wB,EAKD,OAJAv4B,KAAKR,MAAMoC,QAAQC,UAAUC,MAAM,gEACnC9B,KAAK0V,SAAS,CACVuuD,gBAAgB,IAKxBjkE,KAAK0V,SAAS,CACVuuD,gBAAgB,EAChBvkD,yBAA0BoD,GAAwBA,EAAqB,SAAM1iB,EAC7EkkE,YAAa/rC,EAAanR,WAAanb,EAAQ0O,OAC/C+B,WAAYynD,EAAkBI,KAAK,CAACC,EAAGC,IAAMD,EAAEviD,mBAAqBwiD,EAAExiD,oBACtEhW,QAAS4W,KAIA,KAAAvF,iBAAmB,CAACD,EAAuBnb,KACxD,OAAQmb,GACJ,KAAK,EACD,OAAOnb,EAAUuK,0BACrB,KAAK,EACD,OAAOvK,EAAUuf,kCACrB,KAAK,EACD,OAAOvf,EAAUwK,yBACrB,KAAK,EACD,OAAOxK,EAAUyK,0BACrB,QACI,MAAO,KA1Vf3M,KAAKiJ,MAAQ,CACTiO,SAAU,EACVotD,UAAW9kE,EAAMyM,QAAQ0O,MACzBkpD,WAAYrkE,EAAMyM,QAAQ0O,MAC1B1O,QAASzM,EAAMyM,QACfyQ,WAAYld,EAAMkd,WAAW6nD,KAAK,CAACC,EAAGC,IAAMD,EAAEviD,mBAAqBwiD,EAAExiD,oBACrEihD,mBAAoB,GACpBe,gBAAgB,EAChBT,qBAAqB,GAItB16D,sBAAsBC,EACzBC,GACA,OAAIhJ,KAAKiJ,QAAUD,GAAahJ,KAAKR,QAAUuJ,EAM5CG,SAAM,YACT,MACItH,SACI6F,eACI8L,gBAAgB,YAAEiG,IAEtB1T,SAAS,aAAEmH,IAEf/K,WAAW,sBACPwiE,EADO,8BAEPC,EAFO,yBAGP1pD,EAHO,yBAIPE,EAJO,oBAKPypD,EALO,kCAMPC,EANO,gBAOPC,GAdF,cAgBFx4D,EAhBE,oBAiBFk0D,GACAxgE,KAAKR,OACH,eAAEykE,EAAF,QAAkBh4D,EAAlB,SAA2BiL,EAA3B,UAAqCotD,EAArC,WAAgDT,EAAhD,oBAA4DL,EAA5D,OAAiF1gC,GAAW9iC,KAAKiJ,MAEvG,OACIpL,oCACIA,kBAAComD,YAAS,KACLjkD,KAAKR,MAAMihE,WACZ5iE,yBAAKC,UAAU,4CACXD,yBAAKC,UAAU,8DACXD,yBAAKC,UAAU,8DACXD,kBAAC6b,IAAK,CACFC,QAAO,UAAE1N,EAAQtC,YAAV,QAAkB,QACzB4J,eAAgBvT,KAAKR,MAAMoC,QAAQ6F,cAAc8L,eACjDqG,IAAG,UAAE3N,aAAF,EAAEA,EAASsC,uBAAX,QAA8B,GACjCsL,YAAW,UAAEP,8BAAoBrN,aAAD,EAACA,EAASsN,OAAQC,UAAvC,QAAuD,GAClE1b,UAAU,YACVwO,cAAeA,EACfW,aAAcA,EACd6M,oBAAoB,UAExBjc,yBAAKC,UAAU,iDACXD,yBAAKC,UAAU,yCACVmO,aADL,EACKA,EAASsN,QAEbinD,EAAmB,UAACv0D,aAAD,EAACA,EAAStC,YAAV,QAAkB,IACtC9L,yBAAKC,UAAU,iDACV6mE,EACA,IACA3kE,KAAK+kE,aAAaT,IAEvBzmE,yBAAKC,UAAU,0CACV+mE,EACA,IACA54D,aAHL,EAGKA,EAAS0b,wBAItB9pB,yBAAKC,UAAU,wDACVkC,KAAKglE,wBAGdnnE,yBAAKC,UAAU,sBACXD,6BACK+mE,GAEL/mE,kBAACskE,EAAqB,CAClBpgE,GAAG,qDACHgZ,aAAc7D,EACdxY,SAAUsB,KAAK4jE,kBACf92D,uBAAuB,mCACvBgO,IAAK,IACLG,yBAA0BA,EAC1BE,yBAA0BA,MAItCtd,yBAAKC,UAAU,kDACVgnE,EACA,IACA9kE,KAAK+kE,aAAalB,KAG3BhmE,kBAACumD,cAAW,KACPof,GAAuB3lE,yBACpBC,UAAU,oEAAmE,YACnE,YACVkF,KAAK,SACLnF,wCAAkB,SACjBmC,KAAKilE,4BAETniC,aAAA,EAAAA,EAAQ2gC,MAAO5lE,yBAAKC,UAAU,kEAC3BD,0BAAMC,UAAU,2BAA0B,cAAa,SACtDglC,EAAO2gC,KAEZ5lE,kBAACiG,SAAM,CACHhG,UAAW+S,IAAW,0DAA2D,CAAE,UAAW7Q,KAAKiJ,MAAMs6D,SAAS,aACtGmB,EACZzgE,QAASjE,KAAKsjE,sBACdt/D,SAAUigE,GAETS,KAObO,0BACJ,MAAMC,EAAyBllE,KAAKiJ,MAAMyT,WAAWpZ,IAAI+W,IAAY,QACjE,IAAI+4B,EAAO,UAAG/4B,EAAUmH,uBAAb,iBAAG,EAA2BjgB,KAAKlD,GAASA,EAAMgO,WAAarM,KAAKkjE,mBAAmB7oD,EAAU4H,4BAAjG,aAAG,EAAoH1H,MAIlI,OAHqC,IAAjCF,EAAU4H,qBACVmxB,EAAO,eAAWA,IAEfA,IACR9sC,OAAOjI,GAASA,GAEnB,OAAO2B,KAAKR,MAAM0C,UAAUijE,0BACvB10D,QAAQ,UAAWzQ,KAAKiJ,MAAMiO,SAASxG,YACvCD,QAAQ,yBAFN,UAEmCzQ,KAAKiJ,MAAMgD,QAAQtC,KAFtD,aAE+DpH,OAAO0rD,OAAOiX,GAAwBzqD,KAAK,QAI7GuqD,sBACJ,MAAM,WAAEtoD,GAAe1c,KAAKiJ,OACtB,UAAE/G,GAAclC,KAAKR,MAE3B,OAAOkd,aAAP,EAAOA,EAAYpZ,IAAK+W,IAAmC,QACvD,MAAM,gBAAEmH,EAAF,mBAAmBS,GAAuB5H,EAK1C+oD,EAAgBpjE,KAAKsd,iBAAiB2E,EAAoB/f,GAC1D8/D,EAAqCxgD,EAAkBA,EAAgBle,IALtDjF,IAAD,CAClB0D,GAAI1D,EAAMgO,SACVhO,MAAOA,EAAMkc,OAAS,MAG4F,GAGtH,OAFAynD,EAAaoD,QAAQ,CAAErjE,GAAI,EAAG1D,MAAM,YAAD,OAAc+kE,KAG7CvlE,yBAAKqU,IAAK+P,GACNpkB,6BACKulE,IAEJ,UAAApjE,KAAKiJ,MAAM65B,cAAX,mBAAmBzoB,iBAAnB,eAA8B+R,SAASnK,EAAmBvR,cACvD7S,kBAACyZ,QAAK,CAACvT,MAAM,SAASghD,WAAS,eAAa/kD,KAAKmjE,oBAAoBC,IACjEvlE,yBAAKC,UAAU,oBAAmB,cAAa,QAC3CD,0BAAMC,UAAU,6BAChBD,8BACKmC,KAAKmjE,oBAAoBC,MAK1CvlE,kBAAC4jE,EAAQ,CACLp5B,WAAYpmB,EACZggD,aAAcjiE,KAAKsd,iBAAiB2E,EAAoB/f,GACxD8/D,aAAcA,EACdtjE,SAAUsB,KAAK8jE,yBAgL3BiB,aAAa5iE,GACjB,MACIP,SACI8yD,kBAAkB,eACdC,EADc,aAIdF,KAGRz0D,KAAKR,MAET,OAAOm1D,EAAexyD,EAAM0sB,QAAQ,GAAI4lC,I,UChZzC,MAAMgK,EAAej/D,IACxB,MAAM,SACFsT,EACAlR,SACI6F,eACI8L,gBAAgB,YAAEiG,IAEtB1T,SAAS,aACLmH,GAEJynD,kBAAkB,eACdC,EADc,aAIdF,IAbN,aAgBFn4B,EAhBE,oBAiBFkkC,EAjBE,sBAkBFG,EACAz+D,WAAW,wBAAEmjE,GAnBX,cAoBF/4D,GACA9M,EAEJ,OACI3B,oCACIA,uBAAGC,UAAU,gDAA+C,YAAW,aAClE6iE,KAEJnhE,EAAMihE,WACP5iE,yBAAKC,UAAU,0CACVgV,EAASxP,IAAI,CAAC2I,EAA8B1I,KAAiB,MAC1D,MAAM,MAAEoX,EAAF,OAASpB,EAAT,KAAiB5P,EAAjB,gBAAuB4E,GAAoBtC,EAC3C9J,EAAQwyD,EAAeh6C,EAAMkU,QAAQ,GAAI4lC,GACzC6Q,EAAW,UAAGhsD,8BAAoBC,EAAQC,UAA/B,QAA+C,GAEhE,OACI3b,yBAAKqU,IAAG,kBAAa3O,GAASzF,UAAU,qCACpCD,yBAAKC,UAAU,8DACXD,kBAAC6b,IAAK,CACFC,QAAShQ,UAAQ,QACjB4J,eAAgB/T,EAAMoC,QAAQ6F,cAAc8L,eAC5CqG,IAAKrL,UAAmB,GACxBsL,YAAayrD,EACbxnE,UAAU,YACVmP,aAAcA,EACdX,cAAeA,EACfwN,oBAAoB,UAExBjc,yBAAKC,UAAU,gDAA+C,YAAW,UACrED,yBAAKC,UAAU,yCACVyb,GAEJinD,EAAoB72D,UAAQ,MAGrC9L,yBAAKC,UAAU,sDACXD,8BACKsE,GAELtE,kBAAC0nE,EAAmB,CAACt5D,QAASA,EAASu5D,WAAYH,EAAyB/oC,aAAcA,WAgBpHipC,EAAuB/lE,IACzB,MAAO+jE,EAAQkC,GAAW1pD,oBAAS,IAC7B,QAAE9P,EAAF,WAAWu5D,EAAX,aAAuBlpC,GAAiB98B,EACxCkmE,EAAkB7nE,IAAM8nE,YAAY5lE,UACtC0lE,GAASlC,SACHjnC,EAAarwB,GACnBw5D,GAASlC,IACV,CAACjnC,EAAcinC,EAAQt3D,IAE1B,OACIpO,kBAACiG,SAAM,CACHhG,UAAW+S,IAAW,mDAAoD,CAAE,UAAW0yD,IAAS,uBACjFt3D,EAAQtC,KADyE,YAChE67D,GAChCvhE,QAASyhE,GAERF,I,0BCpEb,MAAMI,EAA4BpmE,GAAsC,KACpEqmE,EAAqBrmE,IAGZ4+B,EAA4B5+B,IACrC,MAAM,UAAE0C,GAAc1C,GAChB,yBAAEi+B,GAA6Bv7B,EAErC,MAAO,CACH4jE,iBAAkBC,EAAiCvmE,GACnDwmE,eAAgBC,EAA+BzmE,GAC/C0mE,eACIroE,gBAACiG,SAAM,CAAChG,UAAU,uDAAuDmG,QAAS2hE,EAAyBpmE,IACtGi+B,KAMXooC,EAAwBrmE,IAC1B,MAAQsB,MAAM,cAAEwqB,GAAV,SAA2BJ,GAAa1rB,GACxC,iBAAEw+B,GAAqB9S,EAEzB8S,GACAA,EAAiB1S,EAAckJ,YAAY5tB,KAI7Cm/D,EAAoCvmE,IACtC,MAAQsB,MAAM,cAAEwqB,GAAV,SAA2BtpB,EAA3B,GAAqCD,EAArC,QAAyCH,EAAzC,iBAAkDnD,EAAlD,UAAoEyD,GAAc1C,GAClF,2BACF+9B,EADE,sBAEFG,EAFE,wBAGFC,EAHE,wBAIFC,EAJE,wBAKFC,EALE,gCAMFM,GACAj8B,EAEE0qB,EAAgB,CAClB8Q,wBACAC,0BACAC,0BACAC,0BACAM,mCAGJ,OACItgC,gBAAC2uB,kCAA+B,CAC5B5qB,QAASA,EACTG,GAAIA,EACJC,SAAUA,EACVlB,KAAM,CAAEwqB,iBACRxtB,UAAU,GACV4uB,cAAe6Q,EACf3Q,cAAeA,EACfnuB,iBAAkBA,KAKxBwnE,EAAkCzmE,IACpC,MAAM,iCAAEy+B,EAAF,UAAoC/7B,EAApC,QAA+CN,EAA/C,SAAwDspB,GAAa1rB,EAC3E,OACI3B,gBAACsoE,+BAA4B,CACzBpoC,iBAAkB7S,EAAS6S,iBAC3BjgC,UAAU,iCACV8D,QAASA,EACTG,GAAIvC,EAAMuC,GACVjB,KAAM,CAAEwqB,cAAe9rB,EAAMsB,KAAKwqB,cAAckJ,aAChDxyB,SAAUxC,EAAMwC,SAChBi8B,iCAAkCA,EAClCY,8BAA+B38B,EAAUs7B,4BCnC/C4oC,EAA4B5mE,IAC9B,MAAM,kBAAE+/B,EAAF,gBAAqBvL,EAArB,SAAsC9c,EAAtC,SAAgDgU,GAAa1rB,GAC7D,OAAE6P,GAAW2kB,GACb,WAAE0L,EAAF,aAAcC,GAAiBzU,EAErC,MAAO,CACHm7C,YAAa,IAAOl+D,IAChBkH,GAAUkwB,EAAkBlS,aAAeqS,EAAWH,EAAkBlS,YAAYC,eAAgBpW,EAAU7H,IAElHi3D,cAAe,IAAOn+D,GAAyCkH,GAAUswB,EAAangC,EAAM+/B,qBAS9FgnC,EAAS/mE,IACX,MAAM,mBAAEsgC,EAAF,iCAAsBD,EAAtB,eAAwDZ,EAAxD,uBAAwEC,GAA2B1/B,EAAM0C,WACxGskE,EAAYC,GAAiB1qD,oBAAS,GAOvCgR,EAASlvB,IAAM8nE,YAAY,KAC7Bc,GAAeD,IAChB,CAACA,IAEJ,OACI3oE,yBAAKC,UAAS,UAXS,WAWT,yBACVD,kBAACiG,SAAM,CACHhG,UAAS,UAbM,WAaN,sBAA2C,aACxCmhC,EAAc,YACfz/B,EAAM+D,MACjBU,QAAS8oB,IAEZy5C,GACD3oE,yBAAKC,UAAS,UAnBK,WAmBL,gBACVD,kBAACiG,SAAM,CACHhG,UAAU,2BACVmG,QApBckE,IAC1B3I,EAAM87B,uBAAuB97B,IAoBjBtB,MAAOghC,EAAsB,aACjBA,GAAsB,QAIrCwnC,EAAgBlnE,EAAMkZ,SAAUlZ,EAAMmnE,sBACnC9mC,EAAkCumC,EAAyB5mE,GAAO8mE,iBACrEI,EAAgBlnE,EAAMkZ,SAAUlZ,EAAMonE,mBAAoB9mC,EAAoBsmC,EAAyB5mE,GAAO6mE,kBAMzHK,EAAkB,CAAChuD,EAAmB5a,EAAmB0nE,EAAoBlpC,IAC/Ez+B,kBAACiG,SAAM,cACS0hE,EACZ1nE,UAAWA,EACXmG,QAASq4B,EACTp+B,MAAOsnE,GAEN9sD,EAAW8sD,EAAa,IAU3BqB,EAAsB,CACxBtnC,EACA/zB,IAAoCrD,IACpCo3B,EAAkBnhC,WAAamhC,EAAkBnhC,UAEjDoN,EAAM0f,SAASqQ,SAASgE,EAAmBp3B,EAAMiJ,OAAOnS,UAG/C8gC,EAAyBv0B,IAClC,MAAM,kBAAE+zB,EAAF,gBAAqBvL,EAArB,MAAsC7xB,EAAtC,QAA6CP,EAA7C,cAAsD0K,EAAtD,SAAqE4K,EAArE,UAA+EhV,EAA/E,SAA0FwW,GAAalN,EACvGS,EAAUszB,EAAkBlS,aAC5B,OAAEhe,EAAF,cAAUy3D,GAAkB9yC,GAC5B,iCAAE6L,EAAF,mBAAoCC,EAApC,iBAAwDd,GAAqB98B,EACnF,IAAK+J,EACD,OAAO,KAGX,MAAM,OAAEsN,EAAF,KAAU5P,EAAV,gBAAgB4E,GAAoBtC,EAAQqhB,eAC5Cy5C,EAAgBztD,8BAAoBC,EAAQ3X,EAAQ6F,cAAc8L,eAAeiG,aACjFotD,EAAqBp7D,EAAMkN,SAAW,0BAA4B,mDAClEiuD,EAAwBn7D,EAAMkN,SAAW,6BAA+B,sDAE9E,MAAO,CACHA,WACAsuD,WACInpE,2BAAOC,UAAU,sBACbD,wCACgBmhC,EAAkBlhC,UAAU,iBACxCoB,KAAK,WAAWD,QAASsgC,EAAkBnhC,UAAS,eAAgBmhC,EAAkBnhC,UACtFM,SAAUmoE,EAAoBtnC,EAAmB/zB,KACrD3N,0BAAMC,UAAU,eAGxBoU,IAAK7C,EACL43D,aAAc14D,GAAmB5E,GAC7Bu9D,EAAoB,8CAA+CtlE,EAASqK,EAAQqhB,eAAe3jB,KAAO4E,EAAiBw4D,EAAez6D,GAE9I66D,YAAaC,EAAkB57D,GAC/B+sB,aAAcp2B,GAASklE,EAAa77D,GACpCywB,cAAehwB,GAAWpO,yBAAKC,UAAU,gDACpCyb,GAEL+tD,qBAAsBnlE,EAClBtE,yBAAKC,UAAU,yDACVgpE,GAAiB3kE,EAAM2kE,oBAG5B1mE,EAEJ6zB,cAAe5kB,EACfwd,aAAc65C,EAAgBl7D,EAAMkN,SAAUiuD,EAAuB9mC,EAAkCumC,EAAyB56D,GAAO86D,iBACvIiB,oBAAqB1pE,6BAChB2pE,EAAkBh8D,EAAO6D,IAE9B+sB,gBAAiBllB,EACjBuwD,eAAgBf,EAAgBl7D,EAAMkN,SAAUkuD,EAAoB9mC,EAAoBsmC,EAAyB56D,GAAO66D,eACxHqB,MACI7pE,kBAAC0oE,EAAKhkE,iBACEiJ,EAAK,CACTo7D,mBAAoBA,EACpBD,sBAAuBA,OAM1B7vC,EAA+BtrB,IACxC,MAAM,kBAAE+zB,EAAF,gBAAqBvL,EAArB,MAAsC7xB,EAAtC,QAA6CP,EAA7C,cAAsD0K,GAAkBd,EACxES,EAAUszB,EAAkBlS,aAC5B,OAAEhe,EAAF,cAAUy3D,GAAkB9yC,EAClC,IAAK/nB,EACD,OAEJ,MAAM,OAAEsN,EAAF,KAAU5P,EAAV,gBAAgB4E,GAAoBtC,EAAQqhB,eAC5Cy5C,EAAgBztD,8BAAoBC,EAAQ3X,EAAQ6F,cAAc8L,eAAeiG,aAEvF,MAAO,CACHytD,aAAc14D,GAAmB5E,GAC7Bu9D,EAAoB,YAAatlE,EAASqK,EAAQqhB,eAAe3jB,KAAO4E,EAAiBw4D,EAAez6D,GAE5G66D,YAAaC,EAAkB57D,GAC/B+sB,aAAcp2B,GAASklE,EAAa77D,GACpCywB,cAAe1iB,EACf+tD,qBAAsBR,IAAiB3kE,aAAJ,EAAIA,EAAO2kE,eAC9CS,oBAAqBC,EAAkBh8D,EAAO6D,KAgBhDs4D,EAAkB,CAAC/nC,EAEzBzU,EAAiB3rB,IAAoC4pB,IAC7CwW,GACAA,EAAiBzU,EAAS/B,EAAU5pB,IAItCgoE,EAAoB,CAAChoE,EAAgC2rB,KACvD,MAAM,SAAED,EAAF,UAAYhpB,EAAZ,SAAuBgV,GAAa1X,GACpC,iBAAEogC,GAAqB1U,EAC7B,OACIrtB,kBAACskE,EAAqB,CAClBpnD,aAAc7D,EACdxY,SAAUipE,EAAgB/nC,EAAkBzU,EAAS3rB,GACrDsb,IAAK,UACLhO,uBAAwB5K,EAAU4K,uBAClCqO,yBAA0BjZ,EAAUiZ,yBACpCF,yBAA0B/Y,EAAU+Y,yBACpCjX,SAAUxE,EAAM83B,+BAKf4vC,EAAsB,CAC/BppE,EACA8D,EACAmP,EACA62D,EACAb,EACAz6D,KAEA,MAAMqM,EAAuC,CACzCC,UAAW,CACPC,GAAI,CAAEC,EAAG,gBAAiBC,EAAG,EAAGC,EAAG,GACnCC,GAAI,CAAEH,EAAG,gBAAiBC,EAAG,EAAGC,EAAG,GACnCkU,GAAI,CAAEpU,EAAG,gBAAiBC,EAAG,EAAGC,EAAG,IAEvCE,UAAU,GAGd,OAAI0uD,EAEI/pE,kBAAC6b,IAAK,CACFnG,eAAgB3R,EAAQ6F,cAAc8L,eACtCzV,UAAWA,EACX6b,QAAS5I,EACT7S,MAAO6S,EACP6I,IAAKguD,EACL/tD,YAAaktD,EACb95D,aAAcrL,EAAQkE,QAAQmH,aAC9BX,cAAeA,GAAiBqM,EAChCmB,oBAAoB,QACpB+pC,SAAU,IAIf,MAGLwjB,EAAgB7nE,IAClB,MAAM,MAAE2C,EAAF,QAASP,EAAT,SAAkB69B,EAAlB,eAA4BhT,EAA5B,UAA4CvqB,GAAc1C,EAEhE,OAAI2C,EAEItE,kBAAC4E,iBAAc,CACXV,GAAI09B,EACJz9B,SAAUyqB,EACV3rB,KAAM,CAAEqB,SACRrE,UAAU,8CACV6E,cAAeT,EAAUS,cACzBuL,kBAAmBhM,EAAUgM,kBAC7BC,iBAAkBjM,EAAUiM,iBAC5BvM,QAASA,IAId,MAmBEwlE,EAAqB5nE,IAA+D,MAC7F,MAAM,kBAAE+/B,EAAF,WAAqBryB,GAAe1N,EACpCH,EAAI,UAAGkgC,EAAkBlS,mBAArB,aAAG,EAA+BC,eAAe3jB,KAErD+S,EApBwBld,KAC9B,MAAM,kBAAE+/B,GAAsB//B,EAE9B,OAAK+/B,EAAkBlS,aAAgBkS,EAAkBlS,YAAYC,eAAelT,WAI7EmlB,EAAkBlS,YAAYC,eAAelT,WAAW9W,IAAK+W,IAChE,GAAKA,EAAUC,gBAAmBD,EAAUC,eAAeC,MAI3D,OAAOF,EAAUC,eAAeC,QARzB,IAgBQstD,CAAyBroE,GAC5C,IAAK+/B,EAAkBlS,YACnB,MAAO,GAGX,MAAMnE,EAAchc,EAChBrP,uBAAGC,UAAU,kDAAkD2P,KAAMP,GAChE7N,GAGLxB,yBAAKC,UAAU,mDACVuB,GAIHyoE,EAAyBprD,EAAWjC,KAAK,MAE/C,OACI5c,yBAAKC,UAAU,8CACXD,yBAAKC,UAAU,mDACVorB,GAELrrB,yBAAKC,UAAU,wDACVgqE,KC7WJ7tC,EAAmF,IAAmC,IAAlC,UAAEn8B,EAAF,UAAa2vB,EAAb,KAAwBtc,GAAU,EAC/H,OAAQsc,GACJ,IAAK,QACD,OACI5vB,qBAAGC,UAAW+S,IAAW,yCAA0C/S,IAC7DqT,GAGd,IAAK,SACD,OACItT,qBAAGC,UAAW+S,IAAW,0CAA2C/S,IAC9DqT,GAGd,IAAK,UACL,QACI,OACItT,qBAAGC,UAAU,4CACPqT,K,8NCGf,MAAMorB,UAAkC1+B,gBAA/C0B,kCACW,KAAA0J,MAAyC,CAC5C7K,WAAW,GAGE,KAAA2pE,mBAA6B,WASvC,KAAAC,YAAc,IAAO7/D,IACxBnI,KAAK0V,SAAS,CACVtX,UAAW4B,KAAKiJ,MAAM7K,WACvB,KACC4B,KAAKR,MAAM88B,cAAct8B,KAAKiJ,MAAM7K,cAXN,gCAACoB,EAAwCyJ,GAC3E,MAAMg/D,EAAezoE,EAAMq0B,MAAMvtB,OAAO8mB,IAASA,EAAKhvB,WAAWgD,OACjE,IAAI4H,E,yWAAS,IAAQC,GAErB,OADAD,EAAY,CAAE5K,UAA4B,IAAjB6pE,GAClBj/D,EAWJE,SACH,OACIrL,6BACIA,sBAAIC,UAAS,UAAKkC,KAAK+nE,mBAAV,kBACTlqE,sBAAIqqE,MAAM,MAAK,aAAaloE,KAAKR,MAAMu8B,mBACnCl+B,yBAAOC,UAAU,sBACbD,sCACgBmC,KAAKR,MAAMu8B,kBAAmBj+B,UAAU,iBACpDoB,KAAK,WAAU,eAAec,KAAKiJ,MAAM7K,UAAWa,QAASe,KAAKiJ,MAAM7K,UACxEM,SAAUsB,KAAKgoE,gBACnBnqE,wBAAMC,UAAU,gBAGxBD,+BAGAA,sBAAIqqE,MAAM,OACLloE,KAAKR,MAAMy8B,eAEdj8B,KAAKR,MAAMkZ,SAEL,KAFgB7a,sBAAIqqE,MAAM,OAC7BloE,KAAKR,MAAM0pB,aAEdlpB,KAAKR,MAAMkZ,SAEL,KAFgB7a,sBAAIqqE,MAAM,OAC7BloE,KAAKR,MAAM08B,kBAEdl8B,KAAKR,MAAMkZ,SAEL,KAFgB7a,sBAAIqqE,MAAM,OAC7BloE,KAAKR,MAAM28B,YAEdn8B,KAAKR,MAAMkZ,SAEL,KAFgB7a,sBAAIqqE,MAAM,OAC7BloE,KAAKR,MAAM48B,iBAEdp8B,KAAKR,MAAMkZ,SAEL7a,2BAFgBA,sBAAIqqE,MAAM,OAC7BloE,KAAKR,MAAM68B,qB,+EC9EpC,MAAM8rC,EAAoD,IAcrD,IAdsD,QACvDp3D,EADuD,WAEvDq3D,EAFuD,OAGvDljD,EAHuD,aAIvDmjD,EAJuD,uBAKvDC,EALuD,8BAMvDC,EANuD,mBAOvDC,EAPuD,mBAQvDC,EARuD,yBASvDC,EATuD,kBAUvDC,EAVuD,yBAWvDC,EAXuD,0BAYvDC,EAZuD,0BAavDC,GACC,EAED,OACIjrE,gCACKkT,EACAq3D,EACDvqE,gBAAC6kC,OAAIngC,iBAAK2iB,GACLmjD,EAAa/kE,IAAKylE,GAEXlrE,gBAAC6kC,OAAIngC,iBAAKwmE,EAAYC,2BAA0B,CAAE92D,IAAK62D,EAAY72D,MAC9D62D,EAAY7qE,MACZ6qE,EAAYE,oBACZF,EAAYG,aACZH,EAAYI,mBACZJ,EAAYK,kBAK7BvrE,gBAAC6kC,OAAIngC,iBAAK+lE,GACLE,EACAC,EACAC,EAEGC,GACI9qE,gBAAC6kC,OAAIngC,iBAAKgmE,GACLK,EACAC,EACAC,MAQvBO,EAAsD,IAIvD,IAJwD,QACzDt4D,EADyD,kBAEzDu4D,EAFyD,OAGzD/3C,GACC,EAED,OACI1zB,gCACKkT,EACAu4D,EACA/3C,IAmBEg4C,UAdkD/pE,IAC7D,MAAM,gBAAEgqE,EAAF,UACFv/D,EADE,YAEFw/D,EAFE,WAGFC,GAAelqE,EAEnB,OACI3B,gBAAColC,SAAM1gC,iBAAKinE,GACPv/D,EAAU0/D,eAAiB9rE,gBAACwrE,EAAmB9mE,iBAAKknE,IACpDx/D,EAAU2/D,kBAAoB/rE,gBAACsqE,EAAkB5lE,iBAAKmnE,O,kCClFnE,m5E,+iBCOO,MAAMG,EAAmD,QAAC,cAAEl7D,EAAF,MAAiBC,EAAjB,SAAwB/C,GAAzB,SAC5DhO,gBAAC6kC,OAAIngC,iBAAKoM,GACLC,EACA/C,IAIIi+D,EAAmD,QAAC,cAAE/6D,EAAF,MAAiBH,GAAlB,SAC5D/Q,gBAAC6kC,OAAIngC,iBAAKwM,GACLH,IAIIm7D,EAAyC,QAAC,SAAEz6D,EAAF,KAAYC,EAAZ,cAAkBC,EAAlB,cAAiCC,GAAlC,SAClD5R,gBAAC6kC,OAAIngC,iBAAK+M,GACLC,EACAC,GAAiB3R,gBAACgsE,EAAsBtnE,iBAAKiN,IAC7CC,GAAiB5R,gBAACisE,EAAsBvnE,iBAAKkN,MAIzCu6D,EAA2D,QAAC,sBAAEp5D,EAAF,aAAyBE,EAAzB,QAAuCC,EAAvC,UAAgDC,GAAjD,SACpEnT,gBAAC6kC,OAAIngC,iBAAKqO,GACLG,EACDlT,gBAAC6kC,OAAIngC,iBAAKuO,GACLE,EAAU1N,IAAI2mE,GACXpsE,gBAACksE,EAAiBxnE,eAAC2P,IAAK+3D,EAAS56D,QAAY46D,QAMhDC,EAA6E,QAAC,sBAAEt5D,EAAF,aAAyBE,EAAzB,QAAuCC,EAAvC,UAAgDC,EAAhD,eAA2D6B,EAA3D,mBAA2ED,GAA5E,SACtF/U,gBAAC6kC,OAAIngC,iBAAKqO,GACLgC,EACAC,EACA9B,EACDlT,gBAAC6kC,OAAIngC,iBAAKuO,GACLE,EAAU1N,IAAI2mE,GACXpsE,gBAACssE,EAAmC5nE,eAAC2P,IAAK+3D,EAAS56D,QAAY46D,QAMlEE,EAA2D,QAAC,SAAE76D,EAAF,KAAYC,EAAZ,cAAkBC,EAAlB,cAAiCC,GAAlC,SACpE5R,gBAAC6kC,OAAIngC,iBAAK+M,GACLC,EACAE,GAAiB5R,gBAACisE,EAAsBvnE,iBAAKkN,MAIzC26D,EAAqE,QAAC,cAAEz7D,EAAF,MAAiBC,EAAjB,SAAwB/C,GAAzB,SAC9EhO,gBAAC6kC,OAAIngC,iBAAKoM,GACLC,EACA/C,IAIIw+D,EAA2C,QAAC,UAAEl3D,EAAF,OAAaC,EAAb,QAAqBrC,EAArB,SAA8ByC,EAA9B,eAAwCC,EAAxC,aAAwDC,EAAxD,cAAsEC,EAAtE,iCAAqFC,GAAtF,SACpD/V,gBAAC6kC,OAAIngC,iBAAK4Q,GACNtV,gBAAC6kC,OAAIngC,iBAAK6Q,GACLrC,EACAyC,QAEiCpT,IAArCwT,GAAkDH,GAAkB5V,gBAACmsE,EAAsBznE,iBAAKkR,SAC3DrT,IAArCwT,GAAkDD,GAAiB9V,gBAACmsE,EAAsBznE,iBAAKoR,SAC1DvT,IAArCwT,GAAkDF,GAAgB7V,gBAACmsE,EAAsBznE,iBAAKmR,SACzDtT,IAArCwT,EAAiDA,EAAiCtQ,IAAI,CAACiM,EAAMhM,IACnF1F,gBAACqsE,EAAwC3nE,iBAAKgN,EAAI,CAAE2C,IAAK3O,MAC/D,OAIP+mE,EAAiD,QAAC,QAAEv5D,EAAF,MAAW8iB,GAAZ,SACnDh2B,uBAAKC,UAAU,6BACViT,EACDlT,uBAAKC,UAAU,4BACV+1B,GACGh2B,gCACKg2B,EAAM+gB,SACN/gB,EAAMshB,SACNthB,EAAMpL,YACNoL,EAAMihB,IACNjhB,EAAMgiB,eACNhiB,EAAM6hB,QACN7hB,EAAM0hB,SACN1hB,EAAMmhB,eAOrBu1B,EAA4D,QAAC,QAAEx5D,EAAF,MAAW8iB,GAAZ,SAC9Dh2B,uBAAKC,UAAU,+BACViT,EACDlT,uBAAKC,UAAU,8BACV+1B,GACGh2B,gCACKg2B,EAAMk8B,SACNl8B,EAAM0hB,SACN1hB,EAAM6hB,QACN7hB,EAAMmhB,eAqFZw1B,UA9EoChrE,IAC/C,MAAM,iCACFwI,EADE,+CAEFsnB,EAFE,QAGFm7C,EAHE,cAIFC,EAJE,YAKFC,EALE,cAMFC,EANE,eAOF1pE,EAPE,UAQF2pE,EARE,UASFC,EATE,iBAUFC,EAVE,UAWFC,EAXE,sBAYFC,EAZE,uBAaFC,EAbE,wBAcFC,EAdE,kBAeFC,EAfE,QAgBFC,EAhBE,MAiBFrZ,EAjBE,MAkBF9zD,EAlBE,WAmBFotE,EAnBE,aAoBFC,EApBE,sBAqBFC,EArBE,UAsBFx6D,EAtBE,iBAuBFy6D,EAvBE,mBAwBFC,EAxBE,mBAyBFC,GACAnsE,EAEJ,OACI3B,gBAAColC,SAAM1gC,iBAAKmoE,IACNE,GAAiB/sE,gBAAC6kC,OAAIngC,iBAAKooE,GACxBzsE,IAEH0sE,GAAiB5iE,GAAoCsnB,IAAmD0iC,IAAUqZ,GAChHxtE,gBAAC+M,UAAO,CAAC9M,UAAU,yCACrB8sE,GACE/sE,gBAAC6kC,OAAIngC,iBAAKsoE,GACLQ,EACArZ,EACAyY,GACG5sE,gCACIA,gBAAC6kC,OAAIngC,iBAAKuoE,GACLQ,EACDztE,gBAAC6kC,OAAIngC,iBAAK4oE,GACLO,GAEL7tE,gBAAC6kC,OAAIngC,iBAAKwoE,GACLU,EACAE,IAGT9tE,gBAAC6kC,OAAIngC,iBAAKyoE,GACJ9pE,EAA+EsqE,GAAyB3tE,gBAAC0sE,EAAuBhoE,iBAAKipE,IAApHD,GAAgB1tE,gBAACysE,EAAqB/nE,iBAAKgpE,IAC9D1tE,gBAAC6kC,OAAIngC,iBAAK0oE,GACNptE,gBAAC6kC,OAAIngC,iBAAK4oE,GACLO,GAEJD,EACAE,GAEJ36D,GAAanT,gBAACwsE,EAAkB9nE,iBAAKyO,IACtCnT,gBAAC6kC,OAAIngC,iBAAK2oE,GACNrtE,gBAAC6kC,OAAIngC,iBAAK4oE,GACLO,GAEJD,EACAE,MAMxBf,GAAiBQ,K,mZCnLvB,MAAMQ,EAA4BpgE,IACrC,MACI1K,MAAM,SAAEC,GACRmB,WAAW,iBACPijD,EADO,aAEPC,EAFO,oBAGPjE,GALF,QAOFv/C,EAPE,SAQFI,EARE,GASFD,EATE,UAUFF,GACA2J,EAEEvK,EAAemB,IAAIrB,EAAU,uBAC7BqF,EAAOhE,IAAIrB,EAAU,4BAE3B,MAAO,CACHgQ,QAASlT,sBAAIC,UAAU,gCACjBqjD,GAENttB,MAAO5yB,WAAcC,eAAiBgkD,YAAe,CACjDjQ,gBAAiBkQ,EACjBC,eACAh/C,OACAxE,UACAI,WACAH,YACAE,KACAqD,cAAerE,EAASC,cACvBZ,I,yoBCwEb,IAAM8/C,EAAN,cAAuBriD,gBAAvB0B,+CAgDW,KAAA0J,MAAwB,CAC3B9F,aAAc,GACd0oE,oBAAoB,EACpBC,qBAAqB,GAGR,KAAArtE,iBAAsC4J,6BAAmBrI,KAAKR,MAAMoC,QAAQkE,QAAQwC,kBACjGtI,KAAKR,MAAM+I,aACXvI,KAAKR,MAAMqC,WAwRR,KAAAkqE,4BAA+B5jE,GAAyCnI,KAAKR,MAAMgB,OAAOwrE,gBAAiB76D,KAAOhJ,EAAMiJ,OAAO/S,MAMrH,KAAAuB,UAAY,KACjBI,KAAKisE,YAAkC,YAApBjsE,KAAKisE,YAA4BjsE,KAAKksE,cAAgBlsE,KAAKiJ,MAAM4iE,mBAQ/E,KAAAM,aAAgBj6D,IAC7B,MAAM,MAAEq6B,GAAUvsC,KAAKR,MACvB,OAAO+sC,GAASA,EAAMr6B,IAAQq6B,EAAMr6B,GAAK9Q,OAAS,EAAImrC,EAAMr6B,QAAO9R,GAMtD,KAAAgsE,6BAA+BrsE,UAA0B,MACtEC,KAAK0V,SAAS,CAAEo2D,qBAAqB,UAErC,UAAM9rE,KAAKR,MAAMsB,KAAKC,SAASC,cAA/B,aAAM,EAAiCqrE,yCACnC,CAAEC,uCAAwCtsE,KAAKR,MAAMsB,KAAKC,SAASC,OAAOurE,uCAOjE,KAAAC,aAAezsE,UAA0B,MACtD,MACImC,WAAW,+BAAEuqE,EAAF,oBAAkC9mE,EAAlC,+BAAuD+mE,GAClE9qE,SAAS,cAAE6F,EAAesX,KAAOve,QAAQ,iBAAEqf,GAAmB,KAC9D0sB,OAAO,kBAAE6+B,GACTtqE,MAAM,SAAEC,EAAF,SAAY+R,IAClB9S,KAAKR,MAGT,GAAI,UAACQ,KAAKR,MAAMsB,KAAKC,SAASC,cAA1B,OAAC,EAAiCC,aAAaC,iBAAkB2e,WAC3D7f,KAAK2sE,yBAAyB5rE,GAAUE,aAAamF,WAAa0M,IAKrE,CAAC,IAAD,IACH,MAAM85D,EAAuBxB,GAAqBA,EAAkBhqE,OAAS,EAEvE0tB,QAA2B9uB,KAAK6sE,4BAA2B,UAAA7sE,KAAKR,MAAMsB,KAAKC,SAASC,cAAzB,eAAiCkuB,qBAAsB,UAElH49C,YAAWrlE,EAAezH,KAAKR,MAAMsB,KAAKC,SAASC,OAAQhB,KAAKR,MAAMsB,KAAKgS,SAAS9R,QACrF4rE,EAAsB99C,EAAoB9uB,KAAKgI,kCAAkCnC,MAAM/D,IAAQ,QAChG,IAAIqB,EAAewC,EAEf7D,GAAwB,2DAAfA,EAAMzC,OACf8D,EAAeupE,GAIf,UAAA1sE,KAAKR,MAAMsB,KAAKC,SAASC,cAAzB,SAAiCsuB,gDAAjC,UAAmFxtB,EAAMhB,YAAzF,OAAmF,EAAYoyB,oBAC9FlzB,KAAKgI,mCAIVhI,KAAK0V,SAAS,CACVvS,iBAEJnD,KAAKR,MAAMqC,UAAUyc,UAAUxc,YAGnC,UAAMf,EAASC,cAAf,aAAM,EAAiB+rE,qCAAqC,CAAEC,mCAAmC,UA7BjGhtE,KAAK0V,SAAS,CACVvS,aAAcspE,IAElBzsE,KAAKR,MAAMoC,QAAQC,UAAUC,MAAM2qE,IAmC1B,KAAAI,2BAA6B9sE,UAAqE,UAC/G,MAAMmG,EAAqB,UAAGlG,KAAKR,MAAMoC,QAAQkE,QAAQE,eAA9B,aAAG,EAAoCG,sBAE5D8mE,EAAsB,UAAGjtE,KAAKR,MAAMsB,KAAKC,SAASC,cAA5B,iBAAG,EAAiCC,aAAamF,KAAKC,iBAAtD,aAAG,EAA8DC,OACzFC,GAAaA,EAAStB,cAA0C,KAA1BsB,EAAStB,cAAuBsB,EAAStB,eAAiBiB,GAGpG,IAAI4oB,EACJ,GAAIm+C,GAA0BA,EAAuB7rE,OAAS,EAAG,CAC7D,MAAM8rE,EAA0DD,EAAuB3pE,IAAI8pB,IAChF,CAAE/d,OAAQ+d,EAAK/d,OAClB89D,sBAAuB,CACnBC,eAAgBlnE,EAChBmnE,4BAA6BC,IAAuBC,mBACpDC,+BAAgCzU,YAKtC0U,gDACF,CAAEjmE,cAAexH,KAAKR,MAAMoC,QAAQ6F,sBAC7BzH,KAAKR,MAAMsB,KAAKC,UAAUE,aAAamF,KAAKQ,GACnDsmE,GACFznE,KAAKioE,IACH5+C,EAAqB4+C,EAAY56C,UAClCjtB,MAAM/D,IAEL,MADA9B,KAAKR,MAAMoC,QAAQ6F,cAAc5F,UAAUyc,UAAUxc,GAC/C,IAAI0oB,MAAM,wGAIxB,OAAOsE,GASM,KAAA69C,kBAAoB5sE,MAAOqG,EAAY0M,KAA+C,MACnG,IAAI65D,GAAoB,EACxB,MAAMzmE,EAAqB,UAAGlG,KAAKR,MAAMoC,QAAQkE,QAAQE,eAA9B,aAAG,EAAoCG,sBAyClE,aAvCMwnE,4CACF,IAAIC,wCAAsC5tE,KAAKR,MAAMoC,QAAQ6F,cAAc8L,eAAeiG,aAC1FxZ,KAAKR,MAAMoC,QAAQ6F,eACrBhC,KAAKooE,IAA8B,QACjC,MAAMC,EAAuE,GAE7E,UAAA1nE,EAAKC,iBAAL,SAAgB/C,IAAKskB,IAAY,MAE7B,MAAMmmD,EAAkBj7D,EAASvR,KAAK0K,GAAWA,EAAQI,WAAaub,EAAS1b,WAGzE8hE,EAAgBD,SAAH,UAAGA,EAAiBn0B,gBAApB,aAAG,EAA2Bq0B,iBAC3C7+D,KAAmBwY,EAAS3iB,cAA0C,KAA1B2iB,EAAS3iB,eAAuB2iB,EAAS3iB,eAAiBiB,EAE5G,MADkC8nE,GAAiB5+D,IAClBmQ,kBAAgBC,YAAYquD,GAA8B,CACvF,MAAM51B,EAA2B41B,EAA4BtsE,KAAM2sE,IAAoB,MACnF,OAAO,UAAAA,EAAiBnuD,gCAAjB,eAA2C7T,aAAe0b,EAAS1b,YAE1E+rC,GACA61B,EAAoC97D,KAAKimC,MAKrD,MAAMk2B,EAA+BtuB,qCAA0B,UAC3Dz5C,EAAKC,iBADsD,QACzC,GAClBynE,EACA9tE,KAAKR,MAAMoC,QAAQ6F,cACnBqL,EACA5M,GAIJ,OADAymE,GAAqBwB,EAA6BruB,QAC3C6sB,IACR9mE,MAAM/D,IAEL,MADA9B,KAAKR,MAAMoC,QAAQ6F,cAAc5F,UAAUyc,UAAUxc,GAC/C,IAAI0oB,MAAM,oGAGbmiD,GAOM,KAAAyB,2BAA6B,KAC1C,MAAM,SAAErhB,EAAF,UAAYW,GAAc1tD,KAAKR,MAAMS,YAC3C,OAAO8sD,EACFzpD,IAAIoqD,GACJpnD,OAAQ2C,KAA0CA,IAAUA,EAAMwhC,YAAcxhC,EAAMokD,iBAM9E,KAAAghB,iBAAmB,KAChCruE,KAAKouE,6BAA6Bt8D,QAAQ7I,IACtCA,EAAME,SAAWF,EAAMolE,kBAAoBplE,EAAMolE,sBAQxC,KAAAC,mBAAsBC,IACnC,MAAMC,EAAen7D,IAAoB,OAAQrT,KAAKR,MAAMoC,QAAQ6F,gBAAkB,GAClF+F,QAAUghE,EACVhhE,OAAO3B,SAASohB,OAAOuhD,IAEvBxuE,KAAK0V,SAAS,CACVvS,aAAcnD,KAAKR,MAAM0C,UAAUyD,sBAEvC3F,KAAKR,MAAMoC,QAAQC,UAAUC,MAAMysE,KAQ1B,KAAAE,oBAAsB,WAAgC,oBAA/BC,IAA+B,yDACnE,MAAMH,EAA8B,0DAC9BnoE,EAAO,EAAK5G,MAAMsB,KAAKC,SAASC,OAAQC,aAAamF,MACrD,GAAEQ,EAAF,QAAMksB,GAAY1sB,EAClByY,GAA0C,YAAKrf,MAAMsB,KAAK2I,aAAazI,cAA7B,mBAC1CO,KAAKkI,GAAsC,oEAAtBA,EAAaE,aADQ,eACqEC,aAAa,EAC5HkV,EAAuC,UAAG,EAAKtf,MAAMoC,eAAd,iBAAG,EAAoBkE,eAAvB,iBAAG,EAA6BiZ,WAAhC,iBAAG,EAAkCC,gBAArC,aAAG,EAA4CC,iCACtFC,EAAe,EAAK1f,MAAMsB,KAAKqe,oBAAoBne,OAEnDoe,EAAgG,QAA5CN,GACrDI,IAC6C,QAA5CJ,GAAqDI,EAAaG,OACvB,QAA5CP,IAAsDI,EAAaG,OACpER,GAA2CO,EACvC0T,GAAWlsB,EACX+nE,mCAAyB,CAAEnnE,cAAe,EAAKhI,MAAMoC,QAAQ6F,cAAewrB,YAAa,QAAUrsB,EAAIksB,GAClGrtB,KAAMzE,IAAqC,MACa,KAAjD,UAAAA,EAAO4tE,qCAAP,eAAsCxtE,QACtC,EAAKktE,mBAAmBC,GAExB,EAAK74D,SAAS,CAAEm2D,oBAAoB,MAG3ChmE,MAAO/D,IAGJ,GAFA,EAAKtC,MAAMqC,UAAU6e,QAAQ5e,GAC7B,EAAKtC,MAAMqC,UAAU0c,MAAM,2BACvBmwD,GAAwB,2DAAf5sE,EAAMzC,KAAmE,CAAC,IAAD,EAClF,MAAMqH,EAAS,UAAG,EAAKlH,MAAMsB,KAAKC,SAASC,cAA5B,aAAG,EAAiCC,aACnDyF,WAAW6sB,YAAY,IAClB9tB,KAAK,KACF,EAAKgpE,qBAAoB,KAE5B5oE,MAAOgpE,IACJ,EAAKrvE,MAAMqC,UAAU6e,QAAQmuD,EAAa7wE,SAC1C,EAAKwB,MAAMqC,UAAU0c,MAAM,iCAGnC,EAAK+vD,mBAAmBC,KAIpC,EAAKD,mBAAmBC,GAG5B,EAAK74D,SAAS,CAAEm2D,oBAAoB,KA3kBpB,uBACpB,iBAAO7rE,KAAKR,MAAMsB,KAAKC,gBAAvB,aAAO,EAA0BR,OAGZ,4BACrB,GAAIP,KAAK8uE,gBAEL,OAAO,EAEX,MAAM1oE,EAAI,UAAGpG,KAAKR,MAAMsB,KAAKC,gBAAnB,iBAAG,EAA0BC,cAA7B,iBAAG,EAAkCC,oBAArC,aAAG,EAAgDmF,KAC7D,QAA2B,YAApBpG,KAAKisE,aAA8B7lE,GAAS08C,IAAQ18C,IAAWA,EAAKC,WAAuC,IAA1BD,EAAKC,UAAUjF,QAGrF,yBAClB,MAAMgF,EAAI,UAAGpG,KAAKR,MAAMsB,KAAKC,gBAAnB,iBAAG,EAA0BC,cAA7B,iBAAG,EAAkCC,oBAArC,aAAG,EAAgDmF,KAC7D,MAA2B,WAApBpG,KAAKisE,YAAgD,YAApBjsE,KAAKisE,cAA8B7lE,GAAQ08C,IAAQ18C,IAGlE,sBACzB,OAAOpG,KAAKR,MAAMoC,QAAQkE,QAAQipE,OAAOC,SAGQ,uCACjD,MAAM,gBAAExmE,EAAF,MAAmBC,GAAUzI,KAAKR,MAAMoC,QAAQkE,QACtD,SAAW0C,GAAoBC,GAAsB,MAAbA,EAAMC,IAGvB,8BACvB,MAAMumE,EAA8BjvE,KAAKR,MAAMsB,KAAKC,SAASC,SAAzB,UAAmChB,KAAKR,MAAMsB,KAAKC,SAASC,cAA5D,aAAmC,EAAiCiuE,6BAElG3/C,EAA8C,oBAAGtvB,KAAKR,MAAMsB,KAAKC,SAASC,cAA5B,aAAG,EAAiCsuB,sDAApC,SAGpD,OAAOtvB,KAAKR,MAAMS,YAAYkJ,eACG/I,IAAhC6uE,GACGA,GACA3/C,KAC0B,KAA5BtvB,KAAKiJ,MAAM9F,cAAuBmsB,GAAmDtvB,KAAKgI,kCAGvE,0BACrB,QAAQ,UAAChI,KAAKR,MAAMsB,KAAKC,SAASC,cAA1B,iBAAC,EAAiCC,oBAAlC,QAAC,EAA+CmF,OACL,YAA/CpG,KAAKR,MAAMsB,KAAKqe,oBAAoB5e,QACI,YAAxCP,KAAKR,MAAMsB,KAAK2I,aAAalJ,OAa9BkrD,oBACH,MACIvpD,WAAW,oBAAEyD,IACb3F,KAAKR,MAETmJ,YACI,IAAM3I,KAAKqJ,SACX,KACIrJ,KAAK0V,SAAS,CACVvS,aAAcwC,IAElB3F,KAAKR,MAAMoC,QAAQC,UAAUC,MAAM,wBAI3C6G,YACI,IACW3I,KAAKksE,YAEhB,KACIlsE,KAAKsuE,mBAAmB,8CAIhC3lE,YACI,IAAM3I,KAAKkvE,YACX,KACIlvE,KAAKyuE,wBAIb5lE,YACI,IAAM7I,KAAKR,MAAMS,YAAYkJ,QAC7B,KACInJ,KAAKquE,qBAKbxlE,YACI,4BAAM7I,KAAKR,MAAMsB,KAAKC,SAASC,cAA/B,aAAM,EAAiCmuE,gCACvCpvE,UAAkB,QACV,UAACC,KAAKR,MAAMsB,KAAKC,SAASC,cAA1B,OAAC,EAAiCkH,0BAAlC,UACAlI,KAAKR,MAAMsB,KAAKC,SAASC,cADzB,QACA,EAAiCsuB,iDAAkDnmB,GAClFnJ,KAAKR,MAAMsB,KAAKC,SAASC,OAAOouE,4BAC5BpvE,KAAKiJ,MAAM6iE,qBACZ9rE,KAAK0V,SAAS,CAAEo2D,qBAAqB,UAGnC9rE,KAAKwsE,eAGNxsE,KAAKR,MAAMsB,KAAKC,SAASC,OAAOquE,+BACjCrvE,KAAK0V,SAAS,CAAEo2D,qBAAqB,OAOrDjjE,YACI,4BAAM7I,KAAKR,MAAMsB,KAAKC,SAASC,cAA/B,aAAM,EAAiCsuE,mCACtCjmE,IAAY,MACL,UAAArJ,KAAKR,MAAMsB,KAAKC,SAASC,cAAzB,SAAiCsuB,gDAAkDjmB,GACnFrJ,KAAK0V,SAAS,CAAEo2D,qBAAqB,MAMjDjjE,YACI,IAAM7I,KAAKuvE,cACXxvE,UAAW,MACP,GAAI,UAAAC,KAAKR,MAAMsB,KAAKC,SAASC,cAAzB,SAAiCsuB,gDAAkDtvB,KAAKuvE,cAAe,CACvG,MAAM,gBAAE/mE,EAAF,MAAmBC,GAAUzI,KAAKR,MAAMoC,QAAQkE,WAC5B0C,IAAmBC,GAAsB,MAAbA,EAAMC,WAElD1I,KAAKR,MAAMsB,KAAKC,SAASC,OAAOwuE,uCAAuC,CACzEC,qCAAqC,OAStDvmE,SAAM,kCACT,MAAM,YACFjJ,EACAO,QAAQ,UAAE1C,EAAF,gBAAakuE,EAAb,0BAA8B0D,GAFpC,UAGFxtE,EACAN,SACIkE,SACIwgB,MAAM,gBACF+K,MAIZrxB,KAAKR,OACH,aAAE2D,GAAiBnD,KAAKiJ,OACxB,eAAE0mE,EAAF,eAAkBC,EAAlB,mBAAkCC,EAAlC,6BAAsDC,EAAtD,oBAAoFnqE,GAAwBzD,EAC5G6tE,EAAgBl/D,IAAW,cAAe/S,GAC1CkyE,EAAsBhwE,KAAKmsE,aAAa,uBAExC8D,EACFjwE,KAAKR,MAAMoC,QAAQkE,SACnB9F,KAAKR,MAAMoC,QAAQkE,QAAQoqE,SAC3BlwE,KAAKR,MAAMoC,QAAQkE,QAAQoqE,QAAQD,gBACnCjwE,KAAKR,MAAMoC,QAAQkE,QAAQoqE,QAAQD,iBAEjCv3D,EACF1Y,KAAKR,MAAMoC,QAAQkE,SACnB9F,KAAKR,MAAMoC,QAAQkE,QAAQ+d,QACgC,WAA1D7jB,KAAKR,MAAMoC,QAAQkE,QAAQ+d,OAAOC,KAEjCy7B,EAAoBlsC,IAAoB,OAAQrT,KAAKR,MAAMoC,QAAQ6F,gBAAkB,GACrF+mE,EAAen7D,IAAoB,OAAQrT,KAAKR,MAAMoC,QAAQ6F,gBAAkB,GAEhFikE,EACF1rE,KAAKR,MAAM+sC,MAAMm/B,oBACjB1rE,KAAKR,MAAM+sC,MAAMm/B,mBAAmBtqE,OAAS,GAC7CpB,KAAKR,MAAM+sC,MAAMm/B,mBAAmB,GAElC/sE,EAAUC,2BAAiB,QAASoB,KAAKvB,iBAAkBI,oBAAkByhD,gBAC7E6vB,EAA2BnxE,iCAAuBgB,KAAKvB,iBAAkBE,GAEzEuC,EAAiBlB,KAAKR,MAAMsB,KAAKC,WAAhB,UAA4Bf,KAAKR,MAAMsB,KAAKC,SAASC,cAArD,aAA4B,EAAiCC,aAAaC,gBAC3FkvE,EAAkBlvE,EAAiB2uE,EAAqBD,EAGxDtgD,EAA8C,oBAAGtvB,KAAKR,MAAMsB,KAAKC,gBAAnB,iBAAG,EAA0BC,cAA7B,aAAG,EAAkCsuB,sDAArC,SAG9CpnB,EAAwB,oBAAGlI,KAAKR,MAAMsB,KAAKC,gBAAnB,iBAAG,EAA0BC,cAA7B,aAAG,EAAkCkH,gCAArC,SAGxBmoE,EAAkB,UAAGrwE,KAAKR,MAAMsB,KAAKC,gBAAnB,iBAAG,EAA0BC,cAA7B,aAAG,EAAkCqvE,mBAGvDC,EAAmB,UAAGtwE,KAAKR,MAAMsB,KAAKC,gBAAnB,iBAAG,EAA0BC,cAA7B,aAAG,EAAkCsvE,oBAGxDC,EAAqB,UAAGvwE,KAAKR,MAAMsB,KAAKC,gBAAnB,iBAAG,EAA0BC,cAA7B,aAAG,EAAkCuvE,sBAG1DtB,GAA2B,UAAGjvE,KAAKR,MAAMsB,KAAKC,gBAAnB,iBAAG,EAA0BC,cAA7B,aAAG,EAAkCiuE,4BAEtE,IAAInlE,GAAS,OACN9J,KAAKR,OADC,IAET1B,UAAWiyE,EACX7D,YAAalsE,KAAKksE,YAClB+D,iBACA5mE,SAAUrJ,KAAKqJ,SACfrB,iCAAkChI,KAAKgI,iCACvCsnB,iDACAs7C,cAAe5qE,KAAKR,MAAMsB,KAAKC,eAAgDX,IAApCJ,KAAKR,MAAMsB,KAAKC,SAASC,aAAuEZ,IAA/CJ,KAAKR,MAAMsB,KAAKC,SAASC,OAAO+xB,WAC5H7xB,iBACA+qE,WAAYjsE,KAAKisE,WACjBvzD,WACA6mC,oBACAivB,eACAM,gBAAiB9uE,KAAK8uE,gBACtB1D,kBAAmBprE,KAAKR,MAAM+sC,MAAM6+B,mBAAqBprE,KAAKR,MAAM+sC,MAAM6+B,kBAAkBhqE,OAAS,EAAIpB,KAAKR,MAAM+sC,MAAM6+B,kBAAkB,QAAKhrE,EACjJsqE,cAAe,CAAEpgE,YAAatK,KAAKR,MAAO1B,UAAWiyE,GACrDpF,YAAa,CAAE7sE,UAAW,qBAC1B+sE,UAAW,CAAE/sE,UAAW,qBACxBgtE,UAAW,CAAEhtE,UAAW,qBACxBitE,iBAAkB,CAAEjtE,UAAW,6BAC/BktE,UAAW,CAAEltE,UAAW,qBACxBmtE,sBAAuB,CAAEntE,UAAW,mCACpCotE,uBAAwB,CAAEptE,UAAW,oCACrCqtE,wBAAyB,CAAErtE,UAAW,qCACtCI,MAAO8tE,GACHhsE,KAAKwwE,mBAAmBxE,KAIhC,IAAKiE,GAAkB5+C,EACnBvnB,GAAS,OACFA,IADE,IAELkoD,MAAOn0D,gBAAC4yE,IAAcluE,iBAAK,CAAEvE,QAAS8xE,YAEvC,GAAI9vE,KAAKJ,YACZkK,GAAS,OACFA,IADE,IAELuhE,QAASxtE,gBAAC+M,UAAO,CAAC9M,UAAU,+CAE7B,GAAIkC,KAAKqJ,SACZS,GAAS,OACFA,IADE,IAELkoD,MAAOn0D,gBAAC4yE,IAAcluE,iBAAK,CAAEvE,QAAS2H,WAEvC,CAAC,IAAD,GACHmE,GAAS,OACFA,IADE,IAELkoD,MAAO7uD,GAAgBtF,gBAAC4yE,IAAcluE,iBAAK,CAAEvE,QAASmF,KACtDsnE,SAAS,EACTa,WAAY0E,EACRnyE,gBAAC6yE,IAAmBnuE,iBACZ,CACA0M,MAAO+gE,EACP/vE,cACAyvE,4BACAiB,SAAUzuE,EACVqR,eAAgBvT,KAAKR,MAAMoC,QAC3B8W,WACAs2D,SAAUhvE,KAAK8uE,gBACfrwE,iBAAkBuB,KAAKvB,iBACvBuJ,iCAAkChI,KAAKgI,iCACvCsnB,iDACAjmB,WAAYlG,EACZktE,qBACAC,sBACAC,wBACAtB,uCAIR7uE,EAEJmrE,aAAcqF,YAAgB5wE,KAAKR,OACnCgsE,sBAAuBI,EAAyB5rE,KAAKR,OACrDwR,UAAW9P,OAAiBd,EAAYmL,YAAavL,KAAKR,MAAOQ,KAAKvB,kBACtEgtE,iBACI5tE,gBAACgzE,IAAyBtuE,iBAAK,CAC3B6tE,kBACAtD,YACK5kE,GAA4BonB,EAC7BtvB,KAAKosE,6BAA+BpsE,KAAKwsE,aAE7C+C,cAAevvE,KAAKuvE,cACpB9wE,iBAAkBuB,KAAKvB,iBACvB6wB,+CAA8C,WAAEtvB,KAAKR,MAAMsB,KAAKC,SAASC,cAA3B,cAAE,GAAiCsuB,+CACjFw8C,oBAAqB9rE,KAAKiJ,MAAM6iE,oBAChC5jE,8BAGRwjE,qBACAC,mBAAoBpsB,GAChB1hD,gBAACiG,SAAMvB,eACHzE,UAAU,yCACVI,MAAOyxE,EACP5rE,MAAM,YACN0J,KAAM8xC,GACF4wB,GAEHR,KAMjB,OAAO3vE,KAAKR,MAAMwL,WAAWlB,IAQ1B0mE,mBAAmBxE,GACtB,OACInuE,gBAACwV,IAAa9Q,iBACNypE,EAAe,CACnBjpE,IAAKipE,EAAgBjpE,KAAO,KAC5BjF,UAAU,qBACVqT,KAAM66D,EAAgB76D,KACtBmC,UAAW,CAAEpT,OAAQF,KAAK+rE,4BAA6Bx4D,eAAgBvT,KAAKR,MAAMoC,QAAQkE,cApU5FmF,aAATE,KAAS,+BAIAF,aAATE,KAAS,gCASAF,aAATE,KAAS,6BAKAF,aAATE,KAAS,oCAIAF,aAATE,KAAS,qDAKAF,aAATE,KAAS,kCAaAF,aAATE,KAAS,gCA1CR+0C,EAAQ,aAFb70C,kBACAC,KACK40C,GAklBSA,a,kCClsBf,0EA8BO,SAAS4wB,EACZ5lC,EAAqDj/B,GAErD,IAAKi/B,IAAoC3rB,kBAAgBC,YAAYvT,EAAQ8kE,iBACzE,OAEJ,MAAMC,EAAqB/kE,EAAQ8kE,gBAAgBxvE,KAAK0R,GAAaA,EAAU5G,WAAa6+B,GAC5F,OAAI8lC,EACOA,EAAmBC,eAD9B,EAMG,MAAMvkC,EAAgE,IAaxE,IAbyE,SAC1E55B,EAD0E,QAE1ElR,EAF0E,cAG1E0K,EAH0E,UAI1EpK,EAJ0E,WAK1EyqC,EAL0E,SAM1ElN,EAN0E,oBAO1EyM,EAP0E,iBAQ1EztC,EAR0E,cAS1EmuC,EAT0E,gCAU1E1B,EAV0E,qBAW1E2B,EAX0E,gCAY1ElI,GACC,EACD,MAAMsmB,EAA2C,CAC7CC,oBAAqBhpD,EAAUgpD,qBAEnC,OAEIrtD,sBAAIC,UAAU,iBACTgV,EAASxP,IAAI,CAAC2I,EAA8B1I,IACzC1F,sBAAIC,UAAU,iCAAiCoU,IAAK3O,GAChD1F,gBAACstD,mBAAgB,CACbvpD,QAASA,EACTnD,iBAAkBA,EAClB6N,cAAeA,EACf3J,cAAeT,EAAUD,UACzBiM,kBAAmBhM,EAAUgM,kBAC7BC,iBAAkBjM,EAAUiM,iBAC5Bi9C,gBAAiBlpD,EAAUkpD,gBAC3B/e,UAAWH,EACXnqC,GAAI09B,EACJvtB,IAAKjG,EAAQI,SACbrK,SAAU2qC,EACV7rC,KAAM,CAAEmL,WACRo/C,gBAAiBze,EACjBskC,eAAgBJ,EAAkB5lC,EAAiCj/B,GACnE4gC,qBAAsBA,EACtBoe,eAAgBA,EAChBkmB,oBAAqBjvE,EAAUivE,oBAC/B7lB,wBAAyB3mB,aAAF,EAAEA,EAAiCpjC,KACtDgqD,GAAyBhsC,kBAAgBC,YAAY+rC,IACrDA,EAAsB,GAAGC,kBAAoBv/C,EAAQyW,wB,uLCjEjF,IAAqB2oB,EAArB,cAA2CxtC,gBA0BvC0B,YAAYC,GACRC,MAAMD,GA1BO,KAAA4xE,iBAA2B,gBAqH3B,KAAAvW,SAAYrlD,IACzBA,EAAEC,iBACFD,EAAE67D,kBAEF,MAAMjgE,EAASoE,EAAEpN,cACXimC,EAAWj9B,EAAOkgE,aAAa,SAAUllD,SAAS,6BAClDyiB,EAAkBR,OAAWjuC,EAAYJ,KAAKuxE,0BAA0BngE,GAE1EpR,KAAKR,MAAMqsC,iBACX7rC,KAAKR,MAAMqsC,gBAAgB,CACvBwC,WACAmjC,YAAapgE,EACbw9B,cAAeC,EACf4iC,gBAAiBrgE,EAAOsgE,eAvGhC1xE,KAAKrB,QAAUC,2BAAiB,QAASoB,KAAKR,MAAMf,iBAAmB,IAvB1C,gCAC7B,IAAI,gBAAEgtC,GAAoBzrC,KAAKR,MAC/B,MAAM,gCAAE0rC,EAAF,iBAAmCQ,GAAqB1rC,KAAKR,MAWnE,OATI,UAAAQ,KAAKR,MAAMoC,eAAX,eAAoBmd,IAAIve,OAAOuqC,+BAAgCC,IAAqCC,UACpGQ,EAAkBA,EAAgBnlC,OAAOqrE,IACrC,MAAMC,EAASlmC,EAAiBnqC,KAE3BswE,KAA0CA,EAAU3vC,OAAO3gC,KAAMlD,GAA+BuiC,YAA8BviC,EAAOszE,KAE1I,OAAOC,GAAUA,EAAOvlE,WAAa6+B,KAGtCO,EAAgBnoC,IAAKurC,IACjB,CACH38B,IAAKlS,KAAK8xE,uBAAuBjjC,GACjCxwC,MAAOwwC,KAUZ3lC,SACH,MAAM,aAAEoiC,EAAF,MAAgB18B,EAAhB,WAAuBib,EAAvB,gBAAmCmiB,EAAnC,eAAoDR,GAAmBxrC,KAAKR,MAC5EyP,EAAQjP,KAAK+xE,oBACnB/xE,KAAKrB,QAAQQ,cAAcC,MAAQksC,EACnC,MAAM0mC,EAAqBhzE,iCAAuBgB,KAAKR,MAAMf,iBAAmBuB,KAAKrB,SACrF,OACId,uBAAKC,UAAU,sBACVmR,EAAM7N,OAAS,GAAKwN,GAAS/Q,wBAAMC,UAAU,6BACzC8Q,GAEL/Q,sBAAIC,UAAW+S,IAAWgZ,EAAY,2BAA4B,kBAC7D5a,EAAM3L,IAAKiM,IACRvP,KAAKrB,QAAQQ,cAAcC,MAAQmQ,EAAK2C,IACxC,MAAMe,EAAYjU,iCAAuBgB,KAAKR,MAAMf,iBAAmBuB,KAAKrB,SAE5E,OACId,sBAAIC,UAAU,gCAAgCoU,IAAK3C,EAAK2C,KACpDrU,mCACIC,UAAU,2BACV2P,KAAMzN,KAAKR,MAAM+qC,WAAWh7B,EAAKlR,OAAO,GAAM,uBAC/BkR,EAAK2C,IAD0B,YACnB85B,GAC3B/nC,QAASjE,KAAK66D,SACd73D,KAAK,UACDiQ,GAEH1D,EAAK2C,IACNrU,wBAAMC,UAAS,UAAKkC,KAAKoxE,iBAAV,8BAAwDpuE,KAAK,SAAQ,aAAawoC,SAMpHv8B,EAAM7N,OAAS,GAAKkqC,GAAgBztC,mCACjC4P,KAAMzN,KAAKR,MAAM+qC,WAAW,IAAI,GAAOzsC,UAAU,iCAAoCk0E,EAAkB,CACvG/tE,QAASjE,KAAK66D,WACbvvB,IAMTwmC,uBAAuBrxC,GAC3B,MAAM,aAAEkL,EAAF,uBAAgBC,EAAhB,iBAAwCF,EAAxC,UAA0D7pC,GAAc7B,KAAKR,MAC7EyyE,EAAgBtmC,GAAgB,MAChCumC,EAActmC,EACpB,IAcIumC,EAdAC,EAAc,GAClB,GAAI1mC,GAAoBA,EAAiBnqC,KAAM,CAC3C,MAAMqwE,EAASlmC,EAAiBnqC,KAE3BswE,KAA0CA,EAAU3vC,OAAO3gC,KAAMlD,GAA+BuiC,YAA8BviC,EAAOoiC,KAGrImxC,EAGDQ,EAAcR,EAAOjW,SAAW,GAFhC95D,EAAU6e,QAAQ,oEAe1B,OAPIyxD,EADAhyC,YAAYM,EAAoBM,eACbmxC,EACdzhE,QAAQ,MAAOzQ,KAAK+kE,aAAatkC,EAAoBO,qBAAsBP,EAAoB4xC,WAC/F5hE,QAAQ,MAAOzQ,KAAK+kE,aAAatkC,EAAoBiB,sBAAuBjB,EAAoB4xC,WAElF5xC,EAAoB86B,+BAAiC96B,EAAoBO,sBAAwB,GAGjHixC,EAAcxhE,QAAQ,MAAO2hE,GAAa3hE,QAAQ,MAAO0hE,GAG5DpN,aAAaxzC,EAA4BC,GAC7C,IAAKD,IAAWC,EAEZ,OADAxxB,KAAKR,MAAMqC,UAAU+oD,MAAM,2CACpBr5B,GAAU,GAErB,IAAIvwB,EAASuwB,EAEb,IACIvwB,EAAShB,KAAKR,MAAMoC,QAAS8yD,iBAAiBC,eAAe9zC,OAAO0Q,GAASC,GAC/E,MAAO1vB,GACL9B,KAAKR,MAAMqC,UAAU6e,QAArB,qCAA2D1f,EAA3D,aAAsEc,IAG1E,OAAOd,EAqBHuwE,0BAA0BC,GAC9B,MAAMxwE,EAAShB,KAAK+xE,oBAAoBxwE,KAAK2gE,IAAasP,EAAYc,aAAed,EAAYc,YAAYntE,UAAY+8D,EAAShwD,KAClI,OAAQlR,GAAUA,EAAO3C,YAAU+B,IArI7B6K,aAATE,KAAS,wCALOkgC,EAAa,aADjC//B,KACoB+/B,GAAA,O,+ECfrB,MAwCMknC,EAAc,CAACjtD,EAA4BktD,EAAwBC,IAEjE50E,gBAAC6kC,OAAIngC,iBAAKiwE,GACN30E,gBAAC6kC,OAAIngC,iBAAKkwE,GACLntD,EAAK9Z,MACL8Z,EAAKotD,UACLptD,EAAKqtD,YAMhBC,EAA4B,CAC9BC,EACAC,EACAC,EACAC,EACAC,IAGIF,GACIl1E,gBAAC6kC,OAAIngC,iBAAKswE,GACNh1E,gBAAC6kC,OAAIngC,iBAAKuwE,GACLE,GAAwBC,GACvBD,GAAwBD,EAAmB5hE,KAAK7N,IAAI6N,GAC3CA,KAQzB+hE,EAA4B,CAC9BC,EACAC,EACAC,EACAL,EACAC,IAGII,GACIx1E,gBAAC6kC,OAAIngC,iBAAK4wE,GACNt1E,gBAAC6kC,OAAIngC,iBAAK6wE,GACLC,EAAmBn1E,MACnB80E,GAAwBC,GACvBD,GAAwBK,EAAmBpkE,MAAM3L,IAAI,CAACiM,EAAMhM,IAEtD1F,gBAAC6kC,OAAIngC,iBAAKgN,EAAK+jE,UAAS,CAAEphE,IAAK3C,EAAKxN,IAAMwB,IACtC1F,gBAAC6kC,OAAIngC,iBAAKgN,EAAKgkE,UACVhkE,EAAKikE,UACLjkE,EAAK4B,KACL5B,EAAKpN,WAWpCsxE,EAA6B,CAC/BC,EACAC,EACAC,EACAZ,EACAC,IAGIW,GACI/1E,gBAAC6kC,OAAIngC,iBAAKmxE,GACN71E,gBAAC6kC,OAAIngC,iBAAKoxE,GACLC,EAAoB11E,MACpB80E,GAAwBC,GACvBD,GAAwBY,EAAoBziE,KAAK7N,IAAI6N,GAC5CA,KAQhB0iE,UA7HgCr0E,IAC3C,MAAM,OACFm+D,EADE,qBAEFmW,EAFE,yBAGFC,EAHE,WAIF7S,EAJE,YAKF8S,EALE,eAMFnB,EANE,eAOFM,EAPE,gBAQFO,EARE,UASFZ,EATE,UAUFM,EAVE,WAWFO,EAXE,KAYFruD,EAZE,oBAaF2uD,EAbE,mBAcFC,EAdE,mBAeFC,EAfE,WAgBF3B,EAhBE,YAiBFC,EAjBE,MAkBF7jE,EAlBE,qBAmBFokE,EAnBE,cAoBFC,GACAzzE,EAEJ,OACI3B,gBAAColC,SAAM1gC,iBAAKo7D,GACP/uD,EACA2jE,EAAYjtD,EAA8BktD,EAAYC,GACvD50E,gBAAC6kC,OAAIngC,iBAAKyxE,GACL9S,GAAcA,EAAW9/D,OAAS,EAAIvD,gBAAC6kC,OAAIngC,iBAAKuxE,GAC5CC,GACK,GACTnB,EAA0BC,EAAgBC,EAAWoB,EAAoBlB,EAAsBC,GAC/FC,EAA0BC,EAAgBC,EAAWe,EAAoBnB,EAAsBC,GAC/FQ,EAA2BC,EAAiBC,EAAYM,EAAqBjB,EAAsBC,O,uSCiBpH,MAAM9iB,EAAkBC,GAAyCrwD,UAC7DoI,EAAMsN,uBACA26C,KAQJC,EAAyBC,GAA6DnoD,IACxF,MAAM9J,GAAS8J,EAAMiJ,OAAO/S,OAAS,IAAIoS,QAAQ,IAAIy4C,OAAO,OAAQ,MAAO,IAC3EoH,EAAsBjyD,IAQpBkyD,EAAsBC,GAAuDroD,IAC/E,MAAM9J,GAAS8J,EAAMiJ,OAAO/S,OAAS,IAAIoS,QAAQ,IAAIy4C,OAAO,OAAQ,MAAO,IAC3EsH,EAAmBnyD,IAQjBoyD,EAAsBC,GAAuDvoD,IAC/E,MAAM9J,GAAS8J,EAAMiJ,OAAO/S,OAAS,IAAIoS,QAAQ,IAAIy4C,OAAO,OAAQ,MAAO,IAC3EwH,EAAmBryD,IAGVsyD,EAAW7C,IACpB,MAAM,aACF3qD,EADE,SAEFytD,EAFE,YAGFC,EAHE,YAIFC,EAJE,eAKFC,EALE,YAMFzgC,EANE,YAOF0gC,EAPE,sBAQFV,EARE,mBASFE,EATE,mBAUFE,EAVE,gBAWFN,EAXE,wBAYFa,EAZE,iBAaFC,EACAhvD,WAAW,mBAAEkyE,EAAF,kBAAsB/iB,EAAtB,oBAAyCC,EAAzC,iBAA8DC,EAA9D,iBAAgFC,EAAhF,mBACPC,EADO,2BACaC,EADb,2BACyCC,IACpD7D,EAEE8D,EAAY,CACd9zD,UAAW+S,IAAW,mCAAoC,CAAE,eAAgB1N,IAC5E7C,SAAU6vD,EAAeC,GACzBrtD,IAAK,QAGH6L,EACF/Q,yBAAOkE,GAAG,oCAAoCjE,UAAU,2CACnDuzD,GAIHQ,EACFh0D,yBAAOkE,GAAG,8CAA8CjE,UAAU,+CAC7DyzD,GAIHO,EACFj0D,yBAAOkE,GAAG,8CAA8CjE,UAAU,+CAC7D0zD,GAIHO,EACFl0D,yBAAOkE,GAAG,0CAA0CjE,UAAU,iDACzD2zD,GAIHO,EACFn0D,gBAACyZ,QAAK,CACFvU,IAAI,OACJhB,GAAG,oCACHjE,UAAU,0CACVkF,KAAK,QACL+hD,WAAW,EACXkN,MAAM,EACNC,mBAAmB,EACnBh+C,SAAU/Q,GAETA,GAoBHgvD,EACFt0D,yBACIiZ,IAAK85C,EACL1xD,KAAK,OACLpB,UAAU,sDAAqD,aACnDwzD,EACZ5yD,SAAU2xD,EAAsBC,GAChCjyD,MAAO0yD,EAAc,kBACL,wEAIlBqB,EACFv0D,yBACIiZ,IAAK+5C,EACL3xD,KAAK,OACLpB,UAAU,yDAAwD,aACtDyzD,EACZc,YAAaX,EACbhzD,SAAU6xD,EAAmBC,GAC7BnyD,MAAOiyB,EAAW,kBACF,wEAIlBgiC,EACFz0D,yBACIiZ,IAAKg6C,EACL5xD,KAAK,OACLpB,UAAU,yDAAwD,aACtD0zD,EACZa,YAAaV,EACbjzD,SAAU+xD,EAAmBC,GAC7BryD,MAAO2yD,EAAW,kBACF,wEAIlBuB,EACF10D,gBAACiG,SAAM,CACHhG,UAAU,wCACVmG,QAASksD,EAAeC,GAAgB,aAC5BgkB,EACZpwE,UAAW+sD,GAEVqjB,GAIT,IAAI5hB,GAAuB,EACvBC,GAAuB,EAE3B,OAAQvB,GACJ,IAAI,MACAsB,GAAuB,EACvB,MACJ,IAAI,iBACAC,GAAuB,EACvB,MACJ,IAAI,uBACAD,GAAuB,EACvBC,GAAuB,EAK/B,MAAO,CACHb,YACAhjD,QACAijD,gBACAC,gBACAE,QACAU,WAxFe,CACf50D,UAAW,4CAwFX60D,cArFkB,CAClB70D,UAAW,gDAqFX80D,cAlFkB,CAClB90D,UAAW,gDAkFX+0D,cA/EkB,CAClB/0D,UAAW,gDA+EXq0D,cACAC,WACAE,WACAC,cACAtB,0BACAuB,uBACAC,uBACAV,oBCjOKiB,EAAU,IAII,IAJH,SACpBzd,EADoB,kBAEpB0d,EACA/wD,WAAW,qBAAEixD,EAAF,8BAAwBC,IACZ,EACvB,MAAME,EAAUL,EAAkB1d,EAASnlB,QAASmlB,EAASge,kBACvDC,GAAsBje,EAAS3uC,IAAM,IAAI0tB,QAAQ,GAMjDm/B,EACF51D,wBAAMC,UAAU,yCACXq1D,EACA,IACAK,EACA,IAJL,IAMKJ,EACA,IACDv1D,wBAAMC,UAAU,uCACXw1D,GATT,KAeJ,MAAO,CACHI,UArBc,CACd51D,UAAW,oCAqBXiE,GAAIwzC,GAAYA,EAAS3uC,GACzB6sD,qB,ykBCvCR,IAAKM,GAAL,SAAKA,GACDA,sBACAA,sBACAA,cAHJ,CAAKA,MAAqB,KA2BnB,MAAMsgB,UAA6Bx2E,YAA1C0B,+CACW,KAAA0J,MAAoC,CACvCgrD,oBAAoB,EACpB9wD,aAAc,GACd4tD,eAAgB,GAChBzgC,YAAa,GACb0gC,YAAa,IAGA,KAAAJ,SAA8C/yD,cAE9C,KAAAgzD,YAAiDhzD,cAEjD,KAAAizD,YAAiDjzD,cAiEjD,KAAAy2E,WAAa,OACrBt0E,KAAKR,MAAMoC,QAAQkE,QAAQwgB,KAAK+K,iBACjCrxB,KAAKR,MAAMoC,QAAQmd,IAAIve,OAAO4zD,oBAAsBL,EAAsBM,WACzEr0D,KAAKR,MAAMgB,OAAO8zD,yBAMV,KAAAigB,mBAAqB,WAA4D,IAA3DpyE,EAA2D,uDAA3C,EAAGsyD,EAAwC,uDAAjB,MAC7E,OAAO,EAAKj1D,MAAMoC,QAAQ8yD,iBAAiBC,eAAexyD,EAAOsyD,IAGpD,KAAA+f,qBAAwBzjB,IACrC/wD,KAAK0V,SAAS,CACVq7C,mBAEJ/wD,KAAKy0E,eAGQ,KAAAC,kBAAqBpkD,IAClCtwB,KAAK0V,SAAS,CACV4a,gBAEJtwB,KAAKy0E,eAGQ,KAAAE,kBAAqB3jB,IAClChxD,KAAK0V,SAAS,CACVs7C,gBAEJhxD,KAAKy0E,eAGQ,KAAAA,YAAc,KAC3Bz0E,KAAK0V,SAAS,CACVvS,aAAc,MAIL,KAAAyxE,UAAazxE,IAC1BnD,KAAKR,MAAMqC,UAAUC,MAAM,QAASqB,GACpCnD,KAAKR,MAAMqC,UAAU0c,MAAM,QAASpb,GACpCnD,KAAK0V,SAAS,CACVvS,kBAIS,KAAA0xE,eAAiB90E,UAC9B,GAAIC,KAAKiJ,MAAMgrD,mBACX,OAEJj0D,KAAK0V,SAAS,CACVu+C,oBAAoB,IAGxB,MAAMlD,EAAiB/wD,KAAKiJ,MAAM8nD,eAAe5rD,OAC3CmrB,EAActwB,KAAKiJ,MAAMqnB,YAAYnrB,OACrC6rD,EAAchxD,KAAKiJ,MAAM+nD,YAAY7rD,OAErC8vD,QAAsBj1D,KAAK80E,kBAAkB/jB,GAC7CoE,EAAeF,GAAiBA,EAAc,GAC9CG,EAAgBD,GAAgBA,EAAaE,cAC7CC,EAAgBH,GAAgBA,EAAaI,yBAC7CllC,EAAe8kC,GAAgBA,EAAaK,gBAC5CjgB,QAAiBv1C,KAAK+0E,aAAahkB,EAAgBzgC,EAAa0gC,EAAaoE,EAAeE,EAAejlC,GAEjH,GAAIklB,EASA,OARAv1C,KAAKy0E,cACLz0E,KAAK0V,SAAS,CACVq7C,eAAgB,GAChBzgC,YAAa,GACb0gC,YAAa,GACbiD,oBAAoB,EACpB1e,aAEGnzB,QAAQC,UAEnB,MAAM7W,EACExL,KAAK4wD,UAAY5wD,KAAK4wD,SAAS3vC,SAAWjhB,KAAK4wD,SAAS3vC,QAAQytB,OAAU1uC,KAAK4wD,SAAS3vC,QAChGzV,GAASA,EAAMkjC,QACf1uC,KAAK0V,SAAS,CACVu+C,oBAAoB,EACpB1e,cAAUn1C,KAKD,KAAA40E,yBAA2B,CAAC1mD,EAA2BC,EAA8BqnC,KAClG,IAAIC,EAEJ,OAAQD,GACJ,KAAK7B,EAAsB+B,SACvBD,EAAqBvnC,EAAYhoB,OAAOmoB,GAAeA,EAAWC,cAAgBH,GAA0C,KAA3BE,EAAWsnC,aAC5G,MACJ,KAAKhC,EAAsBM,SACvBwB,EAAqBvnC,EAAYhoB,OAAOmoB,GAAeA,EAAWC,cAAgBH,GAA0C,KAA3BE,EAAWsnC,aAC5G,MACJ,QACI,MAAM,IAAIvrC,MAAM,0BAGxB,GAAIqrC,EACA,OAAOA,EAAmBvyD,IAAImrB,GAAcA,EAAWE,cAAgB,KAK9D,KAAAomD,aAAeh1E,MAAOgxD,EAAwBzgC,EAAqB0gC,EAAqBoE,EAAoCE,EAAoCjlC,KAC7K,MACInuB,WAAW,qBAAEg0D,EAAF,eAAwBF,EAAxB,qBAAwCC,EAAxC,eAA8DE,EAA9D,eAA8EC,IACzFp2D,KAAKR,MAEH62D,EAAwBr2D,KAAKR,MAAMoC,QAAQmd,IAAIve,OAAO4zD,kBAE5D,IAAK/jC,EACD,OAGJ,MAAM/B,QAAoB2B,8BAAoB,CAAEzoB,cAAexH,KAAKR,MAAMoC,QAAQ6F,cAAeC,oBAAqB,KAAM7B,MAAM/D,IAC9H,MAAMA,IAGV,IAAKwsB,EACD,MAAM,IAAI9D,MAAM,qCAGpB,MAAM8rC,EAA8Bt2D,KAAKg1E,yBAAyB1mD,EAAaZ,aAAWE,mBAAoBmmC,EAAsB+B,UAC9HS,EAA8Bv2D,KAAKg1E,yBAAyB1mD,EAAaZ,aAAWE,mBAAoBmmC,EAAsBM,UAEpI,OAAQgC,GACJ,UAAKj2D,EACL,KAAK2zD,EAAsB+B,SACvB,GAAKQ,YAA6BlqC,SAASiE,GAEvC,YADArwB,KAAK40E,UAAU1e,GAGnB,MACJ,KAAKnC,EAAsBM,SACvB,GAAKkC,YAA6BnqC,SAASiE,GAEvC,YADArwB,KAAK40E,UAAU1e,GAGnB,MACJ,KAAKnC,EAAsByC,KACvB,KAAKF,WAA6BlqC,SAASiE,IAAkBkmC,WAA6BnqC,SAASiE,IAE/F,YADArwB,KAAK40E,UAAU1e,GAGnB,MACJ,QACI,MAAM,IAAI1rC,MAAM,8BAGxB,IAAKxqB,KAAKR,MAAMoC,QAAQkE,QAAQwgB,KAAK+K,iBAAjC,MAAoDilC,KAA6BlqC,SAASiE,GAE1F,YADArwB,KAAK40E,UAAU1e,GAInB,GAAId,GAAiC,KAAhB9kC,EAEjB,YADAtwB,KAAK40E,UAAUze,GAInB,GAAIb,GAAiC,KAAhBtE,EAEjB,YADAhxD,KAAK40E,UAAUxe,GAInB,MAAMK,EAAQ51C,OAAOC,SAASkwC,EAAYtgC,MAAM,KAAK,GAAI,IACnDgmC,EAAO71C,OAAOC,SAASkwC,EAAYtgC,MAAM,KAAK,GAAI,IAExD,OAAOimC,2BAAiB,CAAEnvD,cAAexH,KAAKR,MAAMoC,QAAQ6F,eAAiBspD,EAAgB1gC,EAAcC,EAAammC,EAAOC,GAC1HjxD,KAAKmxD,IACF,GAAKA,EAAexmC,SAAsC,IAA3BwmC,EAAexmC,QAI9C,OAAOwmC,EAHH52D,KAAK40E,UAAU5e,KAKtBnwD,MAAM/D,IACH9B,KAAK40E,UAAU3e,MAKV,KAAA6e,kBAAoB/0E,UACjC,MACImC,WAAW,gBAAE20D,EAAF,iBAAmBE,IAC9B/2D,KAAKR,MAET,GAAKuxD,EAKL,OAAO9iC,gCAAsB,CAAEzmB,cAAexH,KAAKR,MAAMoC,QAAQ6F,eAAiBspD,EAAgB7iC,IAAS+oC,UACtGxxD,KAAKwvD,IACF,GAAKA,GAA0C,IAAzBA,EAAc7zD,aAAqChB,IAArB60D,EAAc,GAIlE,OAAOA,EAHHj1D,KAAK40E,UAAU7d,KAKtBlxD,MAAM/D,IACH9B,KAAK40E,UAAU7d,KAbnB/2D,KAAK40E,UAAU/d,IA/PhB/tD,sBAAsBC,EACzBC,GACA,OAAIhJ,KAAKiJ,QAAUD,GAAahJ,KAAKR,MAAMsB,OAASiI,EAAUjI,KAM3DoI,SACH,MACI1I,QAAQ,UAAE1C,EAAF,qBAAas5D,GADnB,UAEFl1D,GACAlC,KAAKR,OACH,aAAE2D,EAAF,eAAgB4tD,EAAhB,YAAgCzgC,EAAhC,YAA6C0gC,GAAgBhxD,KAAKiJ,MAElEotD,EAAwBr2D,KAAKR,MAAMoC,QAAQmd,IAAIve,OAAO4zD,kBAE5D,IAAKp0D,KAAKs0E,aAEN,OADAt0E,KAAKR,MAAMoC,QAAQC,UAAUC,MAAM,gEAC5B,KAGX,MAAMmvD,EAA0BoF,IAA0BtC,EAAsB+B,SAE1EwB,EAAkB/sD,IAAU,6BAA8BzM,GAE1DgM,EAAS,SACR9J,KAAKR,OACLQ,KAAKiJ,OAFG,IAGXnL,UAAWw5D,EACX2d,0BAA2B,CAAE3qE,YAAatK,KAAKR,MAAO1B,UAAWw5D,GAEjE1C,oBAAqB50D,KAAKw0E,qBAC1B3f,iBAAkB70D,KAAK00E,kBACvB5f,iBAAkB90D,KAAK20E,kBACvB3f,cAAeh1D,KAAK60E,eAEpBvvD,KAAMqrC,EAAQ,CACVxtD,eACA4tD,iBACAzgC,cACA0gC,cACAJ,SAAU5wD,KAAK4wD,SACfC,YAAa7wD,KAAK6wD,YAClBC,YAAa9wD,KAAK8wD,YAClB5uD,YACA+uD,0BACAC,iBAAkBkG,EAClB9G,sBAAuBtwD,KAAKw0E,qBAC5BhkB,mBAAoBxwD,KAAK00E,kBACzBhkB,mBAAoB1wD,KAAK20E,kBACzBvkB,gBAAiBpwD,KAAK60E,iBAE1BtlE,KAAMvP,KAAKiJ,MAAMssC,UAAYyd,EAAQ,CACjCzd,SAAUv1C,KAAKiJ,MAAMssC,SACrB0d,kBAAmBjzD,KAAKu0E,mBACxBryE,gBAIR,OAAOlC,KAAKR,MAAMwL,WAAWlB,IAsNtBuqE,a,wHC5Rf,MAAMtqC,UAAsBlsC,YACxB0B,YAAYC,GACRC,MAAMD,GAENQ,KAAKk1E,cAAgBl1E,KAAKk1E,cAAclhE,KAAKhU,MAC7CA,KAAKm1E,iBAAmBn1E,KAAKm1E,iBAAiBnhE,KAAKhU,MAEnD,MAAMo1E,EAAap1E,KAAKR,MAAMkrC,wBAM9B1qC,KAAKiJ,MAAQ,CACTosE,SAAUD,GAIXtsE,sBAAsBC,EACzBC,GACA,OAAIhJ,KAAKiJ,QAAUD,GAAahJ,KAAKR,QAAUuJ,EAM5CG,SACH,MAAM,wBAAE4gC,EAAF,sBAA2BG,GAA0BjqC,KAAKR,MAMhE,OAJKsqC,GACDG,EAAsBpoC,UAAUC,MAAM,wDAGrCgoC,EAAwBsxB,cAAgBl7B,uBAAqBm7B,QAAYr7D,KAAKR,MAAMoC,QAAQmd,IAAIve,OAAOqnC,WACjG,KAGPhqC,uBAAKC,UAAS,uCAAkCgsC,EAAwB6xB,UACpE99D,gBAACiG,SAAM,CACHhG,UAAWkC,KAAKiJ,MAAMosE,SAAW,qCAAuC,sCAAqC,aACjGvrC,EAAwB6xB,SAAW,eAC/C13D,QAASjE,KAAKm1E,iBAAgB,gBACfn1E,KAAKiJ,MAAMosE,UAEzBvrC,EAAwB6xB,SAE7B99D,gBAACmX,WAAQ,CAACd,OAAQlU,KAAKiJ,MAAMosE,SAAUC,QAAS,KAC3Ct1E,KAAKu1E,kBAAkBzrC,KAMhCyrC,kBAAkBzrC,GACtB,OAAI3J,YAAY2J,EAAwB/I,eAC7B/gC,KAAKw1E,aAAa1rC,GAEtB9pC,KAAKy1E,yBAAyB3rC,GAGjC2rC,yBAAyB3rC,GAC7B,MAAM,WAAEW,EAAF,sBAAcR,EAAd,sBAAqCD,EAArC,QAA4DpoC,EAA5D,sBACF+oC,EADE,4BACqBG,EADrB,oBACkDF,EADlD,qBACuEC,EADvE,SAC6FnyB,GAAa1Y,KAAKR,MAE/GwD,EADkB8mC,EAAwB/H,mBAAqBC,cAAYC,cAAkB6H,EAAwBsxB,cAAgBl7B,uBAAqBm7B,OAClI,CAAEr4D,KAAM,gBAAc5C,EAC9Cs1E,EAAqB5rC,EAAwB5H,QAAU,GACvDyzC,EAAYD,EAAkBpyE,IAAI,CAAC6+B,EAA4B5+B,KACjE,IAAK4+B,EAID,OAHA8H,EAAsBpoC,UAAUC,MAAhC,oEACiEgoC,EAAwBz9B,SADzF,aACsGy9B,EAAwB6xB,QAD9H,MAGO,KAGX,MAAMb,EAA8Bt6B,YAAgC2B,EAAO6H,GAE3E,OACInsC,gBAAC+8D,IAAU,CACP94B,8BAA+BgI,EAC/BrJ,oBAAqB0B,EACrB24B,4BAA6BA,EAC7B9wB,sBAAuBA,EAAsB1jC,OAAOw7D,GAAiB4T,EAAkBn0E,KAAKlD,GAASA,EAAMwiC,kBAAoBihC,EAAcjhC,kBAC7IoJ,sBAAuBA,EACvBt0B,SAAU3V,KAAKk1E,cACf3qC,WAAYvqC,KAAKR,MAAM+qC,WACvBE,WAAYA,EACZv4B,IAAK3O,EACLA,MAAOA,EACP3B,QAASA,EACT69B,SAAUz/B,KAAKR,MAAMigC,SACrBhT,eAAgBzsB,KAAKR,MAAMitB,eAC3BhuB,iBAAkBuB,KAAKR,MAAMf,iBAC7BksC,sBAAuBA,EACvBC,oBAAqBA,EACrBC,qBAAsBA,EACtBC,4BAA6BA,EAC7B9uB,aAActD,MAI1B,OACI7a,oCAAIC,UAAS,kCAA6BgsC,EAAwB6xB,UAAe34D,EAAI,cAAc8mC,EAAwB6xB,UACtHga,GAKLC,cAAc9rC,GAClB,OAAIA,EAAwB+rC,uBAAyBC,kBAAgBC,OACjEjsC,EAAwB+rC,uBAAyBC,kBAAgBE,QACjElsC,EAAwB+rC,uBAAyBC,kBAAgBG,eAC1D,SAEJ,QAGHT,aAAa1rC,GACjB,MAAM,WAAEW,EAAF,sBAAcR,EAAd,sBAAqCD,EAArC,QAA4DpoC,EAA5D,6BAAqEuoC,EAArE,6BAAmGC,GAAiCpqC,KAAKR,MAGzIm2E,GADqB7rC,EAAwB5H,QAAU,IACzB5+B,IAAI,CAAC6+B,EAA4B5+B,KACjE,IAAK4+B,EAID,OAHA8H,EAAsBpoC,UAAUC,MAAhC,mDACgDgoC,EAAwBz9B,SADxE,aACqFy9B,EAAwB6xB,QAD7G,MAGO,KAGX,MAAMb,EAA8Bt6B,YAAgC2B,EAAO6H,GAErEksC,EAAYl2E,KAAK41E,cAAc9rC,GAC/B53B,EAAM4oD,EAA2B,UAAMA,EAA4B95B,qBAAlC,YAA0D85B,EAA4Bp5B,uBAAtF,uBAAgIn+B,GACvK,OACI1F,sBAAIC,UAAS,UAfU,+DAeV,WAAsCoU,IAAK3O,GACpD1F,gBAACs4E,IAAe,CACZr0C,8BAA+BgI,EAC/BrJ,oBAAqB0B,EACrB24B,4BAA6BA,EAC7B7wB,sBAAuBA,EACvBt0B,SAAU3V,KAAKk1E,cACf3qC,WAAYvqC,KAAKR,MAAM+qC,WACvBE,WAAYA,EACZyrC,UAAWA,EACXhkE,IAAKA,EACLkkE,UAAWlkE,EACXtQ,QAASA,EACTuoC,6BAA8BA,EAC9BC,6BAA8BA,EAC9B3K,SAAUz/B,KAAKR,MAAMigC,SACrBhT,eAAgBzsB,KAAKR,MAAMitB,oBAK3C,OAAQ5uB,sBAAIC,UAAS,gDAA2CgsC,EAAwB6xB,UACnFga,GAIDT,cAAch0C,GAClBlhC,KAAKR,MAAM6qC,iBAAiBnJ,GAGxBi0C,mBACJn1E,KAAK0V,SAAS2gE,IAAS,CACnBhB,UAAWgB,EAAUhB,aAKlBtrC,O,kCCrOf,oEAYA,iBACW,KAAAusC,YAAc,WAAM,qBAEpB,KAAAC,mBAAqB,WAAM,qBAE3B,KAAAC,cAAgB,WAAiB,eAGrC,SAAShqB,EAAgBpiC,GAC5B,IAAMqsD,EAAW,IAAIC,EAEjB1oB,EAA8B5jC,EAAIhoB,IAAmBq0E,EAASF,qBAAsBE,EAASH,eACjG,OAAItoB,IAGJ5jC,EAAIwN,OAAO6+C,EAAU,IACrBzoB,EAA8B5jC,EAAIhoB,IAAmBq0E,EAASF,qBAAsBE,EAASH,gBAI1F,SAAS7pB,EAAmBpuD,EAAsB+rB,GACrD,IAAMqsD,EAAW,IAAIC,EACrBtsD,EAAIwN,OAAO6+C,EAAUp4E,K,yDC7BzB,kDAMO,MAAMgpC,EAAkC,QAAC,UAAElb,GAAH,SAAoBtuB,4BAC9D,IACAsuB,EACA,O,kOCLL,MAAMwqD,EAAgE94E,IAAMggE,YA6D7D+Y,MAtC+Dp3E,IAC1E,MAAMq3E,EAAkBh5E,IAAM8nE,YAAY,OAEvC,KACImR,EAAiCC,GAAkCh7D,oBAAS,GAC7Ei7D,EAAsBn5E,IAAM8nE,YAAY,KAC1CoR,GAA+B,IAChC,IAEH,OACIl5E,oCACIA,4BACIC,UAAU,6DACViG,MAAM,UACNE,QAAS+yE,EACTlgE,IAAK6/D,EAAyB,aAClBn3E,EAAMy3E,yBAEjBz3E,EAAMy3E,yBAEXp5E,kBAACq5E,0BAAuB,CACpBp5E,UAAU,iCACV03B,UAAWshD,EACXK,gBAAgB,EAChBC,aAAcL,EACdn1E,QAASpC,EAAMoC,QACfG,GAAIvC,EAAMuC,GACVjB,KAAM,GACNkB,SAAUxC,EAAMwC,SAChB4qB,cAAeptB,EAAMi5C,mCACrBp4C,SAAUw2E,EACVr6B,UAAWh9C,EAAM63E,uBACjBC,iBAAkBX,M,ykBCjBlC,IAAMY,EAAN,cAAgC15E,YAE5B0B,YAAYC,GACRC,MAAMD,GAmLO,KAAAu3B,WAAa,KAC1B/2B,KAAK0V,SAAS,CACVxB,QAAQ,KAIC,KAAAsjE,YAAcz3E,UAC3ByN,OAAO3B,SAASwoB,UAGH,KAAAojD,+BAAkCxjD,IAC/C,MAAM,QAAEryB,EAAF,KAAWd,EAAX,UAAiBe,EAAjB,UAA4BK,GAAclC,KAAKR,OAC/C,eAAEs5C,GAAmBh4C,EAE3B,GAAIc,GAAWA,EAAQ6F,cAAe,CAElC,GADkB7F,EAAQkE,QAAQwgB,KAAK+K,iBAAmBzvB,EAAQkE,QAAQwgB,KAAKoS,OAC9DogB,EAAe93C,QAAU83C,EAAe93C,OAAO,IAAMizB,EAAe,CACjF,MAAM3I,EAAgBwtB,EAAe93C,OAAOO,KAAKm2E,GAAKA,EAAEljD,YAAY5tB,KAAOqtB,GACvE3I,EACAwN,sBAAY,CAAEtxB,cAAe5F,EAAQ6F,eAAiB6jB,EAAckJ,aAC/D/uB,OACAI,MAAO/D,IACJD,EAAU6e,QAAQ,0DAClB7e,EAAUC,MAAMA,GAChB9B,KAAK0V,SAAS,CACVyV,QAAS8I,EACT0jD,oBAAqBz1E,EAAU62B,8BAC/BxhB,gBAAiB,SACjBC,aAAc,8BACdtD,QAAQ,MAEbzO,KAAKzF,KAAKw3E,aAEjB31E,EAAU6e,QAAQ,4FAGtB7e,EAAU6e,QAAQ,4DAtN1B1gB,KAAKiJ,MAAQ,CACTkiB,QAAS,GACT/T,YAAa,GACbugE,oBAAqB,GACrBpgE,gBAAiB,UACjBC,aAAc,eACdtD,QAAQ,GAIc,0BAC1BlU,KAAK0V,SAAS,IAGX5M,sBAAsBC,EACzBC,GACA,OAAIhJ,KAAKiJ,QAAUD,GAAahJ,KAAKR,MAAMsB,OAASiI,EAAUjI,KAM3DoI,SAAM,QACT,MAAM,UAAEpL,EAAF,QAAaiT,GAAY/Q,KAAKR,MAAMgB,QACpC,uBAAEo3E,EAAF,4BAA0BC,GAAgC73E,KAAKR,MAAM0C,WACrE,eAAE42C,GAAmB94C,KAAKR,MAAMsB,KAChCg3E,EAAqBh/B,GAAmBA,EAAgB93C,OACxD+2E,EAAwB,UAAGhnE,aAAH,EAAGA,EAASI,YAAZ,QAAoBnR,KAAKR,MAAM0C,UAAU81E,uBAEvE,GAA8B,YAA1Bl/B,EAAev4C,OAAsB,CAAC,IAAD,EACrC,MAAMw5B,EAAU,OACR/5B,KAAKR,OADG,IAEZ+3E,kBAAmB,CACfjtE,YAAatK,KAAKR,MAClB1B,UAAW+S,IAAW,oBAAqB/S,IAE/CyC,OAAQ,UACRy5B,cAAen8B,gBAAC2vB,IAA8B,CAACC,UAAU,UAAUtc,KAAK,eACxEJ,QACIlT,gBAACq8B,UAAO,CACJp8B,UAAU,6BACViF,IAAG,UAAEgO,aAAF,EAAEA,EAAShO,WAAX,QAAc,KACjBoO,KAAM4mE,MAIlB,OAAO/3E,KAAKR,MAAMwL,WAAW+uB,GAGjC,GAAI+9C,GAAoD,IAA9BA,EAAmB12E,OAAc,CAAC,IAAD,EAEvD,MAAMi5B,EAAc,OACZr6B,KAAKR,OADO,IAEhB+3E,kBAAmB,CACfjtE,YAAatK,KAAKR,MAClB1B,UAAW+S,IAAW,oBAAqB/S,IAE/CyC,OAAQ,QACRy5B,cAAen8B,gBAAC2vB,IAA8B,CAACC,UAAU,QAAQtc,KAAMymE,IACvE7mE,QACIlT,gBAACq8B,UAAO,CACJp8B,UAAU,6BACViF,IAAG,UAAEgO,aAAF,EAAEA,EAAShO,WAAX,QAAc,KACjBoO,KAAM4mE,MAKlB,OAAO/3E,KAAKR,MAAMwL,WAAWqvB,GAGjC,MAAMvwB,EAAS,OACP9J,KAAKR,OADE,IAEX+3E,kBAAmB,CACfjtE,YAAatK,KAAKR,MAClB1B,UAAW+S,IAAW,oBAAqB/S,IAE/CyC,OAAQ,UACRwQ,QACIlT,gBAACq8B,UAAO,CACJp8B,UAAU,6BACViF,IAAG,UAAEgO,aAAF,EAAEA,EAAShO,WAAX,QAAc,KACjBoO,KAAM4mE,IAGdE,0BACIp6E,gBAACq6E,EAAgC,CAC7Bt2E,QAAS5B,KAAKR,MAAMoC,QACpBG,GAAI/B,KAAKR,MAAMuC,GACfC,SAAUhC,KAAKR,MAAMwC,SACrBlB,KAAM,GACNm2E,wBAAyBY,EACzBR,uBAAwBr3E,KAAKw3E,YAC7B/+B,mCAAoCz4C,KAAKk+B,0CAA0Cl+B,KAAKR,MAAM0C,aAGtGi2E,4BAA6Bn4E,KAAKiJ,MAAMiL,QAAUlU,KAAKiJ,MAAM0uE,qBACzD95E,uBAAKC,UAAU,sCACXD,gBAACyZ,QAAK,CAACvT,MAAO/D,KAAKiJ,MAAMsO,gBAAiBrD,OAAQlU,KAAKiJ,MAAMiL,OAAQ6Y,OAAQ/sB,KAAK+2B,YAC9El5B,4BACKmC,KAAKiJ,MAAM0uE,uBAK5BS,eAAgB,CACZt6E,UAAW,+BACXiF,IAAK,MAETs1E,cAAe,CACXv6E,UAAW,0BACXiF,IAAK,MAET+1C,eAAgBg/B,GAAsB93E,KAAKs4E,yBAAyBR,KAGxE,OAAO93E,KAAKR,MAAMwL,WAAWlB,GAGzBo0B,0CAA0Ch8B,GAC9C,MAAO,CACHm8B,yBAA0Bn8B,EAAU6lD,0BACpCxpB,wBAAyBr8B,EAAUs8B,mBACnCC,2BAA4Bv8B,EAAUu8B,2BACtCC,yBAA0Bx8B,EAAU8lD,+BAEpCrpB,yBAA0Bz8B,EAAUy8B,yBAEpCC,yBAA0B18B,EAAU+lD,8BACpCnpB,+BAAgC58B,EAAUgmD,0CAI1CowB,yBAAyBx/B,GAC7B,MAAM,QAAEl3C,EAAF,UAAWC,GAAc7B,KAAKR,OAC9B,cAAE8M,EAAF,uBAAiBmf,GAA2BzrB,KAAKR,MAAMgB,OAC7D,OAAOs4C,EAAex1C,IAAI,CAACgoB,EAA8B/nB,KACrD,MAAMg1E,EAAkD,CACpD/sD,mBAAoBxrB,KAAKiJ,MACzBrC,GAAI0kB,EAAckJ,YAAY5tB,GAC9BvH,KAAMisB,EAAckJ,YAAY7qB,KAChC2hB,gBACA1pB,UACA0K,gBACAmf,yBACAF,gCAAiC,SACjCoB,aAAc3sB,KAAKR,MAAM0C,UAAU49B,mBACnCv8B,QACA4nB,QAASG,EAAckJ,YAAY5tB,GACnC/E,YACA49B,SAAUz/B,KAAKR,MAAMuC,GACrB0qB,eAAgBzsB,KAAKR,MAAMwC,SAC3BkpB,SAAU,CACND,sBAAuBjrB,KAAKy3E,+BAC5B/rD,UAAW1rB,KAAK+2B,YAEpB70B,UAAW,CACPw7B,sBAAuB19B,KAAKR,MAAM0C,UAAUw7B,sBAC5CC,wBAAyB39B,KAAKR,MAAM0C,UAAUy7B,wBAC9CC,wBAAyB59B,KAAKR,MAAM0C,UAAU07B,wBAC9CC,wBAAyB79B,KAAKR,MAAM0C,UAAU27B,wBAC9CM,gCAAiC,CAC7BrB,mBAAoB98B,KAAKR,MAAM0C,UAAU46B,mBACzCC,6BAA8B/8B,KAAKR,MAAM0C,UAAU66B,6BACnDC,mCAAoCh9B,KAAKR,MAAM0C,UAAU86B,mCACzDC,mCAAoCj9B,KAAKR,MAAM0C,UAAU+6B,mCACzDC,sCAAuCl9B,KAAKR,MAAM0C,UAAUg7B,sCAC5DC,kCAAmCn9B,KAAKR,MAAM0C,UAAUi7B,qCAKpE,OACI9R,YAAoBktD,OAjL9BhB,EAAiB,aADtBjsE,KACKisE,GAiOSA,a,uKChQR,MAAMiB,EAA4D,IAA+D,IAA9D,qBAAEC,EAAF,MAAwB7pE,EAAxB,iBAA+BnQ,EAA/B,QAAiDg3B,GAAa,EACpI,MAAM92B,EAAUC,2BAAiB,QAASH,EAAmBI,oBAAkB65E,kBACzE35E,EAAaC,iCAAuBP,EAAmBE,GAC7D,OACId,wCACIC,UAAU,gCAA+B,aAAa26E,EAAsBx0E,QAASwxB,GACjF12B,GACJlB,wBAAMC,UAAU,uCAAsC,kBACjD8Q,K,gBCNV,MAAM+pE,EAAgD,IAA8D,IAA7D,MAAEhe,EAAF,eAASpnD,EAAT,aAAyBqlE,EAAzB,iBAAuCn6E,GAAsB,EACvH,MAAMo6E,EAAgBC,EAAkBne,EAAOl8D,GAC/C,OACIZ,wBAAMC,UAAU,0BACX+6E,GAAiBA,EAAcz3E,OAAS,EAAIvD,gBAACwV,IAAc,CACxDsnD,MAAOke,EACPvlE,UAAW,CAAEslE,eAAcrlE,oBAC1B,OAKXulE,EAAoB,CAACC,EAAwBt6E,KAC/C,IAAKs6E,GAAgC,IAApBA,EAAS33E,OACtB,OAAO,KAEX,MAAMy3E,EAAuC,GAoB7C,OAnBAE,EAASjnE,QAAQ,CAACknE,EAAMz1E,KAEpB,MAAM5E,EAAUC,2BAAiB,QAASH,EAAkB,GAAI,IAC1Dw6E,EAAWD,EAAKC,SAAWD,EAAKC,SAAW,GACjDt6E,EAAQQ,cAAcC,MAAQ65E,EAC9B,MAAMl6E,EAAaC,iCAAuBP,EAAkBE,GACtDu6E,EAAoC,CACtC16E,UAAWw6E,EAAKx6E,UAChBV,UAAW,wBACXm7E,SAAUD,EAAKC,SACfE,QAASH,EAAKG,QAAQC,eACtBC,aAAcL,EAAKK,aACnBr2E,KAAM,OACNid,qBAAsBlhB,EACtBkF,QAASq1E,2BAAiB76E,EAAkBE,EAASs6E,IAEzDJ,EAAc7mE,KAAKknE,KAGhBL,GCxCEU,EAA8C,IAA2C,IAA1C,KAAEpoE,EAAF,aAAQynE,EAAR,eAAsBrlE,GAAoB,EAClG,OACI1V,gBAACwV,IAAa,CACVvV,UAAU,wBACViF,IAAI,OACJoO,KAAMA,EACNmC,UAAW,CAAEpT,OAAQ04E,EAAcrlE,qB,ykBCqB/C,MAAMimE,UAAoB37E,gBAA1B0B,kCACW,KAAA0J,MAA2B,CAC9BwwE,WAAW,EACXC,WAAW,EACXC,YAAa,GAGA,KAAAl7E,iBAAsC4J,6BAAmBrI,KAAKR,MAAMoC,QAAQkE,QAAQwC,kBACjGtI,KAAKR,MAAM+I,aACXvI,KAAKR,MAAMqC,WAoDR,KAAA+3E,iBAAoBzxE,IACnBnI,KAAKR,MAAMgB,OAAO25D,gBAAkBn6D,KAAKR,MAAMgB,OAAO25D,eAAe,KACrEn6D,KAAKR,MAAMgB,OAAO25D,eAAe,GAAGhpD,KAAOhJ,EAAMiJ,OAAO/S,QAIzD,KAAAw7E,qBAAwBC,GAAuB3xE,IAClD,GAAInI,KAAKR,MAAMgB,OAAO25D,gBAAkBn6D,KAAKR,MAAMgB,OAAO25D,eAAe,GAAI,CACzE,MAAMQ,EAAQ36D,KAAKR,MAAMgB,OAAO25D,eAAe,GAAGQ,MAC9CA,IACAA,EAAMmf,GAAWb,SAAW9wE,EAAMiJ,OAAO/S,SAKpC,KAAA07E,MAAQ,KACrB,MAAMC,EAAYh6E,KAAKi6E,cAAgB,EAAIj6E,KAAKiJ,MAAM0wE,YAAc,EACpE35E,KAAKk6E,WAAWF,IAGH,KAAAG,UAAY,KACzB,MAAMH,EAAYh6E,KAAKo6E,eAAkBp6E,KAAKR,MAAMgB,OAAO25D,eAAiBn6D,KAAKR,MAAMgB,OAAO25D,eAAe/4D,OAAS,EAAI,EAAKpB,KAAKiJ,MAAM0wE,YAAc,EACxJ35E,KAAKk6E,WAAWF,IAGH,KAAAE,WAAc32E,IACvBvD,KAAKiJ,MAAMwwE,WAGfz5E,KAAK0V,SAAS,CAAEikE,YAAap2E,KAGhB,KAAA62E,aAAe,IAAiC,IAA3Bp6E,KAAKiJ,MAAM0wE,YAEhC,KAAAM,YAAc,IAAMj6E,KAAKR,MAAMgB,OAAO25D,gBAAkBn6D,KAAKiJ,MAAM0wE,cAAgB35E,KAAKR,MAAMgB,OAAO25D,eAAe/4D,OAAS,EAE7H,KAAA21B,WAAa,KAC1B/2B,KAAK0V,SAAS,CAAEgkE,WAAW,KAvFxBxwE,SACH,MAAM,eAAEixD,EAAF,eAAkBkgB,EAAlB,SAAkCC,EAAlC,YAA4CC,EAA5C,SAAyDC,EAAzD,UAAmE18E,EAAY,IAAOkC,KAAKR,MAAMgB,QACjG,qBAAEi4E,EAAF,iBAAwBgC,EAAxB,WAA0CC,GAAe16E,KAAKR,MAAM0C,WACpE,UAAEw3E,EAAF,YAAaC,GAAgB35E,KAAKiJ,MAExC,IAAKywE,EAED,OADA15E,KAAKR,MAAMoC,QAAQC,UAAUC,MAAM,sDAC5B,KAGX,MAAMgI,EAAS,OAGR9J,KAAKR,OAHG,IAIX1B,UAAW+S,IAAW,kBAAmB/S,GACzC47E,YACAhuD,UAAW1rB,KAAK+2B,WAChByjC,YAAax6D,KAAK65E,qBAClBpf,WAAYz6D,KAAK45E,iBAEjB3f,iBAAkB,CAAEn8D,UAAW+S,IAAW,kBAAmB/S,GAAYwM,YAAatK,KAAKR,MAAOwD,KAAM,UACxGo3D,qBAAsB,CAClBr3D,IAAKw2E,GAETlf,sBAAuB,CACnBt3D,IAAK41E,EACLl6E,iBAAkBuB,KAAKvB,kBAE3BumB,aAAc,CAAElnB,UAAW,4BAC3By8D,gBAAiBmgB,EACjBvgB,iBACAwf,cACArf,cAAe,CACXv3D,IAAK43E,WACL78E,UAAW,4BACX67E,cACAn4C,KAAMxhC,KAAK+5E,MACXa,SAAU56E,KAAKm6E,UACfU,yBAA0B76E,KAAKk6E,WAC/BY,cAAeP,EACfD,WACAC,cACAC,YAEJtgB,YAAamgB,GAAkBx8E,gBAAC26E,EAAsBj2E,iBAAK,CAAEkzB,QAASz1B,KAAK+2B,WAAYnoB,MAAO6rE,EAAkBhC,uBAAsBh6E,iBAAkBuB,KAAKvB,sBAGjK,OAAOuB,KAAKR,MAAMwL,WAAWlB,IA4CtB0vE,a,kCC1If,gZ,+JC2CA,IAAqBrD,EAArB,cAA6Ct4E,YAWzC0B,YAAmBC,GAA4B,kBAC3CC,MAAMD,GAXO,KAAAu7E,6BAAoD,IAAIC,IAiHxD,KAAAC,UAAY,CAACC,EAAkBC,EAAkBC,IACtD,CACJ,CACIC,QAAQ,GAAD,OAAKH,EAAL,UACPI,YAAY,GAAD,OAAKH,GAChBI,iBAAkB,SAEtB,CACIF,QAAQ,GAAD,OAAKH,EAAL,QACPI,YAAY,GAAD,OAAKF,GAChBG,iBAAkB,QAgBb,KAAAC,gBAAkB,CAACN,EAChC9E,EACAqF,EACAC,EACAC,EACAC,EACAR,KAAyC,QAEzC,MAAQ,CACJ,CACIr5E,GAAG,GAAD,OAAKm5E,GAAL,OAAgB9E,EAAhB,uBACF/3E,MAAQo9E,GAAe56D,OAAO46D,IAJN,EAKxBj9E,UAAU,GAAD,iBAAKwB,KAAKR,MAAM2qC,oCAAhB,QAAgD,GAAhD,YAAsDnqC,KAAKy0D,cACpEonB,cAAc,GAAD,OAAKH,IAEtB,CACI35E,GAAG,GAAD,OAAKm5E,GAAL,OAAgB9E,EAAhB,qBACF/3E,MAAOwiB,OAAO86D,IAAgB96D,OAAOu6D,GACrC58E,UAAU,GAAD,iBAAKwB,KAAKR,MAAM4qC,oCAAhB,QAAgD,GAAhD,YAAsDpqC,KAAKy0D,cACpEonB,cAAc,GAAD,OAAKD,MAlJ1B57E,KAAK87E,eAAiB97E,KAAK87E,eAAe9nE,KAAKhU,MAC/CA,KAAK+7E,kBAAoB/7E,KAAK+7E,kBAAkB/nE,KAAKhU,MACrDA,KAAKg8E,wBAA0Bh8E,KAAKg8E,wBAAwBhoE,KAAKhU,MACjEA,KAAKi8E,WAAaj8E,KAAKi8E,WAAWjoE,KAAKhU,MACvCA,KAAKk8E,WAAal8E,KAAKk8E,WAAWloE,KAAKhU,MACvCA,KAAKm8E,iBAAmBn8E,KAAKm8E,iBAAiBnoE,KAAKhU,MACnDA,KAAKo8E,iBAAmBp8E,KAAKo8E,iBAAiBpoE,KAAKhU,MAEnDA,KAAKq8E,SAAWx+E,cAChBmC,KAAKs8E,SAAWz+E,cAEhB,MAAM,4BAAEi9D,GAAgC96D,KAAKR,MACvC+8E,EAAU,UAAGzhB,aAAH,EAAGA,EAA6B95B,4BAAhC,QAAwD,IAClEw7C,EAAa1hB,aAAH,EAAGA,EAA6Bp5B,sBAC1Cw5C,EAAQ,iBAAauB,OAAOz8E,KAAKR,MAAMsiC,8BAA8Bz1B,UAA7D,YAA0EowE,OAAOz8E,KAAKR,MAAMihC,oBAAoBI,kBACxHwhC,EAAWriE,KAAKR,MAAMihC,oBAAoBO,qBAC1C07C,EAAW18E,KAAKR,MAAMihC,oBAAoBiB,sBAC1Cy5C,EAAWn7E,KAAK+kE,aAAa1C,GAC7B+Y,EAAWp7E,KAAK+kE,aAAa2X,GAC7BC,EAAyB38E,KAAKi7E,UAAUC,EAAUC,EAAUC,GAC5DK,EAAW,8BAAGz7E,KAAKR,MAAMs7D,mCAAd,aAAG,EAAwC95B,4BAA3C,QAAmEhhC,KAAKR,MAAMihC,oBAAoBO,4BAAlG,QAA0H,IACrI26C,EAAW,8BAAG37E,KAAKR,MAAMs7D,mCAAd,aAAG,EAAwCp5B,6BAA3C,QACjB1hC,KAAKR,MAAMihC,oBAAoBiB,6BADd,QACuCg7C,EAClDhB,EAAmB17E,KAAK+kE,aAAa0W,GACrCG,EAAmB57E,KAAK+kE,aAAa4W,GACrCiB,EAAkB58E,KAAKR,MAAM42E,UAAX,WAA2BqG,OAAOz8E,KAAKR,MAAM42E,YAAe,GAC9EyG,EAAoC78E,KAAKw7E,gBAAgBN,EAC3D0B,EAAiBnB,EAAaC,EAAkBC,EAAaC,EAAkBR,GACnFp7E,KAAKiJ,MAAQ,CACT7K,WAAW,EACX0+E,wBAAoB18E,EACpB28E,wBAAoB38E,EACpBq7E,YAAac,EACbZ,YAAaa,EACbQ,YAAY,EACZC,YAAY,EACZ/B,WACA7Y,WACAqa,WACAC,SACAE,gBA9CkB,mBACtB,OAAO78E,KAAKR,MAAMihC,oBAAoB4xC,UAAY,GAiD/CvpE,sBAAsBC,EACzBC,GACA,OAAIhJ,KAAKiJ,QAAUD,GAAahJ,KAAKR,QAAUuJ,EAM5Cm0E,mBAAmBC,GAClBA,IAAkBn9E,KAAKR,OACvBQ,KAAKo9E,oBAINl0E,SACH,MAAM,oBAAEu3B,EAAF,8BAAuBqB,EAAvB,sBAAsDmI,GAA0BjqC,KAAKR,MAE3F,GAAKihC,GAAwBqB,EAK7B,MAA6B,UAAzB9hC,KAAKR,MAAM02E,UACJl2E,KAAKq9E,qBAGTr9E,KAAKs9E,gBARRrzC,EAAsBpoC,UAAUC,MAAM,kGActCs7E,oBAAiB,gBACrB,MAAMlC,EAAQ,iBAAauB,OAAOz8E,KAAKR,MAAMsiC,8BAA8Bz1B,UAA7D,YAA0EowE,OAAOz8E,KAAKR,MAAMihC,oBAAoBI,kBACxHwhC,EAAWriE,KAAKR,MAAMihC,oBAAoBO,qBAC1C07C,EAAW18E,KAAKR,MAAMihC,oBAAoBiB,sBAC1Cy5C,EAAWn7E,KAAK+kE,aAAa1C,GAC7B+Y,EAAWp7E,KAAK+kE,aAAa2X,GAC7BC,EAAyB38E,KAAKi7E,UAAUC,EAAUC,EAAUC,GAC5DK,EAAW,8BAAGz7E,KAAKR,MAAMs7D,mCAAd,aAAG,EAAwC95B,4BAA3C,QAAmEhhC,KAAKR,MAAMihC,oBAAoBO,4BAAlG,QAA0H,IACrI26C,EAAW,8BAAG37E,KAAKR,MAAMs7D,mCAAd,aAAG,EAAwCp5B,6BAA3C,QACjB1hC,KAAKR,MAAMihC,oBAAoBiB,6BADd,QACuCg7C,EAClDhB,EAAmB17E,KAAK+kE,aAAa0W,GACrCG,EAAmB57E,KAAK+kE,aAAa4W,GACrCiB,EAAkB58E,KAAKR,MAAM42E,UAAX,WAA2BqG,OAAOz8E,KAAKR,MAAM42E,YAAe,GAC9EyG,EAAoC78E,KAAKw7E,gBAAgBN,EAC3D0B,EAAiBnB,EAAaC,EAAkBC,EAAaC,EAAkBR,GACnFp7E,KAAK0V,SAAS,CAAEwlE,WAAU7Y,WAAUqa,WAAUC,SAAQE,iBA4DlDQ,qBACJ,MAAM,WAAE5yC,EAAF,8BAAc3I,EAAd,sBAA6CmI,GAA0BjqC,KAAKR,OAC5E,YAAEi8E,EAAF,YAAeE,EAAf,WAA4BqB,EAA5B,WAAwCC,EAAxC,mBAAoDH,EAApD,mBAAwEC,GAAuB/8E,KAAKiJ,MAGpGs0E,EAAY,CACd,cAFoBtzC,EAAsBoF,iBAAmB,OAAO5+B,QAAQ,MAAQqxB,EAA8B65B,SAAW,IAG7H,gBAAiBlxB,GAOf+yC,EAAiB,yEAAqEV,EAAqB,qCAAuC,IAClJW,EAAiB,yEAAqEV,EAAqB,qCAAuC,IAGlJW,EAAuB19E,KAAK29E,2BAA2BlC,EAAauB,EAAYF,GAChFc,EAAuB59E,KAAK29E,2BAA2BhC,EAAasB,EAAYF,GACtF,OACIl/E,sCAAMC,UAAU,0CAA6Cy/E,GACzD1/E,yBAAOC,UANW,8EAObmsC,EAAsBkF,SACvBtxC,yBACIC,UAAW0/E,EACX9+E,SAAUsB,KAAKi8E,WACf4B,QAAS79E,KAAKi8E,WACdjZ,OAAQhjE,KAAKm8E,iBACb99E,MAAOq/E,EACP5mE,IAAK9W,KAAKq8E,YAGlBx+E,yBAAOC,UAhBW,8EAiBbmsC,EAAsBmF,SACvBvxC,yBACIC,UAAW2/E,EACXprB,YAAaurB,OAAuBx9E,EAAY6pC,EAAsBiF,mBACtExwC,SAAUsB,KAAKk8E,WACf2B,QAAS79E,KAAKk8E,WACdlZ,OAAQhjE,KAAKo8E,iBACb/9E,MAAOu/E,EACP9mE,IAAK9W,KAAKs8E,YAGjBQ,GACGj/E,wBAAMC,UAAU,wFACXg/E,GAERC,GAAsBD,IAAuBC,GAC1Cl/E,wBAAMC,UAAU,wFACXi/E,IAMbO,gBACJ,MAAM,WAAE7yC,EAAF,UAAc2rC,GAAcp2E,KAAKR,MACjCs+E,EAAiB,CACnB,gBAAiBrzC,GAGrB,OACI5sC,gBAACm4E,SAAMzzE,eACHzE,UAAU,mCACVoU,IAAKlS,KAAKiJ,MAAMiyE,SAChB9E,UAAWA,EACXr0E,GAAI/B,KAAKiJ,MAAMiyE,SACf6C,QAAQ,EACR53D,IAAMnmB,KAAKiJ,MAAMo5D,UAAYxhD,OAAO7gB,KAAKiJ,MAAMo5D,gBAAcjiE,EAC7D0a,IAAM9a,KAAKiJ,MAAMyzE,UAAY77D,OAAO7gB,KAAKiJ,MAAMyzE,gBAAct8E,EAC7D49E,KAAM,EACNC,YAAY,aACZtB,OAAQ38E,KAAKiJ,MAAM0zE,OACnBuB,YAAU,EACVC,aAAW,EACXtB,aAAc78E,KAAKiJ,MAAM4zE,aACzBuB,YAAap+E,KAAK+7E,kBAClBr9E,SAAUq8B,IAAS/6B,KAAK87E,eAAgB,KACxCuC,kBAAmBr+E,KAAKg8E,yBACpB8B,IAKR7B,WAAW9zE,GACfnI,KAAKs+E,aAAan2E,EAAO,OAGrB+zE,WAAW/zE,GACfnI,KAAKs+E,aAAan2E,EAAO,OAGrBm2E,aAAan2E,EAA2CgzD,GAC5D,MAAMojB,EAAW,kBAAcpjB,GACzBqjB,EAAU,iBAAarjB,GAC7Bn7D,KAAK0V,SAAS,CACV,CAAC6oE,GAAcv+E,KAAKy+E,2BAA2Bt2E,EAAMC,cAAc/J,OACnE,CAACmgF,IAAa,IAIdrC,iBAAiBh0E,GACrB,MAAMu2E,EAAmB1+E,KAAKy+E,2BAA2Bt2E,EAAMC,cAAc/J,OAC7E2B,KAAK0V,SAAS,CACV+lE,YAAaiD,EACbC,YAAY,IAEhB,MAAMtC,EAAWx7D,OAAO69D,IAClB,SAAE/oE,EAAF,8BAAYmsB,EAAZ,oBAA2CrB,EAA3C,sBAAgEwJ,EAAhE,4BAAuF6wB,GAAgC96D,KAAKR,MAC5Hsb,EAAMggD,GAA+BA,EAA4Bp5B,4BAAyBthC,EAE1Fw+E,EAAS9jE,EAAM+F,OAAO/F,QAAO1a,EAEnC,OAAI+gB,MAAMk7D,IACNr8E,KAAK0V,SAAS,CAAEonE,mBAAoB7yC,EAAsBqF,qBAC1DtvC,KAAK6+E,OAAO,QACL,GAGP7+E,KAAK8+E,eAAezC,EAAUuC,IAC9BjpE,EAAS,CACLmsB,gCACArB,sBACAc,aAAa,EACbE,WAAY46C,EACZ16C,SAAUi9C,KAEP,IAEX5+E,KAAK6+E,OAAO,QAEL,GAGHzC,iBAAiBj0E,GACrB,MAAM42E,EAAmB/+E,KAAKy+E,2BAA2Bt2E,EAAMC,cAAc/J,OAC7E2B,KAAK0V,SAAS,CACVimE,YAAaoD,EACbC,YAAY,IAEhB,MAAM1C,EAAWz7D,OAAOk+D,IAClB,SAAEppE,EAAF,8BAAYmsB,EAAZ,oBAA2CrB,EAA3C,sBAAgEwJ,EAAhE,4BAAuF6wB,GAAgC96D,KAAKR,MAC5H2mB,EAAM20C,GAA+BA,EAA4B95B,sBAAwB,IAEzFi+C,EAASp+D,OAAOsF,GAEtB,OAAIhF,MAAMm7D,IACNt8E,KAAK0V,SAAS,CAAEqnE,mBAAoB9yC,EAAsBqF,qBAC1DtvC,KAAK6+E,OAAO,QACL,KAGP7+E,KAAK8+E,eAAeG,EAAQ3C,KACxB77C,EACA9qB,EAAS,CACLmsB,gCACArB,sBACAc,aAAa,EACbE,WAAYw9C,EACZt9C,SAAU26C,IAGdt8E,KAAK6+E,OAAO,QAET,GAMPA,OAAO1jB,GACX,MAAMrkD,EAAoB,QAAdqkD,EAAsBn7D,KAAKs8E,SAAWt8E,KAAKq8E,SAEvD79D,WAAW,KACH1H,GAAOA,EAAImK,SACXnK,EAAImK,QAAQytB,SAEjB,IAGCivC,2BAA2Bzb,EAA8Bgd,EAAkBC,GAC/E,OAAID,GAAWC,QAAgC/+E,IAAb8hE,EACvBA,EAEJliE,KAAK+kE,aAAa7C,GAGrB4c,eAAe34D,EAAarL,GAChC,MAAM,sBAAEmvB,GAA0BjqC,KAAKR,MACvC,YAAYY,IAAR0a,MAIAqL,EAAMrL,KACN9a,KAAK0V,SAAS,CACVonE,mBAAoB7yC,EAAsBuF,qBAC1CutC,mBAAoB9yC,EAAsBuF,wBAEvC,IAMPu1B,aAAaxzC,GAEjB,OADevxB,KAAKR,MAAMoC,QAAQ8yD,iBAAiBC,eAAe9zC,OAAO0Q,GAASvxB,KAAKy0D,cAInFgqB,2BAA2BjzE,GAE/B,MAAM4zE,EAAav+D,OAAOrV,GAC1B,IAAK2V,MAAMi+D,GACP,OAAO5zE,EAKX,OAD4BxL,KAAK+6E,6BAA6B34E,IAAIoJ,IACpCA,EAI1BswE,eAAeuD,GAEnB,GAA2C,cAAvCA,EAAyBC,UAA2B,CACpD,MAAM,SAAE3pE,EAAF,8BAAYmsB,EAAZ,oBAA2CrB,GAAwBzgC,KAAKR,MAC1EihC,GAAuB4+C,IACvB1pE,EAAS,CACLmsB,gCACArB,sBACAc,aAAa,EACbE,WAAY49C,EAAyBE,gBACrC59C,SAAU09C,EAAyBG,mBAGvCx/E,KAAKy/E,oBAAoBJ,KAK7BtD,kBAAkBsD,GACtB,MAAM,SAAE1pE,EAAF,8BAAYmsB,EAAZ,oBAA2CrB,GAAwBzgC,KAAKR,MAC1EihC,GAAuB4+C,IACvB1pE,EAAS,CACLmsB,gCACArB,sBACAc,aAAa,EACbE,WAAY49C,EAAyBE,gBACrC59C,SAAU09C,EAAyBG,mBAGvCx/E,KAAKy/E,oBAAoBJ,IAIzBI,oBAAoBJ,GACxB,GAAIA,EAAyBt9E,GAAI,CAC7B,MAAM2iD,EAAUlW,SAASC,eAAT,UAA2B4wC,EAAyBt9E,GAApD,UACZ2iD,GACAlmC,WACI,KACIkmC,EAAQhW,SACT,IAKXstC,wBAAwB0D,GAC5B,OAAO1/E,KAAK+kE,aAAL,UAAqB2a,MA3atBz0E,aAATE,KAAS,iCAPOgrE,EAAe,aADnC7qE,KACoB6qE,GAAA,O,kCC3CrB,gBAYewJ,IAN8B,QAAC,QAAE3hF,GAAH,SACzCH,qBAAGC,UAAU,6BAA6BkF,KAAK,QAAO,YAAW,aAC5DhF,K,wUCHI4hF,EAAwB,QAAC,UAAEhuB,EAAF,MAAahjD,EAAb,cAAoBijD,EAApB,cAAmCC,EAAnC,MAAkDE,EAAlD,WAAyDU,EAAzD,cAAqEC,EAArE,cAClCC,EADkC,cACnBC,EADmB,YACJV,EADI,SACSC,EADT,SACmBE,EADnB,YAC6BC,EAD7B,wBAC0CtB,EAD1C,qBACmEuB,EADnE,qBACyFC,EADzF,gBAC+GV,GADhH,SAEjCl0D,gBAAC6kC,OAAIngC,iBAAKqvD,GACDI,EACAf,EAA0BpzD,gBAAC6kC,OAAIngC,iBAAKmwD,GACrC70D,gBAAC6kC,OAAIngC,iBAAKowD,GACD/jD,EACAujD,GAERK,GACG30D,gBAAC6kC,OAAIngC,iBAAKqwD,GACLf,EACAO,GAERK,GACG50D,gBAAC6kC,OAAIngC,iBAAKswD,GACLf,EACAQ,IAEPE,GAAwBC,IAAyBV,GAC7Cl0D,gCACD+Q,EACAujD,GAEJI,IAIAstB,EAAoC,QAAC,UAAEnsB,EAAF,iBAAaD,EAAb,aAA+B5mC,GAAhC,SAC7ChvB,gBAAC6kC,OAAIngC,iBAAKmxD,GACLD,EACA5mC,IAIIizD,EAAgC,QAAC,UAAEjsB,EAAF,KAAappD,GAAd,SACzC5M,gBAAC6kC,OAAIngC,iBAAKsxD,GACLppD,EAAKnH,IAAI,QAAC,GAAEvB,GAAH,EAAUwN,EAAV,wBACN1R,gBAACgiF,EAAgBt9E,eAAC2P,IAAKnQ,GAAQwN,QAK9BwwE,EAAsC,QAAC,KAAEz6D,EAAF,KAAQ7a,GAAT,SAC/C5M,gCACKynB,GAAQznB,gBAAC+hF,EAAIr9E,iBAAK+iB,IAClB7a,GAAQ5M,gBAACiiF,EAAYv9E,iBAAKkI,MAItBu1E,EAAwC,QAAC,MAAE9hF,EAAF,KAASuM,GAAV,SACjD5M,gCACKK,EACAuM,GAAQ5M,gBAACiiF,EAAYv9E,iBAAKkI,MAcpBw1E,UAVoDzgF,IAC/D,MAAM,sBAAE+3D,EAAF,aAAyBC,EAAzB,YAAuC9B,GAAgBl2D,EAC7D,OACI3B,gBAAColC,SAAM1gC,iBAAKg1D,GACPC,GAAgB35D,gBAACmiF,EAAYz9E,iBAAKi1D,IAClC9B,GAAe73D,gBAACkiF,EAAWx9E,iBAAKmzD,O,iFC7D7C,MAiIMwqB,EAAc,CAChBj0E,EACAk0E,EACA3lD,KAEA,IAAKvuB,EACD,OAAO,KAGX,MAAM,IACFiG,EADE,WAEF80D,EAFE,aAGFC,EAHE,aAIF1uC,EAJE,cAKF0D,EALE,eAMFwrC,EANE,aAOF56C,EAPE,YAQFs6C,EARE,qBASFG,EATE,oBAUFC,EAVE,gBAWFnrC,EAXE,MAYFsrC,EAZE,SAaFhvD,GACAzM,EAEJ,OACIpO,gBAAC6kC,OAAIngC,eAAC2P,IAAKA,EAAKpU,UAAW08B,EAAkB18B,WAAe08B,GACxD38B,0BACKmpE,GAELnpE,0BACKopE,GAEJvuD,EAAW7a,0BACRA,2BACKo+B,GAELp+B,2BACKsiF,EADL,IAGK,IACA/jD,IAEDv+B,0BACHo+B,IAEHvjB,GAAY7a,0BACTspE,IAEHzuD,GAAY7a,0BACT06B,IAEH7f,GAAY7a,0BACTypE,IAEH5uD,GAAY7a,0BACT0pE,GAEJ7uD,GAAY7a,0BACR6pE,IAEHhvD,GACE7a,0BACK4pE,EACA56C,KAMNuzD,UAvMoD5gF,IAC/D,MAAM,mBACFi0B,EADE,OAEFlzB,EAFE,cAGFy5B,EAHE,QAIFjpB,EAJE,cAKFwpB,EALE,qBAMFE,EANE,WAOFE,EAPE,iBAQFH,EARE,sBASFF,EATE,qBAUFtP,EAVE,aAWFgQ,EAXE,WAYFE,EAZE,sBAaFC,EAbE,qBAcFC,EAdE,mBAeFxE,EAfE,oBAgBFC,EAhBE,uBAiBFyE,EACAp5B,WAAW,eACPoC,EADO,kBAEPo3B,EAFO,YAGPhe,EAHO,qBAIPie,EAJO,eAKPC,EALO,oBAMPC,IAEJr8B,EAEE6gF,EAAgBxiF,cAAkB,KACpCy9B,GAA0BA,OAAuBl7B,IAClD,CAACk7B,IAEJ,OACIz9B,gBAAColC,SAAM1gC,iBAAKkxB,GACP1iB,EACAia,GACGntB,gBAAC6kC,OAAIngC,iBAAKyoB,GACLgQ,aADL,EACKA,EAAc8qC,iBACd9qC,aAFL,EAEKA,EAAcgrC,eACdhrC,aAHL,EAGKA,EAAckrC,gBACbtvC,GAAsB0D,GAG/Bc,EACW,YAAX76B,GAAwBy5B,EACxBO,GAAiBI,GAAcA,EAAWv5B,OAAS,GAChDvD,gBAAC6kC,OAAI,CAAC5kC,UAAU,8BACZD,gBAAC6kC,OAAIngC,iBAAKg4B,GACLE,EACD58B,6BACK88B,GACGA,EAAWr3B,IAAI2I,GACJi0E,EAAYj0E,EAAS4vB,EAAqBrB,MAIhEU,GAGRC,EACDt9B,gBAACkmD,QAAK,CACFu8B,cAAc,sCACdliB,WAAS,EACTnM,MAAM,EACNsuB,gBAAgB,aAChBrsE,OAAQ0iB,EACR7J,OAAQszD,GAERxiF,gBAACmmD,cAAW,CAACj3B,OAAQszD,GAAa,mBAGlCxiF,gBAAComD,YAAS,KACNpmD,0BACIA,0BACKg5B,aADL,EACKA,EAAqBowC,cAE1BppE,sBAAIC,UAAU,gBACVD,4BACK6f,EADL,KAICmZ,aALL,EAKKA,EAAqBswC,aAE1BtpE,0BACIA,4BACK69B,EADL,KAIC7E,aALL,EAKKA,EAAqBoF,eAE1Bp+B,0BACIA,4BACK89B,EADL,KAIC,IACA9E,aANL,EAMKA,EAAqB0B,cAE1B16B,0BACIA,4BACK+9B,EADL,KAIC,IACA/E,aANL,EAMKA,EAAqBywC,sBAE1BzpE,0BACIA,4BACKg+B,EADL,KAIChF,aALL,EAKKA,EAAqB0wC,qBAEzBjtC,GAAyBz8B,0BACrBy8B,KAIbz8B,gBAACumD,cAAW,KACRvmD,gBAACiG,SAAM,CAACG,QAASo8E,GACZ/7E,Q,kCC/HzB,kDASO,MAAM2iC,EAAwB,QAAC,KAAE91B,EAAF,UAAQrT,EAAR,KAAmB2P,EAAnB,UAAyBjP,GAA1B,SAA2CX,qBAAGC,UAAWA,EAAW2P,KAAMA,EAAI,aAAcjP,GAC5H,IACA2S,EACA,O,sICGL,MAAMqvE,EAAiE,GASjEC,EAAsB,CAACld,EAAiBgM,EAAwBzC,IAAoC/sE,WAClGwjE,GAAWgM,IAGfiR,EAAcl9E,IAAIo9E,IACdA,GAAe,IACR,UAEL5T,IACN0T,EAAcl9E,IAAIo9E,IACdA,GAAe,IACR,MAyCAC,IArC4D,IAE4B,IAF3B,gBACxEvQ,EADwE,cACvDb,EADuD,WACxCzC,EADwC,iBAC5BruE,EAD4B,+CAExE6wB,EAFwE,oBAExBw8C,EAFwB,yBAEH5jE,GAA8B,EACnG,MAAOq7D,EAAQqd,GAAa7kE,oBAAS,GACrCykE,EAAcxuE,KAAK4uE,GACnB,MAAMzlC,EAAUv8C,2BAAiBw8C,IAAeylC,SAAUpiF,EAAmB2xE,EAAiB,IACxFrxE,EAAaC,iCAAuBP,EAAmB08C,GAE7D,OAAI7rB,IAAmDpnB,EAE/CrK,kBAACiG,SAAMvB,eACHzE,UAAW+S,IAAW,+BAAgC,CAAE,UAAWi7D,aACnE/nE,MAAM,UACNE,QAAS6oE,EACT5uE,MAAOkyE,GACHrxE,EAAU,CACdiF,UAAWurE,GAAiBzD,IAE3BsE,GAMTvyE,kBAACiG,SAAMvB,eACHzE,UAAW+S,IAAW,+BAAgC,CAAE,UAAW0yD,IACnEx/D,MAAM,UACNE,QAASw8E,EAAoBld,EAAQgM,EAAezC,GACpD5uE,MAAOkyE,GACHrxE,EAAU,CACdiF,UAAWurE,GAAiBhM,IAE3B6M,K,kCC5Eb,uF,kCCKA,+f,2ICcO,MAAMQ,EAAmBplE,IAAuD,QACnF,MACIhL,QAAQ,oBAAE0gD,GACVpgD,MAAM,SAAEC,GACRmB,WAAW,cACP2yC,EADO,cAEPO,EAFO,SAGPL,EAHO,gBAIPE,EAJO,aAKPU,EALO,cAMPC,EANO,oBAOPE,EAPO,SAQPpC,EARO,mBASPD,EATO,aAUPlrB,GAbF,QAeF3mB,EAfE,SAgBFI,EAhBE,GAiBFD,EAjBE,UAkBFF,GACA2J,EAEEpG,EAAgBhD,IAAIrB,EAAU,UAC9BqF,EAAOhE,IAAIrB,EAAU,4BACrB+/E,EAAgB16E,EAAKC,WAAaD,EAAKC,UAAUjF,OAAS,EAC1D2tB,EAAuBntB,EAAQkE,QAAQE,SAEvC,4BAAET,EAAF,aAA+BkE,GAAiB+B,EAAM1K,KACtDjB,EAAoC4J,SAAH,UAAGA,EAAczI,cAAjB,iBAAG,EAAsBO,KAAKmI,GAF/B,oEAE0CA,EAAQC,aAAjD,aAAG,EAAuFC,UASjI,MAAO,CACHm3E,kBAAmB,CAAEjjF,UAAW,4CAChCiT,QAASmwC,GAAuBA,EAAoB/vC,MAChDtT,gBAACwV,IAAa9Q,eACVzE,UAAU,8BACNojD,EAAmB,CACvBn+C,IAAKm+C,EAAoBn+C,KAAO,KAChCoO,KAAM+vC,EAAoB/vC,KAC1BmC,UAAW,CAAEpT,OAfgBiI,IACrC,MACI3H,QAAQ,oBAAE0gD,IACV11C,EACJ01C,EAAqB/vC,KAAOhJ,EAAMiJ,OAAO/S,OAWqBkV,eAAgB3R,EAAQkE,YAGtF+tB,MAAOitD,EAAgB5sC,YAAa,CAChC9uC,gBACAgB,OACAyuC,gBACAO,gBACAL,WACAE,kBACAU,eACAC,gBACAE,sBACApC,WACAD,qBACA7xC,UACAI,WACAD,KACAgtB,uBACAltB,YACAqzC,iBAAkB3sB,EAClB1oB,oCACA0F,4BAA6BA,aAAF,EAAEA,EAA6BvE,cACzDZ,K,kCClFb,yE,kCCAA,yGAoCO,MAAM0yC,EAA4CtzC,IACrD,MAAM,KAAE2R,EAAF,QAAQlN,EAAR,UAAiBzF,EAAjB,SAA4Bu0C,EAA5B,GAAsChxC,GAAOvC,EACnD,OAAQ3B,4BACJkE,GAAIA,EAAIjE,UAAU,aAAY,aAAaU,EAC3CyF,QAASA,EAAS6S,IAAKi8B,GACtB5hC,IAII+zB,EAAqB1lC,IACvB,CACH45D,MAAO4nB,EAAUxhF,GACjB65D,YAAa4nB,EAAgBzhF,GAC7B+5D,YAAa2nB,EAAgB1hF,GAC7Bg6D,UAAW37D,kBAAComD,YAAS,CAACnmD,UAAU,4BAIlCkjF,EAAaxhF,GAEX3B,kBAACkmD,QAAK,CACFqa,WAAS,EACTmiB,gBAAgB,aAChBY,eAAgB3hF,EAAM8lC,UACtBpxB,OAAQ1U,EAAM0U,OACd6Y,OAAQvtB,EAAMgmC,cACd1nC,UAAU,0BACVsjF,OAAQ,OAKdH,EAAmBzhF,GAEjB3B,kBAACmmD,cAAW,CAACj3B,OAAQvtB,EAAMgmC,eACtBhmC,EAAM0C,UAAUkjC,YAKvB87C,EAAmB1hF,GAEjB3B,kBAACumD,cAAW,KACRvmD,kBAACiG,SAAM,CAACG,QAASzE,EAAMgmC,cAAe1nC,UAAU,kCAC3C0B,EAAM0C,UAAUijC,wB,yJC1E1B,MAAMk8C,EAAwB,QAAC,UAAEzvB,EAAF,MAAahjD,EAAb,cAAoBijD,EAApB,cAAmCC,EAAnC,MAAkDE,EAAlD,WAAyDU,EAAzD,cAAqEC,EAArE,cAClCC,EADkC,cACnBC,EADmB,YACJV,EADI,SACSC,EADT,SACmBE,EADnB,YAC6BC,EAD7B,wBAC0CtB,EAD1C,qBACmEuB,EADnE,qBACyFC,EADzF,gBAC+GV,GADhH,SAEjCl0D,gBAAC6kC,OAAIngC,iBAAKqvD,GACDI,EACAf,EAA0BpzD,gBAAC6kC,OAAIngC,iBAAKmwD,GACrC70D,gBAAC6kC,OAAIngC,iBAAKowD,GACD/jD,EACAujD,GAERK,GACG30D,gBAAC6kC,OAAIngC,iBAAKqwD,GACLf,EACAO,GAERK,GACG50D,gBAAC6kC,OAAIngC,iBAAKswD,GACLf,EACAQ,IAEPE,GAAwBC,IAAyBV,GAC7Cl0D,gCACD+Q,EACAujD,GAEJI,IAIA+uB,EAAwB,QAAC,UAAE5tB,EAAF,iBAAaD,GAAd,SACjC51D,gBAAC6kC,OAAIngC,iBAAKmxD,GACLD,IAcM8tB,UAV4D/hF,IACvE,MAAM,0BAAEy1E,EAAF,KAA6B3vD,EAA7B,KAAmC/V,GAAS/P,EAClD,OACI3B,gBAAColC,SAAM1gC,iBAAK0yE,GACP3vD,GAAQznB,gBAACwjF,EAAI9+E,iBAAK+iB,IAClB/V,GAAQ1R,gBAACyjF,EAAI/+E,iBAAKgN,O,0PCGhBiyE,MA/BsC,QAAC,UAClD1jF,EADkD,KAElDoB,EAFkD,MAGlDb,EAHkD,IAIlD8nB,EAJkD,IAKlDrL,EALkD,KAMlDkjE,EANkD,aAOlDyD,EAPkD,aAQlDC,EARkD,aASlDC,EATkD,SAUlDjjF,EAVkD,OAWlDskE,EAXkD,GAYlDjhE,GAZiD,SAejDlE,yBACIC,UAAWA,EACXoB,KAAMA,EACNb,MAAOA,EACP8nB,IAAKA,EACLrL,IAAKA,EACLkjE,KAAMA,EAAI,gBACKyD,EAAY,gBACZC,EAAY,gBACZC,EACfjjF,SAAUA,EACVskE,OAAQA,EACRjhE,GAAIA,KCjBG6/E,MAXoD,IAI9D,IAJ+D,UAChE9jF,EADgE,KAEhEqT,EAFgE,QAGhE0wE,GACC,EAED,OAAQhkF,yBAAOC,UAAWA,EAAW+jF,QAASA,GACzC1wE,ICIM2wE,MAbkD,IAG5D,IAH6D,UAC9DhkF,EAD8D,KAE9DqT,GACC,EACD,OAAKA,EAIGtT,wBAAMC,UAAWA,GACpBqT,GAJM,M,ykBC2Df,IAAM4wE,EAAN,cAA8BlkF,YAO1B0B,YAAYC,GACRC,MAAMD,GALO,KAAA83D,gBAA0B,sBAE1B,KAAA0qB,sBAAgC,EAmQhC,KAAAliF,KAAOC,UAA0B,MAC9CC,KAAKR,MAAMS,YAAYH,KAAvB,GACII,OAAQF,KAAKE,OACbG,SAAUL,KAAKK,SACfC,SAAUN,KAAKM,SACfssD,YAAY,IACP5sD,KAAKk0D,aAAe,CAAE3zD,OAAQ,eAGf,UAAGP,KAAKR,MAAMsB,KAAKC,SAASC,cAA5B,aAAG,EAAiCouB,eAExDpvB,KAAKR,MAAMS,YAAY8E,UAChB/E,KAAKgI,iCACZhI,KAAKR,MAAMS,YAAYutD,SAEvBxtD,KAAKR,MAAMsB,KAAKmhF,YAAYjhF,QAC5BhB,KAAKR,MAAMsB,KAAKC,SAASC,QACzBhB,KAAKR,MAAMsB,KAAKmhF,YAAYjhF,OAAOkhF,aAAeliF,KAAKR,MAAMsB,KAAKC,SAASC,OAAOC,aAAamF,KAAKypB,eAEpG7vB,KAAKR,MAAMsB,KAAKC,SAASC,OAAOC,aAC3BkhF,oBAAoB,CAAEvyD,kBAAmB5vB,KAAKR,MAAMsB,KAAKmhF,YAAYjhF,OAAOkhF,aAC5Er8E,MAAM/D,IACC9B,KAAK4B,QAAQC,YACb7B,KAAK4B,QAAQC,UAAU6e,QAAQ5e,GAC/B9B,KAAK4B,QAAQC,UAAU0c,MAAM,yCAMhC,KAAAre,OAAS,KACtBF,KAAKR,MAAMS,YAAYwE,cAGV,KAAApE,SAAW,KACxBL,KAAKu0D,wBAGQ,KAAAj0D,SAAW,KACxBN,KAAKu0D,wBAGQ,KAAAA,qBAAuB,KACpC,MAAMnvD,EAAgBpF,KAAKR,MAAMsB,KAAKC,SAASC,OAC3CoE,GAAiBA,EAAcgqB,cAAgB,EAE/CpvB,KAAKR,MAAMS,YAAY8E,UAGvB/E,KAAKR,MAAMS,YAAYutD,UAId,KAAA0G,UAAY,IAErBl0D,KAAKR,MAAMoC,QAAQkE,QAAQwgB,KAAK+K,iBAChCrxB,KAAKR,MAAMsB,KAAKmhF,YAAYjhF,QAC5BhB,KAAKR,MAAMsB,KAAKmhF,YAAYjhF,OAAOkhF,YACnCliF,KAAKoiF,iBAzTTpiF,KAAKqiF,iBAAmBxkF,cACxBmC,KAAKsiF,oBAAsBtiF,KAAKsiF,oBAAoBtuE,KAAKhU,MACzDA,KAAKuiF,qBAAuBviF,KAAKuiF,qBAAqBvuE,KAAKhU,MAC3DA,KAAKq+D,eAAiBr+D,KAAKq+D,eAAerqD,KAAKhU,MAC/CA,KAAKwiF,QAAUxiF,KAAKwiF,QAAQxuE,KAAKhU,MACjCA,KAAKiJ,MAAQ,CAAEw5E,eAAgBziF,KAAK0iF,WAAYC,uBAAuB,GAG7C,uBAC1B,MAAMv8E,EAAOpG,KAAKR,MAAMsB,KAAKC,SAASC,OAAShB,KAAKR,MAAMsB,KAAKC,SAASC,OAAOC,aAAamF,UAAOhG,EACnG,IAAKgG,EACD,OAAO,EAKX,OADkBA,EAAKmV,aAAe,GACnB,EAGE,kBACrB,MAC6E,aAAxEvb,KAAKR,MAAMsB,KAAKC,SAASC,QAAUhB,KAAKR,MAAMsB,KAAKC,SAASR,SACW,aAAvEP,KAAKR,MAAMsB,KAAKmhF,aAAejiF,KAAKR,MAAMsB,KAAKmhF,YAAY1hF,SAC8C,aAAzGP,KAAKR,MAAMsB,KAAK8hF,8BAAgC5iF,KAAKR,MAAMsB,KAAK8hF,6BAA6BriF,QAI9E,iBACpB,OAAOP,KAAKR,MAAMsB,KAAK8hF,6BAA6B5hF,QAChDhB,KAAKR,MAAMsB,KAAK8hF,6BAA6B5hF,OAAO6hF,gCAAkC7iF,KAAKR,MAAMsB,KAAK8hF,6BAA6B5hF,OAAO6hF,gCAAkC,EAGtI,uCAC1C,MAAM,gBAAEr6E,EAAF,MAAmBC,GAAUzI,KAAKR,MAAMoC,QAAQkE,QACtD,SAAU0C,IAAmBC,GAAsB,MAAbA,EAAMC,IAGlB,0BAC1BC,YACI,IAAM3I,KAAK4I,YACX7I,gBACUC,KAAKF,SAInB+I,YACI,IAAM7I,KAAKR,MAAMsB,KAAKC,SAASC,QAAUhB,KAAKR,MAAMsB,KAAKC,SAASC,OAAOC,aAAamF,KACtFrG,UACIC,KAAK8iF,oBAIbj6E,YACI,IAAM7I,KAAKR,MAAMsB,KAAKmhF,YAAYjhF,OAClCjB,UACIC,KAAK+iF,mBAKVj6E,sBAAsBC,EACzBC,GACA,OAAIhJ,KAAKiJ,QAAUD,GAAahJ,KAAKR,MAAMsB,OAASiI,EAAUjI,KAM3DoI,SACH,MAAM,UACFhH,EADE,WAEF8I,EACA/K,aAAa,QAAEkJ,IACfnJ,KAAKR,MAET,GACIQ,KAAKR,MAAMsB,KAAKmhF,aAChBjiF,KAAKR,MAAMsB,KAAKmhF,YAAYjhF,QAC5BhB,KAAKR,MAAMsB,KAAKmhF,YAAYjhF,OAAOkhF,YACnCliF,KAAKoiF,iBACP,CACE,MAAMH,EAAcjiF,KAAKR,MAAMsB,KAAKmhF,YAAYjhF,OAC1CoE,EAAgBpF,KAAKR,MAAMsB,KAAKC,SAASC,OAC/C,IAAI2oE,GAAgB,EAEpB,GAAIxgE,EAAS,CACT,IAAK/D,GAAiD,IAAhCA,EAAcgqB,cAChC,OAAO,KAEXu6C,GAAgB,EAsHpB,OAAO3+D,EAlHQ,OACRhL,KAAKR,OADG,IAEXyK,UAAW,CACP0/D,gBACAC,kBAAmBzgE,GAEvBqgE,gBAAiB,CACbl/D,YAAatK,KAAKR,MAClB1B,UAAW+S,IACP7Q,KAAKs3D,gBACL,CAAE,CAAC,GAAD,OAAIt3D,KAAKs3D,gBAAT,cAAsCqS,GACxC3pE,KAAKR,MAAMgB,OAAO1C,YAG1B2rE,YAAa,CACT14D,QAASlT,gBAACq8B,UAAO,CAAC8oD,WAAW,KAAKllF,UAAS,UAAKkC,KAAKs3D,gBAAV,aAAsCnmD,KAAMjP,EAAU+gF,qBACjG3Z,kBACIzrE,gBAACqlF,EAAa,CAACplF,UAAS,UAAKkC,KAAKs3D,gBAAV,UAAmCnmD,KAAMjP,EAAUihF,2BAE/E5xD,OACI1zB,gBAAC4E,iBAAc,CACX3E,UAAS,UAAKkC,KAAKs3D,gBAAV,mBACTv1D,GAAI/B,KAAKR,MAAMuC,GACfC,SAAUhC,KAAKR,MAAMwC,SACrBJ,QAAS5B,KAAKR,MAAMoC,QACpBd,KAAM,CAAEqB,MAAO,CAAEO,wBAAyB0C,GAAiBA,EAAcgqB,mBAIrFs6C,WAAY,CACR34D,QAASlT,gBAACq8B,UAAO,CAAC8oD,WAAW,KAAKllF,UAAS,UAAKkC,KAAKs3D,gBAAV,aAAsCnmD,KAAMjP,EAAU+gF,qBACjG/9D,OAAQ,CACJniB,IAAKqgF,SACLtlF,UAAU,GAAD,OAAKkC,KAAKs3D,gBAAV,YACT+rB,iBAAkBrjF,KAAKsjF,gBACvB9uE,UAAU,GAAD,OAAKxU,KAAKs3D,gBAAV,iBACT7iD,WAAW,GAAD,OAAKzU,KAAKs3D,gBAAV,kBACVisB,eAAgB,OAEpBnb,WAAYvqE,gBAACqlF,EAAa,CAACplF,UAAS,UAAKkC,KAAKs3D,gBAAV,iBAA0CnmD,KAAM8wE,EAAYC,YAAc,KAC9G7Z,aACI4Z,EAAYuB,cACZvB,EAAYuB,aAAalgF,IAAI,CAACmgF,EAAQlgF,IAC3BvD,KAAK0jF,oBAAoBD,EAAQvhF,EAAUyhF,qBAAsBzhF,EAAU0hF,6BAE1Ftb,uBAAwB,CACpBxqE,UAAU,GAAD,OAAKkC,KAAKs3D,gBAAV,aAEbiR,8BAA+B,CAC3BzqE,UAAU,GAAD,OAAKkC,KAAKs3D,gBAAV,qBAEbkR,mBACI3qE,gBAACgmF,EAAc,CACX/lF,UAAS,UAAKkC,KAAKs3D,gBAAV,kBACTnmD,KAAMjP,EAAU4hF,0BAChBjC,QAAO,UAAK7hF,KAAKR,MAAMuC,GAAhB,YAGf0mE,mBACI5qE,gBAACkmF,EAAc,CACXjmF,UAAS,UAAKkC,KAAKs3D,gBAAV,kBACT54D,SAAUsB,KAAKq+D,eACf2E,OAAQhjE,KAAKwiF,QACbtjF,KAAK,SACL8+E,KAAK,MACL3/E,MAAO2B,KAAKiJ,MAAMw5E,eAClBt8D,IAAK,EACLrL,IAAK9a,KAAK0iF,WACVjB,aAAczhF,KAAK0iF,WACnBhB,aAAc,EACdC,aAAc3hF,KAAKiJ,MAAMw5E,eACzB1gF,GAAE,UAAK/B,KAAKR,MAAMuC,GAAhB,YAGV2mE,yBACI7qE,gBAACiG,SAAM,CACHhG,UAAS,UAAKkC,KAAKs3D,gBAAV,mBACTp5D,MAAO8B,KAAKR,MAAM0C,UAAU8hF,gCAC5B//E,QAASjE,KAAKsiF,oBACdt+E,SACIhE,KAAKiJ,MAAMw5E,eAAiBziF,KAAK0iF,YACjC1iF,KAAKiJ,MAAMw5E,gBAAkB,GAAKthE,MAAMnhB,KAAKiJ,MAAMw5E,iBACnDziF,KAAKiJ,MAAM05E,uBAGd3iF,KAAKR,MAAM0C,UAAU8hF,iCAG9Brb,kBAAmBvjE,GAAiBA,EAAcgqB,cAAgB,EAClEw5C,yBACI/qE,gBAACqlF,EAAa,CAACplF,UAAS,UAAKkC,KAAKs3D,gBAAV,kBAA2CnmD,KAAMjP,EAAUihF,2BAEvFta,0BACIhrE,gBAAC4E,iBAAc,CACX3E,UAAS,UAAKkC,KAAKs3D,gBAAV,mBACTv1D,GAAI/B,KAAKR,MAAMuC,GACfC,SAAUhC,KAAKR,MAAMwC,SACrBJ,QAAS5B,KAAKR,MAAMoC,QACpBd,KAAM,CAAEqB,MAAO,CAAEO,wBAAyB0C,GAAiBA,EAAcgqB,kBAGjF05C,0BACIjrE,gBAACiG,SAAM,CACHhG,UAAU,iCACVI,MAAO8B,KAAKR,MAAM0C,UAAU+hF,iCAC5BhgF,QAASjE,KAAKuiF,qBACdxvC,SAAU/yC,KAAKqiF,kBAEdriF,KAAKR,MAAM0C,UAAU+hF,sCAS1C,OADAjkF,KAAKR,MAAMoC,QAAQC,UAAUC,MAAM,yDAC5B,KAGHwhF,gBACJ,OACIzlF,gCACIA,qBAAGC,UAAS,UAAKkC,KAAKs3D,gBAAV,mBACPt3D,KAAKR,MAAM0C,UAAUihF,0BAE1BtlF,gBAAC4E,iBAAc,CACX3E,UAAS,UAAKkC,KAAKs3D,gBAAV,mBACTv1D,GAAI/B,KAAKR,MAAMuC,GACfC,SAAUhC,KAAKR,MAAMwC,SACrBJ,QAAS5B,KAAKR,MAAMoC,QACpBd,KAAM,CAAEqB,MAAO,CAAEO,wBAAyB1C,KAAK0iF,gBAMvDgB,oBACJQ,EACAf,EACAS,GAEA,MAAO,CACH1xE,IAAKgyE,EAAMC,eAAiB,GAC5Bnb,2BAA4B,CACxBlrE,UAAU,GAAD,OAAKkC,KAAKs3D,gBAAV,cAEbp5D,MAAOL,gBAACqlF,EAAa,CAACplF,UAAS,UAAKkC,KAAKs3D,gBAAV,mBAA4CnmD,KAAM+yE,EAAM1hF,cACvFymE,oBAAqBprE,gBAACqlF,EAAa,CAACplF,UAAS,UAAKkC,KAAKs3D,gBAAV,uBAAgDnmD,KAAMgyE,IACnGja,aACIrrE,gBAACqlF,EAAa,CAACplF,UAAS,UAAKkC,KAAKs3D,gBAAV,oBAA6CnmD,MAAO+yE,GAASA,EAAME,cAAe1zE,aAE9Gy4D,mBAAoBtrE,gBAACqlF,EAAa,CAACplF,UAAS,UAAKkC,KAAKs3D,gBAAV,sBAA+CnmD,KAAMyyE,IACjGxa,eACIvrE,gBAACqlF,EAAa,CACVplF,UAAS,UAAKkC,KAAKs3D,gBAAV,oBACTnmD,MAAO+yE,GAASA,EAAMG,oBAAqB3zE,cAoE1B,4BAC7B,MAAMtL,EAAgBpF,KAAKR,MAAMsB,KAAKC,SAASC,OAE1CoE,UAICA,EAAck/E,oBAAoB,CAAExrB,UAAWj4C,OAAO0jE,WAAWvkF,KAAKiJ,MAAMw5E,eAAe/xE,cACjG1Q,KAAK0V,SAAS,CACVitE,uBAAuB,KAIG,6BAC9B,MAAMv9E,EAAgBpF,KAAKR,MAAMsB,KAAKC,SAASC,OAE1CoE,UAICA,EAAck/E,oBAAoB,CAAExrB,UAAW,IACrD94D,KAAK0V,SAAS,CACV+sE,eAAgB,KAIhBpkB,eAAel2D,GACnB,MAAM9J,EAAQ8J,EAAMC,cAAc/J,MAClC2B,KAAK0V,SAAS,CAAE+sE,eAAgBpkF,EAAM+C,OAAS,EAAIyf,OAAOxiB,GAASwiB,OAAO0jE,WAAWlmF,GAAQskF,uBAAuB,IAGhHH,QAAQr6E,GACZ,MAAMq8E,EAAM3jE,OAAO0jE,WAAWp8E,EAAMC,cAAc/J,OAAOwwB,QAAQ,GAC3D61B,EAAUlW,SAASC,eAAT,UAA2BzuC,KAAKR,MAAMuC,GAAtC,WACZ2iD,GAAW8/B,IACX9/B,EAAQrmD,MAAQmmF,EAChBxkF,KAAK0V,SAAS,CAAE+sE,eAAgB5hE,OAAO0jE,WAAWC,MAIlDzB,iBACA/iF,KAAKR,MAAMS,YAAYwqC,YAAczqC,KAAKk0D,cAC1Cl0D,KAAK8iF,kBACL9iF,KAAKR,MAAMS,YAAYwE,cAIvBq+E,kBACJ,MAAM9rB,EAAOh3D,KAAKR,MAAMsB,KAAKmhF,YAAYjhF,OACnCD,EAAWf,KAAKR,MAAMsB,KAAKC,SAASC,OACpCoF,EAAOpG,KAAKR,MAAMsB,KAAKC,SAASC,OAAShB,KAAKR,MAAMsB,KAAKC,SAASC,OAAOC,aAAamF,UAAOhG,EAC7FqkF,EAAgBzkF,KAAKR,MAAMoC,QAAQkE,QAAQE,QACjD,GAAIgxD,GAAQA,EAAKkrB,YAAc97E,GAAQq+E,EAAe,CAClD,MAAMhwB,EAAegwB,EAAcl1D,UAAY,GACzCm1D,EAAqBC,sEAA4Dv+E,EAAKQ,GAAIowD,EAAKkrB,WAAYztB,GAIjHiwB,EAAmBE,OAAO92B,QAAQ76B,YAAc,MAEhD4xD,8BAAoDH,EAAoB1kF,KAAKR,MAAMoC,QAAQ6F,eACtFhC,KAAK1F,UAAe,MACjBC,KAAKR,MAAMoC,QAAQ6F,cAAcmwB,OAC7B,IAAIktD,uCAAqC9kF,KAAKR,MAAMoC,QAAQkE,QAAQ0T,aACpEiqE,GAEJ,MAAMsB,EAAY,UAAGtB,EAAOZ,uCAAV,QAA6C7iF,KAAKgiF,sBAGhEjhF,GAAaA,EAASquB,cAAgB21D,SAChChkF,EAASujF,oBAAoB,CAAExrB,UAAWisB,IAGpD/kF,KAAK0V,SAAS,CAAE+sE,eAAgBsC,EAAcpC,uBAAuB,MAExE98E,MAAM/D,IACH9B,KAAKR,MAAMoC,QAAQ6F,cAAc5F,UAAUyc,UAAUxc,GACrD9B,KAAKR,MAAMoC,QAAQ6F,cAAc5F,UAAU0c,MAAM,wDAlYvDtT,aAATE,KAAS,qCAWAF,aAATE,KAAS,gCAQAF,aAATE,KAAS,+BAKAF,aAATE,KAAS,qDAzCR42E,EAAe,aAFpB12E,kBACAC,KACKy2E,GAyZSA,a,sXC/cR,MAAMtlD,UAAiC5+B,gBAA9C0B,kCAEW,KAAA0J,MAAwC,CAC3C+7E,eAAe,EACfC,kBAAkB,GAyGL,KAAAC,WAAc/8E,IAC3BnI,KAAK0V,SAAS,CACVsvE,eAAe,IAGnBhlF,KAAKR,MAAMk9B,sBAEX18B,KAAK0V,SAAS,CACVsvE,eAAe,KAIN,KAAAG,cAAiBh9E,IAC9BnI,KAAK0V,SAAS,CACVuvE,kBAAkB,IAGtBjlF,KAAKR,MAAMm9B,qBAvHuB,gCAACn9B,EACnCyJ,GACA,MAAMyrB,EAAgBl1B,EAAMk1B,cAActzB,OAC1C,IAAI4H,E,yWAAS,IAAQC,GAKrB,OAJAD,EAAY,CACRg8E,cAAiC,IAAlBtwD,EACfuwD,iBAAoC,IAAlBvwD,GAEf1rB,EAGJE,SACH,MAAM,qBAAEg3D,EAAF,sBACFlC,EADE,qBAEFonB,EAFE,2BAGFnnB,EAHE,wBAIFoH,EAJE,sBAKFX,EALE,8BAMFC,EANE,eAOF0gB,EAPE,yBAQFpqE,EARE,yBASFE,EATE,oBAUFypD,EAVE,kCAWFC,EAXE,0BAYF/D,EAZE,+BAaFC,EAbE,mBAcFE,EAdE,0BAeFx0D,EAfE,kCAgBFgV,EAhBE,yBAiBF/U,EAjBE,0BAkBFC,EAlBE,2BAmBF24E,EAnBE,8BAoBFC,EApBE,0BAqBF9lB,EArBE,0BAsBFC,EAtBE,0BAuBFyF,EAvBE,gBAwBFL,EAxBE,yBAyBFjE,EAzBE,4BA0BF6C,EA1BE,0BA2BFC,EA3BE,sBA4BFN,GACArjE,KAAKR,MAAM0C,UACTsjF,EAAe,CACjB5jF,QAAS5B,KAAKR,MAAMoC,QACpBM,UAAW,CACPg+D,uBACAlC,wBACAonB,uBACAnnB,6BACAoH,0BACAX,wBACAC,gCACA0gB,iBACApqE,2BACAE,2BACAypD,sBACAC,oCACA/D,4BACAC,iCACAE,qBACAx0D,4BACAgV,oCACA/U,2BACAC,4BACA8yD,4BACAC,4BACAyF,4BACAL,kBACAjE,2BACA6C,8BACAC,4BACAN,yBAEJ/2D,cAAetM,KAAKR,MAAMgB,OAAO8L,cACjCkwB,gBAAiBx8B,KAAKR,MAAMg9B,iBAGhC,OACI3+B,gCACIA,gBAAC4/D,IAAiBl7D,iBAAKijF,IACvB3nF,gBAACiG,SAAM,CACHG,QAASjE,KAAKklF,WACdlhF,SAAUhE,KAAKiJ,MAAM+7E,cACrBlnF,UAAU,sBAAqB,aACnBwnF,GAEZznF,8BACEmC,KAAKR,MAAMo9B,gBAAkB0oD,GAEnCznF,gBAACiG,SAAM,CACHG,QAASjE,KAAKmlF,cACdnhF,SAAUhE,KAAKiJ,MAAMg8E,iBACrBnnF,UAAU,kBAAiB,aACfynF,GAEZ1nF,8BACEmC,KAAKR,MAAMo9B,gBAAkB2oD,O,2FC1HnD,MAAME,EAA6D,IAG9D,IAH+D,oBAChEj7E,EADgE,KAEhEC,GACC,EACD,OAAKA,GAAwB,IAAhBA,EAAKrJ,OAKdvD,gBAAC6kC,OAAIngC,iBAAKiI,GACLC,EAAKnH,IAAK9B,GACC3D,gBAAC6kC,OAAIngC,iBAAKf,EAAea,eAAc,CAAE6P,IAAK1Q,EAAegC,KAAI,aAAa,qCACjFhC,EAAeiC,YACfjC,EAAe5D,YACf4D,EAAeW,SATrB,MAgBTujF,EAA4D,IAI7D,IAJ8D,eAC/DrjF,EAD+D,YAE/DzE,EAF+D,MAG/DuE,GACC,EAED,OACItE,gBAAC6kC,OAAIngC,iBAAKF,GACLzE,EACAuE,IAKP8wC,EAAwD,IAIzD,IAJ0D,MAC3DzoB,EAD2D,MAE3DtsB,EAF2D,QAG3DF,GACC,EAED,OACIH,gBAAC6kC,OAAIngC,iBAAKioB,GACLtsB,EACAF,IA+BE2nF,UA1BkEnmF,IAC7E,MAAM,wBAAEF,EAAF,UACF2K,EADE,gBAEFtK,EAFE,uBAGF+K,EAHE,aAIFvH,EAJE,QAKFwH,EALE,WAMFE,EANE,WAOFC,EAPE,aAQFC,GAAiBvL,EAErB,OAGI3B,gBAAColC,SAAM1gC,iBAAKjD,GACP2K,EAAUrK,WAAa+K,EACvBV,EAAUX,SAAWnG,GAAgBtF,gBAACo1C,EAAY1wC,iBAAKY,IACvD8G,EAAUV,YAAc5J,GAAmB9B,gBAAC4nF,EAAkBljF,iBAAK5C,IACnEsK,EAAUT,gBAAkBkB,GAA0B7M,gBAAC6nF,EAAsBnjF,iBAAKmI,IAClFT,EAAUC,kBAAoBW,EAC9BZ,EAAUG,kBAAoBU,EAC9Bb,EAAUI,oBAAsBU,K,4ICtDtC,MAAMmnC,EAA8D,IAOtE,IAPuE,QACxEjmC,EADwE,QAExErK,EAFwE,cAGxE0K,EAHwE,UAIxEpK,EAJwE,iBAKxEzD,EALwE,eAMxEgyC,GACC,EACD,GAAgB,OAAZxkC,EACA,OAAO,KAGX,MAAMid,EAAcjd,EAAQtC,KACtBi8E,EAAkB35E,GAAWA,EAAQI,SAAWJ,EAAQI,SAAW,EACnEa,EAAagN,gCAAsBjO,EAAQtC,MAAQ,GAAIi8E,EAAiBhkF,GAAWA,EAAQ6F,mBAAerH,GAC1G2mE,EAAgBztD,8BAAoBrN,EAAQsN,OAAQ3X,EAAQ6F,cAAc8L,eAAeiG,aACzFzI,EAAU0/B,GAAqC,iBAAnBA,EAAoCvuC,EAAU2jF,+BAAiC3jF,EAAU4jF,yBAGrHnnF,EAAUC,2BAAiB,QAASH,EAAmByqB,EAAc08D,EAAgBl1E,YAErFuC,EAAYjU,iCAAuBP,EAAmBE,GAC5D,OACId,uBAAKC,UAAU,kCACXD,mCACI4P,KAAMP,EAAYjJ,QAASq1E,2BAAiB76E,EAAmBE,EAASsN,EAAQtC,OAAYsJ,EAAS,cACzFhH,EAAQtC,OACpB9L,uBAAKC,UAAU,0CAiB/B,SACIwO,EAAgCW,EAA8BqvD,EAC9D3iD,EAAkBotD,EAAwBnlE,GAE1C,IAAK06D,IAAarvD,IAAiBX,EAC/B,OAAO,KAEX,MAAMy5E,EAAkB,CACpBnsE,IAAK0iD,EACL3iD,QAASA,GAAoB,IAE3BqsE,EAAa,CACf/4E,eACAX,gBACAuN,YAAaktD,GAEjB,OACIlpE,gBAAC6b,IAAKnX,iBACEwjF,EAASC,EAAU,CAAElsE,oBAAoB,QAC7CvG,eAAgB3R,KAnCPqkF,CACG35E,EAAe1K,EAAQkE,QAAQmH,aAAchB,EAAQsC,gBACrDtC,EAAQtC,KAAMo9D,EAAenlE,EAAQ6F,cAAc8L,kBAG/D1V,uBAAKC,UAAU,2CACXD,qBAAGC,UAAU,4CACRiT,IAiCO7S,EA/BQ+N,aAAD,EAACA,EAAStC,KAgCjC9L,sBAAIC,UAAU,kDACjBI,MAFT,IAA4BA,I,+FCjD5B,MAAMgoF,UAA2BroF,gBAO7B0B,YAAYC,GACRC,MAAMD,GAPO,KAAA2mF,cAAoDtoF,cAEpD,KAAAuoF,YAA+CvoF,cA4G/C,KAAAwoF,aAAe,KAC5B,MAAM,SAAEC,EAAF,QAAYn9E,EAAZ,aAAqBo9E,EAArB,gBAAmCp5B,EAAnC,gBAAoDq5B,EAApD,SAAqEnmF,EAArE,SAA+EC,EAA/E,SAAyFqwE,GAAa3wE,KAAKR,OAC3G,aAAEqE,EAAF,eAAgBS,EAAhB,wBAAgCmiF,GAA4B9V,EAE5D+V,GAAav9E,GAAW7I,EACxBqmF,GAAax9E,GAAWm9E,GAAYn5B,GAAmB9sD,EAE7D,IAAKmmF,IAAqBE,IAAcC,EACpC,OAAO,KAGX3mF,KAAKrB,QAAQQ,cAAcC,MAAQknF,EAAWznF,oBAAkB+nF,KAAO/nF,oBAAkBgoF,aACzF,MAAMC,EAAoB9nF,iCAAuBgB,KAAKR,MAAMf,iBAAmBuB,KAAKrB,SACpFqB,KAAKrB,QAAQQ,cAAcC,MAAQP,oBAAkBkoF,OACrD,MAAMC,EAAsBhoF,iCAAuBgB,KAAKR,MAAMf,iBAAmBuB,KAAKrB,SAEtF,OACId,uBAAKC,UAAU,mCACV4oF,GACG7oF,gBAACiG,SAAMvB,eACHzE,UAAWyM,IAAU,oCAAqC,CAAE,gBAAiBg8E,IAC7EroF,MAAOooF,EAAWziF,EAAe4iF,EACjC1iF,MAAM,UACNC,SAAUuiF,EACVtiF,QAAS3D,GACLwmF,GAEHR,GAAYn5B,EAAkBtpD,EAAe4iF,GAGrDE,GACG9oF,gBAACiG,SAAMvB,eACHzE,UAAU,sCACVI,MAAOoG,EACPP,MAAM,YACNE,QAAS5D,GACL2mF,GAEH1iF,KAOJ,KAAA2iF,6BAA+B,KAC5C,MAAMC,EAAOlnF,KAAKomF,YAAYnlE,QAcxBkhB,EAAQ+kD,GAAQA,EAAKC,eAAkBD,EAAKC,cAb1B,6dAcxBhlD,GAASA,EAAMuM,OAASvM,EAAMuM,SAGjB,KAAA04C,kBAAoB,KAEjC,MAAMt8E,EACF9K,KAAKmmF,eACLnmF,KAAKmmF,cAAcllE,SACnBjhB,KAAKmmF,cAAcllE,QAAQytB,OAC1B1uC,KAAKmmF,cAAcllE,QACxBnW,GAAcA,EAAW4jC,SAGZ,KAAA24C,cAAgB,KAE7B,MAAMC,EAAWtnF,KAAKR,MAAMkZ,UAAY1Y,KAAKomF,aAAepmF,KAAKomF,YAAYnlE,SAAYjhB,KAAKomF,YAAYnlE,QAC1GqmE,GAAYA,EAASC,kBAGR,KAAAC,SAAW,KACxB,MAAM,KAAExJ,EAAF,MAAQ9/E,GAAU8B,KAAKR,OACrBwjF,WAAYyE,EAAM,KAApB,KAA0Bt2E,EAAO,IAAOjT,GAAS,GACvD,OACIL,gBAAC4pF,EAAG,CAAC3pF,UAAU,kCACXD,wBAAMC,UAAU,uCACXkgF,EAAO,EADZ,IAGK,KAEJ7sE,GAAQtT,wBAAMC,UAAU,uCACpBqT,KAjMbnR,KAAKrB,QAAUC,2BAAiB,QAASY,EAAMf,iBAAmB,IAG/Dy+E,mBAAmBwK,GAItB,MAAM,SAAEC,EAAF,QAAYx+E,EAAZ,OAAqBy+E,EAArB,SAA6BtB,EAA7B,OAAuCpmF,GAAWF,KAAKR,MAGzDmoF,GAAYx+E,GACZy+E,MAKgBF,EAAUv+E,SAAWu+E,EAAUpB,YAAcoB,EAAUxnF,UAC3DiJ,GAAWm9E,KAAcpmF,KAErCF,KAAKonF,oBACLpnF,KAAKqnF,iBAKLK,EAAUv+E,UAAYA,GACtBnJ,KAAKinF,+BAIN/9E,SACH,MAAM,MACFhL,EADE,SAEF8F,EAFE,WAGFoxE,EAHE,SAIFuS,EAJE,SAKFrB,EALE,SAMF3xE,EANE,QAOFxL,EAPE,UAQF8jD,EARE,WASF7jD,EATE,eAUFujD,EAVE,gBAWF65B,EAXE,OAYFtmF,EAZE,SAaFywE,GACA3wE,KAAKR,OACH,eAAEqoF,GAAmBlX,EAE3B3wE,KAAKrB,QAAQQ,cAAcC,MAAQP,oBAAkBipF,eACrD,MAAMC,EAAsB/oF,iCAAuBgB,KAAKR,MAAMf,iBAAmBuB,KAAKrB,SAChFqpF,EAAUxB,GAAmBr9E,GAAWm9E,GAAYpmF,EAE1D,OACIrC,uBACIC,UAAWyM,IAAU,2BAA4B,CAC7C09E,OAAQN,EACRtS,SAAUD,EACV8S,QAAS9S,EACT+S,OAAQ7B,EACR8B,OAAQpkF,EACRqkF,YAAa17B,EACb3oD,WACAskF,MAAOn/E,EACP8lC,QAASge,EACTs7B,SAAUn/E,IAEd0N,IAAK9W,KAAKomF,aAEVvoF,uBAAKC,UAAU,mCACVkC,KAAKwnF,WAELQ,GACGnqF,gBAACiG,SAAMvB,eACHwwC,SAAU/yC,KAAKmmF,cACfroF,UAAU,oCACVI,MAAO2pF,EACP9jF,MAAM,OACNE,QAAS/D,EACT8C,KAAK,OAAM,aACC9E,GAASA,EAAMiT,KAAf,UAAyB02E,EAAzB,YAA2C3pF,EAAMiT,MAAS,IAClE42E,GAEHF,IAKbhqF,uBACIC,UAAWyM,IAAU,gCAAiC,CAClD69E,QAAShT,KAGbv3E,uBAAKC,UAAU,oCACV6W,GAGJ3U,KAAKqmF,kBAwGXH,O,0MCpPR,MAAMsC,GACGv9E,aAAXC,KAAW,iCAEAD,aAAXC,KAAW,4CAEAD,aAAXC,KAAW,iD,ICCJu9E,E,kFAAZ,SAAYA,GACRA,4BACAA,oBACAA,oBACAA,cAJJ,CAAYA,MAAc,KAUnB,MAAMC,EAWTnpF,YAAmB2hE,EAAqBynB,EAAcC,EAAyBC,EAAoBC,GAQ5F,KAAAxS,YAAc,IAAM,+BAEpB,KAAAC,mBAAqB,IAAM,+BAE3B,KAAAC,cAAgB,IAAiB,OAXpCx2E,KAAK+oF,YAAc7nB,EACnBlhE,KAAKgpF,gBAAkBL,EACvB3oF,KAAK4oF,eAAiBA,EACtB5oF,KAAK6oF,UAAYA,EACjB7oF,KAAK8oF,UAAYA,GAiCzB/oF,eAAekpF,EACXz9E,EACA09E,EACA9+D,GAEA,MAAM/D,EAAYie,YAAala,EAAI7W,gBAC7B41E,EAA2C,CAC7CC,sBAAuB,CACnB7nB,gBAAiB/1D,EAAMu9E,aAAev9E,EAAMu9E,YAAY3nF,OAAS,EAAIoK,EAAMu9E,YAAc,GACzF3nB,QAAS,CACLC,WAAYj3C,EAAI7W,eAAeiG,YAAY0E,UAC3CtQ,UAAWyY,IAGnBgjE,UAAW79E,EAAMq9E,UACjBS,UAAW99E,EAAMs9E,UACjBL,eAAgBj9E,EAAMo9E,gBAGpBW,QAA0BC,oCAC5B,CAAEhiF,cAAe4iB,EAAK1iB,oBAAqB,CAAEwoC,OAAQ,CAAEC,IAAK3kC,EAAMw9E,mBAClEG,GAGAI,GAAqBA,EAAkBnoF,OAAS,GAEhDmoF,EAAkBjmF,IACbiM,GAA4BA,EAAKk6E,SAAWl6E,EAAKk6E,SAAWC,2BAAiBn6E,EAAKk6E,SAAUr/D,EAAI7W,eAAeiG,aAAe,IAGnI0vE,EAAYS,iBAAmBJ,GAE/Bn/D,EAAIvoB,UAAUC,MAAd,mGAAgHqnF,EAAeV,iBAUxHmB,MANqCC,YAA2B,CAC3E9nF,GAAI,iEACJqJ,OApDGrL,eAA0CyL,EAAyB4e,GAEtE,IAAK5e,IAAUA,EAAMu9E,YACjB,MAAM,IAAIv+D,MAAM,oEAGpB,MAAM0+D,EAA+B,GAE/BY,EAAsB,CAACb,EAAgBz9E,EAAO09E,EAAa9+D,IACjE,OAAOhI,QAAQwQ,IAAIk3D,GAAqBrkF,KAAK,IAClCyjF,IA2CX19E,MA9DiBu+E,GACV,IAAIrB,I,sECrBf,IAAI/pF,EAMG,MAAMqrF,EAAgCxqF,IACzC,MAAM,YACFyqF,EADE,WAEF/oB,EACAgpB,kBACIhoF,WAAW,0BAAEioF,KAEjB3qF,EAEEm1C,EAAgC,GACtCh2C,EAAUC,2BAAiB,QAASY,EAAMf,iBAAmB,IAE7DwrF,WAAa3mF,IAAIiM,IACbolC,EAAW3iC,KAAKgmC,EAAczoC,EAAM/P,MAKxC,MAAO,CAAEtB,MAFSksF,EAAaD,EAA2BjpB,GAE/B/vD,KAAMwjC,IAG/By1C,EAAe,CAACD,EAAmCjpB,KACrD,MAAMmpB,EAAgCF,EAA4BzuE,iBAAOyuE,EAA2BjpB,GAArC,kBAA8DA,EAA9D,mBAE/D,OAAQrjE,sBAAIC,UAAU,0CACjBusF,IAIHryC,EAAgB,CAACzoC,EAAwB/P,KAC3C,MAAM,WAAE0hE,EAAF,UAAc2nB,EAAd,UAAyBC,EAAzB,mBAAoCwB,GAAuB9qF,EAE3D+qF,EAAaD,EAAqB/6E,EAAKgL,MAAQhL,EAAKgL,OAAShL,EAAKgL,MAAMmW,MAAM,KAAK85D,MACnFhsF,EAAY+rF,EAAaA,EAAW95E,QAAQ,IAAIy4C,OAAJ,WAAe2/B,EAAf,KAA6B,MAAO,IAAIp4E,QAAQ,IAAIy4C,OAAJ,WAAe4/B,EAAf,KAA6B,MAAO,IAAMv5E,EAAKgL,OAAShL,EAAKgL,MAAM9J,QAAQ,IAAIy4C,OAAJ,WAAe2/B,EAAf,KAA6B,MAAO,IAAIp4E,QAAQ,IAAIy4C,OAAJ,WAAe4/B,EAAf,KAA6B,MAAO,IACjQnqF,EAAQQ,cAAcC,MAAQmQ,EAAKgL,MACnC,MAAMtH,EAAYjU,iCAAuBQ,EAAMf,iBAAmBE,GAClE,OACId,sBAAIC,UAAU,wCAAwCoU,IAAK3C,EAAK3I,IAC5D/I,gDAAeW,EAAWiP,KAAMg9E,EAAcl7E,EAAM2xD,EAAY1hE,IAAYyT,GACvEw3E,EAAcl7E,EAAM2xD,EAAY1hE,IAAUkrF,EAAoBH,GAA0B,GAAI1B,EAAWC,MAMlH2B,EAAgB,CAACE,EAA8BzpB,EAAoB1hE,IAC9DmrF,GAAcA,EAAW/jF,GAAKgkF,EAAiBD,EAAW/jF,GAAIs6D,EAAY1hE,GAAS,GAGxForF,EAAmB,CAAC7oF,EAAYm/D,EAAoB1hE,KAA8C,MACpG,MAAM,cAAEqrF,EAAF,UAAiBC,EAAjB,eAA4BC,GAAmBvrF,EAErD,IAAK4N,IAASC,UACV,MAAO,GAGX,MAAM29E,EAAW,IAAIz9E,IAAIs9E,EAAer9E,OAAO3B,SAAS4B,MAEpDq9E,GAAa5pB,GACb8pB,EAASt9E,aAAaC,IAAIm9E,EAAW5pB,GAGzC,MAAM+pB,EAAmBF,aAAH,EAAGA,EAAgBxpF,KAAK6nC,GACnCA,EAASgyB,cAAgBl7B,uBAAqBgrD,UAEnD7hD,EAAU4hD,SAAH,UAAGA,EAAkB/oD,cAArB,aAAG,EAA0B3gC,KAAKgO,GACpCA,EAAKsxB,kBAAoBhgB,OAAOC,SAAS/e,EAAI,KAGlDopF,EAAiB9hD,GAAWuG,KAAKW,UAAU66C,EAAiB,CAAC/hD,KAKnE,OAJI8hD,GACAH,EAASt9E,aAAaC,IAAI,WAAYw9E,GAGnCH,EAASv9E,MAGdi9E,EAAsB,CAACC,EAAoB9B,EAAmBC,KAChE,MAAMuC,EAAgBV,EACjBl6E,QAAQ,IAAIy4C,OAAJ,WAAe2/B,EAAf,KAA6B,MAAO,YAC5Cp4E,QAAQ,IAAIy4C,OAAJ,WAAe4/B,EAAf,KAA6B,MAAO,aAEjD,OAAOjrF,wBAAMyhE,wBAAyBgsB,YAAgBD,MAKpDE,EAAwB,CAAC,gBAAiB,uBAAwB,kBAAmB,qBAAsB,wBAAyB,YAMpIH,EAAoBhiD,IACtB,MAAMoiD,EAA4C,GAUlD,OARApiD,EAASt3B,QAASu3B,IACd,MAAMoiD,EAAyC,GAC/CF,EAAsBz5E,QAAS45E,IAC3BD,EAAkBz5E,KAAKq3B,EAAQqiD,MAEnCF,EAAmBx5E,KAAKy5E,KAGrBD,GCvGEG,EAAiBnsF,IAC1B,MAAM,UACFsrF,EADE,kBAEFc,EAFE,gBAGFC,EAHE,gBAIFjuB,EAJE,kBAKFrnD,EALE,SAMFP,EANE,oBAOF81E,EAPE,yBAQFC,EARE,MASFtjF,EATE,gBAUFujF,EAVE,gBAWFC,EAXE,gBAYFC,GACA1sF,EAEEiX,EAnBqBF,IAAgDpO,IAC3EoO,EAAkBpO,EAAMiJ,OAAO/S,OAAS,KAkBlBqY,CAAsBH,GAEtC41E,EAAaN,EAafhuF,yBACIC,UAAU,0BACVoB,KAAK,OAAM,aACC+sF,EACZ5sF,KAAMyrF,EACNz4B,YAAau5B,EACb90E,IAAK8mD,EACLl/D,SAAU+X,EACVpY,MAAOoK,IApBX5K,yBACIC,UAAU,0BACVoB,KAAK,OAAM,aACC+sF,EACZ5sF,KAAMyrF,EACNz4B,YAAau5B,EACb90E,IAAK8mD,EACLl/D,SAAU+X,EACVQ,UAAWjB,EACX3X,MAAOoK,IAeT2jF,GAAiBN,GACnBjuF,gBAACiG,SAAM,CAAChG,UAAU,+BAA8B,aAAaouF,IAYjE,MAAO,CAAE1gF,MAAO2gF,EAAWzZ,UARvB70E,gBAACiG,SAAM,CACHhG,UAAYguF,EAAuD,uCAAjC,+BAAuE,aAC7FE,EACZ/nF,QAAS8nF,EACT7sF,KAAK,WAIwCyzE,UAAWyZ,IClEpE,IAAIztF,EAMG,MAAM0tF,EAA+B7sF,IACxC,MAAM,YACFyqF,EADE,UAEFpB,EAFE,UAGFC,GACAtpF,EAEJb,EAAUC,2BAAiB,QAASY,EAAMf,iBAAmB,IAE7D,MAAMk2C,EAAgC,GAMtC,OAJAs1C,WAAa3mF,IAAIiM,IACbolC,EAAW3iC,KAAKgmC,EAAczoC,EAAMs5E,EAAWC,EAAWtpF,MAGvD,CAAE2R,KAAMwjC,IAGbqD,EAAgB,CAACzoC,EAAwBs5E,EAAmBC,EAAmBtpF,KACjF,MAAMhB,EAAY+Q,EAAKgL,OACtBhL,EAAKgL,MAAO9J,QAAQ,IAAIy4C,OAAJ,WAAe2/B,EAAf,KAA6B,MAAO,IAAIp4E,QAAQ,IAAIy4C,OAAJ,WAAe4/B,EAAf,KAA6B,MAAO,IACzGnqF,EAAQQ,cAAcC,MAAQZ,EAC9B,MAAMyU,EAAYjU,iCAAuBQ,EAAMf,iBAAmBE,GAClE,OACId,sBAAIC,UAAU,uCAAuCoU,IAAK3C,EAAK3I,IAC3D/I,gDACgBW,EACZiP,KAAMg9E,EAAcl7E,EAAMs5E,EAAWC,EAAWtpF,IAC5CyT,GAEHw3E,EAAcl7E,EAAMs5E,EAAWC,EAAWtpF,IACvCkrF,EAAoBn7E,EAAKgL,MAAQhL,EAAKgL,MAAQ,GAAIsuE,EAAWC,MAM3E2B,EAAgB,CAACE,EAA8B9B,EAAmBC,EAAmBtpF,KACvF,MAAM,cAAEqrF,EAAF,UAAiBC,GAActrF,EAE/B8sF,EAAiB3B,EAAWpwE,MAC7B9J,QAAQ,IAAIy4C,OAAJ,WAAe2/B,EAAf,KAA6B,MAAO,IAC5Cp4E,QAAQ,IAAIy4C,OAAJ,WAAe4/B,EAAf,KAA6B,MAAO,IAEjD,IAAK17E,IAASC,UACV,MAAO,GAGX,MAAM29E,EAAW,IAAIz9E,IAAIs9E,EAAer9E,OAAO3B,SAAS4B,MAKxD,OAJIq9E,GAAawB,GACbtB,EAASt9E,aAAaC,IAAIm9E,EAAWwB,GAGlCtB,EAASv9E,MAGdi9E,EAAsB,CAACC,EAAoB9B,EAAmBC,KAChE,MAAMuC,EAAgBV,EACjBl6E,QAAQ,IAAIy4C,OAAJ,WAAe2/B,EAAf,KAA6B,MAAO,YAC5Cp4E,QAAQ,IAAIy4C,OAAJ,WAAe4/B,EAAf,KAA6B,MAAO,aAEjD,OAAOjrF,wBAAMyhE,wBAAyBgsB,YAAgBD,MC7E7CxH,EAAkBrkF,IAC3B,MAAM,iBAAE+sF,EAAF,sBAAoBC,EAApB,qBAA2CC,EAA3C,WAAiEC,EAAjE,qBAA6EC,EAA7E,gBAAmGd,EAAnG,yBAAoHE,EAApH,iBAA8IttF,GAAqBe,EACnKb,EAAUC,2BAAiB,QAASH,EAAkBiuF,EAAY,IAClE3tF,EAAaC,iCAAuBP,EAAkBE,GAE5D,OACId,uBAAKC,UAAWyuF,GACZ1uF,gBAACiG,SAAMvB,eACHzE,UAAU,kBAAiB,gBACZ2uF,EAAoB,aACvBD,EACZvoF,QAAS8nF,EACTh5C,SAAU45C,GACN5tF,IAEF8sF,GAAmBhuF,wBAAMC,UAAU,uBAAsB,kBACtD4uF,M,8OCiBrB,IAAI/tF,EACAF,EAMG,MAAMmuF,EAA+BptF,IACxC,MAAM,YACFyqF,EADE,UAEFnB,EAFE,UAGFD,EACAqB,kBACItoF,SAAS,cAAE6F,GACXvF,WAAW,yBAAE2qF,IANf,WAQFlgD,EARE,SASFlN,GACAjgC,EACEm1C,EAA4C,GAClDl2C,EAAmBe,EAAMf,iBACzBE,EAAUC,2BAAiB,QAASY,EAAMf,iBAAmB,IAE7DwrF,WAAa3mF,IAAIiM,IACbolC,EAAW3iC,KAAKgmC,EAAczoC,EAAMs5E,EAAWC,EAAWrhF,EAAejI,EAAOmtC,EAAYlN,MAKhG,MAAO,CAAEvhC,MAFSksF,EAAayC,GAEJ59E,MAAO0lC,IAGhCy1C,EAAgByC,IAClB,MAAMC,EAA+BD,GAAsD,iBAE3F,OAAQhvF,sBAAIC,UAAU,yCACjBgvF,IAIH90C,EAAgB,CAClBzoC,EACAs5E,EACAC,EACArhF,EACAjI,EACAmtC,EACAlN,KAC6B,QAC7B,MAAM9lB,EACFpK,EAAKgL,OACJhL,EAAKgL,MAAO9J,QAAQ,IAAIy4C,OAAJ,WAAe2/B,EAAf,KAA6B,MAAO,IAAIp4E,QAAQ,IAAIy4C,OAAJ,WAAe4/B,EAAf,KAA6B,MAAO,IAEvG3mF,EAAK,UAAGoN,EAAKw9E,cAAR,iBAAG,EAAaxyE,aAAhB,aAAG,EAAoByyE,aAClC,MAAO,CACH77E,KAAMu5E,EAAoBn7E,EAAKgL,MAAQhL,EAAKgL,MAAQ,GAAIsuE,EAAWC,GACnEtV,UAAWyZ,EAAiB19E,EAAMoK,GAAoB,GAAIna,GAC1D2C,OAAQ6X,mBAAiBC,kBAAkB9X,IACvCklE,EAAallE,EAAOA,EAAOs9B,EAAUkN,EAAYntC,GACrD8zE,UAAW4Z,IACX3Z,SAAU4Z,EAAa59E,EAAMs5E,EAAWC,EAAWrhF,EAAejI,GAClEuC,GAAIwN,EAAK3I,KAIXsmF,EAAgB,KACX,CACHpvF,UAAW,uCACXiF,IAAK,OAIPoqF,EAAe,CAAC59E,EAAwBs5E,EAAmBC,EAAmBrhF,EAA+BjI,KAC/G,MACI0qF,kBAAkB,QAAEtoF,IACpBpC,EACEhB,EAAY+Q,EAAKgL,OAClBhL,EAAKgL,MAAO9J,QAAQ,IAAIy4C,OAAJ,WAAe2/B,EAAf,KAA6B,MAAO,IAAIp4E,QAAQ,IAAIy4C,OAAJ,WAAe4/B,EAAf,KAA6B,MAAO,IAE7GnqF,EAAQQ,cAAciuF,MAAQ79E,EAAK3I,GACnC,MAAMqM,EAAYjU,iCAAuBP,EAAmBE,GACtD45B,EAAe32B,EAAQ8yD,iBAAiBC,eAAeplD,EAAKw9E,OAAQxyE,MAAOyyE,cAEjF,O,yWAAO,CAAP,CACIlvF,UAAW,uCACXiF,IAAK,IACL,aAAa,GAAb,OAAiBvE,EAAjB,YAA+B+5B,GAC/B9qB,KAAMg9E,EAAcl7E,EAAMs5E,EAAWC,EAAWrhF,IAC7CwL,IAILw3E,EAAgB,CAACE,EAA8B9B,EAAmBC,EAAmBrhF,KACvF,MAAM6kF,EAAiB3B,EAAWpwE,MAAiB9J,QAAQ,IAAIy4C,OAAJ,WAAe2/B,EAAf,KAA6B,MAAO,IAAIp4E,QAAQ,IAAIy4C,OAAJ,WAAe4/B,EAAf,KAA6B,MAAO,IAC/I,OAAO6B,EAAWpwE,OAASowE,EAAW/jF,GAAKsT,gCAAsBoyE,EAAe3B,EAAW/jF,GAAyBa,OAAerH,GAAa,IAG9IsqF,EAAsB,CAACC,EAAoB9B,EAAmBC,KAChE,MAAMuC,EAAgBV,EACjBl6E,QAAQ,IAAIy4C,OAAJ,WAAe2/B,EAAf,KAA6B,MAAO,YAC5Cp4E,QAAQ,IAAIy4C,OAAJ,WAAe4/B,EAAf,KAA6B,MAAO,aAEjD,OAAOjrF,wBAAMC,UAAU,sDAAsDwhE,wBAAyBgsB,YAAgBD,MAGpHhkB,EAAe,CAACgmB,EAAuBC,EAAmB7tD,EAAkBkN,EAAoBntC,KAAyD,MAC3J,MACI0qF,kBAAkB,QAAEtoF,IACpBpC,EAEJ,OACI3B,gBAAC4E,iBAAc,CACXV,GAAI09B,EACJz9B,SAAU2qC,EACV/qC,QAASA,EACTd,KAAM,CACFqB,MAAO,CACHO,wBAAyB2qF,EACzBjmE,UAAWkmE,IAGnBxvF,UAAU,6CACV6E,cAAa,UAAEnD,EAAM0C,iBAAR,aAAE,EAAiBS,iBAKtCsqF,EAAmB,CAACtC,EAA8BhxE,EAAiBna,KACrE,MACI0qF,kBACItoF,SACIkE,SAAS,aAAEmH,IAEfzM,QAAQ,cAAE8L,KAEd9M,EAKJ,GAJI8M,IACAA,EAAc6M,iBAAkB,IAG/BwxE,IAAeA,EAAWlB,SAE3B,OADAjqF,EAAMqC,UAAUC,MAAM,2DACf,KAaX,OACIjE,gBAAC6b,IAAK,CACFnG,eAAgB/T,EAAM0qF,iBAAiBtoF,QAAQ6F,cAAc8L,eAC7DoG,QAASA,EACT7b,UAAU,2CACV8b,IAAK+wE,EAAWlB,SAChBx8E,aAAcA,EACdX,cAAeA,GAjBsB,CACzCsM,UAAW,CACPC,GAAI,CAAEC,EAAG,gBAAiBC,EAAG,EAAGC,EAAG,GACnCC,GAAI,CAAEH,EAAG,gBAAiBC,EAAG,EAAGC,EAAG,GACnCkU,GAAI,CAAEpU,EAAG,gBAAiBC,EAAG,EAAGC,EAAG,IAEvCE,UAAU,EACVC,iBAAiB,GAWbW,oBAAoB,W,0kBC5IhC,MAAM6jD,WAAe9/D,YAgCjB0B,YAAYC,GACRC,MAAMD,GApBO,KAAAqpF,UAAoB,IAEpB,KAAAC,UAAoB,IAEpB,KAAAvsE,SAAmB,IAqQnB,KAAAgxE,eAAiB,KAC9B,MAAMC,EAAcxtF,KAAKR,MAAM0C,UAAUurF,gCACzC,OAAQ5vF,gBAAC+iE,IAAO,CACZ9iE,UAAU,iCACV8Q,MAAO4+E,EACPE,KAAMC,IAAYC,OAClBC,cAAc,WAIL,KAAAC,gBAAmBt4E,IAChC,MAAM,YAAEy0E,GAAgBjqF,KAAKiJ,MAGzBghF,GACAA,EAAYN,kBACuB,OAAnCn0E,EAAEpE,OAAO28E,QAAQ,eAEjB/tF,KAAKguF,0BAII,KAAAC,OAAUz4E,IACvB,MAAM,YAAEy0E,GAAgBjqF,KAAKiJ,MAEzBghF,GAAeA,EAAYN,kBAAoBn0E,EAAE04E,UAAYC,WAASC,OACtEpuF,KAAKguF,yBACEhuF,KAAKiJ,MAAMwjF,sBAAwBj3E,EAAE04E,UAAYC,WAASC,QAC7DpuF,KAAKiJ,MAAMwjF,sBACXzsF,KAAK0V,SAAS,CAAE+2E,sBAAsB,IAIvCzsF,KAAKquF,cAAcptE,SAAWjhB,KAAKquF,cAAcptE,QAAQqtE,SAAS94E,EAAEpE,SAC1EpR,KAAKuuF,qBAAqBttE,SAAWjhB,KAAKuuF,qBAAqBttE,QAAQqtE,SAAS94E,EAAEpE,UAC3E64E,GAAeA,EAAYN,kBAC3B3pF,KAAKguF,yBAGLhuF,KAAKiJ,MAAMwjF,sBACXzsF,KAAK0V,SAAS,CAAE+2E,sBAAsB,MAKjC,KAAAuB,uBAAyB,KACtC,MACIpsF,SAAS,cAAE6F,GACX3G,MAAM,YAAE0tF,IACRxuF,KAAKR,MAELQ,KAAK49D,gBAAgB38C,SAAWjhB,KAAK49D,gBAAgB38C,QAAQ5iB,MAAM+C,OAAS,IAC5EotF,EAAYttB,WAAa,GACzBstB,EAAYC,sBAAwB,GACpCD,EAAYE,2BAA6B,GACzCjnF,GAAgBA,EAAcmwB,OAAO+2D,iCAAuBH,GAAcA,GAC1ExuF,KAAK49D,gBAAgB38C,QAAQ5iB,MAAQ,IAGzC2B,KAAK0V,SAAS,CAAEwrD,WAAY,GAAI+oB,iBAAa7pF,EAAW2qF,oBAAgB3qF,KAG3D,KAAAqd,mBAAsBhV,MAC9BA,GAASA,EAAMrH,QAAUpB,KAAKgW,WAC/BhW,KAAK0V,SAAS,CAAEwrD,WAAYz4D,IAG5BzI,KAAK6d,qBACL7d,KAAK6d,oBAAoBC,SAG7B,MAAM,UACFjc,EADE,QAEFD,EACAd,MAAM,YAAE0tF,IACRxuF,KAAKR,MAET,GAAIoC,EAAS,CACT,GAAI6G,GAASA,EAAMrH,OAAS,EAAG,CAC3B,GAAIqH,EAAMrH,OAASpB,KAAKgW,SACpB,OAGJhW,KAAK6d,oBAAsB,IAAS,KAChC7d,KAAK0V,SAAS,CAAEs9D,sBAAsB,IACtC4b,EACI,IAAIlG,EACAjgF,EACAzI,KAAKgpF,gBACLhpF,KAAK6uF,mBAAmB7uF,KAAK8uF,qBAC7B9uF,KAAK6oF,UACL7oF,KAAK8oF,WAETlnF,EAAQ6F,eAEPhC,KAAK0Y,IACFne,KAAK+uF,mBAAmBtmF,GACnBhD,KAAK2jC,IACFppC,KAAK0V,SAAS,CAAEu0E,YAAa9rE,EAAS4sE,eAAgB3hD,EAClD4lD,qBAAsBhvF,KAAKivF,2BAA2B9wE,GAAU60D,sBAAsB,MAE7FntE,MAAM/D,IACH9B,KAAK0V,SAAS,CAAEu0E,YAAa9rE,EAAS4sE,oBAAgB3qF,EAClD4uF,qBAAsBhvF,KAAKivF,2BAA2B9wE,KAC1Dtc,EAAUyc,UAAUxc,GACpBD,EAAU0c,MAAM,sCAG3B1Y,MAAM/D,IACH9B,KAAK0V,SAAS,CAAEu0E,iBAAa7pF,EAAW2qF,oBAAgB3qF,EACpD4uF,qBAAsBhvF,KAAKivF,+BAC/BptF,EAAUyc,UAAUxc,GACpBD,EAAU0c,MAAM,yCAEzBve,KAAKuc,UAERiC,WAAW,KACPxe,KAAK6d,uBACN,GAEH2wE,EAAYttB,WAAaz4D,OAEzBzI,KAAK0V,SAAS,CAAEu0E,iBAAa7pF,EAAW2qF,oBAAgB3qF,IACxDouF,EAAYttB,WAAa,GAE7Bt/D,EAAQ6F,cAAcmwB,OAAO+2D,iCAAuBH,GAAcA,KAIzD,KAAAK,mBAAsBK,IACnC,GAAIA,GAAmBA,EAAgB9tF,OAAS,EAAG,CAC/C,MAAM+tF,EAAoC,GAI1C,OAHAD,GAAmBA,EAAgBp9E,QAAQ,CAACs9E,EAAoB7rF,KAC5D6rF,EAAmB3G,gBAAkB0G,EAAwBn9E,KAAKo9E,EAAmB3G,eAAe4G,OAAO,GAAGC,cAAgBF,EAAmB3G,eAAet7D,MAAM,MAEnKgiE,EAAwB10E,KAAK,KAExC,MAAO,oCAkBM,KAAA80E,cACb/5E,IAEA,MACIhV,QAAQ,oBAAEsrF,GACVlqF,SAAS,cACL6F,EACAsX,KACIve,QAAQ,2BAAEkuF,MAGlB1uF,KAAKR,MAEHiJ,EAAQzI,KAAK49D,gBAAgB38C,SAAWjhB,KAAK49D,gBAAgB38C,QAAQ5iB,MAG3E,GAFAmX,EAAEC,kBAEGhN,GAAUA,GAA0B,IAAjBA,EAAMrH,QAAiB0qF,EAC3C9rF,KAAK49D,iBAAmB59D,KAAK49D,gBAAgB38C,SAAWjhB,KAAK49D,gBAAgB38C,QAAQytB,YAClF,CACH,MAAMo8C,EAAY4D,GAA8B,IAC1Cc,EAAYxvF,KAAKyvF,mBAAmBvjE,YAAW,SAAUzkB,IAAkB,GAAIgB,EAAOqiF,GAC5Ft8C,SAAS3iC,SAAS4B,KAAO+hF,IAIhB,KAAAE,0BAA4B,KACzC,MAAM,qBAAEjD,EAAF,YAAwBxC,GAAgBjqF,KAAKiJ,MAE9CwjF,GAOGxC,GAAeA,EAAYN,kBAC3B3pF,KAAKguF,yBAGThuF,KAAK0V,SAAS,CAAE+2E,sBAAsB,KAVtCzsF,KAAK0V,SAAS,CACV+2E,sBAAsB,EACtBvrB,WAAY,GACZyuB,gBAAgB,KAWX,KAAAF,mBAAqB,CAACG,EAAennF,EAAe4tB,KACjE,IAAKjpB,IAASC,UACV,MAAO,GAGX,MAAM29E,EAAW,IAAIz9E,IAAIqiF,EAAOpiF,OAAO3B,SAAS4B,MAKhD,OAJI4oB,GAAO5tB,GACPuiF,EAASt9E,aAAaC,IAAI0oB,EAAK5tB,GAG5BuiF,EAASv9E,MAGH,KAAAwhF,2BAA8BjuF,IAC3C,GAAsD,OAAlDhB,KAAK6vF,iCAAiC5uE,QAAkB,CACxD,MAAM6uE,EAAiB9vF,KAAK6vF,iCAAiC5uE,QACvD8uE,EAAsB/vF,KAAKR,MAAM0C,UAAU8tF,wBAC3CC,EAAoBjwF,KAAKR,MAAM0C,UAAUguF,wBAG/C,OAFAJ,EAAe/tB,UAAY/gE,GAAWA,EAAO2oF,kBAAoB3oF,EAAO2oF,iBAAiBvoF,OAAS,EAAK2uF,EAAsBE,EAC7HH,EAAe1uE,aAAa,YAAa,aAClC0uE,EAAe/tB,UAE1B,MAAO,IAhdP/hE,KAAK49D,gBAAkB//D,cACvBmC,KAAK2sF,qBAAuB9uF,cAC5BmC,KAAK6vF,iCAAmChyF,cACxCmC,KAAKuuF,qBAAuB1wF,cAC5BmC,KAAKquF,cAAgBxwF,cACrBmC,KAAKiJ,MAAQ,CACTwjF,sBAAsB,EACtBvrB,WAAY,GACZivB,0BAA2B,kCAC3BC,0BAA2B,kCAC3BC,2BAA4B,mCAC5BpG,iBAAa7pF,EACb2qF,oBAAgB3qF,EAChB4uF,qBAAsB,GACtBW,gBAAgB,EAChB3c,sBAAsB,GAE1BhzE,KAAKgW,SACAhW,KAAKR,MAAMoC,SACR5B,KAAKR,MAAMoC,QAAQmd,KACnB/e,KAAKR,MAAMoC,QAAQmd,IAAIve,QACvBR,KAAKR,MAAMoC,QAAQmd,IAAIve,OAAO8vF,sBAClC,GACJtwF,KAAK8uF,oBAAsB9uF,KAAKR,MAAMgB,QAAUR,KAAKR,MAAMgB,OAAO+vF,wBAClEvwF,KAAKgpF,gBAAkBhpF,KAAKR,MAAMgB,QAAUR,KAAKR,MAAMgB,OAAOwoF,gBAAkBhpF,KAAKR,MAAMgB,OAAOwoF,gBAAkB,EACpHhpF,KAAKwwF,gBAAkB,kBACvBxwF,KAAKusF,iBAAmB,mBACxBvsF,KAAKvB,iBAAmB4J,6BAAmBrI,KAAKR,MAAMoC,QAAQkE,QAAQwC,kBAAoBtI,KAAKR,MAAM+I,aAAcvI,KAAKR,MAAMqC,WAGpG,0BAC1B2sC,SAASiiD,MAAQjiD,SAASiiD,KAAKt0E,iBAAiB,YAAanc,KAAK8tF,iBAClEtgF,QAAUA,OAAO2O,iBAAiB,QAASnc,KAAKiuF,QAG7Ct0D,uBACH6U,SAASiiD,MAAQjiD,SAASiiD,KAAK72D,oBAAoB,YAAa55B,KAAK8tF,iBAAiB,GACtFtgF,QAAUA,OAAOosB,oBAAoB,QAAS55B,KAAKiuF,QAAQ,GAGxD/Q,qBACH,MACI18E,QAAQ,gBAAEqrF,IACV7rF,KAAKR,OACH,qBAAEitF,EAAF,eAAwBkD,GAAmB3vF,KAAKiJ,MAEjDjJ,KAAKR,MAAMoC,QAAQkE,QAAQipE,OAAOC,YAC9B6c,GAAmBY,EACpBzsF,KAAK49D,iBAAmB59D,KAAK49D,gBAAgB38C,SAAWjhB,KAAK49D,gBAAgB38C,QAAQytB,QAC7EihD,GACR3vF,KAAK2sF,sBAAwB3sF,KAAK2sF,qBAAqB1rE,SAAWjhB,KAAK2sF,qBAAqB1rE,QAAQytB,SAKzG5lC,sBAAsBC,EACzBC,GACA,OAAIhJ,KAAKiJ,QAAUD,GAAahJ,KAAKR,QAAUuJ,EAO5CG,SAAM,UACT,MAAM,QACFtH,EACAM,WAAW,WAAEwqF,EAAF,sBAAcF,EAAd,mBAAqCkE,EAArC,mBAAyDC,EAAzD,mBAA6EC,GACxFpwF,QAAQ,gBAAEqrF,EAAF,oBAAmBC,EAAnB,sBAAwC+E,EAAxC,2BAA+DC,EAA/D,UAA2FhzF,EAAY,KAC/GkC,KAAKR,OAEH,qBACFitF,EADE,WAEFvrB,EAFE,0BAGFivB,EAHE,0BAIFC,EAJE,2BAKFC,EALE,YAMFpG,EANE,eAOFc,EAPE,qBAQF/X,GACAhzE,KAAKiJ,MAEH6hF,EAAalpF,GAAWA,EAAQmd,KAAOnd,EAAQmd,IAAIve,QAAUoB,EAAQmd,IAAIve,OAAOkuF,4BAA+B,IAC/G7D,EAAgB3+D,YAAW,SAAUtqB,GAAWA,EAAQ6F,gBAAkB,GAC1E+nF,EAAYxvF,KAAKyvF,mBAAmB5E,EAAe3pB,EAAY4pB,GAC/Dc,EAAoBiF,GAAyBA,EAAsBzvF,OAAS,EAAIyvF,EAAwB,qBAExG9d,EAAqBkX,SAAH,UAAGA,EAAaN,wBAAhB,aAAG,EAA+BrjF,OACtDqkF,GAAcA,EAAWlC,iBAAmBA,EAAesI,SAAWpG,EAAWlC,iBAAmBA,EAAephF,MAEjHgsE,EAAqB4W,SAAH,UAAGA,EAAaN,wBAAhB,aAAG,EAA+BrjF,OAAOqkF,GAAcA,EAAWlC,iBAAmBA,EAAerqE,SACtH6sE,EAAmBF,aAAH,EAAGA,EAAgBxpF,KAAK8nC,GACnCA,EAAQ+xB,cAAgBl7B,uBAAqBgrD,UAElDtX,EAAsBqW,SAAH,UAAGA,EAAaN,wBAAhB,aAAG,EAA+BrjF,OACvDqkF,IAAa,MACT,GAAIA,EAAWlC,iBAAmBA,EAAeyC,SAC7C,OAAO,EAEX,MAAM7hD,EAAU4hD,SAAH,UAAGA,EAAkB/oD,cAArB,aAAG,EAA0B3gC,KAAKgO,IAAO,MAClD,MAAO,oBAAGA,EAAKsxB,uBAAR,QAA2B,KAAQ8pD,EAAW/jF,KAGzD,OAAQoT,mBAAiBC,kBAAkBovB,KAG7Cv/B,EAAS,SACP9J,KAAKR,OADE,IAGXm+D,OAAQ,CACJrzD,YAAatK,KAAKR,MAClB1B,UAAU,GAAD,OAAK+S,IAAW,YAAa/S,GAA7B,YAA2CguF,EAAsB,YAAc,gBAE5FhY,qBAAsB,CAClB/wE,IAAK,MACLjF,UAAW,iCACX,YAAa,YACbgZ,IAAK9W,KAAK6vF,kCAEd9b,yBAA0B/zE,KAAKiJ,MAAM+lF,qBACrC9tB,WAAYlhE,KAAKiJ,MAAMi4D,WACvB8S,YAAa,CACTl9D,IAAK9W,KAAKuuF,qBACVzwF,UAAW,0BAEf+0E,eAAgB,CACZ/0E,UAAWqyF,GAEfhd,eAAgB,CACZr1E,UAAWsyF,GAEf1c,gBAAiB,CACb51E,UAAWuyF,GAEf7d,WAAY,CACR10E,UAAU,GAAD,OAAKkC,KAAKwwF,gBAAV,YAA6B/D,EAAuB,UAAY,YAE7Eha,YAAa,CACT1vE,IAAK,OACL+T,IAAK9W,KAAKquF,cACVvwF,UAAW,wBACX,aAAc,SACduB,KAAM,aACN2D,KAAM,SACNoI,OAAQokF,EACRtxB,aAAc,MACd59D,SAAUN,KAAKuvF,eAEnBzc,UAAW,CACP/vE,IAAK,KACLjF,UAAW+S,IAAW,wCAAyC/S,IAEnEs1E,UAAW,CACPrwE,IAAK,KACLjF,UAAW+S,IAAW,wCAAyC/S,IAEnE61E,WAAY,CACR5wE,IAAK,KACLjF,UAAW+S,IAAW,yCAA0C/S,IAEpE8Q,MAAOi1E,EAAe,CAClB4I,uBACAF,iBAAiB,GAAD,OAAKvsF,KAAKusF,iBAAV,YAA8BE,EAAuB,UAAY,WACjFC,aACAF,wBACAG,qBAAsB3sF,KAAK2sF,qBAC3Bd,kBACAE,yBAA0B/rF,KAAK0vF,0BAC/BjxF,iBAAkBuB,KAAKvB,mBAE3B6mB,KAAMqmE,EAAc,CAChBK,gBAAiB0E,EACjBzE,gBAAiB0E,EACjBzE,gBAAiB0E,EACjB/E,kBACAjuB,gBAAiB59D,KAAK49D,gBACtBkuB,sBACAv1E,kBAAmBvW,KAAKyd,mBACxBsuE,yBAA0B/rF,KAAK0vF,0BAC/B15E,SAAUhW,KAAKgW,SACf80E,YACAc,oBACAnjF,MAAOy4D,IAEXgT,mBACIhT,GAAcA,EAAW9/D,OAAS,IAC7B4xE,GAAyBD,GAAsBxzD,kBAAgBC,YAAYuzD,IAAwBsZ,EAA4B,CAC5H8D,4BACAtF,gBACAC,YACAjC,UAAW7oF,KAAK6oF,UAChBC,UAAW9oF,KAAK8oF,UAChBoB,iBAAkBlqF,KAAKR,MACvB0hE,aACA+oB,YAAalX,EACbt0E,iBAAkBuB,KAAKvB,wBACtB2B,EACb+zE,mBACIjT,GAAcA,EAAW9/D,OAAS,IAC7B4xE,GAAyBK,GAAsB9zD,kBAAgBC,YAAY6zD,IAAwBuZ,EAA4B,CAC5HwD,4BACAvF,gBACAC,YACAjC,UAAW7oF,KAAK6oF,UAChBC,UAAW9oF,KAAK8oF,UAChBoB,iBAAkBlqF,KAAKR,MACvB0hE,aACA+oB,YAAa5W,EACbxxE,UAAW7B,KAAKR,MAAMqC,UACtB8qC,WAAY3sC,KAAKR,MAAMwC,SACvBy9B,SAAUz/B,KAAKR,MAAMuC,GACrBtD,iBAAkBuB,KAAKvB,iBACvByD,UAAWlC,KAAKR,MAAM0C,iBACrB9B,EACb6zE,oBACI/S,GAAcA,EAAW9/D,OAAS,IAC7B4xE,GAAyBY,GAAuBr0D,kBAAgBC,YAAYo0D,IAAyBoW,EAA6B,CAC/HqG,6BACAxF,gBACAC,YACAjC,UAAW7oF,KAAK6oF,UAChBC,UAAW9oF,KAAK8oF,UAChBoB,iBAAkBlqF,KAAKR,MACvB0hE,aACA+oB,YAAarW,EACbmX,iBACAtsF,iBAAkBuB,KAAKvB,iBACvB6rF,mBAAoBwG,SACnB1wF,EACby6B,UAAW,CACPkxD,yBAA0B/rF,KAAK0vF,2BAEnCjD,qBAAsBzsF,KAAKiJ,MAAMwjF,qBACjCzZ,uBACAC,cAAejzE,KAAKutF,mBAGxB,OAAOvtF,KAAKR,MAAMwL,WAAWlB,GAmJD,yBAACo3D,GAC7B,MAAQz5D,cAAe2iB,GAAQpqB,KAAKR,MAAMoC,QACpCykB,EAAYie,YAAala,EAAI7W,gBACnC,OAAOy9E,sBAAoBC,8BACvB,CAAEzpF,cAAe4iB,GACjB,CACIm3C,gBAAiBL,EACjBE,QAAS,CACLC,WAAYj3C,EAAI7W,eAAeiG,YAAY0E,UAC3CtQ,UAAWyY,MA4EhBs3C,c,qICvjBR,MAAMuzB,EAA+D1xF,IACxE,MAAM,kBAAE+3E,EAAF,OAAqBh3E,EAArB,cAA6By5B,EAA7B,QAA4CjpB,EAA5C,eAAqDqnE,EAArD,eAAqEt/B,EAArE,cAAqFu/B,EAArF,0BAAoGJ,EAApG,4BAA+HE,GAAgC34E,EAErK,OACI3B,gBAAColC,SAAM1gC,iBAAKg1E,GACPxmE,EACW,YAAXxQ,GAAwBy5B,EACzBn8B,gBAAC6kC,OAAI,CAAC5kC,UAAU,IACXm6E,EACAE,GAEHC,GAAkBt/B,GAAkBA,EAAe13C,OAAS,GAC1DvD,gBAAC6kC,OAAIngC,iBAAK61E,GACLt/B,GAAkBA,EAAex1C,IAAKgoB,GAC5B6lE,EAAqB7lE,EAAe+sD,OAO7D8Y,EAAuB,CAAC7lE,EAA8C+sD,KAExE,MAAM,IAAEnmE,EAAF,gBAAOqa,EAAP,mBAAwBZ,EAAxB,2BAA4CmB,EAA5C,aAAwED,EAAxE,kBAAsFb,GAAsBV,EAClH,OACIztB,gBAAC6kC,OAAIngC,eAAC2P,IAAKA,EAAKpU,UAAWu6E,EAAev6E,WAAeu6E,GACpDrsD,EACAL,EACAY,EACAM,EACAC,IAKEokE,a,uJCKf,IAAME,EAAN,cAAiCvzF,gBAAjC0B,kCA4BW,KAAA0J,MAAkC,CACrCooF,YAAa,GA+DA,KAAAC,kBAAoB,KACjC,MACIrxF,aAAa,SAAE8sD,EAAF,UAAYW,IACzB1tD,KAAKR,MACT,OAAOutD,EAASzmD,OAAQmoD,IACpB,MAAMxlD,EAAQykD,EAAUe,GACxB,QAASxlD,IAAUA,EAAMwhC,cAIhB,KAAA8mD,QAAWxvF,GACjB/B,KAAKsxF,oBAAoB/8D,QAAQxyB,GAG3B,KAAAyvF,MAASjiF,GACfnN,IAAImN,EAAM,aAAe,GAGnB,KAAAkiF,WAAcliF,GACpBnN,IAAImN,EAAM,yBAA2B,GAG/B,KAAA6lE,WAAc4I,KACvBh+E,KAAKR,MAAMwvE,UAIRgP,GAAQ,GAAKA,GAAQh+E,KAAKiJ,MAAMooF,YAG1B,KAAA1J,SAAY3J,GAClBA,IAASh+E,KAAKiJ,MAAMooF,YAGd,KAAA/K,SAAYtI,GAClBA,GAAQ,GAAKA,EAAOh+E,KAAKiJ,MAAMooF,YAGzB,KAAAzJ,OAAS,KACtB5nF,KAAK0V,SAAS,CACV27E,YAAarxF,KAAKiJ,MAAMooF,YAAc,KAlIX,qBAC/B,OAAsC,IAAlCrxF,KAAKR,MAAM6wE,qBAAmE,IAAnCrwE,KAAKR,MAAM8wE,sBACb,IAArCtwE,KAAKR,MAAM+wE,wBAA8E,IAA3CvwE,KAAKR,MAAMyvE,4BAOnC,oBAC9B,IAAK,MAAM1/D,KAAQvP,KAAKR,MAAMyP,MAAO,CAAC,IAAD,EACjC,MAAMw/C,EAAUzuD,KAAKwxF,MAAMjiF,GACrBtG,EAAQjJ,KAAKR,MAAMS,YAAYytD,UAAUe,GAM/C,IAJkClvC,kBAAgBC,YAAhB,UAE9BvW,EAAM8jD,gBAFwB,aAE9B,EAAgBzmD,OAAOorF,GAAaA,aAAJ,EAAIA,EAAWtlE,SA1B7B,0BA4BanjB,EAAMwhC,YAAcxhC,EAAMI,SACzD,OAAO,EAIf,OAAO,EAOJoiD,oBAIH,MAAMsB,EAAW/sD,KAAKR,MAAMyP,MAAM3L,IAAKiM,GAA0BnN,IAAImN,EAAM,aAC3EvP,KAAKR,MAAMS,YAAYH,KAAK,CAAEitD,aAG3B7jD,SACH,MAAM,YAAEjJ,EAAF,MAAegP,EAAf,SAAsB0hE,GAAa3wE,KAAKR,MAC9C,IAAKyP,IAAUhP,EACX,OAAO,KAGX,MAAM0xF,EAA8B3xF,KAAKR,MAAMwI,kCAC3ChI,KAAKR,MAAM8vB,iDACVtvB,KAAKR,MAAM6J,WAAarJ,KAAK4xF,iBAAmB5xF,KAAK6xF,cAE1D,OACIh0F,uBAAKC,UAAU,4BACVmR,EAAM3L,IAAKiM,IACR,MAAMk/C,EAAUzuD,KAAKwxF,MAAMjiF,GACrByuE,EAAOh+E,KAAKuxF,QAAQ9iC,GACpBvwD,EAAQ8B,KAAKyxF,WAAWliF,GACxBtG,EAAQjJ,KAAKR,MAAMS,YAAYytD,UAAUe,IACzC,QAAEtlD,EAAF,UAAW8jD,EAAX,WAAsB7jD,EAAtB,WAAkCqhC,EAAlC,gBAA8C0iB,EAA9C,OAA+DjtD,EAA/D,SAAuEG,EAAvE,SAAiFC,EAAjF,eAA2F+sD,EAA3F,eAA2GV,GAC7G1jD,GAAU,GACd,OAEIpL,gBAACi0F,IAAU,CACP5/E,IAAKu8C,EACLuvB,KAAMA,EACN9/E,MAAOA,EACPyyE,SAAUA,EACV3sE,UAAWqpD,GAAkB5iB,EAC7Bk9C,UAAWgK,GAA+B3xF,KAAK2nF,SAAS3J,GACxDsI,UAAWqL,GAA+B3xF,KAAKsmF,SAAStI,GACxD5I,YAAauc,GAA+B3xF,KAAKo1E,WAAW4I,GAC5DuI,aAAct5B,EACdv0C,SAAU1Y,KAAKR,MAAMkZ,SACrBu0C,UAAWA,EACX7jD,WAAYA,EACZujD,eAAgBA,EAChBxjD,QAASA,EACTgkD,gBAAiBA,EACjB7sD,SAAUA,EACVD,SAAUA,EACVH,OAAQA,EACR0nF,OAAQ5nF,KAAK4nF,OACbpB,iBAAkBxmF,KAAKR,MAAMkwE,2BAA6B/iB,EAC1DluD,iBAAkBuB,KAAKR,MAAMf,kBAE5BZ,eAAmB0R,EAA4B,CAAEq/C,eAAe,UAlF/E3jD,aAATE,KAAS,mCASAF,aAATE,KAAS,kCAXRimF,EAAkB,aADvB9lF,KACK8lF,GAyISA,O,2sBC9If,MAAMW,EAAyD,IAS1D,IAT2D,MAC5D5vF,EAD4D,MAE5DyM,EAF4D,QAG5DhN,EAH4D,GAI5DG,EAJ4D,SAK5DC,EAL4D,mBAM5DyxC,EAN4D,SAO5DC,EAP4D,SAQ5DC,GACC,EACD,OACI91C,qBAAGC,UAAS,oCAA+B61C,IACvC91C,wBAAMC,UAAU,8BACX8Q,GAEJzM,GAAmB,IAAVA,EACNtE,gBAAC4E,iBAAc,CACX3B,KAAM,CACFqB,MAAO,CAAEO,wBAAyBP,IAEtCQ,cAAe+wC,EACf9xC,QAASA,EACTG,GAAIA,EACJC,SAAUA,EACVlE,UAAU,+BAGdD,wBAAMC,UAAU,8BACX21C,KAOfu+C,EAA8B,CAChCxyF,EACA2C,EACAyM,EACA+kC,IAGI91C,gBAACk0F,EAAkB,CACf5vF,MAAOA,EACPyM,MAAOA,EACPhN,QAASpC,EAAMoC,QACfG,GAAIvC,EAAMuC,GACVC,SAAUxC,EAAMwC,SAChByxC,mBAAoBj0C,EAAMi0C,mBAC1BC,SAAUl0C,EAAMk0C,SAChB7xC,UAAWrC,EAAMqC,UACjB8xC,SAAUA,IAKhBE,EAA0BzuC,GACpBA,GAAiBA,EAAcgqB,eAAkB,EAahD81B,EAAkB1lD,IAC3B,MAAM,YAAE+b,EAAF,UAAelV,GAAc7G,EAAM4G,KACnC6rF,EAAe5rF,aAAH,EAAGA,EAAWC,OAAOC,GAAYA,EAASkhB,eACtDktB,EAAmC,CACrCob,SAAUkiC,aAAF,EAAEA,EAAc3uF,IAAK4uF,GAClBF,EAA4BxyF,EAAO0yF,EAAYC,cAAez2E,iBAAOlc,EAAM4lD,aAAc8sC,EAAYE,WAAY,YAE5Hp9C,WAAYg9C,EAA4BxyF,EAAO+b,EAAa/b,EAAMy1C,gBAAiB,UAGvF,GAAIz1C,EAAM4F,cAAe,CACrB,MAAMiwC,EArBiB,EAACjwC,EAA+BgB,KAE3D,MAGMkvC,GAAsBlwC,EAAc4pB,iBAAmB,IAAIlf,OAHzC,CAACzM,EAAekyC,IAC7BlyC,GAASkyC,EAASnlB,SAAW,GAEiD,GACnFmB,GAAUnrB,EAAKmV,aAAe,GAAKs4B,EAAuBzuC,GAChE,OAAO8gB,KAAKC,IAAImvB,EAAoB/jB,IAcTikB,CAAuBh2C,EAAM4F,cAAe5F,EAAM4G,MACnEgpB,EAAgBykB,EAAuBr0C,EAAM4F,eAC7CqwC,GAA4Bl6B,GAAe,GAAK85B,EAAiBjmB,EAEnEA,EAAgB,IAChBulB,EAAWe,QAAUs8C,EAA4BxyF,GAAQ4vB,EAAe5vB,EAAMm2C,cAAgB,iBAAkB,YAGhHN,EAAiB,IACjBV,EAAWY,SAAWy8C,EAA4BxyF,GAAQ61C,EAAgB71C,EAAMo2C,eAAiB,mBAAoB,cAGzHjB,EAAWK,WAAag9C,EAA4B,EAAD,KAAMxyF,GAAN,IAAak0C,cAAUtzC,IAAaq1C,EAA0Bj2C,EAAMy1C,gBAAiB,SAG5I,OAAON,I,kCC9IX,oDAaA,EAGI,SAAYn7B,GAAZ,WAIO,KAAA88D,YAAc,WAAM,+BAAc,gBAAiBhqB,EAAK9yC,cAExD,KAAA+8D,mBAAqB,WAAM,uBAE3B,KAAAC,cAAgB,WAAiB,iBAPpCx2E,KAAKwZ,YAAcA,GA8BkBqwE,YAA0C,CACnFz+E,OAhBG,SAAmCI,EAA2B4e,GAAmB,uFACpF,MAAM,CAAN,EAAO,IAAI4tC,YAgBXxsD,MATgB,SAACu+E,GACjB,OAAO,IAAIsI,EAAmBtI,EAAUx2E,eAAeiG,iB,8FC7B5C,UAAO4Q,EAAqBhlB,EAA2CktF,EAClFC,EAAmBzjE,EAA6B9mB,IACzC,IAAIoa,QAAQriB,MAAOsiB,EAAqBC,KAC3C,IAAIyQ,EAGJ,IACIA,QAAmBhyB,YAASqpB,EAAK0E,EAAoB9mB,GACvD,MAAOlG,GACU,YAAfwgB,EAAOxgB,GAIX,UACUqoB,YAAgBC,GACxB,MAAOtoB,GACU,YAAfwgB,EAAOxgB,GAGX,GAAIywF,EAAU,CAEV,MAAMC,EAAuBtmE,YAAW,oBAAqB9B,IAAQ,GACrE,IAAKooE,EACoD,YAArDlwE,EAAO,IAAIkI,MAAM,mCAGrB,MAAM2B,EAAYqmE,EAAqBpmE,SAAS,KAAO,IAAM,IACvDH,EAAG,UAAMumE,GAAN,OAA6BrmE,EAA7B,yBAAuD4G,EAAWnsB,IAC3E4G,OAAO3B,SAASohB,OAAOhB,OACpB,CACH,IAAI7mB,EAO+C,YAA/Ckd,EAAO,IAAIkI,MAAM,6BAJjB,GAAsB,kBAFDplB,EAAcqtF,iBAAiB,CAAEC,cAAe3/D,EAAY4/D,mBAAoBL,GAAmB,MAE7G/xF,OACkD,YAAzD+hB,EAAO,IAAIkI,MAAM,uCAKzBnI","file":"static/js/10.1362b674af27b72c57ce.chunk.js","sourcesContent":["/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport * as React from 'react';\n\nexport interface ICheckoutDeliveryOptionsDescriptionProps {\n description?: string;\n}\n\n/**\n * AddPaymentForm SFC.\n * @param root0\n * @param root0.description\n * @extends {React.FC}\n */\nconst CheckoutDeliveryOptionsDescription: React.FC = ({\n description\n}) => {\n if (!description) {\n return null;\n }\n\n return (\n {description}\n );\n};\n\nexport default CheckoutDeliveryOptionsDescription;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport * as React from 'react';\n\nexport interface ICheckoutDeliveryOptionsErrorMessageProps {\n message?: string;\n}\n\n/**\n * AddPaymentForm SFC.\n * @param root0\n * @param root0.message\n * @extends {React.FC}\n */\nconst CheckoutDeliveryOptionsErrorMessage: React.FC = ({\n message\n}) => {\n if (!message) {\n return null;\n }\n\n return (\n

\n {message}\n

\n );\n\n};\n\nexport default CheckoutDeliveryOptionsErrorMessage;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport * as React from 'react';\n\nexport interface ICheckoutDeliveryOptionsErrorTitleProps {\n title?: string;\n}\n\n/**\n * AddPaymentForm SFC.\n * @param root0\n * @param root0.title\n * @extends {React.FC}\n */\nconst CheckoutDeliveryOptionsErrorTitle: React.FC = ({\n title\n}) => {\n if (!title) {\n return null;\n }\n\n return (\n

\n {title}\n

\n );\n\n};\n\nexport default CheckoutDeliveryOptionsErrorTitle;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nexport interface ICheckoutDeliveryOptionsRadioButtonProps {\n isChecked: boolean;\n value?: string;\n ariaSetSize: number;\n ariaPosInSet: number;\n ariaLabel?: string;\n telemetryContent?: ITelemetryContent;\n onChange(event: React.ChangeEvent): void;\n}\n\n/**\n * AddPaymentForm SFC.\n * @param root0\n * @param root0.isChecked\n * @param root0.value\n * @param root0.ariaSetSize\n * @param root0.ariaPosInSet\n * @param root0.ariaLabel\n * @param root0.telemetryContent\n * @param root0.onChange\n * @extends {React.FC}\n */\nconst CheckoutDeliveryOptionsRadioButton: React.FC = ({\n isChecked,\n value,\n ariaSetSize,\n ariaPosInSet,\n ariaLabel,\n telemetryContent,\n onChange\n}) => {\n if (!value) {\n return null;\n }\n\n const payLoad = getPayloadObject('click', telemetryContent!, TelemetryConstant.DeliveryOptions);\n const attributes = getTelemetryAttributes(telemetryContent!, payLoad);\n\n return (\n \n );\n};\n\nexport default CheckoutDeliveryOptionsRadioButton;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { PriceComponent } from '@msdyn365-commerce/components';\nimport { ICheckoutState } from '@msdyn365-commerce/global-state';\nimport { Cart, ChannelDeliveryOptionConfiguration, FilterDeliveryModeOption } from '@msdyn365-commerce/retail-proxy';\nimport {\n getDeliveryOptionsAsync\n} from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\nimport {\n Address, CartLine, DeliveryOption\n} from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { IModuleStateProps, withModuleState } from '@msdyn365-commerce-modules/checkout-utilities';\nimport { QueryResultSettingsProxy } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, getTelemetryObject, IModuleProps, INodeProps, ITelemetryContent, Waiting } from '@msdyn365-commerce-modules/utilities';\nimport classname from 'classnames';\nimport get from 'lodash/get';\nimport { action, computed, observable, reaction, when } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { ICheckoutDeliveryOptionsData } from './checkout-delivery-options.data';\nimport { filterDeliveryModeOption, ICheckoutDeliveryOptionsProps, useDefaultDeliveryOption } from './checkout-delivery-options.props.autogenerated';\nimport DescriptionComponent from './components/checkout-delivery-options.description';\nimport ErrorMessageComponent from './components/checkout-delivery-options.error-message';\nimport ErrorTitleComponent from './components/checkout-delivery-options.error-title';\nimport RadioButtonComponent from './components/checkout-delivery-options.radio-button';\n\nexport interface ICheckoutDeliveryOptionsModuleProps extends ICheckoutDeliveryOptionsProps, IModuleStateProps { }\n\nexport interface ICheckoutDeliveryOption {\n DeliveryOption: INodeProps;\n description?: React.ReactNode;\n price?: React.ReactNode;\n}\n\nexport interface ICheckoutDeliveryOptionEdit extends ICheckoutDeliveryOption {\n code: string;\n radioButton?: React.ReactNode;\n}\n\nexport interface ICheckoutDeliveryOptionsList {\n DeliveryOptionsList: INodeProps;\n list: ICheckoutDeliveryOptionEdit[];\n}\n\nexport interface ICheckoutDeliveryOptionsError {\n Error: INodeProps;\n title: React.ReactNode;\n message: React.ReactNode;\n}\n\nexport interface ICheckoutDeliveryOptionsViewState {\n isLoading: boolean;\n isError: boolean;\n isShowList: boolean;\n isShowSelected: boolean;\n isShowSaveButton: boolean;\n isShowEditButton: boolean;\n isShowCancelButton: boolean;\n}\n\nexport interface ICheckoutDeliveryOptionsViewProps extends ICheckoutDeliveryOptionsProps<{}> {\n CheckoutDeliveryOptions: IModuleProps;\n selectedItemId: string;\n deliveryOptionsData: DeliveryOption[];\n isLoading: boolean;\n errorMessageData: string;\n viewState: ICheckoutDeliveryOptionsViewState;\n deliveryOptions?: ICheckoutDeliveryOptionsList;\n deliveryOptionSelected?: ICheckoutDeliveryOption;\n errorMessage?: ICheckoutDeliveryOptionsError;\n waiting?: React.ReactNode;\n saveButton?: React.ReactNode;\n editButton?: React.ReactNode;\n cancelButton?: React.ReactNode;\n onDeliveryOptionChange(event: React.ChangeEvent): void;\n onSave(): void;\n onEdit(): void;\n onCancel(): void;\n}\n\n/**\n *\n * CheckoutDeliveryOptions component.\n * @extends {React.Component>}\n */\n// @ts-expect-error\n@withModuleState\n@observer\nclass CheckoutDeliveryOptions extends React.Component {\n @observable private selectedItemId: string = '';\n\n @observable private deliveryOptions: DeliveryOption[] = [];\n\n @observable private isLoading: boolean = false;\n\n @observable private errorMessage?: string;\n\n @computed private get isDataReady(): boolean {\n return (this.props.data.checkout.result && this.props.data.checkout.status) === 'SUCCESS';\n }\n\n @computed private get isPaymentVerificationRedirection(): boolean {\n const { requestFormData, query } = this.props.context.request;\n return !!((requestFormData && query && query.pv === '1'));\n }\n\n private cartDeliveryMode?: string;\n\n private retailMultiplePickUpOptionEnabled?: boolean = false;\n\n private channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n\n private readonly telemetryContent?: ITelemetryContent;\n\n private readonly isSelectDefaultOptionEnabled?: boolean;\n\n public constructor(props: ICheckoutDeliveryOptionsModuleProps) {\n super(props);\n this.telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!, this.props.friendlyName, this.props.telemetry);\n this.isSelectDefaultOptionEnabled = this.props.config.useDefaultDeliveryOption &&\n this.props.config.useDefaultDeliveryOption !== useDefaultDeliveryOption.none;\n }\n\n public async componentDidMount(): Promise {\n when(\n () => this.isDataReady,\n async () => {\n await this.init();\n }\n );\n\n reaction(\n () => this.props.data.checkout.result?.shippingAddress,\n async () => {\n await this.loadDeliveryOptions();\n this.props.moduleState.setIsCancellable(false);\n\n await this.props.data.checkout.result?.updateShouldCollapsePaymentSection({ newShouldCollapsePaymentSection: true });\n }\n );\n\n reaction(\n () => this.props.data.checkout.result?.isExpressCheckoutApplied,\n async (isExpressCheckoutApplied) => {\n if (isExpressCheckoutApplied && this.canShip()) {\n await this.loadDeliveryOptions();\n this.props.moduleState.setIsCancellable(false);\n\n await this.props.data.checkout.result?.updateShouldCollapsePaymentSection({ newShouldCollapsePaymentSection: true });\n }\n }\n );\n }\n\n public shouldComponentUpdate(nextProps: ICheckoutDeliveryOptionsModuleProps,\n nextState: ICheckoutDeliveryOptionsViewState): boolean {\n if (this.state === nextState && this.props.data === nextProps.data) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element | null {\n if (!this.canShip()) {\n this.props.context.telemetry.error('Checkout delivery options content is empty, module wont render');\n return null;\n }\n\n const {\n moduleState: { isReady, isUpdating, hasError }\n } = this.props;\n const isError = !this.isLoading && hasError;\n const isShowList = !this.isLoading && !hasError && isUpdating && !this.isSelectDefaultOptionEnabled;\n const isShowSelected = !this.isLoading && !hasError && isReady;\n const multiplePickupStoreSwitchName = 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature';\n this.channelDeliveryOptionConfig = this.props.data.channelDeliveryOptionConfig?.result;\n this.retailMultiplePickUpOptionEnabled = this.props.data.featureState?.result\n ?.find(feature => feature.Name === multiplePickupStoreSwitchName)?.IsEnabled;\n\n const { deliveryOptionAriaLabel } = this.props.resources;\n\n const viewProps = {\n ...this.props,\n onDeliveryOptionChange: this.onDeliveryOptionChange,\n selectedItemId: this.selectedItemId,\n deliveryOptionsData: this.deliveryOptions,\n isLoading: this.isLoading,\n errorMessageData: this.errorMessage,\n viewState: {\n isLoading: this.isLoading,\n isError,\n isShowList,\n isShowSelected,\n isShowSaveButton: isShowList && !this.props.moduleState.hasExternalSubmitGroup,\n isShowEditButton: isShowSelected && !this.props.moduleState.hasExternalSubmitGroup,\n isShowCancelButton: isShowList && !this.props.moduleState.hasExternalSubmitGroup && !!this.getSavedDeliveryOption()\n },\n CheckoutDeliveryOptions: {\n moduleProps: this.props,\n className: classname('ms-checkout-delivery-options', this.props.config.className)\n },\n deliveryOptions: {\n DeliveryOptionsList: {\n className: 'ms-checkout-delivery-options__list',\n role: 'list',\n 'aria-label': deliveryOptionAriaLabel },\n list: this.getDeliveryOptionList()\n },\n deliveryOptionSelected: this.getDeliveryOptionSelected(),\n errorMessage: this.getErrorMessage(),\n waiting: ,\n saveButton: this.getSaveButton(),\n editButton: this.getEditButton(),\n cancelButton: this.getCancelButton(),\n onSave: this.onSave,\n onEdit: this.onEdit,\n onCancel: this.onCancel\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n @action\n private readonly init = async (): Promise => {\n this.props.moduleState.init({\n onEdit: this.isSelectDefaultOptionEnabled ? undefined : this.onEdit,\n onCancel: this.isSelectDefaultOptionEnabled ? undefined : this.onCancel,\n onSubmit: this.isSelectDefaultOptionEnabled ? undefined : this.onSubmit,\n status: (!(this.props.config.useDefaultDeliveryOption === useDefaultDeliveryOption.notDisplaySelectedDeliveryOption) &&\n this.canShip()) ? 'updating' : 'disabled'\n });\n\n this.cartDeliveryMode = this.getSavedDeliveryOption();\n\n await this.loadDeliveryOptions();\n };\n\n private readonly canShip = (): boolean => {\n const hasInvoice = this.props.data.checkout.result?.checkoutCart.hasInvoiceLine;\n return !hasInvoice && this.getCartLinesForShipping().length > 0;\n };\n\n private readonly isDeliveryModeExists = (deliveryMode: string | undefined): boolean => {\n if (deliveryMode) {\n if (this.deliveryOptions.find(deliveryOption => deliveryOption.Code === deliveryMode)) {\n return true;\n }\n }\n return false;\n };\n\n private readonly getDeliveryOptionSelected = (): ICheckoutDeliveryOption | null => {\n const selectedItem = this.deliveryOptions.find(deliveryOption => deliveryOption.Code === this.selectedItemId);\n if (!selectedItem) {\n this.props.context.telemetry.error('Checkout delivery options content is empty, module wont render');\n return null;\n }\n\n const { id, typeName, context } = this.props;\n const { priceFree } = this.props.resources;\n const price = get(selectedItem, 'ShippingChargeAmount', 0);\n\n return {\n DeliveryOption: { className: 'ms-checkout-delivery-options__option-selected' },\n description: ,\n price: \n };\n };\n\n private readonly getErrorMessage = (): ICheckoutDeliveryOptionsError => {\n const { errorMessageTitle } = this.props.resources;\n return {\n // @ts-expect-error\n CheckoutDeliveryOptionsError: { tag: 'span', className: 'ms-address-form__error', role: 'alert', 'aria-live': 'assertive' },\n title: ,\n message: \n };\n };\n\n private readonly getDeliveryOptionList = (): ICheckoutDeliveryOptionEdit[] => {\n const count = this.deliveryOptions.length;\n const { priceFree } = this.props.resources;\n const { id, typeName, context } = this.props;\n\n return this.deliveryOptions.map((deliveryOption: DeliveryOption, index: number) => {\n return {\n DeliveryOption: { className: 'ms-checkout-delivery-options__option', role: 'listitem' },\n code: deliveryOption.Code || '',\n radioButton: (\n \n ),\n description: (\n \n ),\n price: (\n \n )\n };\n });\n };\n\n private readonly getSaveButton = (): React.ReactNode => {\n const { saveBtnLabel = 'Save' } = this.props.resources;\n return (\n \n {saveBtnLabel}\n \n );\n };\n\n private readonly getEditButton = (): React.ReactNode => {\n const { editBtnLabel = 'Change' } = this.props.resources;\n return (\n \n {editBtnLabel}\n \n );\n };\n\n private readonly getCancelButton = (): React.ReactNode => {\n const { cancelBtnLabel = 'Cancel' } = this.props.resources;\n return (\n \n {cancelBtnLabel}\n \n );\n };\n\n private readonly setError = (errorMessage: string): void => {\n this.props.telemetry.error(errorMessage);\n this.props.moduleState.setHasError(true);\n this.props.moduleState.onUpdating();\n this.errorMessage = errorMessage;\n };\n\n private readonly clearError = (): void => {\n this.props.moduleState.setHasError(false);\n this.errorMessage = undefined;\n };\n\n private readonly onSave = async (): Promise => {\n await this.onSubmit();\n };\n\n private readonly onEdit = async (): Promise => {\n this.onUpdating();\n await this.props.data.checkout.result?.updateShouldCollapsePaymentSection({ newShouldCollapsePaymentSection: true });\n };\n\n private readonly onSubmit = async (): Promise => {\n await this.updateCartDeliverySpecification(this.selectedItemId);\n await this.props.data.checkout.result?.updateShouldCollapsePaymentSection({ newShouldCollapsePaymentSection: false });\n };\n\n private readonly onCancel = async (): Promise => {\n // Reset to the saved value\n const savedDeliveryOption = this.getSavedDeliveryOption();\n if (savedDeliveryOption) {\n this.selectedItemId = savedDeliveryOption;\n this.onReady();\n\n await this.props.data.checkout.result?.updateShouldCollapsePaymentSection({ newShouldCollapsePaymentSection: false });\n } else {\n this.onUpdating();\n }\n };\n\n private readonly getSavedDeliveryOption = (): string | undefined => {\n const cartLinesForShipping = this.getCartLinesForShipping();\n return cartLinesForShipping[0] && cartLinesForShipping[0].DeliveryMode;\n };\n\n private readonly updateCartDeliverySpecification = async (deliveryModeId: string): Promise => {\n if (deliveryModeId.trim() === '') {\n return;\n }\n\n const { resources } = this.props;\n const checkoutState = this.props.data.checkout.result as ICheckoutState;\n const updateCartDeliverySpecificationInput = {\n deliveryModeId,\n shippingAddress: checkoutState.shippingAddress,\n channelDeliveryOptionConfig: this.retailMultiplePickUpOptionEnabled ? this.channelDeliveryOptionConfig : undefined\n };\n\n this.clearError();\n this.onPending();\n\n await checkoutState.checkoutCart.updateCartDeliverySpecification(updateCartDeliverySpecificationInput)\n .then((response) => {\n if (response.status === 'FAILED') {\n this.setError(resources.genericErrorMessage);\n } else {\n this.onReady();\n this.props.moduleState.setIsCancellable(true);\n }\n })\n .catch(\n () => {\n this.setError(resources.genericErrorMessage);\n }\n );\n };\n\n private readonly getCartLinesForShipping = (): CartLine[] => {\n const { request } = this.props.context;\n const pickupDeliveryModeCode = request && request.channel && request.channel.PickupDeliveryModeCode;\n const emailDeliveryModeCode = request && request.channel && request.channel.EmailDeliveryModeCode;\n\n return this.retailMultiplePickUpOptionEnabled ? ((this.props.data.checkout.result && this.props.data.checkout.result.checkoutCart.cart.CartLines) || []).filter(\n cartLine => ((cartLine.DeliveryMode && cartLine.DeliveryMode !== '') ? (cartLine.DeliveryMode !== this.channelDeliveryOptionConfig?.PickupDeliveryModeCodes?.find(deliveryMode => deliveryMode === cartLine.DeliveryMode) && cartLine.DeliveryMode !== emailDeliveryModeCode) : cartLine)\n ) : ((this.props.data.checkout.result && this.props.data.checkout.result.checkoutCart.cart.CartLines) || []).filter(\n cartLine => ((cartLine.DeliveryMode && cartLine.DeliveryMode !== '') ? (cartLine.DeliveryMode !== pickupDeliveryModeCode && cartLine.DeliveryMode !== emailDeliveryModeCode) : cartLine)\n );\n };\n\n private readonly getDeliveryOptions = async (shippingAddress: Address): Promise => {\n if (!this.props.data.checkout.result) {\n return;\n }\n\n const { context, resources, config } = this.props;\n const cartState = this.props.data.checkout.result?.checkoutCart;\n const cartId = (cartState.cart as Cart).Id;\n\n if (context) {\n this.isLoading = true;\n this.deliveryOptions = [];\n this.selectedItemId = '';\n this.clearError();\n\n try {\n\n let originalDeliveryMode: string = '';\n const shippingCartLines = this.getCartLinesForShipping();\n const hasShippingDeliveryLines = (shippingCartLines && shippingCartLines.length > 0 && shippingCartLines[0].DeliveryMode);\n if (hasShippingDeliveryLines) {\n\n // First store the delivery mode, so that we can restore the shipping information.\n originalDeliveryMode = shippingCartLines[0].DeliveryMode || '';\n\n // Clear the delivery information on retail server, so GetDeliveryOptions charge calculation works correctly\n const cart = cartState.cart;\n await cartState.clearCartLinesDeliveryInformation({ cart, channelDeliveryOptionConfiguration: this.channelDeliveryOptionConfig });\n }\n\n // TODO: Check if we can move this getDeliveryOptions to checkout state\n let deliveryOptionFilter: FilterDeliveryModeOption;\n switch (config.filterDeliveryModeOption) {\n case filterDeliveryModeOption.none:\n deliveryOptionFilter = FilterDeliveryModeOption.None;\n break;\n case filterDeliveryModeOption.filterOutNonCarrierDeliveryMode:\n deliveryOptionFilter = FilterDeliveryModeOption.FilterOutNonCarrierDeliveryMode;\n break;\n default:\n deliveryOptionFilter = FilterDeliveryModeOption.FilterOutNonCarrierDeliveryMode;\n }\n const response = await getDeliveryOptionsAsync({\n callerContext: context.actionContext,\n queryResultSettings: QueryResultSettingsProxy.getPagingFromInputDataOrDefaultValue(context.actionContext)\n },\n cartId, shippingAddress, [], deliveryOptionFilter, true);\n\n if (hasShippingDeliveryLines) {\n await this.updateCartDeliverySpecification(originalDeliveryMode);\n }\n\n if (response && response.length > 0) {\n this.deliveryOptions = response;\n }\n } catch {\n this.setError(resources.genericErrorMessage);\n }\n\n if (this.deliveryOptions.length === 0) {\n this.setError(resources.deliveryOptionsNotFound);\n } else if (this.cartDeliveryMode && this.isDeliveryModeExists(this.cartDeliveryMode)) {\n this.selectedItemId = this.cartDeliveryMode;\n this.cartDeliveryMode = undefined;\n this.onReady();\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Explicitly check for null/undefined.\n this.props.data.checkout.result?.updateHasCartDeliveryMode({ newHasCartDeliveryMode: true });\n\n if (!this.isPaymentVerificationRedirection) {\n await this.props.data.checkout.result.updateShouldCollapsePaymentSection({ newShouldCollapsePaymentSection: false });\n }\n } else {\n this.onUpdating();\n this.selectedItemId = this.deliveryOptions.length > 0 ? this.deliveryOptions[0].Code || '' : ''; // By default, select first delivery\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Explicitly check for null/undefined.\n this.props.data.checkout.result?.updateHasCartDeliveryMode({ newHasCartDeliveryMode: !!this.isSelectDefaultOptionEnabled });\n }\n\n this.isLoading = false;\n }\n };\n\n private readonly getStoredDeliveryOptions = async (): Promise => {\n if (!this.props.data.checkout.result) {\n return;\n }\n\n const { context } = this.props;\n const cartState = this.props.data.checkout.result.checkoutCart;\n\n if (context) {\n this.isLoading = true;\n this.deliveryOptions = [];\n this.selectedItemId = '';\n this.clearError();\n\n let originalDeliveryMode: string = '';\n const shippingCartLines = this.getCartLinesForShipping();\n const hasShippingDeliveryLines = (shippingCartLines && shippingCartLines.length > 0 && shippingCartLines[0].DeliveryMode);\n if (hasShippingDeliveryLines) {\n\n // First store the delivery mode, so that we can restore the shipping information.\n originalDeliveryMode = shippingCartLines[0].DeliveryMode || '';\n\n // Clear the delivery information on retail server, so GetDeliveryOptions charge calculation works correctly\n const cart = cartState.cart;\n await cartState.clearCartLinesDeliveryInformation({ cart, channelDeliveryOptionConfiguration: this.channelDeliveryOptionConfig });\n if (hasShippingDeliveryLines) {\n await this.updateCartDeliverySpecification(originalDeliveryMode);\n }\n }\n\n if (this.cartDeliveryMode) {\n this.selectedItemId = this.cartDeliveryMode;\n this.cartDeliveryMode = undefined;\n this.onReady();\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Explicitly check for null/undefined.\n this.props.data.checkout.result?.updateHasCartDeliveryMode({ newHasCartDeliveryMode: true });\n\n if (!this.isPaymentVerificationRedirection) {\n await this.props.data.checkout.result.updateShouldCollapsePaymentSection({ newShouldCollapsePaymentSection: false });\n }\n }\n\n this.isLoading = false;\n }\n };\n\n private readonly loadDeliveryOptions = async (): Promise => {\n const shippingAddress = this.props.data.checkout.result?.shippingAddress;\n const isExpressCheckoutApplied = this.props.data.checkout.result?.isExpressCheckoutApplied;\n\n if (this.canShip() && shippingAddress) {\n if (!this.isPaymentVerificationRedirection || this.isSelectDefaultOptionEnabled || isExpressCheckoutApplied) {\n await this.getDeliveryOptions(shippingAddress);\n }\n\n if (this.isPaymentVerificationRedirection) {\n await this.getStoredDeliveryOptions();\n }\n\n if (this.isSelectDefaultOptionEnabled || isExpressCheckoutApplied) {\n this.onSubmit();\n }\n }\n };\n\n private readonly onDeliveryOptionChange = (event: React.ChangeEvent) => {\n const deliveryModeId = event.currentTarget.value;\n this.selectedItemId = deliveryModeId;\n };\n\n private readonly onReady = () => {\n if (!(this.props.config.useDefaultDeliveryOption === useDefaultDeliveryOption.notDisplaySelectedDeliveryOption)) {\n this.props.moduleState.onReady();\n }\n };\n\n private readonly onUpdating = () => {\n if (!(this.props.config.useDefaultDeliveryOption === useDefaultDeliveryOption.notDisplaySelectedDeliveryOption)) {\n this.props.moduleState.onUpdating();\n }\n };\n\n private readonly onPending = () => {\n if (!this.isSelectDefaultOptionEnabled) {\n this.props.moduleState.onPending();\n }\n };\n}\n\nexport default CheckoutDeliveryOptions;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { CartLineItemComponent } from '@msdyn365-commerce/components';\nimport MsDyn365, * as Msdyn365 from '@msdyn365-commerce/core';\nimport { CartLine, OrgUnitLocation, SimpleProduct } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { getProductUrlSync, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, getPayloadObject, getTelemetryAttributes, INodeProps, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport get from 'lodash/get';\nimport groupBy from 'lodash/groupBy';\nimport * as React from 'react';\n\nimport { ICheckoutData } from '../checkout.data';\nimport { ICheckoutProps } from '../checkout.props.autogenerated';\n\ntype deliveryType = 'pickup' | 'ship' | 'email';\n\nexport interface IPickUpAtStore {\n PickUpAtStore: INodeProps;\n label: React.ReactNode;\n location: React.ReactNode;\n}\n\nexport interface IEmailDelivery {\n EmailDelivery: INodeProps;\n label: React.ReactNode;\n}\n\nexport interface ILineItem {\n LineId: string;\n LineItem: INodeProps;\n item?: React.ReactNode;\n pickUpAtStore?: IPickUpAtStore;\n emailDelivery?: IEmailDelivery;\n}\n\nexport interface ILineItemDeliveryGroup {\n LineItemDeliveryGroup: INodeProps;\n LineItemList: INodeProps;\n heading: React.ReactNode;\n lineItemWraper?: React.ReactNode;\n lineItemWraperIcon?: React.ReactNode;\n lineItems: ILineItem[];\n}\n\nexport interface ILineItems {\n LineItems: INodeProps;\n Header: INodeProps;\n heading: React.ReactNode;\n editLink: React.ReactNode;\n itemsForPickup?: ILineItemDeliveryGroup;\n itemsForShip?: ILineItemDeliveryGroup;\n itemsForEmail?: ILineItemDeliveryGroup;\n itemsGroupWithMulitplePickupMode?: ILineItemDeliveryGroup[];\n}\n\nexport const getLineItems = (input: ICheckoutProps, telemetryContent?: ITelemetryContent): ILineItems | undefined => {\n const pickupDeliveryModeCode = get(input, 'context.request.channel.PickupDeliveryModeCode');\n const emailDeliveryModeCode = get(input, 'context.request.channel.EmailDeliveryModeCode');\n const multiplePickupStoreSwitchName = 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature';\n const { channelDeliveryOptionConfig, featureState } = input.data;\n const retailMultiplePickUpOptionEnabled = featureState?.result?.find(feature => feature.Name === multiplePickupStoreSwitchName)?.IsEnabled;\n\n const _getDeliveryLocation = (cartLine: CartLine): string => {\n const orgUnitLocations = get(input, 'data.orgUnitLocations.result');\n if (!cartLine.FulfillmentStoreId || !orgUnitLocations) {\n return '';\n }\n\n const locationMatch = (orgUnitLocations || []).find((location: OrgUnitLocation): boolean => {\n return location.OrgUnitNumber === cartLine.FulfillmentStoreId;\n });\n\n return locationMatch && locationMatch.OrgUnitName;\n };\n\n const _getProduct = (productId: number): SimpleProduct | undefined => {\n const products = get(input, 'data.products.result') || [];\n return products.find((_product: SimpleProduct) => {\n return productId === _product.RecordId;\n });\n };\n\n const _getLineItemComponent = (cartLine: CartLine): JSX.Element | undefined => {\n const product = cartLine.ProductId && _getProduct(cartLine.ProductId);\n const {\n id,\n typeName,\n context,\n config: { imageSettings, showShippingChargesForLineItems },\n resources: {\n quantityDisplayString,\n productDimensionTypeColor,\n productDimensionTypeSize,\n productDimensionTypeStyle,\n productDimensionTypeAmount,\n configString,\n inputQuantityAriaLabel,\n discountStringText,\n shippingCharges\n },\n context: {\n request: { gridSettings }\n }\n } = input;\n\n if (!product) {\n return;\n }\n\n let productUrl = getProductUrlSync(product, context.actionContext, undefined);\n if (MsDyn365.isBrowser) {\n const fullUrl = new URL(productUrl, window.location.href);\n fullUrl.searchParams.set('catalogid', `${cartLine.CatalogId ?? 0}`);\n productUrl = fullUrl.href;\n }\n\n return (\n \n );\n };\n\n const _getPickUpAtStoreComponents = (pickupDeliveryLocation: string): IPickUpAtStore => {\n const {\n resources: { pickUpAtStoreWithLocationText }\n } = input;\n\n return {\n PickUpAtStore: { className: 'ms-checkout__pick-up-at-store' },\n label: \n {pickUpAtStoreWithLocationText}\n ,\n location:
\n {pickupDeliveryLocation}\n
\n };\n };\n\n const _getEmailDeliveryComponents = (): IEmailDelivery => {\n const {\n resources: { emailDeliveryText }\n } = input;\n\n return {\n EmailDelivery: { className: 'ms-checkout__email-delivery' },\n label: \n {emailDeliveryText}\n \n };\n };\n\n const _getLineItemsComponents = (items: CartLine[]): ILineItem[] => {\n return items.map(cartLine => {\n const pickupDeliveryLocation = _getDeliveryLocation(cartLine);\n const isPickUp = _getCartPickDeliveryMode(cartLine);\n const isEmailDelivery = (cartLine.DeliveryMode && cartLine.DeliveryMode !== '') ? cartLine.DeliveryMode === emailDeliveryModeCode : false;\n return {\n LineId: cartLine.LineId || '',\n LineItem: { className: 'ms-checkout__line-item' },\n item: _getLineItemComponent(cartLine),\n pickUpAtStore: isPickUp ? _getPickUpAtStoreComponents(pickupDeliveryLocation) : undefined,\n emailDelivery: isEmailDelivery ? _getEmailDeliveryComponents() : undefined\n };\n });\n };\n\n const _getCartPickDeliveryMode = (cartLineItem: CartLine): boolean => {\n return (!StringExtensions.isNullOrWhitespace(cartLineItem.DeliveryMode)) ? (retailMultiplePickUpOptionEnabled ? cartLineItem.DeliveryMode === channelDeliveryOptionConfig?.result?.PickupDeliveryModeCodes?.find(deliveryMode => deliveryMode === cartLineItem.DeliveryMode) : (cartLineItem.DeliveryMode === pickupDeliveryModeCode)) : false;\n };\n\n const _getCartShipDeliveryMode = (cartLineItem: CartLine): boolean => {\n return (!StringExtensions.isNullOrWhitespace(cartLineItem.DeliveryMode)) ? (retailMultiplePickUpOptionEnabled ? cartLineItem.DeliveryMode !== channelDeliveryOptionConfig?.result?.PickupDeliveryModeCodes?.find(deliveryMode => deliveryMode === cartLineItem.DeliveryMode) : (cartLineItem.DeliveryMode !== pickupDeliveryModeCode)) : false;\n };\n\n const _getGroupTitleComponent = (count: number, type: deliveryType): string => {\n const {\n resources: {\n itemLabel,\n itemsLabel,\n inStorePickUpLabel,\n shippingCountCheckoutLineItem\n }\n } = input;\n\n let emailDeliveryModeDesc: string = '';\n\n input.data.deliveryOptions.result?.find(productDeliveryOptions => {\n emailDeliveryModeDesc = emailDeliveryModeDesc ? emailDeliveryModeDesc : productDeliveryOptions.DeliveryOptions?.find(deliveryOption => deliveryOption.Code === emailDeliveryModeCode)?.Description!;\n });\n\n const suffix = count > 1 ? itemsLabel : itemLabel;\n const title = type === 'ship' ? shippingCountCheckoutLineItem : (type === 'pickup' ? inStorePickUpLabel : `${emailDeliveryModeDesc} (${count} ${suffix})`);\n return title.replace('{count}', count.toString()).replace('{suffix}', suffix);\n };\n\n const _countItems = (items: CartLine[]): number => {\n return items.reduce((count, item) => {\n return count + (item.Quantity || 0);\n\n }, 0);\n };\n\n const _filterItemsByDiliveryType = (type: deliveryType): CartLine[] => {\n const cart = get(input, 'data.checkout.result.checkoutCart.cart');\n if (type === 'ship') {\n return cart.CartLines.filter((\n cartLine: CartLine) => ((cartLine.DeliveryMode && cartLine.DeliveryMode !== '') ? (_getCartShipDeliveryMode(cartLine) && cartLine.DeliveryMode !== emailDeliveryModeCode) : cartLine)\n );\n } else if (type === 'pickup') {\n return cart.CartLines.filter((cartLine: CartLine) => ((cartLine.DeliveryMode && cartLine.DeliveryMode !== '') ? (_getCartPickDeliveryMode(cartLine)) : null)\n );\n }\n return cart.CartLines.filter((cartLine: CartLine) => cartLine.DeliveryMode === emailDeliveryModeCode);\n\n };\n\n const _getLineItemsByDeliveryType = (type: deliveryType): ILineItemDeliveryGroup | undefined => {\n if ((pickupDeliveryModeCode === '' || pickupDeliveryModeCode === undefined) && (type === 'pickup' || type === 'email')) {\n return;\n }\n\n const items = _filterItemsByDiliveryType(type);\n\n if (items.length === 0) {\n return undefined;\n }\n\n const count = _countItems(items);\n const title = _getGroupTitleComponent(count, type);\n\n return {\n LineItemDeliveryGroup: { className: classnames('ms-checkout__line-items-delivery-group', type) },\n LineItemList: { className: 'ms-checkout__line-items-list' },\n heading:
\n {title}\n
,\n lineItems: _getLineItemsComponents(items)\n };\n };\n\n const _getLineItems = (): ILineItems | undefined => {\n const {\n context,\n config: { lineItemsHeading },\n data: { products },\n resources: { editCartText }\n } = input;\n\n const payLoad = getPayloadObject('click', telemetryContent!, TelemetryConstant.EditCart);\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\n const cart = get(input, 'data.checkout.result.checkoutCart.cart');\n const groupClass = retailMultiplePickUpOptionEnabled ? ' multiple-pickup-enabled' : '';\n if (!cart || !cart.CartLines || cart.CartLines.length === 0 || !products) {\n return undefined;\n }\n\n return {\n LineItems: { className: `ms-checkout__line-items${groupClass}` },\n Header: { className: 'ms-checkout__line-items-header' },\n heading: lineItemsHeading && lineItemsHeading.text && (\n \n ),\n editLink: (\n \n {editCartText}\n \n ),\n itemsForPickup: _getLineItemsByDeliveryType('pickup'),\n itemsForShip: _getLineItemsByDeliveryType('ship'),\n itemsForEmail: _getLineItemsByDeliveryType('email'),\n itemsGroupWithMulitplePickupMode: retailMultiplePickUpOptionEnabled ? _getLineItemsByDeliveryTypeWithMulitplePickupMode() : undefined\n };\n };\n\n const handleLineItemHeadingChange = (event: Msdyn365.ContentEditableEvent) => {\n const {\n config: { lineItemsHeading }\n } = input;\n lineItemsHeading!.text = event.target.value;\n };\n\n const _getGroupTitleComponentWithMultiplePickUp = (count: number, type: deliveryType, deliveryMode?: string, fulFillmentStoreId?: string): string => {\n const {\n resources: {\n itemLabel,\n itemsLabel\n }\n } = input;\n\n let emailDeliveryModeDesc: string = '';\n let pickupDeliveryModeDesc: string = '';\n\n input.data.deliveryOptions.result?.find(productDeliveryOptions => {\n emailDeliveryModeDesc = emailDeliveryModeDesc ? emailDeliveryModeDesc : productDeliveryOptions.DeliveryOptions?.find(deliveryOption => deliveryOption.Code === emailDeliveryModeCode)?.Description!;\n });\n\n input.data.deliveryOptions.result?.find(productDeliveryOptions => {\n pickupDeliveryModeDesc = pickupDeliveryModeDesc ? pickupDeliveryModeDesc : productDeliveryOptions.DeliveryOptions?.find(deliveryOption => deliveryOption.Code === deliveryMode)?.Description!;\n });\n\n const pickupTitle: string = `${pickupDeliveryModeDesc}, ${fulFillmentStoreId}`;\n const suffix = count > 1 ? itemsLabel : itemLabel;\n const title = type === 'ship' ? `(${count} ${suffix})` : (type === 'pickup' ? `${pickupTitle} (${count} ${suffix})` : `${emailDeliveryModeDesc} (${count} ${suffix})`);\n return title.replace('{count}', count.toString()).replace('{suffix}', suffix);\n };\n\n const _filterItemsByMultiplePickupMode = (): CartLine[][] => {\n const cart = get(input, 'data.checkout.result.checkoutCart.cart');\n const getGroupByStorePickup = (items: CartLine[]) => groupBy(items, item => item.FulfillmentStoreId);\n const getGroupByDelivery = (items: CartLine[]) => groupBy(items, item => (item.DeliveryMode));\n const groupDelivery = getGroupByDelivery(cart.CartLines);\n const cartLinesGroup: CartLine[] = [];\n const cartLinesGrp: CartLine[][] = [];\n\n // 1) Group by store and pick up mode\n Object.entries(groupDelivery).forEach(([deliveryMode, groupByDeliveryType]) => {\n // @ts-expect-error\n groupDelivery[deliveryMode] = getGroupByStorePickup(groupByDeliveryType);\n cartLinesGroup.push(getGroupByStorePickup(groupByDeliveryType));\n });\n\n Object.keys(cartLinesGroup).forEach(key => {\n const cartLines = cartLinesGroup[key];\n Object.keys(cartLines).forEach(index => {\n const cartLine = cartLines[index];\n cartLinesGrp.push(cartLine);\n });\n });\n\n return cartLinesGrp;\n };\n\n const _getLineItemsByDeliveryTypeWithMulitplePickupMode = (): ILineItemDeliveryGroup[] | undefined => {\n if (pickupDeliveryModeCode === '' || pickupDeliveryModeCode === undefined) {\n return;\n }\n\n const {\n resources: {\n multiplePickUpLabel,\n shippingLable\n }\n } = input;\n\n const items = _filterItemsByMultiplePickupMode();\n\n if (items.length === 0) {\n return undefined;\n }\n\n const lineItemDeliveryGroup: ILineItemDeliveryGroup[] = [];\n items.map(item => {\n const count = _countItems(item);\n const cartLine = item[0];\n const pickupDeliveryLocation = _getDeliveryLocation(cartLine);\n const type: deliveryType = cartLine.FulfillmentStoreId && cartLine.DeliveryMode ? 'pickup' : (cartLine.FulfillmentStoreId === '' && cartLine.DeliveryMode === emailDeliveryModeCode ? 'email' : 'ship');\n const title = _getGroupTitleComponentWithMultiplePickUp(count, type, cartLine.DeliveryMode, pickupDeliveryLocation);\n const groupTitle = type === 'pickup' ? multiplePickUpLabel : (type === 'ship' ? shippingLable : 'email');\n const iconClass = `ms-checkout__line-items-group-title-multiple-pickup-${type}icon`;\n lineItemDeliveryGroup.push({\n LineItemDeliveryGroup: { className: classnames('ms-checkout__line-items-delivery-group multiple-pickup', type) },\n LineItemList: { className: 'ms-checkout__line-items-list' },\n lineItemWraperIcon:
,\n lineItemWraper:
\n {groupTitle}\n
,\n heading:
\n {title}\n
,\n lineItems: _getLineItemsComponents(item)\n });\n });\n\n return lineItemDeliveryGroup;\n };\n\n return _getLineItems();\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { Button, Collapse, ICollapseProps } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { IQuickOrderDrawerProps } from './quick-order-drawer-props';\n\nexport interface IQuickOrderDrawerState {\n isOpen: boolean;\n}\n\nexport type GlyphPlacement = 'start' | 'end';\n\n/**\n * Quick Order Drawer - This is a full width uncontrolled collapse where the button glyph changes\n * when the drawer is open and closed.\n */\n\nexport default class QuickOrderDrawer extends React.Component {\n public state: IQuickOrderDrawerState;\n\n private readonly drawerOpenGlyph: string;\n\n private readonly drawerCloseGlyph: string;\n\n private readonly drawerGlyphClass: string;\n\n private isManuallyToggled: boolean;\n\n constructor(props: IQuickOrderDrawerProps) {\n super(props);\n this._toggle = this._toggle.bind(this);\n this.isManuallyToggled = false;\n this.state = { isOpen: (props.collapseProps && props.collapseProps.isOpen) || false };\n this.drawerGlyphClass = classnames('drawer__glyph',\n this.props.toggleGlyphClassName ? this.props.toggleGlyphClassName : '');\n\n if (this.props.animateGlyph) {\n this.drawerOpenGlyph = classnames(this.drawerGlyphClass,\n this.props.openGlyph ? this.props.openGlyph : (this.props.closeGlyph ? this.props.closeGlyph : ''));\n this.drawerCloseGlyph = this.drawerOpenGlyph;\n } else {\n this.drawerOpenGlyph = classnames(this.drawerGlyphClass,\n this.props.openGlyph ? this.props.openGlyph : '');\n this.drawerCloseGlyph = classnames(this.drawerGlyphClass,\n this.props.closeGlyph ? this.props.closeGlyph : '');\n }\n }\n\n public shouldComponentUpdate(nextProps: IQuickOrderDrawerProps,\n nextState: IQuickOrderDrawerState): boolean {\n if (this.state === nextState && this.props === nextProps) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element {\n const collapseProps = { ...this.props.collapseProps } as ICollapseProps;\n\n // If the drawer is manually toggled by pressing the button, then we use the internal state\n if (collapseProps.isOpen === undefined || this.isManuallyToggled) {\n collapseProps.isOpen = this.state.isOpen;\n } else {\n this.state.isOpen = collapseProps.isOpen;\n }\n collapseProps.children = this.props.children;\n const drawerClass = classnames('drawer', this.props.className ? this.props.className : '');\n this.isManuallyToggled = false;\n return (\n
\n \n {this._generateDrawerButtonInnerMarkup(collapseProps.isOpen)}\n \n \n
\n );\n }\n\n private _generateDrawerButtonInnerMarkup(collapseState: boolean): JSX.Element {\n const drawerButtonTextClass = classnames('drawer__buttontext', this.props.toggleButtonClassName ? this.props.toggleButtonClassName : '');\n return (\n <>\n

\n {this.props.moduleHeadingText}\n

\n \n {this.props.moduleDescriptionText}\n \n {this._generateGlyphMarkup('drawer__glyph__end', collapseState)}\n \n );\n }\n\n private _generateGlyphMarkup(location: string, collapseState: boolean): JSX.Element {\n let glyphClass = collapseState ? this.drawerOpenGlyph : this.drawerCloseGlyph;\n glyphClass = `${glyphClass} ${location}`;\n return (\n \n );\n }\n\n private _toggle(e: React.MouseEvent | React.KeyboardEvent): void {\n e.preventDefault();\n this.setState({ isOpen: !this.state.isOpen });\n this.isManuallyToggled = true;\n if (this.props.onToggle) {\n this.props.onToggle(this.state);\n }\n }\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { Alert, Button } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IQuickOrderState } from '../quick-order';\n\nexport interface IQuickOrderFormProps {\n disableAddtoCart: boolean | undefined;\n productTextInput: React.RefObject;\n quantityTextInput: React.RefObject;\n maxChars: number;\n maxQuantity?: number;\n ariaLabelQuantity: string;\n ariaLabelProduct: string;\n ariaLabelAddtoCart: string;\n quickOrderState: IQuickOrderState;\n handleInputChange(query: string): void;\n handleQuantityChange(query: string): void;\n handleAddToCartClick(): Promise;\n}\n\nexport interface IQuickOrderFormViewProps {\n product: React.ReactNode;\n quantity: React.ReactNode;\n addToCartBtn: React.ReactNode;\n userMessage?: React.ReactNode;\n}\n\n/**\n * On Input Change functionality.\n * @param handleInputChange -Input change function.\n * @returns Input change value.\n */\nconst onInputChangeFunction = (handleInputChange: (query: string) => void) => (event: React.ChangeEvent) => {\n handleInputChange(event.target.value || '');\n};\n\n/**\n * On Quantity Change functionality.\n * @param handleQuantityChange -Quantity change function.\n * @returns Quantity change value.\n */\nconst onQuantityChangeFunction = (handleQuantityChange: (query: string) => void) => (event: React.ChangeEvent) => {\n handleQuantityChange(event.target.value || '');\n};\n\nexport const QuickOrderFormComponent = (props: IQuickOrderFormProps): IQuickOrderFormViewProps => {\n const {\n productTextInput,\n quantityTextInput,\n quickOrderState,\n maxChars,\n maxQuantity,\n disableAddtoCart,\n ariaLabelQuantity,\n ariaLabelProduct,\n ariaLabelAddtoCart,\n handleQuantityChange,\n handleInputChange,\n handleAddToCartClick\n } = props;\n\n const onInputChange = onInputChangeFunction(handleInputChange);\n\n const onQuantityInputChange = onQuantityChangeFunction(handleQuantityChange);\n\n const productNode = (\n
\n

\n {ariaLabelProduct}\n

\n \n
\n );\n\n const quantityNode = (\n
\n

\n {ariaLabelQuantity}\n

\n \n
\n );\n\n const addtoCartNode = (\n
\n \n {ariaLabelAddtoCart}\n \n
\n );\n\n const userMessageNode = quickOrderState && quickOrderState.stateMessage ? (\n \n \n \n {quickOrderState.stateMessage.messageText}\n \n \n ) : undefined;\n\n return {\n product: productNode,\n addToCartBtn: addtoCartNode,\n quantity: quantityNode,\n userMessage: userMessageNode\n };\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { CartLine, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { observable } from 'mobx';\n\n/**\n * Represents a product for quick order.\n */\nexport class QuickOrderProduct {\n @observable\n public isSelected: boolean;\n\n public readonly cartLine: CartLine;\n\n public readonly simpleProduct: SimpleProduct;\n\n public constructor(cartLine: CartLine, simpleProduct: SimpleProduct) {\n this.cartLine = cartLine;\n this.simpleProduct = simpleProduct;\n this.isSelected = false;\n }\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { IComponent, IComponentProps, ICoreContext } from '@msdyn365-commerce/core';\nimport classnames from 'classnames';\nimport React from 'react';\n\n/**\n * Interface for quick order table header resources.\n */\nexport interface IQuickOrderTableHeaderResources {\n quickOrderProductNumberText: string;\n quickOrderProductText: string;\n quickOrderUnitPriceText: string;\n quickOrderUnitOfMeasureText: string;\n quickOrderQuantityText: string;\n quickOrderTotalText: string;\n quickOrderActionsText: string;\n}\n\n/**\n * Interface for quick order table props.\n */\nexport interface IQuickOrderTableHeaderProps extends IComponentProps {\n context: ICoreContext;\n className: string;\n\n isMobile: boolean;\n resources: IQuickOrderTableHeaderResources;\n}\n\n/**\n * Interface for quick order table header component.\n */\nexport interface IQuickOrderTableHeaderComponent extends IComponent {\n}\n\n/**\n * Get the quick order header cells for desktop.\n * @param props -- The quick order table header props.\n * @returns The list of cells for quick order header component in desktop version.\n */\nconst QuickOrderDesktopHeaderCellsComponent: React.FC = (props: IQuickOrderTableHeaderProps) => {\n const { resources } = props;\n const columnWithNumberClassName = `${props.className}__row__column-with-number`;\n return (\n <>\n \n \n \n \n {resources.quickOrderProductNumberText}\n \n \n {resources.quickOrderProductText}\n \n \n {resources.quickOrderUnitPriceText}\n \n \n {resources.quickOrderUnitOfMeasureText}\n \n \n {resources.quickOrderQuantityText}\n \n \n {resources.quickOrderTotalText}\n \n \n {resources.quickOrderActionsText}\n \n \n );\n};\n\n/**\n * Get the quick order header cells for mobile.\n * @param props -- The quick order table header props.\n * @returns The quick order header component in desktop version.\n */\nconst QuickOrderMobileHeaderCellsComponent: React.FC = (props: IQuickOrderTableHeaderProps) => {\n const { resources } = props;\n return (\n <>\n \n \n {resources.quickOrderProductNumberText}\n \n \n \n );\n};\n\n/**\n * Quick order table header component.\n * @param props - Configuration of the component.\n * @returns React node with the header.\n */\nexport const QuickOrderTableHeaderComponent: React.FC = (props: IQuickOrderTableHeaderProps) => {\n const rowClassName = `${props.className}__row`;\n\n let headerCells: JSX.Element;\n if (props.isMobile) {\n headerCells = ();\n } else {\n headerCells = ();\n }\n\n return (\n \n \n {headerCells}\n \n \n );\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { IComponentProps, ICoreContext, IImageSettings, Image } from '@msdyn365-commerce/core';\nimport { CartLine, format, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { getFallbackImageUrl, getProductPageUrlSync, ObjectExtensions, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, IncrementalQuantity } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\n/**\n * Data required to render each quick order row.\n */\nexport interface IQuickOrderTableRowData {\n cartLine: CartLine;\n product: SimpleProduct;\n}\n\n/**\n * Resources for quick order table rows.\n */\nexport interface IQuickOrderTableRowResources {\n quickOrderQuantityMobileText: string;\n quickOrderProductDimensionsSeparator: string;\n quickOrderViewDetailsButtonText: string;\n quickOrderViewDetailsButtonAriaLabel: string;\n quickOrderRemoveItemButtonAriaLabel: string;\n quickOrderInputQuantityAriaLabel: string;\n quickOrderDecrementButtonAriaLabel: string;\n quickOrderIncrementButtonAriaLabel: string;\n}\n\n/**\n * Interface for quick order table props.\n */\nexport interface IQuickOrderTableRowProps extends IComponentProps {\n context: ICoreContext;\n className: string;\n\n imageSettings?: IImageSettings;\n isMobile: boolean;\n resources: IQuickOrderTableRowResources;\n}\n\n/**\n * The default image settings for quick order table row.\n */\nconst defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=80&h=80&m=6', w: 0, h: 0 },\n lg: { q: 'w=147&h=147&m=6', w: 0, h: 0 }\n },\n lazyload: true,\n cropFocalRegion: true\n};\n\n/**\n * Renders product image for quick order row.\n * @param props - Quick order table row props.\n * @returns React element.\n */\nconst QuickOrderTableRowProductImageComponent: React.FC = (props: IQuickOrderTableRowProps) => {\n\n const fallbackImageUrl = getFallbackImageUrl(props.data.product.ItemId, props.context.actionContext.requestContext.apiSettings);\n\n const containerClassName = `${props.className}__product-image-container`;\n\n return (\n
\n \n
\n );\n};\n\n/**\n * Renders actions popup for the mobile view.\n * @param props - Configuration for popup.\n * @returns A react node with actions..\n */\nconst QuickOrderExtraActionsPopupComponent: React.FC = (props: IQuickOrderTableRowProps): JSX.Element | null => {\n const product: SimpleProduct = props.data.product;\n\n let productUrl = '';\n if (!StringExtensions.isNullOrWhitespace(product.Name) && !ObjectExtensions.isNullOrUndefined(product.RecordId)) {\n productUrl = getProductPageUrlSync(product.Name!, product.RecordId, props.context.actionContext);\n }\n\n if (StringExtensions.isNullOrWhitespace(productUrl)) {\n return null;\n }\n\n const className = `${props.className}__extra-actions-cell`;\n\n return (\n
\n
\n );\n};\n\n/**\n * Renders quick order table rows for desktop view.\n * @param props - Configuration for the rows.\n * @returns A react node with a list of quick order rows for desktop view.\n */\nexport const QuickOrderDesktopTableRowCellComponent: React.FC = (props: IQuickOrderTableRowProps) => {\n const product: SimpleProduct = props.data.product;\n const cartLine: CartLine = props.data.cartLine;\n const columnWithNumberClassName = `${props.className}__column-with-number`;\n\n let productUrl = '';\n if (!StringExtensions.isNullOrWhitespace(product.Name) && !ObjectExtensions.isNullOrUndefined(product.RecordId)) {\n productUrl = getProductPageUrlSync(product.Name!, product.RecordId, props.context.actionContext);\n }\n\n return (\n <>\n \n \n \n \n {product.ItemId}\n \n \n
\n \n {product.Name}\n \n \n {\n product.Dimensions?.map(\n dimension => dimension.DimensionValue?.Value).filter(\n dimensionValue => !StringExtensions.isNullOrWhitespace(dimensionValue)).join(\n props.resources.quickOrderProductDimensionsSeparator)\n }\n \n
\n \n \n {cartLine.Price}\n \n \n {cartLine.UnitOfMeasureSymbol}\n \n \n \n \n \n {cartLine.TotalAmount}\n \n \n \n \n \n );\n};\n\n/**\n * Renders rows for mobile view.\n * @param props - Configuration for the rows.\n * @returns A react node with a list of quick order rows for mobile view.\n */\nexport const QuickOrderMobileTableRowCellComponent: React.FC = (props: IQuickOrderTableRowProps) => {\n const product: SimpleProduct = props.data.product;\n const cartLine: CartLine = props.data.cartLine;\n\n return (\n <>\n \n \n \n \n
\n \n {product.ItemId}\n \n \n {format(props.resources.quickOrderQuantityMobileText, cartLine.Quantity)}\n \n
\n \n \n \n \n \n );\n};\n\n/**\n * Quick order table row component.\n * @param props - Configuration of the component.\n * @returns React node for the row.\n */\nexport const QuickOrderTableRowComponent: React.FC = (props: IQuickOrderTableRowProps) => {\n const rowClassName = `${props.className}__row`;\n\n let headerCells: JSX.Element;\n if (props.isMobile) {\n headerCells = ();\n } else {\n headerCells = ();\n }\n\n return (\n \n \n {headerCells}\n \n \n );\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport MsDyn365, { IComponent, IComponentProps, ICoreContext } from '@msdyn365-commerce/core';\nimport React from 'react';\n\nimport { QuickOrderProduct } from '../quick-order-product';\nimport { IQuickOrderTableHeaderResources, QuickOrderTableHeaderComponent } from './components/quick-order-table-header-component';\nimport { IQuickOrderTableRowResources, QuickOrderTableRowComponent } from './components/quick-order-table-row-component';\n\n/**\n * Quick order table data interface.\n */\ninterface IQuickOrderTableData {\n quickOrderProducts: QuickOrderProduct[];\n}\n\n/**\n * Quick order table resources.\n */\nexport interface IQuickOrderTableResources extends IQuickOrderTableHeaderResources, IQuickOrderTableRowResources {\n}\n\n/**\n * Quick order table props.\n */\nexport interface IQuickOrderTableProps extends IComponentProps {\n context: ICoreContext;\n className: string;\n\n resources: IQuickOrderTableResources;\n isMobileView: boolean;\n}\n\n/**\n * Quick order table component.\n */\nexport interface IQuickOrderTableComponent extends IComponent {\n}\n\n/**\n * The quick order table.\n * @param props -- The quick order table props.\n * @returns The quick order table element.\n */\nexport const QuickOrderTableComponent: React.FC = (props: IQuickOrderTableProps) => {\n const [isMobile, setIsMobile] = React.useState(props.isMobileView);\n const quickOrderProducts = props.data.quickOrderProducts;\n\n /**\n * Update the view port.\n */\n const updateViewport = () => {\n setIsMobile(props.isMobileView);\n };\n if (MsDyn365.isBrowser) {\n window.addEventListener('resize', updateViewport);\n }\n\n const headerClassName = `${props.className}__header`;\n const rowClassName = `${props.className}__row`;\n\n return (\n \n \n {\n quickOrderProducts.map((quickOrderProduct, index) => {\n return (\n \n );\n })\n }\n
\n );\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { ProductDimensionFull } from '@msdyn365-commerce/commerce-entities';\nimport { getProductConfigure, IErrorState, IProductDimensionCallbacks, IProductDimensionConfigureResources,\n IProductDimensionConfigureViewProps } from '@msdyn365-commerce/components';\nimport { CartLine, ProductDimension, ProductDimensionValue, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { getDeliveryOptionsAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\nimport { ArrayExtensions, FinitePromiseQueue, FinitePromiseQueueError,\n getDimensionsForSelectedVariant, GetDimensionsForSelectedVariantInput,\n getProductAvailabilitiesForSelectedVariant, getScanResult, GetScanResultInput,\n getSelectedVariant, IProductInventoryInformation, IPromiseQueue, ObjectExtensions, ProductAvailabilitiesForSelectedVariantInput,\n QueryResultSettingsProxy, SelectedVariantInput, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { getTelemetryObject, IModuleProps, INodeProps, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { debounce } from 'lodash';\nimport { computed, observable } from 'mobx';\nimport * as React from 'react';\n\nimport { QuickOrderDrawer, QuickOrderFormComponent, QuickOrderProduct } from './components';\nimport { QuickOrderTableComponent } from './components/quick-order-table/quick-order-table-component';\nimport { IQuickOrderData } from './quick-order.data';\nimport { IQuickOrderProps, IQuickOrderResources } from './quick-order.props.autogenerated';\n\n/**\n * Quick Order View Props Interface properties.\n */\nexport interface IQuickOrderViewProps extends IQuickOrderProps {\n isB2B?: boolean;\n productText: string;\n isQuickOrderFormExpanded: boolean;\n contentProps: INodeProps ;\n drawer: INodeProps;\n quickOrderForm: INodeProps;\n quickOrderFormProductContent: INodeProps;\n quickOrderFormMsgContent: INodeProps;\n quickOrderProps: IModuleProps;\n quickOrderList?: React.ReactNode;\n form: React.ReactNode;\n configure?: IProductDimensionConfigureViewProps;\n isMobileView: boolean;\n}\n\n/**\n * Quick Order State Message Interface properties.\n */\nexport interface IQuickOrderStateMessage {\n isOpen: boolean;\n messageGlyph: string;\n messageText: string;\n statusCssString: string;\n}\n\n/**\n * GridSize Interface properties.\n */\nexport type GridSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\n/**\n * Quick Order Interface properties.\n */\nexport interface IQuickOrderState {\n isQuickOrderFormExpanded: boolean;\n isUpdatingDimension?: boolean;\n productAvailableQuantity: IProductInventoryInformation | undefined;\n productResponse: SimpleProduct | undefined;\n productDimensions: ProductDimensionFull[] | undefined;\n productText: string;\n quantity: number;\n stateMessage?: IQuickOrderStateMessage;\n productDimensionErrorState: IErrorState;\n isMobile: boolean;\n products: SimpleProduct[];\n}\n\n/**\n *\n * QuickOrder component.\n * @extends {React.PureComponent, IQuickOrderState>}\n */\nclass QuickOrder extends React.PureComponent, IQuickOrderState> {\n @observable\n private readonly viewport: GridSize;\n\n private readonly productTextInput: React.RefObject;\n\n private readonly quantityInput: React.RefObject;\n\n private readonly waitTime: number = 500;\n\n private readonly quickOrderFormClass: string;\n\n private readonly quickOrderFormProductContent: string;\n\n private readonly quickOrderFormMsgContent: string;\n\n private readonly telemetryContent: ITelemetryContent;\n\n private readonly dimensionUpdateQueue: IPromiseQueue = new FinitePromiseQueue(2);\n\n private dimensions: { [id: number]: string } = {};\n\n private readonly cssClassNameConfigure: string = 'ms-quick-order__content-form-main';\n\n // @ts-expect-error -- Existing code.\n private cancellabelDebounce: debounce;\n\n private readonly quickOrderCallbacks: IProductDimensionCallbacks = {\n\n /**\n * Get Dropdown name.\n * @param selectedDimensionId - Dimension type.\n * @param selectedDimensionValueId - Resources.\n * @returns Dropdown name.\n */\n dimensionSelectedAsync: async (selectedDimensionId: number, selectedDimensionValueId: string): Promise => {\n this.dimensions[selectedDimensionId] = selectedDimensionValueId;\n return this.dimensionUpdateQueue.enqueue(async () => {\n return this._updateDimensions();\n }).catch((error: any) => { // Ignore discarded processes.\n if (error !== FinitePromiseQueueError.ProcessWasDiscardedFromTheQueue) {\n throw error;\n }\n });\n },\n\n /**\n * Get Dropdown name.\n * @param dimensionType - Dimension type.\n * @param resources - Resources.\n * @returns Dropdown name.\n */\n getDropdownName: (dimensionType: number, resources: IProductDimensionConfigureResources): string => {\n return this._getDropdownName(dimensionType, resources);\n },\n\n /**\n * Method to call on dimension change.\n * @param isUpdatingDimension - Flag to update dimension.\n */\n changeUpdatingDimension: (isUpdatingDimension: boolean): void => {\n this.setState({ isUpdatingDimension });\n }\n };\n\n public constructor(props: IQuickOrderProps) {\n super(props);\n this.productTextInput = React.createRef();\n this.quantityInput = React.createRef();\n this.viewport = props.context.request.device.Type === 'Mobile' ? 'xs' : 'lg';\n\n this.telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!, this.props.friendlyName, this.props.telemetry);\n this.state = {\n productText: '',\n isQuickOrderFormExpanded: false,\n productAvailableQuantity: undefined,\n quantity: 1,\n productResponse: undefined,\n productDimensions: undefined,\n productDimensionErrorState: {\n configureErrors: {}\n },\n isMobile: this.isMobile,\n products: []\n };\n this._handleInputChange = this._handleInputChange.bind(this);\n this._handleQuantityChange = this._handleQuantityChange.bind(this);\n this.quickOrderFormClass = 'ms-quick-order__content-form';\n this.quickOrderFormProductContent = 'ms-quick-order__content-form-main';\n this.quickOrderFormMsgContent = 'ms-quick-order__content-form-msg';\n }\n\n @computed get isMobile(): boolean {\n return (this.viewport === 'xs' || this.viewport === 'sm');\n }\n\n public render(): JSX.Element | null {\n\n const { data } = this.props;\n if (!data.customerInformation.result) {\n return null;\n }\n\n const { className = '', maxQuantity } = this.props.config;\n const customerInfo = this.props.data.customerInformation.result;\n const { quickOrderModuleHeading, quickOrderModuleDescription,\n quickOrderAddtobag, quickOrderProductQuantityInputLabel,\n quickOrderProductInputLabel, quickOrderProductDimensionTypeColor,\n quickOrderProductDimensionTypeConfiguration, quickOrderSelectDimensionFormatString,\n quickOrderProductDimensionTypeSize, quickOrderProductDimensionTypeStyle,\n quickOrderProductDimensionTypeAmount\n } = this.props.resources;\n\n const productConfigureResources: IProductDimensionConfigureResources = {\n selectDimensionFormatString: quickOrderSelectDimensionFormatString,\n productDimensionTypeColor: quickOrderProductDimensionTypeColor,\n productDimensionTypeConfiguration: quickOrderProductDimensionTypeConfiguration,\n productDimensionTypeSize: quickOrderProductDimensionTypeSize,\n productDimensionTypeStyle: quickOrderProductDimensionTypeStyle,\n productDimensionTypeAmount: quickOrderProductDimensionTypeAmount\n };\n\n const {\n isQuickOrderFormExpanded,\n productText,\n productDimensionErrorState,\n productResponse,\n productDimensions\n } = this.state;\n\n const moduleClassName: string = 'ms-quick-order';\n\n const viewProps: IQuickOrderViewProps = {\n ...(this.props as IQuickOrderProps),\n\n quickOrderProps: { className: classnames('ms-quick-order', className), moduleProps: this.props },\n contentProps: { className: 'ms-quick-order__content' },\n isB2B: customerInfo?.IsB2b,\n drawer: {\n tag: QuickOrderDrawer,\n className: `${moduleClassName}__drawer`,\n collapseProps: { isOpen: this.state.isQuickOrderFormExpanded },\n moduleHeadingText: quickOrderModuleHeading,\n moduleDescriptionText: quickOrderModuleDescription,\n requestContext: this.props.context.request,\n telemetryContent: this.telemetryContent\n },\n quickOrderForm: {\n className: `${this.quickOrderFormClass} ${isQuickOrderFormExpanded ? 'qo-show' : 'qo-hide'}`\n },\n quickOrderFormProductContent: {\n className: this.quickOrderFormProductContent\n },\n quickOrderFormMsgContent: {\n className: this.quickOrderFormMsgContent\n },\n productText,\n quickOrderList: ArrayExtensions.hasElements(this.state.products) ? this._renderQuickOrderTable('ms-quick-order') : undefined,\n form: QuickOrderFormComponent({\n productTextInput: this.productTextInput,\n quantityTextInput: this.quantityInput,\n disableAddtoCart: !productResponse,\n ariaLabelAddtoCart: quickOrderAddtobag,\n ariaLabelProduct: quickOrderProductInputLabel,\n ariaLabelQuantity: quickOrderProductQuantityInputLabel,\n maxChars: 50,\n maxQuantity,\n quickOrderState: this.state,\n handleInputChange: this._handleInputChange,\n handleAddToCartClick: this._addItemToCart,\n handleQuantityChange: this._handleQuantityChange\n }),\n configure: productResponse && productDimensions ? getProductConfigure(this.cssClassNameConfigure, this.props.context, this.props.friendlyName,\n this.props.telemetry, quickOrderSelectDimensionFormatString,\n productConfigureResources, this.quickOrderCallbacks, productResponse,\n productDimensions, productDimensionErrorState) : undefined,\n isQuickOrderFormExpanded: this.state.isQuickOrderFormExpanded,\n isMobileView: this.state.isMobile\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n /**\n * Initial the products on quick order.\n * @returns List of quick order products or undefined.\n */\n private _initQuickOrderProducts(): QuickOrderProduct[] {\n const {\n data: {\n cart: { result: cart }\n }\n } = this.props;\n\n const products: SimpleProduct[] = this.state.products;\n\n const quickOrderProducts = cart?.cart.CartLines?.map((cartLine: CartLine) => {\n const quickOrderProduct = products.find(product => product.RecordId === cartLine.ProductId);\n if (ObjectExtensions.isNullOrUndefined(quickOrderProduct)) {\n return undefined;\n }\n\n return new QuickOrderProduct(cartLine, quickOrderProduct);\n });\n\n return ArrayExtensions.validValues(quickOrderProducts);\n }\n\n /**\n * Render Quick Order Table.\n * @param className - Class name.\n * @returns JSX element.\n */\n private _renderQuickOrderTable(className: string): JSX.Element {\n const tableClassName = `${className}__table-list`;\n\n return (\n \n );\n }\n\n /**\n * Method to handle input change.\n * @param query - Class name.\n */\n private readonly _handleInputChange = (query: string): void => {\n if (!query || query.length > 4) {\n this.setState({ productText: query, quantity: 0, productResponse: undefined, productDimensions: [] });\n this.setState({ stateMessage: {\n messageText: '',\n statusCssString: '',\n messageGlyph: '',\n isOpen: false\n } });\n } else {\n return;\n }\n\n if (this.cancellabelDebounce) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call -- existing code.\n this.cancellabelDebounce.cancel();\n }\n\n const {\n telemetry,\n context\n } = this.props;\n const maxChar = 50;\n if (context) {\n if (!StringExtensions.isNullOrWhitespace(query)) {\n if (query.length > maxChar) {\n return;\n }\n\n this.cancellabelDebounce = debounce(() => {\n getScanResult(\n new GetScanResultInput(\n context.actionContext.requestContext.apiSettings,\n query,\n context.actionContext.requestContext.apiSettings.channelId\n ),\n this.props.context.actionContext)\n .then(results => {\n this.setState({\n productResponse: results?.Product,\n productDimensions: results?.ProductDimensionFull,\n isQuickOrderFormExpanded: true\n });\n })\n .catch(error => {\n this.setState({ productText: '' });\n telemetry.exception(error);\n telemetry.debug('Unable to get scan results');\n });\n }, this.waitTime);\n\n setTimeout(() => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call -- Existing code.\n this.cancellabelDebounce();\n }, 0);\n this.setState({ productText: query, isQuickOrderFormExpanded: true });\n } else {\n this.setState({ productText: '', productResponse: undefined, isQuickOrderFormExpanded: true });\n }\n }\n };\n\n /**\n * Method to add product in cart.\n */\n private readonly _addItemToCart = async (): Promise => {\n const { context, data, resources, telemetry } = this.props;\n const { cart } = data;\n const { quickOrderAddedToCartSuccessMessage, quickOrderAddedToCartFailureMessage } = resources;\n const { productResponse, quantity } = this.state;\n this.setState({ stateMessage: {\n messageText: '',\n statusCssString: '',\n messageGlyph: '',\n isOpen: false\n } });\n\n if (context && productResponse !== undefined && this._validateCart(productResponse, quantity) && cart.result) {\n const isOrderQuantityLimitsFeatureEnabledInHq = this.props.data.featureState.result\n ?.find(featureState => featureState.Name === 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature')?.IsEnabled || false;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- existing code.\n const defaultOrderQuantityLimitsFeatureConfig = this.props.context.request.app.platform?.enableDefaultOrderQuantityLimits;\n const customerInfo = this.props.data.customerInformation.result;\n\n const isOrderQuantityLimitsFeatureEnabledInSiteSettings = defaultOrderQuantityLimitsFeatureConfig === 'all' ||\n (customerInfo &&\n ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\n (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b)));\n\n // Get product delivery mode info\n const deliveryOptions = await getDeliveryOptionsAsync(\n {\n callerContext: this.props.context.actionContext,\n queryResultSettings: QueryResultSettingsProxy.getPagingFromInputDataOrDefaultValue(this.props.context.actionContext)\n },\n [productResponse.RecordId]);\n const emailDeliveryModeCode = this.props.context.actionContext.requestContext.channel?.EmailDeliveryModeCode;\n const defaultDeliveryOption = ArrayExtensions.hasElements(deliveryOptions) &&\n ArrayExtensions.hasElements(deliveryOptions[0].DeliveryOptions) ? deliveryOptions[0].DeliveryOptions[0].Code : undefined;\n\n const isOrderQuantityLimitsFeatureEnabled = isOrderQuantityLimitsFeatureEnabledInHq && isOrderQuantityLimitsFeatureEnabledInSiteSettings;\n if (this.state.productAvailableQuantity === undefined) {\n await this._updateAvailablity();\n }\n const { productAvailableQuantity } = this.state;\n const addProductToCartInput = {\n product: productResponse,\n count: quantity,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- Existing code.\n enableStockCheck: context.app.config.enableStockCheck,\n availableQuantity: productAvailableQuantity ? productAvailableQuantity.ProductAvailableQuantity.AvailableQuantity : 0,\n additionalProperties: { orderQuantityLimitsFeatureIsEnabled: isOrderQuantityLimitsFeatureEnabled },\n isAddEmailDeliveryItemToCart: defaultDeliveryOption !== undefined && defaultDeliveryOption === emailDeliveryModeCode,\n deliveryMode: defaultDeliveryOption\n };\n\n cart.result.addProductToCart(addProductToCartInput)\n .then(async result => {\n if (result.status === 'SUCCESS') {\n this.props.telemetry.debug('[quick-order] Cart Updated');\n\n this.setState({ stateMessage: {\n messageText: quickOrderAddedToCartSuccessMessage,\n statusCssString: 'success',\n messageGlyph: 'fas fa-check',\n isOpen: true\n } });\n } else if (result.substatus === 'MAXQUANTITY') {\n this.props.telemetry.debug('[quick-order] Unable to Update Cart Line from the quick order', quantity);\n const maxQtyLimitReachedMessage = this._getMaxQtyMessage(productAvailableQuantity, quantity);\n\n this.setState({ stateMessage: {\n messageText: maxQtyLimitReachedMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n } });\n } else if (result.substatus === 'QUANTITYLIMITS' && isOrderQuantityLimitsFeatureEnabled) {\n const maxQtyLimitReachedMessage = result.errorDetails?.LocalizedMessage!;\n this.props.telemetry.debug('[quick-order] Unable to Update Cart Line from the quick order', maxQtyLimitReachedMessage);\n\n this.setState({ stateMessage: {\n messageText: maxQtyLimitReachedMessage || quickOrderAddedToCartFailureMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n } });\n } else {\n this.props.telemetry.debug('[quick-order] Unable to Update Cart Line from the quick order');\n\n this.setState({ stateMessage: {\n messageText: quickOrderAddedToCartFailureMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n } });\n }\n })\n .catch(error => {\n telemetry.warning(error);\n telemetry.debug('[quick-order] Error trying to Update Cart Line from the quick order');\n\n this.setState({ stateMessage: {\n messageText: quickOrderAddedToCartFailureMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n } });\n });\n }\n };\n\n private _getMaxQtyMessage(productInventoryInfo: IProductInventoryInformation | undefined, currentQuantity: number): string {\n const { context, resources } = this.props;\n const { quickOrderMaxQuantityLimitText } = resources;\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- existing code.\n const maxQuantityForLineItem = context.app.config.maxQuantityForCartLineItem || 10;\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- existing code.\n if (!productInventoryInfo || !productInventoryInfo.ProductAvailableQuantity.AvailableQuantity || !context.app.config.enableStockCheck) {\n return quickOrderMaxQuantityLimitText.replace(\n '{maxQuantity}',\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call -- existing code.\n maxQuantityForLineItem.toString()).replace('{curQuantity}',\n currentQuantity.toString()\n );\n }\n\n const minInventory = Math.min(maxQuantityForLineItem, productInventoryInfo.ProductAvailableQuantity.AvailableQuantity);\n\n return quickOrderMaxQuantityLimitText.replace('{maxQuantity}', minInventory.toString()).replace('{curQuantity}', currentQuantity.toString());\n }\n\n /**\n * Method to handle quantity change.\n * @param value - Quantity.\n */\n private readonly _handleQuantityChange = (value: string): void => {\n const currentValue = Number.parseInt((value), 10);\n const inputElement = this.quantityInput.current instanceof HTMLInputElement && this.quantityInput.current;\n\n this.setState(\n { quantity: currentValue },\n () => {\n debounce(\n () => {\n if (!isNaN(this.state.quantity) && !(this.state.quantity < 0) && inputElement) {\n inputElement.setAttribute('aria-valuenow', currentValue.toString());\n inputElement.setAttribute('value', currentValue.toString());\n }\n },\n 200)();\n }\n );\n };\n\n private readonly _updateDimensionValue = (productDimensionFull: ProductDimensionFull, newValueId: string | undefined): ProductDimensionValue | undefined => {\n if (newValueId && productDimensionFull.DimensionValues) {\n return productDimensionFull.DimensionValues.find(dimension => dimension.RecordId === +newValueId);\n }\n\n return undefined;\n };\n\n private readonly _getDropdownName = (dimensionType: number, resources: IProductDimensionConfigureResources): string => {\n const isGiftCard = this.state.productResponse?.IsGiftCard;\n\n switch (dimensionType) {\n case 1: // ProductDimensionType.Color\n return resources.productDimensionTypeColor;\n case 2: // ProductDimensionType.Configuration\n return resources.productDimensionTypeConfiguration;\n case 3: // ProductDimensionType.Size\n return resources.productDimensionTypeSize;\n case 4: // ProductDimensionType.Style\n return isGiftCard ? resources.productDimensionTypeAmount : resources.productDimensionTypeStyle;\n default:\n return '';\n }\n };\n\n /**\n * Method to update product dimension.\n */\n private readonly _updateDimensions = async (): Promise => {\n const {\n context: {\n actionContext,\n request: {\n apiSettings: {\n channelId\n }\n }\n }\n } = this.props;\n const { productDimensions, productResponse } = this.state;\n if (!productResponse || !productDimensions) {\n return;\n }\n\n const dimensionsToUpdate: { [id: number]: string } = { ...this.dimensions };\n this.setState({ isUpdatingDimension: true });\n\n // Step 1: Update state to indicate which dimensions are selected\n if (this.state.productDimensionErrorState.otherError) {\n const clearOtherErrorState = { ...this.state.productDimensionErrorState };\n clearOtherErrorState.otherError = undefined;\n this.setState({ productDimensionErrorState: clearOtherErrorState });\n }\n\n // Step 2: Clear any errors indicating the dimension wasn't selected\n for (const key of Object.keys(dimensionsToUpdate)) {\n if (this.state.productDimensionErrorState.configureErrors[key]) {\n const errorState = { ...this.state.productDimensionErrorState };\n errorState.configureErrors[key] = undefined;\n\n this.setState({ productDimensionErrorState: errorState });\n }\n }\n\n // Step 3, Build the actually selected dimensions, prioritizing the information in state\n // over the information in data\n const mappedDimensions = productDimensions.map(dimension => {\n return {\n DimensionTypeValue: dimension.DimensionTypeValue,\n DimensionValue: this._updateDimensionValue(dimension, dimensionsToUpdate[dimension.DimensionTypeValue]) || dimension.DimensionValue,\n ExtensionProperties: dimension.ExtensionProperties\n };\n }).filter(dimension => {\n return dimension.DimensionValue;\n });\n\n // Step 4. Use these dimensions hydrate the product. Wrap this in a promise\n // so that places like add to cart can await it\n const selectedProduct = new Promise(async (resolve, reject) => {\n const newProduct = (await getSelectedVariant(\n new SelectedVariantInput(\n productResponse.MasterProductId ? productResponse.MasterProductId : productResponse.RecordId,\n channelId,\n mappedDimensions, undefined,\n this.props.context.request\n ),\n actionContext\n ));\n if (newProduct) {\n await getDimensionsForSelectedVariant(\n new GetDimensionsForSelectedVariantInput(\n newProduct.MasterProductId ? newProduct.MasterProductId : newProduct.RecordId,\n channelId,\n mappedDimensions,\n this.props.context.request\n ),\n actionContext\n );\n }\n\n resolve(newProduct);\n });\n\n const variantProduct = await selectedProduct;\n this.setState({ productResponse: variantProduct !== null ? variantProduct : undefined });\n if (variantProduct) {\n // Step 5. Use these dimensions hydrate the inventory. Wrap this in a promise\n // so that places like add to cart can await it\n const newAvailableQuantity = await getProductAvailabilitiesForSelectedVariant(\n new ProductAvailabilitiesForSelectedVariantInput(\n variantProduct.RecordId,\n channelId\n ),\n actionContext\n );\n\n if (newAvailableQuantity && newAvailableQuantity.length > 0) {\n this.setState({ productAvailableQuantity: newAvailableQuantity[0] });\n } else {\n this.setState({ productAvailableQuantity: undefined });\n }\n }\n };\n\n /**\n * Method to update product availablity.\n */\n private readonly _updateAvailablity = async (): Promise => {\n const {\n context: {\n actionContext,\n request: {\n apiSettings: {\n channelId\n }\n }\n }\n } = this.props;\n const { productResponse } = this.state;\n if (!productResponse) {\n return;\n }\n\n const newAvailableQuantity = await getProductAvailabilitiesForSelectedVariant(\n new ProductAvailabilitiesForSelectedVariantInput(\n productResponse.RecordId,\n channelId\n ),\n actionContext\n );\n\n if (newAvailableQuantity && ArrayExtensions.hasElements(newAvailableQuantity)) {\n const productAvailable = newAvailableQuantity.find(quantity => quantity.ProductAvailableQuantity.ProductId === productResponse.RecordId);\n this.setState({ productAvailableQuantity: productAvailable });\n } else {\n this.setState({ productAvailableQuantity: undefined });\n }\n };\n\n /**\n * Method to get dimension error string.\n * @param dimensionTypeValue - Dimension value.\n * @param resources - Localized error message.\n * @param isGiftCard - Flag to check giftcard.\n * @returns Dimension error string.\n */\n private readonly _getDimensionErrorString = (dimensionTypeValue: number, resources: IQuickOrderResources, isGiftCard?: boolean): string => {\n switch (dimensionTypeValue) {\n case 1: // ProductDimensionType.Color\n return resources.quickOrderproductDimensionTypeColorErrorMessage;\n case 2: // ProductDimensionType.Configuration\n return resources.quickOrderproductDimensionTypeConfigurationErrorMessage;\n case 3: // ProductDimensionType.Size\n return resources.quickOrderproductDimensionTypeSizeErrorMessage;\n case 4: // ProductDimensionType.Style\n return isGiftCard ? resources.quickOrderproductDimensionTypeAmountErrorMessage : resources.quickOrderproductDimensionTypeStyleErrorMessage;\n default:\n return '';\n }\n };\n\n /**\n * Method to validate the cart.\n * @param productResponse - Simple product object.\n * @param quantity - Quantity.\n * @returns Flag after validating cart.\n */\n private readonly _validateCart = (productResponse: SimpleProduct, quantity: number): boolean => {\n const missingDimensions = productResponse.Dimensions?.filter(\n (dimension: ProductDimension) => !(dimension.DimensionValue?.Value)\n );\n if (missingDimensions && missingDimensions.length > 0) {\n const userMessage = this._getConfigureErrors(missingDimensions, false);\n if (this.state.productDimensionErrorState.configureErrors) {\n const errorState = { ...this.state.productDimensionErrorState };\n errorState.configureErrors = userMessage;\n\n this.setState({ productDimensionErrorState: errorState });\n return false;\n }\n }\n\n if (quantity <= 0) {\n const resources = this.props.resources;\n this.setState({ stateMessage: {\n messageText: resources.quickOrderWrongQuantityErrorMsg,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n } });\n return false;\n }\n return true;\n };\n\n /**\n * Method to get configuration error string.\n * @param result - List of Dimension values.\n * @param isGiftCard - Flag to check giftcard.\n * @returns Error object.\n */\n private _getConfigureErrors(result: ProductDimension[] | undefined, isGiftCard?: boolean): { [configureId: string]: string | undefined } {\n if (!result) {\n return {};\n }\n const dimensions: { [configureId: string]: string | undefined } = {};\n const resources = this.props.resources;\n for (const dimension of result) {\n dimensions[dimension.DimensionTypeValue] = this._getDimensionErrorString(dimension.DimensionTypeValue, resources, isGiftCard);\n }\n return dimensions;\n }\n}\n\nexport default QuickOrder;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { CartLinePriceEditor, ICartLinePriceEditorResources, PriceComponent } from '@msdyn365-commerce/components';\nimport MsDyn365, { IComponentProps, IGridSettings, IImageSettings, Image } from '@msdyn365-commerce/core';\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport { ChannelDeliveryOptionConfiguration, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { CartLine, ProductCatalog, SalesLine } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { ArrayExtensions, getFallbackImageUrl } from '@msdyn365-commerce-modules/retail-actions';\nimport { getPayloadObject, getTelemetryAttributes, IncrementalQuantity, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classNames from 'classnames';\nimport * as React from 'react';\n\n/**\n * ICartlineResourceString: Interface for specifying the\n * resource strings that the component needs.\n */\nexport interface ICartlineResourceString {\n\n /**\n * Display string for discount label\n */\n discountStringText: string;\n\n /**\n * String for size key\n */\n sizeString: string;\n\n /**\n * String for color key\n */\n colorString: string;\n\n /**\n * String associated with the configuration product dimension\n */\n configString: string;\n\n /**\n * String for style key\n */\n styleString: string;\n\n /**\n * String for amount key\n */\n amountString?: string;\n\n /**\n * Display string for quantity label\n */\n quantityDisplayString: string;\n\n /**\n * Display string for quantity label\n */\n inputQuantityAriaLabel: string;\n\n /**\n * Aria label for the decrement button in quantity component\n */\n decrementButtonAriaLabel: string;\n\n /**\n * Aria label for the increment button in quantity component\n */\n incrementButtonAriaLabel: string;\n\n /**\n * Original text screenreader\n */\n originalPriceText: string;\n\n /**\n * Current text screenreader\n */\n currentPriceText: string;\n\n /**\n * Shipping Charges Text\n */\n shippingChargesText: string;\n\n priceEditorResources?: ICartLinePriceEditorResources;\n}\n\ninterface ICartLineData {\n cartLine: CartLine | SalesLine;\n cartState?: ICartState;\n product?: SimpleProduct;\n catalogs?: ProductCatalog[];\n}\n\n/**\n * ICartLineProps: The props required to render cartLineitem.\n */\nexport interface ICartLineProps extends IComponentProps {\n\n /**\n * The flag to change the quantity component from intractable to static.\n */\n disableQuantityInteractivity?: boolean;\n\n /**\n * The primary image url.\n */\n primaryImageUrl?: string;\n\n /**\n * The product url.\n */\n productUrl?: string;\n\n /**\n * GridSettings for the product image in cartLine.\n */\n gridSettings: IGridSettings;\n\n /**\n * ImageSettings for the product image in cartLine.\n */\n imageSettings: IImageSettings;\n\n /**\n * Boolean flag to indicate if the item is out of stock.\n */\n isOutOfStock?: boolean;\n\n /**\n * Flag to make quantity section editable.\n */\n isQuantityEditable?: boolean;\n\n /**\n * Max quantity for line item.\n */\n maxQuantity?: number;\n\n /**\n * Current quantity for line item.\n */\n currentQuantity?: number;\n\n /**\n * Resource string for the component.\n */\n resources: ICartlineResourceString;\n\n /**\n * SalesLine flag.\n */\n isSalesLine?: boolean;\n\n /**\n * Error message to show in place of quantity.\n */\n errorMessage?: string;\n\n /**\n * Inventory information label.\n */\n inventoryInformationLabel?: string;\n\n /**\n * Inventory information class name.\n */\n inventoryLabelClassName?: string;\n\n /**\n * Flag to show/hide shipping charges for line items.\n */\n showShippingChargesForLineItems?: boolean;\n\n /**\n * Boolean flag to indicate if cart state status is ready.\n */\n isCartStateReady?: boolean;\n\n /**\n * Chanel Delivery Option configuration is from api.\n */\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n\n /**\n * The telemetry content.\n */\n telemetryContent?: ITelemetryContent;\n\n /**\n * The cart line index.\n */\n lineIndex?: number;\n\n /**\n * Quantity onChange callback.\n */\n quantityOnChange?(cartLine: CartLine, newQuantity: number, lineIndex?: number): boolean;\n}\n\ninterface IDimensionStrings {\n\n /**\n * String for size key.\n */\n sizeString: string;\n\n /**\n * String for color key.\n */\n colorString: string;\n\n /**\n * String associated with the configuration product dimension.\n */\n configString: string;\n\n /**\n * String for style key.\n */\n styleString: string;\n\n /**\n * String for amount key.\n */\n amountString?: string;\n}\n\n/**\n * Renders catalog label for the cart line.\n * @param props - Cart line props.\n * @returns Catalog label.\n */\nconst CatalogLabelComponent: React.FC = (props: ICartLineProps) => {\n const catalogId = props.data.cartLine.CatalogId;\n\n if (!props.context.request.user.isB2b || !catalogId || !ArrayExtensions.hasElements(props.data.catalogs)) {\n return null;\n }\n\n const catalog = props.data.catalogs.find(item => item.RecordId === catalogId);\n\n if (!catalog || !catalog.Name) {\n return null;\n }\n\n return (\n
\n {catalog.Name}\n
\n );\n};\n\nconst CartLineItemFunctions = {\n renderProductDimensions: (Product: SimpleProduct, DimensionStrings: IDimensionStrings) => {\n if (!Product || !Product.Dimensions) {\n return [];\n }\n\n return Product.Dimensions.map(productDimension => {\n\n if (productDimension.DimensionTypeValue === 1) {\n return (\n
\n \n {DimensionStrings.colorString}\n :\n \n {productDimension.DimensionValue && productDimension.DimensionValue.Value}\n \n \n
\n );\n }\n\n if (productDimension.DimensionTypeValue === 2) {\n return (\n
\n \n {DimensionStrings.configString}\n :\n \n {productDimension.DimensionValue && productDimension.DimensionValue.Value}\n \n \n
\n );\n }\n\n if (productDimension.DimensionTypeValue === 3) {\n return (\n
\n \n {DimensionStrings.sizeString}\n :\n \n {productDimension.DimensionValue && productDimension.DimensionValue.Value}\n \n \n
\n );\n }\n\n if (productDimension.DimensionTypeValue === 4) {\n return (\n
\n \n {Product.IsGiftCard ? DimensionStrings.amountString : DimensionStrings.styleString}\n :\n \n {productDimension.DimensionValue && productDimension.DimensionValue.Value}\n \n \n
\n );\n }\n return null;\n });\n },\n\n renderDiscountLines: (props: ICartLineProps) => {\n\n if (!props.data.cartLine.DiscountLines || props.data.cartLine.DiscountLines.length === 0) {\n return null;\n }\n\n return props.data.cartLine.DiscountLines.map((discountLine, index) => {\n return (\n
\n \n {discountLine.OfferName ? discountLine.OfferName : ''}\n :\n {` ${props.resources.discountStringText || 'Discount'} `}\n \n \n \n \n \n {` (${discountLine.EffectivePercentage !== undefined ? discountLine.EffectivePercentage : ''}%)`}\n \n
\n );\n });\n },\n renderInventoryLabel: (props: ICartLineProps) => {\n if (!props.inventoryInformationLabel) {\n return null;\n }\n const inventoryCssName = props.inventoryLabelClassName ? `msc-cart-line__product-inventory-label ${props.inventoryLabelClassName}` : 'msc-cart-line__product-inventory-label';\n return (\n \n {props.inventoryInformationLabel}\n \n );\n },\n\n /**\n * Gets the react node for product unit of measure display.\n * @param props - Icartline props.\n * @returns The node representing markup for unit of measure component.\n */\n renderUnitOfMeasure: (props: ICartLineProps) => {\n\n if (props.data.cartLine.IsInvoiceLine) {\n return null;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Do not need type check for appsettings\n if (!props.context.app.config.unitOfMeasureDisplayType || props.context.app.config.unitOfMeasureDisplayType === 'none') {\n return undefined;\n }\n\n const product = props.data.product;\n if (!product || !product.DefaultUnitOfMeasure) {\n return undefined;\n }\n\n return (\n
\n \n {product.DefaultUnitOfMeasure}\n \n
\n );\n },\n renderShippingLabel: (props: ICartLineProps) => {\n const pickupDeliveryModeCode = props.context.request.channel?.PickupDeliveryModeCode;\n const channelDeliveryOptionConfig = props.channelDeliveryOptionConfig;\n const cartline = props.data.cartLine;\n let hasShippingMethod = false;\n if (channelDeliveryOptionConfig !== undefined) {\n hasShippingMethod = !!(cartline.DeliveryMode &&\n channelDeliveryOptionConfig.PickupDeliveryModeCodes?.some(deliveryMode => deliveryMode !== cartline.DeliveryMode));\n } else {\n hasShippingMethod = !!(cartline.DeliveryMode && cartline.DeliveryMode !== pickupDeliveryModeCode);\n }\n if (!hasShippingMethod) {\n return undefined;\n }\n\n const shippingChargeLines = (cartline.ChargeLines || []).filter(chargeLine => chargeLine.IsShipping);\n\n if (shippingChargeLines.length === 0) {\n return undefined;\n }\n\n const freightFee = shippingChargeLines.reduce((chargeTotal, chargeLine) => {\n return chargeTotal + (chargeLine.CalculatedAmount || 0);\n }, 0);\n\n const priceComponent = (\n \n );\n return (\n <>\n \n \n {priceComponent}\n \n \n );\n },\n renderOtherCharges: (props: ICartLineProps) => {\n const cartline = props.data.cartLine;\n const otherCharges = cartline.ChargeLines?.filter((chargeline) => !chargeline.IsShipping);\n\n return otherCharges && otherCharges.map((otherCharge, key) => {\n return otherCharge && otherCharge.CalculatedAmount ? (\n
\n \n \n \n \n
\n ) : '';\n }) || undefined;\n }\n};\n\nconst CartLine: React.FC = (props: ICartLineProps) => {\n const { isSalesLine, productUrl, resources } = props;\n const { product, cartLine } = props.data;\n\n const destructDimensionStrings = {\n sizeString: resources.sizeString,\n colorString: resources.colorString,\n styleString: resources.styleString,\n configString: resources.configString,\n amountString: resources.amountString\n };\n\n const fallbackImageUrl = product && getFallbackImageUrl(product.ItemId, props.context.actionContext.requestContext.apiSettings);\n const productDimensions = product && CartLineItemFunctions.renderProductDimensions(product, destructDimensionStrings);\n const imageSettings = props.imageSettings;\n if (imageSettings) {\n imageSettings.cropFocalRegion = true;\n }\n const renderDisountLines = CartLineItemFunctions.renderDiscountLines(props);\n const renderInventoryLabel = CartLineItemFunctions.renderInventoryLabel(props);\n const renderUnitOfMeasure = CartLineItemFunctions.renderUnitOfMeasure(props);\n const renderShippingLabel = CartLineItemFunctions.renderShippingLabel(props);\n const renderOtherCharges = CartLineItemFunctions.renderOtherCharges(props);\n const payLoad = getPayloadObject('click', props.telemetryContent!, '', product?.RecordId.toString());\n const productAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n const productName = product?.Name || cartLine.Description;\n const imgeClassName = props.data.cartLine.IsInvoiceLine ? 'msc-cart-line__invoice-image' : 'msc-cart-line__product-image';\n\n const onChange = (newValue: number): boolean => {\n if (props.quantityOnChange) {\n return props.quantityOnChange(props.data.cartLine, newValue, props.lineIndex);\n }\n return true;\n };\n\n const _generateErrorMessage = (): JSX.Element | null => {\n if (props.errorMessage) {\n return (\n
\n \n \n {props.errorMessage}\n \n
\n );\n }\n\n return null;\n };\n\n const _generateQuantityandPrice = (): JSX.Element[] | null => {\n const nodes = [];\n if (props.isOutOfStock) {\n return null;\n }\n\n // No quantity selector for invoice line\n if (!props.data.cartLine.IsInvoiceLine) {\n if (props.data.product && props.isQuantityEditable) {\n nodes.push(\n
\n
\n {resources.quantityDisplayString}\n
\n \n
\n );\n } else {\n nodes.push(\n
\n \n \n {props.data.cartLine.Quantity}\n \n
\n );\n }\n }\n\n nodes.push(\n
\n \n {\n props.data.cartLine.DiscountAmount && props.data.cartLine.DiscountAmount > 0 &&\n <>\n \n {` ${props.resources.discountStringText || 'Discount'} `}\n \n \n ||\n null\n }\n
\n );\n\n return nodes;\n };\n\n return (\n <>\n
\n
\n \n
\n
\n
\n \n {\n MsDyn365.isBrowser ? \n {productName}\n : null\n }\n {ArrayExtensions.hasElements(productDimensions) ?
\n {productDimensions}\n
: ''}\n {renderUnitOfMeasure}\n
\n \n
\n {renderDisountLines}\n {renderInventoryLabel}\n {props.showShippingChargesForLineItems &&
\n {renderShippingLabel}\n
}\n {renderOtherCharges}\n
\n {\n _generateQuantityandPrice()\n }\n {\n props.data.cartLine.IsInvoiceLine && props.data.cartState && props.resources.priceEditorResources && \n }\n
\n
\n { _generateErrorMessage() }\n \n );\n};\n\nexport default CartLine;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport { getCartState, getCheckoutState } from '@msdyn365-commerce/global-state';\n\nasync function emptyActiveCart(ctx: IActionContext): Promise {\n let cartState;\n let checkoutState;\n const lineItemIdsToRemove = [];\n\n try {\n cartState = await getCartState(ctx);\n checkoutState = await getCheckoutState(ctx);\n } catch (error) {\n throw error;\n }\n\n if (!cartState || !cartState.cart) {\n throw new Error('Fail to fetch active cart');\n }\n\n if (!checkoutState || !checkoutState.checkoutCart) {\n throw new Error('Fail to fetch checkoutCart cart');\n }\n\n const activeCart = cartState.cart;\n const checkoutCart = checkoutState.checkoutCart.cart;\n\n for (const activeCartLine of activeCart.CartLines || []) {\n for (const checkoutCartLine of checkoutCart.CartLines || []) {\n if (activeCartLine.LineId && activeCartLine.LineId === checkoutCartLine.LineId) {\n lineItemIdsToRemove.push(activeCartLine.LineId);\n }\n }\n }\n\n try {\n await cartState.removeCartLines({ cartLineIds: lineItemIdsToRemove });\n await cartState.removeAllPromoCodes({});\n await checkoutState.removeCheckoutCartId({});\n } catch (error) {\n throw error;\n }\n}\n\nexport default emptyActiveCart;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nexport * from './alert';\nexport * from './get-line-items';\nexport * from './get-order-summary';\nexport * from './guided-card';\nexport * from './guided-form';\nexport * from './place-order-button';\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { AddOrderTemplateToCartComponent, ILinesAddedToCartDialogResources } from '@msdyn365-commerce/components';\nimport { getUrlSync, ICoreContext, IImageSettings, Image, ITelemetry } from '@msdyn365-commerce/core';\nimport { ProductList } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { getFallbackImageUrl, getProductUrlSync, OrderTemplate, OrderTemplateLine } from '@msdyn365-commerce-modules/retail-actions';\nimport { Alert, Button, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IOrderTemplateActionMessageState } from '../order-template-list';\n\nexport interface ISingleOrderTemplateProps extends ProductList {\n orderTemplateState: IOrderTemplateActionMessageState;\n name?: string;\n orderTemplate: OrderTemplate;\n context: ICoreContext;\n imageSettings?: IImageSettings;\n enableImageProductLink?: boolean;\n removeFromOrderTemplateListText: string;\n addToBagText: string;\n index: number;\n itemKey: string;\n telemetry: ITelemetry;\n moduleId: string;\n moduleTypeName: string;\n handlers: {\n onRemoveOrderTemplate(id: string): void | undefined;\n onDismiss(): void;\n };\n resources: {\n closeWindowButtonText: string;\n addToCartFailureMessage: string;\n addToCartSuccessMessage: string;\n addToCartProcessMessage: string;\n linesAddedToCartDialogResources: ILinesAddedToCartDialogResources;\n };\n telemetryContent?: ITelemetryContent;\n}\n\nexport interface ISingleOrderTemplateViewProps {\n key: string;\n orderTemplateImage: React.ReactNode;\n addToCartButton?: React.ReactNode;\n removeButton?: React.ReactNode;\n orderTemplateStatusMessage?: React.ReactNode;\n orderTemplateName?: React.ReactNode;\n orderTemplateAriaLabel?: string;\n orderTemplateHeaderDivider?: React.ReactNode;\n}\n\nconst _removeItemFromOrderTemplateList = (props: ISingleOrderTemplateProps): void => {\n const { onRemoveOrderTemplate } = props.handlers;\n const { itemKey } = props;\n\n onRemoveOrderTemplate && itemKey && onRemoveOrderTemplate(itemKey);\n};\n\nconst OrderTemplateActions = {\n removeOrderTemplate: _removeItemFromOrderTemplateList\n};\n\n/**\n * Remove order template action.\n * @param input -Single order template props.\n * @returns Set remove order template.\n */\nconst removeOrderTemplateActionHandler = (input: ISingleOrderTemplateProps) => () => {\n OrderTemplateActions.removeOrderTemplate(input);\n};\n\nexport const OrderTemplateRender = (input: ISingleOrderTemplateProps): ISingleOrderTemplateViewProps | null => {\n const { Id, orderTemplate, removeFromOrderTemplateListText, orderTemplateState, handlers, name, imageSettings, context, telemetryContent, enableImageProductLink } = input;\n\n if (!Id) {\n return null;\n }\n\n const _getOrderTemplatePageUrl = (): string => {\n const url = getUrlSync('ordertemplate', context.actionContext) ?? '';\n const separator = url.includes('?') ? '&' : '?';\n if (Id) {\n return `${url}${separator}id=${Id}`;\n }\n return '';\n\n };\n\n const { onDismiss } = handlers;\n\n return {\n key: `${Id}-template`,\n orderTemplateImage: _renderOrderTemplateImages(context, orderTemplate.orderTemplateLines, imageSettings, enableImageProductLink),\n orderTemplateAriaLabel: _renderAriaLabel(input),\n orderTemplateName:\n (\n
\n \n
\n {orderTemplate.totalLines}\n {' '}\n line items\n
\n
\n
\n ),\n addToCartButton:\n (\n
\n \n
\n ),\n removeButton:\n (\n \n ),\n orderTemplateStatusMessage: orderTemplateState && orderTemplateState.isOpen && orderTemplateState.userMessage &&\n (\n
\n \n \n {orderTemplateState.userMessage}\n \n \n
\n )\n\n };\n\n};\n\n/**\n * On image click handler.\n * @param productUrl -Product url value.\n * @returns Assign window location.\n */\nconst onClickHandler = (productUrl: string) => () => {\n window.location.assign(productUrl);\n};\n\nconst _renderOrderTemplateImages = (context: ICoreContext, orderTemplateLines?: OrderTemplateLine[],\n imageSettings?: IImageSettings, enableImageProductLink?: boolean): JSX.Element | null => {\n const defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=140&h=140&m=6', w: 0, h: 0 },\n lg: { q: 'w=140&h=140&m=6', w: 0, h: 0 },\n xl: { q: 'w=140&h=140&m=6', w: 0, h: 0 }\n },\n lazyload: true\n };\n\n if (orderTemplateLines) {\n const count = orderTemplateLines.length < 4 ? orderTemplateLines.length : 4;\n\n return (\n
\n {orderTemplateLines?.slice(0, count).map(line => {\n const productUrl = line.fullProduct ? getProductUrlSync(line.fullProduct.ProductDetails, context.actionContext, undefined) : '';\n\n return ();\n })}\n
\n );\n }\n return (\n
\n );\n\n};\n\nconst _renderAriaLabel = (props: ISingleOrderTemplateProps): string => {\n const { name } = props;\n return (`${name}`);\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { orderTemplateListStatus } from '../order-template-list';\n\nexport interface IOrderTemplateListStatusMessageProps {\n className?: string;\n errorType: orderTemplateListStatus;\n text?: string;\n}\n\nexport const OrderTemplateListStatusMessage: React.FC = ({ className, errorType, text }) => {\n switch (errorType) {\n case 'EMPTY':\n return (\n

\n { text }\n

\n );\n case 'FAILED':\n return (\n

\n { text }\n

\n );\n case 'LOADING':\n default:\n return (\n

\n { text }\n

\n );\n }\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport { getCheckoutState } from '@msdyn365-commerce/global-state';\nimport { checkoutAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\nimport {\n getTenderTypesAsync, resolveCardTypesAsync\n} from '@msdyn365-commerce/retail-proxy/dist/DataActions/StoreOperationsDataActions.g';\nimport {\n Address, CardPaymentAcceptResult, CardType, CartTenderLine, RetailOperation, SalesOrder, TenderType, TokenizedPaymentCard\n} from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\n\nexport const OPERATIONS = {\n PayCard: 201,\n PayGiftCertificate: 214,\n PayLoyalty: 207,\n PayCustomerAccount: 202\n};\n\nconst getCardTypeId = async (ctx: IActionContext, cardPrefix: string = ''): Promise => {\n try {\n const response = await resolveCardTypesAsync({ callerContext: ctx }, cardPrefix, CardType.Unknown);\n if (response && response.length > 0) {\n return response[0].TypeId;\n }\n } catch (error) {\n ctx.telemetry.error('Call to resolveCardTypesAsync failed.', error);\n }\n return undefined;\n};\n\nconst findTenderIdTypeByOperationId = (tenderTypes: TenderType[], operationId: RetailOperation): string | undefined => {\n const matchedTenderType = tenderTypes.find(tenderType => tenderType.OperationId === operationId);\n if (matchedTenderType) {\n return matchedTenderType.TenderTypeId;\n }\n return;\n};\n\nconst roundNumber = (value: number) => Number(value.toFixed(2));\n\nasync function getLoyaltyTenderLine(\n ctx: IActionContext,\n LoyaltyCardId: string,\n Amount: number = 0,\n Currency: string = 'USD'\n): Promise {\n const tenderTypes = await getTenderTypesAsync({ callerContext: ctx, queryResultSettings: {} }).catch(error => {\n throw error;\n });\n\n if (!tenderTypes) {\n throw new Error('Fail to get gift card tender line');\n }\n\n const TenderTypeId = findTenderIdTypeByOperationId(tenderTypes, OPERATIONS.PayLoyalty);\n return {\n // @ts-expect-error\n '@odata.type': '#Microsoft.Dynamics.Commerce.Runtime.DataModel.CartTenderLine',\n\n 'Amount@odata.type': '#Decimal',\n Currency,\n TenderTypeId,\n Amount,\n LoyaltyCardId\n };\n}\n\nasync function getGiftCardTenderLine(\n ctx: IActionContext,\n GiftCardId: string = '',\n Amount: number = 0,\n Currency: string = 'USD',\n tenderTypeId?: string,\n giftCardPin?: string,\n giftCardExpirationYear?: number,\n giftCardExpirationMonth?: number\n): Promise {\n let TenderTypeId = tenderTypeId;\n\n if (!TenderTypeId) {\n const tenderTypes = await getTenderTypesAsync({ callerContext: ctx, queryResultSettings: {} }).catch(error => {\n throw error;\n });\n if (!tenderTypes) {\n throw new Error('Fail to get gift card tender line');\n }\n TenderTypeId = findTenderIdTypeByOperationId(tenderTypes, OPERATIONS.PayGiftCertificate);\n }\n\n const GiftCardPin = giftCardPin;\n const GiftCardExpirationYear = giftCardExpirationYear;\n const GiftCardExpirationMonth = giftCardExpirationMonth;\n return {\n // @ts-expect-error\n '@odata.type': '#Microsoft.Dynamics.Commerce.Runtime.DataModel.CartTenderLine',\n 'Amount@odata.type': '#Decimal',\n Currency,\n TenderTypeId,\n Amount,\n GiftCardId,\n GiftCardPin,\n GiftCardExpirationYear,\n GiftCardExpirationMonth\n };\n}\n\nasync function getCreditCardTenderLine(\n ctx: IActionContext,\n tokenizedPaymentCard: TokenizedPaymentCard,\n cardPrefix: string = '',\n Amount: number = 0,\n Currency: string = 'USD',\n billingAddress?: Address\n): Promise {\n const tenderTypes = await getTenderTypesAsync({ callerContext: ctx, queryResultSettings: {} }).catch(error => {\n throw error;\n });\n\n let cartTypeId = tokenizedPaymentCard.CardTypeId;\n\n if (!cartTypeId) {\n cartTypeId = await getCardTypeId(ctx, cardPrefix);\n }\n\n if (!tenderTypes) {\n throw new Error('Fail to get card tender type');\n }\n\n if (!cartTypeId) {\n throw new Error('Fail to get card type id');\n }\n\n const TenderTypeId = tokenizedPaymentCard.TenderType ?? findTenderIdTypeByOperationId(tenderTypes, OPERATIONS.PayCard);\n const cardTenderLine: CartTenderLine = {\n // @ts-expect-error\n '@odata.type': '#Microsoft.Dynamics.Commerce.Runtime.DataModel.CartTenderLine',\n 'Amount@odata.type': '#Decimal',\n Currency,\n Amount,\n TenderTypeId,\n CardTypeId: cartTypeId\n };\n cardTenderLine.TokenizedPaymentCard = {\n ...tokenizedPaymentCard,\n CardTypeId: cartTypeId,\n\n // @ts-expect-error\n '@odata.type': '#Microsoft.Dynamics.Commerce.Runtime.DataModel.TokenizedPaymentCard',\n House: tokenizedPaymentCard.House || 'N/A',\n ...(tokenizedPaymentCard.CardTokenInfo && {\n CardTokenInfo: {\n ...tokenizedPaymentCard.CardTokenInfo,\n '@odata.type': '#Microsoft.Dynamics.Commerce.Runtime.DataModel.CardTokenInfo'\n }\n }),\n ...(billingAddress && {\n Phone: billingAddress.Phone,\n Country: billingAddress.ThreeLetterISORegionName,\n Address1: billingAddress.Street,\n City: billingAddress.City,\n State: billingAddress.State,\n Zip: billingAddress.ZipCode\n })\n };\n\n return cardTenderLine;\n}\n\n/**\n * Get credit card tender line.\n * @param context - Action context.\n * @param amount - Due amount for credit card.\n * @param currency - Currency.\n * @param cardPaymentAcceptResult - CardPaymentAcceptResult.\n * @returns - The credit card tender line.\n */\nasync function getCreditCardTenderLineForSinglePaymentAuth(\n context: IActionContext,\n amount: number = 0,\n currency: string = 'USD',\n cardPaymentAcceptResult?: CardPaymentAcceptResult\n): Promise {\n const tenderTypes = await getTenderTypesAsync({ callerContext: context, queryResultSettings: {} }).catch(error => {\n throw error;\n });\n\n const tenderTypeId = findTenderIdTypeByOperationId(tenderTypes, OPERATIONS.PayCard);\n\n const cardTenderLine: CartTenderLine = {\n // @ts-expect-error -- existing data.\n '@odata.type': '#Microsoft.Dynamics.Commerce.Runtime.DataModel.CartTenderLine',\n 'Amount@odata.type': '#Decimal',\n Currency: currency,\n Amount: amount,\n TenderTypeId: tenderTypeId,\n CardPaymentAcceptResult: cardPaymentAcceptResult\n };\n\n return cardTenderLine;\n}\n\nasync function createCustomerAccountTenderLine(\n ctx: IActionContext,\n Amount: number,\n Currency: string = 'USD'\n): Promise {\n const CustomerId = null;\n if (!ctx.requestContext.user.isAuthenticated) {\n ctx.telemetry.error('A customer id is required to pay with customer account');\n }\n\n const tenderTypes = await getTenderTypesAsync({ callerContext: ctx, queryResultSettings: {} }).catch(error => {\n throw error;\n });\n\n if (!tenderTypes) {\n ctx.telemetry.error('No tender types found for this channel');\n }\n\n const TenderTypeId = findTenderIdTypeByOperationId(tenderTypes, OPERATIONS.PayCustomerAccount);\n if (!TenderTypeId) {\n ctx.telemetry.error('No customer account tender type');\n }\n return {\n '@odata.type': '#Microsoft.Dynamics.Commerce.Runtime.DataModel.CartTenderLine',\n 'Amount@odata.type': '#Decimal',\n Currency,\n TenderTypeId,\n Amount,\n\n // @ts-expect-error\n CustomerId\n };\n}\n\nexport default async (ctx: IActionContext, updatedCartVersion?: number, isPaymentVerificationRedirection?: boolean): Promise => {\n const checkoutState = await getCheckoutState(ctx).catch(error => {\n throw error;\n });\n\n const cartState = checkoutState.checkoutCart;\n\n const channelConfiguration = ctx.requestContext.channel;\n\n if (!cartState || Object.keys(cartState).length === 0 || !channelConfiguration) {\n throw new Error('Fail to placeOrder');\n }\n\n const {\n giftCardExtends,\n tokenizedPaymentCard,\n cardPrefix,\n guestCheckoutEmail,\n billingAddress,\n loyaltyAmount,\n cardPaymentAcceptResult,\n shouldEnableSinglePaymentAuthorizationCheckout\n } = checkoutState;\n const { Currency } = channelConfiguration;\n\n let amountDue = cartState.cart.AmountDue || 0;\n let cartTenderLines;\n const getTenderLinePromises = [];\n const loyaltyCardNumber = cartState.cart.LoyaltyCardId;\n\n // Pay by loyalty first\n if (loyaltyAmount && loyaltyCardNumber) {\n const chargedAmount = roundNumber(Math.min(loyaltyAmount, amountDue));\n const loyaltyTenderLinePromise = getLoyaltyTenderLine(ctx, loyaltyCardNumber, chargedAmount, Currency);\n getTenderLinePromises.push(loyaltyTenderLinePromise);\n amountDue = roundNumber(amountDue - chargedAmount);\n }\n\n // Then by gift card\n if (giftCardExtends && giftCardExtends.length > 0) {\n giftCardExtends.some(giftCardExtend => {\n if (giftCardExtend.Balance && amountDue > 0) {\n const chargedAmount = roundNumber(Math.min(giftCardExtend.Balance, amountDue));\n const tenderTypeId = giftCardExtend.TenderTypeId;\n const giftCardPin = giftCardExtend.Pin;\n const giftCardExpirationYear = giftCardExtend.ExpirationDate ? Number.parseInt(giftCardExtend.ExpirationDate?.split('/')[1], 10) : undefined;\n const giftCardExpirationMonth = giftCardExtend.ExpirationDate ? Number.parseInt(giftCardExtend.ExpirationDate?.split('/')[0], 10) : undefined;\n const creditCardTenderLinePromise = getGiftCardTenderLine(ctx, giftCardExtend.Id, chargedAmount, Currency, tenderTypeId, giftCardPin, giftCardExpirationYear, giftCardExpirationMonth);\n getTenderLinePromises.push(creditCardTenderLinePromise);\n amountDue = roundNumber(amountDue - chargedAmount);\n }\n return amountDue === 0;\n });\n }\n\n // Then by customer account\n if (checkoutState.customerAccountAmount > 0) {\n const chargedAmount = roundNumber(Math.min(checkoutState.customerAccountAmount, amountDue));\n const customerAccountTenderLinePromise = createCustomerAccountTenderLine(ctx, chargedAmount, Currency);\n getTenderLinePromises.push(customerAccountTenderLinePromise);\n amountDue = roundNumber(amountDue - chargedAmount);\n }\n\n // Pay the rest by credit card\n if (amountDue > 0) {\n let creditCardTenderLinePromise: Promise;\n\n if (shouldEnableSinglePaymentAuthorizationCheckout && !checkoutState.isExpressCheckoutApplied) {\n creditCardTenderLinePromise = getCreditCardTenderLineForSinglePaymentAuth(\n ctx,\n amountDue,\n Currency,\n cardPaymentAcceptResult\n );\n } else {\n if (!tokenizedPaymentCard) {\n throw new Error('Fail to placeOrder: no token found');\n }\n creditCardTenderLinePromise = getCreditCardTenderLine(\n ctx,\n tokenizedPaymentCard,\n cardPrefix,\n amountDue,\n Currency,\n billingAddress\n );\n }\n\n getTenderLinePromises.push(creditCardTenderLinePromise);\n }\n\n if (getTenderLinePromises.length > 0) {\n // When payment methods is required\n cartTenderLines = await Promise.all(getTenderLinePromises).catch(error => {\n throw error;\n });\n\n if (!cartTenderLines || cartTenderLines.length === 0) {\n throw new Error('Fail to placeOrder: fail to get cart tender lines');\n }\n }\n\n const cartVersion = updatedCartVersion || cartState.cart.Version;\n\n // Proceed checkout\n const salesOrder = await checkoutAsync(\n { callerContext: ctx, bypassCache: 'get' },\n cartState.cart.Id,\n guestCheckoutEmail,\n undefined,\n undefined,\n cartTenderLines || null,\n cartVersion\n ).catch(async error => {\n if (checkoutState.shouldEnableSinglePaymentAuthorizationCheckout) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- unknown type.\n if (error.data?.AdditionalContext) {\n await checkoutState.updateShouldCollapsePaymentSection({ newShouldCollapsePaymentSection: true });\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- unknown type.\n await checkoutState.updateRedirectAdditionalContext({ newRedirectAdditionalContext: error?.data?.AdditionalContext as string });\n } else {\n await checkoutState.updateIsCheckoutCallFailed({ newIsCheckoutCallFailed: true });\n\n if (isPaymentVerificationRedirection) {\n await checkoutState.checkoutCart.refreshCart({});\n await checkoutState.updateShouldCollapsePaymentSection({ newShouldCollapsePaymentSection: false });\n }\n }\n }\n\n throw error;\n });\n\n if (!salesOrder) {\n throw new Error('Fail to placeOrder: fail to checkout');\n }\n\n return salesOrder;\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport * as React from 'react';\n\ninterface ITitle {\n className: string;\n text: string;\n}\n\nexport const Title: React.FC = ({ text, className }) => (\n {' '}\n {text}\n {' '}\n);\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport {\n IItemAddedToCartDialogData, IItemAddedToCartDialogResources, ILinesAddedToCartDialogResources, IOrderTemplateNameDialogResources, ItemAddedToCartDialog\n} from '@msdyn365-commerce/components';\nimport MsDyn365, { AsyncResult, getUrlSync, IRequestContext } from '@msdyn365-commerce/core';\nimport { ICartActionResult } from '@msdyn365-commerce/global-state';\nimport { ProductList, ProductListLine } from '@msdyn365-commerce/retail-proxy';\nimport {\n deleteAsync,\n removeProductListLinesAsync,\n updateProductListLinesAsync\n} from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductListsDataActions.g';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport {\n getPriceForSelectedVariant, getProductUrlSync, ObjectExtensions,\n OrderTemplate, OrderTemplateLine, PriceForSelectedVariantInput\n} from '@msdyn365-commerce-modules/retail-actions';\nimport { Alert, getTelemetryObject, Heading, IModuleProps, INodeProps, ITelemetryContent, UncontrolledPagination } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport debounce from 'lodash/debounce';\nimport { action, computed, observable } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport {\n IOrderTemplateActionsProps, IOrderTemplateActionsViewProps, IOrderTemplateLineProps, IOrderTemplateLineViewProps, IOrderTemplateTableHeadingProps,\n OrderTemplateActionsView, OrderTemplateLinesStatusMessage, OrderTemplateLineView, OrderTemplateMobileLineView, OrderTemplateTableHeading\n} from '../..';\nimport { ActiveOrderTemplateLinesInput } from './actions/get-order-template';\nimport { OrderTemplateBulkActions } from './components/bulk-actions';\nimport { IOrderTemplateData } from './order-template.data';\nimport { IOrderTemplateProps, IOrderTemplateResources } from './order-template.props.autogenerated';\n\nexport interface IOrderTemplateLineActionMessageState {\n itemKey: string;\n userMessage: string;\n statusCssString: string;\n messageGlyph: string;\n isOpen: boolean;\n isItemAddedToOrderTemplateOpen: boolean;\n isConfirmAddSelectionToBagModalOpen: boolean;\n itemAddedToCartDialogData?: IItemAddedToCartDialogData;\n productSelection: IOrderTemplateLineViewModel[];\n isDetailsDisplayed: boolean;\n detailedProductView?: IOrderTemplateLineViewProps;\n isQuantityDisabledForUpdate?: boolean;\n}\n\nexport type orderTemplateLinesStatus = 'LOADING' | 'SUCCESS' | 'FAILED' | 'EMPTY';\ntype GridSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\nexport interface IOrderTemplateViewProps extends IOrderTemplateProps {\n OrderTemplateLines: IModuleProps;\n callbacks?: IOrderTemplateLinesCallbacks;\n status?: orderTemplateLinesStatus;\n statusMessage?: React.ReactNode;\n heading?: React.ReactNode;\n OrderTemplateActions?: INodeProps;\n ProductsTable?: INodeProps;\n ProductsTableRow?: INodeProps;\n ProductsTableHeading?: React.ReactNode;\n ProductDetails?: INodeProps;\n orderLines?: IOrderTemplateLineViewProps[];\n productListLines?: ProductListLine[];\n productsStatusMessage?: React.ReactNode;\n orderActions?: IOrderTemplateActionsViewProps | null;\n resources: IOrderTemplateResources;\n pagination?: React.ReactNode;\n itemAddedToCartDialog?: React.ReactNode;\n bulkOrderLineActions?: React.ReactNode;\n isDetailsDisplayed?: boolean;\n detailedProduct?: IOrderTemplateLineProps;\n detailedProductView?: IOrderTemplateLineViewProps;\n productQuantityView?: React.ReactNode;\n addButton?: React.ReactNode;\n isMobile?: boolean;\n toggleDetailsDisplayed?(props: IOrderTemplateLineProps | undefined): void;\n}\n\nexport interface IOrderTemplateLinesCallbacks {\n updateQuantity(itemKey: string, quantity: number): void;\n}\n\nexport interface IOrderTemplateLineViewModel extends OrderTemplateLine {\n isChecked: boolean;\n productQuantityView: React.ReactNode;\n}\n\n/**\n *\n * OrderTemplateLines component.\n * @extends {React.PureComponent, IOrderTemplateLineActionMessageState>}\n */\n@observer\nclass OrderTemplateLines extends React.Component, IOrderTemplateLineActionMessageState> {\n private readonly className: string;\n\n private readonly telemetryContent?: ITelemetryContent;\n\n @observable\n private _viewport: GridSize;\n\n @computed get isMobile(): boolean {\n return (this._viewport === 'xs' || this._viewport === 'sm');\n }\n\n constructor(props: IOrderTemplateProps, state: IOrderTemplateLineActionMessageState) {\n super(props);\n this.className = 'ms-order-template';\n this._viewport = props.context.request && props.context.request.device && props.context.request.device.Type === 'Mobile' ? 'xs' : 'lg';\n this._updateViewport = this._updateViewport.bind(this);\n\n this.state = {\n itemKey: '',\n userMessage: '',\n statusCssString: 'success',\n messageGlyph: 'fas fa-check',\n isOpen: false,\n isItemAddedToOrderTemplateOpen: false,\n isConfirmAddSelectionToBagModalOpen: false,\n productSelection: [],\n isDetailsDisplayed: false,\n isQuantityDisabledForUpdate: false\n };\n this.telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!, this.props.friendlyName, this.props.telemetry);\n this._updateViewport();\n\n if (MsDyn365.isBrowser && !this.props.context.request.user.isAuthenticated) {\n window.location.assign(this.props.context.request.user.signInUrl || '/');\n }\n }\n\n @action\n public async componentDidMount(): Promise {\n this.setState({});\n const orderTemplate = await this.props.data.orderTemplate;\n this.props.config.heading!.text = orderTemplate?.productList.Name || '';\n this.setState({\n productSelection: orderTemplate?.orderTemplateLines as IOrderTemplateLineViewModel[]\n });\n\n if (MsDyn365.isBrowser) {\n window.addEventListener('resize', this._updateViewport);\n this._updateViewport();\n }\n }\n\n public componentWillUnmount(): void {\n if (MsDyn365.isBrowser) {\n window.removeEventListener('resize', this._updateViewport);\n }\n }\n\n public shouldComponentUpdate(nextProps: IOrderTemplateProps,\n nextState: IOrderTemplateLineActionMessageState): boolean {\n if (this.state === nextState && this.props === nextProps) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element | null {\n const { heading, className } = this.props.config;\n const { emptyOrderTemplateLinesText, errorGettingOrderTemplateLines } = this.props.resources;\n const { orderTemplate, cart } = this.props.data;\n\n if (cart.status === 'LOADING' || ObjectExtensions.isNullOrUndefined(orderTemplate) || orderTemplate.status === 'LOADING') {\n const errorProps: IOrderTemplateViewProps = {\n ...(this.props as IOrderTemplateProps),\n OrderTemplateLines: {\n moduleProps: this.props,\n className: classnames(this.className, className)\n },\n status: 'LOADING',\n statusMessage: ,\n heading: heading && ,\n resources: this.props.resources\n };\n return this.props.renderView(errorProps);\n }\n\n if (cart.status === 'FAILED' || orderTemplate.status === 'FAILED') {\n const errorProps: IOrderTemplateViewProps = {\n ...(this.props as IOrderTemplateProps),\n OrderTemplateLines: {\n moduleProps: this.props,\n className: classnames(`${this.className}`, className)\n },\n status: 'FAILED',\n statusMessage: ,\n heading: heading && ,\n resources: this.props.resources\n };\n\n return this.props.renderView(errorProps);\n }\n\n const orderTemplateResult = orderTemplate && orderTemplate.result;\n const orderTemplateLines = orderTemplateResult && orderTemplateResult.orderTemplateLines;\n\n if (!orderTemplateResult || !orderTemplateLines || orderTemplateLines.length === 0) {\n if (orderTemplateResult && !this._isFirstPage() && MsDyn365.isBrowser) {\n window.location.href = this._getOrderTemplatePageUrl();\n return null;\n }\n\n const emptyViewProps: IOrderTemplateViewProps = {\n ...(this.props as IOrderTemplateProps),\n OrderTemplateLines: {\n moduleProps: this.props,\n className: classnames(`${this.className}`, className)\n },\n status: 'EMPTY',\n statusMessage: ,\n heading: heading && ,\n resources: this.props.resources\n };\n\n return this.props.renderView(emptyViewProps);\n }\n\n const viewProps: IOrderTemplateViewProps = {\n ...(this.props as IOrderTemplateProps),\n OrderTemplateLines: {\n moduleProps: this.props,\n className: classnames(`${this.className}`, className)\n },\n status: 'SUCCESS',\n productsStatusMessage: this.state.isOpen && (\n
\n \n \n {this.state.userMessage}\n \n \n
\n ),\n heading: heading && ,\n OrderTemplateActions: {\n className: `${this.className}-action-bar`,\n tag: 'div'\n },\n ProductsTable: {\n className: `${this.className}__table`,\n tag: 'table',\n role: 'grid'\n },\n ProductsTableRow: {\n className: `${this.className}-table-line`,\n tag: 'tr'\n },\n ProductsTableHeading: this._renderProductListHeader(this.props.resources),\n ProductDetails: {\n className: `${this.className}-table-line__link`,\n tag: 'a'\n },\n orderLines: this._renderProductList(),\n callbacks: { updateQuantity: debounce(this._changeQuantity, 2000) },\n orderActions: this._renderOrderTemplateActions(orderTemplateResult),\n pagination: this._renderPagination(),\n itemAddedToCartDialog: this._renderItemAddedToCartDialog(),\n bulkOrderLineActions: this._getOrderTemplateLineActions(orderTemplateResult.productList.Id),\n isDetailsDisplayed: this.state.isDetailsDisplayed,\n toggleDetailsDisplayed: this._toggleDetailsDisplayed,\n detailedProductView: this.state.detailedProductView,\n isMobile: this.isMobile\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n public onSelect(line: IOrderTemplateLineViewModel, isChecked: boolean): void {\n line.isChecked = isChecked;\n\n const updated = this.state.productSelection.map(product => {\n if (product.fullProduct?.ProductDetails.ItemId === line.fullProduct?.ProductDetails.ItemId) {\n line.isChecked = isChecked;\n }\n return product;\n }) || [];\n\n this.setState({\n productSelection: updated\n });\n }\n\n public onSelectAll(isChecked: boolean): void {\n const updated = this.state.productSelection.map(line => {\n line.isChecked = isChecked;\n return line;\n }) || [];\n\n this.setState({\n productSelection: updated\n });\n }\n\n private _renderProductListHeader(resources: IOrderTemplateResources): React.ReactNode {\n const { productNumberText, productText, productUnitPriceText, productUOMText, productQuantityText, productActionsText, selectAllRowsText } = resources;\n const headers: IOrderTemplateTableHeadingProps = {\n productNumber: productNumberText,\n productName: productText,\n productUnitPrice: productUnitPriceText,\n productUOM: productUOMText,\n productQuantity: productQuantityText,\n productActions: productActionsText,\n selectAllRowsText,\n lines: this.state.productSelection,\n isMobile: this.isMobile,\n clickHandler: (isChecked: boolean) => {\n this.onSelectAll(isChecked);\n }\n };\n\n return ;\n }\n\n private _getOrderTemplateLineActions(orderTemplateId: string): React.ReactNode {\n return (\n line.isChecked)}\n onAddSelectionToBag={this._onAddSelectionToBag}\n onRemoveSelection={this._onRemoveSelection}\n isMinifiedView={this.isMobile}\n />\n );\n }\n\n private _generateLinesAddedToCartDialogResources(): ILinesAddedToCartDialogResources {\n return {\n viewCartButtonText: this.props.resources.viewCartButtonText,\n orderTemplateCloseButtonText: this.props.resources.orderTemplateCloseButtonText,\n linesAddedToCartHeaderItemsOneText: this.props.resources.linesAddedToCartHeaderItemsOneText,\n linesAddedToCartHeaderLinesOneText: this.props.resources.linesAddedToCartHeaderLinesOneText,\n linesAddedToCartHeaderLinesFormatText: this.props.resources.linesAddedToCartHeaderLinesFormatText,\n linesAddedToCartHeaderMessageText: this.props.resources.linesAddedToCartHeaderMessageText\n };\n }\n\n private _generateItemAddedToCartDialogResources(): IItemAddedToCartDialogResources {\n return {\n viewCartButtonText: this.props.resources.viewCartButtonText,\n orderTemplateCloseButtonText: this.props.resources.orderTemplateCloseButtonText,\n itemAddedToCartHeaderItemOneText: this.props.resources.itemAddedToCartHeaderItemOneText,\n itemAddedToCartHeaderItemFormatText: this.props.resources.itemAddedToCartHeaderItemFormatText,\n itemAddedToCartHeaderMessageText: this.props.resources.itemAddedToCartHeaderMessageText,\n freePriceText: this.props.resources.freePriceText,\n originalPriceText: this.props.resources.originalPriceText,\n currentPriceText: this.props.resources.currentPriceText\n };\n }\n\n private readonly _onRemoveSelection = (): void => {\n const { context, resources } = this.props;\n const { telemetry } = context;\n const { removeSelectedFailureMessage, removeSelectedSuccessMessage } = resources;\n const lines = this.state.productSelection;\n const productListLines = lines && lines.length && lines\n .filter(line => line.isChecked)\n .map(line => line.productListLine);\n\n if (productListLines && productListLines.length > 0) {\n const productListId = productListLines[0].ProductListId;\n const maxWaitTimeInMilliSeconds: number = 1000;\n removeProductListLinesAsync({ callerContext: context.actionContext }, productListId!, productListLines)\n .then(async () => {\n this.setState({\n userMessage: removeSelectedSuccessMessage,\n statusCssString: 'success',\n messageGlyph: 'fas fa-check',\n isOpen: true\n });\n // eslint-disable-next-line no-promise-executor-return -- fix\n await new Promise(resolve => setTimeout(resolve, maxWaitTimeInMilliSeconds));\n window.location.reload();\n })\n .catch(error => {\n telemetry.warning('[order-template-lines] Unable remove items from the order template lines');\n telemetry.error(error);\n this.setState({\n userMessage: removeSelectedFailureMessage,\n statusCssString: 'success',\n messageGlyph: 'fas fa-check',\n isOpen: true\n });\n });\n }\n };\n\n private readonly _getOrderTemplatePageUrl = (): string => {\n let url = getUrlSync('ordertemplate', this.props.context.actionContext) || '';\n url = url.includes('?') ? url.substr(0, url.indexOf('?')) : url;\n if (this.props.data.orderTemplate?.result?.productList.Id) {\n return `${url}?id=${this.props.data.orderTemplate.result.productList.Id}`;\n }\n return '';\n\n };\n\n private readonly _onAddSelectionToBag = async (): Promise => {\n const lines = this.state.productSelection;\n const selectedLines = lines.filter(line => line.isChecked);\n if (selectedLines.length > 0) {\n for (const productLine of selectedLines) {\n const itemKey = productLine.fullProduct?.ProductDetails.ItemId ?? '';\n const product = productLine.fullProduct?.ProductDetails ?? { RecordId: 0, ProductTypeValue: 0, BasePrice: 0, Price: 0, AdjustedPrice: 0 };\n const quantity = productLine.productListLine.Quantity ?? 0;\n this._addItemToBag(product, quantity, itemKey);\n }\n }\n return Promise.resolve(void (0));\n };\n\n private _renderOrderTemplateActions(orderTemplate: OrderTemplate): IOrderTemplateActionsViewProps {\n const { id, typeName, context, resources } = this.props;\n const {\n addTemplateToBagButtonText,\n renameTemplateButtonText,\n deleteTemplateButtonText,\n closeWindowButtonText,\n addToCartFailureMessage,\n addToCartSuccessMessage,\n addToCartProcessMessage\n } = resources;\n\n const orderTemplateActions: IOrderTemplateActionsProps = {\n data: { orderTemplate },\n id,\n typeName,\n context,\n telemetryContent: this.telemetryContent,\n handlers: {\n onRenameTemplate: this._renameTemplate,\n onRemoveTemplate: this._removeTemplate\n },\n renameOrderTemplateDialogStrings: this._generateOrderTemplateNameDialogResources(resources),\n resources: {\n addTemplateToBagButtonText,\n renameTemplateButtonText,\n deleteTemplateButtonText,\n addToCartFailureMessage,\n addToCartSuccessMessage,\n addToCartProcessMessage,\n closeWindowButtonText,\n linesAddedToCartDialogResources: this._generateLinesAddedToCartDialogResources()\n }\n };\n\n return OrderTemplateActionsView(orderTemplateActions);\n }\n\n private _generateOrderTemplateNameDialogResources(resources: IOrderTemplateResources): IOrderTemplateNameDialogResources {\n return {\n orderTemplateHeaderLabel: resources.renameOrderTemplateTitleText,\n orderTemplateTitleLabel: resources.orderTemplateTitle,\n orderTemplateNameAriaLabel: resources.orderTemplateTitle,\n orderTemplateDescription: '',\n defaultOrderTemplateName: resources.defaultOrderTemplateName,\n orderTemplateButtonLabel: resources.renameOrderTemplateButtonText,\n orderTemplateCancelButtonLabel: resources.cancelBtnLabel\n };\n }\n\n private readonly _getCurrentUrl = (reqContext: IRequestContext): URL => {\n if (MsDyn365.isBrowser) {\n return new URL(window.location.href);\n }\n return new URL(reqContext.url.requestUrl.href);\n };\n\n /**\n * On close handler.\n */\n private readonly onCloseHandler = () => {\n this.setState({\n itemKey: this.state.itemKey,\n userMessage: this.state.userMessage,\n statusCssString: this.state.statusCssString,\n messageGlyph: this.state.messageGlyph,\n isOpen: this.state.isOpen,\n isItemAddedToOrderTemplateOpen: false\n });\n };\n\n private readonly _renderItemAddedToCartDialog = (): React.ReactNode | null => {\n if (!this.state.itemAddedToCartDialogData) {\n return null;\n }\n\n return (\n \n );\n };\n\n private _isFirstPage(): boolean {\n return this._getCurrentPageNumber() === 0;\n }\n\n private _getCurrentPageNumber(): number {\n const itemsPerPage = this.props.config.itemsPerPage || 50;\n return this.props.context.request.query && (+this.props.context.request.query.skip / itemsPerPage) || 0;\n }\n\n private readonly _renderPagination = (): React.ReactNode | null => {\n const { config, context, data, resources } = this.props;\n const orderTemplate = data && data.orderTemplate && data.orderTemplate.result;\n if (!orderTemplate) {\n return null;\n }\n\n const fullUrl = this._getCurrentUrl(context.request);\n const itemsPerPage = config.itemsPerPage || 50;\n const currentPageNumber = this._getCurrentPageNumber();\n const skipCount = currentPageNumber * itemsPerPage;\n const totalItems = orderTemplate && orderTemplate.totalLines;\n const previousText = resources.flipperPrevious;\n const nextText = resources.flipperNext;\n\n if (totalItems <= itemsPerPage) {\n return null;\n }\n\n return (\n \n );\n };\n\n private _renderProductList(): IOrderTemplateLineViewProps[] {\n const {\n selectOneRowText,\n moreButtonText,\n viewProductDetailsText,\n priceFree,\n originalPriceText,\n currentPriceText,\n addOrderTemplateItemToBagButtonText,\n removeItemFromOrderTemplateButtonText,\n productDimensionTypeColor,\n productDimensionTypeSize,\n productDimensionTypeStyle,\n inputQuantityAriaLabel,\n deleteButtonText,\n incrementButtonAriaLabel,\n decrementButtonAriaLabel\n } = this.props.resources;\n\n const { context, telemetry } = this.props;\n const { imageSettings } = this.props.config;\n\n return this.state.productSelection.map((line, index) => {\n const currentProductProps: IOrderTemplateLineProps = {\n orderTemplateLine: line,\n productListLine: line.productListLine,\n price: line.fullProduct?.ProductPrice,\n context,\n isQuantityDisabledForUpdate: this.state.isQuantityDisabledForUpdate,\n productUrl: line.fullProduct ? getProductUrlSync(line.fullProduct.ProductDetails, context.actionContext, undefined) : '',\n imageSettings,\n telemetry,\n moduleId: this.props.id,\n moduleTypeName: this.props.typeName,\n quantity: line.productListLine.Quantity!,\n handlers: {\n onAddToBag: this._addItemToBag,\n onRemoveItem: this._removeItemFromOrderTemplateLines,\n onChangeQuantity: this._changeQuantity,\n onSelect: this.onSelect.bind(this)\n },\n resources: {\n selectOneRowText,\n moreButtonText,\n viewProductDetailsText,\n productDimensionTypeColor,\n productDimensionTypeSize,\n productDimensionTypeStyle,\n freePriceText: priceFree,\n originalPriceText,\n currentPriceText,\n inputQuantityAriaLabel,\n removeFromOrderTemplateLinesText: removeItemFromOrderTemplateButtonText,\n addToBagButtonText: addOrderTemplateItemToBagButtonText,\n deleteButtonText,\n incrementButtonAriaLabel,\n decrementButtonAriaLabel\n },\n index,\n isMobile: this.isMobile,\n toggleDetailsDisplayed: this._toggleDetailsDisplayed\n };\n\n return OrderTemplateLineView(currentProductProps)!;\n });\n }\n\n private readonly _toggleDetailsDisplayed = (props: IOrderTemplateLineProps): void => {\n let state = {\n isDetailsDisplayed: !this.state.isDetailsDisplayed\n };\n if (props) {\n state = { ...state, ...{\n detailedProductView: OrderTemplateMobileLineView(props)\n } };\n }\n this.setState(state);\n };\n\n // Dismiss alert when addingToCart/removeItem\n private readonly _onDismiss = () => {\n this.setState({\n isOpen: false\n });\n };\n\n private readonly _changeQuantity = (itemKey: string, quantity: number, props?: IOrderTemplateLineProps) => {\n const { context, data, telemetry, config, resources } = this.props;\n const { orderTemplate } = data;\n\n if (context) {\n if (orderTemplate?.result) {\n const orderTemplateLinesData = orderTemplate.result.orderTemplateLines;\n if (orderTemplateLinesData) {\n const orderLineIndex = orderTemplateLinesData.findIndex((lines: OrderTemplateLine) => lines.productListLine.LineId === itemKey);\n const newProductListLine = { ...orderTemplateLinesData[orderLineIndex] };\n if (orderTemplateLinesData[orderLineIndex].productListLine.Quantity === quantity) {\n return;\n }\n const prevQuantity = newProductListLine.productListLine.Quantity;\n newProductListLine.productListLine.Quantity = quantity;\n const { fullProduct, ...line } = newProductListLine;\n\n // Update mobile modal\n if (props) {\n props.quantity = quantity;\n this.setState({\n detailedProductView: OrderTemplateMobileLineView(props)\n });\n }\n\n this.setState({\n isQuantityDisabledForUpdate: true\n });\n\n updateProductListLinesAsync({ callerContext: context.actionContext }, orderTemplate.result.productList.Id, [line.productListLine])\n .then(list => {\n this.setState({\n itemKey,\n userMessage: '',\n statusCssString: 'success',\n messageGlyph: 'fas fa-check',\n isQuantityDisabledForUpdate: false,\n isOpen: false\n });\n if (list) {\n const newLine = list.find(lines => lines.LineId === itemKey);\n orderTemplateLinesData[orderLineIndex].productListLine = newLine!;\n const updatedLines = [...orderTemplateLinesData];\n updatedLines[orderLineIndex] = { fullProduct, productListLine: newLine! };\n const updatedOrderTemplate = { ...orderTemplate.result, ProductListLines: updatedLines };\n context.actionContext.update(new ActiveOrderTemplateLinesInput(context.actionContext.requestContext, config), updatedOrderTemplate);\n }\n })\n .catch(error => {\n telemetry.warning('[order-template-lines] Unable to update product quantity.');\n telemetry.error(error);\n const userMessage = resources.editOrderTemplateLineQuantityError;\n if (props) {\n props && (props.productListLine.Quantity = prevQuantity);\n this.setState({\n itemKey,\n userMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isQuantityDisabledForUpdate: false,\n isOpen: true,\n detailedProductView: OrderTemplateMobileLineView(props)\n });\n } else {\n newProductListLine.productListLine.Quantity = prevQuantity;\n this.setState({\n itemKey,\n userMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isQuantityDisabledForUpdate: false,\n isOpen: true\n });\n }\n });\n }\n }\n }\n };\n\n private readonly _addItemToBag = (product: SimpleProduct, quantity: number, itemKey: string): void => {\n const { context, data, resources, telemetry } = this.props;\n const { cart } = data;\n const { maxQuantityLimitText, addedToCartFailureMessage } = resources;\n\n if (context) {\n if (cart.result) {\n const addProductToCartInput = {\n product,\n count: quantity\n };\n\n cart.result\n .addProductToCart(addProductToCartInput)\n .then((result: ICartActionResult) => {\n if (result.status === 'SUCCESS') {\n return getPriceForSelectedVariant(\n new PriceForSelectedVariantInput(\n product.RecordId,\n this.props.context.actionContext.requestContext.apiSettings.channelId,\n product),\n this.props.context.actionContext).then(priceResult => {\n if (!priceResult) {\n return AsyncResult.reject('Failed to retrieve product price');\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- read config file.\n const isMiniCart = context.app.config.addToCartBehavior === 'showMiniCart';\n this.setState({\n itemKey,\n userMessage: '',\n statusCssString: 'success',\n messageGlyph: 'fas fa-check',\n isOpen: false,\n isItemAddedToOrderTemplateOpen: !isMiniCart,\n itemAddedToCartDialogData: {\n product,\n productPrice: priceResult,\n quantity\n },\n isDetailsDisplayed: false\n });\n return AsyncResult.resolve();\n });\n } else if (result.substatus === 'MAXQUANTITY') {\n this.setState({\n itemKey,\n userMessage:\n maxQuantityLimitText\n .replace('{curQuantity}', quantity.toString())\n .replace('{maxQuantity}', context.app.config.maxQuantityForProductListLineItem.toString()) ||\n `You can only add ${context.app.config.maxQuantityForProductListLineItem} of this item to your shopping bag`,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n return AsyncResult.resolve();\n }\n telemetry.debug('[order-template-lines] Unable to Update Cart Line from the order template lines');\n this.setState({\n itemKey,\n userMessage: addedToCartFailureMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n return AsyncResult.resolve();\n\n })\n .catch((error: Error) => {\n telemetry.warning(error.message);\n telemetry.debug('[order-template-lines] Error trying to Update Cart Line from the order template lines');\n this.setState({\n itemKey,\n userMessage: addedToCartFailureMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n });\n }\n }\n };\n\n private readonly _removeItemFromOrderTemplateLines = (line: IOrderTemplateLineViewModel): void | undefined => {\n const { context, data, telemetry } = this.props;\n const { orderTemplate } = data;\n\n if (context && context.actionContext) {\n const maxWaitTimeInMilliSeconds: number = 1000;\n const userToken = context.request.user.isAuthenticated && context.request.user.token;\n if (userToken && orderTemplate?.result && line) {\n removeProductListLinesAsync({ callerContext: context.actionContext }, line.productListLine.ProductListId!, [line.productListLine])\n .then(async () => {\n // eslint-disable-next-line no-promise-executor-return -- fix\n await new Promise(resolve => setTimeout(resolve, maxWaitTimeInMilliSeconds));\n window.location.reload();\n })\n .catch(error => {\n telemetry.warning('[order-template-lines] Unable remove items from the order template lines');\n telemetry.error(error);\n });\n } else {\n telemetry.warning(\n '[order-template-lines] Unable remove items from the order template lines user token or lineItemID was not found'\n );\n }\n }\n };\n\n private readonly _renameTemplate = async (_template: ProductList): Promise => {\n window.location.reload();\n return Promise.resolve();\n };\n\n private readonly _removeTemplate = () => {\n const { context, data, telemetry, resources } = this.props;\n const { orderTemplate } = data;\n\n if (context && context.actionContext) {\n const userToken = context.request.user.isAuthenticated && context.request.user.token;\n if (userToken && orderTemplate && orderTemplate.result) {\n deleteAsync({ callerContext: context.actionContext }, orderTemplate.result.productList)\n .then()\n .catch((error: string) => {\n telemetry.warning('[order-template] Unable to delete order template.');\n telemetry.error(error);\n this.setState({\n itemKey: orderTemplate.result?.productList.Id || '',\n userMessage: resources.deleteOrderTemplateFailedText,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n });\n const newLink = getUrlSync('ordertemplatelist', this.props.context.actionContext);\n if (newLink) {\n window.location.assign(newLink);\n }\n } else {\n telemetry.warning('[order-template] Failed to delete order template. Order template was not found');\n }\n } else {\n telemetry.warning('[order-template] Failed to delete order template.');\n }\n };\n\n private _updateViewport(): void {\n this._viewport = this._getViewport();\n }\n\n private readonly _getViewport = (): GridSize => {\n const { context } = this.props;\n\n // Always render in mobile viewport on a mobile device\n if (context.request && context.request.device && context.request.device.Type === 'Mobile') {\n return 'xs';\n }\n\n if (MsDyn365.isBrowser && window.innerWidth) {\n const gridSettings = context.request.gridSettings;\n if (gridSettings) {\n if (gridSettings.xs && window.innerWidth <= gridSettings.xs.w) {\n return 'xs';\n } else if (gridSettings.sm && window.innerWidth <= gridSettings.sm.w) {\n return 'sm';\n } else if (gridSettings.md && window.innerWidth <= gridSettings.md.w) {\n return 'md';\n } else if (gridSettings.lg && window.innerWidth <= gridSettings.lg.w) {\n return 'lg';\n }\n return 'xl';\n\n }\n }\n\n return 'xs';\n };\n\n /**\n * Renders a Pagination previous text.\n * @param paginationPreviousText - Pagination previous text from resources.\n * @returns Previous text and flipper icon.\n */\n private readonly _renderPrev = (paginationPreviousText: string) => {\n return (\n
\n
\n );\n };\n\n /**\n * Renders a Pagination next text.\n * @param paginationNextText - Pagination next text from resources.\n * @returns Next text and flipper icon.\n */\n private readonly _renderNext = (paginationNextText: string) => {\n return (\n
\n \n {paginationNextText}\n \n
\n );\n };\n}\n\nexport default OrderTemplateLines;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { ITelemetry } from '@msdyn365-commerce/core';\nimport { AttributeDataType, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\n\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\n\n/**\n * Types of product refiner values.\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\nexport enum ProductRefinerValueDataTypeValue {\n\n /**\n * Range slider is used for selections like price.\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Range = 1,\n\n /**\n * Range input is a different way to specify ranges and can be expressed with input boxes\n * as well as a set of discrete single-select type values.\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n RangeInput = 4,\n\n /**\n * This is a discrete list item, either multi-select or single-select.\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n List = 5,\n\n /**\n * Boolean types allows only single-select.\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Boolean = 6\n}\n\n/**\n * Types of product refiners.\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\nexport enum ProductRefinerTypeValue {\n\n /**\n * Refiner values are single-select.\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Single = 0,\n\n /**\n * Refiner values are multi-select.\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Multi = 1\n}\n\n/**\n * ProductRefinerSource enum type.\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\nexport enum ProductRefinerSource {\n\n /**\n * The None member.\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n None = 0,\n\n /**\n * The Attribute member.\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Attribute = 1,\n\n /**\n * The Category member.\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Category = 2,\n\n /**\n * The Price member.\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Price = 3,\n\n /**\n * The Rating member.\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Rating = 4\n}\n\n/**\n * Checks if the data type value corresponds to a slider.\n * @param dataTypeValue\n */\nexport function isRangeType(dataTypeValue: number | undefined): boolean {\n return dataTypeValue === AttributeDataType.Currency ||\n dataTypeValue === AttributeDataType.Decimal ||\n dataTypeValue === AttributeDataType.Integer;\n}\n\n/**\n * Find the refinement criterion associated with this product refiner value.\n * @param productRefinerValue Product refiner value to match.\n * @param refinementCriteria Selected refinement criteria.\n */\nexport function findMatchingRefinementCriterion(\n productRefinerValue: ProductRefinerValue,\n refinementCriteria: ProductRefinerValue[]\n): ProductRefinerValue | undefined {\n // If the value is a range, then match only on data type value; otherwise match on item string\n return refinementCriteria.find(\n (refinementCriterion: ProductRefinerValue) => isMatchingRefinementCriterion(productRefinerValue, refinementCriterion)\n );\n}\n\n/**\n * Find the refinement criterion associated with this product refiner value.\n * @param productRefinerValue Product refiner value to match.\n * @param refinementCriteria Selected refinement criteria.\n * @param refinementCriterion\n */\nexport function isMatchingRefinementCriterion(\n productRefinerValue: ProductRefinerValue,\n refinementCriterion: ProductRefinerValue\n): boolean {\n // If the value is a range, then match only on data type value; otherwise match on item string\n return refinementCriterion.RefinerRecordId === productRefinerValue.RefinerRecordId &&\n refinementCriterion.RefinerSourceValue === productRefinerValue.RefinerSourceValue &&\n refinementCriterion.DataTypeValue === productRefinerValue.DataTypeValue &&\n (isRangeType(refinementCriterion.DataTypeValue) || refinementCriterion.LeftValueBoundString === productRefinerValue.LeftValueBoundString);\n}\n\nexport function getUpdatedRefinementCriteria(\n itemToggleNotification: IRefineItemToggleNotification,\n currentRefinementCriteria: ProductRefinerValue[]): ProductRefinerValue[] {\n const updatedRefinementCriteria: ProductRefinerValue[] = [];\n let toggledItemFound = false;\n currentRefinementCriteria.forEach((selectedCriterion: ProductRefinerValue) => {\n if (isMatchingRefinementCriterion(itemToggleNotification.productRefinerValue, selectedCriterion)) {\n toggledItemFound = true;\n if (itemToggleNotification.isSelecting) {\n const next = {\n ...selectedCriterion,\n LeftValueBoundString: itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}` || selectedCriterion.LeftValueBoundString,\n RightValueBoundString: itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}` || selectedCriterion.RightValueBoundString\n };\n updatedRefinementCriteria.push(next);\n\n } // Else the item is being de-selected, so omit it from the refinement criteria\n } else {\n // Keep existing criterion because it is not in the item toggle notification\n updatedRefinementCriteria.push(selectedCriterion);\n }\n });\n\n if (!toggledItemFound) {\n const next = {\n ...itemToggleNotification.productRefinerValue,\n LeftValueBoundString: itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}` || itemToggleNotification.productRefinerValue.LeftValueBoundString,\n RightValueBoundString: itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}` || itemToggleNotification.productRefinerValue.RightValueBoundString\n };\n updatedRefinementCriteria.push(next);\n\n // If single select, then deselect any others in the parent refiner group\n if ((itemToggleNotification.productRefinerValue.DataTypeValue === AttributeDataType.Text || itemToggleNotification.productRefinerValue.DataTypeValue === AttributeDataType.TrueFalse) &&\n itemToggleNotification.parentProductRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect) {\n itemToggleNotification.parentProductRefinerHierarchy.Values.forEach((child: ProductRefinerValue) => {\n if (child.RefinerRecordId === next.RefinerRecordId && child.LeftValueBoundString === next.LeftValueBoundString) {\n // Do nothing\n } else {\n const matchingIndex = updatedRefinementCriteria.findIndex((criterion: ProductRefinerValue) => isMatchingRefinementCriterion(child, criterion));\n if (matchingIndex > -1) {\n updatedRefinementCriteria.splice(matchingIndex, 1);\n }\n }\n });\n }\n }\n\n return updatedRefinementCriteria;\n}\n\nexport function formatPrice(\n amount: string | undefined,\n currency: string | undefined,\n locale: string | undefined,\n telemetry: ITelemetry): string {\n if (!amount || !currency) {\n telemetry.trace(`[refine-menu.utilities.formatPrice] could not format price for ${amount} ${currency}`);\n return amount || '';\n }\n const priceAmount = (amount && Number(amount)) || 0;\n let result: string;\n\n try {\n result = new Intl.NumberFormat(locale, {\n style: 'currency',\n currencyDisplay: 'symbol',\n currency,\n minimumFractionDigits: 0\n }).format(priceAmount);\n } catch (error) {\n result = `${priceAmount} ${currency}`;\n telemetry.warning(`[refine-menu.utilities.formatPrice] Failed to format price for ${result}: ${error}`);\n }\n\n return result;\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { IProductDimensionConfigureDropdownViewProps, IProductDimensionConfigureViewProps } from '@msdyn365-commerce/components';\nimport { INodeProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IQuickOrderFormViewProps } from './components';\nimport { IQuickOrderViewProps } from './quick-order';\n\n/**\n * Render product dimension/configure container.\n * @param configure -- Product dimension configuration.\n * @returns Container to have dimension dropdown.\n */\nconst renderConfigure = (configure?: IProductDimensionConfigureViewProps): JSX.Element | null => {\n if (configure !== undefined) {\n const { containerProps, dropdowns } = configure;\n\n return (\n \n {dropdowns.map(renderConfigureDropdown)}\n \n );\n }\n return null;\n\n};\n\n/**\n * Render product dimension/configure dropdown.\n * @param dropdown -- Product dimension drop down.\n * @returns Dropdown.\n */\nconst renderConfigureDropdown = (dropdown: IProductDimensionConfigureDropdownViewProps): JSX.Element => {\n const { containerProps, labelContainerProps, heading, errors, select } = dropdown;\n\n return (\n \n \n {heading}\n \n {errors}\n {select}\n \n );\n};\n\nconst renderForm = (form: IQuickOrderFormViewProps, isMobileView: boolean, quickOrderForm: INodeProps, quickOrderProductContent: INodeProps, quickOrderMsgContent: INodeProps, configure?: IProductDimensionConfigureViewProps) => {\n return isMobileView ? (\n \n \n {form.product}\n {renderConfigure(configure)}\n {form.quantity}\n \n {form.userMessage}\n \n {form.addToCartBtn}\n \n \n ) : (\n \n \n {form.userMessage}\n \n \n {form.product}\n {renderConfigure(configure)}\n {form.quantity}\n {form.addToCartBtn}\n \n \n );\n};\n\nconst quickOrderView: React.FC = props => {\n const {\n isB2B,\n quickOrderProps,\n contentProps,\n form,\n quickOrderForm,\n drawer,\n configure,\n quickOrderFormProductContent,\n quickOrderFormMsgContent,\n quickOrderList,\n isMobileView\n } = props;\n\n return isB2B ? (\n \n \n \n {renderForm(form as IQuickOrderFormViewProps, isMobileView, quickOrderForm,\n quickOrderFormProductContent, quickOrderFormMsgContent, configure)}\n \n \n\n {quickOrderList}\n \n ) : null;\n};\nexport default quickOrderView;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { CategoryHierarchy as CategoryHierarchyData, IProductRefinerHierarchy, IProductsDimensionsAvailabilities } from '@msdyn365-commerce/commerce-entities';\nimport MsDyn365, { getCatalogId, ICoreContext } from '@msdyn365-commerce/core';\nimport { format, ProductPrice, ProductRefinerValue, SortColumn,\n TextValueTranslation } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions, DimensionAvailabilitiesForProductSearchResultInput, DimensionTypes,\n getDimensionAvailabilitiesForProductSearchResultAction, getPriceForProductSearchResult,\n IDimensionsApp, PriceForProductSearchResultInput } from '@msdyn365-commerce-modules/retail-actions';\nimport { getTelemetryObject, ILabeledDropdownOnChangeNotification, ILabeledDropdownOption, IModuleProps,\n INodeProps, isMobile, ITelemetryContent, LabeledDropdown, UncontrolledPagination, VariantType } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { computed, observable, reaction, transaction } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { buildListPageUrl, getCollectionProducts, getCollectionRefinersAction, getCurrentUrl,\n GetFullProductsByCollectionInput, parseQueryParam, ProductListInventoryFilteringOptions, RefinersByCollectionInput, sortOptions } from './actions';\nimport { hydrateRefinersFromUrl } from './actions/url-utils';\nimport {\n ErrorMessage, FeatureSearchResultItem, getUpdatedRefinementCriteria, IChoiceSummaryClickNotification,\n IRefineItemCommonProps, IRefineItemToggleNotification, ISearchResultModalViewProps, isMatchingRefinementCriterion,\n Link, ModalToggle, ProductSearchResultItems, SearchResultModal, Separator, Title\n} from './components';\nimport ChoiceSummary from './components/choice-summary';\nimport RefineSubmenu from './components/refine-submenu';\nimport { ISearchResultContainerData } from './search-result-container.data';\nimport { expandRefinersCount, ISearchResultContainerProps } from './search-result-container.props.autogenerated';\n\nexport interface ISearchResultContainerViewProps extends ISearchResultContainerProps {\n products?: React.ReactNode;\n className?: string;\n SearchResultContainer: IModuleProps;\n TitleViewProps: ITitleViewProps;\n categoryHierarchy: ICategoryHierarchyViewProps;\n pagination?: React.ReactNode;\n ProductsContainer: INodeProps;\n ProductSectionContainer: INodeProps;\n refineMenu: IRefineMenuViewProps;\n sortByOptions: ISortByViewProps;\n choiceSummary?: React.ReactNode;\n modalToggle: React.ReactNode;\n searchResultModal: ISearchResultModalViewProps;\n isMobile: boolean;\n CategoryNavContainer: INodeProps;\n RefineAndProductSectionContainer: INodeProps;\n errorMessage: React.ReactNode;\n FeatureSearchContainer: INodeProps;\n similarLookProduct?: React.ReactNode;\n productPrices?: ProductPrice[];\n}\n\nexport interface ITitleViewProps {\n TitleContainer: INodeProps;\n title: ISearchResultTitle;\n}\n\nexport interface IRefineMenuViewProps {\n RefineMenuContainer: INodeProps;\n RefinerSectionContainer: INodeProps;\n refiners?: React.ReactNode[];\n}\n\nexport interface ICategoryHierarchyViewProps {\n categoryHierarchyList?: React.ReactNode[];\n categoryHierarchySeparator?: React.ReactNode;\n CategoryHierarchyContainer: INodeProps;\n}\n\nexport interface ISortByViewProps {\n SortingContainer: INodeProps;\n sortByDropDown?: React.ReactNode;\n}\n\nexport type GridSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\n/**\n * Title component for search result container.\n */\nexport interface ISearchResultTitle {\n titlePrefix?: React.ReactNode;\n titleText?: React.ReactNode;\n titleCount?: React.ReactNode;\n}\n\nexport interface ISearchResultContainerState {\n sortingState: ISortByCollectionState;\n modalIsOpen: boolean;\n refiners: IProductRefinerHierarchy[];\n productsDimensionAvailabilities?: IProductsDimensionsAvailabilities[][];\n}\n\ninterface ISortByCollectionState {\n selectedSortByOption: ILabeledDropdownOption;\n pending: boolean;\n}\n\n/**\n *\n * SearchResultContainer component.\n * @extends {React.PureComponent>}\n */\n@observer\nexport default class SearchResultContainer extends React.PureComponent, ISearchResultContainerState> {\n\n @computed get isMobile(): boolean {\n return (this._viewport === 'xs' || this._viewport === 'sm');\n }\n\n private readonly sortByDropdownOptions: ILabeledDropdownOption[] = [\n { key: sortOptions.sortByOptionRelevanceDesc, value: this.props.resources.sortByOptionRelevanceDesc },\n { key: sortOptions.sortByOptionNameAsc, value: this.props.resources.sortByOptionNameAsc },\n { key: sortOptions.sortByOptionNameDesc, value: this.props.resources.sortByOptionNameDesc },\n { key: sortOptions.sortByOptionPriceAsc, value: this.props.resources.sortByOptionPriceAsc },\n { key: sortOptions.sortByOptionPriceDesc, value: this.props.resources.sortByOptionPriceDesc },\n { key: sortOptions.sortByOptionRatingDesc, value: this.props.resources.sortByOptionRatingDesc },\n { key: sortOptions.sortByOptionBestSelling, value: this.props.resources.sortByOptionBestSelling },\n { key: sortOptions.sortByOptionNewScore, value: this.props.resources.sortByOptionNewScore },\n { key: sortOptions.sortByOptionTrendingScore, value: this.props.resources.sortByOptionTrendingScore }\n ];\n\n private readonly _refineItemCommonProps: IRefineItemCommonProps;\n\n private readonly _pageType: string | undefined = this.props.context.request.urlTokens.pageType;\n\n @observable\n private _viewport: GridSize = 'lg';\n\n private readonly _modalToggleRef: React.RefObject;\n\n private readonly _sortAndFilterContainerRef: React.RefObject;\n\n private expandrefinerCount: number | undefined = 0;\n\n private readonly telemetryContent: ITelemetryContent;\n\n private readonly productPrices: ProductPrice[];\n\n private readonly defaultPageNumber = 0;\n\n private readonly catalogId = getCatalogId(this.props.context.request);\n\n public constructor(props: ISearchResultContainerProps, state: ISearchResultContainerState) {\n super(props);\n this._viewport = props.context.request && props.context.request.device && props.context.request.device.Type === 'Mobile' ? 'xs' : 'lg';\n this._modalToggleRef = React.createRef();\n this._sortAndFilterContainerRef = React.createRef();\n this._toggleModal = this._toggleModal.bind(this);\n this._updateViewport = this._updateViewport.bind(this);\n this.productPrices = [];\n this.state = {\n sortingState: {\n pending: false,\n selectedSortByOption: this.sortByDropdownOptions[0]\n },\n modalIsOpen: false,\n refiners: []\n };\n const {\n placeholderTextMax,\n minLabel,\n maxLabel,\n rangeNameFormat\n } = this.props.resources;\n\n const locale = this.props.context.request.locale;\n const telemetry = this.props.telemetry;\n const validationErrorNaN = this.props.resources.validationErrorNotNumber;\n const validationErrorRange = this.props.resources.validationErrorNotRange;\n this._refineItemCommonProps = {\n telemetry,\n locale,\n placeholderTextMax,\n minLabel,\n maxLabel,\n rangeNameFormat,\n validationErrorNaN,\n validationErrorRange\n };\n this.telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!, this.props.friendlyName, this.props.telemetry);\n\n // Initalization of list page\n // eslint-disable-next-line max-len -- existing code\n /* eslint-disable @typescript-eslint/no-floating-promises, promise/catch-or-return, promise/always-return, promise/prefer-await-to-then -- existing code */\n this.props.data.products.then((products) => {\n this.props.data.listPageState.then((listPageState) => {\n if (this._pageType === 'Category') {\n listPageState.pageType = 'Category';\n } else {\n listPageState.pageType = 'Search';\n }\n\n let querySorting: SortColumn[] = [];\n\n if (this.props.context.request.query && this.props.context.request.query.sorting) {\n querySorting = JSON.parse(decodeURIComponent(this.props.context.request.query.sorting)) as SortColumn[];\n }\n\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing, max-len -- existing code\n listPageState.currentPageNumber = this.props.context.request.query && (+this.props.context.request.query.skip / (this.props.config.itemsPerPage || 10)) || 0;\n listPageState.sortingCritera = { Columns: querySorting };\n listPageState.pageSize = this.props.config.itemsPerPage || 10;\n listPageState.activeProducts = products.products;\n listPageState.totalProductCount = products.count;\n listPageState.activeFilters = hydrateRefinersFromUrl(this.props.context.request);\n\n // Initialize reaction based on listPageState properties\n reaction(\n () => {\n // eslint-disable-next-line max-len -- existing code\n return [listPageState.activeFilters && listPageState.activeFilters.length, listPageState.currentPageNumber, listPageState.sortingCritera && listPageState.sortingCritera.Columns && listPageState.sortingCritera.Columns.length];\n },\n () => {\n const input = new GetFullProductsByCollectionInput(\n listPageState.pageType,\n this.props.context.request.apiSettings,\n // eslint-disable-next-line max-len -- existing code\n { Paging: { Top: this.props.config.itemsPerPage, Skip: Math.max((listPageState.pageSize * (listPageState.currentPageNumber || 0)), 0) }, count: true, Sorting: listPageState.sortingCritera || {} },\n listPageState.activeFilters || [],\n +(this.props.context.request.urlTokens.itemId || 0),\n\n // eslint-disable-next-line max-len -- existing code\n this.props.context.request.query && this.props.context.request.query.q ? this.props.context.request.query.q : JSON.stringify({ ProductId: this.props.context.request.query?.productId, Recommendation: this.props.context.request.query?.recommendation }),\n !!(this.props && this.props.config && this.props.config.includeAttributes !== undefined && this.props.config.includeAttributes),\n this.props.config.updateRefinerPanel,\n this.props.context.request.locale,\n this.catalogId\n );\n getCollectionProducts(input, this.props.context.actionContext).then(productResults => {\n listPageState.activeProducts = productResults.products;\n listPageState.totalProductCount = productResults.count;\n\n if (this.props.config.enableAffiliationBasedPricing && this.props.context.actionContext.requestContext?.user?.isAuthenticated) {\n this._getActivePrice();\n }\n });\n\n if (this.props.config.updateRefinerPanel) {\n const refinerInput = new RefinersByCollectionInput(\n listPageState.pageType,\n this.props.context.request.apiSettings,\n {\n Paging: {\n Top: this.props.config.itemsPerPage,\n Skip: Math.max((listPageState.pageSize * (listPageState.currentPageNumber ?? this.defaultPageNumber)),\n this.defaultPageNumber)\n },\n count: true, Sorting: listPageState.sortingCritera ?? {}\n },\n listPageState.activeFilters ?? [],\n +(this.props.context.request.urlTokens.itemId ?? 0),\n this.props.context.request.query?.q ? this.props.context.request.query.q : this.props.context.request.query?.productId,\n false,\n this.props.config.updateRefinerPanel,\n undefined,\n this.catalogId\n );\n\n getCollectionRefinersAction(refinerInput, this.props.context.actionContext).then((refiners) => {\n this.setState({ refiners });\n }).catch(error => {\n this.props.telemetry.error(error);\n });\n }\n }\n );\n\n });\n });\n // eslint-disable-next-line max-len -- existing code\n /* eslint-enable @typescript-eslint/no-floating-promises, promise/catch-or-return, promise/always-return, promise/prefer-await-to-then -- Existing code. */\n\n if (this.props.context.request.query?.productId) {\n this.props.data.featureProduct.then((products) => {\n this.props.data.listPageState.then((listPageStateFeature) => {\n listPageStateFeature.featureProduct = products;\n });\n });\n }\n this._updateViewport();\n }\n\n public static getFriendlyName(locale: string, nameTranslations?: TextValueTranslation[]): string | undefined {\n let nameTranslation: TextValueTranslation | undefined;\n if (locale && nameTranslations && ArrayExtensions.hasElements(nameTranslations)) {\n nameTranslation = nameTranslations.find(item => item.Language!.toLowerCase() === locale.toLowerCase());\n }\n\n return nameTranslation?.Text;\n }\n\n public async componentDidMount(): Promise {\n if (MsDyn365.isBrowser && window.addEventListener) {\n window.addEventListener('resize', this._updateViewport);\n this._updateViewport();\n }\n if (this.props.config.enableAffiliationBasedPricing &&\n this.props.context.actionContext.requestContext?.user?.isAuthenticated) {\n this._getActivePrice();\n }\n\n const context = this.props.context as ICoreContext;\n const dimensionsToDisplayOnProductCard = context.app.config.dimensionsInProductCard;\n const dimensionsToDisplayAsSwatch = context.app.config.dimensionsAsSwatchType;\n if (ArrayExtensions.hasElements(dimensionsToDisplayOnProductCard) && !dimensionsToDisplayOnProductCard.includes(DimensionTypes.none) &&\n ArrayExtensions.hasElements(dimensionsToDisplayAsSwatch) && !dimensionsToDisplayAsSwatch.includes(DimensionTypes.none) &&\n this.props.config.includeAttributes) {\n await this._getProductsDimensionsAvailabilities();\n }\n }\n\n public componentWillUnmount(): void {\n if (MsDyn365.isBrowser && window.removeEventListener) {\n window.removeEventListener('resize', this._updateViewport);\n }\n }\n\n public render(): JSX.Element {\n const { imageSettings, className } = this.props.config;\n const { resources } = this.props;\n const products = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts) || [];\n const searchProduct = (this.props.data.listPageState.result && this.props.data.listPageState.result.featureProduct) || null;\n let errorText = '';\n if (!products || products.length === 0) {\n errorText = this._pageType === 'Category' ? resources.resultCategoryNotFoundText : resources.resultSearchNotFoundText;\n\n }\n const productsComponent = this._getProducts();\n const featureComponent = (\n \n );\n\n const searchResultContainerViewProps = {\n ...this.props,\n products: productsComponent,\n TitleViewProps: this._getCollectionTitle(),\n categoryHierarchy: !this.props.config.disableHierarchy && this._getCategoryHierarchy(),\n refineMenu: this._getRefineMenu(),\n className: classnames('ms-search-result-container', className),\n SearchResultContainer: {\n moduleProps: this.props,\n className: classnames('ms-search-result-container', className)\n },\n // eslint-disable-next-line max-len -- existing code\n sortByOptions: this.props.data.listPageState.result && this.props.data.listPageState.result.totalProductCount !== 0 ? this._getSortingDropDown() : null,\n pagination: this._getPagination(),\n ProductsContainer: { className: 'ms-search-result-container__Products' },\n ProductSectionContainer: { className: 'ms-search-result-container__product-section' },\n CategoryNavContainer: { className: 'ms-search-result-container__category-nav-section' },\n RefineAndProductSectionContainer: { className: 'ms-search-result-container__refine-product-section' },\n choiceSummary: this._getChoiceSummary(),\n modalToggle: this.props.data.listPageState.result && this.props.data.listPageState.result.totalProductCount !== 0 ? (\n \n ) : null,\n searchResultModal: this._getSearchResultModal(),\n isMobile: this.isMobile,\n errorMessage: errorText && (\n \n ),\n FeatureSearchContainer: { className: 'ms-feature-search-result' },\n // eslint-disable-next-line max-len -- existing code\n similarLookProduct: this.props.data.listPageState.result && (this.props.data.listPageState.result.featureProduct !== null && this.props.data.listPageState.result.featureProduct !== undefined) ? featureComponent : null,\n productPrices: this.productPrices\n };\n return this.props.renderView(searchResultContainerViewProps) as React.ReactElement;\n }\n\n /**\n * Get products dimension availabilities.\n * @returns Void.\n */\n private readonly _getProductsDimensionsAvailabilities = async (): Promise => {\n const productsList = (this.props.data.listPageState.result?.activeProducts) ?? [];\n\n const productsDimensionAvailabilities = await getDimensionAvailabilitiesForProductSearchResultAction(\n new DimensionAvailabilitiesForProductSearchResultInput(productsList, this.props.context as ICoreContext),\n this.props.context.actionContext);\n\n if (ArrayExtensions.hasElements(productsDimensionAvailabilities)) {\n this.setState({ productsDimensionAvailabilities });\n }\n };\n\n /**\n * Get the active price for the products.\n */\n private readonly _getActivePrice = async (): Promise => {\n const productsList = (this.props.data.listPageState.result?.activeProducts) ?? [];\n const products = await getPriceForProductSearchResult(\n new PriceForProductSearchResultInput(productsList),\n this.props.context.actionContext);\n\n const listPageState = await this.props.data.listPageState;\n listPageState.activeProducts = products;\n };\n\n private readonly _getSearchResultModal = (): ISearchResultModalViewProps => {\n const { resources } = this.props;\n return SearchResultModal(\n {\n resources: {\n modalCloseButtonText: resources.modalCloseButtonText,\n modalTitle: resources.modalTitle\n },\n isOpen: this.state.modalIsOpen,\n returnRef: this._modalToggleRef,\n onModalToggle: this._toggleModal\n });\n };\n\n private readonly _getCollectionTitle = (): ITitleViewProps => {\n const { data, context, resources } = this.props;\n\n let collectionTitle: string | undefined = '';\n if (context && context.request && context.request.query && context.request.query.q) {\n collectionTitle = `\"${context.request.query.q}\"`;\n } else {\n collectionTitle = (data.category.result && SearchResultContainer.getFriendlyName(context.request.locale, data.category.result.NameTranslations)) ||\n (data.category.result && data.category.result.Name);\n }\n let productCountText = '';\n let productCountNumber: number | undefined;\n if (data.listPageState && data.listPageState.result && data.listPageState.result.totalProductCount !== undefined) {\n productCountNumber = data.listPageState.result.totalProductCount;\n } else if (data.products && data.products.result) {\n productCountNumber = data.products.result.count;\n }\n\n if (productCountNumber && productCountNumber !== 0) {\n productCountText = productCountNumber !== 1 ? format(this.props.resources.numberOfProducts, productCountNumber) : this.props.resources.oneProduct;\n } else {\n productCountText = format(this.props.resources.numberOfProducts, 0);\n }\n const pageName = context.request.telemetryPageName ? `result-count-${context.request.telemetryPageName.toLowerCase()}` : '';\n const titlePrefix = ;\n const titleText = collectionTitle && <Title className='ms-search-result__collection-title-text' text={collectionTitle} />;\n const titleCount = <Title className='ms-search-result__collection-title-count' text={productCountText} />;\n\n return {\n TitleContainer: { className: `ms-search-result-container__title ${pageName}` },\n title: {\n titlePrefix,\n titleText,\n titleCount\n }\n };\n\n };\n\n private readonly _getCategoryHierarchy = (): ICategoryHierarchyViewProps => {\n const { data } = this.props;\n const categoryHierarchy = data.categoryHierarchy.result;\n const categoryLinks =\n categoryHierarchy && categoryHierarchy.map((value: CategoryHierarchyData, index: number) => {\n\n return (\n <Link\n key={index}\n text={value.Name}\n ariaLabel={`${this.props.resources.categoryLinkAriaLabel} ${value.Name}`}\n href={value.Url}\n />\n );\n });\n const categoryLinkSeparator = <Separator separator='/' />;\n\n return {\n CategoryHierarchyContainer: { tag: 'nav', className: 'ms-search-result-container__category-hierarchy' },\n categoryHierarchyList: categoryLinks,\n categoryHierarchySeparator: categoryLinkSeparator\n };\n\n };\n\n private readonly _getSortingDropDown = (): ISortByViewProps => {\n const { resources } = this.props;\n const activeDropdown = this._getCurrentlySelectedOption() || this.state.sortingState.selectedSortByOption;\n let dropdownOptions = this._getAllSortByOptions();\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- App config settings are of \"any\" value.\n if (this.props.context.app.config.hideRating) {\n dropdownOptions = dropdownOptions.filter((dropdownOption) => dropdownOption.key !== sortOptions.sortByOptionRatingDesc);\n }\n\n const dropdown = (\n <LabeledDropdown\n labelClassname='reviews-list-sort-by'\n labelText={resources.sortByDropdownLabel}\n dropdownId='categorySortByDropdown'\n dropdownClassname='reviews-list-dropdown'\n toggleColor='link'\n dropdownOptions={dropdownOptions}\n selectedOption={activeDropdown}\n onSelectOption={this._updateSortByDropdown}\n ref={this._sortAndFilterContainerRef}\n />);\n return {\n SortingContainer: { className: 'ms-search-result-container__Sort-by-category' },\n sortByDropDown: dropdown\n };\n };\n\n private readonly _getPagination = (): React.ReactNode => {\n const { config, context, data, resources } = this.props;\n const listPageState = data && data.listPageState && data.listPageState.result;\n const fullUrl = getCurrentUrl(context.request);\n const itemsPerPage = config.itemsPerPage || 10;\n // eslint-disable-next-line max-len -- existing code\n const skipCount = listPageState && listPageState.currentPageNumber !== null ? (listPageState.currentPageNumber * (this.props.config.itemsPerPage || 10)) : ((this.props.context.request.query && +this.props.context.request.query.skip) || 0);\n const totalItems = listPageState && listPageState.totalProductCount || 0;\n const previousText = resources.flipperPrevious;\n const nextText = resources.flipperNext;\n\n if (totalItems <= itemsPerPage) {\n return null;\n }\n return (\n <UncontrolledPagination\n className='ms-search-result-container__pagination'\n role='navigation'\n aria-label={resources.paginationAriaLabel}\n url={fullUrl.href}\n qsp='skip'\n items={totalItems}\n itemsPerPage={itemsPerPage}\n startingItem={skipCount}\n previousText={this._renderPrev(previousText)}\n nextText={this._renderNext(nextText)}\n previousAriaLabel={previousText}\n nextAriaLabel={nextText}\n telemetryContent={this.telemetryContent}\n />);\n };\n\n private readonly _getRefineMenu = (): IRefineMenuViewProps => {\n const { data, context, config } = this.props;\n const tempRangeTypeTODO = context.request.query && context.request.query.inputRange ? 'input' : 'slider';\n const validRefiners = this.props.config.updateRefinerPanel && ArrayExtensions.hasElements(this.state.refiners) ? this.state.refiners.filter(refiner => {\n return ArrayExtensions.hasElements(refiner.Values) && !this._shouldHideFromRefiners(refiner);\n }) : data.refiners.result && data.refiners.result.filter(refiner => {\n return ArrayExtensions.hasElements(refiner.Values) && !this._shouldHideFromRefiners(refiner);\n });\n\n const activeRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\n\n this._getexpandRefinerCount(validRefiners && validRefiners.length, config.expandRefinersCount);\n const expandedRefiners = this.expandrefinerCount;\n const subMenus = validRefiners && validRefiners.map((productRefinerHierarchy: IProductRefinerHierarchy, index: number) => {\n return (\n <RefineSubmenu\n productRefinerHierarchy={productRefinerHierarchy}\n selectedRefinerValues={activeRefiners}\n refineItemCommonProps={this._refineItemCommonProps}\n minValueSliderThumbAriaLabel={this.props.resources.minValueSliderThumbAriaLabel}\n maxValueSliderThumbAriaLabel={this.props.resources.maxValueSliderThumbAriaLabel}\n key={index}\n onUpdateRefiners={this._onUpdateRefiners}\n urlBuilder={this._buildRefinerUrl}\n isDisabled={false}\n isExpandedOnInitialLoad={!!(expandedRefiners && expandedRefiners > index)}\n tempRangeTypeTODO={tempRangeTypeTODO}\n context={context}\n moduleId={this.props.id}\n moduleTypeName={this.props.typeName}\n telemetryContent={this.telemetryContent}\n productCountAriaLabel={this.props.resources.productCountAriaLabel}\n refineItemAriaLabel={this.props.resources.refineItemAriaLabel}\n refineItemsAriaLabel={this.props.resources.refineItemsAriaLabel}\n singleProductCountAriaLabel={this.props.resources.singleProductCountAriaLabel}\n isMobile={this.isMobile}\n />\n );\n });\n\n return {\n RefineMenuContainer: { className: 'ms-search-result-container__refine-menu' },\n RefinerSectionContainer: { className: 'ms-search-result-container__refiner-section' },\n refiners: subMenus\n };\n\n };\n\n /**\n * Should hide from refiners.\n * @param refiner - The refiner.\n * @returns ShouldHideFromRefiners.\n */\n private readonly _shouldHideFromRefiners = (refiner: IProductRefinerHierarchy): boolean => {\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app configs are of generic type\n return this.props.context.app.config.productListInventoryDisplay === ProductListInventoryFilteringOptions.HideOOS &&\n refiner.RecordId === this.props.data.products.result?.channelInventoryConfigurationId;\n };\n\n private readonly _getChoiceSummary = (): React.ReactNode => {\n const { resources, data, telemetry } = this.props;\n const selectedRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\n return (\n <ChoiceSummary\n classNames='ms-choice-summary-by-category'\n clearAllText={resources.clearAllText}\n label={resources.choiceSummaryLabel}\n closeAriaLabel={resources.closeAriaLabel}\n selectedChoices={selectedRefiners}\n\n // @ts-expect-error: NOTE Type-unsafe line below, null refinersByCategoryHierarchy case not handled\n refinerHierarchy={data.refiners.result}\n choiceFormat={resources.choiceFormat}\n choiceRangeValueFormat={resources.choiceRangeValueFormat}\n telemetry={telemetry}\n onChoiceClicked={this._onChoiceClicked}\n urlBuilder={this._buildRefinerUrlForChoiceSummary}\n choiceAriaLabel={resources.choiceAriaLabel}\n telemetryContent={this.telemetryContent}\n context={this.props.context}\n channelInventoryConfigurationId={this.props.data.products.result?.channelInventoryConfigurationId}\n />\n );\n\n };\n\n private readonly _getProducts = (): JSX.Element => {\n const { imageSettings, allowBackNavigation } = this.props.config;\n const { resources } = this.props;\n const breaCrumbType = this.props.context.app.config.breadcrumbType;\n const allowBack = allowBackNavigation && (breaCrumbType === 'back' || breaCrumbType === 'categoryAndBack');\n const products = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts) || [];\n const quickviewslot = this.props.slots && this.props.slots.quickview && this.props.slots.quickview[0];\n const isPriceMinMaxFeatureState = this.props.data.featureState.result?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailSearchPriceRangeFeature');\n return (\n <ProductSearchResultItems\n products={products}\n context={this.props.context}\n imageSettings={imageSettings}\n resources={resources}\n moduleType={this.props.typeName}\n moduleId={this.props.id}\n allowBackNavigation={allowBack}\n telemetryContent={this.telemetryContent}\n quickviewSlot={quickviewslot}\n channelInventoryConfigurationId={this.props.data.products.result?.channelInventoryConfigurationId}\n isPriceMinMaxEnabled={isPriceMinMaxFeatureState?.IsEnabled}\n productsDimensionAvailabilities={this.state.productsDimensionAvailabilities}\n />\n );\n };\n\n private readonly _updateSortByDropdown = (notification: ILabeledDropdownOnChangeNotification): void => {\n const { context } = this.props;\n const requestContext = context && context.request;\n const actionContext = context && context.actionContext;\n\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\n // eslint-disable-next-line max-len -- existing code\n const error = `[sort-by-category] cannot sort without context: ${!requestContext ? 'requestContext ' : ''} ${!actionContext ? 'actionContext ' : ''} could not be found`;\n this.props.telemetry.warning(error);\n }\n\n window.history.pushState({}, '', buildListPageUrl(getCurrentUrl(this.props.context.request), undefined, [this._getSortColumnFromSelectedOption(notification.selectedOption)], undefined));\n transaction(() => {\n this.props.data.listPageState.result!.currentPageNumber = 0;\n this.props.data.listPageState.result!.sortingCritera = { Columns: [this._getSortColumnFromSelectedOption(notification.selectedOption)] };\n });\n };\n\n private readonly _getSortColumnFromSelectedOption = (option: ILabeledDropdownOption): SortColumn => {\n const { data } = this.props;\n\n if (!data.searchConfiguration.result) {\n return {};\n }\n\n const mappedConfiguration = data.searchConfiguration.result.find((searchConfiguration) => {\n return searchConfiguration.key === option.key;\n });\n\n if (mappedConfiguration) {\n return mappedConfiguration.sortColumn;\n }\n\n return {};\n };\n\n /**\n * Retrieves current sort criteria.\n * @returns Sort criteria column which is currently active or undefined if it's not specified.\n */\n private readonly _getSortCriteriaColumn = (): SortColumn | undefined => {\n const sortCriteria = this.props.data.listPageState.result?.sortingCritera;\n if (ArrayExtensions.hasElements(sortCriteria?.Columns)) {\n return sortCriteria!.Columns[0];\n }\n\n const queryColumns = parseQueryParam<SortColumn[]>('sorting', this.props.context.request);\n if (ArrayExtensions.hasElements(queryColumns)) {\n return queryColumns[0];\n }\n\n return undefined;\n };\n\n /**\n * Retrieves dropdown options.\n * @returns All dropdown options.\n */\n private readonly _getAllSortByOptions = (): ILabeledDropdownOption[] => {\n const searchConfiguration = this.props.data.searchConfiguration.result;\n\n if (!searchConfiguration) {\n return [];\n }\n\n const mappedSearchConfiguration = this.sortByDropdownOptions.filter(\n mappedSearchConfig => searchConfiguration.find(item => mappedSearchConfig.key === item.key)\n );\n\n return ArrayExtensions.validValues(mappedSearchConfiguration);\n };\n\n /**\n * Retrieves current selected dropdown option based on the sort criteria.\n * @returns Current dropdown option.\n */\n private readonly _getCurrentlySelectedOption = (): ILabeledDropdownOption | undefined => {\n const activeSortColumn = this._getSortCriteriaColumn();\n\n const searchConfiguration = this.props.data.searchConfiguration.result;\n\n if (!activeSortColumn || !searchConfiguration) {\n return undefined;\n }\n\n const activeMappedConfig = searchConfiguration.find(mappedSearchConfig => mappedSearchConfig.sortColumn.ColumnName === activeSortColumn.ColumnName &&\n mappedSearchConfig.sortColumn.IsDescending === activeSortColumn.IsDescending\n );\n if (!activeMappedConfig) {\n return undefined;\n }\n\n return this.sortByDropdownOptions.find(dropdownOption => dropdownOption.key === activeMappedConfig.key);\n };\n\n private readonly _onUpdateRefiners = (itemToggleNotification: IRefineItemToggleNotification): void => {\n const { context } = this.props;\n const requestContext = context && context.request;\n const actionContext = context && context.actionContext;\n\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\n const error = `Refine menu cannot refine search criteria: ${!requestContext ? 'requestContext ' : ''} ${!actionContext ? 'actionContext ' : ''} could not be found`;\n this.props.telemetry.warning(error);\n }\n\n const updatedRefinementCriteria = getUpdatedRefinementCriteria(itemToggleNotification, this.props.data.listPageState.result && this.props.data.listPageState.result.activeFilters || []);\n\n window.history.pushState({}, '', buildListPageUrl(getCurrentUrl(this.props.context.request), updatedRefinementCriteria));\n transaction(() => {\n this.props.data.listPageState.result!.currentPageNumber = 0;\n this.props.data.listPageState.result!.activeFilters = updatedRefinementCriteria;\n });\n };\n\n private readonly _buildRefinerUrl = (itemToggleNotification: IRefineItemToggleNotification): string => {\n if (this.props.data.listPageState.result) {\n const newRefinementCriteria = getUpdatedRefinementCriteria(itemToggleNotification, this.props.data.listPageState.result.activeFilters || []);\n\n return buildListPageUrl(getCurrentUrl(this.props.context.request), newRefinementCriteria);\n }\n this.props.telemetry.warning('[buildRefinerQueryString]List Page State Not available, unable to build refiner URL');\n return '';\n\n };\n\n private readonly _onChoiceClicked = (notification: IChoiceSummaryClickNotification): void => {\n const { data, telemetry } = this.props;\n\n if (!data.listPageState.result) {\n telemetry.warning('[choice-summary-by-category._onChoiceClicked]ListPageState unavailable, unable to update refiners.');\n return;\n }\n\n let currentRefinementCriteria = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\n\n if (!notification.clearAll) {\n const selectedChoice = notification.choiceClicked;\n if (!selectedChoice) {\n telemetry.warning('[choice-summary-by-category._onChoiceClicked] Choice could not be determined');\n return;\n }\n currentRefinementCriteria = currentRefinementCriteria.filter(\n (selectedCriterion: ProductRefinerValue) => !isMatchingRefinementCriterion(selectedChoice, selectedCriterion)\n );\n } else {\n currentRefinementCriteria = [];\n\n // Set focus to sort and filter\n const dropdownElementId = this._sortAndFilterContainerRef.current && this._sortAndFilterContainerRef.current.props.dropdownId;\n const dropdownElement = dropdownElementId && document.getElementById(dropdownElementId);\n setTimeout(() => {\n dropdownElement && dropdownElement.focus();\n },\n 50);\n }\n\n const fullUrl = getCurrentUrl(this.props.context.request);\n window.history.pushState({}, '', buildListPageUrl(fullUrl, currentRefinementCriteria));\n data.listPageState.result.currentPageNumber = 0;\n data.listPageState.result.activeFilters = currentRefinementCriteria;\n };\n\n private readonly _buildRefinerUrlForChoiceSummary = (selectedRefiner: ProductRefinerValue, isClearAll: boolean): string => {\n const { data, telemetry } = this.props;\n const fullUrl = getCurrentUrl(this.props.context.request);\n\n if (!data.listPageState.result) {\n telemetry.warning('[choice-summary-by-category._buildRefinerUrl]ListPageState unavailable, unable to create refiner URL.');\n return fullUrl.href;\n }\n\n let currentRefinementCriteria = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\n\n if (!isClearAll) {\n if (!selectedRefiner) {\n telemetry.warning('[choice-summary-by-category._buildRefinerUrl] URL for Choice could not be determined');\n return fullUrl.href;\n }\n currentRefinementCriteria = currentRefinementCriteria.filter(\n (selectedCriterion: ProductRefinerValue) => !isMatchingRefinementCriterion(selectedRefiner, selectedCriterion)\n );\n } else {\n currentRefinementCriteria = [];\n }\n\n return buildListPageUrl(fullUrl, currentRefinementCriteria);\n };\n\n private _getViewport(): GridSize {\n if (MsDyn365.isBrowser) {\n return isMobile({ variant: VariantType.Browser, context: this.props.context.request });\n }\n return isMobile({ variant: VariantType.Viewport, context: this.props.context.request });\n }\n\n private _toggleModal(): void {\n this.setState({\n modalIsOpen: !this.state.modalIsOpen\n });\n }\n\n private _updateViewport(): void {\n this._viewport = this._getViewport();\n\n if (this.state.modalIsOpen && !this.isMobile) {\n this._toggleModal();\n }\n }\n\n private readonly _getexpandRefinerCount = (validRefiners?: number, refinerCount?: expandRefinersCount): void => {\n switch (refinerCount) {\n case expandRefinersCount.all:\n this.expandrefinerCount = validRefiners;\n break;\n case expandRefinersCount.one:\n this.expandrefinerCount = 1;\n break;\n case expandRefinersCount.two:\n this.expandrefinerCount = 2;\n break;\n case expandRefinersCount.three:\n this.expandrefinerCount = 3;\n break;\n case expandRefinersCount.four:\n this.expandrefinerCount = 4;\n break;\n default:\n this.expandrefinerCount = 0;\n }\n };\n\n /**\n * Renders a Pagination previous text.\n * @param paginationPreviousText - Pagination previous text from resources.\n * @returns Previous text and flipper icon.\n */\n private readonly _renderPrev = (paginationPreviousText: string) => {\n return (\n <div className='msc-pagination__prev'>\n <span className='ms-search-result__pagination-left' aria-hidden='true' />\n <span className='prev-text'>\n {paginationPreviousText}\n </span>\n </div>\n );\n };\n\n /**\n * Renders a Pagination next text.\n * @param paginationNextText - Pagination next text from resources.\n * @returns Next text and flipper icon.\n */\n private readonly _renderNext = (paginationNextText: string) => {\n return (\n <div className='msc-pagination__next'>\n <span className='next-text'>\n {paginationNextText}\n </span>\n <span className='ms-search-result__pagination-right' aria-hidden='true' />\n </div>\n );\n };\n\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { PriceComponent } from '@msdyn365-commerce/components';\nimport { ICoreContext, ITelemetry } from '@msdyn365-commerce/core';\nimport { ICheckoutState, IGiftCardExtend } from '@msdyn365-commerce/global-state';\nimport { Cart, ChannelConfiguration, ChannelDeliveryOptionConfiguration } from '@msdyn365-commerce/retail-proxy';\nimport * as React from 'react';\n\nexport interface IOrderSummaryProps {\n subTotalLabel: string;\n shippingLabel: string;\n taxLabel: string;\n orderTotalLabel: string;\n loyaltyLabel?: string;\n giftcardLabel?: string;\n totalDiscountsLabel: string;\n context: ICoreContext;\n telemetry: ITelemetry;\n cart: Cart;\n channelConfiguration: ChannelConfiguration;\n id: string;\n typeName: string;\n otherChargeLabel?: string;\n freeText?: string;\n toBeCalculatedText?: string;\n checkoutState?: ICheckoutState;\n retailMultiplePickUpOptionEnabled?: boolean;\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n}\n\nexport interface IOrderSummaryLines {\n subtotal: React.ReactNode;\n shipping?: React.ReactNode;\n otherCharge?: React.ReactNode;\n tax: React.ReactNode;\n orderTotal: React.ReactNode;\n totalDiscounts?: React.ReactNode;\n giftCard?: React.ReactNode;\n loyalty?: React.ReactNode;\n}\n\ninterface IOrderSummaryLineProps {\n label: string;\n context: ICoreContext;\n telemetry: ITelemetry;\n price?: number;\n freeText?: string;\n toBeCalculatedText?: string;\n id: string;\n typeName: string;\n cssLabel: string;\n}\n\ninterface IShippingOrderLine {\n cart: Cart;\n channelConfiguration: ChannelConfiguration;\n canShip?: boolean;\n hasDeliveryMethod?: boolean;\n hasShippingMethod?: boolean;\n freightFee?: number;\n}\n\nconst OrderSummaryLine: React.FC<IOrderSummaryLineProps> = ({\n price,\n label,\n context,\n id,\n typeName,\n toBeCalculatedText,\n freeText,\n cssLabel\n}) => {\n return (\n <p className={`msc-order-summary__line-${cssLabel}`}>\n <span className='msc-order-summary__label'>\n {label}\n </span>\n {price || price === 0 ? (\n <PriceComponent\n data={{\n price: { CustomerContextualPrice: price }\n }}\n freePriceText={freeText}\n context={context}\n id={id}\n typeName={typeName}\n className='msc-order-summary__value'\n />\n ) : (\n <span className='msc-order-summary__value'>\n {toBeCalculatedText}\n </span>\n )}\n </p>\n );\n};\n\nconst _buildOrderSummarySection = (\n props: IOrderSummaryProps,\n price: number | undefined,\n cssLabel: string,\n label: string = ''\n): React.ReactNode => {\n return (\n <OrderSummaryLine\n price={price}\n label={label}\n context={props.context}\n id={props.id}\n typeName={props.typeName}\n toBeCalculatedText={props.toBeCalculatedText}\n freeText={props.freeText}\n telemetry={props.telemetry}\n cssLabel={cssLabel}\n />\n );\n};\n\nconst _computedLoyaltyAmount = (checkoutState: ICheckoutState): number => {\n return (checkoutState && checkoutState.loyaltyAmount) || 0;\n};\n\nconst _computeGiftCardAmount = (checkoutState: ICheckoutState, cart: Cart): number => {\n\n const giftCardCounter = (count: number, giftCard: IGiftCardExtend) => {\n return count + (giftCard.Balance || 0);\n };\n const giftCardTotalValue = (checkoutState.giftCardExtends || []).reduce(giftCardCounter, 0);\n const amount = (cart.TotalAmount || 0) - _computedLoyaltyAmount(checkoutState);\n return Math.min(giftCardTotalValue, amount);\n};\n\nconst getDeliveryConfiguration = (cart: Cart, channelConfiguration: ChannelConfiguration, channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration, retailMultiplePickUpOptionEnabled?: boolean): IShippingOrderLine => {\n\n const pickupDeliveryModeCode = channelConfiguration && channelConfiguration.PickupDeliveryModeCode;\n const emailDeliveryModeCode = channelConfiguration && channelConfiguration.EmailDeliveryModeCode;\n const cartLines = cart.CartLines || [];\n const deliveryModes = cartLines.map(cartLine => cartLine.DeliveryMode);\n\n const freightFee = cart.ShippingChargeAmount;\n const canShip = deliveryModes.some(deliveryMode => (!((deliveryMode !== '' && (deliveryMode === getDeliveryMode(deliveryMode, retailMultiplePickUpOptionEnabled, channelDeliveryOptionConfig, pickupDeliveryModeCode) || deliveryMode === emailDeliveryModeCode)))));\n const hasDeliveryMethod = deliveryModes.some(deliveryMode => !!deliveryMode && deliveryMode !== emailDeliveryModeCode);\n const hasShippingMethod = deliveryModes.some(deliveryMode => !!deliveryMode && deliveryMode !== getDeliveryMode(deliveryMode, retailMultiplePickUpOptionEnabled, channelDeliveryOptionConfig, pickupDeliveryModeCode) && deliveryMode !== emailDeliveryModeCode);\n return {\n canShip,\n hasDeliveryMethod,\n hasShippingMethod,\n freightFee\n } as IShippingOrderLine;\n};\n\nconst getDeliveryMode = (deliveryMode?: string, featureSate: boolean = false, channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration, pickupDeliveryMode?: string) => {\n if (!featureSate) {\n return pickupDeliveryMode;\n }\n return channelDeliveryOptionConfig?.PickupDeliveryModeCodes?.find(dM => dM === deliveryMode);\n\n};\n\nexport const OrderSummary = (props: IOrderSummaryProps) => {\n const { SubtotalAmount, TaxAmount, DiscountAmountWithoutTax = 0, TotalAmount, OtherChargeAmount } = props.cart;\n const { canShip, hasDeliveryMethod, hasShippingMethod, freightFee } = getDeliveryConfiguration(props.cart, props.channelConfiguration, props.channelDeliveryOptionConfig, props.retailMultiplePickUpOptionEnabled);\n const isTaxGreaterThanZero = TaxAmount !== undefined && TaxAmount > 0;\n const reactNodes: IOrderSummaryLines = {\n subtotal: _buildOrderSummarySection(props, SubtotalAmount, 'sub-total', props.subTotalLabel),\n tax: _buildOrderSummarySection(props, hasDeliveryMethod || isTaxGreaterThanZero ? TaxAmount : undefined, 'tax-amount', props.taxLabel),\n orderTotal: _buildOrderSummarySection(props, TotalAmount, 'total', props.orderTotalLabel),\n otherCharge: OtherChargeAmount && _buildOrderSummarySection(props, OtherChargeAmount, 'other-charges', props.otherChargeLabel) || undefined\n };\n\n if (canShip) {\n reactNodes.shipping = _buildOrderSummarySection(props, hasShippingMethod ? freightFee : undefined, 'shipping', props.shippingLabel);\n }\n if (props.checkoutState) {\n const giftCardAmount = _computeGiftCardAmount(props.checkoutState, props.cart);\n const loyaltyAmount = _computedLoyaltyAmount(props.checkoutState);\n const totalAmountAfterGiftCard = (TotalAmount || 0) - giftCardAmount - loyaltyAmount;\n\n if (loyaltyAmount > 0) {\n reactNodes.loyalty = _buildOrderSummarySection(props, -loyaltyAmount, 'loyalty', props.loyaltyLabel || 'Loyalty amount');\n }\n\n if (giftCardAmount > 0) {\n reactNodes.giftCard = _buildOrderSummarySection(props, -giftCardAmount, 'gift-card', props.giftcardLabel || 'Gift card amount');\n }\n\n reactNodes.orderTotal = _buildOrderSummarySection({ ...props, freeText: undefined }, totalAmountAfterGiftCard, 'total', props.orderTotalLabel);\n }\n\n if (DiscountAmountWithoutTax > 0) {\n reactNodes.totalDiscounts = _buildOrderSummarySection(props, -DiscountAmountWithoutTax, 'total-discounts', props.totalDiscountsLabel);\n }\n\n return reactNodes;\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport checkoutStateDataAction from './checkout-state-data-action';\n\nexport * from './checkout-state';\nexport * from './checkout-state-data-action';\nexport * from './module-state-manager';\n\nexport { checkoutStateDataAction };\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport * as React from 'react';\n\ninterface IErrorMessage {\n text?: string;\n}\n\nexport const ErrorMessage: React.FC<IErrorMessage> = ({ text }) => {\n return (\n <span className='ms-search-result-container__no-results-message'>\n <h5 className='error-text'>\n {' '}\n {text}\n {' '}\n </h5>\n </span>\n );\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport { CartLine, OrgUnitLocation, ProductDeliveryOptions, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { IStoreSelectorStateManager } from '@msdyn365-commerce-modules/bopis-utilities';\nimport { INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nexport interface IPickUpInStoreViewProps {\n callbacks: {\n toggleBopis(isBopisSelected: boolean): void;\n };\n defaultComponent?: React.ReactNode;\n orgUnitName?: string;\n isBopisSelected: boolean;\n ContainerProps: INodeProps;\n deliveryOption?: string;\n}\n\nexport interface IPickUpInStoreProps {\n cartline: CartLine;\n product: SimpleProduct;\n shipitText: string;\n pickUpInStoreText: string;\n changeStoreText: string;\n cartState: ICartState | undefined;\n storeSelectorStateManager: IStoreSelectorStateManager | undefined;\n orgUnitLocations?: OrgUnitLocation[] | undefined;\n deliveryOptions?: ProductDeliveryOptions;\n pickupDeliveryModeCode?: string;\n storeSelectorModuleId?: string;\n locationChangedHandler(): void;\n}\n\nexport const PickUpInStore = (props: IPickUpInStoreProps): IPickUpInStoreViewProps | undefined => {\n const _onLocationChangedCallback = async (orgUnitLocation: OrgUnitLocation, cartState: ICartState | undefined, cartline: CartLine, deliveryMode?: string) => {\n if (!cartState) {\n return Promise.resolve();\n }\n return cartState.updateCartLinePickupLocation({ cartLineId: cartline.LineId!, location: orgUnitLocation, deliveryMode })\n .then(result => {\n if (result.status === 'SUCCESS') {\n props.locationChangedHandler();\n }\n })\n .catch(error => {});\n };\n\n const _toggleBOPIS = (isBopisSelected: boolean) => {\n const { storeSelectorStateManager, product, cartline, cartState, storeSelectorModuleId } = props;\n\n if (isBopisSelected) {\n if (!storeSelectorStateManager) {\n return;\n }\n storeSelectorStateManager.openDialog({\n id: storeSelectorModuleId,\n product,\n alreadySelectedLocation: {\n OrgUnitNumber: cartline.FulfillmentStoreId\n },\n deliveryOptions: props.deliveryOptions,\n onLocationSelected: async (orgUnitLocation, deliveryMode: string | undefined) => {\n return _onLocationChangedCallback(orgUnitLocation, cartState, cartline, deliveryMode);\n }\n })\n .catch(error => {});\n } else {\n if (!cartState) {\n return;\n }\n cartline.DeliveryMode = '';\n cartline.FulfillmentStoreId = '';\n cartline.ShippingAddress = {};\n cartState.clearCartLinePickupLocation({ cartLineId: cartline.LineId! })\n .then(result => {\n if (result.status === 'SUCCESS') {\n props.locationChangedHandler();\n }\n })\n .catch(error => {});\n }\n };\n\n const _getOrgUnitName = (fulfillmentStoreId: string | undefined, orgUnitLocations: OrgUnitLocation[] | undefined) => {\n if (!orgUnitLocations || !fulfillmentStoreId || orgUnitLocations.length === 0) {\n return '';\n }\n\n const foundLocation = orgUnitLocations.find(orgUnitLocation => {\n return orgUnitLocation.OrgUnitNumber === fulfillmentStoreId;\n });\n\n if (foundLocation) {\n return foundLocation.OrgUnitName;\n }\n return fulfillmentStoreId;\n\n };\n\n const _renderShippingMethod = (\n cartLine: CartLine,\n shipItText: string,\n pickupInStoretext: string,\n changeStoreText: string,\n orgUnitLocations: OrgUnitLocation[] | undefined): JSX.Element => {\n\n const orgUnitName = _getOrgUnitName(cartLine.FulfillmentStoreId, orgUnitLocations);\n const bopisSelected = !!cartLine.FulfillmentStoreId;\n\n const toggleBOPIS = (isBopisSelected: boolean) => {\n return () => {\n _toggleBOPIS(isBopisSelected);\n };\n };\n\n return (\n <>\n <label className='msc-cart-line__bopis-shipping'>\n <input\n id={`ms-cart-bopis-ship-option-${cartLine.LineId}`}\n type='radio'\n name={`shippingType ${cartLine.LineId}`}\n onChange={toggleBOPIS(false)}\n value={shipItText}\n checked={!bopisSelected}\n aria-checked={!bopisSelected}\n key={`${cartLine.LineId}-shipit`}\n />\n {shipItText}\n </label>\n <label className='msc-cart-line__bopis-store-pickup'>\n <input\n id={`ms-cart-bopis-pickup-option-${cartLine.LineId}`}\n type='radio'\n name={`shippingType ${cartLine.LineId}`}\n onChange={toggleBOPIS(true)}\n value={pickupInStoretext}\n checked={bopisSelected}\n aria-checked={bopisSelected}\n key={`${cartLine.LineId}-pickup`}\n />\n {pickupInStoretext}\n </label>\n {\n cartLine.FulfillmentStoreId ? (\n <div className='msc-cart-line__bopis__fullfilment'>\n <span className='msc-cart-line__bopis__fullfilment-store'>\n {orgUnitName}\n </span>\n <button className='msc-cart-line__bopis-changestore btn' onClick={toggleBOPIS(true)}>\n {changeStoreText}\n </button>\n </div>\n ) : null\n }\n </>\n );\n };\n\n const _getDeliveryOption = (pickupStore: IPickUpInStoreProps, deliveryOptions: ProductDeliveryOptions) => {\n const delivery = deliveryOptions?.DeliveryOptions?.find(option => option.Code === pickupStore.pickupDeliveryModeCode);\n return delivery?.Description;\n };\n\n // If no delivery options present on the product, or none of the delivery options\n // match the PickupDeliveryModeCode, that means the item cannot be used for BOPIS\n if (!props.deliveryOptions ||\n !props.deliveryOptions.DeliveryOptions ||\n !props.pickupDeliveryModeCode ||\n !props.deliveryOptions.DeliveryOptions.find(option => option.Code === props.pickupDeliveryModeCode)) {\n return undefined;\n }\n\n return {\n callbacks: {\n toggleBopis: _toggleBOPIS\n },\n defaultComponent: _renderShippingMethod(props.cartline, props.shipitText, props.pickUpInStoreText, props.changeStoreText, props.orgUnitLocations),\n orgUnitName: _getOrgUnitName(props.cartline.FulfillmentStoreId, props.orgUnitLocations),\n isBopisSelected: !!props.cartline.FulfillmentStoreId,\n deliveryOption: _getDeliveryOption(props, props.deliveryOptions),\n ContainerProps: {\n className: 'msc-cart-line__bopis-container'\n }\n };\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport {\n AddToOrderTemplateComponent, AddToWishlistComponent, CartLineItemComponent,\n IAddToOrderTemplateDialogResources, ICartlineResourceString, IDuplicateItemsWhenAddingToOrderTemplateDialogResources,\n IItemAddedToOrderTemplateDialogResources, IOrderTemplateNameDialogResources, IWishlistActionSuccessResult } from '@msdyn365-commerce/components';\nimport MsDyn365, { IAny, ICoreContext, IGeneric, IGridSettings, IImageSettings, ITelemetry, TelemetryEvent } from '@msdyn365-commerce/core';\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport {\n AsyncResult,\n CartLine,\n ChannelDeliveryOptionConfiguration,\n CommerceList,\n Customer,\n LineDataValidationFailure,\n OrgUnitLocation,\n ProductDeliveryOptions,\n SimpleProduct\n} from '@msdyn365-commerce/retail-proxy';\nimport { ProductCatalog, ProductDimensionType, ReleasedProductType } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { IStoreSelectorStateManager } from '@msdyn365-commerce-modules/bopis-utilities';\nimport {\n ArrayExtensions,\n getInvoiceDetailsPageUrlSync,\n getProductUrlSync,\n IProductInventoryInformation,\n ObjectExtensions,\n OrderTemplate\n} from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, getPayloadObject, getTelemetryAttributes, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { getProductByProductId, getProductByProductIdAndWarehouse } from '../../../Common/get-product';\nimport { IPickUpInStoreViewProps, PickUpInStore } from './cart-pick-up-in-store';\n\nexport interface ICartLineItemsProps {\n cartlines: CartLine[];\n cartlinesErrors: LineDataValidationFailure[];\n cartState: ICartState | undefined;\n orgUnitLocations: OrgUnitLocation[] | undefined;\n resources: ICartlineResourceString;\n productAvailabilites: IProductInventoryInformation[] | undefined;\n products: SimpleProduct[] | undefined;\n productDeliveryOptions: ProductDeliveryOptions[] | undefined;\n pickupDeliveryModeCode?: string;\n catalogs?: ProductCatalog[];\n\n /* GridSettings for the product image in cartline */\n gridSettings: IGridSettings;\n\n /* ImageSettings for the product image in cartline */\n imageSettings: IImageSettings;\n id: string;\n typeName: string;\n context: ICoreContext<IGeneric<IAny>>;\n telemetry: ITelemetry;\n removeButtonText: string;\n addToWishlistButtonText: string;\n removeFromWishlistButtonText: string;\n shipItText: string;\n pickitUpText: string;\n changeStoreText: string;\n outOfStockText: string;\n outOfRangeOneText: string;\n outOfRangeFormatText: string;\n storeSelectorStateManager: IStoreSelectorStateManager | undefined;\n isStockCheckEnabled: boolean;\n wishlists: CommerceList[] | undefined;\n defaultWishlistName: string;\n maxCartlineQuantity: number;\n includeErrors?: boolean;\n showShippingChargesForLineItems?: boolean;\n telemetryContent?: ITelemetryContent;\n isQuantityLimitsFeatureEnabled: boolean;\n storeSelectorModuleId?: string;\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n\n addToOrderTemplateDialogResources: IAddToOrderTemplateDialogResources;\n createOrderTemplateDialogResources: IOrderTemplateNameDialogResources;\n itemAddedToOrderTemplateDialogResources: IItemAddedToOrderTemplateDialogResources;\n duplicateItemsWhenAddingToOrderTemplateDialogResources: IDuplicateItemsWhenAddingToOrderTemplateDialogResources;\n\n addToOrderTemplateButtonText: string;\n addToOrderTemplateButtonTooltip: string;\n addToOrderTemplateMessage: string;\n addItemToOrderTemplateError: string;\n orderTemplates: OrderTemplate[] | undefined;\n customerInformation: Customer | undefined;\n shouldIgnoreWarehouse: boolean | undefined;\n productAvailability?: AsyncResult<IProductInventoryInformation[]>;\n\n removeItemClickHandler(cartlineToRemove: CartLine): void;\n moveToWishlistSuccessHandler(result: IWishlistActionSuccessResult, cartlineId: CartLine): void;\n updateCartLinesQuantitySuccessHandler(cartline: CartLine, quantity: number, lineIndex?: number): boolean;\n locationChangedHandler(): void;\n}\n\nexport interface ICartlinesViewProps {\n cartline: React.ReactNode;\n pickUpInStore?: IPickUpInStoreViewProps;\n remove: React.ReactNode;\n addToWishlist: React.ReactNode | undefined;\n addToOrderTemplate: React.ReactNode | undefined;\n\n error?: string;\n cartlineId?: string;\n hasError?: boolean;\n data?: {\n product?: SimpleProduct;\n cartline: CartLine;\n };\n}\n\nconst _getCartItemAvailableQuantity = (isStockCheckEnabled: boolean, productAvailability: IProductInventoryInformation | undefined): number => {\n if (!isStockCheckEnabled ||\n !productAvailability ||\n !productAvailability.ProductAvailableQuantity ||\n !productAvailability.IsProductAvailable ||\n !productAvailability.ProductAvailableQuantity.AvailableQuantity) {\n return 0;\n }\n\n return productAvailability.ProductAvailableQuantity.AvailableQuantity;\n};\n\nconst _getCartItemMaxQuantity = (\n maxQuantityByConfig: number,\n isStockCheckEnabled: boolean,\n availableQuantityInStock: number,\n isQuantityLimitsFeatureEnabled: boolean,\n maxByQuantityLimitsFeature: number) => {\n if (isQuantityLimitsFeatureEnabled) {\n let maxByQuantityLimitsFeatureResult = maxByQuantityLimitsFeature;\n\n // If max by feature in not defined when feature is on then we suggest that there no max by feature\n // and consider available qty if stock check enabled and max from config in site settings.\n if (!maxByQuantityLimitsFeature) {\n maxByQuantityLimitsFeatureResult = maxQuantityByConfig || 10;\n }\n\n return isStockCheckEnabled ? (maxByQuantityLimitsFeatureResult < availableQuantityInStock ? maxByQuantityLimitsFeatureResult : availableQuantityInStock) : maxByQuantityLimitsFeatureResult;\n }\n if (isStockCheckEnabled) {\n return availableQuantityInStock < maxQuantityByConfig ? availableQuantityInStock : maxQuantityByConfig;\n }\n return maxQuantityByConfig;\n\n};\n\nconst _getErrorMessage = (availableQuantityInStock: number, currentQuantity: number,\n props: ICartLineItemsProps, lineIndex: number, shouldSkipStockCheck: boolean, cartLine: CartLine): string | undefined => {\n const finalErrorMessages: string[] = [];\n\n const isLoadingDeliveryOptions = props.productAvailability?.status === 'LOADING';\n if (isLoadingDeliveryOptions) {\n return undefined;\n }\n\n let foundProductAvailability;\n if (props.productAvailabilites && ArrayExtensions.hasElements(props.productAvailabilites)) {\n foundProductAvailability = props.productAvailabilites.find((productAvailability) => {\n if (props.shouldIgnoreWarehouse) {\n return productAvailability.ProductAvailableQuantity.ProductId === cartLine.ProductId;\n }\n return productAvailability.ProductAvailableQuantity.ProductId === cartLine.ProductId &&\n productAvailability.InventLocationId === cartLine.WarehouseId;\n });\n if (foundProductAvailability === undefined) {\n return undefined;\n }\n }\n\n if (props.includeErrors && props.isStockCheckEnabled && !shouldSkipStockCheck) {\n if (availableQuantityInStock <= 0) {\n finalErrorMessages.push(props.outOfStockText);\n } else if (availableQuantityInStock < currentQuantity) {\n if (availableQuantityInStock === 1) {\n finalErrorMessages.push(props.outOfRangeOneText);\n } else {\n finalErrorMessages.push(props.outOfRangeFormatText.replace('{numLeft}', availableQuantityInStock.toString()));\n }\n }\n }\n\n // Server-side validation\n props.cartlinesErrors\n .filter(i => i.LineIndex === lineIndex)\n .forEach(i => {\n if (i.DataValidationFailure?.ErrorContext) {\n finalErrorMessages.push(i.DataValidationFailure.ErrorContext);\n }\n });\n\n if (finalErrorMessages.length > 0) {\n return finalErrorMessages.join(' ');\n }\n\n return undefined;\n};\n\n/**\n * On Remove Click functionality.\n * @param removeItemClickHandler -Remove item click function.\n * @param cartline -CartLine.\n * @returns Remove change value.\n */\nconst onRemoveClickFunction = (removeItemClickHandler: (cartlineToRemove: CartLine) => void, cartline: CartLine) => () => {\n removeItemClickHandler(cartline);\n};\n\n// eslint-disable-next-line complexity -- Auto-suppressed.\nconst _assembleNode = (\n cartline: CartLine,\n product: SimpleProduct | undefined,\n props: ICartLineItemsProps,\n index: number,\n foundProductAvailability?: IProductInventoryInformation,\n foundProductDeliveryOptions?: ProductDeliveryOptions): ICartlinesViewProps => {\n const { imageSettings, gridSettings, id, typeName, context, resources, removeButtonText,\n removeItemClickHandler, moveToWishlistSuccessHandler, addToOrderTemplateButtonText, addToOrderTemplateButtonTooltip,\n addToOrderTemplateDialogResources, createOrderTemplateDialogResources,\n itemAddedToOrderTemplateDialogResources, duplicateItemsWhenAddingToOrderTemplateDialogResources,\n addToWishlistButtonText, removeFromWishlistButtonText, orderTemplates, customerInformation,\n wishlists, defaultWishlistName, storeSelectorModuleId } = props;\n\n const isAuthenticated = context.request.user.isAuthenticated;\n const nameOfWishlist = wishlists && wishlists.length > 0 && wishlists[0].Name ? wishlists[0].Name : defaultWishlistName;\n const availableQuantityInStock = _getCartItemAvailableQuantity(props.isStockCheckEnabled, foundProductAvailability);\n\n const maxQuantity = product && _getCartItemMaxQuantity(\n props.maxCartlineQuantity,\n props.isStockCheckEnabled,\n availableQuantityInStock,\n props.isQuantityLimitsFeatureEnabled,\n product?.Behavior?.MaximumQuantity || 0);\n\n // Skip stock check if the cart line is a service item or an invoice line\n const shouldSkipStockCheck = product?.ItemTypeValue === ReleasedProductType.Service || !!cartline.IsInvoiceLine;\n\n const errorMessage = ObjectExtensions.isNullOrUndefined(maxQuantity) ? undefined : _getErrorMessage(availableQuantityInStock, cartline.Quantity!, props, index, shouldSkipStockCheck, cartline);\n\n const onRemoveClickHandler = onRemoveClickFunction(removeItemClickHandler, cartline);\n\n const payload = getPayloadObject(TelemetryEvent.RemoveFromCart, props.telemetryContent!, removeButtonText, '');\n const attributes = getTelemetryAttributes(props.telemetryContent!, payload);\n\n const inventoryLbl = foundProductAvailability?.StockLevelLabel;\n const inventoryCode = foundProductAvailability ? `ms-cart-line__inventory-code-${foundProductAvailability.StockLevelCode?.toLowerCase()}` : undefined;\n const productDimension = 4;\n const customPriceDimensionType = productDimension as ProductDimensionType.Style;\n const isCustomPriceSelected = product?.Dimensions?.find(dimension => dimension.DimensionTypeValue === customPriceDimensionType)?.DimensionValue?.Value === 'Custom';\n\n let productUrl: string | undefined;\n if (product) {\n productUrl = getProductUrlSync(product, props.context.actionContext, undefined);\n\n if (MsDyn365.isBrowser) {\n const fullUrl = new URL(productUrl, window.location.href);\n fullUrl.searchParams.set('catalogid', `${cartline.CatalogId ?? 0}`);\n productUrl = fullUrl.href;\n }\n } else {\n productUrl = getInvoiceDetailsPageUrlSync(cartline.Description || '', props.context.actionContext);\n }\n\n return {\n data: {\n product,\n cartline\n },\n cartlineId: cartline.LineId,\n error: errorMessage,\n hasError: (!shouldSkipStockCheck && props.isStockCheckEnabled) ? cartline.Quantity! > (maxQuantity ?? 0) : false,\n cartline: (\n <CartLineItemComponent\n data={{\n cartLine: cartline,\n cartState: props.cartState,\n product,\n catalogs: props.catalogs\n }}\n currentQuantity={cartline.Quantity}\n maxQuantity={maxQuantity}\n isOutOfStock={(!shouldSkipStockCheck && props.isStockCheckEnabled) ? (availableQuantityInStock <= 0) : false}\n gridSettings={gridSettings}\n imageSettings={imageSettings}\n id={id}\n typeName={typeName}\n productUrl={productUrl}\n context={context}\n resources={resources}\n key={`${index}-${productUrl}`}\n lineIndex={index}\n isQuantityEditable={!ObjectExtensions.isNullOrUndefined(product)}\n quantityOnChange={props.updateCartLinesQuantitySuccessHandler}\n primaryImageUrl={product?.PrimaryImageUrl}\n errorMessage={errorMessage}\n inventoryInformationLabel={inventoryLbl}\n inventoryLabelClassName={inventoryCode}\n isCartStateReady={props.cartState?.status === 'READY'}\n showShippingChargesForLineItems={props.showShippingChargesForLineItems}\n telemetryContent={props.telemetryContent}\n channelDeliveryOptionConfig={props.channelDeliveryOptionConfig}\n />),\n pickUpInStore: product ? (\n PickUpInStore({\n storeSelectorModuleId,\n cartState: props.cartState,\n cartline,\n product,\n shipitText: props.shipItText,\n pickUpInStoreText: props.pickitUpText,\n changeStoreText: props.changeStoreText,\n storeSelectorStateManager: props.storeSelectorStateManager,\n orgUnitLocations: props.orgUnitLocations,\n deliveryOptions: foundProductDeliveryOptions,\n pickupDeliveryModeCode: cartline.DeliveryMode !== (undefined || '') ? cartline.DeliveryMode : props.pickupDeliveryModeCode,\n locationChangedHandler: props.locationChangedHandler\n })\n ) : undefined,\n remove: (\n <Button\n className='msc-cart-line__remove-item'\n onClick={onRemoveClickHandler}\n title={removeButtonText}\n {...attributes}\n >\n {removeButtonText}\n </Button>\n ),\n addToWishlist: (\n isAuthenticated && product && !isCustomPriceSelected ? (\n <AddToWishlistComponent\n className='msc-cart-line__add-to-wishlist'\n addToWishlistButtonText={addToWishlistButtonText}\n removeFromWishlistButtonText={removeFromWishlistButtonText}\n context={context}\n id={id}\n key={cartline.LineId}\n typeName={typeName}\n nameOfWishlist={nameOfWishlist}\n cartline={cartline}\n showButtonText\n showStatusMessage={false}\n showRemoveButton={false}\n showButtonTooltip={false}\n ariaRole='button'\n data={{\n wishlists,\n product\n }}\n onSuccess={moveToWishlistSuccessHandler}\n />\n ) : undefined\n ),\n addToOrderTemplate: (\n isAuthenticated && orderTemplates && product ? (\n <AddToOrderTemplateComponent\n className={classnames('msc-cart-line__add-to-order-template', isCustomPriceSelected ? 'disabled' : '')}\n addToOrderTemplateButtonText={addToOrderTemplateButtonText}\n addToOrderTemplateButtonTooltip={addToOrderTemplateButtonTooltip}\n addToOrderTemplateDialogResources={addToOrderTemplateDialogResources}\n createOrderTemplateDialogResources={createOrderTemplateDialogResources}\n itemAddedToOrderTemplateDialogResources={itemAddedToOrderTemplateDialogResources}\n duplicateItemsWhenAddingToOrderTemplateDialogResources={duplicateItemsWhenAddingToOrderTemplateDialogResources}\n data={{ product, quantity: cartline.Quantity || 1, orderTemplates, customerInformation }}\n context={context}\n showButtonText\n shouldShowButtonFailedTooltip={isCustomPriceSelected}\n disableButton={isCustomPriceSelected}\n id={id}\n typeName={typeName}\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- App config settings are of \"any\" value\n showButtonTooltip={!props.context.app.config.disableTooltip || false}\n />\n ) : undefined\n )\n };\n};\n\nexport const assembleCartlines = (\n cartlines: CartLine[],\n products: SimpleProduct[] | undefined,\n props: ICartLineItemsProps): ICartlinesViewProps[] | null => {\n const reactNodes: ICartlinesViewProps[] = [];\n\n cartlines.map((cartline, index) => {\n let product;\n if (props.isQuantityLimitsFeatureEnabled) {\n // When feature is enabled the same products could have different quantity limits in Behavior so we need\n // to check productId and WarehouseId for identification.\n product = getProductByProductIdAndWarehouse(cartline.ProductId, products, cartline.WarehouseId, props.cartState);\n } else {\n product = getProductByProductId(cartline.ProductId, products);\n }\n let foundProductAvailability;\n if (props.productAvailabilites && ArrayExtensions.hasElements(props.productAvailabilites)) {\n foundProductAvailability = props.productAvailabilites.find((productAvailability) => {\n if (props.shouldIgnoreWarehouse) {\n return productAvailability.ProductAvailableQuantity?.ProductId === cartline.ProductId;\n }\n return productAvailability.ProductAvailableQuantity?.ProductId === cartline.ProductId &&\n productAvailability.InventLocationId === cartline.WarehouseId;\n });\n }\n let foundProductDeliveryOption;\n if (props.productDeliveryOptions && props.productDeliveryOptions.length > 0) {\n foundProductDeliveryOption = props.productDeliveryOptions.find((deliveryOption) => {\n return deliveryOption && deliveryOption.ProductId === cartline.ProductId;\n });\n }\n reactNodes.push(_assembleNode(cartline, product, props, index, foundProductAvailability, foundProductDeliveryOption));\n });\n\n return reactNodes;\n};\n\n/**\n * CartLineItems component.\n * @param props\n */\nexport const CartLineItems = (props: ICartLineItemsProps) => {\n const { products, cartlines } = props;\n return (\n assembleCartlines(cartlines, products, props)\n );\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { CartLine, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport groupBy from 'lodash/groupBy';\n\nimport { assembleCartlines, ICartLineItemsProps, ICartlinesViewProps } from './cart-line-items';\n\nconst _assembleGroupCartlines = (cartlines: CartLine[], products: SimpleProduct[] | undefined, props: ICartLineItemsProps): ICartlinesViewProps[][] | null => {\n const reactNodes: ICartlinesViewProps[][] = [];\n if (!products || products.length === 0) {\n props.context.telemetry.error('Products content is empty, module wont render');\n return null;\n }\n\n const getGroupByStorePickup = (items: CartLine[]) => groupBy(items, item => item.FulfillmentStoreId);\n const getGroupByDelivery = (items: CartLine[]) => groupBy(items, item => (item.DeliveryMode));\n const groupDelivery = getGroupByDelivery(cartlines);\n const cartLinesGroup: CartLine[] = [];\n\n // 1) Group by store and pick up mode\n Object.entries(groupDelivery).forEach(([deliveryType, groupByDeliveryType]) => {\n // @ts-expect-error\n groupDelivery[deliveryType] = getGroupByStorePickup(groupByDeliveryType);\n cartLinesGroup.push(getGroupByStorePickup(groupByDeliveryType));\n });\n\n // 2) Create cartlines group\n Object.keys(cartLinesGroup).forEach(key => {\n const cartLines = cartLinesGroup[key];\n Object.keys(cartLines).forEach(index => {\n const cartLine = cartLines[index];\n const carLineViewProps = assembleCartlines(cartLine, products, props);\n if (carLineViewProps !== null) {\n reactNodes.push(carLineViewProps);\n }\n });\n\n });\n\n return reactNodes;\n};\n\n/**\n * CartLine Group component.\n * @param props\n */\nexport const CartLineGroupItems = (props: ICartLineItemsProps) => {\n const { products, cartlines } = props;\n return (\n _assembleGroupCartlines(cartlines, products, props)\n );\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport { CartPromotionLine } from '@msdyn365-commerce/retail-proxy';\nimport { getPromotionOptionsForCartLineItems, PromotionOptionsForCartLineItems } from '@msdyn365-commerce-modules/retail-actions';\n\n/**\n * IPromotionData entity interface.\n */\nexport interface IPromotionData {\n promotionOptions?: CartPromotionLine[];\n}\n\n/**\n * Calls the Retail API and returns a promotion data.\n * @param ctx\n */\nexport async function getPromotionData(ctx: IActionContext): Promise<IPromotionData> {\n const promotionData: IPromotionData = {};\n\n await getPromotionOptionsForCartLineItems(\n new PromotionOptionsForCartLineItems(ctx.requestContext.apiSettings),\n ctx\n ).then(promotionOptions => {\n if (promotionOptions) {\n promotionData.promotionOptions = promotionOptions;\n }\n })\n .catch(error => {\n ctx.telemetry.exception(error);\n return {};\n });\n\n return promotionData;\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport {\n IAddToOrderTemplateDialogResources, IDuplicateItemsWhenAddingToOrderTemplateDialogResources,\n IItemAddedToOrderTemplateDialogResources, ILinesAddedToOrderTemplateDialogResources, IOrderTemplateNameDialogResources,\n IWishlistActionSuccessResult, PromoCodeComponent, SaveCartToOrderTemplateComponent } from '@msdyn365-commerce/components';\nimport MsDyn365, { getUrlSync, IImageSettings } from '@msdyn365-commerce/core';\nimport { ICartActionResult, ICartState } from '@msdyn365-commerce/global-state';\nimport { AsyncResult, CartLine, LineDataValidationFailure } from '@msdyn365-commerce/retail-proxy';\nimport { ReleasedProductType } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { cartLineQuantityUpdatedAsync, validateCartAsync } from '@msdyn365-commerce-modules/cart-utilities';\nimport { IInvoiceSummaryLines, InvoiceSummary } from '@msdyn365-commerce-modules/invoice-payment-summary';\nimport { IOrderSummaryLines, OrderSummary } from '@msdyn365-commerce-modules/order-summary-utilities';\nimport {\n ActiveCartProductsInput,\n ArrayExtensions,\n getActiveCartProductsAction,\n ICartLineInventoryValidationResult,\n ObjectExtensions,\n validateCartLinesInventory } from '@msdyn365-commerce-modules/retail-actions';\nimport { Alert, Button, getPayloadObject, getTelemetryAttributes, getTelemetryObject, INodeProps, IPayLoad,\n ITelemetryContent, TelemetryConstant, Waiting } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { reaction } from 'mobx';\nimport { observer } from 'mobx-react';\nimport React from 'react';\n\nimport { ICartData } from './cart.data';\nimport { ICartProps, ICartResources } from './cart.props.autogenerated';\nimport { CartLineGroupItems } from './components/cart-line-groups';\nimport { CartLineItems, ICartlinesViewProps } from './components/cart-line-items';\nimport { cartPromotions, ICartLineItemViewProps } from './components/cart-line-items-promotion';\nimport { getPromotionData, IPromotionData } from './utils/get-promotion-in-cart';\n\n/**\n * Cart view props interface.\n */\nexport interface ICartViewProps extends ICartProps<ICartData> {\n className: string;\n title?: React.ReactNode;\n CartlinesWrapper: INodeProps;\n cartlines?: ICartlinesViewProps[];\n cartLinesGroup?: ICartlinesViewProps[][];\n cart: ICartState | undefined;\n orderSummaryHeading: React.ReactNode;\n orderSummaryLineitems?: IOrderSummaryLines;\n invoiceSummaryLineitems?: IInvoiceSummaryLines;\n OrderSummaryWrapper: INodeProps;\n OrderSummaryItems: INodeProps;\n OrderSummaryErrors?: IOrderSummaryErrors;\n checkoutAsGuestButton: React.ReactNode;\n checkoutAsSignInUserButton: React.ReactNode;\n storeSelector?: React.ReactNode;\n expressCheckoutButton?: React.ReactNode;\n backToShoppingButton: React.ReactNode;\n waitingComponent: React.ReactNode;\n promotionOptions?: ICartLineItemViewProps;\n promoCode: React.ReactNode;\n cartLoadingStatus: string;\n cartDataResult: boolean;\n multiplePickUpEnabled?: boolean;\n createTemplateFromCartButton: React.ReactNode;\n telemetryContent?: ITelemetryContent;\n removeItemClickHandler(cartlineToRemove: CartLine): void;\n moveToWishlistSuccessHandler(result: IWishlistActionSuccessResult, cartlineId: CartLine): void;\n}\n\n/**\n * Order summary errors interface.\n */\nexport interface IOrderSummaryErrors {\n Wrapper: INodeProps;\n header: React.ReactNode;\n errors: React.ReactNode[];\n}\n\n/**\n * Cart component state interface.\n */\ninterface ICartComponentState {\n showPromotionDialog: boolean;\n cartlinesErrors: LineDataValidationFailure[];\n promotionData: IPromotionData;\n isCartValid: boolean;\n}\n\n/**\n * Cart component.\n * @extends {React.PureComponent<ICartProps<ICartData>>}\n */\n@observer\nclass Cart extends React.Component<ICartProps<ICartData>> {\n\n public state: ICartComponentState;\n\n private readonly telemetryContent: ITelemetryContent;\n\n private readonly payLoad: IPayLoad;\n\n private isQuantityLimitsFeatureEnabled: boolean = false;\n\n private _isMounted: boolean = false;\n\n private readonly promotionPopupId: string = 'cart-promotion-popup';\n\n public constructor(props: ICartProps<ICartData>) {\n super(props);\n this.telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!, this.props.friendlyName, this.props.telemetry);\n this.payLoad = getPayloadObject('click', this.telemetryContent, '');\n this.promotionLinkClick = this.promotionLinkClick.bind(this);\n this.promotionCloseButtonclick = this.promotionCloseButtonclick.bind(this);\n this.state = {\n cartlinesErrors: [],\n showPromotionDialog: false,\n promotionData: {},\n isCartValid: true\n };\n }\n\n /**\n * Component did mount function.\n */\n public async componentDidMount(): Promise<void> {\n this._isMounted = true;\n const {\n config,\n context: {\n actionContext\n }\n } = this.props;\n\n this.isQuantityLimitsFeatureEnabled = await this.getOrderQuantityLimitsFeatureFlag();\n if (this.isQuantityLimitsFeatureEnabled) {\n await this.validateCart();\n }\n\n if (config.showAvailablePromotions) {\n if (this._isMounted && this.props.data.cart.result?.cart.CartLines) {\n this.setState({ promotionData: await getPromotionData(actionContext) });\n }\n\n reaction(\n () => this.props.data.cart.result?.cart.CartLines,\n async () => {\n if (this._isMounted) {\n this.setState({ promotionData: await getPromotionData(actionContext) });\n }\n }\n );\n }\n }\n\n /**\n * Component will unmount function.\n */\n public componentWillUnmount(): void {\n this._isMounted = false;\n }\n\n /**\n * Should component update function.\n * @param nextProps - Next props.\n * @param nextState - Next state.\n * @returns True if component should update, false otherwise.\n */\n public shouldComponentUpdate(nextProps: ICartProps<ICartData>,\n nextState: ICartComponentState): boolean {\n if (this.state === nextState && this.props.data === nextProps.data) {\n return false;\n }\n return true;\n }\n\n /* eslint-disable complexity -- Disabling complexity for render method */\n public render(): JSX.Element | null {\n const {\n data: {\n cart: { result: cart },\n products: { result: products }\n },\n context: {\n request: {\n user: {\n isAuthenticated,\n signInUrl\n }\n }\n },\n resources\n } = this.props;\n\n const guestCheckoutUrl = getUrlSync('checkout', this.props.context.actionContext) || '';\n const backToShoppingUrl = getUrlSync('home', this.props.context.actionContext) || '';\n const checkoutURL = this.getCheckoutURL(isAuthenticated, guestCheckoutUrl, signInUrl || '');\n const isCartEmpty = cart && cart.cart.CartLines && cart.cart.CartLines.length === 0;\n const cartLines = this._getCartLines();\n const emailDeliveryModeCode = this.props.context.request.channel?.EmailDeliveryModeCode;\n const validInventoryAcrossCartLines = validateCartLinesInventory(\n cart?.cart.CartLines ?? [],\n this.props.data.productAvailabilites.result ?? [],\n this.props.context.actionContext,\n products ?? [],\n emailDeliveryModeCode);\n\n const hasError = !validInventoryAcrossCartLines?.isValid || !validInventoryAcrossCartLines && !this.state.isCartValid || (cartLines ? cartLines.some(cartline => cartline.hasError) : false);\n const RetailMultiplePickupFeatureState = this.props.data.featureState.result?.find(featureState => featureState.Name === 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature');\n const multiplePickUpEnabled = !cart?.hasInvoiceLine && RetailMultiplePickupFeatureState?.IsEnabled;\n const cartLinesGroup = multiplePickUpEnabled ? this.getCartLinesGroup() : null;\n this.payLoad.contentAction.etext = TelemetryConstant.Checkout;\n const checkoutBySignInAttributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\n this.payLoad.contentAction.etext = TelemetryConstant.GuestCheckout;\n const checkoutByGuestAttributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\n this.payLoad.contentAction.etext = TelemetryConstant.BackToShopping;\n const backtoShoppingAttributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\n\n // If there's inventory issues across multiple cart lines then update the error and display as part of the order summary\n if (validInventoryAcrossCartLines && !validInventoryAcrossCartLines.isValid) {\n if (multiplePickUpEnabled && cartLinesGroup !== null) {\n for (const cartLineGroup of cartLinesGroup) {\n this._updateCartLineErrorForInvalidInventory(cartLineGroup, validInventoryAcrossCartLines);\n }\n }\n\n this._updateCartLineErrorForInvalidInventory(cartLines, validInventoryAcrossCartLines);\n }\n\n const viewProps = {\n ...this.props,\n className: classnames('ms-cart'),\n title: <h1 className='msc-cart__heading'>\n {resources.cartTitle}\n </h1>,\n cart: this.props.data.cart.result,\n CartlinesWrapper: { className: 'msc-cartline-wraper' },\n OrderSummaryWrapper: { className: cart?.hasInvoiceLine ? 'msc-invoice-summary-wrapper' : 'msc-order-summary-wrapper' },\n OrderSummaryItems: { className: cart?.hasInvoiceLine ? 'msc-invoice-summary__items' : 'msc-order-summary__items' },\n cartlines: cartLines,\n cartLinesGroup,\n promoCode: this._getPromoCode(),\n promotionOptions: this._getPromotions(),\n context: this.props.context,\n typeName: this.props.typeName,\n telemetry: this.props.telemetry,\n id: this.props.id,\n multiplePickUpEnabled,\n removePromoAriaLabelFormat: resources.removePromoAriaLabelFormat,\n orderSummaryHeading: ArrayExtensions.hasElements(cart?.cart.CartLines) ? (\n cart?.hasInvoiceLine ? <h2 className='msc-invoice-summary__heading'>\n { resources.invoiceSummaryTitle }\n </h2> : <h2 className='msc-order-summary__heading'>\n { resources.orderSummaryTitle}\n </h2>\n ) : null,\n orderSummaryLineitems: this._getOrderSummaryLineItems(),\n invoiceSummaryLineitems: this._getInvoiceSummaryLineItems(),\n checkoutAsSignInUserButton: (!isCartEmpty) ? (\n <Button\n disabled={hasError} className='msc-cart__btn-checkout' href={checkoutURL}\n title={resources.checkoutButtonTitle} {...checkoutBySignInAttributes} >\n {resources.checkoutButtonTitle}\n </Button>\n ) : null,\n checkoutAsGuestButton: (!isCartEmpty && !isAuthenticated) ? (\n <Button\n disabled={hasError} className='msc-cart__btn-guestcheckout' href={guestCheckoutUrl}\n title={resources.guestCheckoutButtonTitle} {...checkoutByGuestAttributes}>\n {resources.guestCheckoutButtonTitle}\n </Button>\n ) : null,\n expressCheckoutButton: !isCartEmpty ? (this.props.slots.paymentExpress) : null,\n backToShoppingButton: <Button\n className='msc-cart__btn-backtoshopping' {...backtoShoppingAttributes} href={backToShoppingUrl}\n title={resources.backToShoppingButtonTitle}>\n {resources.backToShoppingButtonTitle}\n </Button>,\n createTemplateFromCartButton: (this._displayAddCartToTemplate() && products) ? (\n <SaveCartToOrderTemplateComponent\n addToOrderTemplateDialogResources={this._generateAddToOrderTemplateDialogResources(resources)}\n createOrderTemplateDialogResources={this._generateOrderTemplateNameDialogResources(resources)}\n linesAddedToOrderTemplateDialogResources={this._generateLinesAddedToOrderTemplateDialogResources(resources)}\n createOrderTemplateFromCartButton={resources.createOrderTemplateFromCartButton}\n createOrderTemplateFromCartButtonTooltip={resources.createOrderTemplateFromCartButtonTooltip}\n context={this.props.context}\n id={this.props.id}\n typeName={this.props.typeName}\n data={{\n orderTemplates: this.props.data.orderTemplates.result!,\n cartLines: this.props.data.cart.result!.cart.CartLines!,\n customerInformation: this.props.data.customerInformation.result\n }}\n />\n ) : null,\n storeSelector: this.props.slots.storeSelector && this.props.slots.storeSelector.length > 0 ? this.props.slots.storeSelector[0] : null,\n removeItemClickHandler: this.removeItemFromCartHandler,\n moveToWishlistSuccessHandler: this.moveToWishlistSuccessHandler,\n waitingComponent: <Waiting className='msc-waiting-circular msc-waiting-lg' />,\n cartLoadingStatus: this.props.data.cart.status === 'FAILED' ? this.props.resources.cartLoadingErrorMessage : null,\n cartDataResult: this.props.data.cart.result && this.props.data.cart.result.isEmpty,\n OrderSummaryErrors: this._getOrderSummaryErrors(cartLines),\n telemetryContent: this.telemetryContent\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n /* eslint-enable complexity -- Disabling complexity for render method */\n\n /**\n * Promotion click event handler.\n * @param event - The mouse event.\n */\n private readonly promotionLinkClick = (event: React.MouseEvent<HTMLElement, MouseEvent>) => {\n this.setState({\n showPromotionDialog: !this.state.showPromotionDialog\n });\n };\n\n /**\n * Promotion close button click.\n */\n private readonly promotionCloseButtonclick = () => {\n this._hidePromotionDialog();\n };\n\n /**\n * Hide promotion dialog.\n */\n private _hidePromotionDialog(): void {\n this.setState({\n showPromotionDialog: false\n });\n }\n\n /**\n * Display add to cart template.\n * @returns True if should display, false otherwise.\n */\n private _displayAddCartToTemplate(): boolean {\n const cart = this.props.data.cart?.result;\n if (ObjectExtensions.isNullOrUndefined(cart) || cart.hasInvoiceLine) {\n return false;\n }\n\n const RetailB2BEcommerceFeatureState = this.props.data.featureState.result?.find(featureState => featureState.Name === 'Dynamics.AX.Application.RetailB2BEcommerceFeature');\n if (RetailB2BEcommerceFeatureState?.IsEnabled && this.props.data.customerInformation.result?.IsB2b && this.props.data.orderTemplates.result &&\n ArrayExtensions.hasElements(cart.cart?.CartLines) && this.props.data.customerInformation.result) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Get promotions.\n * @returns React node with the promotions.\n */\n private _getPromotions(): React.ReactNode {\n return (\n this.props.config.showAvailablePromotions &&\n cartPromotions({\n id: this.promotionPopupId,\n showPromotionPopup: this.state.showPromotionDialog,\n onSeeAllClick: this.promotionLinkClick,\n onCloseButtonClick: this.promotionCloseButtonclick,\n promotions: this.state.promotionData.promotionOptions,\n resources: {\n promotionStringHeading: this.props.resources.promotionStringHeading,\n promotionLinkText: this.props.resources.promotionLinkText,\n promotionPopupHeading: this.props.resources.promotionPopupHeading,\n promotionCloseButtonAriaLabel: this.props.resources.promotionCloseButtonAriaLabel\n }\n })\n );\n }\n\n /**\n * Add error message in cart line in case the quantity exceeds the current inventory.\n * @param cartLines - The cart lines.\n * @param cartLineInventoryValidationResult - The cart line inventory result.\n */\n private _updateCartLineErrorForInvalidInventory(\n cartLines: ICartlinesViewProps[] | null, cartLineInventoryValidationResult: ICartLineInventoryValidationResult) {\n const { resources } = this.props;\n\n if (ArrayExtensions.hasElements(cartLines) &&\n !cartLineInventoryValidationResult.isValid &&\n ArrayExtensions.hasElements(cartLineInventoryValidationResult.productIdWithErrors)) {\n\n for (const productIdWithError of cartLineInventoryValidationResult.productIdWithErrors) {\n const cartLine = cartLines.find(element => element.data?.cartline.ProductId === productIdWithError);\n if (cartLine) {\n cartLine.error = resources.outOfStockErrorMessage;\n cartLine.hasError = true;\n }\n }\n }\n }\n\n /**\n * Get order summary errors.\n * @param cartLines - The cart lines.\n * @returns Order summary errors.\n */\n private _getOrderSummaryErrors(cartLines: ICartlinesViewProps[] | null): IOrderSummaryErrors | undefined {\n const allErrors = cartLines && cartLines.map(cartline => {\n\n // Check if the product is service or not by product type\n const isServiceItem = cartline.data?.product?.ItemTypeValue === ReleasedProductType.Service;\n\n if (!isServiceItem && cartline.error) {\n const fullError = (cartline.data && cartline.data.product?.Name) ? `${cartline.data.product.Name}: ${cartline.error}` : cartline.error;\n\n return (\n <div className='msc-alert__line'>\n {fullError}\n </div>\n );\n }\n\n return null;\n }).filter((line): line is JSX.Element => !!line) || [];\n\n return {\n Wrapper: {\n tag: Alert,\n className: 'msc-alert',\n isOpen: allErrors.length > 0,\n color: 'danger',\n assertive: true,\n 'aria-label': this.props.resources.outOfStockErrorMessageHeader\n },\n header: (\n <div className='msc-alert__header' aria-hidden='true'>\n <span className='msi-exclamation-triangle' />\n <span>\n {this.props.resources.outOfStockErrorMessageHeader}\n </span>\n </div>\n ),\n errors: allErrors\n };\n }\n\n /**\n * Gets invoice summary line items.\n * @returns Invoice summary lines.\n */\n private _getInvoiceSummaryLineItems(): IInvoiceSummaryLines | undefined {\n const {\n data: {\n cart: { result: cart }\n },\n telemetry,\n resources\n } = this.props;\n\n return cart?.hasInvoiceLine ? (\n InvoiceSummary({\n orderTotalLabel: resources.totalAmountLabel,\n invoiceLabel: resources.invoiceLabel,\n cart: cart.cart,\n context: this.props.context,\n typeName: this.props.typeName,\n telemetry,\n id: this.props.id\n })\n ) : undefined;\n }\n\n /**\n * Gets order summary line items.\n * @returns Order summary lines.\n */\n private _getOrderSummaryLineItems(): IOrderSummaryLines | undefined {\n const {\n data: {\n cart: { result: cart },\n channelDeliveryOptionConfig\n },\n telemetry,\n resources\n } = this.props;\n\n const channelConfiguration = this.props.context && this.props.context.request && this.props.context.request.channel;\n const multiplePickupStoreSwitchName = 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature';\n const featureState = this.props?.data?.featureState;\n const retailMultiplePickUpOptionEnabled = featureState?.result?.find(item => item.Name === multiplePickupStoreSwitchName)?.IsEnabled;\n\n return channelConfiguration && ArrayExtensions.hasElements(cart?.cart.CartLines) && !cart?.hasInvoiceLine ? (\n OrderSummary({\n cart: cart!.cart,\n subTotalLabel: resources.itemsWithCountLabel,\n shippingLabel: resources.estimatedShippingLabel,\n otherChargeLabel: resources.otherCharges,\n taxLabel: resources.estimatedTaxLabel,\n orderTotalLabel: resources.orderTotal,\n totalDiscountsLabel: resources.totalDiscountsLabel,\n context: this.props.context,\n typeName: this.props.typeName,\n id: this.props.id,\n toBeCalculatedText: resources.yetToBeCalculatedText,\n freeText: resources.priceFree,\n channelConfiguration,\n retailMultiplePickUpOptionEnabled,\n channelDeliveryOptionConfig: channelDeliveryOptionConfig?.result,\n telemetry\n })\n ) : undefined;\n }\n\n /**\n * Gets promo code.\n * @returns React node with the promo code.\n */\n private _getPromoCode(): React.ReactNode {\n const {\n data: {\n cart: { result: cart }\n },\n resources\n } = this.props;\n\n return cart && (\n <PromoCodeComponent\n cart={cart}\n promoCodeHeadingText={resources.promoCodeHeadingText}\n promoPlaceholderText={resources.promoPlaceholderText}\n promoCodeApplyButtonText={resources.promoCodeApplyButtonText}\n appliedPromoCodeHeadingText={resources.appliedPromoCodeHeadingText}\n collapseTimeOut={350}\n removePromoAriaLabelFormat={resources.removePromoAriaLabelFormat}\n removePromoText={resources.removePromoText}\n invalidPromoCodeErrorText={resources.invalidPromoCodeErrorText}\n failedToAddPromoCodeErrorText={resources.failedToAddPromoCodeErrorText}\n failedToRemovePromoCodeErrorText={resources.failedToRemovePromoCodeErrorText}\n duplicatePromoCodeErrorText={resources.duplicatePromotionErrorText}\n context={this.props.context}\n id={this.props.id}\n typeName={this.props.typeName}\n data={{}}\n telemetryContent={this.telemetryContent}\n />\n );\n }\n\n /**\n * Generate add to order template dialog resources.\n * @param resources - The resources.\n * @returns IAddToOrderTemplateDialogResources.\n */\n private _generateAddToOrderTemplateDialogResources(resources: ICartResources): IAddToOrderTemplateDialogResources {\n return {\n addToOrderTemplateHeader: resources.addToOrderTemplateHeader,\n\n noOrderTemplatesMessage: resources.noOrderTemplatesMessage,\n noOrderTemplatesDescription: resources.noOrderTemplatesDescription,\n\n createAnOrderTemplateButtonText: resources.createAnOrderTemplateButtonText,\n createNewOrderTemplateButtonText: resources.createNewOrderTemplateButtonText,\n cancelOrderTemplateCreationButtonText: resources.cancelOrderTemplateCreationButtonText,\n\n selectTemplatesText: resources.selectTemplatesText,\n addToTemplateButtonText: resources.addToTemplateButtonText,\n lineItemsText: resources.lineItemsText\n };\n }\n\n /**\n * Generate item added to order template dialog resources.\n * @param resources - The resources.\n * @returns IItemAddedToOrderTemplateDialogResources.\n */\n private _generateItemAddedToOrderTemplateDialogResources(resources: ICartResources): IItemAddedToOrderTemplateDialogResources {\n return {\n viewOrderTemplateButtonText: resources.viewOrderTemplateButtonText,\n continueShoppingButtonText: resources.continueShoppingButtonText,\n itemAddedToOrderTemplateHeaderItemOneText: resources.itemAddedToOrderTemplateHeaderItemOneText,\n itemAddedToOrderTemplateHeaderItemFormatText: resources.itemAddedToOrderTemplateHeaderItemFormatText,\n itemAddedToOrderTemplateHeaderMessageText: resources.itemAddedToOrderTemplateHeaderMessageText,\n freePriceText: resources.freePriceText,\n originalPriceText: resources.originalPriceText,\n currentPriceText: resources.currentPriceText\n };\n }\n\n /**\n * Generate lines added to order template dialog resources.\n * @param resources - The resources.\n * @returns ILinesAddedToOrderTemplateDialogResources.\n */\n private _generateLinesAddedToOrderTemplateDialogResources(resources: ICartResources): ILinesAddedToOrderTemplateDialogResources {\n return {\n viewOrderTemplateButtonText: resources.viewOrderTemplateButtonText,\n continueShoppingButtonText: resources.continueShoppingButtonText,\n linesAddedToOrderTemplateHeaderItemsOneText: resources.linesAddedToOrderTemplateHeaderItemsOneText,\n linesAddedToOrderTemplateHeaderItemsFormatText: resources.linesAddedToOrderTemplateHeaderItemsFormatText,\n linesAddedToOrderTemplateHeaderLinesOneText: resources.linesAddedToOrderTemplateHeaderLinesOneText,\n linesAddedToOrderTemplateHeaderLinesFormatText: resources.linesAddedToOrderTemplateHeaderLinesFormatText,\n linesAddedToOrderTemplateHeaderMessageText: resources.linesAddedToOrderTemplateHeaderMessageText,\n linesAddedToOrderTemplateCustomPriceAlertMessageText: resources.linesAddedToOrderTemplateCustomPriceAlertMessageText\n };\n }\n\n /**\n * Generate duplicate items when adding to order template dialog resources.\n * @param resources - The resources.\n * @returns IDuplicateItemsWhenAddingToOrderTemplateDialogResources.\n */\n private _generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(resources: ICartResources): IDuplicateItemsWhenAddingToOrderTemplateDialogResources {\n return {\n duplicatedProductsHeader: resources.duplicatedProductsHeader,\n duplicatedProductsDescription: resources.duplicatedProductsDescription,\n updateQuantityButtonText: resources.updateQuantityButtonText,\n cancelDuplicateItemsButtonText: resources.cancelDuplicateItemsButtonText\n };\n }\n\n /**\n * Generate order template name dialog resources.\n * @param resources - The resources.\n * @returns IOrderTemplateNameDialogResources.\n */\n private _generateOrderTemplateNameDialogResources(resources: ICartResources): IOrderTemplateNameDialogResources {\n return {\n orderTemplateHeaderLabel: resources.createOrderTemplateHeader,\n orderTemplateTitleLabel: resources.orderTemplateTitle,\n orderTemplateNameAriaLabel: resources.orderTemplateNameAriaLabel,\n orderTemplateDescription: resources.createOrderTemplateDescription,\n\n defaultOrderTemplateName: resources.defaultOrderTemplateName,\n\n orderTemplateButtonLabel: resources.createOrderTemplateButtonText,\n orderTemplateCancelButtonLabel: resources.cancelNewOrderTemplateCreationButtonText\n };\n }\n\n /**\n * Gets the cart lines view props.\n * @returns ICartlinesViewProps [].\n */\n private _getCartLines(): ICartlinesViewProps[] | null {\n const {\n data: {\n cart: { result: cart },\n wishlists: { result: wishlists },\n orderTemplates: { result: orderTemplates },\n customerInformation: { result: customerInformation }\n },\n context: {\n request: {\n channel: {\n PickupDeliveryModeCode\n } = { PickupDeliveryModeCode: undefined }\n }\n },\n config,\n telemetry,\n resources,\n modules\n } = this.props;\n\n const imageSettings = this.getImageSettings(config.imageSettings);\n\n const cartlinesErrors: LineDataValidationFailure[] = this.state.cartlinesErrors;\n let storeSelectorId: string = '';\n if (modules && Object.keys(modules).length > 0 && modules.storeSelector && modules.storeSelector.length > 0) {\n storeSelectorId = modules.storeSelector[0].id;\n }\n return ArrayExtensions.hasElements(cart?.cart.CartLines) ? (\n CartLineItems({\n cartlines: cart!.cart.CartLines,\n storeSelectorModuleId: storeSelectorId,\n cartlinesErrors,\n products: this.props.data.products.result,\n productAvailabilites: this.props.data.productAvailabilites.result,\n productDeliveryOptions: this.props.data.deliveryOptions.result,\n catalogs: this.props.data.catalogs?.result,\n imageSettings,\n isStockCheckEnabled: this.props.context.app.config.enableStockCheck || false,\n maxCartlineQuantity: this.props.context.app.config.maxQuantityForCartLineItem,\n shouldIgnoreWarehouse: this.props.context.app.config.warehouseAggregation === 'multiple',\n gridSettings: this.props.context.request.gridSettings!,\n context: this.props.context,\n typeName: this.props.typeName,\n id: this.props.id,\n resources: {\n sizeString: resources.productDimensionTypeSize,\n colorString: resources.productDimensionTypeColor,\n configString: resources.productDimensionTypeConfiguration,\n styleString: resources.productDimensionTypeStyle,\n amountString: resources.productDimensionTypeAmount,\n quantityDisplayString: resources.quantityDisplayText,\n inputQuantityAriaLabel: resources.inputQuantityAriaLabel,\n decrementButtonAriaLabel: resources.decrementButtonAriaLabel,\n incrementButtonAriaLabel: resources.incrementButtonAriaLabel,\n discountStringText: resources.discountStringText,\n originalPriceText: resources.originalPriceText,\n currentPriceText: resources.currentPriceText,\n shippingChargesText: resources.shippingCharges,\n priceEditorResources: {\n ...resources\n }\n },\n telemetry,\n addToWishlistButtonText: resources.addToWishlistButtonText,\n removeFromWishlistButtonText: resources.removeFromWishlistButtonText,\n removeButtonText: resources.removeCartButtonText,\n shipItText: resources.shipInsteadDisplayText,\n pickitUpText: resources.pickItUpDisplayText,\n changeStoreText: resources.changeStoreDisplayText,\n storeSelectorStateManager: this.props.data.storeSelectorStateManager.result,\n outOfStockText: resources.outOfStockErrorMessage,\n outOfRangeOneText: resources.errorMessageOutOfRangeOneLeft,\n outOfRangeFormatText: resources.errorMessageOutOfRangeFormat,\n cartState: this.props.data.cart.result,\n orgUnitLocations: this.props.data.orgUnitLocations.result,\n removeItemClickHandler: this.removeItemFromCartHandler,\n moveToWishlistSuccessHandler: this.moveToWishlistSuccessHandler,\n updateCartLinesQuantitySuccessHandler: this.updateCartlineQuantity,\n locationChangedHandler: this.fulfillmentStoreIdUpdated,\n wishlists,\n defaultWishlistName: resources.defaultWishlistName,\n pickupDeliveryModeCode: PickupDeliveryModeCode,\n includeErrors: config.showOutOfStockErrors,\n showShippingChargesForLineItems: config.showShippingChargesForLineItems,\n telemetryContent: this.telemetryContent,\n isQuantityLimitsFeatureEnabled: this.isQuantityLimitsFeatureEnabled,\n\n addToOrderTemplateDialogResources: this._generateAddToOrderTemplateDialogResources(resources),\n createOrderTemplateDialogResources: this._generateOrderTemplateNameDialogResources(resources),\n itemAddedToOrderTemplateDialogResources: this._generateItemAddedToOrderTemplateDialogResources(resources),\n duplicateItemsWhenAddingToOrderTemplateDialogResources: this._generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(resources),\n\n addToOrderTemplateButtonText: resources.addToOrderTemplateButtonText,\n addToOrderTemplateButtonTooltip: resources.addToOrderTemplateButtonTooltip,\n addToOrderTemplateMessage: resources.addToOrderTemplateMessage,\n addItemToOrderTemplateError: resources.addItemToOrderTemplateError,\n orderTemplates,\n customerInformation,\n productAvailability: this.props.data.productAvailabilites\n })\n ) : null;\n }\n\n /**\n * Gets the checkout URL.\n * @param isAuthenticated - Is authenticated flag.\n * @param guestCheckoutUrl - Guest checkout URL.\n * @param signInUrl -The sign in URL.\n * @returns The checkout URL.\n */\n private getCheckoutURL(isAuthenticated: boolean, guestCheckoutUrl: string, signInUrl: string): string {\n if (isAuthenticated) {\n return guestCheckoutUrl;\n }\n\n const absoluteUrlRegExp = new RegExp('^(?:[a-z]+:)?//', 'i');\n const isAbsoluteUrl = absoluteUrlRegExp.test(guestCheckoutUrl);\n let returnURL = guestCheckoutUrl;\n if (MsDyn365.isBrowser && !isAbsoluteUrl) {\n returnURL = `${window.location.origin}${guestCheckoutUrl}`;\n }\n\n return `${signInUrl}${!signInUrl.includes('?') ? '?' : '&'}ru=${returnURL}`;\n }\n\n /**\n * Gets the image settings.\n * @param imageSettings - Image settings.\n * @returns IImageSettings.\n */\n private readonly getImageSettings = (imageSettings: IImageSettings | undefined): IImageSettings => {\n return imageSettings || {\n viewports: {\n xs: { q: 'w=80&h=94&m=6', w: 0, h: 0 },\n sm: { q: 'w=148&h=174&m=6', w: 0, h: 0 },\n lg: { q: 'w=148&h=174&m=6', w: 0, h: 0 }\n },\n lazyload: true\n };\n };\n\n /**\n * Remove item from cart handler.\n * @param cartlineToRemove - The cart line to remove.\n */\n private readonly removeItemFromCartHandler = (cartlineToRemove: CartLine) => {\n if (this.props.data.cart.result) {\n const input = {\n cartLineIds: [cartlineToRemove.LineId!.toString()]\n };\n this.props.data.cart.result.removeCartLines(input)\n .then(() => {\n this.validateCart()\n .catch((error) => {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to validate Cart');\n });\n })\n .catch((error) => {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to Remove Cart Line');\n });\n }\n };\n\n /**\n * Move to wish list handler.\n * @param result - The wish list action success result.\n * @param cartline - The cart line.\n */\n private readonly moveToWishlistSuccessHandler = (result: IWishlistActionSuccessResult, cartline?: CartLine) => {\n if (result.status === 'ADDED' && cartline) {\n this.removeItemFromCartHandler(cartline);\n }\n };\n\n /**\n * Updates the cart line quantity.\n * @param cartlineToUpdate - The cart line.\n * @param quantity - The quantity.\n * @param lineIndex - The line index.\n * @returns True if the cart line was updated, false otherwise.\n */\n private readonly updateCartlineQuantity = (cartlineToUpdate: CartLine, quantity: number, lineIndex?: number): boolean => {\n cartLineQuantityUpdatedAsync(\n this.isQuantityLimitsFeatureEnabled,\n this.props.data.cart.result,\n this.props.telemetry,\n this.props.data.products.result,\n cartlineToUpdate,\n quantity)\n .then((cartActionResult: ICartActionResult | undefined): boolean => {\n if (cartActionResult?.status === 'SUCCESS') {\n this.validateCart().catch((error) => {\n this.props.telemetry.warning((error as Error).message);\n this.props.telemetry.debug('Unable to validate Cart');\n });\n\n return true;\n }\n\n if (!ObjectExtensions.isNullOrUndefined(cartActionResult)) {\n // Show update line error message.\n const lineUpdateFailure: LineDataValidationFailure = {\n LineIndex: ObjectExtensions.isNullOrUndefined(lineIndex) ? 0 : lineIndex,\n DataValidationFailure: {\n ErrorContext:\n ArrayExtensions.hasElements(cartActionResult.validationResults) ? cartActionResult.validationResults[0].ErrorContext : '',\n LocalizedMessage: cartActionResult.errorDetails?.LocalizedMessage\n }\n };\n\n this.setState((previousState: Readonly<ICartComponentState>) => {\n const currentErrors: LineDataValidationFailure[] = previousState.cartlinesErrors.filter(error => error.LineIndex !== lineIndex);\n currentErrors.push(lineUpdateFailure);\n return { cartlinesErrors: currentErrors };\n });\n }\n\n return false;\n })\n .catch(() => {\n return false;\n });\n\n return false;\n };\n\n /**\n * Fulfillment store id is updated.\n */\n private readonly fulfillmentStoreIdUpdated = () => {\n if (this.isQuantityLimitsFeatureEnabled) {\n // Refresh products (in props.data) based on latest cart.\n getActiveCartProductsAction(new ActiveCartProductsInput(), this.props.context.actionContext)\n .then(async () => this.validateCart())\n .catch((error: Error) => {\n this.props.telemetry.warning(error.message);\n this.props.telemetry.debug('Unable to validate Cart');\n });\n }\n };\n\n /**\n * Validates cart.\n * @returns Void promise.\n */\n private async validateCart(): Promise<void> {\n const {\n data: { cart },\n telemetry,\n context\n } = this.props;\n\n const validationResults: LineDataValidationFailure[] | undefined = await validateCartAsync(this.isQuantityLimitsFeatureEnabled,\n cart,\n telemetry,\n context,\n true);\n\n if (validationResults) {\n const isValid = !ArrayExtensions.hasElements(validationResults);\n this.setState({\n cartlinesErrors: validationResults,\n isCartValid: isValid\n });\n } else {\n this.setState({ isCartValid: true });\n }\n\n return AsyncResult.resolve();\n }\n\n /**\n * Get order quantity limit feature flag.\n * @returns True if flag is enabled, false otherwise.\n */\n private async getOrderQuantityLimitsFeatureFlag(): Promise<boolean> {\n const defaultOrderQuantityLimitsFeatureConfig = this.props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits;\n if (defaultOrderQuantityLimitsFeatureConfig === 'none') {\n return false;\n }\n\n try {\n const featureStatuses = await this.props.data.featureState;\n const isQuantityLimitsFeatureEnabledInHq = featureStatuses\n .find(featureState => featureState.Name === 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature')?.IsEnabled || false;\n if (!isQuantityLimitsFeatureEnabledInHq) {\n return false;\n }\n } catch (error) {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to get feature states');\n return false;\n }\n\n if (defaultOrderQuantityLimitsFeatureConfig === 'all') {\n return true;\n }\n try {\n const customerInfo = await this.props.data.customerInformation;\n return !!customerInfo &&\n ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\n (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b));\n } catch (error) {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to get customer info');\n return false;\n }\n }\n\n /**\n * Gets the cart lines group.\n * @returns ICartlinesViewProps [][].\n */\n private getCartLinesGroup(): ICartlinesViewProps[][] | null {\n const {\n data: {\n cart: { result: cart },\n wishlists: { result: wishlists },\n orderTemplates: { result: orderTemplates },\n customerInformation: { result: customerInformation }\n },\n context: {\n request: {\n channel: {\n PickupDeliveryModeCode\n } = { PickupDeliveryModeCode: undefined }\n }\n },\n config,\n telemetry,\n resources,\n modules\n } = this.props;\n\n const imageSettings = this.getImageSettings(config.imageSettings);\n const cartlinesErrors: LineDataValidationFailure[] = this.state.cartlinesErrors;\n let storeSelectorId: string = '';\n if (modules && Object.keys(modules).length > 0 && modules.storeSelector && modules.storeSelector.length > 0) {\n storeSelectorId = modules.storeSelector[0].id;\n }\n\n return this.props.data.products && this.props.data.products.result && cart && cart.cart.CartLines && cart.cart.CartLines.length > 0 && this.props.data.channelDeliveryOptionConfig?.result ? (\n CartLineGroupItems({\n cartlines: cart.cart.CartLines,\n storeSelectorModuleId: storeSelectorId,\n cartlinesErrors,\n products: this.props.data.products.result,\n productAvailabilites: this.props.data.productAvailabilites.result,\n productDeliveryOptions: this.props.data.deliveryOptions.result,\n catalogs: this.props.data.catalogs?.result,\n imageSettings,\n isStockCheckEnabled: this.props.context.app.config.enableStockCheck || false,\n maxCartlineQuantity: this.props.context.app.config.maxQuantityForCartLineItem,\n gridSettings: this.props.context.request.gridSettings!,\n context: this.props.context,\n typeName: this.props.typeName,\n id: this.props.id,\n resources: {\n sizeString: resources.productDimensionTypeSize,\n colorString: resources.productDimensionTypeColor,\n configString: resources.productDimensionTypeConfiguration,\n styleString: resources.productDimensionTypeStyle,\n amountString: resources.productDimensionTypeAmount,\n quantityDisplayString: resources.quantityDisplayText,\n inputQuantityAriaLabel: resources.inputQuantityAriaLabel,\n decrementButtonAriaLabel: resources.decrementButtonAriaLabel,\n incrementButtonAriaLabel: resources.incrementButtonAriaLabel,\n discountStringText: resources.discountStringText,\n originalPriceText: resources.originalPriceText,\n currentPriceText: resources.currentPriceText,\n shippingChargesText: resources.shippingCharges,\n priceEditorResources: {\n ...resources\n }\n },\n telemetry,\n addToWishlistButtonText: resources.addToWishlistButtonText,\n removeFromWishlistButtonText: resources.removeFromWishlistButtonText,\n removeButtonText: resources.removeCartButtonText,\n shipItText: resources.shipInsteadDisplayText,\n pickitUpText: resources.pickItUpDisplayText,\n changeStoreText: resources.changeStoreDisplayText,\n storeSelectorStateManager: this.props.data.storeSelectorStateManager.result,\n outOfStockText: resources.outOfStockErrorMessage,\n outOfRangeOneText: resources.errorMessageOutOfRangeOneLeft,\n outOfRangeFormatText: resources.errorMessageOutOfRangeFormat,\n cartState: this.props.data.cart.result,\n orgUnitLocations: this.props.data.orgUnitLocations.result,\n removeItemClickHandler: this.removeItemFromCartHandler,\n moveToWishlistSuccessHandler: this.moveToWishlistSuccessHandler,\n updateCartLinesQuantitySuccessHandler: this.updateCartlineQuantity,\n locationChangedHandler: this.fulfillmentStoreIdUpdated,\n wishlists,\n defaultWishlistName: resources.defaultWishlistName,\n pickupDeliveryModeCode: PickupDeliveryModeCode,\n includeErrors: config.showOutOfStockErrors,\n showShippingChargesForLineItems: config.showShippingChargesForLineItems,\n telemetryContent: this.telemetryContent,\n isQuantityLimitsFeatureEnabled: this.isQuantityLimitsFeatureEnabled,\n\n addToOrderTemplateDialogResources: this._generateAddToOrderTemplateDialogResources(resources),\n createOrderTemplateDialogResources: this._generateOrderTemplateNameDialogResources(resources),\n itemAddedToOrderTemplateDialogResources: this._generateItemAddedToOrderTemplateDialogResources(resources),\n duplicateItemsWhenAddingToOrderTemplateDialogResources: this._generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(resources),\n\n addToOrderTemplateButtonText: resources.addToOrderTemplateButtonText,\n addToOrderTemplateButtonTooltip: resources.addToOrderTemplateButtonTooltip,\n addToOrderTemplateMessage: resources.addToOrderTemplateMessage,\n addItemToOrderTemplateError: resources.addItemToOrderTemplateError,\n orderTemplates,\n customerInformation,\n channelDeliveryOptionConfig: this.props.data.channelDeliveryOptionConfig?.result,\n shouldIgnoreWarehouse: this.props.context.app.config.warehouseAggregation === 'multiple',\n productAvailability: this.props.data.productAvailabilites\n })\n ) : null;\n }\n}\n\nexport default Cart;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { CartPromotionLine } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { INodeProps, Modal, ModalBody, ModalFooter, ModalHeader } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nexport interface ICartLineItemPromotion {\n id: string;\n showPromotionPopup: boolean;\n promotions: CartPromotionLine[] | undefined;\n resources: ICartLineItemPromotionResourceString;\n onSeeAllClick(event: React.MouseEvent<HTMLElement>): void;\n onCloseButtonClick(): void;\n}\n\nexport interface ICartLineItemViewProps {\n promotionMessageWrapper: INodeProps;\n promotionMessage: React.ReactNode;\n promotionSeeAllLink: React.ReactElement;\n promotionDialog: React.ReactNode;\n}\n\nexport interface ICartLineItemPromotionResourceString {\n promotionLinkText: string;\n promotionStringHeading: string;\n promotionPopupHeading: string;\n promotionCloseButtonAriaLabel: string;\n}\n\nexport const cartPromotions = (props: ICartLineItemPromotion): ICartLineItemViewProps | undefined => {\n\n const {\n id,\n showPromotionPopup,\n promotions,\n resources: {\n promotionLinkText,\n promotionPopupHeading\n },\n onCloseButtonClick,\n onSeeAllClick\n } = props;\n\n if (!ArrayExtensions.hasElements(promotions)) {\n return;\n }\n\n const titleId = `${id}_title`;\n const className = 'msc-cart__promotion';\n return {\n promotionMessageWrapper: {\n className: 'msc-cart__promotion'\n },\n promotionMessage: (\n <>\n <span className='msi-promotion-icon' />\n <span>\n {' '}\n {props.resources.promotionStringHeading}\n </span>\n </>\n ),\n promotionSeeAllLink: (\n <a\n className='msc-cart__promotion_link' tabIndex={0} role='link'\n onClick={onSeeAllClick}>\n {' '}\n {promotionLinkText}\n {' '}\n </a>),\n promotionDialog: (\n <Modal isOpen={showPromotionPopup} className={`${className}`} toggle={onCloseButtonClick}>\n <ModalHeader className={`${className}__dialog__header`} toggle={onCloseButtonClick}>\n <h5 id={titleId} className='msc-cart__promotion-popup_title'>\n {promotionPopupHeading}\n </h5>\n </ModalHeader>\n <ModalBody className={`${className}__dialog__body`}>\n <ul>\n {promotions.map(_promotion => {\n return (\n <li className='msc-cart__promotion-popup_name' key={_promotion.LineId}>\n {_promotion.Promotion?.OfferName}\n {' '}\n </li>\n );\n }\n )}\n </ul>\n </ModalBody>\n <ModalFooter className={`${className}__dialog__footer`} />\n </Modal>\n )\n };\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { INodeProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IProductCollectionViewProps, IProductComponentViewProps } from './product-collection';\n\nconst ProductCollectionView: React.FC<IProductCollectionViewProps> = props => {\n const { heading, ProductCollectionContainer, products, SingleSlideCarouselComponentProps, GridComponentProps, isCarousel } = props;\n if (products) {\n return (\n <Module {...ProductCollectionContainer}>\n {heading}\n {\n isCarousel ? _renderCarousel(SingleSlideCarouselComponentProps, products) : _renderGrid(GridComponentProps, products)\n }\n </Module>\n );\n }\n props.context.telemetry.error('Product collection content is empty, module wont render.');\n return null;\n};\n\nconst _renderCarousel = (carouselContainer: INodeProps, items: IProductComponentViewProps[]): JSX.Element => {\n return (\n <Node {...carouselContainer}>\n {items && items.map(_renderProduct)}\n </Node>\n );\n};\n\nconst _renderGrid = (gridContainer: INodeProps, items: IProductComponentViewProps[]): JSX.Element => {\n return (\n <Node {...gridContainer}>\n {items && items.map(_renderProduct)}\n </Node>\n );\n};\n\nconst _renderProduct = (product: IProductComponentViewProps): JSX.Element => {\n const { ProductContainer, productComponent } = product;\n\n return (\n <Node {...ProductContainer}>\n {productComponent}\n </Node>\n );\n};\n\nexport default ProductCollectionView;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { IProductsDimensionsAvailabilities } from '@msdyn365-commerce/commerce-entities';\nimport { IPriceComponentResources, ProductComponent } from '@msdyn365-commerce/components';\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { ICoreContext } from '@msdyn365-commerce/core';\nimport { ProductPrice, ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\nimport {\n ArrayExtensions, DimensionAvailabilitiesForProductSearchResultInput,\n DimensionTypes, getDimensionAvailabilitiesForProductSearchResultAction,\n getPriceForProductSearchResult, IDimensionsApp, ObjectExtensions, PriceForProductSearchResultInput\n} from '@msdyn365-commerce-modules/retail-actions';\nimport { getTelemetryObject, IComponentNodeProps, IModuleProps, INodeProps,\n ISingleSlideCarouselProps, ITelemetryContent, NodeTag, SingleSlideCarousel } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { IProductCollectionData } from './product-collection.data';\nimport { IProductCollectionProps, layout } from './product-collection.props.autogenerated';\n\nexport interface IProductCollectionViewProps extends IProductCollectionProps<IProductCollectionData> {\n heading?: React.ReactNode;\n ProductCollectionContainer: IModuleProps;\n SingleSlideCarouselComponentProps: INodeProps;\n GridComponentProps: INodeProps;\n products: IProductComponentViewProps[];\n isCarousel: boolean;\n productPrices?: ProductPrice[];\n}\n\nexport interface IProductComponentViewProps {\n ProductContainer: INodeProps;\n productComponent: React.ReactNode;\n}\nexport interface IProductComponentState {\n products: ProductSearchResult[];\n productsDimensionAvailabilities?: IProductsDimensionsAvailabilities[][];\n}\n\n/**\n * ProductCollection component.\n */\nclass ProductCollection extends React.PureComponent<IProductCollectionProps<IProductCollectionData>, IProductComponentState> {\n private readonly telemetryContent: ITelemetryContent;\n\n private readonly productPrices: ProductPrice[];\n\n constructor(props: IProductCollectionProps<IProductCollectionData>) {\n super(props);\n this.productPrices = [];\n this.state = {\n products: this.props.config.productCollection.products\n };\n this.telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry);\n }\n\n public componentDidMount(): void {\n if (this.props.config.enableAffiliationBasedPricing &&\n this.props.context.actionContext.requestContext.user.isAuthenticated) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises -- Initialize data loading.\n this._getActivePrice();\n }\n }\n\n public render(): JSX.Element | null {\n const { heading, className } = this.props.config;\n const { resources } = this.props;\n\n // Initiallize state in case if the products were not found during initial module render\n // eslint-disable-next-line @typescript-eslint/no-floating-promises -- Initialize data if not there.\n this.initProductState(this.props.config.productCollection);\n\n const products = this.state.products;\n const isCarousel = this.props.config.layout === layout.carousel;\n const headingLabel = heading ? heading.text : '';\n const headingComponent = heading && (\n <Msdyn365.Text\n className='ms-product-collection__heading'\n tag={heading.tag || 'h1'}\n text={headingLabel}\n editProps={{ onEdit: this.handleHeadingChange, requestContext: this.props.context.request }}\n />\n );\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- product check for safety.\n const updatedProducts = products?.map(\n (item: ProductSearchResult, index: number) => {\n const getProductData = this._getProduct(item, index);\n return !ObjectExtensions.isNullOrUndefined(getProductData) ? getProductData : undefined;\n }\n );\n\n const productCollectionViewProps = {\n ...this.props,\n heading: headingComponent,\n SingleSlideCarouselComponentProps: {\n tag: SingleSlideCarousel,\n className: '',\n flipperPrevLabel: `${headingLabel} ${resources.flipperPrevious}`,\n flipperNextLabel: `${headingLabel} ${resources.flipperNext}`,\n parentId: this.props.id,\n telemetryContent: this.telemetryContent\n } as IComponentNodeProps<ISingleSlideCarouselProps>,\n ProductCollectionContainer: {\n moduleProps: this.props,\n className: classnames('ms-product-collection', className)\n },\n GridComponentProps: {\n tag: 'ul' as NodeTag,\n className: 'ms-product-collection__items'\n },\n isCarousel,\n\n products: ArrayExtensions.hasElements(updatedProducts) && updatedProducts.filter(\n (item) => {\n return item !== undefined;\n }\n ),\n productPrices: this.productPrices\n };\n return this.props.renderView(productCollectionViewProps) as React.ReactElement;\n }\n\n public handleHeadingChange = (event: Msdyn365.ContentEditableEvent) => this.props.config.heading!.text = event.target.value;\n\n /**\n * Get products dimension availabilities.\n * @param products - Products.\n * @returns Promise.\n */\n private readonly _getProductsDimensionsAvailabilities = async (products: ProductSearchResult[]): Promise<void> => {\n const context = this.props.context as ICoreContext<IDimensionsApp>;\n const dimensionsToDisplayOnProductCard = context.app.config.dimensionsInProductCard;\n const dimensionsToDisplayAsSwatch = context.app.config.dimensionsAsSwatchType;\n const validProducts = ArrayExtensions.validValues(products);\n if (ArrayExtensions.hasElements(validProducts) &&\n ArrayExtensions.hasElements(dimensionsToDisplayOnProductCard) && !dimensionsToDisplayOnProductCard.includes(DimensionTypes.none) &&\n ArrayExtensions.hasElements(dimensionsToDisplayAsSwatch) && !dimensionsToDisplayAsSwatch.includes(DimensionTypes.none)) {\n const productsDimensionAvailabilities = await getDimensionAvailabilitiesForProductSearchResultAction(\n new DimensionAvailabilitiesForProductSearchResultInput(\n validProducts, this.props.context as ICoreContext<IDimensionsApp>),\n this.props.context.actionContext);\n\n if (ArrayExtensions.hasElements(productsDimensionAvailabilities)) {\n this.setState({ productsDimensionAvailabilities });\n }\n }\n };\n\n /**\n * Helper method to initialize products state.\n * @param productCollection - List of products.\n */\n private readonly initProductState = async (productCollection: Msdyn365.IProductList) => {\n let products = this.state.products;\n const productCollectionProducts = productCollection.products;\n if (!ArrayExtensions.hasElements(products) && ArrayExtensions.hasElements(productCollectionProducts)) {\n products = productCollectionProducts;\n this.setState({ products });\n } else if (ArrayExtensions.hasElements(products) && ArrayExtensions.hasElements(productCollectionProducts) &&\n // eslint-disable-next-line sonarjs/no-duplicated-branches -- too small of code to create another function\n !ArrayExtensions.equals(products, productCollectionProducts)) {\n products = productCollectionProducts;\n this.setState({ products });\n }\n\n if (!ArrayExtensions.hasElements(this.state.productsDimensionAvailabilities)) {\n await this._getProductsDimensionsAvailabilities(products);\n }\n };\n\n private readonly _getProduct = (product: ProductSearchResult, index: number): IProductComponentViewProps | null => {\n if (!product || !product.Name) {\n this.props.telemetry.trace('[product-collection] Product or product name is null');\n return null;\n }\n const telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry);\n const { imageSettings, allowBackNavigation } = this.props.config;\n const resources = this.props.resources;\n const breaCrumbType = this.props.context.app.config.breadcrumbType;\n const allowBack = allowBackNavigation && (breaCrumbType === 'back' || breaCrumbType === 'categoryAndBack');\n const quickviewSlot = this.props.slots && this.props.slots.quickview && this.props.slots.quickview.length > 0 ? this.props.slots.quickview[0] : null;\n const reviewCount = 1;\n const reviewTotalRatings = Number(product.TotalRatings);\n const reviewCountAriaLabelValue = reviewTotalRatings > reviewCount ? resources.ratingCountAriaLabel : resources.ratingCountAriaLabelSingleUser;\n const isPriceMinMaxEnabled = this.props.data.featureState.result?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailSearchPriceRangeFeature');\n const priceResources: IPriceComponentResources = {\n priceRangeSeparator: resources.priceRangeSeparator\n };\n return {\n ProductContainer: {\n tag: 'li' as NodeTag,\n className: 'ms-product-collection__item',\n role: 'listitem',\n key: index\n },\n productComponent: (\n <ProductComponent\n context={this.props.context}\n telemetryContent={telemetryContent}\n imageSettings={imageSettings}\n freePriceText={resources.priceFree}\n originalPriceText={resources.originalPriceText}\n currentPriceText={resources.currentPriceText}\n ratingAriaLabel={resources.ratingAriaLabel}\n ratingCountAriaLabel={reviewCountAriaLabelValue}\n allowBack={allowBack}\n id={this.props.id}\n typeName={this.props.typeName}\n data={{ product }}\n quickViewButton={quickviewSlot}\n isPriceMinMaxEnabled={isPriceMinMaxEnabled?.IsEnabled}\n priceResources={priceResources}\n dimensionAvailabilities={this.state.productsDimensionAvailabilities?.find(\n dimensionAvailability => ArrayExtensions.hasElements(dimensionAvailability) &&\n // eslint-disable-next-line inclusive-language/use-inclusive-words -- Existing data entities.\n dimensionAvailability[0].masterProductId === (product.MasterProductId ?? product.RecordId))}\n />\n )\n };\n };\n\n /**\n * Get the active price for products.\n */\n private readonly _getActivePrice = async (): Promise<void> => {\n const productsList = this.state.products;\n const products = await getPriceForProductSearchResult(\n new PriceForProductSearchResultInput(productsList),\n this.props.context.actionContext);\n\n await this._getProductsDimensionsAvailabilities(products);\n\n this.setState({ products });\n };\n}\n\nexport default ProductCollection;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { IModule } from '@msdyn365-commerce/core';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport isMatch from 'lodash/isMatch';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { getModuleStates, updateModuleStates } from './module-state';\nimport { IModuleState, IModuleStateManager, IModuleStateProps, IModuleStates } from './module-state.data';\n\nexport interface IProps extends IModule, IModuleStateProps {\n enableControl?: boolean;\n}\n\nconst sectionContainerModuleId = 'section-container';\nconst paymentInstrumentModuleId = 'payment-instrument';\n\nconst withModuleState = <P extends IProps>(WrappedComponent: React.ComponentType<P>): React.ComponentType<P> => {\n /**\n *\n * ModuleState component.\n * @extends {React.Component<P>}\n */\n @observer\n class ModuleState extends React.Component<P> {\n constructor(props: P) {\n super(props);\n this.initializeState();\n }\n\n public shouldComponentUpdate(nextProps: IModuleStateProps): boolean {\n if (this.props === nextProps) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element | null {\n const { id } = this.props;\n return <WrappedComponent {...this.props} moduleState={this.getModuleStateManager(id)} />;\n }\n\n private readonly initializeState = (): void => {\n const { id, typeName, context } = this.props;\n const states = getModuleStates(context.actionContext);\n if (!states) {\n this.props.telemetry.error('withModuleState initializeState() - states not found');\n return;\n }\n\n if (states[id]) {\n // State has been initialized\n return;\n }\n\n updateModuleStates(\n {\n ...states,\n [id]: {\n id,\n typeName,\n hasInitialized: false,\n hasError: false,\n isRequired: true,\n isCancellable: true,\n isSubmitContainer: false,\n status: undefined,\n childIds: []\n }\n },\n context.actionContext\n );\n };\n\n /**\n * GetModuleStateManager\n * Get module state manager by id.\n * @param id\n */\n private readonly getModuleStateManager = (id: string): IModuleStateManager => {\n const moduleState = this.get()[id];\n return {\n ...moduleState!,\n hasInitialized: this.validate(id, { hasInitialized: true }, true), // All has initialized is initialized\n hasError: this.validate(id, { hasError: true }), // Partial has error is error\n isReady: this.validate(id, { status: 'ready' }, true, true), // All ready is ready (exclued disabled and skipped)\n isUpdating: this.validate(id, { status: 'updating' }), // Partial updating is updating\n isPending: this.validate(id, { status: 'pending' }), // Partial pending is pending\n isSkipped: this.validate(id, { status: 'skipped' }, true, true), // All skipped is skipped (exclued disabled)\n isDisabled: this.validate(id, { status: 'disabled' }, true), // All disabled is disabled\n isCancelAllowed: this.validate(id, { isCancellable: true }, true, true), // Partial not allowed is not allowed\n shouldSubmitContainer: this.validate(id, { isSubmitContainer: true }), // Partial submit is submit.\n hasExternalSubmitGroup: this.hasExternalSubmitGroup(),\n hasModuleState: this.hasModuleState(id),\n setIsRequired: (value: boolean): void => {\n this.update(id, { isRequired: value });\n },\n setIsCancellable: (value: boolean): void => {\n this.update(id, { isCancellable: value });\n },\n setIsSubmitContainer: (value: boolean): void => {\n this.update(id, { isSubmitContainer: value });\n },\n setHasError: (value: boolean): void => {\n this.update(id, { hasError: value });\n },\n onReady: (): void => {\n this.update(id, { status: 'ready' });\n },\n onUpdating: (): void => {\n this.update(id, { status: 'updating' });\n },\n onPending: (): void => {\n this.update(id, { status: 'pending' });\n },\n onSkip: (): void => {\n this.update(id, { status: 'skipped' });\n },\n onDisable: (): void => {\n this.update(id, { status: 'disabled' });\n },\n getModule: (moduleId: string): IModuleStateManager => this.getModuleStateManager(moduleId),\n getModuleByTypeName: (typeName: string): IModuleStateManager => this.getModuleStateManagerByTypeName(typeName),\n init: (options?: Partial<IModuleState>): void => {\n if (moduleState?.hasInitialized) {\n // State has been initialized\n return;\n }\n this.update(id, {\n hasInitialized: true,\n ...options\n });\n }\n };\n };\n\n /**\n * GetModuleStateManagerByTypeName\n * Get module state manager by type name.\n * @param typeName\n */\n private readonly getModuleStateManagerByTypeName = (typeName: string): IModuleStateManager => {\n const moduleStates = getModuleStates(this.props.context.actionContext);\n const moduleState = Object.values(moduleStates).find(_moduleState => _moduleState?.typeName === typeName);\n return this.getModuleStateManager((moduleState && moduleState.id) || '');\n };\n\n /**\n * Get\n * Get all module states.\n */\n private readonly get = (): IModuleStates => {\n return getModuleStates(this.props.context.actionContext);\n };\n\n /**\n * Update\n * Update module state.\n * @param id\n * @param value\n */\n private readonly update = (id: string, value: Partial<IModuleState>): void => {\n // Console.log('withModuleState - update', id, value);\n const modules = this.get();\n if (!modules[id]) {\n this.props.telemetry.error(`withModuleState update() - Module state with id ${id} is not found.`);\n return;\n }\n modules[id] = {\n ...modules[id]!,\n ...value\n };\n };\n\n private readonly _validateLeaf = (id: string, source: Partial<IModuleState>): boolean => {\n const modules = this.get();\n const module = modules[id];\n if (!module) {\n return false;\n }\n return isMatch(module, source);\n };\n\n private readonly _validateContainer = (\n id: string,\n source: Partial<IModuleState>,\n allMatched?: boolean,\n skipSkippableItem?: boolean\n ): boolean => {\n const modules = this.get();\n const module = modules[id];\n if (!module) {\n // Module doesn't has module state\n return !!allMatched;\n }\n\n if (skipSkippableItem && (module.status === 'disabled' || module.status === 'skipped')) {\n // Skip disabled or skipped modules\n return !!allMatched;\n }\n\n // It is leaf module\n if (!module.childIds || module.childIds.length === 0) {\n return this._validateLeaf(id, source);\n }\n\n let childIds = module.childIds;\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Do not need type check for appsettings\n if (this.props.context.app.config.shouldEnableSinglePaymentAuthorizationCheckout) {\n // For new checkout flow, we bypass the isReady check for payment section container to enable the place order button.\n childIds = childIds.filter(childId => !this._isPaymentSectionContainer(childId));\n }\n\n // It is container module\n const method = allMatched ? 'every' : 'some';\n return childIds[method](childId => this._validateContainer(childId, source, allMatched, skipSkippableItem));\n };\n\n /**\n * Check if it is a section container with payment module.\n * @param moduleId -- The id of the module.\n * @returns If it is a section container with payment module.\n */\n private readonly _isPaymentSectionContainer = (moduleId: string): boolean => {\n if (!moduleId.includes(sectionContainerModuleId)) {\n return false;\n }\n\n const modules = this.get();\n const module = modules[moduleId];\n\n if (module && ArrayExtensions.hasElements(module.childIds.filter(childId => childId.includes(paymentInstrumentModuleId)))) {\n return true;\n }\n\n return false;\n };\n\n /**\n * Validate\n * Validate current module and all its child module match the provided condition.\n * @param id\n * @param source\n * @param allMatched\n * @param skipSkippableItem\n */\n private readonly validate = (id: string, source: Partial<IModuleState>, allMatched?: boolean, skipSkippableItem?: boolean): boolean => {\n const modules = this.get();\n const module = modules[id];\n if (!module) {\n return false;\n }\n\n // It is leaf module\n if (!module.childIds || module.childIds.length === 0) {\n return this._validateLeaf(id, source);\n }\n\n // It is container module\n return this._validateContainer(id, source, allMatched, skipSkippableItem);\n };\n\n /**\n * HasExternalSubmitGroup\n * Module will use external submit group.\n */\n private readonly hasExternalSubmitGroup = (): boolean => {\n return !!this.props.enableControl;\n };\n\n /**\n * HasModuleState\n * Module is using module state manager.\n * @param id\n */\n private readonly hasModuleState = (id: string): boolean => {\n const modules = this.get();\n const module = modules[id];\n return !!module;\n };\n }\n\n return ModuleState;\n};\n\nexport default withModuleState;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport MsDyn365 from '@msdyn365-commerce/core';\nimport { IInvoiceSummaryLines } from '@msdyn365-commerce-modules/invoice-payment-summary';\nimport { IOrderSummaryLines } from '@msdyn365-commerce-modules/order-summary-utilities';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { INodeProps, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ICartViewProps, IOrderSummaryErrors } from './cart';\nimport { ICartlinesViewProps } from './components/cart-line-items';\nimport { ICartLineItemViewProps } from './components/cart-line-items-promotion';\n\nconst _renderCartlines = (cartLines: ICartlinesViewProps[] | undefined, cartEmptyText: string, CartlinesWrapper: INodeProps, storeSelector: React.ReactNode | undefined,\n backToShoppingButton: React.ReactNode, waitingComponent: React.ReactNode, cartLoadingStatus: string, cartDataResult: boolean): JSX.Element[] | JSX.Element => {\n\n if (cartLoadingStatus) {\n return (<>\n {cartLoadingStatus}\n </>);\n }\n if (cartLines) {\n return cartLines.map((cartLine) => {\n return (\n <div className='msc-cart-lines-item' key={`${cartLine.cartlineId ?? ''}-${MsDyn365.isBrowser.toString()}`}>\n {cartLine.cartline}\n {\n storeSelector && cartLine.pickUpInStore ? <Node {...cartLine.pickUpInStore.ContainerProps}>\n {cartLine.pickUpInStore.defaultComponent}\n </Node> : null\n }\n {\n cartLine.addToOrderTemplate ? (\n <Node className='msc-cart-line__extra-actions'>\n {cartLine.remove}\n {cartLine.addToWishlist}\n {cartLine.addToOrderTemplate}\n </Node>\n ) : (\n <>\n {cartLine.remove}\n {cartLine.addToWishlist}\n </>\n )\n }\n </div>\n );\n });\n }\n return (cartDataResult ? (\n <div className='msc-cart__empty-cart'>\n <p className='msc-cart-line'>\n {cartEmptyText}\n </p>\n {backToShoppingButton}\n </div>\n ) : <>\n {waitingComponent}\n </>\n );\n\n};\n\n/**\n * Method will render error block.\n * @param errorData -The order summary errors interface.\n * @returns Jsx element.\n */\nconst _renderErrorBlock = (errorData: IOrderSummaryErrors | undefined): JSX.Element | null => {\n if (!errorData || !ArrayExtensions.hasElements(errorData.errors)) {\n return null;\n }\n return (\n <Node {...errorData.Wrapper}>\n {errorData.header}\n {errorData.errors}\n </Node>\n );\n};\n\n/**\n * Method will render invoice summary lines.\n * @param invoiceSummaryLines -The invoicesummary lines interface.\n * @param OrderSummaryItems -The order summary items props.\n * @param props -The cartview props.\n * @returns Jsx element.\n */\nconst _renderInvoiceSummarylines = (invoiceSummaryLines: IInvoiceSummaryLines | undefined, OrderSummaryItems: INodeProps, props: ICartViewProps):\nJSX.Element | null => {\n if (!invoiceSummaryLines) {\n props.context.telemetry.error('InvoiceSummary content is empty, module wont render');\n return null;\n }\n return (\n <Node {...OrderSummaryItems}>\n {invoiceSummaryLines.invoices}\n {invoiceSummaryLines.giftCard}\n {invoiceSummaryLines.loyalty}\n {invoiceSummaryLines.orderTotal}\n </Node>\n );\n};\n\n/**\n * Method will render order summary lines.\n * @param orderSummaryLines -The ordersummary lines interface.\n * @param OrderSummaryItems -The order summary items props.\n * @param props -The cartview props.\n * @returns Jsx element.\n */\nconst _renderOrderSummarylines = (orderSummaryLines: IOrderSummaryLines | undefined, OrderSummaryItems: INodeProps, props: ICartViewProps):\nJSX.Element | null => {\n if (!orderSummaryLines) {\n props.context.telemetry.error('OrderSummary content is empty, module wont render');\n return null;\n }\n return (\n <Node {...OrderSummaryItems}>\n {props.promoCode}\n {orderSummaryLines.subtotal}\n {orderSummaryLines.shipping}\n {orderSummaryLines.otherCharge}\n {orderSummaryLines.tax}\n {orderSummaryLines.totalDiscounts ? orderSummaryLines.totalDiscounts : null}\n {orderSummaryLines.orderTotal}\n </Node>\n );\n};\n\n/**\n * Method will render cart promotions.\n * @param promotions -The cartline item view props.\n * @returns Jsx element.\n */\nconst _renderPromotions = (promotions: ICartLineItemViewProps): JSX.Element | undefined => {\n return (\n <>\n <Node {...promotions.promotionMessageWrapper} >\n {promotions.promotionMessage}\n {promotions.promotionSeeAllLink}\n {promotions.promotionDialog}\n </Node>\n\n </>\n );\n\n};\n\n/**\n * Method will render cartlines group title.\n * @param cartLine -The cartline view props.\n * @param titleSeparate -The title separate.\n * @returns Jsx element.\n */\nconst renderCartLinesGroupTitle = (cartLine: ICartlinesViewProps, titleSeparate: string) => {\n const isBopisSelected: boolean | undefined = cartLine.pickUpInStore?.isBopisSelected;\n return (\n <>\n <Node className='msc-cart-lines-group-wraper__bopis-heading-title'>\n {isBopisSelected ? <p className='msc-cart-lines-group-wraper__bopis-heading-title-st'>\n {cartLine.pickUpInStore?.deliveryOption}\n {titleSeparate}\n {cartLine.pickUpInStore?.orgUnitName}\n </p> : null}\n </Node>\n </>\n );\n};\n\n/**\n * Method will render cartlines groups header title.\n * @param pickUpText -The pickup text for group.\n * @param shippingText -The shipping text for group.\n * @param emailShippingText -The email shipping text for group.\n * @param titleSeparate -The title separator.\n * @param cartLine -The cartline view props.\n * @param emailDeliveryModeCode -The email delivery code from channel.\n * @returns Jsx element.\n */\nconst renderCartLinesGroupHeader = (pickUpText: string, shippingText: string, emailShippingText: string,\n titleSeparate: string, cartLine: ICartlinesViewProps, emailDeliveryModeCode?: string) => {\n const isBopisSelected: boolean | undefined = cartLine.pickUpInStore?.isBopisSelected;\n let groupTitle: string;\n\n groupTitle = isBopisSelected ? pickUpText : shippingText;\n groupTitle = cartLine.data && cartLine.data.cartline.DeliveryMode === emailDeliveryModeCode ? emailShippingText : groupTitle;\n\n return (\n <>\n <div className='msc-cart-lines-group-wraper__bopis-heading'>\n <p className={`msc-cart-lines-group-wraper__bopis-heading-${groupTitle.toLowerCase()}-icon`} />\n <p className={`msc-cart-lines-group-wraper__bopis-heading-${groupTitle.toLowerCase()}`}>\n {groupTitle}\n </p>\n {renderCartLinesGroupTitle(cartLine, titleSeparate)}\n </div>\n </>\n );\n};\n\n/**\n * Method will render cartlines in groups.\n * @param props -The cartline.\n * @returns Jsx element.\n */\nconst renderCartLinesGroup = (props: ICartViewProps): JSX.Element | undefined => {\n if (props.cartLinesGroup && ArrayExtensions.hasElements(props.cartLinesGroup)) {\n return (\n <div className='msc-cart-lines-group'>\n { props.cartLinesGroup.map(cartlines => {\n return (<div key={cartlines[0].cartlineId} className='msc-cart-lines-group-wraper'>\n {renderCartLinesGroupHeader(props.resources.pickUpText, props.resources.shippingText,\n props.resources.emailshippingText, props.resources.titleSeparate, cartlines[0],\n props.context.actionContext.requestContext.channel?.EmailDeliveryModeCode)}\n {_renderCartlines(cartlines, props.resources.emptyCartText, props.CartlinesWrapper, props.storeSelector,\n props.backToShoppingButton, props.waitingComponent, props.cartLoadingStatus, props.cartDataResult)}\n </div>);\n })}\n </div>\n );\n }\n return (props.cartDataResult ? (\n <div className='msc-cartline-wraper'>\n <div className='msc-cart__empty-cart'>\n <p className='msc-cart-line'>\n {props.resources.emptyCartText}\n </p>\n {props.backToShoppingButton}\n </div>\n </div>\n ) : <>\n {props.waitingComponent}\n </>\n );\n\n};\n\nconst CartView: React.FC<ICartViewProps> = (props: ICartViewProps) => (\n <div className={props.className} id={props.id} {...props.renderModuleAttributes(props)}>\n {props.title}\n {!props.cart?.hasInvoiceLine && props.promotionOptions && _renderPromotions(props.promotionOptions)}\n {props.multiplePickUpEnabled ? renderCartLinesGroup(props) : <Node {...props.CartlinesWrapper}>\n {_renderCartlines(props.cartlines, props.resources.emptyCartText, props.CartlinesWrapper, props.storeSelector,\n props.backToShoppingButton, props.waitingComponent, props.cartLoadingStatus, props.cartDataResult)}\n </Node>}\n {props.orderSummaryHeading &&\n <Node {...props.OrderSummaryWrapper}>\n {props.orderSummaryHeading}\n {props.cart?.hasInvoiceLine ? _renderInvoiceSummarylines(props.invoiceSummaryLineitems, props.OrderSummaryItems, props) : _renderOrderSummarylines(props.orderSummaryLineitems, props.OrderSummaryItems, props)}\n {_renderErrorBlock(props.OrderSummaryErrors)}\n {props.checkoutAsSignInUserButton}\n {props.checkoutAsGuestButton}\n {props.expressCheckoutButton}\n {props.backToShoppingButton}\n {props.createTemplateFromCartButton}\n </Node>}\n {props.storeSelector}\n </div>\n);\n\nexport default CartView;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { Alert, Button, INodeProps, NodeTag } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { showAdditionalFields } from '../checkout-gift-card.props.autogenerated';\n\nexport interface IGetFormInput {\n errorMessage: string;\n giftCardNumber: string;\n giftCardPin: string;\n giftCardExp: string;\n inputRef?: React.RefObject<HTMLInputElement>;\n inputPinRef?: React.RefObject<HTMLInputElement>;\n inputExpRef?: React.RefObject<HTMLInputElement>;\n supportExternalGiftCard?: boolean;\n additionalFields?: showAdditionalFields;\n disableAddGiftCard?: boolean;\n resources: {\n applyGiftCardButton: string;\n giftCardFormLabel: string;\n giftCardNumberLabel: string;\n giftCardPinLabel: string;\n giftCardExpLabel: string;\n giftCardAlertLabel: string;\n giftCardPinPlaceholderText: string;\n giftCardExpPlaceholderText: string;\n };\n onEnterGiftCardNumber(giftCardNumber: string): void;\n onEnterGiftCardPin(giftCardPin: string): void;\n onEnterGiftCardExp(giftCardExp: string): void;\n onApplyGiftCard(): Promise<void>;\n}\n\nexport interface IForm {\n formProps: INodeProps;\n label: React.ReactNode;\n inputPinLabel: React.ReactNode;\n inputExpLabel: React.ReactNode;\n alert: React.ReactNode;\n inputProps: INodeProps;\n inputNumProps: INodeProps;\n inputPinProps: INodeProps;\n inputExpProps: INodeProps;\n inputNumber: React.ReactNode;\n inputPin: React.ReactNode;\n inputExp: React.ReactNode;\n applyButton: React.ReactNode;\n supportExternalGiftCard: boolean | undefined;\n showGiftCardPinInput: boolean | undefined;\n showGiftCardExpInput: boolean | undefined;\n alertFieldLabel: React.ReactNode;\n}\n\n/**\n * On Apply Function.\n * @param onApplyGiftCard -On Apply Gift Card Function.\n * @returns Call of Apply Gift Card Function.\n */\nconst onApplyHandler = (onApplyGiftCard: () => Promise<void>) => async (event: React.SyntheticEvent): Promise<void> => {\n event.preventDefault();\n await onApplyGiftCard();\n};\n\n/**\n * On change number Function.\n * @param onEnterGiftCardNumber -On enter gift card number Function.\n * @returns Call of on enter gift card number Function.\n */\nconst onChangeNumberHandler = (onEnterGiftCardNumber: (giftCardNumber: string) => void) => (event: React.ChangeEvent<HTMLInputElement>) => {\n const value = (event.target.value || '').replace(new RegExp('[<>]', 'gi'), '');\n onEnterGiftCardNumber(value);\n};\n\n/**\n * On Change pin event.\n * @param onEnterGiftCardPin -On enter gift card pin Function.\n * @returns Call of on enter gift card pin Function.\n */\nconst onChangePinHandler = (onEnterGiftCardPin: (giftCardPin: string) => void) => (event: React.ChangeEvent<HTMLInputElement>) => {\n const value = (event.target.value || '').replace(new RegExp('[<>]', 'gi'), '');\n onEnterGiftCardPin(value);\n};\n\n/**\n * On Change Event.\n * @param onEnterGiftCardExp -On enter gift card function.\n * @returns Call of On enter gift card function.\n */\n// Need to filter out the month and year\nconst onChangeExpHandler = (onEnterGiftCardExp: (giftCardExp: string) => void) => (event: React.ChangeEvent<HTMLInputElement>) => {\n const value = (event.target.value || '').replace(new RegExp('[<>]', 'gi'), '');\n onEnterGiftCardExp(value);\n};\n\nexport const getForm = (options: IGetFormInput): IForm => {\n const {\n errorMessage,\n inputRef,\n inputPinRef,\n inputExpRef,\n giftCardNumber,\n giftCardPin,\n giftCardExp,\n onEnterGiftCardNumber,\n onEnterGiftCardPin,\n onEnterGiftCardExp,\n onApplyGiftCard,\n supportExternalGiftCard,\n additionalFields,\n disableAddGiftCard,\n resources: { applyGiftCardButton, giftCardFormLabel, giftCardNumberLabel, giftCardPinLabel, giftCardExpLabel,\n giftCardAlertLabel, giftCardPinPlaceholderText, giftCardExpPlaceholderText }\n } = options;\n\n const formProps = {\n className: classnames('ms-checkout-gift-card__form', { 'is-invalid': !!errorMessage }),\n onSubmit: onApplyHandler(onApplyGiftCard),\n tag: 'form' as NodeTag\n };\n\n const label = (\n <label id='ms-checkout-gift-card__label' className='ms-checkout-gift-card__input-label'>\n {giftCardFormLabel}\n </label>\n );\n\n const inputPinLabel = (\n <label id='ms-checkout-gift-card__input-pin-label' className='ms-checkout-gift-card__input-pin-label'>\n {giftCardPinLabel}\n </label>\n );\n\n const inputExpLabel = (\n <label id='ms-checkout-gift-card__input-exp-label' className='ms-checkout-gift-card__input-exp-label'>\n {giftCardExpLabel}\n </label>\n );\n\n const alertFieldLabel = (\n <label id='ms-checkout-gift-card__input-alert' className='ms-checkout-gift-card__input-alert-label'>\n {giftCardAlertLabel}\n </label>\n );\n\n const alert = (\n <Alert\n tag='span'\n id='ms-checkout-gift-card__error'\n className='ms-checkout-gift-card__input-error'\n role='alert'\n assertive={false}\n fade={false}\n includeAlertClass={false}\n isOpen={!!errorMessage}\n >\n {errorMessage}\n </Alert>\n );\n\n const inputProps = {\n className: 'ms-checkout-gift-card__input-fields'\n };\n\n const inputNumProps = {\n className: 'ms-checkout-gift-card__input-num-fields'\n };\n\n const inputPinProps = {\n className: 'ms-checkout-gift-card__input-pin-fields'\n };\n\n const inputExpProps = {\n className: 'ms-checkout-gift-card__input-exp-fields'\n };\n\n const inputNumber = (\n <input\n ref={inputRef}\n type='text'\n className='ms-checkout-gift-card__input-text form-control'\n aria-label={giftCardNumberLabel}\n onChange={onChangeNumberHandler(onEnterGiftCardNumber)}\n value={giftCardNumber}\n aria-labelledby='ms-checkout-gift-card__label ms-checkout-gift-card__error'\n />\n );\n\n const inputPin = (\n <input\n ref={inputPinRef}\n type='text'\n className='ms-checkout-gift-card__input-pin-text form-contol'\n aria-label={giftCardPinLabel}\n placeholder={giftCardPinPlaceholderText}\n onChange={onChangePinHandler(onEnterGiftCardPin)}\n value={giftCardPin}\n aria-labelledby='ms-checkout-gift-card__label ms-checkout-gift-card__error'\n />\n );\n\n const inputExp = (\n <input\n ref={inputExpRef}\n type='text'\n className='ms-checkout-gift-card__input-exp-text form-contol'\n aria-label={`${giftCardExpLabel} ${giftCardExpPlaceholderText}`}\n placeholder={giftCardExpPlaceholderText}\n onChange={onChangeExpHandler(onEnterGiftCardExp)}\n value={giftCardExp}\n aria-describedby='ms-checkout-gift-card__label ms-checkout-gift-card__error'\n />\n );\n\n const applyButton = (\n <Button\n className='ms-checkout-gift-card__btn-apply'\n onClick={onApplyHandler(onApplyGiftCard)}\n aria-label={applyGiftCardButton}\n disabled={disableAddGiftCard || !giftCardNumber}\n >\n {applyGiftCardButton}\n </Button>\n );\n\n let showGiftCardPinInput = false;\n let showGiftCardExpInput = false;\n\n switch (additionalFields) {\n case showAdditionalFields.pin:\n showGiftCardPinInput = true;\n break;\n case showAdditionalFields.expirationDate:\n showGiftCardExpInput = true;\n break;\n case showAdditionalFields.pinAndExpirationDate:\n showGiftCardPinInput = true;\n showGiftCardExpInput = true;\n break;\n default:\n }\n\n return {\n formProps,\n label,\n inputPinLabel,\n inputExpLabel,\n alert,\n inputProps,\n inputNumProps,\n inputPinProps,\n inputExpProps,\n inputNumber,\n inputPin,\n inputExp,\n applyButton,\n supportExternalGiftCard,\n showGiftCardPinInput,\n showGiftCardExpInput,\n alertFieldLabel\n };\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { IGiftCardExtend } from '@msdyn365-commerce/global-state';\nimport { Button, INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nexport interface IGetItemInput {\n giftCard: IGiftCardExtend;\n canRemove: boolean;\n resources: {\n enteredGiftCardLabel: string;\n giftCardAvailableBalanceLabel: string;\n removeGiftCardButton: string;\n };\n getFormattedPrice(price?: number, currencyCode?: string): string;\n onRemoveGiftCard(giftCardNumber: string): void;\n}\n\nexport interface IItem {\n itemProps: INodeProps;\n id?: string;\n selectedGiftCard: React.ReactNode;\n removeButton?: React.ReactNode;\n}\n\n/**\n * On remove function.\n * @param onRemoveGiftCard -Gift card number function.\n * @param giftCard -Gift card values.\n * @returns Call of onRemoveGiftCard function.\n */\nconst onRemoveHandler = (onRemoveGiftCard: (giftCardNumber: string) => void, giftCard: IGiftCardExtend) => (): void => {\n onRemoveGiftCard(giftCard.Id ?? '');\n};\n\n/**\n * GiftCardItem component.\n * @param root0\n * @param root0.giftCard\n * @param root0.getFormattedPrice\n * @param root0.canRemove\n * @param root0.onRemoveGiftCard\n * @param root0.resources\n * @param root0.resources.enteredGiftCardLabel\n * @param root0.resources.giftCardAvailableBalanceLabel\n * @param root0.resources.removeGiftCardButton\n * @extends {React.PureComponent<IGiftCardItemProps>}\n */\nexport const getItem = ({\n giftCard,\n getFormattedPrice,\n canRemove,\n onRemoveGiftCard,\n resources: { enteredGiftCardLabel, giftCardAvailableBalanceLabel, removeGiftCardButton }\n}: IGetItemInput): IItem => {\n const balance = getFormattedPrice(giftCard.Balance, giftCard.CardCurrencyCode);\n const giftCardLast4Digit = (giftCard.Id || '').substr(-4);\n\n const itemProps = {\n className: 'ms-checkout-gift-card__item'\n };\n\n const selectedGiftCard = (\n <span className='ms-checkout-gift-card__item-text'>\n {enteredGiftCardLabel}\n {' '}\n {giftCardLast4Digit}\n {' ('}\n {giftCardAvailableBalanceLabel}\n {' '}\n <span className='ms-checkout-gift-card__balance'>\n {balance}\n </span>\n {')'}\n </span>\n );\n\n const removeButton = canRemove && (\n <Button className='ms-checkout-gift-card__btn-remove' onClick={onRemoveHandler(onRemoveGiftCard, giftCard)}>\n {removeGiftCardButton}\n </Button>\n );\n\n return {\n itemProps,\n id: giftCard.Id,\n selectedGiftCard,\n removeButton\n };\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { IGiftCardExtend } from '@msdyn365-commerce/global-state';\nimport { INodeProps } from '@msdyn365-commerce-modules/utilities';\n\nimport { getItem, IItem } from './get-item';\n\ninterface IGetListInput {\n giftCards?: IGiftCardExtend[];\n canRemove: boolean;\n resources: {\n enteredGiftCardLabel: string;\n giftCardAvailableBalanceLabel: string;\n removeGiftCardButton: string;\n };\n getFormattedPrice(price?: number, currencyCode?: string): string;\n onRemoveGiftCard(giftCardNumber: string): void;\n}\n\nexport interface IList {\n listProps: INodeProps;\n list: IItem[];\n}\n\nexport const getList = ({ giftCards, canRemove, resources, getFormattedPrice, onRemoveGiftCard }: IGetListInput): IList | undefined => {\n if (!giftCards || giftCards.length === 0) {\n return undefined;\n }\n\n const listProps = {\n className: 'ms-checkout-gift-card__list'\n };\n\n const list = giftCards.map(giftCard => getItem({\n canRemove,\n getFormattedPrice,\n giftCard,\n onRemoveGiftCard,\n resources\n })\n );\n\n return {\n listProps,\n list\n };\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport * as React from 'react';\n\ninterface IGiftCardTitleProps {\n title: string;\n}\n\nconst GiftCardTitle: React.FC<IGiftCardTitleProps> = ({ title }) => (<label className='ms-checkout-gift-card__title'>\n {title}\n</label>);\n\nexport default GiftCardTitle;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { IGiftCardExtend } from '@msdyn365-commerce/global-state';\nimport {\n getGiftCardAsync, getTenderTypesAsync, resolveCardTypesAsync\n} from '@msdyn365-commerce/retail-proxy/dist/DataActions/StoreOperationsDataActions.g';\nimport {\n CardType, CardTypeInfo, GiftCard, RetailOperation, TenderType\n} from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { IModuleStateProps, withModuleState } from '@msdyn365-commerce-modules/checkout-utilities';\nimport { IModuleProps } from '@msdyn365-commerce-modules/utilities';\nimport classname from 'classnames';\nimport { computed, when } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { OPERATIONS } from '../checkout';\nimport { ICheckoutGiftCardData } from './checkout-gift-card.data';\nimport { ICheckoutGiftCardProps } from './checkout-gift-card.props.autogenerated';\nimport { getForm, IForm } from './components/get-form';\nimport { getList, IList } from './components/get-list';\nimport TitleCompoent from './components/title';\n\nexport * from './components/get-form';\nexport * from './components/get-item';\nexport * from './components/get-list';\n\ninterface ICheckoutGiftCardState {\n isFetchingGiftCard: boolean;\n errorMessage: string;\n giftCardNumber: string;\n giftCardPin: string;\n giftCardExp: string;\n}\n\nenum SupportedGiftCardType {\n Internal = 'internal',\n External = 'external',\n Both = 'both'\n}\n\nexport interface ICheckoutGiftCardModuleProps extends ICheckoutGiftCardProps<ICheckoutGiftCardData>, IModuleStateProps { }\n\nexport interface IShowResource {\n title: React.ReactNode;\n list?: IList;\n}\n\nexport interface IAddResource {\n form: IForm;\n list?: IList;\n}\n\nexport interface ICheckoutGiftCardViewProps extends ICheckoutGiftCardProps<{}>, ICheckoutGiftCardState {\n className?: string;\n\n showGiftCard?: IShowResource;\n addGiftCard?: IAddResource;\n\n checkoutGiftCardProps: IModuleProps;\n couldPaidByGiftCard?: boolean;\n isEnabled?: boolean;\n onEdit?(): void;\n onCancel?(): void;\n onSubmit?(): void;\n enterGiftCardNumber?(giftCardNumber: string): void;\n enterGiftCardPin?(giftCardNumber: string): void;\n enterGiftCardExp?(giftCardNumber: string): void;\n removeGiftCard?(giftCardNumber: string): void;\n applyGiftCard?(): void;\n}\n\n/**\n *\n * CheckoutGiftCard component.\n * @extends {React.Component<ICheckoutGiftCardProps<ICheckoutGiftCardData>, ICheckoutGiftCardState>}\n */\n@observer\nexport class CheckoutGiftCard extends React.Component<ICheckoutGiftCardModuleProps, ICheckoutGiftCardState> {\n public state: ICheckoutGiftCardState = {\n isFetchingGiftCard: false,\n errorMessage: '',\n giftCardNumber: '',\n giftCardPin: '',\n giftCardExp: ''\n };\n\n private readonly inputRef: React.RefObject<HTMLInputElement> = React.createRef();\n\n private readonly inputPinRef: React.RefObject<HTMLInputElement> = React.createRef();\n\n private readonly inputExpRef: React.RefObject<HTMLInputElement> = React.createRef();\n\n @computed get isDataReady(): boolean {\n return (this.props.data.checkout.result && this.props.data.checkout.status) === 'SUCCESS';\n }\n\n @computed get getLoyaltyAmount(): number {\n const checkoutState = this.props.data.checkout.result;\n if (!checkoutState || !checkoutState.loyaltyAmount) {\n return 0;\n }\n return checkoutState.loyaltyAmount;\n }\n\n @computed get getGiftCardTotalAmount(): number {\n const checkoutState = this.props.data.checkout.result;\n if (!checkoutState || !checkoutState.giftCardExtends) {\n return 0;\n }\n return checkoutState.giftCardExtends.reduce((count: number, giftCard: IGiftCardExtend) => {\n const balance: number = giftCard.Balance || 0;\n return count + balance;\n }, 0);\n }\n\n @computed get disableAddGiftCard(): boolean {\n const cart = this.props.data.checkout.result ? this.props.data.checkout.result.checkoutCart.cart : undefined;\n if (!cart) {\n return true;\n }\n return (cart.TotalAmount || 0) - this.getLoyaltyAmount - this.getGiftCardTotalAmount <= 0;\n }\n\n @computed get shouldPayGiftCard(): boolean {\n const cart = this.props.data.checkout.result ? this.props.data.checkout.result.checkoutCart.cart : undefined;\n if (!cart) {\n return false;\n }\n\n // Use gift card card when loyalty points do not cover the total amount\n const amountDue = (cart.TotalAmount || 0) - this.getLoyaltyAmount;\n return amountDue > 0;\n }\n\n @computed get hasSelectedItem(): boolean {\n const {\n data: { checkout }\n } = this.props;\n const giftCards = checkout.result && checkout.result.giftCardExtends;\n return !!giftCards && giftCards.length > 0;\n }\n\n @computed get isPaymentVerificationRedirection(): boolean {\n const { requestFormData, query } = this.props.context.request;\n return !!((requestFormData && query && query.pv === '1'));\n }\n\n public componentDidMount(): void {\n when(\n () => this.isDataReady,\n () => {\n this.init();\n }\n );\n }\n\n public shouldComponentUpdate(nextProps: ICheckoutGiftCardModuleProps,\n nextState: ICheckoutGiftCardState): boolean {\n if (this.state === nextState && this.props.data === nextProps.data) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element | null {\n const {\n moduleState: { isReady },\n data: { checkout },\n config: { className, showAdditionalFields },\n resources\n } = this.props;\n const { errorMessage, giftCardNumber, giftCardPin, giftCardExp } = this.state;\n const giftCards = checkout.result && checkout.result.giftCardExtends;\n const additionalFields = showAdditionalFields;\n const supportedGiftCardType = this.props.context.app.config.giftCardSupported;\n\n if (!this.isEnabled() || (!this.shouldPayGiftCard && !isReady)) {\n this.props.context.telemetry.error('Checkout giftcard content is empty, module wont render');\n return null;\n }\n\n const supportExternalGiftCard = supportedGiftCardType !== SupportedGiftCardType.Internal;\n\n const moduleClassName = classname('ms-checkout-gift-card', className, isReady ? 'show' : 'add');\n\n const viewProps: ICheckoutGiftCardViewProps = {\n ...this.props,\n ...this.state,\n className: moduleClassName,\n\n checkoutGiftCardProps: { moduleProps: this.props, className: moduleClassName },\n couldPaidByGiftCard: this.couldPaidByGiftCard(),\n isEnabled: this.isEnabled(),\n onEdit: this.onEdit,\n onCancel: this.onCancel,\n onSubmit: this.onSubmit,\n enterGiftCardNumber: this.enterGiftCardNumber,\n enterGiftCardPin: this.enterGiftCardPin,\n enterGiftCardExp: this.enterGiftCardExp,\n removeGiftCard: this.removeGiftCard,\n applyGiftCard: this.applyGiftCard,\n showGiftCard: isReady ?\n {\n title: <TitleCompoent title={resources.giftCardFormLabel} />,\n list: getList({\n canRemove: false,\n getFormattedPrice: this.getFormattedPrice,\n giftCards: giftCards && [...giftCards], // Note: ReadOnly Checkout State GiftCard[] is not assignable to GiftCard[] type\n onRemoveGiftCard: this.removeGiftCard,\n resources\n })\n } :\n undefined,\n addGiftCard: !isReady ?\n {\n form: getForm({\n errorMessage,\n giftCardNumber,\n giftCardPin,\n giftCardExp,\n inputRef: this.inputRef,\n inputPinRef: this.inputPinRef,\n inputExpRef: this.inputExpRef,\n resources,\n onEnterGiftCardNumber: this.enterGiftCardNumber,\n onEnterGiftCardPin: this.enterGiftCardPin,\n onEnterGiftCardExp: this.enterGiftCardExp,\n onApplyGiftCard: this.applyGiftCard,\n supportExternalGiftCard,\n additionalFields,\n disableAddGiftCard: this.disableAddGiftCard\n }),\n list: getList({\n canRemove: true,\n getFormattedPrice: this.getFormattedPrice,\n giftCards: giftCards && [...giftCards], // Note: ReadOnly Checkout State GiftCard[] is not assignable to GiftCard[] type\n onRemoveGiftCard: this.removeGiftCard,\n resources\n })\n } :\n undefined\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n private readonly init = (): void => {\n this.props.moduleState.init({\n onEdit: this.onEdit,\n onCancel: this.onCancel,\n onSubmit: this.onSubmit,\n isRequired: false,\n ...(!this.isEnabled() && { status: 'disabled' })\n });\n\n const giftCards = this.props.data.checkout.result?.giftCardExtends;\n if (giftCards && giftCards.length > 0) {\n this.props.moduleState.onReady();\n } else if (this.isPaymentVerificationRedirection) {\n this.props.moduleState.onSkip();\n }\n\n };\n\n private readonly couldPaidByGiftCard = (): boolean => {\n const cart = this.props.data.checkout.result ? this.props.data.checkout.result.checkoutCart.cart : undefined;\n if (!cart) {\n return false;\n }\n\n // Use gift card when it is not free\n return (cart.TotalAmount || 0) > 0;\n };\n\n private readonly isEnabled = (): boolean => {\n if (!this.props.context.request.user.isAuthenticated &&\n this.props.context.app.config.giftCardSupported !== SupportedGiftCardType.External &&\n !this.props.config.shouldBeEnabledForGuest) {\n return false;\n }\n return this.couldPaidByGiftCard();\n };\n\n private readonly onEdit = (): void => {\n // Show add gift card form\n this.props.moduleState.onUpdating();\n };\n\n private readonly onCancel = (): void => {\n this.handleCancelOrSubmit();\n };\n\n private readonly onSubmit = (): void => {\n this.handleCancelOrSubmit();\n };\n\n private readonly handleCancelOrSubmit = () => {\n if (this.hasSelectedItem) {\n // Show summary screen\n this.props.moduleState.onReady();\n } else {\n // Skip the module\n this.props.moduleState.onSkip();\n }\n };\n\n private readonly getFormattedPrice = (price: number = 0, currencyCode: string = 'USD'): string => {\n return this.props.context.cultureFormatter.formatCurrency(price, currencyCode);\n };\n\n private readonly enterGiftCardNumber = (giftCardNumber: string): void => {\n this.setState({\n giftCardNumber\n });\n this.clearError();\n };\n\n private readonly enterGiftCardPin = (giftCardPin: string): void => {\n this.setState({\n giftCardPin\n });\n this.clearError();\n };\n\n private readonly enterGiftCardExp = (giftCardExp: string): void => {\n this.setState({\n giftCardExp\n });\n this.clearError();\n };\n\n private readonly setError = (errorMessage: string): void => {\n this.props.telemetry.error('Error', errorMessage);\n this.props.telemetry.debug('Error', errorMessage);\n this.props.moduleState.setHasError(true);\n this.setState({\n errorMessage\n });\n };\n\n private readonly clearError = (): void => {\n this.props.moduleState.setHasError(false);\n this.setState({\n errorMessage: ''\n });\n };\n\n private readonly removeGiftCard = async (giftCardNumber: string): Promise<void> => {\n const checkoutState = this.props.data.checkout.result;\n if (!checkoutState) {\n return;\n }\n\n await checkoutState.removeGiftCard({ giftCardNumber });\n };\n\n private readonly applyGiftCard = async (): Promise<void> => {\n if (this.state.isFetchingGiftCard) {\n return;\n }\n this.setState({\n isFetchingGiftCard: true\n });\n\n const checkoutState = this.props.data.checkout.result;\n const giftCardNumber = this.state.giftCardNumber.trim();\n const giftCardPin = this.state.giftCardPin.trim();\n const giftCardExp = this.state.giftCardExp.trim();\n\n const giftCardTypes = await this.getGiftCardTypes(giftCardNumber);\n const giftCardType = giftCardTypes && giftCardTypes[0];\n const isPinRequired = giftCardType && giftCardType.IsPinRequired;\n const isExpRequired = giftCardType && giftCardType.IsExpirationDateRequired;\n const tenderTypeId = giftCardType && giftCardType.PaymentMethodId;\n const giftCard = await this.getGiftCard(giftCardNumber, giftCardPin, giftCardExp, isPinRequired, isExpRequired, tenderTypeId);\n\n if (checkoutState && giftCard) {\n await checkoutState.addGiftCard({ giftCard, additionalProperties: { Pin: giftCardPin, ExpirationDate: giftCardExp, TenderTypeId: tenderTypeId } });\n this.clearError();\n this.setState({\n giftCardNumber: '',\n giftCardPin: '',\n giftCardExp: '',\n isFetchingGiftCard: false\n });\n return Promise.resolve();\n }\n const input =\n this.inputRef && this.inputRef.current && this.inputRef.current.focus && (this.inputRef.current as HTMLElement);\n input && input.focus();\n this.setState({\n isFetchingGiftCard: false\n });\n\n };\n\n private readonly findGiftcardTenderTypes = (tenderTypes: TenderType[], operationId: RetailOperation, giftcardType: string): string[] | undefined => {\n let matchedTenderTypes: TenderType[] | undefined;\n\n switch (giftcardType) {\n case SupportedGiftCardType.Internal:\n matchedTenderTypes = tenderTypes.filter(tenderType => (tenderType.OperationId === operationId && tenderType.ConnectorId === ''));\n break;\n case SupportedGiftCardType.External:\n matchedTenderTypes = tenderTypes.filter(tenderType => (tenderType.OperationId === operationId && tenderType.ConnectorId !== ''));\n break;\n default:\n throw new Error('Invalid gift card type');\n }\n\n if (matchedTenderTypes) {\n return matchedTenderTypes.map(tenderType => tenderType.TenderTypeId || '');\n }\n return;\n };\n\n private readonly getGiftCard = async (giftCardNumber: string, giftCardPin: string, giftCardExp: string, isPinRequired: boolean | undefined, isExpRequired: boolean | undefined, tenderTypeId: string | undefined): Promise<GiftCard | undefined> => {\n const {\n resources: { noBalanceError, invalidCardInfoError, invalidCardTypeError, noCardPinError, noCardExpError }\n } = this.props;\n\n const supportedGiftCardType = this.props.context.app.config.giftCardSupported;\n\n if (!tenderTypeId) {\n return undefined;\n }\n\n const tenderTypes = await getTenderTypesAsync({ callerContext: this.props.context.actionContext, queryResultSettings: {} }).catch(error => {\n throw error;\n });\n\n if (!tenderTypes) {\n throw new Error('Fail to get gift card tender line');\n }\n const internalGiftcardTenderTypes = this.findGiftcardTenderTypes(tenderTypes, OPERATIONS.PayGiftCertificate, SupportedGiftCardType.Internal);\n const externalGiftcardTenderTypes = this.findGiftcardTenderTypes(tenderTypes, OPERATIONS.PayGiftCertificate, SupportedGiftCardType.External);\n\n switch (supportedGiftCardType) {\n case undefined:\n case SupportedGiftCardType.Internal:\n if (!internalGiftcardTenderTypes?.includes(tenderTypeId)) {\n this.setError(invalidCardTypeError);\n return undefined;\n }\n break;\n case SupportedGiftCardType.External:\n if (!externalGiftcardTenderTypes?.includes(tenderTypeId)) {\n this.setError(invalidCardTypeError);\n return undefined;\n }\n break;\n case SupportedGiftCardType.Both:\n if (!internalGiftcardTenderTypes?.includes(tenderTypeId) && !externalGiftcardTenderTypes?.includes(tenderTypeId)) {\n this.setError(invalidCardTypeError);\n return undefined;\n }\n break;\n default:\n throw new Error('Unsupported gift card type');\n }\n\n if (isPinRequired && giftCardPin === '') {\n this.setError(noCardPinError);\n return undefined;\n }\n\n if (isExpRequired && giftCardExp === '') {\n this.setError(noCardExpError);\n return undefined;\n }\n\n const month = Number.parseInt(giftCardExp.split('/')[0], 10);\n const year = Number.parseInt(giftCardExp.split('/')[1], 10);\n\n return getGiftCardAsync({ callerContext: this.props.context.actionContext }, giftCardNumber, tenderTypeId, giftCardPin, month, year)\n .then(activeGiftCard => {\n if (!activeGiftCard.Balance || activeGiftCard.Balance === 0) {\n this.setError(noBalanceError);\n return;\n }\n return activeGiftCard;\n })\n .catch(error => {\n this.setError(invalidCardInfoError);\n return undefined;\n });\n };\n\n private readonly getGiftCardTypes = async (giftCardNumber: string): Promise<CardTypeInfo[] | undefined> => {\n const {\n resources: { emptyInputError, duplicatedCodeError, invalidCodeError },\n data: { checkout }\n } = this.props;\n\n if (!giftCardNumber) {\n this.setError(emptyInputError);\n return undefined;\n }\n\n const isDuplicated = checkout.result && checkout.result.giftCardExtends.some((card: GiftCard) => card.Id === giftCardNumber);\n if (isDuplicated) {\n this.setError(duplicatedCodeError);\n return undefined;\n }\n\n return resolveCardTypesAsync({ callerContext: this.props.context.actionContext }, giftCardNumber, CardType.GiftCard)\n .then(giftCardTypes => {\n if (!giftCardTypes || giftCardTypes.length === 0 || giftCardTypes[0] === undefined) {\n this.setError(invalidCodeError);\n return;\n }\n return giftCardTypes;\n })\n .catch(error => {\n this.setError(invalidCodeError);\n return undefined;\n });\n };\n}\n\nexport default withModuleState(CheckoutGiftCard);\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { IGiftCardExtend } from '@msdyn365-commerce/global-state';\nimport { Address, GiftCard, TenderLine, TokenizedPaymentCard } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { action, computed, observable } from 'mobx';\n\n/**\n * State information related to what is needed to succesfully perform a checkout.\n */\nexport class CheckoutState {\n @observable private _tokenizedPaymentCard: TokenizedPaymentCard | undefined ;\n\n @computed public get tokenizedPaymentCard(): Readonly<TokenizedPaymentCard> | undefined {\n return this._tokenizedPaymentCard;\n }\n\n @observable private _tenderLine: TenderLine | undefined;\n\n @computed public get tenderLine(): Readonly<TenderLine> | undefined {\n return this._tenderLine;\n }\n\n @observable private _billingAddress: Address | undefined ;\n\n @computed public get billingAddress(): Readonly<Address> | undefined {\n return this._billingAddress;\n }\n\n @observable private _shippingAddress: Address | undefined;\n\n @computed public get shippingAddress(): Readonly<Address> | undefined {\n return this._shippingAddress;\n }\n\n @observable private _cardPrefix: string | undefined;\n\n @computed public get cardPrefix(): Readonly<string> | undefined {\n return this._cardPrefix;\n }\n\n @observable private _giftCards: GiftCard[] = [];\n\n @computed public get giftCards(): readonly GiftCard[] {\n return this._giftCards;\n }\n\n @observable private _giftCardExtends: IGiftCardExtend[] = [];\n\n @computed public get giftCardExtends(): readonly IGiftCardExtend[] {\n return this._giftCardExtends;\n }\n\n @observable private _loyaltyCardNumber?: string;\n\n @computed public get loyaltyCardNumber(): Readonly<string> | undefined {\n return this._loyaltyCardNumber;\n }\n\n @observable private _loyaltyAmount: number = 0;\n\n @computed public get loyaltyAmount(): Readonly<number> | number {\n return this._loyaltyAmount;\n }\n\n @observable private _guestCheckoutEmail: string = '';\n\n @computed public get guestCheckoutEmail(): Readonly<string> | string {\n return this._guestCheckoutEmail;\n }\n\n @observable private _isTermsAndConditionAccepted: boolean = false;\n\n @computed public get isTermsAndConditionAccepted(): Readonly<boolean> | boolean {\n return this._isTermsAndConditionAccepted;\n }\n\n @observable private _customerAccountAmount: number = 0;\n\n @computed public get customerAccountAmount(): Readonly<number> | number {\n return this._customerAccountAmount;\n }\n\n @action\n public updateTokenizedPaymentCard(newTokenizedPaymentCard: TokenizedPaymentCard): void {\n this._tokenizedPaymentCard = newTokenizedPaymentCard;\n }\n\n @action\n public updateTenderLine(newTenderLine: TenderLine | undefined): void {\n this._tenderLine = newTenderLine;\n }\n\n @action\n public updateShippingAddress(newShippingAddress: Address): void {\n this._shippingAddress = newShippingAddress;\n }\n\n @action\n public updateBillingAddress(newBillingAddress: Address): void {\n this._billingAddress = newBillingAddress;\n }\n\n @action\n public updateCardPrefix(newCardPrefix: string): void {\n this._cardPrefix = newCardPrefix;\n }\n\n @action\n public removeGiftCard(giftCardNumber: string): void {\n this._giftCards = this._giftCards.filter(giftCard => giftCard.Id !== giftCardNumber);\n }\n\n @action\n public removeGiftCardExtend(giftCardNumber: string): void {\n this._giftCardExtends = this._giftCardExtends.filter(giftCard => giftCard.Id !== giftCardNumber);\n }\n\n @action\n public addGiftCard(giftCard: GiftCard): void {\n this._giftCards = [giftCard, ...this._giftCards];\n }\n\n @action\n public addGiftCardExtend(giftCard: IGiftCardExtend): void {\n this._giftCardExtends = [giftCard, ...this._giftCards];\n }\n\n @action\n public updateLoyaltyCardNumber(newLoyaltyCardNumber: string): void {\n this._loyaltyCardNumber = newLoyaltyCardNumber;\n }\n\n @action\n public updateLoyaltyAmount(newAmount: number): void {\n this._loyaltyAmount = newAmount;\n }\n\n @action\n public updateGuestCheckoutEmail(newGuestCheckoutEmail: string): void {\n this._guestCheckoutEmail = newGuestCheckoutEmail;\n }\n\n @action\n public updateTermsAndConditionsAcceptance(newIsTermsAndConditionAccepted: boolean): void {\n this._isTermsAndConditionAccepted = newIsTermsAndConditionAccepted;\n }\n\n @action\n public updateCustomerAccountAmount(newAmount: number): void {\n this._customerAccountAmount = newAmount;\n }\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ISearchResultModalViewProps } from './components';\nimport { ICategoryHierarchyViewProps, IRefineMenuViewProps, ISearchResultContainerViewProps, ISortByViewProps, ITitleViewProps } from './search-result-container';\n\nconst SearchResultContainerView: React.FC<ISearchResultContainerViewProps> = props => {\n const { SearchResultContainer, products, pagination, ProductsContainer, ProductSectionContainer, choiceSummary, isMobile, modalToggle, searchResultModal, TitleViewProps,\n refineMenu, categoryHierarchy, sortByOptions, CategoryNavContainer, RefineAndProductSectionContainer, errorMessage, FeatureSearchContainer, similarLookProduct } = props;\n const isRecoSearchPage = props.context.actionContext.requestContext.query?.recommendation;\n if (isMobile) {\n return (\n <Module {...SearchResultContainer}>\n {renderCategoryHierarchy(categoryHierarchy)}\n {renderTitle(TitleViewProps)}\n {choiceSummary}\n {modalToggle}\n {createSearchResultModal(searchResultModal, refineMenu, sortByOptions, isRecoSearchPage)}\n <Node {...FeatureSearchContainer}>\n {similarLookProduct}\n </Node>\n <Node {...ProductsContainer}>\n {errorMessage}\n {products}\n </Node>\n {pagination}\n </Module>\n );\n }\n return (\n <Module {...SearchResultContainer}>\n <Node {...CategoryNavContainer}>\n {categoryHierarchy && renderCategoryHierarchy(categoryHierarchy)}\n {TitleViewProps && renderTitleCount(TitleViewProps)}\n </Node>\n <Node {...RefineAndProductSectionContainer}>\n {refineMenu && renderRefiner(refineMenu)}\n <Node {...ProductSectionContainer}>\n {TitleViewProps && renderTitle(TitleViewProps)}\n {choiceSummary}\n {sortByOptions && !isRecoSearchPage && renderSort(sortByOptions)}\n <Node {...FeatureSearchContainer}>\n {similarLookProduct}\n </Node>\n <Node {...ProductsContainer}>\n {errorMessage}\n {products}\n </Node>\n {pagination}\n </Node>\n </Node>\n </Module>\n );\n\n};\n\nconst createSearchResultModal = (modalProps: ISearchResultModalViewProps, refineMenu: IRefineMenuViewProps,\n sortByDropDown: ISortByViewProps, isRecoSearchPage?: string): JSX.Element => {\n return React.cloneElement(modalProps.modal, {}, modalProps.modalHeader,\n createModalBody(modalProps, refineMenu, sortByDropDown, isRecoSearchPage), modalProps.modalFooter);\n};\n\nconst createModalBody = (props: ISearchResultModalViewProps, refineMenu: IRefineMenuViewProps,\n sortByDropDown: ISortByViewProps, isRecoSearchPage?: string): JSX.Element | null => {\n if (sortByDropDown) {\n return React.cloneElement(props.modalBody, {}, renderSort(sortByDropDown, isRecoSearchPage), renderRefiner(refineMenu));\n }\n return null;\n};\n\nconst renderRefiner = (props: IRefineMenuViewProps): JSX.Element | null => {\n const { refiners, RefineMenuContainer, RefinerSectionContainer } = props;\n if (refiners) {\n return (\n <Node {...RefinerSectionContainer}>\n <Node {...RefineMenuContainer}>\n {refiners.map((submenu, index) => (\n <React.Fragment key={index}>\n {submenu}\n </React.Fragment>\n ))}\n </Node>\n </Node>\n );\n }\n return null;\n};\n\nconst renderSort = (props: ISortByViewProps, isRecoSearchPage?: string): JSX.Element | null => {\n const { SortingContainer, sortByDropDown } = props;\n if (sortByDropDown && !isRecoSearchPage) {\n return (\n <Node {...SortingContainer}>\n {sortByDropDown}\n </Node>\n );\n }\n return null;\n};\n\nconst renderCategoryHierarchy = (props: ICategoryHierarchyViewProps): JSX.Element | null => {\n const { CategoryHierarchyContainer, categoryHierarchyList, categoryHierarchySeparator } = props;\n if (categoryHierarchyList) {\n return (\n <Node {...CategoryHierarchyContainer}>\n {categoryHierarchyList.map((category, index) => (\n <React.Fragment key={index}>\n {category}\n {categoryHierarchyList && categoryHierarchyList[index + 1] && categoryHierarchySeparator}\n </React.Fragment>\n ))}\n </Node>\n );\n }\n\n return null;\n};\n\nconst renderTitle = (props: ITitleViewProps): JSX.Element | null => {\n const { title, TitleContainer } = props;\n if (title) {\n return (\n <Node {...TitleContainer}>\n <h2>\n {title.titlePrefix}\n {title.titleText}\n </h2>\n </Node>\n );\n }\n return null;\n};\n\nconst renderTitleCount = (props: ITitleViewProps): JSX.Element | null => {\n const { title, TitleContainer } = props;\n if (title) {\n return (\n <Node {...TitleContainer}>\n <h5>\n {title.titleCount}\n </h5>\n </Node>\n );\n }\n return null;\n};\n\nexport default SearchResultContainerView;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IPromoBannerViewProps } from './promo-banner';\n\nconst PromoBannerView: React.FC<IPromoBannerViewProps> = props => {\n const {\n promoBannerProps,\n contentProps,\n closeButton,\n bannerMessages,\n promoBannerTextProps,\n promoBannerLinksProps,\n carouselProps,\n promoBannerText,\n handleLinks,\n handleText\n } = props;\n\n const slides = bannerMessages && bannerMessages.map((message, index) => {\n return (\n <Node\n {...contentProps}\n key={index}\n aria-live='polite'\n role='marquee'>\n <span className='sr-only' >\n {promoBannerText}\n </span>\n {message.text && <Node {...promoBannerTextProps} text={message.text} onClick={handleText} />}\n {message.links && message.links.length > 0 && <Node {...promoBannerLinksProps} links={message.links} onClick={handleLinks} />}\n </Node>\n );\n });\n\n return (\n <Module {...promoBannerProps}>\n <Node {...carouselProps} items={slides} />\n {closeButton}\n </Module>\n );\n};\nexport default PromoBannerView;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport Checkout from './checkout';\nimport CheckoutView from './checkout.view';\n\nexport * from './actions/get-products-in-active-checkout-cart';\nexport * from './checkout';\nexport * from './checkout.data';\nexport * from './checkout.props.autogenerated';\nexport * from './checkout.view';\nexport * from './components';\nexport * from './methods';\n\nexport {\n Checkout,\n CheckoutView\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport { RatingComponent, SwatchComponent } from '@msdyn365-commerce/components';\nimport { IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\nimport { ProductRefinerSource, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\nimport { checkIfShouldDisplayAsSwatch, DimensionTypes, IDimensionsApp, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { format, getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IRefineItemCommonProps } from './refine-item.props.common';\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\n\n/**\n * RefineItem properties.\n */\nexport interface IRefineItemProps {\n\n parentProductRefinerHierarchy: IProductRefinerHierarchy;\n productRefinerValue: ProductRefinerValue;\n selectedRefinementCriterion: ProductRefinerValue | undefined;\n selectedRefinerValues?: ProductRefinerValue[];\n refineItemCommonProps: IRefineItemCommonProps;\n isDisabled: boolean;\n context: ICoreContext<IGeneric<IAny>>;\n moduleId: string;\n moduleTypeName: string;\n index?: number;\n productCountAriaLabel?: string;\n singleProductCountAriaLabel?: string;\n refineItemAriaLabel?: string;\n refineItemsAriaLabel?: string;\n isMobileView?: boolean;\n\n /**\n * The telemetry content\n */\n telemetryContent?: ITelemetryContent;\n onToggle(notfication: Readonly<IRefineItemToggleNotification>): void;\n urlBuilder(refiner: IRefineItemToggleNotification): string;\n}\n\n/**\n * Refine item state.\n */\nexport interface IRefineItemState extends React.ComponentState {\n isChecked: boolean;\n renderingError?: object;\n}\n\n/**\n * Single-select and multi-select refine item component (controlled by RefineSubmenu).\n */\nexport default class RefineItem extends React.Component<IRefineItemProps, IRefineItemState> {\n private readonly anchorType: React.RefObject<HTMLAnchorElement>;\n\n private readonly payLoad: IPayLoad;\n\n public constructor(props: IRefineItemProps) {\n super(props);\n this._onClick = this._onClick.bind(this);\n this.state = {\n isChecked: !!this.props.selectedRefinementCriterion\n };\n this.anchorType = React.createRef();\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, '');\n }\n\n public shouldComponentUpdate(nextProps: IRefineItemProps,\n nextState: IRefineItemState): boolean {\n if (this.state === nextState && this.props === nextProps) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element | undefined {\n const {\n isDisabled,\n refineItemCommonProps,\n parentProductRefinerHierarchy,\n productRefinerValue,\n selectedRefinementCriterion,\n productCountAriaLabel,\n singleProductCountAriaLabel,\n index,\n children,\n onToggle,\n context,\n telemetryContent,\n refineItemAriaLabel,\n refineItemsAriaLabel,\n ...attrs\n } = this.props;\n if (!productRefinerValue) {\n refineItemCommonProps.telemetry.error('[refine-item] Cannot render refineItem without productRefinerValue');\n return undefined;\n }\n if (!productRefinerValue.LeftValueBoundString) {\n refineItemCommonProps.telemetry.warning(`[refine-item] RefineItem without LeftValueBoundString: ${JSON.stringify(productRefinerValue)}`);\n }\n const isSingleSelect = parentProductRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect;\n let itemTypeClassName = isSingleSelect ? 'single-select' : 'multi-select';\n itemTypeClassName = `ms-refine-submenu-item ${itemTypeClassName}`;\n const inputType = isSingleSelect ? 'radio' : 'checkbox';\n const isChecked = !!selectedRefinementCriterion;\n itemTypeClassName = isChecked ? `${itemTypeClassName}-checked` : itemTypeClassName;\n if (parentProductRefinerHierarchy.SourceValue === ProductRefinerSource.Rating) {\n return this._renderRating(productRefinerValue, parentProductRefinerHierarchy, isChecked, context, index, telemetryContent,\n productCountAriaLabel, singleProductCountAriaLabel);\n\n }\n this.payLoad.contentAction.etext = productRefinerValue.LeftValueBoundLocalizedString ?? productRefinerValue.LeftValueBoundString;\n const attribute = getTelemetryAttributes(telemetryContent!, this.payLoad);\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\n const productText = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\n const productCount = productRefinerValue.Count || 0;\n let refineMenuItemAriaLabel;\n if (productCount === 1) {\n refineMenuItemAriaLabel = refineItemAriaLabel ? format(refineItemAriaLabel, parentProductRefinerHierarchy.KeyName, productText) : '';\n } else {\n refineMenuItemAriaLabel =\n refineItemsAriaLabel ? format(refineItemsAriaLabel, parentProductRefinerHierarchy.KeyName, productText, productCount) : '';\n }\n return (\n <li className='ms-refine-submenu-item' id={`${parentProductRefinerHierarchy.KeyName!}_${index}`}>\n <a\n key={selectedRefinementCriterion ? 'true' : 'false'}\n ref={this.anchorType}\n href={this._getRefinerUrl()}\n tabIndex={0}\n onClick={this._onClick}\n className={itemTypeClassName}\n role={inputType}\n aria-label={refineMenuItemAriaLabel}\n aria-checked={!!selectedRefinementCriterion}\n {...attribute}\n {...attrs}\n >\n {this._renderSwatch()}\n <span className='ms-refine-submenu-item__label' aria-hidden='true'>\n {/* eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string. */}\n {productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString}\n {productRefinerValue.Count !== undefined && ` (${productRefinerValue.Count})`}\n </span>\n </a>\n </li>\n );\n\n }\n\n private _renderSwatch(): JSX.Element | null {\n const productRefinerValue = this.props.productRefinerValue;\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\n const text = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\n\n const dimensionType = (this.props.parentProductRefinerHierarchy.KeyName?.toLocaleLowerCase() ?? '') as DimensionTypes;\n const hasColor = !StringExtensions.isNullOrWhitespace(productRefinerValue.SwatchColorHexCode);\n const hasImage = !StringExtensions.isNullOrWhitespace(productRefinerValue.SwatchImageUrl);\n const hasValidSwatch = hasColor || hasImage;\n const shouldDisplayAsSwatch = hasValidSwatch && checkIfShouldDisplayAsSwatch(\n dimensionType, this.props.context as ICoreContext<IDimensionsApp>);\n const swatchItems = shouldDisplayAsSwatch ? [\n {\n itemId: `${productRefinerValue.RefinerRecordId ?? ''}-${dimensionType}-${text}`,\n value: text,\n dimensionType,\n colorHexCode: productRefinerValue.SwatchColorHexCode,\n imageUrl: productRefinerValue.SwatchImageUrl\n }\n ] : undefined;\n\n if (!swatchItems) {\n return null;\n }\n\n return (\n <SwatchComponent\n className='ms-refine-submenu-item__swatch'\n apiSettings={this.props.context.request.apiSettings}\n list={swatchItems}\n isSelectionEnabled={false}\n isRefineItem\n />\n );\n }\n\n private _getRefinerUrl(): string {\n const { urlBuilder, parentProductRefinerHierarchy, productRefinerValue, selectedRefinementCriterion } = this.props;\n\n if (productRefinerValue) {\n return urlBuilder({\n parentProductRefinerHierarchy,\n productRefinerValue,\n isSelecting: !selectedRefinementCriterion\n });\n }\n\n return '';\n }\n\n private readonly _onClick = (e: React.MouseEvent<HTMLAnchorElement | HTMLInputElement>): void => {\n e.preventDefault();\n\n const { parentProductRefinerHierarchy, productRefinerValue, selectedRefinementCriterion } = this.props;\n if (productRefinerValue) {\n this.props.onToggle({\n parentProductRefinerHierarchy,\n productRefinerValue,\n isSelecting: !selectedRefinementCriterion\n });\n\n setTimeout(\n () => {\n this.anchorType.current && this.anchorType.current.focus();\n },\n 0\n );\n }\n };\n\n private _renderRating(productRefinerValue: ProductRefinerValue, parentProductRefinerHierarchy: IProductRefinerHierarchy,\n isChecked: boolean, context: ICoreContext, index?: number, telemetryContent?: ITelemetryContent,\n ratingUserCountAriaLabel?: string, ratingSingleUserCountAriaLabel?: string): JSX.Element | undefined {\n if (productRefinerValue.LeftValueBoundString) {\n this.payLoad.contentAction.etext = productRefinerValue.LeftValueBoundLocalizedString;\n const attribute = getTelemetryAttributes(telemetryContent!, this.payLoad);\n const refinerRating = Number.parseInt(productRefinerValue.LeftValueBoundString, 10);\n const ratingRefiner = this.props.selectedRefinerValues?.find(value => value.DataTypeValue === productRefinerValue.DataTypeValue);\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\n const selectedRating = Number.parseInt(ratingRefiner?.LeftValueBoundString || '0', 10);\n const defaultChkProductCount = 1;\n let ratingComponentClass: string = 'ms-rating-component';\n if (refinerRating > selectedRating) {\n ratingComponentClass = `${ratingComponentClass}__up`;\n } else if (refinerRating < selectedRating) {\n ratingComponentClass = `${ratingComponentClass}__down`;\n } else {\n ratingComponentClass = `${ratingComponentClass}__current`;\n }\n const productCountAriaLabelValue = (productRefinerValue.Count !== undefined &&\n productRefinerValue.Count === defaultChkProductCount) ? (ratingSingleUserCountAriaLabel &&\n format(ratingSingleUserCountAriaLabel, productRefinerValue.Count)) : (ratingUserCountAriaLabel &&\n format(ratingUserCountAriaLabel, productRefinerValue.Count));\n return (\n <li\n className='ms-refine-submenu-item'\n role={!this.props.isMobileView ? 'presentation' : undefined}\n id={`${parentProductRefinerHierarchy.KeyName!}_${index!}`}\n >\n <a\n href={this._getRefinerUrl()}\n role='option'\n aria-selected={isChecked}\n aria-label={`${parentProductRefinerHierarchy.KeyName!}_${productRefinerValue.LeftValueBoundLocalizedString!}\n ${productCountAriaLabelValue!}`}\n onClick={this._onClick}\n {...attribute}\n >\n <RatingComponent\n className={ratingComponentClass}\n avgRating={refinerRating}\n ratingCount={productRefinerValue.LeftValueBoundLocalizedString ?? productRefinerValue.LeftValueBoundString}\n hideCount={false}\n readOnly\n ariaLabel=''\n context={context}\n id={this.props.moduleId}\n typeName={this.props.moduleTypeName}\n data={{}}\n />\n <span className='refine-submenu-item__rating' aria-hidden={this.props.isMobileView ? 'true' : undefined}>\n {productRefinerValue.Count !== undefined && `(${productRefinerValue.Count})`}\n </span>\n </a>\n </li>\n );\n }\n return undefined;\n }\n\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { ProductDimensionFull } from '@msdyn365-commerce/commerce-entities';\nimport { getCatalogId, ICoreContext, IImageSettings } from '@msdyn365-commerce/core';\nimport { ProductListLine, ProductSearchCriteria, ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\nimport { searchByCriteriaAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport {\n addItemToOrderTemplate,\n AddItemToOrderTemplateInput,\n getDimensionsForSelectedVariant,\n GetDimensionsForSelectedVariantInput,\n getSelectedVariant,\n SelectedVariantInput\n} from '@msdyn365-commerce-modules/retail-actions';\nimport { Modal, ModalBody, ModalHeader } from '@msdyn365-commerce-modules/utilities';\nimport { get } from 'lodash';\nimport { computed } from 'mobx';\nimport React from 'react';\n\nimport { IProductConfigurationState, NotFoundComponent, ProductConfiguration, ProductList } from '.';\nimport Spinner from './spinner';\n\nexport interface IAddLineToTemplateProps {\n context: ICoreContext;\n resources: IAddLineToTemplateResources;\n orderTemplateId: string;\n imageSettings?: IImageSettings;\n}\n\nexport interface IAddLineToTemplateResources {\n addLineModalLinkText: string;\n searchButtonAriaLabel: string;\n searchInputAriaLabel: string;\n searchModalPlaceholderText: string;\n selectProductButtonText: string;\n addItemToTemplateText: string;\n addLineProductUnitPricePrefix: string;\n backButtonText: string;\n decrementButtonAriaLabel: string;\n incrementButtonAriaLabel: string;\n quantitySelectLabel: string;\n addLineProductUnitOfMeasurePrefix: string;\n notFoundSearchErrorNotice: string;\n notFoundSearchErrorRedediation: string;\n searchErrorMessage: string;\n productDimensionTypeColor: string;\n productDimensionTypeConfiguration: string;\n productDimensionTypeSize: string;\n productDimensionTypeStyle: string;\n searchResultsCountVerbage: string;\n searchResultsCountSubject: string;\n addToTemplateConfirmation: string;\n totalPriceLabel: string;\n progressNotificationText: string;\n addToTemplateDuplicateError: string;\n addToTemplateGenericError: string;\n dimensionMissingError: string;\n backToResultsText?: string;\n}\n\nenum CONTENT {\n Search,\n ProductList,\n ProductConfiguration,\n NotFound,\n Error,\n Loading\n}\n\ninterface IAddLineToTemplateState {\n isOpen: boolean;\n query: string;\n products: ProductSearchResult[];\n content: number;\n selectedProduct: SimpleProduct | null;\n selectedProductDimensions?: ProductDimensionFull[];\n selectedQuantity?: number;\n reloadPage?: boolean;\n}\n\n/**\n * Add Lines to order template.\n */\nexport class AddLineToTemplate extends React.Component<IAddLineToTemplateProps, IAddLineToTemplateState> {\n public state: IAddLineToTemplateState = {\n isOpen: false,\n query: '',\n products: [],\n content: CONTENT.Search,\n selectedProduct: null\n };\n\n public defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=64&h=64&m=6', w: 0, h: 0 },\n lg: { q: 'w=64&h=64&m=6', w: 0, h: 0 },\n xl: { q: 'w=64&h=64&m=6', w: 0, h: 0 }\n },\n lazyload: true\n };\n\n public searchTextInput: React.RefObject<HTMLInputElement> = React.createRef();// @TODO public/private\n\n private readonly addLineButtonRef: React.RefObject<HTMLButtonElement> = React.createRef<HTMLButtonElement>();\n\n constructor(props: IAddLineToTemplateProps) {\n super(props);\n }\n\n public onComponentDidMount(): void {\n this.searchTextInput.current?.focus();\n }\n\n public onComponentDidUpdate(): void {\n this.searchTextInput.current?.focus();\n }\n\n @computed get showBackArrow(): boolean {\n return this.state.content === CONTENT.ProductConfiguration;\n }\n\n public shouldComponentUpdate(nextProps: IAddLineToTemplateProps,\n nextState: IAddLineToTemplateState): boolean {\n if (this.state === nextState && this.props === nextProps) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element {\n const {\n resources: { addLineModalLinkText, backToResultsText }\n } = this.props;\n\n const modalProps = {\n ...this.props,\n className: 'msc-add-line-to-template',\n toggle: this._toggleModalHandler,\n isOpen: this.state.isOpen,\n ariaLabel: addLineModalLinkText\n };\n\n return (\n <>\n <Modal {...modalProps}>\n <ModalHeader toggle={this._toggleModalHandler}>\n {this.showBackArrow && <button\n type='button'\n className='msc-modal__back-button'\n aria-label={backToResultsText}\n onClick={this._onBackButtonClickHandler}\n />}\n {addLineModalLinkText}\n </ModalHeader>\n {this._renderContent()}\n </Modal>\n <button\n type='button'\n className='msc-add-line-to-template__button msc-btn'\n aria-label={addLineModalLinkText}\n onClick={this._toggleModalHandler}\n ref={this.addLineButtonRef}>\n <span />\n {addLineModalLinkText}\n </button>\n </>\n );\n }\n\n private readonly _renderSearchForm = () => {\n const {\n resources: { searchButtonAriaLabel, searchModalPlaceholderText }\n } = this.props;\n\n return (\n <form\n className='msc-add-line-to-template__search-form'\n aria-label={searchButtonAriaLabel}\n name='add-line-to-template-search-form'\n role='form'\n autoComplete='off'\n onSubmit={this._onSearchSubmit}\n >\n <input\n type='text'\n autoFocus\n aria-label={searchModalPlaceholderText}\n className='msc-form-control msc-add-line-to-template__search-input'\n placeholder={searchModalPlaceholderText}\n value={this.state.query}\n onChange={this._onInputChange}\n ref={this.searchTextInput}\n maxLength={200}\n />\n <button\n className='msc-add-line-to-template__search-button'\n aria-label={searchButtonAriaLabel}\n color='primary'\n />\n </form>\n );\n };\n\n private readonly _onSearchSubmit = (event: React.FormEvent): void => {\n event.preventDefault();\n\n const query = get(this, 'searchTextInput.current.value', null);\n\n if (!query) {\n return;\n }\n\n this.setState({\n content: CONTENT.Loading\n });\n\n this._getSearchResults(query)\n .then(result => {\n if (result.length === 0) {\n this.setState({\n products: result,\n content: CONTENT.NotFound\n });\n } else {\n this.setState({\n products: result,\n content: CONTENT.ProductList\n });\n }\n })\n .catch(error => {\n this.setState({\n content: CONTENT.Error\n });\n });\n };\n\n private readonly _onQuantityChangeHandler = (event: React.ChangeEvent<HTMLInputElement>) => {\n this.setState({\n selectedQuantity: +event.target.value\n });\n };\n\n private readonly _onSelectItem = async (product: ProductSearchResult): Promise<ProductDimensionFull[]> => {\n const {\n actionContext,\n request: {\n apiSettings: { channelId }\n }\n } = this.props.context;\n const varianteInput = new SelectedVariantInput(product.RecordId, channelId, [], undefined,\n this.props.context.request);\n const productVariant = await getSelectedVariant(varianteInput, actionContext);\n\n if (!productVariant) {\n this.props.context.telemetry.error('Error retrieving product variant');\n return Promise.resolve([]);\n }\n\n const dimensions = await this._getProductDimensions(product as SimpleProduct);\n\n this.setState({\n selectedProductDimensions: dimensions,\n content: CONTENT.ProductConfiguration,\n selectedProduct: productVariant\n });\n\n return dimensions;\n };\n\n private readonly _onInputChange = (event: React.ChangeEvent<HTMLInputElement>): void => {\n this.setState({\n query: event.target.value\n });\n };\n\n private readonly _onBackButtonClickHandler = (): void => {\n this.setState({\n content: CONTENT.ProductList\n });\n };\n\n private readonly _highlightSearchTerm = (name: string) => {\n const parsedName = name && unescape(name.replace(new RegExp(this.state.query, 'i'), '<span>$&</span>'));\n\n return <div className='msc-add-line-to-template__product__name' dangerouslySetInnerHTML={{ __html: parsedName || '' }} />;\n };\n\n private readonly _resultCountText = (): string => {\n return this.props.resources.searchResultsCountVerbage\n .replace('{count}', this.state.products.length.toString())\n .replace('{subject}', `${this.props.resources.searchResultsCountSubject}${(this.state.products.length > 1 ? 's' : '')}`);\n };\n\n private _renderContent(): React.ReactNode | null {\n switch (this.state.content) {\n case CONTENT.ProductConfiguration:\n const { selectedProduct, selectedProductDimensions } = this.state;\n const viewProps = {\n ...this.props,\n imageSettings: this.props.imageSettings || this.defaultImageSettings,\n product: selectedProduct!,\n dimensions: selectedProductDimensions!,\n addToTemplateHandler: this._addItemToTemplateHandler,\n onQuantityChangeHandler: this._onQuantityChangeHandler,\n highlightSearchTerm: this._highlightSearchTerm,\n searchForm: this._renderSearchForm()\n };\n\n return <ProductConfiguration {...viewProps} />;\n\n case CONTENT.ProductList:\n const productProps = {\n ...this.props,\n imageSettings: this.props.imageSettings || this.defaultImageSettings,\n clickHandler: this._onSelectItem,\n products: this.state.products,\n highlightSearchTerm: this._highlightSearchTerm,\n searchForm: this._renderSearchForm(),\n renderResultCountText: this._resultCountText\n };\n\n return (\n <ModalBody>\n <ProductList {...productProps} />\n </ModalBody>\n );\n\n case CONTENT.Loading:\n return (\n <ModalBody>\n {this._renderSearchForm()}\n <Spinner className='msc-add-line-to-template' msg={this.props.resources.progressNotificationText} />\n </ModalBody>\n );\n\n case CONTENT.NotFound:\n const { notFoundSearchErrorNotice, notFoundSearchErrorRedediation } = this.props.resources;\n\n return (\n <ModalBody>\n <p className='msc-add-line-to-template__search-result-count'>\n {this._resultCountText()}\n </p>\n {this._renderSearchForm()}\n <NotFoundComponent error={notFoundSearchErrorNotice} msg={notFoundSearchErrorRedediation} />\n </ModalBody>\n );\n\n case CONTENT.Error:\n return (\n <ModalBody>\n {this._renderSearchForm()}\n <div className='msc-alert-danger' aria-live='assertive'>\n {this.props.resources.searchErrorMessage}\n </div>\n </ModalBody>\n );\n\n default:\n return (\n <ModalBody>\n {this._renderSearchForm()}\n </ModalBody>\n );\n }\n }\n\n private readonly _addItemToTemplateHandler = async (config: IProductConfigurationState): Promise<ProductListLine> => {\n const { orderTemplateId, context: { actionContext } } = this.props;\n const input = new AddItemToOrderTemplateInput(\n orderTemplateId,\n config.product.RecordId,\n config.quantity,\n config.product.DefaultUnitOfMeasure || 'ea'\n );\n\n const result = await addItemToOrderTemplate(input, actionContext);\n\n this.setState({\n reloadPage: true\n });\n\n return result;\n };\n\n private _getSearchResults(searchText: string): Promise<ProductSearchResult[]> {\n const {\n context: {\n actionContext,\n request: {\n apiSettings: { channelId }\n }\n }\n } = this.props;\n const searchCriteriaInput: ProductSearchCriteria = {};\n\n searchCriteriaInput.Context = {\n ChannelId: channelId,\n CatalogId: getCatalogId(this.props.context.request)\n };\n searchCriteriaInput.IncludeAttributes = true;\n searchCriteriaInput.SearchCondition = searchText;\n\n return searchByCriteriaAsync({ callerContext: actionContext }, searchCriteriaInput);\n }\n\n private async _getProductDimensions(product: SimpleProduct): Promise<ProductDimensionFull[]> {\n const {\n context: {\n actionContext,\n request: {\n apiSettings: { channelId }\n }\n }\n } = this.props;\n const id = product.MasterProductId ? product.MasterProductId : product.RecordId;\n\n return getDimensionsForSelectedVariant(\n new GetDimensionsForSelectedVariantInput(id, channelId, [],\n this.props.context.request),\n actionContext\n );\n }\n\n private readonly _toggleModalHandler = () => {\n\n if (this.state.isOpen) {\n this.addLineButtonRef.current!.focus();\n }\n\n this.setState({\n isOpen: !this.state.isOpen,\n content: CONTENT.Search\n });\n\n if (this.state.reloadPage) {\n window.location.reload();\n this.setState({\n reloadPage: false\n });\n }\n };\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport * as React from 'react';\n\nexport default (props: { className: string; msg?: string }) => (\n <>\n <div className={`${props.className}__loading__icon`} />\n {props?.msg && <div className={`${props.className}__loading__msg`}>\n {props?.msg}\n </div>}\n </>\n);\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\ninterface IDropdownState {\n\n /**\n * @friendlyName selectedIndex\n * @description Selected index.\n */\n selectedIndex: string;\n}\n\nexport interface IDropdownProps {\n dropdownId: number;\n dropdownName: string;\n dropdownList: IDropdownItemProps[];\n telemetryContent?: ITelemetryContent;\n onChange?(selection: IDropdownOnSelection): void;\n}\n\nexport interface IDropdownItemProps {\n value: string;\n id: number;\n}\n\nexport interface IDropdownOnSelection {\n dropdownId: number;\n selectId: string;\n selectedValue: string;\n}\n\n/**\n *\n * DropDown component.\n * @extends {React.PureComponent<IDropdownProps, IDropdownState>}\n */\nexport class Dropdown extends React.PureComponent<IDropdownProps, IDropdownState> {\n private readonly selectMenu: React.RefObject<HTMLSelectElement> = React.createRef<HTMLSelectElement>();\n\n constructor(props: IDropdownProps, state: IDropdownState) {\n super(props);\n this.state = {\n selectedIndex: ''\n };\n }\n\n public componentDidMount(): void {\n if (this.selectMenu.current) {\n this.selectMenu.current.selectedIndex = 0;\n }\n }\n\n public render(): JSX.Element {\n const { dropdownId, dropdownList, dropdownName } = this.props;\n\n return (\n <select\n id={`msc-dropdown__entry-${dropdownId}`}\n ref={this.selectMenu}\n aria-label={dropdownName}\n className='msc-dropdown__select'\n onChange={this._onChanged}\n >\n {dropdownList.map((item: IDropdownItemProps) => (item &&\n <option\n value={item.id}\n key={item.id}\n selected={+this.state.selectedIndex === +item.id}\n aria-selected={+this.state.selectedIndex === +item.id}\n >\n {item.value}\n </option>\n ))}\n </select>\n );\n }\n\n private readonly _onChanged = (event: React.ChangeEvent<HTMLSelectElement>): void => {\n this.setState({ selectedIndex: event.target.value });\n\n if (this.props.onChange) {\n this.props.onChange({\n dropdownId: this.props.dropdownId,\n selectId: event.target.value,\n selectedValue: event.target.innerText\n });\n }\n };\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport * as React from 'react';\n\nexport const NotFoundComponent = (props: { error: string; msg: string }) => (\n <>\n <div className='msc-add-line-to-template__not-found__icon' />\n <div className='msc-add-line-to-template__not-found__msg'>\n {props.error}\n </div>\n <div className='msc-add-line-to-template__not-found__remediation-instructions'>\n {props.msg}\n </div>\n </>\n);\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { debounce } from 'lodash';\nimport { reaction } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\ninterface IQuantityProps {\n min?: number;\n max: number;\n currentCount?: number;\n disabled?: boolean;\n incrementGlyphClass?: string;\n decrementGlyphClass?: string;\n decrementButtonAriaLabel?: string;\n incrementButtonAriaLabel?: string;\n inputQuantityAriaLabel?: string;\n id?: string;\n onChange?(newValue: number): void;\n}\n\ninterface IQuantityState {\n currentInput: number;\n}\n\n/**\n * Quantity Component - This component is used to add or remove quantity.\n */\n@observer\nexport default class OrderTemplateQuantity extends React.PureComponent<IQuantityProps, IQuantityState> {\n public static defaultProps: Partial<IQuantityProps> = {\n min: 1,\n decrementGlyphClass: 'fas fa-minus',\n incrementGlyphClass: 'fas fa-plus'\n };\n\n private readonly inputRef: React.RefObject<HTMLInputElement> = React.createRef<HTMLInputElement>();\n\n constructor(props: IQuantityProps) {\n super(props);\n this.state = { currentInput: props.currentCount || 1 };\n this._handleChange = this._handleChange.bind(this);\n\n reaction(\n () => this.props.currentCount,\n () => {\n this.setState({ currentInput: this.props.currentCount || 1 });\n }\n );\n }\n\n public render(): JSX.Element {\n const glyphMinusClassName: string = `${this.props.decrementGlyphClass!} quantity__controls-glyph`;\n const glyphPlusClassName: string = `${this.props.incrementGlyphClass!} quantity__controls-glyph`;\n const disabled = this.props.currentCount === this.props.min;\n const incDisabled = this.props.currentCount === this.props.max;\n const currentValue = this.state.currentInput;\n let extraClass = '';\n if (disabled) {\n // The quantity has reached its boundaries (max or min)\n extraClass = 'disabled';\n\n } else if (this.props.disabled) {\n // This.props.disabled shows if the state is not succeded yet\n extraClass = 'transition';\n }\n const getChangeHandler = (amount: number) => () => {\n this._onIncrementalChange(amount);\n };\n\n return (\n <div className='quantity'/* Id={this.props.id}*/>\n <button\n disabled={this.props.disabled || disabled}\n title={disabled ? '' : this.props.decrementButtonAriaLabel}\n className={`decrement quantity__controls ${extraClass}`}\n onClick={getChangeHandler(-1)}\n aria-hidden\n aria-label={`${this.props.decrementButtonAriaLabel}`}\n tabIndex={-1}\n color='secondary'\n >\n <span className={glyphMinusClassName} />\n </button>\n <input\n type='number'\n className='quantity-input'\n pattern='[0-9]*'\n value={currentValue}\n onChange={this._handleChange}\n onBlur={this._validateMin}\n aria-live='polite'\n aria-label={`${this.props.inputQuantityAriaLabel}`}\n role='spinbutton'\n aria-valuemin={1}\n aria-valuemax={this.props.max}\n aria-valuenow={currentValue}\n ref={this.inputRef}\n disabled={this.props.disabled}\n />\n <button\n disabled={this.props.disabled || incDisabled}\n title={incDisabled ? '' : this.props.incrementButtonAriaLabel}\n className={`increment quantity__controls ${incDisabled ? 'disabled' : ''}`}\n onClick={getChangeHandler(1)}\n aria-hidden\n aria-label={`${this.props.incrementButtonAriaLabel}`}\n tabIndex={-1}\n color='secondary'\n >\n <span className={glyphPlusClassName} />\n </button>\n </div>\n );\n }\n\n private _onIncrementalChange(amount: number): void {\n const updatedQuantity = this.state.currentInput + amount;\n\n if (updatedQuantity >= 1 && updatedQuantity <= this.props.max) {\n this.props.onChange && this.props.onChange(updatedQuantity);\n }\n }\n\n private _handleChange(e: React.ChangeEvent<HTMLInputElement>): void {\n const currentValue = Number.parseInt((e.target.value), 10);\n const minValue = this.props.min === undefined ? 1 : this.props.min;\n const inputElement = this.inputRef && this.inputRef.current && this.inputRef.current instanceof HTMLInputElement && this.inputRef.current;\n\n if (currentValue > this.props.max) {\n this.setState(\n { currentInput: this.props.max }\n );\n } else {\n this.setState(\n { currentInput: currentValue },\n () => {\n debounce(\n () => {\n if (!isNaN(this.state.currentInput) && !(this.state.currentInput < minValue) && inputElement) {\n inputElement.setAttribute('aria-valuenow', currentValue.toString());\n inputElement.setAttribute('value', currentValue.toString());\n }\n },\n 200)();\n }\n );\n }\n }\n\n private readonly _validateMin = (): void => {\n const minValue = this.props.min === undefined ? 1 : this.props.min;\n\n if (isNaN(this.state.currentInput) || (this.state.currentInput < minValue)) {\n this.props.onChange && this.props.onChange(minValue);\n } else {\n this.props.onChange && this.props.onChange(this.state.currentInput);\n }\n };\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { ProductDimensionFull } from '@msdyn365-commerce/commerce-entities';\nimport { IImageSettings, Image } from '@msdyn365-commerce/core';\nimport { ProductDimensionValue, ProductListLine } from '@msdyn365-commerce/retail-proxy';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport {\n getDimensionsForSelectedVariant,\n GetDimensionsForSelectedVariantInput,\n getFallbackImageUrl,\n getPriceForSelectedVariant,\n getProductAvailabilitiesForSelectedVariant,\n getSelectedVariant,\n IProductInventoryInformation,\n PriceForSelectedVariantInput,\n ProductAvailabilitiesForSelectedVariantInput,\n SelectedVariantInput\n} from '@msdyn365-commerce-modules/retail-actions';\nimport { Alert, Button, ITelemetryContent, ModalBody, ModalFooter } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport React from 'react';\n\nimport OrderTemplateQuantity from '../common/order-template-quantity';\nimport { Dropdown, IAddLineToTemplateProps, IAddLineToTemplateResources, IDropdownItemProps, IDropdownOnSelection } from '.';\n\nexport interface IProductCnnfigurationProps extends IAddLineToTemplateProps {\n product: SimpleProduct;\n dimensions: ProductDimensionFull[];\n imageSettings: IImageSettings;\n telemetryContent?: ITelemetryContent;\n searchForm: React.ReactNode;\n addToTemplateHandler(params: IProductConfigurationState): Promise<ProductListLine>;\n highlightSearchTerm(name: string): React.ReactNode;\n}\n\nexport interface IProductConfigurationState {\n quantity: number;\n unitPrice: number;\n totalPrice: number;\n product: SimpleProduct;\n dimensions: ProductDimensionFull[];\n selectedDimensions: {};\n productAvailableQuantity?: IProductInventoryInformation;\n buttonDisabled: boolean;\n showAddConfirmation: boolean;\n errorMessage?: string;\n isBusy: boolean;\n errors: { dimension?: string[]; add?: string };\n}\n\n/**\n * Configure selected product for addition to order template.\n */\nexport class ProductConfiguration extends React.Component<IProductCnnfigurationProps, IProductConfigurationState> {\n private selectedDimensions: {} = {};\n\n constructor(props: IProductCnnfigurationProps) {\n super(props);\n\n this.state = {\n quantity: 1,\n unitPrice: props.product.Price,\n totalPrice: props.product.Price,\n product: props.product,\n dimensions: props.dimensions.sort((a, b) => a.DimensionTypeValue - b.DimensionTypeValue),\n selectedDimensions: {},\n buttonDisabled: false,\n showAddConfirmation: false\n } as IProductConfigurationState;\n }\n\n public shouldComponentUpdate(nextProps: IProductCnnfigurationProps,\n nextState: IProductConfigurationState): boolean {\n if (this.state === nextState && this.props === nextProps) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element {\n const {\n context: {\n actionContext: {\n requestContext: { apiSettings }\n },\n request: { gridSettings }\n },\n resources: {\n addItemToTemplateText,\n addLineProductUnitPricePrefix,\n decrementButtonAriaLabel,\n incrementButtonAriaLabel,\n quantitySelectLabel,\n addLineProductUnitOfMeasurePrefix,\n totalPriceLabel\n },\n imageSettings,\n highlightSearchTerm\n } = this.props;\n const { buttonDisabled, product, quantity, unitPrice, totalPrice, showAddConfirmation, errors } = this.state;\n\n return (\n <>\n <ModalBody>\n {this.props.searchForm}\n <div className='msc-add-line-to-template__product-config'>\n <div className='msc-add-line-to-template__product__positioning-container-2'>\n <div className='msc-add-line-to-template__product__positioning-container-1'>\n <Image\n altText={product.Name ?? 'image'}\n requestContext={this.props.context.actionContext.requestContext}\n src={product?.PrimaryImageUrl ?? ''}\n fallBackSrc={getFallbackImageUrl(product?.ItemId, apiSettings) ?? ''}\n className='thumbnail'\n imageSettings={imageSettings}\n gridSettings={gridSettings!}\n loadFailureBehavior='empty'\n />\n <div className='msc-add-line-to-template__product__attributes'>\n <div className='msc-add-line-to-template__product__id'>\n {product?.ItemId}\n </div>\n {highlightSearchTerm(product?.Name ?? '')}\n <div className='msc-add-line-to-template__product__unit-price'>\n {addLineProductUnitPricePrefix}\n {' '}\n {this._formatPrice(unitPrice)}\n </div>\n <div className='msc-add-line-to-template__product__uom'>\n {addLineProductUnitOfMeasurePrefix}\n {' '}\n {product?.DefaultUnitOfMeasure}\n </div>\n </div>\n </div>\n <div className='msc-add-line-to-template__product-config__dimensions'>\n {this._getDimensionsNodes()}\n </div>\n </div>\n <div className='quantity-container'>\n <div>\n {quantitySelectLabel}\n </div>\n <OrderTemplateQuantity\n id='msc-add-line-to-template__product-config__quantity'\n currentCount={quantity}\n onChange={this._onQuantityChange}\n inputQuantityAriaLabel='Press to increment quantity by 1'\n max={10_000_000}\n decrementButtonAriaLabel={decrementButtonAriaLabel}\n incrementButtonAriaLabel={incrementButtonAriaLabel}\n />\n </div>\n </div>\n <div className='msc-add-line-to-template__product__total-price'>\n {totalPriceLabel}\n {' '}\n {this._formatPrice(totalPrice)}\n </div>\n </ModalBody>\n <ModalFooter>\n {showAddConfirmation && <div\n className='msc-add-line-to-template__add-success msc-alert-success msc-alert'\n aria-live='assertive'\n role='alert'>\n <span aria-hidden='true' />\n {this._getConfirmationMessage()}\n </div>}\n {errors?.add && <div className='msc-add-line-to-template__add-error msc-alert-danger msc-alert'>\n <span className='msi-exclamation-triangle' aria-hidden='true' />\n {errors.add}\n </div>}\n <Button\n className={classnames('msc-add-line-to-template__add-configured-product-button', { 'is-busy': this.state.isBusy })}\n aria-label={addItemToTemplateText}\n onClick={this._addToTemplateHandler}\n disabled={buttonDisabled}\n >\n {addItemToTemplateText}\n </Button>\n </ModalFooter>\n </>\n );\n }\n\n private _getConfirmationMessage(): string {\n const selectedDimensionNames = this.state.dimensions.map(dimension => {\n let variant = dimension.DimensionValues?.find(value => value.RecordId === this.selectedDimensions[dimension.DimensionTypeValue])?.Value;\n if (dimension.DimensionTypeValue === 3) {\n variant = `size ${variant}`;\n }\n return variant;\n }).filter(value => value);\n\n return this.props.resources.addToTemplateConfirmation\n .replace('{count}', this.state.quantity.toString())\n .replace('{productAndDimensions}', `${this.state.product.Name}, ${Object.values(selectedDimensionNames).join(', ')}`);\n\n }\n\n private _getDimensionsNodes(): React.ReactElement[] {\n const { dimensions } = this.state;\n const { resources } = this.props;\n\n return dimensions?.map((dimension: ProductDimensionFull) => {\n const { DimensionValues, DimensionTypeValue } = dimension;\n const mapDimensions = (value: ProductDimensionValue): IDropdownItemProps => ({\n id: value.RecordId,\n value: value.Value || ''\n });\n const dimensionName = this._getDropdownName(DimensionTypeValue, resources);\n const dropdownList: IDropdownItemProps[] = DimensionValues ? DimensionValues.map<IDropdownItemProps>(mapDimensions) : [];\n dropdownList.unshift({ id: 0, value: `Choose a ${dimensionName}` });\n\n return (\n <div key={DimensionTypeValue}>\n <div>\n {dimensionName}\n </div>\n {this.state.errors?.dimension?.includes(DimensionTypeValue.toString()) && (\n <Alert color='danger' assertive aria-label={this._getDimensionsError(dimensionName)}>\n <div className='msc-alert__header' aria-hidden='true'>\n <span className='msi-exclamation-triangle' />\n <span>\n {this._getDimensionsError(dimensionName)}\n </span>\n </div>\n </Alert>\n )}\n <Dropdown\n dropdownId={DimensionTypeValue}\n dropdownName={this._getDropdownName(DimensionTypeValue, resources)}\n dropdownList={dropdownList}\n onChange={this._onDimensionChanged}\n />\n </div>\n );\n });\n }\n\n private readonly _getDimensionsError = (dimensionName: string) => this.props.resources.dimensionMissingError.replace(/{dimensionName}/g, dimensionName);\n\n private readonly _addToTemplateHandler = async (event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {\n // Hide confirmation of previous addition when adding multiple items\n this.setState({\n isBusy: true,\n showAddConfirmation: false,\n errors: { ...this.state.errors, add: undefined }\n });\n\n const missingDimensions = this.state.dimensions.map(dimension => dimension.DimensionTypeValue.toString()).filter(type => !this.selectedDimensions[type]);\n\n this.setState({\n errors: { dimension: missingDimensions }\n });\n if (missingDimensions.length > 0) {\n this.setState({\n isBusy: false\n });\n return;\n }\n\n this.props.addToTemplateHandler({ ...this.state })\n .then(status => {\n // Validate against the existance of a ProductListId\n if (status.ProductListId) {\n this.setState({\n isBusy: false,\n showAddConfirmation: true\n });\n }\n })\n .catch(error => {\n const { addToTemplateDuplicateError, addToTemplateGenericError } = this.props.resources;\n let errorMessage;\n\n if (error.error.name === 'Microsoft_Dynamics_Commerce_Runtime_DuplicateObject') {\n errorMessage = addToTemplateDuplicateError;\n } else {\n errorMessage = addToTemplateGenericError;\n }\n\n this.setState({\n isBusy: false,\n errors: { ...this.state.errors, add: errorMessage }\n });\n this.props.context.telemetry.error('Error adding item to order template');\n });\n };\n\n private readonly _onQuantityChange = (newValue: number) => {\n this.setState({\n quantity: newValue,\n totalPrice: newValue * this.props.product.Price\n });\n };\n\n private readonly _updateDimensionValue = (productDimensionFull: ProductDimensionFull, newValueId: string | undefined): ProductDimensionValue | undefined => {\n if (newValueId && productDimensionFull.DimensionValues) {\n return productDimensionFull.DimensionValues.find(dimension => dimension.RecordId === +newValueId);\n }\n\n return undefined;\n };\n\n // Rehydrate the selected variants price, available dimensions & sizes\n private readonly _onDimensionChanged = async (selection: IDropdownOnSelection): Promise<void> => {\n const { product, dimensions, context } = this.props;\n const {\n actionContext,\n request: { apiSettings: { channelId } }\n } = context;\n\n // Remaining error notifications for missing dimensions\n const remainingDimensionsErrors = this.state.errors?.dimension?.filter(id => id !== selection.dropdownId.toString());\n\n this.setState({\n isBusy: false,\n showAddConfirmation: false,\n buttonDisabled: true,\n errors: { add: undefined, dimension: remainingDimensionsErrors }\n });\n\n // Update currently selected dimensions\n this.selectedDimensions[selection.dropdownId] = +selection.selectId;\n\n const mappedDimensions = dimensions?.map(dimension => {\n return {\n DimensionTypeValue: dimension.DimensionTypeValue,\n DimensionValue: this._updateDimensionValue(dimension, this.selectedDimensions[dimension.DimensionTypeValue]) || dimension.DimensionValue,\n ExtensionProperties: dimension.ExtensionProperties\n };\n }).filter(dimension => {\n return dimension && dimension.DimensionValue;\n });\n\n const variantProduct = (await getSelectedVariant(\n new SelectedVariantInput(\n product.MasterProductId ? product.MasterProductId : product.RecordId,\n channelId,\n mappedDimensions, undefined,\n this.props.context.request\n ),\n actionContext\n ));\n\n if (!variantProduct) {\n this.props.context.telemetry.error(`Error retrieving variant product for product ${product.MasterProductId ? product.MasterProductId : product.RecordId}`);\n return;\n }\n\n const dimensionInput = new GetDimensionsForSelectedVariantInput(\n variantProduct.RecordId,\n channelId,\n mappedDimensions,\n this.props.context.request\n );\n const variantDimensions = await getDimensionsForSelectedVariant(dimensionInput, actionContext);\n\n if (!variantDimensions) {\n this.props.context.telemetry.error('Error retrieving dimensions for reconfigured product variant');\n this.setState({\n buttonDisabled: false\n });\n return;\n }\n\n const availabilityInput = new ProductAvailabilitiesForSelectedVariantInput(\n product.MasterProductId ? product.MasterProductId : product.RecordId,\n channelId\n );\n\n // @TODO sync UX quantity w/ actual availability\n const newAvailableQuantity = await getProductAvailabilitiesForSelectedVariant(availabilityInput, actionContext);\n const priceInput = new PriceForSelectedVariantInput(product.RecordId, channelId);\n const productPrice = await getPriceForSelectedVariant(priceInput, actionContext);\n\n if (!productPrice) {\n this.props.context.telemetry.error('Error retrieving price for reconfigured product variant');\n this.setState({\n buttonDisabled: false\n });\n return;\n }\n\n this.setState({\n buttonDisabled: false,\n productAvailableQuantity: newAvailableQuantity && newAvailableQuantity[0] || undefined,\n unitPrice: +(productPrice.BasePrice || product.Price),\n dimensions: variantDimensions.sort((a, b) => a.DimensionTypeValue - b.DimensionTypeValue),\n product: variantProduct\n });\n };\n\n private readonly _getDropdownName = (dimensionType: number, resources: IAddLineToTemplateResources): string => {\n switch (dimensionType) {\n case 1: // Color\n return resources.productDimensionTypeColor;\n case 2: // Configuration\n return resources.productDimensionTypeConfiguration;\n case 3: // Size\n return resources.productDimensionTypeSize;\n case 4: // Style\n return resources.productDimensionTypeStyle;\n default:\n return '';\n }\n };\n\n private _formatPrice(price: number): string {\n const {\n context: {\n cultureFormatter: {\n formatCurrency,\n\n // @ts-expect-error\n currencyCode\n }\n }\n } = this.props;\n\n return formatCurrency(price.toFixed(2), currencyCode);\n }\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { ProductDimensionFull } from '@msdyn365-commerce/commerce-entities';\nimport { IImageSettings, Image } from '@msdyn365-commerce/core';\nimport { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\nimport { getFallbackImageUrl } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport React, { useState } from 'react';\n\nimport { IAddLineToTemplateProps } from '.';\n\nexport interface IProductListProps extends IAddLineToTemplateProps {\n products: ProductSearchResult[];\n imageSettings: IImageSettings;\n searchForm: React.ReactNode;\n clickHandler(product: ProductSearchResult): Promise<ProductDimensionFull[]>;\n highlightSearchTerm(name: string): React.ReactNode;\n renderResultCountText(): string;\n}\n\nexport const ProductList = (props: IProductListProps) => {\n const {\n products,\n context: {\n actionContext: {\n requestContext: { apiSettings }\n },\n request: {\n gridSettings\n },\n cultureFormatter: {\n formatCurrency,\n\n // @ts-expect-error\n currencyCode\n }\n },\n clickHandler,\n highlightSearchTerm,\n renderResultCountText,\n resources: { selectProductButtonText },\n imageSettings\n } = props;\n\n return (\n <>\n <p className='msc-add-line-to-template__search-result-count' aria-live='assertive'>\n {renderResultCountText()}\n </p>\n {props.searchForm}\n <div className='msc-add-line-to-template__product-list'>\n {products.map((product: ProductSearchResult, index: number) => {\n const { Price, ItemId, Name, PrimaryImageUrl } = product;\n const price = formatCurrency(Price.toFixed(2), currencyCode);\n const fallBackImg = getFallbackImageUrl(ItemId, apiSettings) ?? '';\n\n return (\n <div key={`product-${index}`} className='msc-add-line-to-template__product'>\n <div className='msc-add-line-to-template__product__positioning-container-1'>\n <Image\n altText={Name ?? 'image'}\n requestContext={props.context.actionContext.requestContext}\n src={PrimaryImageUrl ?? ''}\n fallBackSrc={fallBackImg}\n className='thumbnail'\n gridSettings={gridSettings!}\n imageSettings={imageSettings}\n loadFailureBehavior='empty'\n />\n <div className='msc-add-line-to-template__product__attributes' aria-live='polite'>\n <div className='msc-add-line-to-template__product__id'>\n {ItemId}\n </div>\n {highlightSearchTerm(Name ?? '')}\n </div>\n </div>\n <div className='msc-add-line-to-template__product__price-container'>\n <span>\n {price}\n </span>\n <ProductSelectButton product={product} buttonText={selectProductButtonText} clickHandler={clickHandler} />\n </div>\n </div>\n );\n })}\n </div>\n </>\n );\n};\n\ninterface IProductSelectButton {\n product: ProductSearchResult;\n buttonText: string;\n clickHandler(product: ProductSearchResult): Promise<ProductDimensionFull[]>;\n}\n\nconst ProductSelectButton = (props: IProductSelectButton) => {\n const [isBusy, setBusy] = useState(false);\n const { product, buttonText, clickHandler } = props;\n const getClickHandler = React.useCallback(async () => {\n setBusy(!isBusy);\n await clickHandler(product);\n setBusy(!isBusy);\n }, [clickHandler, isBusy, product]);\n\n return (\n <Button\n className={classnames('msc-add-line-to-template__product__select-button', { 'is-busy': isBusy })}\n aria-label={`${product.Name!} ${buttonText}`} // Announce as: 'Nooks surfboard' select product button\n onClick={getClickHandler}\n >\n {buttonText}\n </Button>\n );\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { AddOrderTemplateToCartComponent, ILinesAddedToCartDialogResources, IOrderTemplateNameDialogResources, RenameOrderTemplateComponent } from '@msdyn365-commerce/components';\nimport { IComponentProps, ICoreContext } from '@msdyn365-commerce/core';\nimport { ProductList } from '@msdyn365-commerce/retail-proxy';\nimport { OrderTemplate } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nexport interface IOrderTemplateActionsData {\n orderTemplate: OrderTemplate;\n}\n\nexport interface IOrderTemplateActionsProps extends IComponentProps<IOrderTemplateActionsData> {\n context: ICoreContext;\n telemetryContent?: ITelemetryContent;\n handlers: {\n onRemoveTemplate(orderTemplateId: string): void;\n onRenameTemplate(orderTemplate: ProductList): Promise<void>;\n };\n renameOrderTemplateDialogStrings: IOrderTemplateNameDialogResources;\n resources: {\n addTemplateToBagButtonText: string;\n renameTemplateButtonText: string;\n deleteTemplateButtonText: string;\n closeWindowButtonText: string;\n addToCartFailureMessage: string;\n addToCartSuccessMessage: string;\n addToCartProcessMessage: string;\n linesAddedToCartDialogResources: ILinesAddedToCartDialogResources;\n };\n}\n\nexport interface IOrderTemplateActionsViewProps {\n addTemplateToBag: React.ReactNode;\n renameTemplate?: React.ReactNode;\n removeTemplate?: React.ReactNode;\n}\n\n/**\n * Remove Order Action.\n * @param props -Order template action props.\n * @returns Remove order template.\n */\nconst removeOrderActionHandler = (props: IOrderTemplateActionsProps) => () => {\n _removeOrderTemplate(props);\n};\n\nexport const OrderTemplateActionsView = (props: IOrderTemplateActionsProps): IOrderTemplateActionsViewProps => {\n const { resources } = props;\n const { deleteTemplateButtonText } = resources;\n\n return {\n addTemplateToBag: _getOrderTemplateAddToCartDialog(props),\n renameTemplate: _getOrderTemplateRenameControl(props),\n removeTemplate: (\n <Button className='ms-order-template-action-bar__delete-template-button' onClick={removeOrderActionHandler(props)}>\n {deleteTemplateButtonText}\n </Button>\n )\n };\n};\n\nconst _removeOrderTemplate = (props: IOrderTemplateActionsProps): void => {\n const { data: { orderTemplate }, handlers } = props;\n const { onRemoveTemplate } = handlers;\n\n if (onRemoveTemplate) {\n onRemoveTemplate(orderTemplate.productList.Id);\n }\n};\n\nconst _getOrderTemplateAddToCartDialog = (props: IOrderTemplateActionsProps): React.ReactNode => {\n const { data: { orderTemplate }, typeName, id, context, telemetryContent, resources } = props;\n const {\n addTemplateToBagButtonText,\n closeWindowButtonText,\n addToCartFailureMessage,\n addToCartSuccessMessage,\n addToCartProcessMessage,\n linesAddedToCartDialogResources\n } = resources;\n\n const dialogStrings = {\n closeWindowButtonText,\n addToCartFailureMessage,\n addToCartSuccessMessage,\n addToCartProcessMessage,\n linesAddedToCartDialogResources\n };\n\n return (\n <AddOrderTemplateToCartComponent\n context={context}\n id={id}\n typeName={typeName}\n data={{ orderTemplate }}\n className=''\n addToCartText={addTemplateToBagButtonText}\n dialogStrings={dialogStrings}\n telemetryContent={telemetryContent}\n />\n );\n};\n\nconst _getOrderTemplateRenameControl = (props: IOrderTemplateActionsProps): React.ReactNode => {\n const { renameOrderTemplateDialogStrings, resources, context, handlers } = props;\n return (\n <RenameOrderTemplateComponent\n onRenameTemplate={handlers.onRenameTemplate}\n className='msc-order-template-name-dialog'\n context={context}\n id={props.id}\n data={{ orderTemplate: props.data.orderTemplate.productList }}\n typeName={props.typeName}\n renameOrderTemplateDialogStrings={renameOrderTemplateDialogStrings}\n renameOrderTemplateButtonText={resources.renameTemplateButtonText}\n />\n );\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { PriceComponent } from '@msdyn365-commerce/components';\nimport { ICoreContext, IImageSettings, Image, ITelemetry } from '@msdyn365-commerce/core';\nimport { ProductListLine } from '@msdyn365-commerce/retail-proxy';\nimport { ProductPrice, SimpleProduct } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { getFallbackImageUrl } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport React, { useState } from 'react';\n\nimport { IOrderTemplateLineViewModel } from '../order-template';\nimport OrderTemplateQuantity from './common/order-template-quantity';\n\nexport interface IOrderTemplateLineProps extends ProductListLine {\n orderTemplateLine: IOrderTemplateLineViewModel;\n productListLine: ProductListLine;\n price?: ProductPrice;\n context: ICoreContext;\n productUrl: string;\n imageSettings?: IImageSettings;\n telemetry: ITelemetry;\n moduleId: string;\n moduleTypeName: string;\n quantity: number;\n isQuantityDisabledForUpdate?: boolean;\n handlers: {\n onAddToBag(product: SimpleProduct, quantity: number, itemKey: string): void;\n onRemoveItem(line: IOrderTemplateLineViewModel): void | undefined;\n onChangeQuantity(orderTemplateLineId: string, quantity: number, props?: IOrderTemplateLineProps): void;\n onSelect(line: IOrderTemplateLineViewModel, isChecked: boolean): void;\n };\n resources: {\n selectOneRowText?: string;\n moreButtonText?: string;\n viewProductDetailsText?: string;\n productDimensionTypeColor: string;\n productDimensionTypeSize: string;\n productDimensionTypeStyle: string;\n originalPriceText: string;\n currentPriceText: string;\n freePriceText: string;\n inputQuantityAriaLabel: string;\n removeFromOrderTemplateLinesText: string;\n addToBagButtonText: string;\n deleteButtonText: string;\n incrementButtonAriaLabel?: string;\n decrementButtonAriaLabel?: string;\n editOrderTemplateLineQuantityError?: string;\n };\n index: number;\n isMobile: boolean;\n productQuantityView?: React.ReactNode;\n addToBagButton?: React.ReactNode;\n removeButton?: React.ReactNode;\n toggleDetailsDisplayed(props: IOrderTemplateLineProps): void;\n}\n\nexport interface IOrderTemplateLineViewProps {\n key?: string;\n productImage: React.ReactNode;\n productPrice?: React.ReactNode;\n addToBagButton?: React.ReactNode;\n removeButton?: React.ReactNode;\n productName?: string;\n productNumber?: React.ReactNode;\n productInfo?: React.ReactNode;\n productLabel?: React.ReactNode;\n productUnitOfMeasure?: React.ReactNode;\n productQuantity?: number;\n productQuantityView?: React.ReactNode;\n productListId?: string;\n selectLine?: React.ReactNode;\n popUp?: JSX.Element;\n isMobile?: boolean;\n}\n\ninterface IEventHandlerFactory {\n getAddToBag(): (event: React.MouseEvent<HTMLElement>) => void;\n getRemoveItem(): (event: React.MouseEvent<HTMLElement>) => void;\n}\n\nconst OrderTemplateLineActions = (props: IOrderTemplateLineProps): IEventHandlerFactory => {\n const { orderTemplateLine, productListLine, quantity, handlers } = props;\n const { LineId } = productListLine;\n const { onAddToBag, onRemoveItem } = handlers;\n\n return {\n getAddToBag: () => (event: React.MouseEvent<HTMLElement>) => {\n LineId && orderTemplateLine.fullProduct && onAddToBag(orderTemplateLine.fullProduct.ProductDetails, quantity, LineId);\n },\n getRemoveItem: () => (event: React.MouseEvent<HTMLElement>) => LineId && onRemoveItem(props.orderTemplateLine)\n };\n};\n\ninterface IPopupProps extends IOrderTemplateLineProps {\n addButtonClassName: string;\n removeButtonClassName: string;\n}\n\nconst PopUp = (props: IPopupProps): JSX.Element | null => {\n const { addToBagButtonText, removeFromOrderTemplateLinesText, moreButtonText, viewProductDetailsText } = props.resources;\n const [showMobile, setShowMobile] = useState(false);\n const componentClassName = 'ms-table';\n\n const getViewHandler = () => (event: React.MouseEvent<HTMLElement>) => {\n props.toggleDetailsDisplayed(props);\n };\n\n const toggle = React.useCallback(() => {\n setShowMobile(!showMobile);\n }, [showMobile]);\n\n return (\n <div className={`${componentClassName}__row-links-minified`}>\n <Button\n className={`${componentClassName}__row-links-toggle`}\n aria-label={moreButtonText}\n data-type={props.index}\n onClick={toggle}\n />\n {showMobile &&\n <div className={`${componentClassName}__row-links`}>\n <Button\n className='ms-table__row-links-view'\n onClick={getViewHandler()}\n title={viewProductDetailsText}\n aria-label={viewProductDetailsText}\n >\n View\n </Button>\n {getActionButton(props.isMobile, props.removeButtonClassName,\n removeFromOrderTemplateLinesText, OrderTemplateLineActions(props).getRemoveItem())}\n {getActionButton(props.isMobile, props.addButtonClassName, addToBagButtonText, OrderTemplateLineActions(props).getAddToBag())}\n </div>}\n </div>\n );\n};\n\nconst getActionButton = (isMobile: boolean, className: string, buttonText: string, clickHandler: (event: React.MouseEvent<HTMLElement>) => void): React.ReactNode => (\n <Button\n aria-label={buttonText}\n className={className}\n onClick={clickHandler}\n title={buttonText}\n >\n {isMobile ? buttonText : ''}\n </Button>\n);\n\n/**\n * On Select line function.\n * @param orderTemplateLine -Order template line.\n * @param input -Order template line props.\n * @returns Set on select order template.\n */\nconst onSelectLineHandler = (\n orderTemplateLine: IOrderTemplateLineViewModel,\n input: IOrderTemplateLineProps) => (event: React.ChangeEvent<HTMLInputElement>) => {\n orderTemplateLine.isChecked = !orderTemplateLine.isChecked;\n\n input.handlers.onSelect(orderTemplateLine, event.target.checked);\n};\n\nexport const OrderTemplateLineView = (input: IOrderTemplateLineProps): IOrderTemplateLineViewProps | null => {\n const { orderTemplateLine, productListLine, price, context, imageSettings, quantity, resources, isMobile } = input;\n const product = orderTemplateLine.fullProduct;\n const { LineId, UnitOfMeasure } = productListLine;\n const { removeFromOrderTemplateLinesText, addToBagButtonText, selectOneRowText } = resources;\n if (!product) {\n return null;\n }\n\n const { ItemId, Name, PrimaryImageUrl } = product.ProductDetails;\n const fallbackImage = getFallbackImageUrl(ItemId, context.actionContext.requestContext.apiSettings);\n const addButtonClassName = input.isMobile ? 'ms-table__row-links-add' : 'ms-order-template-table-line__product-add-button';\n const removeButtonClassName = input.isMobile ? 'ms-table__row-links-delete' : 'ms-order-template-table-line__product-remove-button';\n\n return {\n isMobile,\n selectLine: (\n <label className='checkbox-container'>\n <input\n aria-label={selectOneRowText} className='checkbox-input'\n type='checkbox' checked={orderTemplateLine.isChecked} aria-checked={orderTemplateLine.isChecked}\n onChange={onSelectLineHandler(orderTemplateLine, input)} />\n <span className='checkmark' />\n </label>\n ),\n key: LineId!,\n productImage: PrimaryImageUrl && Name && (\n _renderProductImage('ms-order-template-table-line__product-image', context, product.ProductDetails.Name!, PrimaryImageUrl, fallbackImage, imageSettings)\n ),\n productInfo: renderProductInfo(input),\n productPrice: price && _renderPrice(input),\n productNumber: product && <div className='ms-order-template-table-line__product-number'>\n {ItemId}\n </div>,\n productUnitOfMeasure: price ? (\n <div className='ms-order-template-table-line__product-unit-of-measure'>\n {UnitOfMeasure || price.UnitOfMeasure}\n </div>\n ) : (\n undefined\n ),\n productListId: LineId!,\n removeButton: getActionButton(input.isMobile, removeButtonClassName, removeFromOrderTemplateLinesText, OrderTemplateLineActions(input).getRemoveItem()),\n productQuantityView: <div>\n {_generateQuantity(input, LineId!)}\n </div>,\n productQuantity: quantity,\n addToBagButton: getActionButton(input.isMobile, addButtonClassName, addToBagButtonText, OrderTemplateLineActions(input).getAddToBag()),\n popUp: (\n <PopUp\n {...input}\n addButtonClassName={addButtonClassName}\n removeButtonClassName={removeButtonClassName}\n />\n )\n };\n};\n\nexport const OrderTemplateMobileLineView = (input: IOrderTemplateLineProps): IOrderTemplateLineViewProps | undefined => {\n const { orderTemplateLine, productListLine, price, context, imageSettings } = input;\n const product = orderTemplateLine.fullProduct;\n const { LineId, UnitOfMeasure } = productListLine;\n if (!product) {\n return;\n }\n const { ItemId, Name, PrimaryImageUrl } = product.ProductDetails;\n const fallbackImage = getFallbackImageUrl(ItemId, context.actionContext.requestContext.apiSettings);\n\n return {\n productImage: PrimaryImageUrl && Name && (\n _renderProductImage('thumbnail', context, product.ProductDetails.Name!, PrimaryImageUrl, fallbackImage, imageSettings)\n ),\n productInfo: renderProductInfo(input),\n productPrice: price && _renderPrice(input),\n productNumber: ItemId,\n productUnitOfMeasure: UnitOfMeasure || price?.UnitOfMeasure,\n productQuantityView: _generateQuantity(input, LineId!)\n };\n};\n\nexport interface IOrderTemplateProductQuantityViewProps {\n ContainerProps: INodeProps;\n input: React.ReactNode;\n}\n\n/**\n * On Change function.\n * @param onChangeQuantity -On change quantity function.\n * @param itemKey -String.\n * @param props -Order template line props.\n * @returns Set change quantity.\n */\nconst onChangeHandler = (onChangeQuantity: (orderTemplateLineId: string,\n quantity: number, props?: IOrderTemplateLineProps | undefined) => void,\nitemKey: string, props: IOrderTemplateLineProps) => (newValue: number) => {\n if (onChangeQuantity) {\n onChangeQuantity(itemKey, newValue, props);\n }\n};\n\nconst _generateQuantity = (props: IOrderTemplateLineProps, itemKey: string): React.ReactNode => {\n const { handlers, resources, quantity } = props;\n const { onChangeQuantity } = handlers;\n return (\n <OrderTemplateQuantity\n currentCount={quantity}\n onChange={onChangeHandler(onChangeQuantity, itemKey, props)}\n max={999_999_999}\n inputQuantityAriaLabel={resources.inputQuantityAriaLabel}\n incrementButtonAriaLabel={resources.incrementButtonAriaLabel}\n decrementButtonAriaLabel={resources.decrementButtonAriaLabel}\n disabled={props.isQuantityDisabledForUpdate}\n />\n );\n};\n\nexport const _renderProductImage = (\n className: string,\n context: ICoreContext,\n heading: string,\n image?: string,\n fallbackImage?: string,\n imageSettings?: IImageSettings\n): JSX.Element | null => {\n const defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=64&h=64&m=6', w: 0, h: 0 },\n lg: { q: 'w=64&h=64&m=6', w: 0, h: 0 },\n xl: { q: 'w=64&h=64&m=6', w: 0, h: 0 }\n },\n lazyload: true\n };\n\n if (image) {\n return (\n <Image\n requestContext={context.actionContext.requestContext}\n className={className}\n altText={heading}\n title={heading}\n src={image}\n fallBackSrc={fallbackImage}\n gridSettings={context.request.gridSettings!}\n imageSettings={imageSettings || defaultImageSettings}\n loadFailureBehavior='empty'\n tabIndex={0}\n />\n );\n }\n return null;\n};\n\nconst _renderPrice = (props: IOrderTemplateLineProps): JSX.Element | null => {\n const { price, context, moduleId, moduleTypeName, resources } = props;\n\n if (price) {\n return (\n <PriceComponent\n id={moduleId}\n typeName={moduleTypeName}\n data={{ price }}\n className='ms-order-template-table-line__product-price'\n freePriceText={resources.freePriceText}\n originalPriceText={resources.originalPriceText}\n currentPriceText={resources.currentPriceText}\n context={context}\n />\n );\n }\n return null;\n};\n\nconst _renderProductDimensions = (props: IOrderTemplateLineProps): (string | undefined)[] => {\n const { orderTemplateLine } = props;\n\n if (!orderTemplateLine.fullProduct || !orderTemplateLine.fullProduct.ProductDetails.Dimensions) {\n return [];\n }\n\n return orderTemplateLine.fullProduct.ProductDetails.Dimensions.map((dimension) => {\n if (!dimension.DimensionValue || !dimension.DimensionValue.Value) {\n return undefined;\n }\n\n return dimension.DimensionValue.Value;\n });\n};\n\nexport const renderProductInfo = (props: IOrderTemplateLineProps): React.ReactNode | undefined => {\n const { orderTemplateLine, productUrl } = props;\n const name = orderTemplateLine.fullProduct?.ProductDetails.Name;\n\n const dimensions = _renderProductDimensions(props);\n if (!orderTemplateLine.fullProduct) {\n return [];\n }\n\n const productName = productUrl ? (\n <a className='ms-order-template-table-line__product-info-name' href={productUrl}>\n {name}\n </a>\n ) : (\n <div className='ms-order-template-table-line__product-info-name'>\n {name}\n </div>\n );\n\n const dimensionsLine: string = dimensions.join(', ');\n\n return (\n <div className='ms-order-template-table-line__product-info'>\n <div className='ms-order-template-table-line__product-info-name'>\n {productName}\n </div>\n <div className='ms-order-template-table-line__product-info-dimension'>\n {dimensionsLine}\n </div>\n </div>\n );\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { orderTemplateLinesStatus } from '../order-template';\n\nexport interface IOrderTemplateLinesStatusMessageProps {\n className?: string;\n errorType: orderTemplateLinesStatus;\n text?: string;\n}\n\nexport const OrderTemplateLinesStatusMessage: React.FC<IOrderTemplateLinesStatusMessageProps> = ({ className, errorType, text }) => {\n switch (errorType) {\n case 'EMPTY':\n return (\n <p className={classnames('ms-order-template-lines__message-empty', className)}>\n { text }\n </p>\n );\n case 'FAILED':\n return (\n <p className={classnames('ms-order-template-lines__message-failed', className)}>\n { text }\n </p>\n );\n case 'LOADING':\n default:\n return (\n <p className='ms-order-template-lines__message-waiting'>\n { text }\n </p>\n );\n }\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport * as React from 'react';\n\nimport { IOrderTemplateLineViewModel } from '../order-template';\n\nexport interface IOrderTemplateTableHeadingProps {\n selectAllRowsText?: string;\n productNumber: string;\n productName: string;\n productUnitPrice: string;\n productUOM: string;\n productQuantity: string;\n productActions: string;\n lines: IOrderTemplateLineViewModel[];\n isMobile: boolean;\n clickHandler(isChecked: boolean): void;\n}\n\n/**\n * Order Template's table state.\n */\nexport interface IOrderTemplateTableHeadingState {\n isChecked: boolean;\n}\n\nexport interface IOrderTemplateTableShortHeading {\n productNumber: string;\n productActions: string;\n}\n\n/**\n * Order Template's table heading.\n */\nexport class OrderTemplateTableHeading extends React.PureComponent<IOrderTemplateTableHeadingProps> {\n public state: IOrderTemplateTableHeadingState = {\n isChecked: false\n };\n\n private readonly componentClassName: string = 'ms-table';\n\n public static getDerivedStateFromProps(props: IOrderTemplateTableHeadingProps, state: IOrderTemplateTableHeadingState): IOrderTemplateTableHeadingState {\n const checkedLines = props.lines.filter(line => !line.isChecked).length;\n let nextState = { ...state };\n nextState = { isChecked: checkedLines === 0 };\n return nextState;\n }\n\n public getOnChange = () => (event: React.ChangeEvent<HTMLInputElement>) => {\n this.setState({\n isChecked: this.state.isChecked\n }, () => {\n this.props.clickHandler(!this.state.isChecked);\n });\n };\n\n public render(): JSX.Element {\n return (\n <thead>\n <tr className={`${this.componentClassName}__heading-row`}>\n <th scope='col' aria-label={this.props.selectAllRowsText}>\n <label className='checkbox-container'>\n <input\n aria-label={this.props.selectAllRowsText} className='checkbox-input'\n type='checkbox' aria-checked={this.state.isChecked} checked={this.state.isChecked}\n onChange={this.getOnChange()} />\n <span className='checkmark' />\n </label>\n </th>\n <td>\n  \n </td>\n <th scope='col'>\n {this.props.productNumber}\n </th>\n {!this.props.isMobile ? <th scope='col'>\n {this.props.productName}\n </th> : null}\n {!this.props.isMobile ? <th scope='col'>\n {this.props.productUnitPrice}\n </th> : null}\n {!this.props.isMobile ? <th scope='col'>\n {this.props.productUOM}\n </th> : null}\n {!this.props.isMobile ? <th scope='col'>\n {this.props.productQuantity}\n </th> : null}\n {!this.props.isMobile ? <th scope='col'>\n {this.props.productActions}\n </th> : <td />}\n </tr>\n </thead>\n );\n }\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport {\n ICheckoutLoyaltyAdd, ICheckoutLoyaltyRewardPoint, ICheckoutLoyaltyShow,\n ICheckoutLoyaltyViewProps\n} from './checkout-loyalty';\n\nconst AddCheckoutLoyalty: React.FC<ICheckoutLoyaltyAdd> = ({\n heading,\n cardNumber,\n drawer,\n rewardPoints,\n loyaltyAmountContainer,\n appliedLoyaltyAmountContainer,\n loyaltyAmountLabel,\n loyaltyAmountInput,\n loyaltyAmountApplyButton,\n showAppliedAmount,\n loyaltyAmountAppliedText,\n loyaltyAmountAppliedPrice,\n loyaltyAmountRemoveButton\n}) => {\n\n return (\n <>\n {heading}\n {cardNumber}\n <Node {...drawer}>\n {rewardPoints.map((rewardPoint: ICheckoutLoyaltyRewardPoint) => {\n return (\n <Node {...rewardPoint.checkoutLoyaltyRewardPoint} key={rewardPoint.key}>\n {rewardPoint.title}\n {rewardPoint.availablePointsText}\n {rewardPoint.activePoints}\n {rewardPoint.expiringPointsText}\n {rewardPoint.expiringPoints}\n </Node>\n );\n })}\n </Node>\n <Node {...loyaltyAmountContainer}>\n {loyaltyAmountLabel}\n {loyaltyAmountInput}\n {loyaltyAmountApplyButton}\n {\n showAppliedAmount &&\n <Node {...appliedLoyaltyAmountContainer}>\n {loyaltyAmountAppliedText}\n {loyaltyAmountAppliedPrice}\n {loyaltyAmountRemoveButton}\n </Node>\n }\n </Node>\n </>\n );\n};\n\nconst ShowCheckoutLoyalty: React.FC<ICheckoutLoyaltyShow> = ({\n heading,\n coveredAmountText,\n amount\n}) => {\n\n return (\n <>\n {heading}\n {coveredAmountText}\n {amount}\n </>\n );\n};\n\nconst CheckoutLoyaltyView: React.FC<ICheckoutLoyaltyViewProps> = props => {\n const { checkoutLoyalty,\n viewState,\n showLoyalty,\n addLoyalty } = props;\n\n return (\n <Module {...checkoutLoyalty}>\n {viewState.isShowLoyalty && <ShowCheckoutLoyalty {...showLoyalty} />}\n {viewState.isShowAddLoyalty && <AddCheckoutLoyalty {...addLoyalty} />}\n </Module>\n );\n};\n\nexport default CheckoutLoyaltyView;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nexport * from './choice-summary';\nexport * from './choice-summary.props';\nexport * from './error-message';\nexport * from './feature-search-result-item';\nexport * from './link';\nexport * from './modal';\nexport * from './product-search-result-items';\nexport * from './range-refine-item';\nexport * from './refine-item';\nexport * from './refine-item.props.common';\nexport * from './refine-item-toggle-notification';\nexport * from './refine-submenu';\nexport * from './separator';\nexport * from './title';\nexport * from './utilities';\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { Module, Node, Waiting } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ICheckoutViewProps, ILineItem, ILineItemDeliveryGroup, ILineItems, IOrderSummary, IPickUpAtStore } from './checkout';\nimport { IEmailDelivery } from './components';\nimport { IInvoicePaymentSummary } from './components/get-invoice-payment-summary';\n\nexport const PickUpAtStoreComponent: React.FC<IPickUpAtStore> = ({ PickUpAtStore, label, location }) => (\n <Node {...PickUpAtStore}>\n {label}\n {location}\n </Node>\n);\n\nexport const EmailDeliveryComponent: React.FC<IEmailDelivery> = ({ EmailDelivery, label }) => (\n <Node {...EmailDelivery}>\n {label}\n </Node>\n);\n\nexport const LineItemComponent: React.FC<ILineItem> = ({ LineItem, item, pickUpAtStore, emailDelivery }) => (\n <Node {...LineItem}>\n {item}\n {pickUpAtStore && <PickUpAtStoreComponent {...pickUpAtStore} />}\n {emailDelivery && <EmailDeliveryComponent {...emailDelivery} />}\n </Node>\n);\n\nexport const LineItemGroupComponent: React.FC<ILineItemDeliveryGroup> = ({ LineItemDeliveryGroup, LineItemList, heading, lineItems }) => (\n <Node {...LineItemDeliveryGroup}>\n {heading}\n <Node {...LineItemList}>\n {lineItems.map(lineItem => (\n <LineItemComponent key={lineItem.LineId} {...lineItem} />\n ))}\n </Node>\n </Node>\n);\n\nexport const LineItemGroupComponentWithMultiplePickUp: React.FC<ILineItemDeliveryGroup> = ({ LineItemDeliveryGroup, LineItemList, heading, lineItems, lineItemWraper, lineItemWraperIcon }) => (\n <Node {...LineItemDeliveryGroup}>\n {lineItemWraperIcon}\n {lineItemWraper}\n {heading}\n <Node {...LineItemList}>\n {lineItems.map(lineItem => (\n <LineItemComponentWithMultiplePickUp key={lineItem.LineId} {...lineItem} />\n ))}\n </Node>\n </Node>\n);\n\nexport const LineItemComponentWithMultiplePickUp: React.FC<ILineItem> = ({ LineItem, item, pickUpAtStore, emailDelivery }) => (\n <Node {...LineItem}>\n {item}\n {emailDelivery && <EmailDeliveryComponent {...emailDelivery} />}\n </Node>\n);\n\nexport const PickUpAtStoreComponentWithMultiplePickUp: React.FC<IPickUpAtStore> = ({ PickUpAtStore, label, location }) => (\n <Node {...PickUpAtStore}>\n {label}\n {location}\n </Node>\n);\n\nexport const LineItemsComponent: React.FC<ILineItems> = ({ LineItems, Header, heading, editLink, itemsForPickup, itemsForShip, itemsForEmail, itemsGroupWithMulitplePickupMode }) => (\n <Node {...LineItems}>\n <Node {...Header}>\n {heading}\n {editLink}\n </Node>\n {itemsGroupWithMulitplePickupMode === undefined && itemsForPickup && <LineItemGroupComponent {...itemsForPickup} />}\n {itemsGroupWithMulitplePickupMode === undefined && itemsForEmail && <LineItemGroupComponent {...itemsForEmail} />}\n {itemsGroupWithMulitplePickupMode === undefined && itemsForShip && <LineItemGroupComponent {...itemsForShip} />}\n {itemsGroupWithMulitplePickupMode !== undefined ? itemsGroupWithMulitplePickupMode.map((item, index) => {\n return <LineItemGroupComponentWithMultiplePickUp {...item} key={index} />;\n }) : null}\n </Node>\n);\n\nconst OrderSummaryComponent: React.FC<IOrderSummary> = ({ heading, lines }) => (\n <div className='msc-order-summary-wrapper'>\n {heading}\n <div className='msc-order-summary__items'>\n {lines && (\n <>\n {lines.subtotal}\n {lines.shipping}\n {lines.otherCharge}\n {lines.tax}\n {lines.totalDiscounts}\n {lines.loyalty}\n {lines.giftCard}\n {lines.orderTotal}\n </>\n )}\n </div>\n </div>\n);\n\nconst PaymentSummaryComponent: React.FC<IInvoicePaymentSummary> = ({ heading, lines }) => (\n <div className='msc-invoice-summary-wrapper'>\n {heading}\n <div className='msc-invoice-summary__items'>\n {lines && (\n <>\n {lines.invoices}\n {lines.giftCard}\n {lines.loyalty}\n {lines.orderTotal}\n </>\n )}\n </div>\n </div>\n);\n\nconst CheckoutView: React.FC<ICheckoutViewProps> = props => {\n const {\n isPaymentVerificationRedirection,\n shouldEnableSinglePaymentAuthorizationCheckout,\n canShow,\n checkoutProps,\n headerProps,\n hasSalesOrder,\n hasInvoiceLine,\n bodyProps,\n mainProps,\n mainControlProps,\n sideProps,\n sideControlFirstProps,\n sideControlSecondProps,\n termsAndConditionsProps,\n orderConfirmation,\n loading,\n alert,\n title,\n guidedForm,\n orderSummary,\n invoicePaymentSummary,\n lineItems,\n placeOrderButton,\n termsAndConditions,\n keepShoppingButton\n } = props;\n\n return (\n <Module {...checkoutProps}>\n {!hasSalesOrder && <Node {...headerProps}>\n {title}\n </Node>}\n {!hasSalesOrder && isPaymentVerificationRedirection && shouldEnableSinglePaymentAuthorizationCheckout && !alert && !loading &&\n <Waiting className='msc-waiting-circular msc-waiting-lg' />}\n {!hasSalesOrder &&\n <Node {...bodyProps}>\n {loading}\n {alert}\n {canShow && (\n <>\n <Node {...mainProps}>\n {guidedForm}\n <Node {...termsAndConditionsProps}>\n {termsAndConditions}\n </Node>\n <Node {...mainControlProps}>\n {placeOrderButton}\n {keepShoppingButton}\n </Node>\n </Node>\n <Node {...sideProps}>\n {!hasInvoiceLine ? orderSummary && <OrderSummaryComponent {...orderSummary} /> : invoicePaymentSummary && <PaymentSummaryComponent {...invoicePaymentSummary} />}\n <Node {...sideControlFirstProps}>\n <Node {...termsAndConditionsProps}>\n {termsAndConditions}\n </Node>\n {placeOrderButton}\n {keepShoppingButton}\n </Node>\n {lineItems && <LineItemsComponent {...lineItems} />}\n <Node {...sideControlSecondProps}>\n <Node {...termsAndConditionsProps}>\n {termsAndConditions}\n </Node>\n {placeOrderButton}\n {keepShoppingButton}\n </Node>\n </Node>\n </>\n )}\n </Node>}\n {hasSalesOrder && orderConfirmation}\n </Module>\n );\n};\n\nexport default CheckoutView;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { IInvoiceSummaryLines, InvoiceSummary } from '@msdyn365-commerce-modules/invoice-payment-summary';\nimport get from 'lodash/get';\nimport * as React from 'react';\n\nimport { ICheckoutData } from '../checkout.data';\nimport { ICheckoutProps } from '../checkout.props.autogenerated';\n\nexport interface IInvoicePaymentSummary {\n heading?: React.ReactNode;\n lines?: IInvoiceSummaryLines;\n}\nexport const getInvoicePaymentSummary = (input: ICheckoutProps<ICheckoutData>): IInvoicePaymentSummary => {\n const {\n data: { checkout },\n resources: {\n totalAmountLabel,\n invoiceLabel,\n invoiceSummaryTitle\n },\n context,\n typeName,\n id,\n telemetry\n } = input;\n\n const checkoutCart = get(checkout, 'result.checkoutCart');\n const cart = get(checkout, 'result.checkoutCart.cart');\n\n return {\n heading: <h2 className='msc-invoice-summary__heading'>\n { invoiceSummaryTitle }\n </h2>,\n lines: checkoutCart?.hasInvoiceLine ? InvoiceSummary({\n orderTotalLabel: totalAmountLabel,\n invoiceLabel,\n cart,\n context,\n typeName,\n telemetry,\n id,\n checkoutState: checkout.result\n }) : undefined\n };\n\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { Cart, CartLineValidationResults } from '@msdyn365-commerce/retail-proxy';\nimport { updateLineDeliverySpecificationsAsync, validateForCheckoutAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\nimport {\n DeliveryPreferenceType,\n LineDeliverySpecification,\n SimpleProduct } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { IModuleStateManager, IModuleStateProps, withModuleState } from '@msdyn365-commerce-modules/checkout-utilities';\nimport {\n ArrayExtensions,\n getAvailabilitiesForCartLineItems,\n IProductInventoryInformation,\n ProductAvailabilitiesForCartLineItems,\n validateCartLinesInventory } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n Button,\n getPayloadObject,\n getTelemetryAttributes,\n getTelemetryObject,\n IModuleProps,\n INodeProps,\n ITelemetryContent,\n TelemetryConstant,\n Waiting } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport isEmpty from 'lodash/isEmpty';\nimport { computed, reaction, when } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { ICheckoutData } from './checkout.data';\nimport { ICheckoutHeadingData, ICheckoutProps } from './checkout.props.autogenerated';\nimport AlertComponent from './components/alert';\nimport { getInvoicePaymentSummary, IInvoicePaymentSummary } from './components/get-invoice-payment-summary';\nimport { getLineItems, ILineItems } from './components/get-line-items';\nimport { getOrderSummary, IOrderSummary } from './components/get-order-summary';\nimport GuidedFormComponent from './components/guided-form';\nimport PlaceOrderButtonComponent from './components/place-order-button';\nimport placeOrder from './methods/place-order';\n\nexport * from './components/get-line-items';\nexport * from './components/get-order-summary';\n\n/**\n * Device type.\n */\ntype DeviceType = 'Mobile';\n\n/**\n * The Checkout state.\n */\ninterface ICheckoutState {\n errorMessage: string;\n isValidationPassed: boolean;\n isPlaceOrderLoading?: boolean;\n}\n\n/**\n * The Checkout view props.\n * @extends ICheckoutProps<ICheckoutData>\n */\nexport interface ICheckoutViewProps extends ICheckoutProps<ICheckoutData> {\n className: string;\n canShow?: boolean;\n isEmptyCart?: boolean;\n isConsentGiven?: boolean;\n hasError?: boolean;\n isPaymentVerificationRedirection?: boolean;\n shouldEnableSinglePaymentAuthorizationCheckout?: boolean;\n cartStatus?: string;\n isMobile?: boolean;\n isEditorialMode?: boolean;\n backToShoppingUrl?: string;\n editCartLink?: string;\n hasSalesOrder: boolean;\n hasInvoiceLine?: boolean;\n\n checkoutProps: IModuleProps;\n headerProps: INodeProps;\n bodyProps: INodeProps;\n mainProps: INodeProps;\n mainControlProps: INodeProps;\n sideProps: INodeProps;\n sideControlFirstProps: INodeProps;\n sideControlSecondProps: INodeProps;\n termsAndConditionsProps: INodeProps;\n\n guidedForm?: React.ReactNode;\n title?: React.ReactNode;\n loading?: React.ReactNode;\n alert?: React.ReactNode;\n orderSummary?: IOrderSummary;\n invoicePaymentSummary?: IInvoicePaymentSummary;\n lineItems?: ILineItems;\n placeOrderButton?: React.ReactNode;\n termsAndConditions?: React.ReactNode;\n keepShoppingButton?: React.ReactNode;\n orderConfirmation?: React.ReactNode;\n}\n\n/**\n * The checkout module props interface.\n */\nexport interface ICheckoutModuleProps extends ICheckoutProps<ICheckoutData>, IModuleStateProps { }\n\n/**\n *\n * CheckoutContainer component.\n * @extends {React.Component<ICheckoutModuleProps>}\n */\n// @ts-expect-error\n@withModuleState\n@observer\nclass Checkout extends React.PureComponent<ICheckoutModuleProps> {\n\n @computed get cartStatus(): Msdyn365.AsyncResultStatus {\n return this.props.data.checkout?.status;\n }\n\n @computed get isEmptyCart(): boolean {\n if (this.isEditorialMode) {\n // Editorial mode: Ignore empty cart\n return false;\n }\n const cart = this.props.data.checkout?.result?.checkoutCart?.cart;\n return this.cartStatus === 'SUCCESS' && !!cart && !isEmpty(cart) && (!cart.CartLines || cart.CartLines.length === 0);\n }\n\n @computed get hasError(): boolean {\n const cart = this.props.data.checkout?.result?.checkoutCart?.cart;\n return this.cartStatus === 'FAILED' || (this.cartStatus === 'SUCCESS' && (!cart || isEmpty(cart)));\n }\n\n @computed get isEditorialMode(): boolean {\n return this.props.context.request.params.isEditor;\n }\n\n @computed public get isPaymentVerificationRedirection(): boolean {\n const { requestFormData, query } = this.props.context.request;\n return !!((requestFormData || (query && query.pv === '1')));\n }\n\n @computed get canPlaceOrder(): boolean {\n const isTermsAndConditionAccepted = this.props.data.checkout.result && this.props.data.checkout.result?.isTermsAndConditionAccepted;\n\n const shouldEnableSinglePaymentAuthorizationCheckout = this.props.data.checkout.result?.shouldEnableSinglePaymentAuthorizationCheckout ?? false;\n\n // If isTermsAndConditionAccepted is undefined means TermsAndCondition module is not added to page and we should able to place order.\n return this.props.moduleState.isReady &&\n (isTermsAndConditionAccepted === undefined ||\n isTermsAndConditionAccepted ||\n shouldEnableSinglePaymentAuthorizationCheckout) &&\n ((this.state.errorMessage === '' || shouldEnableSinglePaymentAuthorizationCheckout) || this.isPaymentVerificationRedirection);\n }\n\n @computed get isCartReady(): boolean {\n return !!this.props.data.checkout.result?.checkoutCart?.cart &&\n this.props.data.customerInformation.status !== 'LOADING' &&\n this.props.data.featureState.status !== 'LOADING';\n }\n\n public state: ICheckoutState = {\n errorMessage: '',\n isValidationPassed: false,\n isPlaceOrderLoading: false\n };\n\n private readonly telemetryContent: ITelemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry);\n\n public componentDidMount(): void {\n const {\n resources: { genericErrorMessage }\n } = this.props;\n\n when(\n () => this.hasError,\n () => {\n this.setState({\n errorMessage: genericErrorMessage\n });\n this.props.context.telemetry.error('Failed to get cart');\n }\n );\n\n when(\n () => {\n return this.isEmptyCart;\n },\n () => {\n this.redirectToCartPage('Cart is empty, but no editCartLink found');\n }\n );\n\n when(\n () => this.isCartReady,\n () => {\n this.validateForCheckout();\n }\n );\n\n reaction(\n () => this.props.moduleState.isReady,\n () => {\n this.onContainerReady();\n }\n );\n\n // Reaction to call place order when isPaymentSectionContainerReady is true for new checkout flow.\n reaction(\n () => this.props.data.checkout.result?.isPaymentSectionContainerReady,\n async (isReady) => {\n if (!this.props.data.checkout.result?.isExpressCheckoutApplied &&\n this.props.data.checkout.result?.shouldEnableSinglePaymentAuthorizationCheckout && isReady &&\n !this.props.data.checkout.result.redirectAdditionalContext) {\n if (!this.state.isPlaceOrderLoading) {\n this.setState({ isPlaceOrderLoading: true });\n }\n\n await this.onPlaceOrder();\n\n // If 3D authentication redirection, don't update isPlaceOrderLoading\n if (!this.props.data.checkout.result.isPaymentVerificationRequired) {\n this.setState({ isPlaceOrderLoading: false });\n }\n }\n }\n );\n\n // Reaction to enable place order button when isPaymentSectionContainerHasError is true for new checkout flow.\n reaction(\n () => this.props.data.checkout.result?.isPaymentSectionContainerHasError,\n (hasError) => {\n if (this.props.data.checkout.result?.shouldEnableSinglePaymentAuthorizationCheckout && hasError) {\n this.setState({ isPlaceOrderLoading: false });\n }\n }\n );\n\n // Reaction to enable place order button when redirection is true for new checkout flow.\n reaction(\n () => this.canPlaceOrder,\n async () => {\n if (this.props.data.checkout.result?.shouldEnableSinglePaymentAuthorizationCheckout && this.canPlaceOrder) {\n const { requestFormData, query } = this.props.context.request;\n const isRedirection = !!((requestFormData && query && query.pv === '1'));\n if (isRedirection) {\n await this.props.data.checkout.result.updateIsPlaceOrderEnabledInRedirection({\n newIsPlaceOrderEnabledInRedirection: true\n });\n }\n }\n }\n );\n }\n\n // eslint-disable-next-line complexity -- ignore the complexity.\n public render(): JSX.Element {\n const {\n moduleState,\n config: { className, checkoutHeading, disableGuidedCheckoutFlow },\n resources,\n context: {\n request: {\n user: {\n isAuthenticated\n }\n }\n }\n } = this.props;\n const { errorMessage } = this.state;\n const { backToShopping, placeOrderText, confirmPaymentText, cookieConsentRequiredMessage, genericErrorMessage } = resources;\n const checkoutClass = classnames('ms-checkout', className);\n const checkoutInformation = this.getSlotItems('checkoutInformation');\n\n const isConsentGiven =\n this.props.context.request &&\n this.props.context.request.cookies &&\n this.props.context.request.cookies.isConsentGiven &&\n this.props.context.request.cookies.isConsentGiven();\n\n const isMobile =\n this.props.context.request &&\n this.props.context.request.device &&\n (this.props.context.request.device.Type as DeviceType) === 'Mobile';\n\n const backToShoppingUrl = Msdyn365.getUrlSync('home', this.props.context.actionContext) || '';\n const editCartLink = Msdyn365.getUrlSync('cart', this.props.context.actionContext) || '';\n\n const termsAndConditions =\n this.props.slots.termsAndConditions &&\n this.props.slots.termsAndConditions.length > 0 &&\n this.props.slots.termsAndConditions[0];\n\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.BackToShopping);\n const backToShoppingAttributes = getTelemetryAttributes(this.telemetryContent, payLoad);\n\n const hasInvoiceLine = this.props.data.checkout && this.props.data.checkout.result?.checkoutCart.hasInvoiceLine;\n const checkoutBtnText = hasInvoiceLine ? confirmPaymentText : placeOrderText;\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Explicitly check for null/undefined.\n const shouldEnableSinglePaymentAuthorizationCheckout = this.props.data.checkout?.result?.shouldEnableSinglePaymentAuthorizationCheckout ?? false;\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Explicitly check null/undefined.\n const isExpressCheckoutApplied = this.props.data.checkout?.result?.isExpressCheckoutApplied ?? false;\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Explicitly check null/undefined.\n const hasShippingAddress = this.props.data.checkout?.result?.hasShippingAddress;\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Explicitly check null/undefined.\n const hasCartDeliveryMode = this.props.data.checkout?.result?.hasCartDeliveryMode;\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Explicitly check null/undefined.\n const hasGuestCheckoutEmail = this.props.data.checkout?.result?.hasGuestCheckoutEmail;\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Explicitly check null/undefined.\n const isTermsAndConditionAccepted = this.props.data.checkout?.result?.isTermsAndConditionAccepted;\n\n let viewProps: ICheckoutViewProps = {\n ...this.props,\n className: checkoutClass,\n isEmptyCart: this.isEmptyCart,\n isConsentGiven,\n hasError: this.hasError,\n isPaymentVerificationRedirection: this.isPaymentVerificationRedirection,\n shouldEnableSinglePaymentAuthorizationCheckout,\n hasSalesOrder: this.props.data.checkout && this.props.data.checkout.result !== undefined && this.props.data.checkout.result.salesOrder !== undefined,\n hasInvoiceLine,\n cartStatus: this.cartStatus,\n isMobile,\n backToShoppingUrl,\n editCartLink,\n isEditorialMode: this.isEditorialMode,\n orderConfirmation: this.props.slots.orderConfirmation && this.props.slots.orderConfirmation.length > 0 ? this.props.slots.orderConfirmation[0] : undefined,\n checkoutProps: { moduleProps: this.props, className: checkoutClass },\n headerProps: { className: 'ms-checkout__head' },\n bodyProps: { className: 'ms-checkout__body' },\n mainProps: { className: 'ms-checkout__main' },\n mainControlProps: { className: 'ms-checkout__main-control' },\n sideProps: { className: 'ms-checkout__side' },\n sideControlFirstProps: { className: 'ms-checkout__side-control-first' },\n sideControlSecondProps: { className: 'ms-checkout__side-control-second' },\n termsAndConditionsProps: { className: 'ms-checkout__terms-and-conditions' },\n title: checkoutHeading && (\n this.renderMsdyn365Text(checkoutHeading)\n )\n };\n\n if (!isConsentGiven && isAuthenticated) {\n viewProps = {\n ...viewProps,\n alert: <AlertComponent {...{ message: cookieConsentRequiredMessage }} />\n };\n } else if (this.isLoading()) {\n viewProps = {\n ...viewProps,\n loading: <Waiting className='msc-waiting-circular msc-waiting-lg' />\n };\n } else if (this.hasError) {\n viewProps = {\n ...viewProps,\n alert: <AlertComponent {...{ message: genericErrorMessage }} />\n };\n } else {\n viewProps = {\n ...viewProps,\n alert: errorMessage && <AlertComponent {...{ message: errorMessage }} />,\n canShow: true,\n guidedForm: checkoutInformation ? (\n <GuidedFormComponent\n {...{\n items: checkoutInformation,\n moduleState,\n disableGuidedCheckoutFlow,\n resource: resources,\n requestContext: this.props.context,\n isMobile,\n isEditor: this.isEditorialMode,\n telemetryContent: this.telemetryContent,\n isPaymentVerificationRedirection: this.isPaymentVerificationRedirection,\n shouldEnableSinglePaymentAuthorizationCheckout,\n hasError: !!errorMessage,\n hasShippingAddress,\n hasCartDeliveryMode,\n hasGuestCheckoutEmail,\n isTermsAndConditionAccepted\n }}\n />\n ) : (\n undefined\n ),\n orderSummary: getOrderSummary(this.props),\n invoicePaymentSummary: getInvoicePaymentSummary(this.props),\n lineItems: hasInvoiceLine ? undefined : getLineItems(this.props, this.telemetryContent),\n placeOrderButton: (\n <PlaceOrderButtonComponent {...{\n checkoutBtnText,\n placeOrder: (\n !isExpressCheckoutApplied && shouldEnableSinglePaymentAuthorizationCheckout\n ) ? this.triggerPaymentWithPlaceOrder : this.onPlaceOrder,\n\n canPlaceOrder: this.canPlaceOrder,\n telemetryContent: this.telemetryContent,\n shouldEnableSinglePaymentAuthorizationCheckout: this.props.data.checkout.result?.shouldEnableSinglePaymentAuthorizationCheckout,\n isPlaceOrderLoading: this.state.isPlaceOrderLoading,\n isExpressCheckoutApplied\n }} />\n ),\n termsAndConditions,\n keepShoppingButton: backToShoppingUrl && (\n <Button\n className='ms-checkout__btn-keep-shopping msc-btn'\n title={backToShopping}\n color='secondary'\n href={backToShoppingUrl}\n {...backToShoppingAttributes}\n >\n {backToShopping}\n </Button>\n )\n };\n }\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n /**\n * Renders heading.\n * @param checkoutHeading - The checkout heading.\n * @returns React node.\n */\n public renderMsdyn365Text(checkoutHeading: ICheckoutHeadingData): React.ReactNode {\n return (\n <Msdyn365.Text\n {...checkoutHeading}\n tag={checkoutHeading.tag || 'h2'}\n className='ms-checkout__title'\n text={checkoutHeading.text}\n editProps={{ onEdit: this.handleCheckoutHeadingChange, requestContext: this.props.context.request }}\n />\n );\n }\n\n /**\n * Event handler for heading change event.\n * @param event - The content change event in heading element.\n * @returns The new heading value.\n */\n public handleCheckoutHeadingChange = (event: Msdyn365.ContentEditableEvent) => this.props.config.checkoutHeading!.text = event.target.value;\n\n /**\n * Checks if cart is loading.\n * @returns True if is loading, false otherwise.\n */\n private readonly isLoading = (): boolean => {\n return !this.cartStatus || this.cartStatus === 'LOADING' || this.isEmptyCart || !this.state.isValidationPassed;\n };\n\n /**\n * Get slot items.\n * @param key - The slot key.\n * @returns React node or undefined.\n */\n private readonly getSlotItems = (key: string): React.ReactNode[] | undefined => {\n const { slots } = this.props;\n return slots && slots[key] && slots[key].length > 0 ? slots[key] : undefined;\n };\n\n /**\n * Trigger the payment section container submit when placing order.\n */\n private readonly triggerPaymentWithPlaceOrder = async (): Promise<void> => {\n this.setState({ isPlaceOrderLoading: true });\n\n await this.props.data.checkout.result?.updateShouldTriggerPaymentWithPlaceOrder(\n { newShouldTriggerPaymentWithPlaceOrder: !this.props.data.checkout.result.shouldTriggerPaymentWithPlaceOrder });\n };\n\n /**\n * On place order.\n * @returns Void promise.\n */\n private readonly onPlaceOrder = async (): Promise<void> => {\n const {\n resources: { checkoutOutOfStockErrorMessage, genericErrorMessage, invalidCartVersionErrorMessage },\n context: { actionContext, app: { config: { enableStockCheck = false } } },\n slots: { orderConfirmation },\n data: { checkout, products }\n } = this.props;\n\n // If hasInvoiceLine is true, no inventory check\n if (!this.props.data.checkout.result?.checkoutCart.hasInvoiceLine && enableStockCheck &&\n await this.isOverMaxQuantity((await checkout).checkoutCart.cart, (await products))) {\n this.setState({\n errorMessage: checkoutOutOfStockErrorMessage\n });\n this.props.context.telemetry.error(checkoutOutOfStockErrorMessage);\n } else {\n const hasOrderConfirmation = orderConfirmation && orderConfirmation.length > 0;\n\n const updatedCartVersion = await this.updateCartLineEmailAddress(this.props.data.checkout.result?.guestCheckoutEmail || '');\n\n await placeOrder(actionContext, this.props.data.checkout.result, this.props.data.products.result,\n !hasOrderConfirmation, updatedCartVersion, this.isPaymentVerificationRedirection).catch(error => {\n let errorMessage = genericErrorMessage;\n\n if (error && error.name === 'Microsoft_Dynamics_Commerce_Runtime_InvalidCartVersion') {\n errorMessage = invalidCartVersionErrorMessage;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- unknown error type.\n if (this.props.data.checkout.result?.shouldEnableSinglePaymentAuthorizationCheckout && error.data?.AdditionalContext &&\n !this.isPaymentVerificationRedirection) {\n return;\n }\n\n this.setState({\n errorMessage\n });\n this.props.telemetry.exception(error);\n });\n\n await checkout.result?.updateIsPaymentSectionContainerReady({ newIsPaymentSectionContainerReady: false });\n }\n };\n\n /**\n * Update receipt email address for electronic cart line.\n * @param newGuestCheckoutEmail - The guest checkout email.\n * @returns The updated cart version.\n */\n private readonly updateCartLineEmailAddress = async (newGuestCheckoutEmail: string): Promise<number | undefined> => {\n const emailDeliveryModeCode = this.props.context.request.channel?.EmailDeliveryModeCode;\n\n const emailDeliveryCartLines = this.props.data.checkout.result?.checkoutCart.cart.CartLines?.filter(\n cartLine => (cartLine.DeliveryMode && cartLine.DeliveryMode !== '' && cartLine.DeliveryMode === emailDeliveryModeCode)\n );\n\n let updatedCartVersion: number | undefined;\n if (emailDeliveryCartLines && emailDeliveryCartLines.length > 0) {\n const lineDeliverySpecifications: LineDeliverySpecification[] = emailDeliveryCartLines.map(line => {\n return { LineId: line.LineId,\n DeliverySpecification: {\n DeliveryModeId: emailDeliveryModeCode,\n DeliveryPreferenceTypeValue: DeliveryPreferenceType.ElectronicDelivery,\n ElectronicDeliveryEmailAddress: newGuestCheckoutEmail\n }\n };\n });\n\n await updateLineDeliverySpecificationsAsync(\n { callerContext: this.props.context.actionContext },\n (await this.props.data.checkout).checkoutCart.cart.Id,\n lineDeliverySpecifications\n ).then(updatedCart => {\n updatedCartVersion = updatedCart.Version;\n }).catch(error => {\n this.props.context.actionContext.telemetry.exception(error);\n throw new Error('[updateLineDeliverySpecificationsAsync] Unable to update electronic delivery email address in cart');\n });\n }\n\n return updatedCartVersion;\n };\n\n /**\n * Return true if any product in the cart is over its max quantity.\n * @param cart -- The checkout cart.\n * @param products -- The checkout products.\n * @returns - Is any product in the cart is over max quantity.\n */\n private readonly isOverMaxQuantity = async (cart: Cart, products: SimpleProduct[]): Promise<boolean> => {\n let isOverMaxQuantity = false;\n const emailDeliveryModeCode = this.props.context.request.channel?.EmailDeliveryModeCode;\n\n await getAvailabilitiesForCartLineItems(\n new ProductAvailabilitiesForCartLineItems(this.props.context.actionContext.requestContext.apiSettings),\n this.props.context.actionContext\n ).then(productInventoryInformation => {\n const productsThatShouldValidateInventory: IProductInventoryInformation [] = [];\n\n cart.CartLines?.map((cartline) => {\n\n const cartlineProduct = products.find(product => product.RecordId === cartline.ProductId);\n\n // If product is non-stocked or cartline is electronic delivery, then no inventory check\n const isStockedItem = cartlineProduct?.Behavior?.IsStockedProduct;\n const isEmailDelivery = (cartline.DeliveryMode && cartline.DeliveryMode !== '') ? cartline.DeliveryMode === emailDeliveryModeCode : false;\n const shouldSkipInventoryCheck = !isStockedItem || isEmailDelivery;\n if (!shouldSkipInventoryCheck && ArrayExtensions.hasElements(productInventoryInformation)) {\n const foundProductAvailability = productInventoryInformation.find((productInventory) => {\n return productInventory.ProductAvailableQuantity?.ProductId! === cartline.ProductId;\n });\n if (foundProductAvailability) {\n productsThatShouldValidateInventory.push(foundProductAvailability);\n }\n }\n });\n\n const cartLinesInventoryValidation = validateCartLinesInventory(\n cart.CartLines ?? [],\n productsThatShouldValidateInventory,\n this.props.context.actionContext,\n products,\n emailDeliveryModeCode);\n\n // If is invalid then exceeds the available quantity\n isOverMaxQuantity = !cartLinesInventoryValidation.isValid;\n return isOverMaxQuantity;\n }).catch(error => {\n this.props.context.actionContext.telemetry.exception(error);\n throw new Error('[getAvailabilitiesForCartLineItems] Unable to get availabilities for products in checkout cart');\n });\n\n return isOverMaxQuantity;\n };\n\n /**\n * Gets active child in module state.\n * @returns - The module state manager collection.\n */\n private readonly getActiveChildModuleStates = (): IModuleStateManager[] => {\n const { childIds, getModule } = this.props.moduleState;\n return childIds\n .map(getModule)\n .filter((state): state is IModuleStateManager => !!state && !state.isDisabled && state.hasModuleState);\n };\n\n /**\n * On container ready.\n */\n private readonly onContainerReady = (): void => {\n this.getActiveChildModuleStates().forEach(state => {\n state.isReady && state.onContainerReady && state.onContainerReady();\n });\n };\n\n /**\n * Redirects to cart page.\n * @param notFoundEditCartLinkMessage - Not found edit cart link message.\n */\n private readonly redirectToCartPage = (notFoundEditCartLinkMessage: string): void => {\n const editCartLink = Msdyn365.getUrlSync('cart', this.props.context.actionContext) || '';\n if (window && editCartLink) {\n window.location.assign(editCartLink);\n } else {\n this.setState({\n errorMessage: this.props.resources.genericErrorMessage\n });\n this.props.context.telemetry.error(notFoundEditCartLinkMessage);\n }\n };\n\n /**\n * Validates for checkout.\n * @param retry - Retry flag.\n */\n private readonly validateForCheckout = (retry: boolean = true): void => {\n const notFoundEditCartLinkMessage = 'Cart doesn\\'t pass validation, but no editCartLink found';\n const cart = this.props.data.checkout.result!.checkoutCart.cart;\n const { Id, Version } = cart;\n const isOrderQuantityLimitsFeatureEnabledInHq = this.props.data.featureState.result\n ?.find(featureState => featureState.Name === 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature')?.IsEnabled || false;\n const defaultOrderQuantityLimitsFeatureConfig = this.props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits;\n const customerInfo = this.props.data.customerInformation.result;\n\n const isOrderQuantityLimitsFeatureEnabledInSiteSettings = defaultOrderQuantityLimitsFeatureConfig === 'all' ||\n (customerInfo &&\n ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\n (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b)));\n if (isOrderQuantityLimitsFeatureEnabledInHq && isOrderQuantityLimitsFeatureEnabledInSiteSettings) {\n if (Version && Id) {\n validateForCheckoutAsync({ callerContext: this.props.context.actionContext, bypassCache: 'none' }, Id, Version)\n .then((result: CartLineValidationResults) => {\n if (result.ValidationFailuresByCartLines?.length !== 0) {\n this.redirectToCartPage(notFoundEditCartLinkMessage);\n } else {\n this.setState({ isValidationPassed: true });\n }\n })\n .catch((error) => {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to validate Cart');\n if (retry && error.name === 'Microsoft_Dynamics_Commerce_Runtime_InvalidCartVersion') {\n const cartState = this.props.data.checkout.result?.checkoutCart;\n cartState?.refreshCart({})\n .then(() => {\n this.validateForCheckout(false);\n })\n .catch((refreshError: Error) => {\n this.props.telemetry.warning(refreshError.message);\n this.props.telemetry.debug('Unable to refresh Cart');\n });\n } else {\n this.redirectToCartPage(notFoundEditCartLinkMessage);\n }\n });\n } else {\n this.redirectToCartPage(notFoundEditCartLinkMessage);\n }\n } else {\n this.setState({ isValidationPassed: true });\n }\n };\n}\n\nexport default Checkout;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { IProductsDimensionsAvailabilities } from '@msdyn365-commerce/commerce-entities';\nimport { IPriceComponentResources, ProductComponent } from '@msdyn365-commerce/components';\nimport { ICoreContext, IImageSettings } from '@msdyn365-commerce/core';\nimport { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ISearchResultContainerResources } from '../search-result-container.props.autogenerated';\n\ninterface IProductSearchResultItems {\n products: ProductSearchResult[];\n context: ICoreContext;\n resources: ISearchResultContainerResources;\n imageSettings?: IImageSettings;\n moduleType: string;\n moduleId: string;\n allowBackNavigation?: boolean;\n telemetryContent: ITelemetryContent;\n quickviewSlot?: {} | null | undefined;\n channelInventoryConfigurationId?: number;\n isPriceMinMaxEnabled?: boolean;\n productsDimensionAvailabilities?: IProductsDimensionsAvailabilities[][];\n}\n\n/**\n * Returns the product inventory label.\n * @param channelInventoryConfigurationId - The channel configuration Id.\n * @param product - The product.\n * @returns The inventory label.\n */\nexport function getInventoryLabel(\n channelInventoryConfigurationId: number | undefined, product: ProductSearchResult): string | undefined {\n\n if (!channelInventoryConfigurationId || !ArrayExtensions.hasElements(product.AttributeValues)) {\n return undefined;\n }\n const inventoryAttribute = product.AttributeValues.find(attribute => attribute.RecordId === channelInventoryConfigurationId);\n if (inventoryAttribute) {\n return inventoryAttribute.TextValue;\n }\n return undefined;\n}\n\nexport const ProductSearchResultItems: React.FC<IProductSearchResultItems> = ({\n products,\n context,\n imageSettings,\n resources,\n moduleType,\n moduleId,\n allowBackNavigation,\n telemetryContent,\n quickviewSlot,\n channelInventoryConfigurationId,\n isPriceMinMaxEnabled,\n productsDimensionAvailabilities\n}) => {\n const priceResources: IPriceComponentResources = {\n priceRangeSeparator: resources.priceRangeSeparator\n };\n return (\n\n <ul className='list-unstyled'>\n {products.map((product: ProductSearchResult, index: number) => (\n <li className='ms-product-search-result__item' key={index}>\n <ProductComponent\n context={context}\n telemetryContent={telemetryContent}\n imageSettings={imageSettings}\n freePriceText={resources.priceFree}\n originalPriceText={resources.originalPriceText}\n currentPriceText={resources.currentPriceText}\n ratingAriaLabel={resources.ratingAriaLabel}\n allowBack={allowBackNavigation}\n id={moduleId}\n key={product.RecordId}\n typeName={moduleType}\n data={{ product }}\n quickViewButton={quickviewSlot}\n inventoryLabel={getInventoryLabel(channelInventoryConfigurationId, product)}\n isPriceMinMaxEnabled={isPriceMinMaxEnabled}\n priceResources={priceResources}\n swatchItemAriaLabel={resources.swatchItemAriaLabel}\n dimensionAvailabilities={productsDimensionAvailabilities?.find(\n dimensionAvailability => ArrayExtensions.hasElements(dimensionAvailability) &&\n dimensionAvailability[0].masterProductId === product.MasterProductId)}\n />\n </li>\n ))}\n </ul>\n );\n\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\nimport { getPayloadObject, getTelemetryAttributes, IPayLoad } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { computed } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { ProductListInventoryFilteringOptions } from '../actions';\nimport { IChoiceSummaryProps } from './choice-summary.props';\nimport { isMatchingRefinementCriterion, isRangeType } from './utilities';\n\ninterface IRefinerMap {\n key: string;\n value: ProductRefinerValue;\n}\n\n/**\n * ChoiceSummary component.\n */\n@observer\nexport default class ChoiceSummary extends React.PureComponent<IChoiceSummaryProps> {\n private readonly closeButtonGlyph: string = 'msi-close-btn';\n\n private readonly payLoad: IPayLoad;\n\n @computed get selectedRefinersMap(): IRefinerMap[] {\n let { selectedChoices } = this.props;\n const { channelInventoryConfigurationId, refinerHierarchy } = this.props;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app configs are of generic type\n if (this.props.context?.app.config.productListInventoryDisplay === ProductListInventoryFilteringOptions.HideOOS) {\n selectedChoices = selectedChoices.filter(choice => {\n const parent = refinerHierarchy.find(\n // eslint-disable-next-line unicorn/prefer-array-some, max-len -- Existing code\n (hierarchy: IProductRefinerHierarchy) => !!hierarchy.Values.find((value: ProductRefinerValue) => isMatchingRefinementCriterion(value, choice))\n );\n return parent && parent.RecordId !== channelInventoryConfigurationId;\n });\n }\n return selectedChoices.map((selectedRefiner: ProductRefinerValue) => {\n return {\n key: this._getKeyForRefinerValue(selectedRefiner),\n value: selectedRefiner\n } as IRefinerMap;\n });\n }\n\n constructor(props: Readonly<IChoiceSummaryProps>) {\n super(props);\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, '');\n }\n\n public render(): JSX.Element {\n const { clearAllText, label, classNames, choiceAriaLabel, closeAriaLabel } = this.props;\n const items = this.selectedRefinersMap;\n this.payLoad.contentAction.etext = clearAllText;\n const clearAllAttributes = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\n return (\n <div className='msc-choice-summary'>\n {items.length > 0 && label && <span className='msc-choice-summary__label'>\n {label}\n </span>}\n <ul className={classnames(classNames, 'msc-choice-summary__list', 'list-unstyled')}>\n {items.map((item: IRefinerMap) => {\n this.payLoad.contentAction.etext = item.key;\n const attribute = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\n\n return (\n <li className='msc-choice-summary__list-item' key={item.key}>\n <a\n className='msc-choice-summary__item'\n href={this.props.urlBuilder(item.value, false)}\n aria-label={`${item.key} ${choiceAriaLabel}`}\n onClick={this._onClick}\n role='button'\n {...attribute}\n >\n {item.key}\n <span className={`${this.closeButtonGlyph} msc-choice-summary__glyph`} role='button' aria-label={closeAriaLabel} />\n </a>\n </li>\n );\n })}\n </ul>\n {items.length > 0 && clearAllText && <a\n href={this.props.urlBuilder({}, true)} className='msc-choice-summary__clear-all' {...clearAllAttributes}\n onClick={this._onClick}>\n {clearAllText}\n </a>}\n </div>\n );\n }\n\n private _getKeyForRefinerValue(productRefinerValue: ProductRefinerValue): string {\n const { choiceFormat, choiceRangeValueFormat, refinerHierarchy, telemetry } = this.props;\n const overallFormat = choiceFormat || '{1}';\n const rangeFormat = choiceRangeValueFormat;\n let refinerName = '';\n if (refinerHierarchy && refinerHierarchy.find) {\n const parent = refinerHierarchy.find(\n // eslint-disable-next-line unicorn/prefer-array-some, max-len -- Existing code\n (hierarchy: IProductRefinerHierarchy) => !!hierarchy.Values.find((value: ProductRefinerValue) => isMatchingRefinementCriterion(value, productRefinerValue))\n );\n\n if (!parent) {\n telemetry.warning('[choice-summary] could not find parent of selected refiner value');\n } else {\n refinerName = parent.KeyName || '';\n }\n }\n\n let refinerValueName: string;\n if (isRangeType(productRefinerValue.DataTypeValue)) {\n refinerValueName = rangeFormat\n .replace('{0}', this._formatPrice(productRefinerValue.LeftValueBoundString, productRefinerValue.UnitText))\n .replace('{1}', this._formatPrice(productRefinerValue.RightValueBoundString, productRefinerValue.UnitText));\n } else {\n refinerValueName = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\n }\n\n return overallFormat.replace('{0}', refinerName).replace('{1}', refinerValueName);\n }\n\n private _formatPrice(amount: string | undefined, currency: string | undefined): string {\n if (!amount || !currency) {\n this.props.telemetry.trace('[choice-summary] could not format price');\n return amount || '';\n }\n let result = amount;\n\n try {\n result = this.props.context!.cultureFormatter.formatCurrency(Number(amount), currency);\n } catch (error) {\n this.props.telemetry.warning(`Failed to format price for ${result}: ${error}`);\n }\n\n return result;\n }\n\n private readonly _onClick = (e: React.MouseEvent<HTMLAnchorElement>): void => {\n e.preventDefault();\n e.stopPropagation();\n\n const target = e.currentTarget as HTMLElement;\n const clearAll = target.getAttribute('class')!.includes('choice-summary__clear-all');\n const selectedRefiner = clearAll ? undefined : this._getSelectedRefinerChoice(target);\n\n if (this.props.onChoiceClicked) {\n this.props.onChoiceClicked({\n clearAll,\n itemClicked: target,\n choiceClicked: selectedRefiner,\n nextItemToFocus: target.nextSibling as HTMLElement\n });\n }\n };\n\n private _getSelectedRefinerChoice(itemClicked: HTMLElement): ProductRefinerValue | undefined {\n const result = this.selectedRefinersMap.find(selected => (itemClicked.textContent && itemClicked.textContent.trim()) === selected.key);\n return (result && result.value) || undefined;\n }\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { INodeProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ISearchCategoryViewProps, ISearchFormViewProps, ISearchKeywordViewProps, ISearchProductViewProps } from './components';\nimport { ISearchViewProps } from './search';\n\nconst SearchView: React.FC<ISearchViewProps> = props => {\n const {\n Search,\n AutoSuggestAriaLabel,\n AutoSuggestAriaLabelText,\n searchText,\n AutoSuggest,\n KeywordSuggest,\n ProductSuggest,\n CategorySuggest,\n UlKeyword,\n UlProduct,\n UlCategory,\n form,\n autosuggestCategory,\n autosuggestKeyword,\n autosuggestProduct,\n SearchForm,\n FormWrapper,\n label,\n isLoadingAutoSuggest,\n isLoadingNode\n } = props;\n\n return (\n <Module {...Search}>\n {label}\n {_renderForm(form as ISearchFormViewProps, SearchForm, FormWrapper)}\n <Node {...AutoSuggest}>\n {searchText && searchText.length > 0 ? <Node {...AutoSuggestAriaLabel}>\n {AutoSuggestAriaLabelText}\n </Node> : ''}\n {_renderKeywordSuggestions(KeywordSuggest, UlKeyword, autosuggestKeyword, isLoadingAutoSuggest, isLoadingNode)}\n {_renderProductSuggestions(ProductSuggest, UlProduct, autosuggestProduct, isLoadingAutoSuggest, isLoadingNode)}\n {_renderCategorySuggestions(CategorySuggest, UlCategory, autosuggestCategory, isLoadingAutoSuggest, isLoadingNode)}\n </Node>\n </Module>\n );\n};\n\nconst _renderForm = (form: ISearchFormViewProps, SearchForm: INodeProps, FormWrapper: INodeProps) => {\n return (\n <Node {...SearchForm}>\n <Node {...FormWrapper}>\n {form.input}\n {form.cancelBtn}\n {form.submitBtn}\n </Node>\n </Node>\n );\n};\n\nconst _renderKeywordSuggestions = (\n KeywordSuggest: INodeProps,\n UlKeyword: INodeProps,\n keywordSuggestions?: ISearchKeywordViewProps,\n isLoadingAutoSuggest?: boolean,\n isLoadingNode?: React.ReactNode\n) => {\n return (\n keywordSuggestions && (\n <Node {...KeywordSuggest}>\n <Node {...UlKeyword}>\n {isLoadingAutoSuggest && isLoadingNode}\n {!isLoadingAutoSuggest && keywordSuggestions.text.map(text => {\n return text;\n })}\n </Node>\n </Node>\n )\n );\n};\n\nconst _renderProductSuggestions = (\n ProductSuggest: INodeProps,\n UlProduct: INodeProps,\n productSuggestions?: ISearchProductViewProps,\n isLoadingAutoSuggest?: boolean,\n isLoadingNode?: React.ReactNode\n) => {\n return (\n productSuggestions && (\n <Node {...ProductSuggest}>\n <Node {...UlProduct}>\n {productSuggestions.title}\n {isLoadingAutoSuggest && isLoadingNode}\n {!isLoadingAutoSuggest && productSuggestions.items.map((item, index) => {\n return (\n <Node {...item.LiProduct} key={item.id || index}>\n <Node {...item.AProduct}>\n {item.thumbnail}\n {item.text}\n {item.price}\n </Node>\n </Node>\n );\n })}\n </Node>\n </Node>\n )\n );\n};\n\nconst _renderCategorySuggestions = (\n CategorySuggest: INodeProps,\n UlCategory: INodeProps,\n categorySuggestions?: ISearchCategoryViewProps,\n isLoadingAutoSuggest?: boolean,\n isLoadingNode?: React.ReactNode\n) => {\n return (\n categorySuggestions && (\n <Node {...CategorySuggest}>\n <Node {...UlCategory}>\n {categorySuggestions.title}\n {isLoadingAutoSuggest && isLoadingNode}\n {!isLoadingAutoSuggest && categorySuggestions.text.map(text => {\n return text;\n })}\n </Node>\n </Node>\n )\n );\n};\n\nexport default SearchView;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { Alert, Button, INodeProps, NodeTag } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { showAdditionalFields } from '../gift-card-balance-check.props.autogenerated';\n\nexport interface IGetFormInput {\n errorMessage: string;\n giftCardNumber: string;\n giftCardPin: string;\n giftCardExp: string;\n inputRef?: React.RefObject<HTMLInputElement>;\n inputPinRef?: React.RefObject<HTMLInputElement>;\n inputExpRef?: React.RefObject<HTMLInputElement>;\n supportExternalGiftCard?: boolean;\n additionalFields?: showAdditionalFields;\n resources: {\n balanceCheckButton: string;\n giftCardFormLabel: string;\n giftCardNumberLabel: string;\n giftCardPinLabel: string;\n giftCardExpLabel: string;\n giftCardAlertLabel: string;\n giftCardPinPlaceholderText: string;\n giftCardExpPlaceholderText: string;\n };\n onEnterGiftCardNumber(giftCardNumber: string): void;\n onEnterGiftCardPin(giftCardPin: string): void;\n onEnterGiftCardExp(giftCardExp: string): void;\n onApplyGiftCard(): Promise<void>;\n}\n\nexport interface IForm {\n formProps: INodeProps;\n label: React.ReactNode;\n inputPinLabel: React.ReactNode;\n inputExpLabel: React.ReactNode;\n alert: React.ReactNode;\n inputProps: INodeProps;\n inputNumProps: INodeProps;\n inputPinProps: INodeProps;\n inputExpProps: INodeProps;\n inputNumber: React.ReactNode;\n inputPin: React.ReactNode;\n inputExp: React.ReactNode;\n applyButton: React.ReactNode;\n supportExternalGiftCard: boolean | undefined;\n showGiftCardPinInput: boolean | undefined;\n showGiftCardExpInput: boolean | undefined;\n alertFieldLabel: React.ReactNode;\n}\n\n/**\n * On apply function.\n * @param onApplyGiftCard -On apply gift card.\n * @returns Apply gift card.\n */\nconst onApplyHandler = (onApplyGiftCard: () => Promise<void>) => async (event: React.SyntheticEvent): Promise<void> => {\n event.preventDefault();\n await onApplyGiftCard();\n};\n\n/**\n * On change number function.\n * @param onEnterGiftCardNumber -On enter gift card number.\n * @returns On gift card enter pin function result.\n */\nconst onChangeNumberHandler = (onEnterGiftCardNumber: (giftCardNumber: string) => void) => (event: React.ChangeEvent<HTMLInputElement>) => {\n const value = (event.target.value || '').replace(new RegExp('[<>]', 'gi'), '');\n onEnterGiftCardNumber(value);\n};\n\n/**\n * On change pin function.\n * @param onEnterGiftCardPin -On enter gift card pin.\n * @returns On enter gift card pin function result.\n */\nconst onChangePinHandler = (onEnterGiftCardPin: (giftCardPin: string) => void) => (event: React.ChangeEvent<HTMLInputElement>) => {\n const value = (event.target.value || '').replace(new RegExp('[<>]', 'gi'), '');\n onEnterGiftCardPin(value);\n};\n\n/**\n * On change exp function.\n * @param onEnterGiftCardExp -On enter gift card.\n * @returns On enter gift card function result.\n */\nconst onChangeExpHandler = (onEnterGiftCardExp: (giftCardExp: string) => void) => (event: React.ChangeEvent<HTMLInputElement>) => {\n const value = (event.target.value || '').replace(new RegExp('[<>]', 'gi'), '');\n onEnterGiftCardExp(value);\n};\n\nexport const getForm = (options: IGetFormInput): IForm => {\n const {\n errorMessage,\n inputRef,\n inputPinRef,\n inputExpRef,\n giftCardNumber,\n giftCardPin,\n giftCardExp,\n onEnterGiftCardNumber,\n onEnterGiftCardPin,\n onEnterGiftCardExp,\n onApplyGiftCard,\n supportExternalGiftCard,\n additionalFields,\n resources: { balanceCheckButton, giftCardFormLabel, giftCardNumberLabel, giftCardPinLabel, giftCardExpLabel,\n giftCardAlertLabel, giftCardPinPlaceholderText, giftCardExpPlaceholderText }\n } = options;\n\n const formProps = {\n className: classnames('ms-gift-card-balance-check__form', { 'is-invalid': !!errorMessage }),\n onSubmit: onApplyHandler(onApplyGiftCard),\n tag: 'form' as NodeTag\n };\n\n const label = (\n <label id='ms-gift-card-balance-check__label' className='ms-gift-card-balance-check__input-label'>\n {giftCardFormLabel}\n </label>\n );\n\n const inputPinLabel = (\n <label id='ms-gift-card-balance-check__input-pin-label' className='ms-gift-card-balance-check__input-pin-label'>\n {giftCardPinLabel}\n </label>\n );\n\n const inputExpLabel = (\n <label id='ms-gift-card-balance-check__input-exp-label' className='ms-gift-card-balance-check__input-exp-label'>\n {giftCardExpLabel}\n </label>\n );\n\n const alertFieldLabel = (\n <label id='ms-gift-card-balance-check__input-alert' className='ms-gift-card-balance-check__input-alert-label'>\n {giftCardAlertLabel}\n </label>\n );\n\n const alert = (\n <Alert\n tag='span'\n id='ms-gift-card-balance-check__error'\n className='ms-gift-card-balance-check__input-error'\n role='alert'\n assertive={false}\n fade={false}\n includeAlertClass={false}\n isOpen={!!errorMessage}\n >\n {errorMessage}\n </Alert>\n );\n\n const inputProps = {\n className: 'ms-gift-card-balance-check__input-fields'\n };\n\n const inputNumProps = {\n className: 'ms-gift-card-balance-check__input-num-fields'\n };\n\n const inputPinProps = {\n className: 'ms-gift-card-balance-check__input-pin-fields'\n };\n\n const inputExpProps = {\n className: 'ms-gift-card-balance-check__input-exp-fields'\n };\n\n const inputNumber = (\n <input\n ref={inputRef}\n type='text'\n className='ms-gift-card-balance-check__input-text form-control'\n aria-label={giftCardNumberLabel}\n onChange={onChangeNumberHandler(onEnterGiftCardNumber)}\n value={giftCardNumber}\n aria-labelledby='ms-gift-card-balance-check__label ms-gift-card-balance-check__error'\n />\n );\n\n const inputPin = (\n <input\n ref={inputPinRef}\n type='text'\n className='ms-gift-card-balance-check__input-pin-text form-contol'\n aria-label={giftCardPinLabel}\n placeholder={giftCardPinPlaceholderText}\n onChange={onChangePinHandler(onEnterGiftCardPin)}\n value={giftCardPin}\n aria-labelledby='ms-gift-card-balance-check__label ms-gift-card-balance-check__error'\n />\n );\n\n const inputExp = (\n <input\n ref={inputExpRef}\n type='text'\n className='ms-gift-card-balance-check__input-exp-text form-contol'\n aria-label={giftCardExpLabel}\n placeholder={giftCardExpPlaceholderText}\n onChange={onChangeExpHandler(onEnterGiftCardExp)}\n value={giftCardExp}\n aria-labelledby='ms-gift-card-balance-check__label ms-gift-card-balance-check__error'\n />\n );\n\n const applyButton = (\n <Button\n className='ms-gift-card-balance-check__btn-apply'\n onClick={onApplyHandler(onApplyGiftCard)}\n aria-label={balanceCheckButton}\n disabled={!giftCardNumber}\n >\n {balanceCheckButton}\n </Button>\n );\n\n let showGiftCardPinInput = false;\n let showGiftCardExpInput = false;\n\n switch (additionalFields) {\n case showAdditionalFields.pin:\n showGiftCardPinInput = true;\n break;\n case showAdditionalFields.expirationDate:\n showGiftCardExpInput = true;\n break;\n case showAdditionalFields.pinAndExpirationDate:\n showGiftCardPinInput = true;\n showGiftCardExpInput = true;\n break;\n default:\n }\n\n return {\n formProps,\n label,\n inputPinLabel,\n inputExpLabel,\n alert,\n inputProps,\n inputNumProps,\n inputPinProps,\n inputExpProps,\n inputNumber,\n inputPin,\n inputExp,\n applyButton,\n supportExternalGiftCard,\n showGiftCardPinInput,\n showGiftCardExpInput,\n alertFieldLabel\n };\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { GiftCard } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nexport interface IGetItemInput {\n giftCard: GiftCard;\n resources: {\n enteredGiftCardLabel: string;\n giftCardAvailableBalanceLabel: string;\n };\n getFormattedPrice(price?: number, currencyCode?: string): string;\n}\n\nexport interface IItem {\n itemProps: INodeProps;\n id?: string;\n selectedGiftCard: React.ReactNode;\n removeButton?: React.ReactNode;\n}\n\n/**\n * GiftCardItem component.\n * @param root0\n * @param root0.giftCard\n * @param root0.getFormattedPrice\n * @param root0.resources\n * @param root0.resources.enteredGiftCardLabel\n * @param root0.resources.giftCardAvailableBalanceLabel\n * @extends {React.PureComponent<IGiftCardItemProps>}\n */\nexport const getItem = ({\n giftCard,\n getFormattedPrice,\n resources: { enteredGiftCardLabel, giftCardAvailableBalanceLabel }\n}: IGetItemInput): IItem => {\n const balance = getFormattedPrice(giftCard.Balance, giftCard.CardCurrencyCode);\n const giftCardLast4Digit = (giftCard.Id || '').substr(-4);\n\n const itemProps = {\n className: 'ms-gift-card-balance-check__item'\n };\n\n const selectedGiftCard = (\n <span className='ms-gift-card-balance-check__item-text'>\n {enteredGiftCardLabel}\n {' '}\n {giftCardLast4Digit}\n {' '}\n (\n {giftCardAvailableBalanceLabel}\n {' '}\n <span className='ms-gift-card-balance-check__balance'>\n {balance}\n </span>\n )\n </span>\n );\n\n return {\n itemProps,\n id: giftCard && giftCard.Id,\n selectedGiftCard\n };\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { getGiftCardAsync, getTenderTypesAsync, resolveCardTypesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/StoreOperationsDataActions.g';\nimport {\n CardType, CardTypeInfo, GiftCard, RetailOperation, TenderType\n} from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { IModuleProps } from '@msdyn365-commerce-modules/utilities';\nimport classname from 'classnames';\nimport * as React from 'react';\n\nimport { OPERATIONS } from '../checkout';\nimport { getForm, IForm } from './components/get-form';\nimport { getItem, IItem } from './components/get-item';\nimport { IGiftCardBalanceCheckProps } from './gift-card-balance-check.props.autogenerated';\n\ninterface IGiftCardBalanceCheckState {\n isFetchingGiftCard: boolean;\n errorMessage: string;\n giftCardNumber: string;\n giftCardPin: string;\n giftCardExp: string;\n giftCard?: GiftCard;\n}\n\nenum SupportedGiftCardType {\n Internal = 'internal',\n External = 'external',\n Both = 'both'\n}\n\nexport interface IGiftCardBalanceCheckModuleProps extends IGiftCardBalanceCheckProps<{}> { }\n\nexport interface IGiftCardBalanceCheckViewProps extends IGiftCardBalanceCheckProps<{}>, IGiftCardBalanceCheckState {\n className?: string;\n\n form: IForm;\n item?: IItem;\n\n giftCardBalanceCheckProps: IModuleProps;\n\n enterGiftCardNumber?(giftCardNumber: string): void;\n enterGiftCardPin?(giftCardPin: string): void;\n enterGiftCardExp?(giftCardExp: string): void;\n applyGiftCard?(): void;\n}\n\n/**\n *\n * GiftCardBalanceCheck component.\n * @extends {React.Component<IGiftCardBalanceCheckModuleProps, IGiftCardBalanceCheckState>}\n */\nexport class GiftCardBalanceCheck extends React.Component<IGiftCardBalanceCheckModuleProps, IGiftCardBalanceCheckState> {\n public state: IGiftCardBalanceCheckState = {\n isFetchingGiftCard: false,\n errorMessage: '',\n giftCardNumber: '',\n giftCardPin: '',\n giftCardExp: ''\n };\n\n private readonly inputRef: React.RefObject<HTMLInputElement> = React.createRef();\n\n private readonly inputPinRef: React.RefObject<HTMLInputElement> = React.createRef();\n\n private readonly inputExpRef: React.RefObject<HTMLInputElement> = React.createRef();\n\n public shouldComponentUpdate(nextProps: IGiftCardBalanceCheckModuleProps,\n nextState: IGiftCardBalanceCheckState): boolean {\n if (this.state === nextState && this.props.data === nextProps.data) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element | null {\n const {\n config: { className, showAdditionalFields },\n resources\n } = this.props;\n const { errorMessage, giftCardNumber, giftCardPin, giftCardExp } = this.state;\n\n const supportedGiftCardType = this.props.context.app.config.giftCardSupported;\n\n if (!this._isEnabled()) {\n this.props.context.telemetry.error('Gift card balance check is not supported, module wont render');\n return null;\n }\n\n const supportExternalGiftCard = supportedGiftCardType !== SupportedGiftCardType.Internal;\n\n const moduleClassName = classname('ms-gift-card-balance-check', className);\n\n const viewProps: IGiftCardBalanceCheckViewProps = {\n ...this.props,\n ...this.state,\n className: moduleClassName,\n giftCardBalanceCheckProps: { moduleProps: this.props, className: moduleClassName },\n\n enterGiftCardNumber: this._enterGiftCardNumber,\n enterGiftCardPin: this._enterGiftCardPin,\n enterGiftCardExp: this._enterGiftCardExp,\n applyGiftCard: this._applyGiftCard,\n\n form: getForm({\n errorMessage,\n giftCardNumber,\n giftCardPin,\n giftCardExp,\n inputRef: this.inputRef,\n inputPinRef: this.inputPinRef,\n inputExpRef: this.inputExpRef,\n resources,\n supportExternalGiftCard,\n additionalFields: showAdditionalFields,\n onEnterGiftCardNumber: this._enterGiftCardNumber,\n onEnterGiftCardPin: this._enterGiftCardPin,\n onEnterGiftCardExp: this._enterGiftCardExp,\n onApplyGiftCard: this._applyGiftCard\n }),\n item: this.state.giftCard && getItem({\n giftCard: this.state.giftCard,\n getFormattedPrice: this._getFormattedPrice,\n resources\n })\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n private readonly _isEnabled = (): boolean => {\n if (!this.props.context.request.user.isAuthenticated &&\n this.props.context.app.config.giftCardSupported !== SupportedGiftCardType.External &&\n !this.props.config.shouldBeEnabledForGuest) {\n return false;\n }\n return true;\n };\n\n private readonly _getFormattedPrice = (price: number = 0, currencyCode: string = 'USD'): string => {\n return this.props.context.cultureFormatter.formatCurrency(price, currencyCode);\n };\n\n private readonly _enterGiftCardNumber = (giftCardNumber: string): void => {\n this.setState({\n giftCardNumber\n });\n this._clearError();\n };\n\n private readonly _enterGiftCardPin = (giftCardPin: string): void => {\n this.setState({\n giftCardPin\n });\n this._clearError();\n };\n\n private readonly _enterGiftCardExp = (giftCardExp: string): void => {\n this.setState({\n giftCardExp\n });\n this._clearError();\n };\n\n private readonly _clearError = (): void => {\n this.setState({\n errorMessage: ''\n });\n };\n\n private readonly _setError = (errorMessage: string): void => {\n this.props.telemetry.error('Error', errorMessage);\n this.props.telemetry.debug('Error', errorMessage);\n this.setState({\n errorMessage\n });\n };\n\n private readonly _applyGiftCard = async (): Promise<void> => {\n if (this.state.isFetchingGiftCard) {\n return;\n }\n this.setState({\n isFetchingGiftCard: true\n });\n\n const giftCardNumber = this.state.giftCardNumber.trim();\n const giftCardPin = this.state.giftCardPin.trim();\n const giftCardExp = this.state.giftCardExp.trim();\n\n const giftCardTypes = await this._getGiftCardTypes(giftCardNumber);\n const giftCardType = giftCardTypes && giftCardTypes[0];\n const isPinRequired = giftCardType && giftCardType.IsPinRequired;\n const isExpRequired = giftCardType && giftCardType.IsExpirationDateRequired;\n const tenderTypeId = giftCardType && giftCardType.PaymentMethodId;\n const giftCard = await this._getGiftCard(giftCardNumber, giftCardPin, giftCardExp, isPinRequired, isExpRequired, tenderTypeId);\n\n if (giftCard) {\n this._clearError();\n this.setState({\n giftCardNumber: '',\n giftCardPin: '',\n giftCardExp: '',\n isFetchingGiftCard: false,\n giftCard\n });\n return Promise.resolve();\n }\n const input =\n this.inputRef && this.inputRef.current && this.inputRef.current.focus && (this.inputRef.current as HTMLElement);\n input && input.focus();\n this.setState({\n isFetchingGiftCard: false,\n giftCard: undefined\n });\n\n };\n\n private readonly _findGiftcardTenderTypes = (tenderTypes: TenderType[], operationId: RetailOperation, giftcardType: string): string[] | undefined => {\n let matchedTenderTypes: TenderType[] | undefined;\n\n switch (giftcardType) {\n case SupportedGiftCardType.Internal:\n matchedTenderTypes = tenderTypes.filter(tenderType => (tenderType.OperationId === operationId && tenderType.ConnectorId === ''));\n break;\n case SupportedGiftCardType.External:\n matchedTenderTypes = tenderTypes.filter(tenderType => (tenderType.OperationId === operationId && tenderType.ConnectorId !== ''));\n break;\n default:\n throw new Error('Invalid gift card type');\n }\n\n if (matchedTenderTypes) {\n return matchedTenderTypes.map(tenderType => tenderType.TenderTypeId || '');\n }\n return;\n };\n\n private readonly _getGiftCard = async (giftCardNumber: string, giftCardPin: string, giftCardExp: string, isPinRequired: boolean | undefined, isExpRequired: boolean | undefined, tenderTypeId: string | undefined): Promise<GiftCard | undefined> => {\n const {\n resources: { invalidCardTypeError, noBalanceError, invalidCardInfoError, noCardPinError, noCardExpError }\n } = this.props;\n\n const supportedGiftCardType = this.props.context.app.config.giftCardSupported;\n\n if (!tenderTypeId) {\n return undefined;\n }\n\n const tenderTypes = await getTenderTypesAsync({ callerContext: this.props.context.actionContext, queryResultSettings: {} }).catch(error => {\n throw error;\n });\n\n if (!tenderTypes) {\n throw new Error('Fail to get gift card tender line');\n }\n\n const internalGiftcardTenderTypes = this._findGiftcardTenderTypes(tenderTypes, OPERATIONS.PayGiftCertificate, SupportedGiftCardType.Internal);\n const externalGiftcardTenderTypes = this._findGiftcardTenderTypes(tenderTypes, OPERATIONS.PayGiftCertificate, SupportedGiftCardType.External);\n\n switch (supportedGiftCardType) {\n case undefined:\n case SupportedGiftCardType.Internal:\n if (!internalGiftcardTenderTypes?.includes(tenderTypeId)) {\n this._setError(invalidCardTypeError);\n return undefined;\n }\n break;\n case SupportedGiftCardType.External:\n if (!externalGiftcardTenderTypes?.includes(tenderTypeId)) {\n this._setError(invalidCardTypeError);\n return undefined;\n }\n break;\n case SupportedGiftCardType.Both:\n if (!internalGiftcardTenderTypes?.includes(tenderTypeId) && !externalGiftcardTenderTypes?.includes(tenderTypeId)) {\n this._setError(invalidCardTypeError);\n return undefined;\n }\n break;\n default:\n throw new Error('Unsupported gift card type');\n }\n\n if (!this.props.context.request.user.isAuthenticated && internalGiftcardTenderTypes?.includes(tenderTypeId)) {\n this._setError(invalidCardTypeError);\n return undefined;\n }\n\n if (isPinRequired && giftCardPin === '') {\n this._setError(noCardPinError);\n return undefined;\n }\n\n if (isExpRequired && giftCardExp === '') {\n this._setError(noCardExpError);\n return undefined;\n }\n\n const month = Number.parseInt(giftCardExp.split('/')[0], 10);\n const year = Number.parseInt(giftCardExp.split('/')[1], 10);\n\n return getGiftCardAsync({ callerContext: this.props.context.actionContext }, giftCardNumber, tenderTypeId, giftCardPin, month, year)\n .then(activeGiftCard => {\n if (!activeGiftCard.Balance || activeGiftCard.Balance === 0) {\n this._setError(noBalanceError);\n return;\n }\n return activeGiftCard;\n })\n .catch(error => {\n this._setError(invalidCardInfoError);\n return undefined;\n });\n };\n\n private readonly _getGiftCardTypes = async (giftCardNumber: string): Promise<CardTypeInfo[] | undefined> => {\n const {\n resources: { emptyInputError, invalidCodeError }\n } = this.props;\n\n if (!giftCardNumber) {\n this._setError(emptyInputError);\n return undefined;\n }\n\n return resolveCardTypesAsync({ callerContext: this.props.context.actionContext }, giftCardNumber, CardType.GiftCard)\n .then(giftCardTypes => {\n if (!giftCardTypes || giftCardTypes.length === 0 || giftCardTypes[0] === undefined) {\n this._setError(invalidCodeError);\n return;\n }\n return giftCardTypes;\n })\n .catch(error => {\n this._setError(invalidCodeError);\n return undefined;\n });\n };\n}\n\nexport default GiftCardBalanceCheck;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport { IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\nimport { DisplayTemplate, ProductRefinerSource, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\nimport { Button, Collapse, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport RangeRefineItem, { RangeRefineItemType } from './range-refine-item';\nimport RefineItem from './refine-item';\nimport { IRefineItemCommonProps } from './refine-item.props.common';\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\nimport { findMatchingRefinementCriterion, isRangeType } from './utilities';\n\n/**\n * Properties associated with the RefineSubmenu component.\n */\nexport interface IRefineSubmenuProps {\n tempRangeTypeTODO: RangeRefineItemType;\n minValueSliderThumbAriaLabel?: string;\n maxValueSliderThumbAriaLabel?: string;\n productRefinerHierarchy: IProductRefinerHierarchy;\n selectedRefinerValues: ProductRefinerValue[];\n refineItemCommonProps: IRefineItemCommonProps;\n isDisabled: boolean;\n isExpandedOnInitialLoad: boolean;\n context: ICoreContext<IGeneric<IAny>>;\n moduleId: string;\n moduleTypeName: string;\n productCountAriaLabel?: string;\n singleProductCountAriaLabel?: string;\n refineItemAriaLabel?: string;\n refineItemsAriaLabel?: string;\n isMobile?: boolean;\n\n /**\n * The telemetry content\n */\n telemetryContent?: ITelemetryContent;\n onUpdateRefiners(notfication: Readonly<IRefineItemToggleNotification>): void;\n urlBuilder(refiner: IRefineItemToggleNotification): string;\n}\n\n/**\n * Refine submenu state.\n */\nexport interface IRefineSubmenuState extends React.ComponentState {\n expanded: boolean;\n}\n\n/**\n *\n * The RefineSubmenu component renders the submenu category and child items.\n * This computed observes the stateful category hierarchy object.\n * @extends {React.PureComponent<IRefineSubmenuProps>}\n */\nclass RefineSubmenu extends React.Component<IRefineSubmenuProps, IRefineSubmenuState> {\n constructor(props: IRefineSubmenuProps) {\n super(props);\n\n this._onToggleItem = this._onToggleItem.bind(this);\n this._onToggleSubmenu = this._onToggleSubmenu.bind(this);\n\n const isExpanded = this.props.isExpandedOnInitialLoad;\n\n // If (this.props.productRefinerHierarchy.DataTypeValue === ProductRefinerValueDataTypeValue.Range) {\n // isExpanded = true;\n // }\n\n this.state = {\n expanded: isExpanded\n };\n }\n\n public shouldComponentUpdate(nextProps: IRefineSubmenuProps,\n nextState: IRefineSubmenuState): boolean {\n if (this.state === nextState && this.props === nextProps) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element | null {\n const { productRefinerHierarchy, refineItemCommonProps } = this.props;\n\n if (!productRefinerHierarchy) {\n refineItemCommonProps.telemetry.error('Cannot render submenu without refiner hierarchy data');\n }\n\n if ((productRefinerHierarchy.SourceValue === ProductRefinerSource.Rating) && (this.props.context.app.config.hideRating)) {\n return null;\n }\n return (\n <div className={`ms-refine-submenu list-group ${productRefinerHierarchy.KeyName}`}>\n <Button\n className={this.state.expanded ? 'ms-refine-submenu__toggle_expanded' : 'ms-refine-submenu__toggle_collapsed'}\n aria-label={productRefinerHierarchy.KeyName || 'refiner.Name'}\n onClick={this._onToggleSubmenu}\n aria-expanded={this.state.expanded}\n >\n {productRefinerHierarchy.KeyName}\n </Button>\n <Collapse isOpen={this.state.expanded} timeout={350}>\n {this._renderChildItems(productRefinerHierarchy)}\n </Collapse>\n </div>\n );\n }\n\n private _renderChildItems(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\n if (isRangeType(productRefinerHierarchy.DataTypeValue)) {\n return this._renderRange(productRefinerHierarchy);\n }\n return this._renderSingleMultiSelect(productRefinerHierarchy);\n }\n\n private _renderSingleMultiSelect(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\n const { isDisabled, refineItemCommonProps, selectedRefinerValues, context,\n productCountAriaLabel, singleProductCountAriaLabel, refineItemAriaLabel, refineItemsAriaLabel, isMobile } = this.props;\n const isSingleSelect = (productRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect) && (productRefinerHierarchy.SourceValue === ProductRefinerSource.Rating);\n const role = isSingleSelect ? { role: 'listbox' } : undefined;\n const refinerValuesList = (productRefinerHierarchy.Values || []);\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\n if (!child) {\n refineItemCommonProps.telemetry.error(\n `[refine-submenu] Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\n );\n return null;\n }\n\n const selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\n\n return (\n <RefineItem\n parentProductRefinerHierarchy={productRefinerHierarchy}\n productRefinerValue={child}\n selectedRefinementCriterion={selectedRefinementCriterion}\n selectedRefinerValues={selectedRefinerValues.filter(selectedValue => refinerValuesList.find(value => value.RefinerRecordId === selectedValue.RefinerRecordId))}\n refineItemCommonProps={refineItemCommonProps}\n onToggle={this._onToggleItem}\n urlBuilder={this.props.urlBuilder}\n isDisabled={isDisabled}\n key={index}\n index={index}\n context={context}\n moduleId={this.props.moduleId}\n moduleTypeName={this.props.moduleTypeName}\n telemetryContent={this.props.telemetryContent}\n productCountAriaLabel={productCountAriaLabel}\n refineItemAriaLabel={refineItemAriaLabel}\n refineItemsAriaLabel={refineItemsAriaLabel}\n singleProductCountAriaLabel={singleProductCountAriaLabel}\n isMobileView={isMobile}\n />\n );\n });\n return (\n <ul className={`ms-refine-submenu__list ${productRefinerHierarchy.KeyName}`} {...role} aria-label={productRefinerHierarchy.KeyName}>\n {listItems}\n </ul>\n );\n }\n\n private _getRangeType(productRefinerHierarchy: IProductRefinerHierarchy): 'input' | 'slider' {\n if (productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Range ||\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Slider ||\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.SliderWithBars) {\n return 'slider';\n }\n return 'input';\n }\n\n private _renderRange(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\n const { isDisabled, refineItemCommonProps, selectedRefinerValues, context, minValueSliderThumbAriaLabel, maxValueSliderThumbAriaLabel } = this.props;\n const submenuClassNamePrefix = 'ms-refine-submenu__item list-group-item refine-submenu__item';\n const refinerValuesList = (productRefinerHierarchy.Values || []);\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\n if (!child) {\n refineItemCommonProps.telemetry.error(\n `Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\n );\n return null;\n }\n\n const selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\n\n const rangeType = this._getRangeType(productRefinerHierarchy);\n const key = selectedRefinementCriterion ? `${selectedRefinementCriterion.LeftValueBoundString}-${selectedRefinementCriterion.RightValueBoundString}` : `not-selected-${index}`;\n return (\n <li className={`${submenuClassNamePrefix}--range`} key={index}>\n <RangeRefineItem\n parentProductRefinerHierarchy={productRefinerHierarchy}\n productRefinerValue={child}\n selectedRefinementCriterion={selectedRefinementCriterion}\n refineItemCommonProps={refineItemCommonProps}\n onToggle={this._onToggleItem}\n urlBuilder={this.props.urlBuilder}\n isDisabled={isDisabled}\n rangeType={rangeType}\n key={key}\n sliderKey={key}\n context={context}\n minValueSliderThumbAriaLabel={minValueSliderThumbAriaLabel}\n maxValueSliderThumbAriaLabel={maxValueSliderThumbAriaLabel}\n moduleId={this.props.moduleId}\n moduleTypeName={this.props.moduleTypeName}\n />\n </li>\n );\n });\n return (<ul className={`ms-refine-submenu__list list-unstyled ${productRefinerHierarchy.KeyName}`}>\n {listItems}\n </ul>);\n }\n\n private _onToggleItem(itemToggleNotification: IRefineItemToggleNotification): void {\n this.props.onUpdateRefiners(itemToggleNotification);\n }\n\n private _onToggleSubmenu(): void {\n this.setState(prevState => ({\n expanded: !prevState.expanded\n }));\n }\n}\n\nexport default RefineSubmenu;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { CacheType, IActionContext, IActionInput } from '@msdyn365-commerce/core';\n\nimport { IModuleStates } from './module-state.data';\n\n/**\n * GetModulesInput.\n */\nexport class ModuleStatesCacheKey implements IActionInput {\n public getCacheKey = () => 'ModuleState';\n\n public getCacheObjectType = () => 'ModuleState';\n\n public dataCacheType = (): CacheType => 'none';\n}\n\nexport function getModuleStates(ctx: IActionContext): IModuleStates {\n const cacheKey = new ModuleStatesCacheKey();\n\n let moduleStates = <IModuleStates>ctx.get<IModuleStates>(cacheKey.getCacheObjectType(), cacheKey.getCacheKey());\n if (moduleStates) {\n return moduleStates;\n }\n ctx.update(cacheKey, {});\n moduleStates = <IModuleStates>ctx.get<IModuleStates>(cacheKey.getCacheObjectType(), cacheKey.getCacheKey());\n return moduleStates;\n}\n\nexport function updateModuleStates(value: IModuleStates, ctx: IActionContext): void {\n const cacheKey = new ModuleStatesCacheKey();\n ctx.update(cacheKey, value);\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport * as React from 'react';\n\ninterface ISeparator {\n separator: string;\n}\n\nexport const Separator: React.FC<ISeparator> = ({ separator }) => (<span>\n {' '}\n {separator}\n {' '}\n</span>);\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { IOrderTemplateNameDialogResources, OrderTemplateNameDialog } from '@msdyn365-commerce/components';\nimport { IComponentProps } from '@msdyn365-commerce/core';\nimport React, { useState } from 'react';\n\nconst modalCloseButtonReference: React.RefObject<HTMLButtonElement> = React.createRef();\n\n/**\n * The Create Order Template Button Props.\n */\nexport interface ICreateOrderTemplateButtonProps extends IComponentProps {\n\n /**\n * The label for create order template.\n */\n createOrderTemplateText: string;\n\n /**\n * The create order template dialog resources.\n */\n createOrderTemplateDialogResources: IOrderTemplateNameDialogResources;\n\n /**\n * The delegate to fire when dialog captured any user entry.\n */\n onOrderTemplateCreated(): Promise<void>;\n}\n\nconst CreateOrderTemplateButton: React.FC<ICreateOrderTemplateButtonProps> = (props) => {\n const onCancelHandler = React.useCallback(() => {\n return;\n }, []);\n const [isCreateOrderTemplateDialogOpen, setOrderTemplateNameDialogOpen] = useState(false);\n const onCreateButtonClick = React.useCallback(() => {\n setOrderTemplateNameDialogOpen(true);\n }, []);\n\n return (\n <>\n <button\n className='ms-order-template__add-template-button msc-btn btn-primary'\n color='primary'\n onClick={onCreateButtonClick}\n ref={modalCloseButtonReference}\n aria-label={props.createOrderTemplateText}\n >\n {props.createOrderTemplateText}\n </button>\n <OrderTemplateNameDialog\n className='msc-order-template-name-dialog'\n modalOpen={isCreateOrderTemplateDialogOpen}\n isUpdateDialog={false}\n setModalOpen={setOrderTemplateNameDialogOpen}\n context={props.context}\n id={props.id}\n data={{}}\n typeName={props.typeName}\n dialogStrings={props.createOrderTemplateDialogResources}\n onCancel={onCancelHandler}\n onSuccess={props.onOrderTemplateCreated}\n parentElementRef={modalCloseButtonReference}\n />\n </>\n );\n};\n\nexport default CreateOrderTemplateButton;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { IOrderTemplateNameDialogResources } from '@msdyn365-commerce/components';\nimport { deleteAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductListsDataActions.g';\nimport { OrderTemplate } from '@msdyn365-commerce-modules/retail-actions';\nimport { Alert, Heading, IModuleProps, INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { ISingleOrderTemplateProps, ISingleOrderTemplateViewProps, OrderTemplateListStatusMessage, OrderTemplateRender } from './components';\nimport CreateNewTemplateButtonComponent from './components/create-order-template';\nimport { IOrderTemplateListData } from './order-template-list.data';\nimport { HeadingTag, IOrderTemplateListProps, IOrderTemplateListResources } from './order-template-list.props.autogenerated';\n\nexport interface IOrderTemplateActionMessageState {\n itemKey: string;\n userMessage: string;\n statusCssString: string;\n messageGlyph: string;\n isOpen: boolean;\n headerStatusMessage: string;\n}\n\nexport type orderTemplateListStatus = 'LOADING' | 'SUCCESS' | 'FAILED' | 'EMPTY';\n\nexport interface IOrderTemplateListViewProps extends IOrderTemplateListProps<IOrderTemplateListData> {\n OrderTemplateList: IModuleProps;\n status?: orderTemplateListStatus;\n statusMessage?: React.ReactNode;\n heading?: React.ReactNode;\n OrderTemplates?: INodeProps;\n OrderTemplate?: INodeProps;\n orderTemplates?: ISingleOrderTemplateViewProps[];\n createOrderTemplateButton?: React.ReactNode;\n templateHeaderStatusMessage?: React.ReactNode;\n}\n\n/**\n *\n * OrderTemplateList component.\n * @extends {React.PureComponent<IOrderTemplateListProps<IOrderTemplateListData>, IOrderTemplateListActionMessageState>}\n */\n@observer\nclass OrderTemplateList extends React.Component<IOrderTemplateListProps<IOrderTemplateListData>, IOrderTemplateActionMessageState> {\n\n constructor(props: IOrderTemplateListProps<IOrderTemplateListData>) {\n super(props);\n this.state = {\n itemKey: '',\n userMessage: '',\n headerStatusMessage: '',\n statusCssString: 'success',\n messageGlyph: 'fas fa-check',\n isOpen: false\n };\n }\n\n public async componentDidMount(): Promise<void> {\n this.setState({});\n }\n\n public shouldComponentUpdate(nextProps: IOrderTemplateListProps<IOrderTemplateListData>,\n nextState: IOrderTemplateActionMessageState): boolean {\n if (this.state === nextState && this.props.data === nextProps.data) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element | null {\n const { className, heading } = this.props.config;\n const { emptyOrderTemplateText, createNewTemplateButtonText } = this.props.resources;\n const { orderTemplates } = this.props.data;\n const orderTemplatesData = orderTemplates && (orderTemplates).result;\n const orderTemplateListHeading = heading?.text ?? this.props.resources.orderTemplateListTitle;\n\n if (orderTemplates.status === 'LOADING') {\n const errorProps: IOrderTemplateListViewProps = {\n ...(this.props as IOrderTemplateListProps<IOrderTemplateListData>),\n OrderTemplateList: {\n moduleProps: this.props,\n className: classnames('ms-order-template', className)\n },\n status: 'LOADING',\n statusMessage: <OrderTemplateListStatusMessage errorType='LOADING' text='Loading...' />,\n heading: (\n <Heading\n className='ms-order-template__heading'\n tag={heading?.tag ?? HeadingTag.h2}\n text={orderTemplateListHeading}\n />\n )\n };\n return this.props.renderView(errorProps);\n }\n\n if (orderTemplatesData && orderTemplatesData.length === 0) {\n // When no order templates are found for customer\n const emptyViewProps: IOrderTemplateListViewProps = {\n ...(this.props as IOrderTemplateListProps<IOrderTemplateListData>),\n OrderTemplateList: {\n moduleProps: this.props,\n className: classnames('ms-order-template', className)\n },\n status: 'EMPTY',\n statusMessage: <OrderTemplateListStatusMessage errorType='EMPTY' text={emptyOrderTemplateText} />,\n heading: (\n <Heading\n className='ms-order-template__heading'\n tag={heading?.tag ?? HeadingTag.h2}\n text={orderTemplateListHeading}\n />\n )\n };\n\n return this.props.renderView(emptyViewProps);\n }\n\n const viewProps: IOrderTemplateListViewProps = {\n ...(this.props as IOrderTemplateListProps<IOrderTemplateListData>),\n OrderTemplateList: {\n moduleProps: this.props,\n className: classnames('ms-order-template', className)\n },\n status: 'SUCCESS',\n heading: (\n <Heading\n className='ms-order-template__heading'\n tag={heading?.tag ?? HeadingTag.h2}\n text={orderTemplateListHeading}\n />\n ),\n createOrderTemplateButton: (\n <CreateNewTemplateButtonComponent\n context={this.props.context}\n id={this.props.id}\n typeName={this.props.typeName}\n data={{}}\n createOrderTemplateText={createNewTemplateButtonText}\n onOrderTemplateCreated={this._reloadPage}\n createOrderTemplateDialogResources={this._generateOrderTemplateNameDialogResources(this.props.resources)}\n />\n ),\n templateHeaderStatusMessage: this.state.isOpen && this.state.headerStatusMessage && (\n <div className='ms-order-template__products-status'>\n <Alert color={this.state.statusCssString} isOpen={this.state.isOpen} toggle={this._onDismiss}>\n <span>\n {this.state.headerStatusMessage}\n </span>\n </Alert>\n </div>\n ),\n OrderTemplates: {\n className: 'ms-order-template__list-item',\n tag: 'ul'\n },\n OrderTemplate: {\n className: 'ms-order-template__tile',\n tag: 'li'\n },\n orderTemplates: orderTemplatesData && this._renderOrderTemplateList(orderTemplatesData)\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n private _generateOrderTemplateNameDialogResources(resources: IOrderTemplateListResources): IOrderTemplateNameDialogResources {\n return {\n orderTemplateHeaderLabel: resources.createOrderTemplateHeader,\n orderTemplateTitleLabel: resources.orderTemplateTitle,\n orderTemplateNameAriaLabel: resources.orderTemplateNameAriaLabel,\n orderTemplateDescription: resources.createOrderTemplateDescription,\n\n defaultOrderTemplateName: resources.defaultOrderTemplateName,\n\n orderTemplateButtonLabel: resources.createOrderTemplateButtonText,\n orderTemplateCancelButtonLabel: resources.cancelNewOrderTemplateCreationButtonText\n };\n }\n\n private _renderOrderTemplateList(orderTemplates: OrderTemplate[]): ISingleOrderTemplateViewProps[] {\n const { context, telemetry } = this.props;\n const { imageSettings, enableImageProductLink } = this.props.config;\n return orderTemplates.map((orderTemplate: OrderTemplate, index) => {\n const currentTemplateProps: ISingleOrderTemplateProps = {\n orderTemplateState: this.state,\n Id: orderTemplate.productList.Id,\n name: orderTemplate.productList.Name,\n orderTemplate,\n context,\n imageSettings,\n enableImageProductLink,\n removeFromOrderTemplateListText: 'remove',\n addToBagText: this.props.resources.addToBagButtonText,\n index,\n itemKey: orderTemplate.productList.Id,\n telemetry,\n moduleId: this.props.id,\n moduleTypeName: this.props.typeName,\n handlers: {\n onRemoveOrderTemplate: this._onRemoveFromOrderTemplateList,\n onDismiss: this._onDismiss\n },\n resources: {\n closeWindowButtonText: this.props.resources.closeWindowButtonText,\n addToCartFailureMessage: this.props.resources.addToCartFailureMessage,\n addToCartSuccessMessage: this.props.resources.addToCartSuccessMessage,\n addToCartProcessMessage: this.props.resources.addToCartProcessMessage,\n linesAddedToCartDialogResources: {\n viewCartButtonText: this.props.resources.viewCartButtonText,\n orderTemplateCloseButtonText: this.props.resources.orderTemplateCloseButtonText,\n linesAddedToCartHeaderItemsOneText: this.props.resources.linesAddedToCartHeaderItemsOneText,\n linesAddedToCartHeaderLinesOneText: this.props.resources.linesAddedToCartHeaderLinesOneText,\n linesAddedToCartHeaderLinesFormatText: this.props.resources.linesAddedToCartHeaderLinesFormatText,\n linesAddedToCartHeaderMessageText: this.props.resources.linesAddedToCartHeaderMessageText\n }\n }\n };\n\n return (\n OrderTemplateRender(currentTemplateProps)!\n );\n });\n }\n\n private readonly _onDismiss = () => {\n this.setState({\n isOpen: false\n });\n };\n\n private readonly _reloadPage = async () => {\n window.location.reload();\n };\n\n private readonly _onRemoveFromOrderTemplateList = (productListId: string): void | undefined => {\n const { context, data, telemetry, resources } = this.props;\n const { orderTemplates } = data;\n\n if (context && context.actionContext) {\n const userToken = context.request.user.isAuthenticated && context.request.user.token;\n if (userToken && orderTemplates.result && orderTemplates.result[0] && productListId) {\n const orderTemplate = orderTemplates.result.find(p => p.productList.Id === productListId);\n if (orderTemplate) {\n deleteAsync({ callerContext: context.actionContext }, orderTemplate.productList)\n .then()\n .catch((error: string) => {\n telemetry.warning('[order-template-list] Unable to delete order template.');\n telemetry.error(error);\n this.setState({\n itemKey: productListId,\n headerStatusMessage: resources.deleteOrderTemplateFailedText,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n }).then(this._reloadPage);\n } else {\n telemetry.warning('[order-template-list] Failed to delete order template. Order template was not found');\n }\n } else {\n telemetry.warning('[order-template-list] Failed to delete order template.');\n }\n }\n };\n\n}\n\nexport default OrderTemplateList;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nexport interface IPromoBannerCloseButton {\n closeButtonAriaLabel?: string;\n label?: string;\n telemetryContent?: ITelemetryContent;\n onClose(): void;\n\n}\n\nexport const PromoBannerCloseButton: React.FC<IPromoBannerCloseButton> = ({ closeButtonAriaLabel, label, telemetryContent, onClose }) => {\n const payLoad = getPayloadObject('click', telemetryContent!, TelemetryConstant.PromoBannerClose);\n const attributes = getTelemetryAttributes(telemetryContent!, payLoad);\n return (\n <button\n className='ms-promo-banner__close-button' aria-label={closeButtonAriaLabel} onClick={onClose}\n {...attributes}>\n <span className='ms-promo-banner__close-button__label' aria-hidden>\n {label}\n </span>\n </button>\n );\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, onTelemetryClick } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ILinksData } from '../promo-banner.props.autogenerated';\n\nexport interface IPromoBannerLinks {\n links: ILinksData[];\n requestContext: Msdyn365.IRequestContext;\n telemetryContent: ITelemetryContent;\n onTextChange?(index: number): (event: Msdyn365.ContentEditableEvent) => void;\n}\n\nexport const PromoBannerLinks: React.FC<IPromoBannerLinks> = ({ links, requestContext, onTextChange, telemetryContent }) => {\n const editableLinks = _mapEditableLinks(links, telemetryContent);\n return (\n <span className='ms-promo-banner__links'>\n {editableLinks && editableLinks.length > 0 ? <Msdyn365.Links\n links={editableLinks}\n editProps={{ onTextChange, requestContext }}\n /> : null}\n </span>\n );\n};\n\nconst _mapEditableLinks = (linkdata: ILinksData[], telemetryContent: ITelemetryContent): Msdyn365.ILinksData[] | null => {\n if (!linkdata || linkdata.length === 0) {\n return null;\n }\n const editableLinks: Msdyn365.ILinksData[] = [];\n linkdata.forEach((link, index) => {\n // Construct telemetry attribute to render\n const payLoad = getPayloadObject('click', telemetryContent, '', '');\n const linkText = link.linkText ? link.linkText : '';\n payLoad.contentAction.etext = linkText;\n const attributes = getTelemetryAttributes(telemetryContent, payLoad);\n const editableLink: Msdyn365.ILinksData = {\n ariaLabel: link.ariaLabel,\n className: 'ms-promo-banner__link',\n linkText: link.linkText,\n linkUrl: link.linkUrl.destinationUrl,\n openInNewTab: link.openInNewTab,\n role: 'link',\n additionalProperties: attributes,\n onClick: onTelemetryClick(telemetryContent, payLoad, linkText)\n };\n editableLinks.push(editableLink);\n });\n\n return editableLinks;\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport * as React from 'react';\n\nexport interface IPromoBannerText {\n text: string;\n requestContext: Msdyn365.IRequestContext;\n onTextChange(event: Msdyn365.ContentEditableEvent): void;\n}\n\nexport const PromoBannerText: React.FC<IPromoBannerText> = ({ text, onTextChange, requestContext }) => {\n return (\n <Msdyn365.Text\n className='ms-promo-banner__text'\n tag='span'\n text={text}\n editProps={{ onEdit: onTextChange, requestContext }}\n />\n );\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { Carousel } from '@msdyn365-commerce/components';\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { getTelemetryObject, IModuleProps, INodeProps, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { PromoBannerCloseButton, PromoBannerLinks, PromoBannerText } from './components';\nimport { IBannerMessagesData, IPromoBannerProps, IPromoBannerResources } from './promo-banner.props.autogenerated';\n\nexport interface IPromoBannerState {\n animating: boolean;\n isVisible: boolean;\n activeIndex: number;\n}\n\nexport interface IPromoBannerViewProps extends IPromoBannerProps<{}>, IPromoBannerState {\n promoBannerProps: IModuleProps;\n contentProps: INodeProps ;\n bannerMessages: IBannerMessagesData[];\n promoBannerTextProps: INodeProps;\n promoBannerLinksProps: INodeProps;\n carouselProps: INodeProps;\n closeButton?: React.ReactNode;\n className: string;\n promoBannerText: string;\n resources: IPromoBannerResources;\n onDismiss(): void;\n handleText(): void;\n handleLinks(): void;\n}\n\n/**\n *\n * PromoBannerModule component.\n * @extends {React.PureComponent<IPromoBannerProps<IPromoBannerState>>}\n */\nclass PromoBanner extends React.PureComponent<IPromoBannerProps<{}>, IPromoBannerState> {\n public state: IPromoBannerState = {\n animating: false,\n isVisible: true,\n activeIndex: 0\n };\n\n private readonly telemetryContent: ITelemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry);\n\n public render(): JSX.Element | null {\n const { bannerMessages, dismissEnabled, interval, hideFlipper, autoplay, className = '' } = this.props.config;\n const { closeButtonAriaLabel, closeButtonLabel, bannerText } = this.props.resources;\n const { isVisible, activeIndex } = this.state;\n\n if (!isVisible) {\n this.props.context.telemetry.error('Promo banner content is empty, module wont render.');\n return null;\n }\n\n const viewProps = {\n // Context for telemetry and raw data for C1 to do customization\n // Including computed data, state data and methods\n ...this.props,\n className: classnames('ms-promo-banner', className),\n isVisible, // State data\n onDismiss: this._onDismiss, // Methods\n handleLinks: this.handleLinkTextChange,\n handleText: this.handleTextChange,\n\n promoBannerProps: { className: classnames('ms-promo-banner', className), moduleProps: this.props, role: 'banner' },\n promoBannerTextProps: {\n tag: PromoBannerText\n },\n promoBannerLinksProps: {\n tag: PromoBannerLinks,\n telemetryContent: this.telemetryContent\n },\n contentProps: { className: 'ms-promo-banner__content' },\n promoBannerText: bannerText,\n bannerMessages,\n activeIndex,\n carouselProps: {\n tag: Carousel,\n className: 'ms-promo-banner__carousel',\n activeIndex,\n next: this._next,\n previous: this._previous,\n onIndicatorsClickHandler: this._goToIndex,\n hideIndicator: hideFlipper,\n interval,\n hideFlipper,\n autoplay\n },\n closeButton: dismissEnabled && <PromoBannerCloseButton {...{ onClose: this._onDismiss, label: closeButtonLabel, closeButtonAriaLabel, telemetryContent: this.telemetryContent }} />\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n public handleTextChange = (event: Msdyn365.ContentEditableEvent) => {\n if (this.props.config.bannerMessages && this.props.config.bannerMessages[0]) {\n this.props.config.bannerMessages[0].text = event.target.value;\n }\n };\n\n public handleLinkTextChange = (linkIndex: number) => (event: Msdyn365.ContentEditableEvent) => {\n if (this.props.config.bannerMessages && this.props.config.bannerMessages[1]) {\n const links = this.props.config.bannerMessages[1].links;\n if (links) {\n links[linkIndex].linkText = event.target.value;\n }\n }\n };\n\n private readonly _next = (): void => {\n const nextIndex = this._isLastItem() ? 0 : this.state.activeIndex + 1;\n this._goToIndex(nextIndex);\n };\n\n private readonly _previous = (): void => {\n const nextIndex = this._isFirstItem() ? (this.props.config.bannerMessages ? this.props.config.bannerMessages.length - 1 : 0) : this.state.activeIndex - 1;\n this._goToIndex(nextIndex);\n };\n\n private readonly _goToIndex = (index: number): void => {\n if (this.state.animating) {\n return;\n }\n this.setState({ activeIndex: index });\n };\n\n private readonly _isFirstItem = () => this.state.activeIndex === 0;\n\n private readonly _isLastItem = () => this.props.config.bannerMessages && this.state.activeIndex === this.props.config.bannerMessages.length - 1;\n\n private readonly _onDismiss = (): void => {\n this.setState({ isVisible: false });\n };\n}\n\nexport default PromoBanner;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nexport * from './invoice-summary-lineitem';\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { ISliderLabel, ISliderThumbProps, Slider } from '@msdyn365-commerce-modules/utilities';\nimport debounce from 'lodash/debounce';\nimport { computed } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { IRefineItemProps, IRefineItemState } from './refine-item';\n\ntype InputType = 'Min' | 'Max';\n\nexport type RangeRefineItemType = 'slider' | 'input';\n\n/**\n * Range refine item properties.\n */\nexport interface IRangeRefineItemProps extends IRefineItemProps {\n rangeType: RangeRefineItemType;\n minValueSliderThumbAriaLabel?: string;\n maxValueSliderThumbAriaLabel?: string;\n sliderKey?: string;\n}\n\n/**\n * Range refine item state.\n */\nexport interface IRangeRefineItemState extends IRefineItemState {\n validationErrorMin: string | undefined;\n validationErrorMax: string | undefined;\n selectedMin: string | undefined;\n selectedMax: string | undefined;\n touchedMin: boolean;\n touchedMax: boolean;\n sliderId: string;\n minValue: string | undefined;\n maxValue: string | undefined;\n labels: ISliderLabel[];\n sliderThumbs: ISliderThumbProps[];\n}\n\n/**\n * RangeRefineItem component (controlled by RefineSubmenu).\n */\n@observer\nexport default class RangeRefineItem extends React.Component<IRangeRefineItemProps, IRangeRefineItemState> {\n private readonly _formattedPriceReverseLookup: Map<string, string> = new Map();\n\n private readonly minInput: React.RefObject<HTMLInputElement>;\n\n private readonly maxInput: React.RefObject<HTMLInputElement>;\n\n @computed get currencyCode(): string {\n return this.props.productRefinerValue.UnitText || '';\n }\n\n public constructor(props: IRangeRefineItemProps) {\n super(props);\n this._onRangeUpdate = this._onRangeUpdate.bind(this);\n this._onRangeUpdateEnd = this._onRangeUpdateEnd.bind(this);\n this._handleRangeTooltipText = this._handleRangeTooltipText.bind(this);\n this._changeMin = this._changeMin.bind(this);\n this._changeMax = this._changeMax.bind(this);\n this._finishChangeMin = this._finishChangeMin.bind(this);\n this._finishChangeMax = this._finishChangeMax.bind(this);\n\n this.minInput = React.createRef<HTMLInputElement>();\n this.maxInput = React.createRef<HTMLInputElement>();\n\n const { selectedRefinementCriterion } = this.props;\n const initialMin = selectedRefinementCriterion?.LeftValueBoundString ?? '0';\n const initialMax = selectedRefinementCriterion?.RightValueBoundString;\n const sliderId = `slider_${String(this.props.parentProductRefinerHierarchy.RecordId)}_${String(this.props.productRefinerValue.RefinerRecordId)}`;\n const minValue = this.props.productRefinerValue.LeftValueBoundString;\n const maxValue = this.props.productRefinerValue.RightValueBoundString;\n const minPrice = this._formatPrice(minValue);\n const maxPrice = this._formatPrice(maxValue);\n const labels: ISliderLabel[] = this.getLabels(sliderId, minPrice, maxPrice);\n const selectedMin = this.props.selectedRefinementCriterion?.LeftValueBoundString ?? this.props.productRefinerValue.LeftValueBoundString ?? '0';\n const selectedMax = this.props.selectedRefinementCriterion?.RightValueBoundString ??\n this.props.productRefinerValue.RightValueBoundString ?? maxValue;\n const selectedMinPrice = this._formatPrice(selectedMin);\n const selectedMaxPrice = this._formatPrice(selectedMax);\n const sliderKeyString = this.props.sliderKey ? `_${String(this.props.sliderKey)}` : '';\n const sliderThumbs: ISliderThumbProps[] = this.getSliderThumbs(sliderId,\n sliderKeyString, selectedMin, selectedMinPrice, selectedMax, selectedMaxPrice, maxPrice);\n this.state = {\n isChecked: false,\n validationErrorMin: undefined,\n validationErrorMax: undefined,\n selectedMin: initialMin,\n selectedMax: initialMax,\n touchedMin: false,\n touchedMax: false,\n sliderId,\n minValue,\n maxValue,\n labels,\n sliderThumbs\n };\n }\n\n public shouldComponentUpdate(nextProps: IRangeRefineItemProps,\n nextState: IRangeRefineItemState): boolean {\n if (this.state === nextState && this.props === nextProps) {\n return false;\n }\n return true;\n }\n\n public componentDidUpdate(previousProps: IRangeRefineItemProps): void {\n if (previousProps !== this.props) {\n this.updateSliderProps();\n }\n }\n\n public render(): JSX.Element | undefined {\n const { productRefinerValue, parentProductRefinerHierarchy, refineItemCommonProps } = this.props;\n\n if (!productRefinerValue || !parentProductRefinerHierarchy) {\n refineItemCommonProps.telemetry.error('Cannot render refine value range without productRefinerValue and parentProductRefinerHierarchy');\n return undefined;\n }\n\n if (this.props.rangeType === 'input') {\n return this._renderInputFields();\n }\n\n return this._renderSlider();\n }\n\n /**\n * Function to update slider props.\n */\n private updateSliderProps(): void {\n const sliderId = `slider_${String(this.props.parentProductRefinerHierarchy.RecordId)}_${String(this.props.productRefinerValue.RefinerRecordId)}`;\n const minValue = this.props.productRefinerValue.LeftValueBoundString;\n const maxValue = this.props.productRefinerValue.RightValueBoundString;\n const minPrice = this._formatPrice(minValue);\n const maxPrice = this._formatPrice(maxValue);\n const labels: ISliderLabel[] = this.getLabels(sliderId, minPrice, maxPrice);\n const selectedMin = this.props.selectedRefinementCriterion?.LeftValueBoundString ?? this.props.productRefinerValue.LeftValueBoundString ?? '0';\n const selectedMax = this.props.selectedRefinementCriterion?.RightValueBoundString ??\n this.props.productRefinerValue.RightValueBoundString ?? maxValue;\n const selectedMinPrice = this._formatPrice(selectedMin);\n const selectedMaxPrice = this._formatPrice(selectedMax);\n const sliderKeyString = this.props.sliderKey ? `_${String(this.props.sliderKey)}` : '';\n const sliderThumbs: ISliderThumbProps[] = this.getSliderThumbs(sliderId,\n sliderKeyString, selectedMin, selectedMinPrice, selectedMax, selectedMaxPrice, maxPrice);\n this.setState({ sliderId, minValue, maxValue, labels, sliderThumbs });\n }\n\n /**\n * Function to create the labels for slider.\n * @param sliderId - Slider element id for the DOM.\n * @param minPrice - Slider min value.\n * @param maxPrice - Slider max value.\n * @returns Array labels.\n */\n private readonly getLabels = (sliderId: string, minPrice: string, maxPrice: string): ISliderLabel[] => {\n return ([\n {\n labelId: `${sliderId}_start`,\n labelString: `${minPrice}`,\n labelPositioning: 'start'\n },\n {\n labelId: `${sliderId}_end`,\n labelString: `${maxPrice}`,\n labelPositioning: 'end'\n }\n ]);\n };\n\n /**\n * Function to create the slider thumbs for slider.\n * @param sliderId - Slider element id for the DOM.\n * @param sliderKey - Unique key for slider.\n * @param selectedMin - Slider selected min value.\n * @param selectedMinPrice - Slider selected min price.\n * @param selectedMax - Slider selected max value.\n * @param selectedMaxPrice - Slider selected max price..\n * @param maxPrice - Slider max price..\n * @returns Slider Thumb Props.\n */\n private readonly getSliderThumbs = (sliderId: string,\n sliderKey: string,\n selectedMin: string,\n selectedMinPrice: string,\n selectedMax: string | undefined,\n selectedMaxPrice: string,\n maxPrice: string): ISliderThumbProps[] => {\n const sliderThumbDefaultValue = 0;\n return ([\n {\n id: `${sliderId}${sliderKey}_slider_thumb_start`,\n value: (selectedMin && Number(selectedMin)) || sliderThumbDefaultValue,\n ariaLabel: `${this.props.minValueSliderThumbAriaLabel ?? ''} ${this.currencyCode}`,\n ariaValueText: `${selectedMinPrice}`\n },\n {\n id: `${sliderId}${sliderKey}_slider_thumb_end`,\n value: Number(selectedMax) || Number(maxPrice),\n ariaLabel: `${this.props.maxValueSliderThumbAriaLabel ?? ''} ${this.currencyCode}`,\n ariaValueText: `${selectedMaxPrice}`\n }\n ]);\n };\n\n private _renderInputFields(): JSX.Element | undefined {\n const { isDisabled, parentProductRefinerHierarchy, refineItemCommonProps } = this.props;\n const { selectedMin, selectedMax, touchedMin, touchedMax, validationErrorMin, validationErrorMax } = this.state;\n\n const rangeAriaLabel = (refineItemCommonProps.rangeNameFormat || '{0}').replace('{0}', (parentProductRefinerHierarchy.KeyName || ''));\n const formAttrs = {\n 'aria-label': rangeAriaLabel,\n 'aria-disabled': isDisabled\n };\n\n // To enable price formatting of selected fields, this is the approach:\n // initial value: min=0 formatted as price, max=undefined\n // onFocus/onChange: convert to number (unformat) and mark as touched to indicate value is being edited\n // onBlur: validate and format entered value as price\n const minInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-min ${validationErrorMin ? 'refine-submenu__input-range--error' : ''}`;\n const maxInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-max ${validationErrorMax ? 'refine-submenu__input-range--error' : ''}`;\n const minLabelClassName = 'ms-refine-submenu__input-range-label refine-submenu__input-range-label-min';\n const maxLabelClassName = 'ms-refine-submenu__input-range-label refine-submenu__input-range-label-max';\n const formattedSelectedMin = this._getFormattedSelectedValue(selectedMin, touchedMin, validationErrorMin);\n const formattedSelectedMax = this._getFormattedSelectedValue(selectedMax, touchedMax, validationErrorMax);\n return (\n <form className='ms-refine-submenu__input-range-refiner' {...formAttrs}>\n <label className={minLabelClassName}>\n {refineItemCommonProps.minLabel}\n <input\n className={minInputClassName}\n onChange={this._changeMin}\n onFocus={this._changeMin}\n onBlur={this._finishChangeMin}\n value={formattedSelectedMin}\n ref={this.minInput}\n />\n </label>\n <label className={maxLabelClassName}>\n {refineItemCommonProps.maxLabel}\n <input\n className={maxInputClassName}\n placeholder={formattedSelectedMax ? undefined : refineItemCommonProps.placeholderTextMax}\n onChange={this._changeMax}\n onFocus={this._changeMax}\n onBlur={this._finishChangeMax}\n value={formattedSelectedMax}\n ref={this.maxInput}\n />\n </label>\n {validationErrorMin &&\n <span className='ms-refine-submenu__input-range-error-text refine-submenu__input-range-min-error-text'>\n {validationErrorMin}\n </span>}\n {validationErrorMax && validationErrorMin !== validationErrorMax &&\n <span className='ms-refine-submenu__input-range-error-text refine-submenu__input-range-max-error-text'>\n {validationErrorMax}\n </span>}\n </form>\n );\n }\n\n private _renderSlider(): JSX.Element | undefined {\n const { isDisabled, sliderKey } = this.props;\n const ariaAttributes = {\n 'aria-disabled': isDisabled\n };\n\n return (\n <Slider\n className='ms-refine-submenu__range-refiner'\n key={this.state.sliderId}\n sliderKey={sliderKey}\n id={this.state.sliderId}\n inForm={false}\n min={(this.state.minValue && Number(this.state.minValue)) || undefined}\n max={(this.state.maxValue && Number(this.state.maxValue)) || undefined}\n step={1}\n orientation='horizontal'\n labels={this.state.labels}\n showLabels\n showTooltip\n sliderThumbs={this.state.sliderThumbs}\n onChangeEnd={this._onRangeUpdateEnd}\n onChange={debounce(this._onRangeUpdate, 500)}\n handleTooltipText={this._handleRangeTooltipText}\n {...ariaAttributes}\n />\n );\n }\n\n private _changeMin(event: React.FocusEvent<HTMLInputElement>): void {\n this._changeValue(event, 'Min');\n }\n\n private _changeMax(event: React.FocusEvent<HTMLInputElement>): void {\n this._changeValue(event, 'Max');\n }\n\n private _changeValue(event: React.FocusEvent<HTMLInputElement>, inputType: InputType): void {\n const selectedKey = `selected${inputType}`;\n const touchedKey = `touched${inputType}`;\n this.setState({\n [selectedKey]: this._getInputWithoutFormatting(event.currentTarget.value),\n [touchedKey]: true\n });\n }\n\n private _finishChangeMin(event: React.FocusEvent<HTMLInputElement>): boolean {\n const selectedMinValue = this._getInputWithoutFormatting(event.currentTarget.value);\n this.setState({\n selectedMin: selectedMinValue,\n minTouched: false\n });\n const minInput = Number(selectedMinValue);\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue, refineItemCommonProps, selectedRefinementCriterion } = this.props;\n const max = selectedRefinementCriterion && selectedRefinementCriterion.RightValueBoundString || undefined;\n\n const maxNum = max ? Number(max) : undefined;\n\n if (isNaN(minInput)) {\n this.setState({ validationErrorMin: refineItemCommonProps.validationErrorNaN });\n this._focus('Min');\n return false;\n }\n\n if (this._validateRange(minInput, maxNum)) {\n onToggle({\n parentProductRefinerHierarchy,\n productRefinerValue,\n isSelecting: true,\n rangeStart: minInput,\n rangeEnd: maxNum\n });\n return true;\n }\n this._focus('Min');\n\n return false;\n }\n\n private _finishChangeMax(event: React.FocusEvent<HTMLInputElement>): boolean {\n const selectedMaxValue = this._getInputWithoutFormatting(event.currentTarget.value);\n this.setState({\n selectedMax: selectedMaxValue,\n maxTouched: false\n });\n const maxInput = Number(selectedMaxValue);\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue, refineItemCommonProps, selectedRefinementCriterion } = this.props;\n const min = selectedRefinementCriterion && selectedRefinementCriterion.LeftValueBoundString || '0';\n\n const minNum = Number(min);\n\n if (isNaN(maxInput)) {\n this.setState({ validationErrorMax: refineItemCommonProps.validationErrorNaN });\n this._focus('Max');\n return false;\n }\n\n if (this._validateRange(minNum, maxInput)) {\n if (productRefinerValue) {\n onToggle({\n parentProductRefinerHierarchy,\n productRefinerValue,\n isSelecting: true,\n rangeStart: minNum,\n rangeEnd: maxInput\n });\n } else {\n this._focus('Max');\n }\n return true;\n }\n\n return false;\n }\n\n private _focus(inputType: InputType): void {\n const ref = inputType === 'Max' ? this.maxInput : this.minInput;\n\n setTimeout(() => {\n if (ref && ref.current) {\n ref.current.focus();\n }\n }, 50);\n }\n\n private _getFormattedSelectedValue(selected: string | undefined, touched: boolean, validationError: string | undefined): string | undefined {\n if (touched || validationError || selected === undefined) {\n return selected;\n }\n return this._formatPrice(selected);\n }\n\n private _validateRange(min: number, max: number | undefined): boolean {\n const { refineItemCommonProps } = this.props;\n if (max === undefined) {\n return true;\n }\n\n if (min > max) {\n this.setState({\n validationErrorMin: refineItemCommonProps.validationErrorRange,\n validationErrorMax: refineItemCommonProps.validationErrorRange\n });\n return false;\n }\n\n return true;\n }\n\n private _formatPrice(amount: string | undefined): string {\n const result = this.props.context.cultureFormatter.formatCurrency(Number(amount), this.currencyCode);\n return result;\n }\n\n private _getInputWithoutFormatting(input: string): string {\n // First try to cast raw input to a number\n const inputAsNum = Number(input);\n if (!isNaN(inputAsNum)) {\n return input;\n }\n\n // Otherwise try a reverse lookup and fall back to the raw input if all else fails\n const reverseLookupResult = this._formattedPriceReverseLookup.get(input);\n return reverseLookupResult || input;\n }\n\n // NOTE: Fix types once Shared Components build pipeline bug fixed\n private _onRangeUpdate(sliderChangeNotification: any): void {\n // Need to filter out mousemove events as these cause errors after the menu updates and slider re-renders\n if (sliderChangeNotification.eventType !== 'mousemove') {\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue } = this.props;\n if (productRefinerValue && sliderChangeNotification) {\n onToggle({\n parentProductRefinerHierarchy,\n productRefinerValue,\n isSelecting: true,\n rangeStart: sliderChangeNotification.firstThumbValue,\n rangeEnd: sliderChangeNotification.secondThumbValue\n });\n\n this._focusOnSliderThumb(sliderChangeNotification);\n }\n }\n }\n\n private _onRangeUpdateEnd(sliderChangeNotification: any): void {\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue } = this.props;\n if (productRefinerValue && sliderChangeNotification) {\n onToggle({\n parentProductRefinerHierarchy,\n productRefinerValue,\n isSelecting: true,\n rangeStart: sliderChangeNotification.firstThumbValue,\n rangeEnd: sliderChangeNotification.secondThumbValue\n });\n\n this._focusOnSliderThumb(sliderChangeNotification);\n }\n }\n\n private _focusOnSliderThumb(sliderChangeNotification: any): void {\n if (sliderChangeNotification.id) {\n const element = document.getElementById(`${sliderChangeNotification.id}range`);\n if (element) {\n setTimeout(\n () => {\n element.focus();\n }, 0);\n }\n }\n }\n\n private _handleRangeTooltipText(tooltip: number): string {\n return this._formatPrice(`${tooltip}`);\n }\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport * as React from 'react';\n\ninterface IAlertProps {\n message: string;\n}\n\nconst CheckoutAlert: React.FC<IAlertProps> = ({ message }) => (\n <p className='ms-checkout__error-message' role='alert' aria-live='assertive'>\n {message}\n </p>\n);\n\nexport default CheckoutAlert;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IAddResource, ICheckoutGiftCardViewProps, IForm, IItem, IList, IShowResource } from './checkout-gift-card';\n\nexport const From: React.FC<IForm> = ({ formProps, label, inputPinLabel, inputExpLabel, alert, inputProps, inputNumProps,\n inputPinProps, inputExpProps, inputNumber, inputPin, inputExp, applyButton, supportExternalGiftCard, showGiftCardPinInput, showGiftCardExpInput, alertFieldLabel }) => (\n <Node {...formProps}>\n {alert}\n {supportExternalGiftCard ? <Node {...inputProps}>\n <Node {...inputNumProps}>\n {label}\n {inputNumber}\n </Node>\n {showGiftCardPinInput &&\n <Node {...inputPinProps}>\n {inputPinLabel}\n {inputPin}\n </Node>}\n {showGiftCardExpInput &&\n <Node {...inputExpProps}>\n {inputExpLabel}\n {inputExp}\n </Node>}\n {(showGiftCardPinInput || showGiftCardExpInput) && alertFieldLabel}\n </Node> : <>\n {label}\n {inputNumber}\n </>}\n {applyButton}\n </Node>\n);\n\nexport const SelectedGiftCard: React.FC<IItem> = ({ itemProps, selectedGiftCard, removeButton }) => (\n <Node {...itemProps}>\n {selectedGiftCard}\n {removeButton}\n </Node>\n);\n\nexport const GiftCardList: React.FC<IList> = ({ listProps, list }) => (\n <Node {...listProps}>\n {list.map(({ id, ...item }) => (\n <SelectedGiftCard key={id} {...item} />\n ))}\n </Node>\n);\n\nexport const AddResource: React.FC<IAddResource> = ({ form, list }) => (\n <>\n {form && <From {...form} />}\n {list && <GiftCardList {...list} />}\n </>\n);\n\nexport const ShowResource: React.FC<IShowResource> = ({ title, list }) => (\n <>\n {title}\n {list && <GiftCardList {...list} />}\n </>\n);\n\nconst CheckoutGiftCardView: React.FC<ICheckoutGiftCardViewProps> = props => {\n const { checkoutGiftCardProps, showGiftCard, addGiftCard } = props;\n return (\n <Module {...checkoutGiftCardProps}>\n {showGiftCard && <ShowResource {...showGiftCard} />}\n {addGiftCard && <AddResource {...addGiftCard} />}\n </Module>\n );\n};\n\nexport default CheckoutGiftCardView;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { Button, INodeProps, Modal, ModalBody, ModalFooter, ModalHeader, Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IOrderTemplateLineViewProps } from './components';\nimport { IOrderTemplateViewProps } from './order-template';\n\nconst OrderTemplateLinesView: React.FC<IOrderTemplateViewProps> = (props: IOrderTemplateViewProps) => {\n const {\n OrderTemplateLines,\n status,\n statusMessage,\n heading,\n ProductsTable,\n ProductsTableHeading,\n orderLines,\n ProductsTableRow,\n productsStatusMessage,\n OrderTemplateActions,\n orderActions,\n pagination,\n itemAddedToCartDialog,\n bulkOrderLineActions,\n isDetailsDisplayed,\n detailedProductView,\n toggleDetailsDisplayed,\n resources: {\n cancelBtnLabel,\n productNumberText,\n productText,\n productUnitPriceText,\n productUOMText,\n productQuantityText\n }\n } = props;\n\n const toggleDetails = React.useCallback(() => {\n toggleDetailsDisplayed && toggleDetailsDisplayed(undefined);\n }, [toggleDetailsDisplayed]);\n\n return (\n <Module {...OrderTemplateLines}>\n {heading}\n {OrderTemplateActions && (\n <Node {...OrderTemplateActions}>\n {orderActions?.addTemplateToBag}\n {orderActions?.renameTemplate}\n {orderActions?.removeTemplate}\n {!isDetailsDisplayed && productsStatusMessage}\n </Node>\n )}\n {bulkOrderLineActions}\n {status !== 'SUCCESS' && statusMessage}\n {ProductsTable && orderLines && orderLines.length > 0 && (\n <Node className='ms-order-template__content'>\n <Node {...ProductsTable}>\n {ProductsTableHeading}\n <tbody>\n {orderLines &&\n orderLines.map(product => {\n return _renderItem(product, productQuantityText, ProductsTableRow);\n })}\n </tbody>\n </Node>\n {pagination}\n </Node>\n )}\n {itemAddedToCartDialog}\n <Modal\n wrapClassName='ms-order-template-mobile-view-modal'\n autoFocus\n fade={false}\n applicationNode='renderPage'\n isOpen={isDetailsDisplayed}\n toggle={toggleDetails}\n >\n <ModalHeader toggle={toggleDetails}>\n Product Details\n </ModalHeader>\n <ModalBody>\n <ul>\n <li>\n {detailedProductView?.productImage}\n </li>\n <li className='product-info'>\n <span>\n {productText}\n :\n </span>\n {detailedProductView?.productInfo}\n </li>\n <li>\n <span>\n {productNumberText}\n :\n </span>\n {detailedProductView?.productNumber}\n </li>\n <li>\n <span>\n {productUnitPriceText}\n :\n </span>\n {' '}\n {detailedProductView?.productPrice}\n </li>\n <li>\n <span>\n {productUOMText}\n :\n </span>\n {' '}\n {detailedProductView?.productUnitOfMeasure}\n </li>\n <li>\n <span>\n {productQuantityText}\n :\n </span>\n {detailedProductView?.productQuantityView}\n </li>\n {productsStatusMessage && <li>\n {productsStatusMessage}\n </li>}\n </ul>\n </ModalBody>\n <ModalFooter>\n <Button onClick={toggleDetails}>\n {cancelBtnLabel}\n </Button>\n </ModalFooter>\n </Modal>\n </Module>\n );\n};\n\nconst _renderItem = (\n product: IOrderTemplateLineViewProps,\n quantityLabel: string,\n ProductsTableRow?: INodeProps\n): JSX.Element | null => {\n if (!product) {\n return null;\n }\n\n const {\n key,\n selectLine,\n productImage,\n productPrice,\n productNumber,\n addToBagButton,\n removeButton,\n productInfo,\n productUnitOfMeasure,\n productQuantityView,\n productQuantity,\n popUp,\n isMobile\n } = product;\n\n return (\n <Node key={key} className={ProductsTableRow!.className} {...ProductsTableRow}>\n <td>\n {selectLine}\n </td>\n <td>\n {productImage}\n </td>\n {isMobile ? <td>\n <div>\n {productNumber}\n </div>\n <div>\n {quantityLabel}\n :\n {' '}\n {productQuantity}\n </div>\n </td> : <td>\n {productNumber}\n </td>}\n {!isMobile && <td>\n {productInfo}\n </td>}\n {!isMobile && <td>\n {productPrice}\n </td>}\n {!isMobile && <td>\n {productUnitOfMeasure}\n </td>}\n {!isMobile && <td>\n {productQuantityView}\n </td>}\n {isMobile && <td>\n {popUp}\n </td> }\n {!isMobile &&\n <td>\n {addToBagButton}\n {removeButton}\n </td>}\n </Node>\n );\n};\n\nexport default OrderTemplateLinesView;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport * as React from 'react';\n\ninterface ILink {\n className?: string;\n text?: string;\n href?: string;\n ariaLabel?: string;\n}\n\nexport const Link: React.FC<ILink> = ({ text, className, href, ariaLabel }) => (<a className={className} href={href} aria-label={ariaLabel}>\n {' '}\n {text}\n {' '}\n</a>);\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { TelemetryEvent } from '@msdyn365-commerce/core';\nimport { Button, getPayloadObject, getTelemetryAttributes, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport React, { useState } from 'react';\n\ninterface ICheckoutPlaceOrderButtonProps {\n canPlaceOrder: boolean;\n checkoutBtnText: string;\n telemetryContent?: ITelemetryContent;\n shouldEnableSinglePaymentAuthorizationCheckout?: boolean;\n isPlaceOrderLoading?: boolean;\n isExpressCheckoutApplied?: boolean;\n placeOrder(): Promise<void>;\n}\n\nconst buttonsStates: React.Dispatch<React.SetStateAction<boolean>>[] = [];\n\n/**\n * On place order function.\n * @param isBusy -Check is busy.\n * @param canPlaceOrder -Check can place order.\n * @param placeOrder -Place order function.\n * @returns Set state of button.\n */\nconst onPlaceOrderHandler = (isBusy: boolean, canPlaceOrder: boolean, placeOrder: () => Promise<void>) => async () => {\n if (isBusy || !canPlaceOrder) {\n return;\n }\n buttonsStates.map(buttonSetState => {\n buttonSetState(true);\n return true;\n });\n await placeOrder();\n buttonsStates.map(buttonSetState => {\n buttonSetState(false);\n return true;\n });\n};\n\nconst CheckoutPlaceOrderButton: React.FC<ICheckoutPlaceOrderButtonProps> = ({\n checkoutBtnText, canPlaceOrder, placeOrder, telemetryContent,\n shouldEnableSinglePaymentAuthorizationCheckout, isPlaceOrderLoading, isExpressCheckoutApplied }) => {\n const [isBusy, setIsBusy] = useState(false);\n buttonsStates.push(setIsBusy);\n const payload = getPayloadObject(TelemetryEvent.Purchase, telemetryContent!, checkoutBtnText, '');\n const attributes = getTelemetryAttributes(telemetryContent!, payload);\n\n if (shouldEnableSinglePaymentAuthorizationCheckout && !isExpressCheckoutApplied) {\n return (\n <Button\n className={classnames('ms-checkout__btn-place-order', { 'is-busy': isPlaceOrderLoading ?? false })}\n color='primary'\n onClick={placeOrder}\n title={checkoutBtnText}\n {...attributes}\n disabled={!canPlaceOrder || isPlaceOrderLoading}\n >\n {checkoutBtnText}\n </Button>\n );\n }\n\n return (\n <Button\n className={classnames('ms-checkout__btn-place-order', { 'is-busy': isBusy })}\n color='primary'\n onClick={onPlaceOrderHandler(isBusy, canPlaceOrder, placeOrder)}\n title={checkoutBtnText}\n {...attributes}\n disabled={!canPlaceOrder || isBusy}\n >\n {checkoutBtnText}\n </Button>\n );\n};\n\nexport default CheckoutPlaceOrderButton;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport withModuleState from './with-module-state';\n\nexport * from './module-state';\nexport * from './module-state.data';\n\nexport { withModuleState };\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport getCollectionProducts, {\n GetFullProductsByCollectionInput, IFullProductsSearchResultsWithCount, ProductListInventoryFilteringOptions\n} from './get-full-products-by-collection';\nimport getMappedSearchConfiguration, { MappedSearchConfiguration, MappedSearchInput, sortOptions } from './get-mapped-search-configuration';\nimport getCollectionRefinersAction, { RefinersByCollectionInput } from './get-refiners-for-collection';\n\nexport * from './base-collection-action';\nexport * from './url-utils';\n\nexport {\n getCollectionProducts,\n getCollectionRefinersAction,\n GetFullProductsByCollectionInput,\n getMappedSearchConfiguration,\n IFullProductsSearchResultsWithCount,\n MappedSearchConfiguration,\n MappedSearchInput,\n ProductListInventoryFilteringOptions,\n RefinersByCollectionInput,\n sortOptions\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { IOrderSummaryLines, OrderSummary } from '@msdyn365-commerce-modules/order-summary-utilities';\nimport { INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport get from 'lodash/get';\nimport * as React from 'react';\n\nimport { ICheckoutData } from '../checkout.data';\nimport { ICheckoutProps } from '../checkout.props.autogenerated';\n\nexport interface IOrderSummary {\n orderSummaryProps: INodeProps;\n heading?: React.ReactNode;\n lines?: IOrderSummaryLines;\n}\nexport const getOrderSummary = (input: ICheckoutProps<ICheckoutData>): IOrderSummary => {\n const {\n config: { orderSummaryHeading },\n data: { checkout },\n resources: {\n subTotalLabel,\n shippingLabel,\n taxLabel,\n orderTotalLabel,\n loyaltyLabel,\n giftcardLabel,\n totalDiscountsLabel,\n freeText,\n toBeCalculatedText,\n otherCharges\n },\n context,\n typeName,\n id,\n telemetry\n } = input;\n\n const checkoutState = get(checkout, 'result');\n const cart = get(checkout, 'result.checkoutCart.cart');\n const showLineItems = cart.CartLines && cart.CartLines.length > 0;\n const channelConfiguration = context.request.channel!;\n const multiplePickupStoreSwitchName = 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature';\n const { channelDeliveryOptionConfig, featureState } = input.data;\n const retailMultiplePickUpOptionEnabled = featureState?.result?.find(feature => feature.Name === multiplePickupStoreSwitchName)?.IsEnabled;\n\n const handleOrderSummaryHeadingChange = (event: Msdyn365.ContentEditableEvent) => {\n const {\n config: { orderSummaryHeading }\n } = input;\n orderSummaryHeading!.text = event.target.value;\n };\n\n return {\n orderSummaryProps: { className: 'ms-checkout-guest-profile__selected-item' },\n heading: orderSummaryHeading && orderSummaryHeading.text && (\n <Msdyn365.Text\n className='msc-order-summary__heading'\n {...orderSummaryHeading}\n tag={orderSummaryHeading.tag || 'h2'}\n text={orderSummaryHeading.text}\n editProps={{ onEdit: handleOrderSummaryHeadingChange, requestContext: context.request }}\n />\n ),\n lines: showLineItems ? OrderSummary({\n checkoutState,\n cart,\n subTotalLabel,\n shippingLabel,\n taxLabel,\n orderTotalLabel,\n loyaltyLabel,\n giftcardLabel,\n totalDiscountsLabel,\n freeText,\n toBeCalculatedText,\n context,\n typeName,\n id,\n channelConfiguration,\n telemetry,\n otherChargeLabel: otherCharges,\n retailMultiplePickUpOptionEnabled,\n channelDeliveryOptionConfig: channelDeliveryOptionConfig?.result\n }) : undefined\n };\n\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nexport * from './checkout';\nexport * from './empty-active-cart';\nexport * from './place-order';\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport {\n Button,\n Modal,\n ModalBody,\n ModalFooter,\n ModalHeader\n} from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nexport interface ISearchResultModalViewProps {\n modal: React.ReactElement;\n modalHeader: React.ReactElement;\n modalFooter: React.ReactElement;\n modalBody: React.ReactElement;\n}\n\ninterface IModalToggleProps {\n innerRef: React.RefObject<HTMLButtonElement> | undefined;\n id: string;\n text: string;\n ariaLabel: string;\n onClick(): void;\n}\n\nexport interface ISearchResultModalResources {\n modalTitle: string;\n modalCloseButtonText: string;\n}\n\nexport interface ISearchResultModalProps {\n resources: ISearchResultModalResources;\n isOpen: boolean;\n returnRef: React.RefObject<HTMLButtonElement> | undefined;\n onModalToggle(): void;\n}\n\nexport const ModalToggle: React.FC<IModalToggleProps> = (props: IModalToggleProps) => {\n const { text, onClick, ariaLabel, innerRef, id } = props;\n return (<button\n id={id} className='msc-button' aria-label={ariaLabel}\n onClick={onClick} ref={innerRef}>\n {text}\n </button>);\n};\n\nexport const SearchResultModal = (props: ISearchResultModalProps): ISearchResultModalViewProps => {\n return {\n modal: modalNode(props),\n modalHeader: modalHeaderNode(props),\n modalFooter: modalFooterNode(props),\n modalBody: <ModalBody className='msc-review-modal-body' />\n };\n};\n\nconst modalNode = (props: ISearchResultModalProps) => {\n return (\n <Modal\n autoFocus\n applicationNode='renderPage'\n returnFocusRef={props.returnRef}\n isOpen={props.isOpen}\n toggle={props.onModalToggle}\n className='msc-search-result-modal'\n zIndex={1050}\n />\n );\n};\n\nconst modalHeaderNode = (props: ISearchResultModalProps) => {\n return (\n <ModalHeader toggle={props.onModalToggle}>\n {props.resources.modalTitle}\n </ModalHeader>\n );\n};\n\nconst modalFooterNode = (props: ISearchResultModalProps) => {\n return (\n <ModalFooter>\n <Button onClick={props.onModalToggle} className='ms-sort-and-filter-modal-close'>\n {props.resources.modalCloseButtonText}\n </Button>\n </ModalFooter>\n );\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IForm, IItem } from './components';\nimport { IGiftCardBalanceCheckViewProps } from './gift-card-balance-check';\n\nexport const Form: React.FC<IForm> = ({ formProps, label, inputPinLabel, inputExpLabel, alert, inputProps, inputNumProps,\n inputPinProps, inputExpProps, inputNumber, inputPin, inputExp, applyButton, supportExternalGiftCard, showGiftCardPinInput, showGiftCardExpInput, alertFieldLabel }) => (\n <Node {...formProps}>\n {alert}\n {supportExternalGiftCard ? <Node {...inputProps}>\n <Node {...inputNumProps}>\n {label}\n {inputNumber}\n </Node>\n {showGiftCardPinInput &&\n <Node {...inputPinProps}>\n {inputPinLabel}\n {inputPin}\n </Node>}\n {showGiftCardExpInput &&\n <Node {...inputExpProps}>\n {inputExpLabel}\n {inputExp}\n </Node>}\n {(showGiftCardPinInput || showGiftCardExpInput) && alertFieldLabel}\n </Node> : <>\n {label}\n {inputNumber}\n </>}\n {applyButton}\n </Node>\n);\n\nexport const Item: React.FC<IItem> = ({ itemProps, selectedGiftCard }) => (\n <Node {...itemProps}>\n {selectedGiftCard}\n </Node>\n);\n\nconst GiftCardBalanceCheckView: React.FC<IGiftCardBalanceCheckViewProps> = props => {\n const { giftCardBalanceCheckProps, form, item } = props;\n return (\n <Module {...giftCardBalanceCheckProps}>\n {form && <Form {...form} />}\n {item && <Item {...item} />}\n </Module>\n );\n};\n\nexport default GiftCardBalanceCheckView;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport * as React from 'react';\n\nexport interface ICheckoutLoyaltyInput {\n className: string;\n type: string;\n value: string | number;\n min: number;\n max: number;\n ariaValueMax: number;\n ariaValueMin: number;\n ariaValueNow: number;\n id: string;\n step: string;\n onChange(event: React.ChangeEvent<HTMLInputElement>): void;\n onBlur(event: React.FocusEvent<HTMLInputElement>): void;\n}\n\nconst AdressInput: React.FC<ICheckoutLoyaltyInput> = ({\n className,\n type,\n value,\n min,\n max,\n step,\n ariaValueMax,\n ariaValueMin,\n ariaValueNow,\n onChange,\n onBlur,\n id\n}) => (\n\n <input\n className={className}\n type={type}\n value={value}\n min={min}\n max={max}\n step={step}\n aria-valuemax={ariaValueMax}\n aria-valuemin={ariaValueMin}\n aria-valuenow={ariaValueNow}\n onChange={onChange}\n onBlur={onBlur}\n id={id}\n />\n);\n\nexport default AdressInput;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport * as React from 'react';\n\nexport interface ICheckoutLoyaltyLabelProps {\n className: string;\n text: string;\n htmlFor: string;\n}\n\n/**\n * AddPaymentForm SFC.\n * @param root0\n * @param root0.className\n * @param root0.text\n * @param root0.htmlFor\n * @extends {React.FC<ICheckoutLoyaltyLabelProps>}\n */\nconst CheckoutLoyaltyLabel: React.FC<ICheckoutLoyaltyLabelProps> = ({\n className,\n text,\n htmlFor\n}) => {\n\n return (<label className={className} htmlFor={htmlFor}>\n {text}\n </label>);\n};\n\nexport default CheckoutLoyaltyLabel;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport * as React from 'react';\n\nexport interface ICheckoutLoyaltyTextProps {\n className: string;\n text?: string;\n}\n\n/**\n * AddPaymentForm SFC.\n * @param root0\n * @param root0.className\n * @param root0.text\n * @extends {React.FC<ICheckoutLoyaltyTextProps>}\n */\nconst CheckoutLoyaltyText: React.FC<ICheckoutLoyaltyTextProps> = ({\n className,\n text\n}) => {\n if (!text) {\n return null;\n }\n\n return (<span className={className}>\n {text}\n </span>);\n};\n\nexport default CheckoutLoyaltyText;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { PriceComponent } from '@msdyn365-commerce/components';\nimport { callActionOrExecute } from '@msdyn365-commerce/retail-proxy';\nimport { createGetMaxLoyaltyPointsToRedeemForTransactionBalanceInput } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\nimport { LoyaltyPointRedemptionEstimate, LoyaltyRewardPoint } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { IModuleStateProps, withModuleState } from '@msdyn365-commerce-modules/checkout-utilities';\nimport { GetLoyaltyTransactionEstimationInput } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, Drawer, Heading, IModuleProps, INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { computed, reaction, when } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { ICheckoutLoyaltyData } from './checkout-loyalty.data';\nimport { ICheckoutLoyaltyProps } from './checkout-loyalty.props.autogenerated';\nimport InputComponent from './components/checkout-loyalty-input';\nimport LabelComponent from './components/checkout-loyalty-label';\nimport TextComponent from './components/checkout-loyalty-text';\n\nexport interface ICheckoutLoyaltyState {\n dollarsApplied: number;\n isFetchingLoyaltyCard: boolean;\n}\n\nexport interface ICheckoutLoyaltyModuleProps extends ICheckoutLoyaltyProps<ICheckoutLoyaltyData>, IModuleStateProps {}\n\nexport interface ICheckoutLoyaltyViewState {\n isShowLoyalty: boolean;\n isShowAddLoyalty: boolean;\n}\n\nexport interface ICheckoutLoyaltyShow {\n heading: React.ReactNode;\n coveredAmountText: React.ReactNode;\n amount: React.ReactNode;\n}\n\nexport interface ICheckoutLoyaltyRewardPoint {\n checkoutLoyaltyRewardPoint: INodeProps;\n key: string;\n title: React.ReactNode;\n availablePointsText: React.ReactNode;\n activePoints: React.ReactNode;\n expiringPointsText: React.ReactNode;\n expiringPoints: React.ReactNode;\n}\n\nexport interface ICheckoutLoyaltyAdd {\n heading: React.ReactNode;\n cardNumber: React.ReactNode;\n drawer: INodeProps;\n rewardPoints: ICheckoutLoyaltyRewardPoint[];\n loyaltyAmountContainer: INodeProps;\n appliedLoyaltyAmountContainer: INodeProps;\n loyaltyAmountLabel: React.ReactNode;\n loyaltyAmountInput: React.ReactNode;\n loyaltyAmountApplyButton: React.ReactNode;\n showAppliedAmount: boolean;\n loyaltyAmountAppliedText: React.ReactNode;\n loyaltyAmountAppliedPrice: React.ReactNode;\n loyaltyAmountRemoveButton: React.ReactNode;\n}\n\nexport interface ICheckoutLoyaltyViewProps extends ICheckoutLoyaltyModuleProps {\n checkoutLoyalty: IModuleProps;\n viewState: ICheckoutLoyaltyViewState;\n showLoyalty: ICheckoutLoyaltyShow;\n addLoyalty: ICheckoutLoyaltyAdd;\n}\n\n/**\n *\n * CheckoutLoyalty component.\n * @extends {React.Component<ICheckoutLoyaltyProps<ICheckoutLoyaltyData>>}\n */\n// @ts-expect-error\n\n@withModuleState\n@observer\nclass CheckoutLoyalty extends React.Component<ICheckoutLoyaltyModuleProps, ICheckoutLoyaltyState> {\n private readonly _dialogToggleRef: React.RefObject<HTMLButtonElement> | undefined;\n\n private readonly moduleClassName: string = 'ms-checkout-loyalty';\n\n private readonly _defaultLoyaltyPoints: number = 0;\n\n constructor(props: ICheckoutLoyaltyModuleProps) {\n super(props);\n this._dialogToggleRef = React.createRef();\n this._applyLoyaltyPoints = this._applyLoyaltyPoints.bind(this);\n this._removeLoyaltyPoints = this._removeLoyaltyPoints.bind(this);\n this._onInputChange = this._onInputChange.bind(this);\n this._onBlur = this._onBlur.bind(this);\n this.state = { dollarsApplied: this.maxDollars, isFetchingLoyaltyCard: false };\n }\n\n @computed get shouldPayLoyalty(): boolean {\n const cart = this.props.data.checkout.result ? this.props.data.checkout.result.checkoutCart.cart : undefined;\n if (!cart) {\n return false;\n }\n\n // Use loyalty when cart is not full of free items\n const amountDue = cart.TotalAmount || 0;\n return amountDue > 0;\n }\n\n @computed get isDataReady(): boolean {\n return (\n (this.props.data.checkout.result && this.props.data.checkout.status) === 'SUCCESS' &&\n (this.props.data.loyaltyCard && this.props.data.loyaltyCard.status) !== 'LOADING' &&\n (this.props.data.loyaltyTransactionEstimation && this.props.data.loyaltyTransactionEstimation.status) !== 'LOADING'\n );\n }\n\n @computed get maxDollars(): number {\n return this.props.data.loyaltyTransactionEstimation.result &&\n this.props.data.loyaltyTransactionEstimation.result.MaxCurrencyValueOfLoyaltyPoints ? this.props.data.loyaltyTransactionEstimation.result.MaxCurrencyValueOfLoyaltyPoints : 0;\n }\n\n @computed get isPaymentVerificationRedirection(): boolean {\n const { requestFormData, query } = this.props.context.request;\n return !!(requestFormData && query && query.pv === '1');\n }\n\n public async componentDidMount(): Promise<void> {\n when(\n () => this.isDataReady,\n async () => {\n await this.init();\n }\n );\n\n reaction(\n () => this.props.data.checkout.result && this.props.data.checkout.result.checkoutCart.cart,\n async () => {\n this._updateEstimate();\n }\n );\n\n reaction(\n () => this.props.data.loyaltyCard.result,\n async () => {\n this._updateLoyalty();\n }\n );\n }\n\n public shouldComponentUpdate(nextProps: ICheckoutLoyaltyModuleProps,\n nextState: ICheckoutLoyaltyState): boolean {\n if (this.state === nextState && this.props.data === nextProps.data) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element | null {\n const {\n resources,\n renderView,\n moduleState: { isReady }\n } = this.props;\n\n if (\n this.props.data.loyaltyCard &&\n this.props.data.loyaltyCard.result &&\n this.props.data.loyaltyCard.result.CardNumber &&\n this.shouldPayLoyalty\n ) {\n const loyaltyCard = this.props.data.loyaltyCard.result;\n const checkoutState = this.props.data.checkout.result;\n let isShowLoyalty = false;\n\n if (isReady) {\n if (!checkoutState || checkoutState.loyaltyAmount === 0) {\n return null;\n }\n isShowLoyalty = true;\n\n }\n\n const viewProps = {\n ...this.props,\n viewState: {\n isShowLoyalty,\n isShowAddLoyalty: !isReady\n },\n checkoutLoyalty: {\n moduleProps: this.props,\n className: classnames(\n this.moduleClassName,\n { [`${this.moduleClassName}__applied`]: isShowLoyalty },\n this.props.config.className\n )\n },\n showLoyalty: {\n heading: <Heading headingTag='h3' className={`${this.moduleClassName}__heading`} text={resources.loyaltyHeadingText} />,\n coveredAmountText: (\n <TextComponent className={`${this.moduleClassName}__text`} text={resources.loyaltyCoveredAmountText} />\n ),\n amount: (\n <PriceComponent\n className={`${this.moduleClassName}__applied-value`}\n id={this.props.id}\n typeName={this.props.typeName}\n context={this.props.context}\n data={{ price: { CustomerContextualPrice: checkoutState && checkoutState.loyaltyAmount } }}\n />\n )\n },\n addLoyalty: {\n heading: <Heading headingTag='h3' className={`${this.moduleClassName}__heading`} text={resources.loyaltyHeadingText} />,\n drawer: {\n tag: Drawer,\n className: `${this.moduleClassName}__drawer`,\n toggleButtonText: this._drawerHeader(),\n openGlyph: `${this.moduleClassName}__drawer-open`,\n closeGlyph: `${this.moduleClassName}__drawer-close`,\n glyphPlacement: 'end'\n },\n cardNumber: <TextComponent className={`${this.moduleClassName}__card-number`} text={loyaltyCard.CardNumber || ''} />,\n rewardPoints:\n loyaltyCard.RewardPoints &&\n loyaltyCard.RewardPoints.map((points, index) => {\n return this._renderPointSection(points, resources.availablePointsLabel, resources.expiringLoyaltyPointsLabel);\n }),\n loyaltyAmountContainer: {\n className: `${this.moduleClassName}__amount`\n },\n appliedLoyaltyAmountContainer: {\n className: `${this.moduleClassName}__applied-amount`\n },\n loyaltyAmountLabel: (\n <LabelComponent\n className={`${this.moduleClassName}__amount-label`}\n text={resources.payWithLoyaltyAmountLabel}\n htmlFor={`${this.props.id}-label`}\n />\n ),\n loyaltyAmountInput: (\n <InputComponent\n className={`${this.moduleClassName}__amount-input`}\n onChange={this._onInputChange}\n onBlur={this._onBlur}\n type='number'\n step='.01'\n value={this.state.dollarsApplied}\n min={0}\n max={this.maxDollars}\n ariaValueMax={this.maxDollars}\n ariaValueMin={0}\n ariaValueNow={this.state.dollarsApplied}\n id={`${this.props.id}-label`}\n />\n ),\n loyaltyAmountApplyButton: (\n <Button\n className={`${this.moduleClassName}__amount-button`}\n title={this.props.resources.applyCheckoutLoyaltyPaymentText}\n onClick={this._applyLoyaltyPoints}\n disabled={\n this.state.dollarsApplied > this.maxDollars ||\n this.state.dollarsApplied <= 0 || isNaN(this.state.dollarsApplied) ||\n this.state.isFetchingLoyaltyCard\n }\n >\n {this.props.resources.applyCheckoutLoyaltyPaymentText}\n </Button>\n ),\n showAppliedAmount: checkoutState && checkoutState.loyaltyAmount > 0,\n loyaltyAmountAppliedText: (\n <TextComponent className={`${this.moduleClassName}__applied-text`} text={resources.loyaltyCoveredAmountText} />\n ),\n loyaltyAmountAppliedPrice: (\n <PriceComponent\n className={`${this.moduleClassName}__applied-value`}\n id={this.props.id}\n typeName={this.props.typeName}\n context={this.props.context}\n data={{ price: { CustomerContextualPrice: checkoutState && checkoutState.loyaltyAmount } }}\n />\n ),\n loyaltyAmountRemoveButton: (\n <Button\n className='ms-checkout-loyalty-remove-btn'\n title={this.props.resources.removeCheckoutLoyaltyPaymentText}\n onClick={this._removeLoyaltyPoints}\n innerRef={this._dialogToggleRef}\n >\n {this.props.resources.removeCheckoutLoyaltyPaymentText}\n </Button>\n )\n }\n };\n\n return renderView(viewProps) as React.ReactElement;\n }\n this.props.context.telemetry.error('Checkout loyalty content is empty, module wont render');\n return null;\n }\n\n private _drawerHeader(): JSX.Element {\n return (\n <>\n <p className={`${this.moduleClassName}__covered-text`}>\n {this.props.resources.loyaltyCoveredAmountText}\n </p>\n <PriceComponent\n className={`${this.moduleClassName}__applied-value`}\n id={this.props.id}\n typeName={this.props.typeName}\n context={this.props.context}\n data={{ price: { CustomerContextualPrice: this.maxDollars } }}\n />\n </>\n );\n }\n\n private _renderPointSection(\n point: LoyaltyRewardPoint,\n loyaltyCoveredAmountText: string,\n expiringLoyaltyPointsLabel: string\n ): ICheckoutLoyaltyRewardPoint {\n return {\n key: point.RewardPointId || '',\n checkoutLoyaltyRewardPoint: {\n className: `${this.moduleClassName}__program`\n },\n title: <TextComponent className={`${this.moduleClassName}__program-title`} text={point.Description} />,\n availablePointsText: <TextComponent className={`${this.moduleClassName}__program-available`} text={loyaltyCoveredAmountText} />,\n activePoints: (\n <TextComponent className={`${this.moduleClassName}__program-points`} text={(point && point.ActivePoints!).toString()} />\n ),\n expiringPointsText: <TextComponent className={`${this.moduleClassName}__program-expiring`} text={expiringLoyaltyPointsLabel} />,\n expiringPoints: (\n <TextComponent\n className={`${this.moduleClassName}__program-points`}\n text={(point && point.PointsExpiringSoon!).toString()}\n />\n )\n };\n }\n\n private readonly init = async (): Promise<void> => {\n this.props.moduleState.init({\n onEdit: this.onEdit,\n onCancel: this.onCancel,\n onSubmit: this.onSubmit,\n isRequired: false,\n ...(!this.isEnabled() && { status: 'disabled' })\n });\n\n const savedLoyaltyAmount = this.props.data.checkout.result?.loyaltyAmount;\n if (savedLoyaltyAmount) {\n this.props.moduleState.onReady();\n } else if (this.isPaymentVerificationRedirection) {\n this.props.moduleState.onSkip();\n } else if (\n this.props.data.loyaltyCard.result &&\n this.props.data.checkout.result &&\n this.props.data.loyaltyCard.result.CardNumber !== this.props.data.checkout.result.checkoutCart.cart.LoyaltyCardId\n ) {\n this.props.data.checkout.result.checkoutCart\n .updateLoyaltyCardId({ loyaltyCardNumber: this.props.data.loyaltyCard.result.CardNumber })\n .catch(error => {\n if (this.context.telemetry) {\n this.context.telemetry.warning(error);\n this.context.telemetry.debug('Unable to update the loyalty card');\n }\n });\n }\n };\n\n private readonly onEdit = () => {\n this.props.moduleState.onUpdating();\n };\n\n private readonly onCancel = () => {\n this.handleCancelOrSubmit();\n };\n\n private readonly onSubmit = () => {\n this.handleCancelOrSubmit();\n };\n\n private readonly handleCancelOrSubmit = () => {\n const checkoutState = this.props.data.checkout.result;\n if (checkoutState && checkoutState.loyaltyAmount > 0) {\n // Show summary screen\n this.props.moduleState.onReady();\n } else {\n // Skip the module\n this.props.moduleState.onSkip();\n }\n };\n\n private readonly isEnabled = () => {\n return (\n this.props.context.request.user.isAuthenticated &&\n this.props.data.loyaltyCard.result &&\n this.props.data.loyaltyCard.result.CardNumber &&\n this.shouldPayLoyalty\n );\n };\n\n private async _applyLoyaltyPoints(): Promise<void> {\n const checkoutState = this.props.data.checkout.result;\n\n if (!checkoutState) {\n return;\n }\n\n await checkoutState.updateLoyaltyAmount({ newAmount: Number.parseFloat(this.state.dollarsApplied.toString()) });\n this.setState({\n isFetchingLoyaltyCard: true\n });\n }\n\n private async _removeLoyaltyPoints(): Promise<void> {\n const checkoutState = this.props.data.checkout.result;\n\n if (!checkoutState) {\n return;\n }\n\n await checkoutState.updateLoyaltyAmount({ newAmount: 0 });\n this.setState({\n dollarsApplied: 0\n });\n }\n\n private _onInputChange(event: React.ChangeEvent<HTMLInputElement>): void {\n const value = event.currentTarget.value;\n this.setState({ dollarsApplied: value.length > 0 ? Number(value) : Number.parseFloat(value), isFetchingLoyaltyCard: false });\n }\n\n private _onBlur(event: React.FocusEvent<HTMLInputElement>): void {\n const num = Number.parseFloat(event.currentTarget.value).toFixed(2);\n const element = document.getElementById(`${this.props.id}-label`) as HTMLInputElement;\n if (element && num) {\n element.value = num;\n this.setState({ dollarsApplied: Number.parseFloat(num) });\n }\n }\n\n private _updateLoyalty(): void {\n if (this.props.moduleState.isDisabled && this.isEnabled()) {\n this._updateEstimate();\n this.props.moduleState.onUpdating();\n }\n }\n\n private _updateEstimate(): void {\n const card = this.props.data.loyaltyCard.result;\n const checkout = this.props.data.checkout.result;\n const cart = this.props.data.checkout.result ? this.props.data.checkout.result.checkoutCart.cart : undefined;\n const channelConfig = this.props.context.request.channel;\n if (card && card.CardNumber && cart && channelConfig) {\n const currencyCode = channelConfig.Currency || '';\n const loyalPointsRequest = createGetMaxLoyaltyPointsToRedeemForTransactionBalanceInput(cart.Id, card.CardNumber, currencyCode);\n\n // @ts-expect-error\n // Due to bug 23214358, this is getting improperly cached. Need to turn on cache bypass for now to work around issue\n loyalPointsRequest._query.options.bypassCache = 'get';\n\n callActionOrExecute<LoyaltyPointRedemptionEstimate>(loyalPointsRequest, this.props.context.actionContext)\n .then(async points => {\n this.props.context.actionContext.update(\n new GetLoyaltyTransactionEstimationInput(this.props.context.request.apiSettings),\n points\n );\n const newMaxPoints = points.MaxCurrencyValueOfLoyaltyPoints ?? this._defaultLoyaltyPoints;\n\n // If points are already applied, ensure you don't apply more points than max\n if (checkout && (checkout.loyaltyAmount > newMaxPoints)) {\n await checkout.updateLoyaltyAmount({ newAmount: newMaxPoints });\n }\n\n this.setState({ dollarsApplied: newMaxPoints, isFetchingLoyaltyCard: false });\n })\n .catch(error => {\n this.props.context.actionContext.telemetry.exception(error);\n this.props.context.actionContext.telemetry.debug('Error getting Loyalty Point Redemption Estimate');\n });\n }\n }\n}\n\nexport default CheckoutLoyalty;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { Button } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IOrderTemplateLineViewModel } from '../order-template';\nimport { IOrderTemplateData } from '../order-template.data';\nimport { IOrderTemplateProps } from '../order-template.props.autogenerated';\nimport { AddLineToTemplate } from '.';\n\ninterface IOrderTemplateBulkActionsProps extends IOrderTemplateProps<IOrderTemplateData> {\n orderTemplateId: string;\n selectedLines: IOrderTemplateLineViewModel[];\n isMinifiedView: boolean;\n onAddSelectionToBag(): void;\n onRemoveSelection(): void;\n}\n\ninterface IOrderTemplateBulkActionsState {\n isAddDisabled: boolean;\n isRemoveDisabled: boolean;\n}\n\n/**\n * Bulk Order Template line actions.\n */\nexport class OrderTemplateBulkActions extends React.PureComponent<IOrderTemplateBulkActionsProps, IOrderTemplateBulkActionsState> {\n\n public state: IOrderTemplateBulkActionsState = {\n isAddDisabled: true,\n isRemoveDisabled: true\n };\n\n public static getDerivedStateFromProps(props: IOrderTemplateBulkActionsProps,\n state: IOrderTemplateBulkActionsState): IOrderTemplateBulkActionsState {\n const selectedLines = props.selectedLines.length;\n let nextState = { ...state };\n nextState = {\n isAddDisabled: selectedLines === 0,\n isRemoveDisabled: selectedLines === 0\n };\n return nextState;\n }\n\n public render(): JSX.Element {\n const { addLineModalLinkText,\n searchButtonAriaLabel,\n searchInputAriaLabel,\n searchModalPlaceholderText,\n selectProductButtonText,\n addItemToTemplateText,\n addLineProductUnitPricePrefix,\n backButtonText,\n decrementButtonAriaLabel,\n incrementButtonAriaLabel,\n quantitySelectLabel,\n addLineProductUnitOfMeasurePrefix,\n notFoundSearchErrorNotice,\n notFoundSearchErrorRedediation,\n searchErrorMessage,\n productDimensionTypeColor,\n productDimensionTypeConfiguration,\n productDimensionTypeSize,\n productDimensionTypeStyle,\n addSelectedToBagButtonText,\n removeSelectedToBagButtonText,\n searchResultsCountVerbage,\n searchResultsCountSubject,\n addToTemplateConfirmation,\n totalPriceLabel,\n progressNotificationText,\n addToTemplateDuplicateError,\n addToTemplateGenericError,\n dimensionMissingError\n } = this.props.resources;\n const addLineProps = {\n context: this.props.context,\n resources: {\n addLineModalLinkText,\n searchButtonAriaLabel,\n searchInputAriaLabel,\n searchModalPlaceholderText,\n selectProductButtonText,\n addItemToTemplateText,\n addLineProductUnitPricePrefix,\n backButtonText,\n decrementButtonAriaLabel,\n incrementButtonAriaLabel,\n quantitySelectLabel,\n addLineProductUnitOfMeasurePrefix,\n notFoundSearchErrorNotice,\n notFoundSearchErrorRedediation,\n searchErrorMessage,\n productDimensionTypeColor,\n productDimensionTypeConfiguration,\n productDimensionTypeSize,\n productDimensionTypeStyle,\n searchResultsCountVerbage,\n searchResultsCountSubject,\n addToTemplateConfirmation,\n totalPriceLabel,\n progressNotificationText,\n addToTemplateDuplicateError,\n addToTemplateGenericError,\n dimensionMissingError\n },\n imageSettings: this.props.config.imageSettings,\n orderTemplateId: this.props.orderTemplateId\n };\n\n return (\n <>\n <AddLineToTemplate {...addLineProps} />\n <Button\n onClick={this.addHandler}\n disabled={this.state.isAddDisabled}\n className='add-selected-to-bag'\n aria-label={addSelectedToBagButtonText}\n >\n <span />\n {!this.props.isMinifiedView && addSelectedToBagButtonText}\n </Button>\n <Button\n onClick={this.removeHandler}\n disabled={this.state.isRemoveDisabled}\n className='remove-selected'\n aria-label={removeSelectedToBagButtonText}\n >\n <span />\n {!this.props.isMinifiedView && removeSelectedToBagButtonText}\n </Button>\n </>\n );\n }\n\n private readonly addHandler = (event: React.MouseEvent<HTMLElement>) => {\n this.setState({\n isAddDisabled: true\n });\n\n this.props.onAddSelectionToBag();\n\n this.setState({\n isAddDisabled: false\n });\n };\n\n private readonly removeHandler = (event: React.MouseEvent<HTMLElement>) => {\n this.setState({\n isRemoveDisabled: true\n });\n\n this.props.onRemoveSelection();\n };\n\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ICheckoutDeliveryOption, ICheckoutDeliveryOptionEdit, ICheckoutDeliveryOptionsError, ICheckoutDeliveryOptionsList, ICheckoutDeliveryOptionsViewProps } from './checkout-delivery-options';\n\nconst DeliveryOptionList: React.FC<ICheckoutDeliveryOptionsList> = ({\n DeliveryOptionsList,\n list\n}) => {\n if (!list || list.length === 0) {\n return null;\n }\n\n return (\n <Node {...DeliveryOptionsList}>\n {list.map((deliveryOption: ICheckoutDeliveryOptionEdit) => {\n return (<Node {...deliveryOption.DeliveryOption} key={deliveryOption.code} aria-label='Please select a delivery option.'>\n {deliveryOption.radioButton}\n {deliveryOption.description}\n {deliveryOption.price}\n </Node>);\n })}\n </Node>\n );\n};\n\nconst DeliveryOptionSelected: React.FC<ICheckoutDeliveryOption> = ({\n DeliveryOption,\n description,\n price\n}) => {\n\n return (\n <Node {...DeliveryOption}>\n {description}\n {price}\n </Node>\n );\n};\n\nconst ErrorMessage: React.FC<ICheckoutDeliveryOptionsError> = ({\n Error,\n title,\n message\n}) => {\n\n return (\n <Node {...Error}>\n {title}\n {message}\n </Node>\n );\n};\n\nconst CheckoutDeliveryOptionsView: React.FC<ICheckoutDeliveryOptionsViewProps> = props => {\n const { CheckoutDeliveryOptions,\n viewState,\n deliveryOptions,\n deliveryOptionSelected,\n errorMessage,\n waiting,\n saveButton,\n editButton,\n cancelButton } = props;\n\n return (\n\n // TODO: All wrapper div should be provided by viewProps. Once SDK provide the sln, update markup.\n <Module {...CheckoutDeliveryOptions}>\n {viewState.isLoading && waiting}\n {viewState.isError && errorMessage && <ErrorMessage {...errorMessage} />}\n {viewState.isShowList && deliveryOptions && <DeliveryOptionList {...deliveryOptions} />}\n {viewState.isShowSelected && deliveryOptionSelected && <DeliveryOptionSelected {...deliveryOptionSelected} />}\n {viewState.isShowSaveButton && saveButton}\n {viewState.isShowEditButton && editButton}\n {viewState.isShowCancelButton && cancelButton}\n </Module>\n );\n};\n\nexport default CheckoutDeliveryOptionsView;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { ICoreContext, IGridSettings, IImageData, IImageSettings, Image, IRequestContext } from '@msdyn365-commerce/core';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { getFallbackImageUrl, getProductPageUrlSync } from '@msdyn365-commerce-modules/retail-actions';\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, onTelemetryClick } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ISearchResultContainerResources } from '../search-result-container.props.autogenerated';\n\n// Import { IComponent, IComponentProps, ICoreContext, IGridSettings, IImageData, IImageSettings, Image, msdyn365Commerce } from '@msdyn365-commerce/core';\n\ninterface IFeatureSearchResultItem {\n product: SimpleProduct | null;\n context: ICoreContext;\n resources: ISearchResultContainerResources;\n imageSettings?: IImageSettings;\n moduleType: string;\n moduleId: string;\n telemetryContent?: ITelemetryContent;\n recommendation?: string;\n}\n\nexport const FeatureSearchResultItem: React.FC<IFeatureSearchResultItem> = ({\n product,\n context,\n imageSettings,\n resources,\n telemetryContent,\n recommendation\n}) => {\n if (product === null) {\n return null;\n }\n\n const productName = product.Name;\n const productRecordId = product && product.RecordId ? product.RecordId : 0;\n const productUrl = getProductPageUrlSync(product.Name || '', productRecordId, context && context.actionContext, undefined);\n const fallbackImage = getFallbackImageUrl(product.ItemId, context.actionContext.requestContext.apiSettings);\n const heading = recommendation && recommendation === 'descriptions' ? resources.featureSimilarDescriptionTitle : resources.featureSimilarLooksTitle;\n\n // Construct telemetry attribute to render\n const payLoad = getPayloadObject('click', telemetryContent!, productName!, productRecordId.toString());\n\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\n return (\n <div className='ms-feature-search-result__item'>\n <a\n href={productUrl} onClick={onTelemetryClick(telemetryContent!, payLoad, product.Name!)} {...attribute}\n aria-label={product.Name}>\n <div className='msc-feature-search-result__item__image'>\n {renderProductPlacementImage(\n imageSettings, context.request.gridSettings, product.PrimaryImageUrl,\n product.Name, fallbackImage, context.actionContext.requestContext)}\n </div>\n </a>\n <div className='msc-feature-search-result__item__detail'>\n <p className='msc-feature-search-result__item__heading'>\n {heading}\n </p>\n {renderProductTitle(product?.Name)}\n </div>\n </div>\n );\n\n};\n\nfunction renderProductPlacementImage(\n imageSettings?: IImageSettings, gridSettings?: IGridSettings, imageUrl?: string,\n altText?: string, fallbackImage?: string, context?: IRequestContext): JSX.Element | null {\n\n if (!imageUrl || !gridSettings || !imageSettings) {\n return null;\n }\n const img: IImageData = {\n src: imageUrl,\n altText: altText ? altText : ''\n };\n const imageProps = {\n gridSettings,\n imageSettings,\n fallBackSrc: fallbackImage\n };\n return (\n <Image\n {...img} {...imageProps} loadFailureBehavior='empty'\n requestContext={context}\n />\n );\n}\n\nfunction renderProductTitle(title?: string): JSX.Element | null {\n return (<h1 className='msc-feature-search-result__item__product-title'>\n {title}\n </h1>);\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { Heading as HeadingType } from '@msdyn365-commerce-modules/data-types';\nimport { Button, getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\nimport classname from 'classnames';\nimport * as React from 'react';\n\nexport interface ICheckoutGuidedCardProps {\n step: number;\n title?: HeadingType;\n disabled?: boolean; // Module is not available\n isActive?: boolean; // Step === currentStep\n isVisted?: boolean; // Step < currentStep\n isExpanded?: boolean;\n isReady?: boolean;\n isPending?: boolean;\n isUpdating?: boolean;\n isSubmitting?: boolean;\n isCancelAllowed?: boolean;\n isMobile?: boolean;\n hasInitialized?: boolean;\n hasControlGroup?: boolean;\n children: React.ReactNode;\n resource: {\n checkoutStepTitleFormat: string;\n saveBtnLabel: string;\n changeBtnLabel: string;\n cancelBtnLabel: string;\n saveAndContinueBtnLabel: string;\n };\n telemetryContent?: ITelemetryContent;\n onEdit?(): void;\n onCancel?(): void;\n onSubmit?(): void;\n onNext(): void;\n}\n\n/**\n *\n * CheckoutGuidedCard component.\n * @extends {React.Component<ICheckoutGuidedCardProps>}\n */\nclass CheckoutGuidedCard extends React.PureComponent<ICheckoutGuidedCardProps> {\n private readonly editButtonRef: React.RefObject<HTMLButtonElement> = React.createRef();\n\n private readonly formCardRef: React.RefObject<HTMLDivElement> = React.createRef();\n\n private readonly payLoad: IPayLoad;\n\n constructor(props: ICheckoutGuidedCardProps) {\n super(props);\n this.payLoad = getPayloadObject('click', props.telemetryContent!, '');\n }\n\n public componentDidUpdate(prevProps: ICheckoutGuidedCardProps): void {\n /**\n * Move to next step when current step is ready.\n */\n const { isActive, isReady, onNext, isVisted, onEdit } = this.props;\n\n // Move to next step after completing the current step\n if (isActive && isReady) {\n onNext();\n }\n\n // Set the focus to Edit button once edit button appear\n // (It happens when current step switch to isReady status)\n const prevCanEdit = prevProps.isReady && prevProps.isVisted && !!prevProps.onEdit;\n const canEdit = isReady && isVisted && !!onEdit;\n if (!prevCanEdit && canEdit) {\n this.focusOnEditButton();\n this.scrollToTitle();\n }\n\n // Set the focus to the first focusable element\n // (It happens when current step switch to isUpdating status)\n if (prevProps.isReady && !isReady) {\n this.focusOnFirstFocusableElement();\n }\n }\n\n public render(): JSX.Element | null {\n const {\n title,\n disabled,\n isExpanded,\n isActive,\n isVisted,\n children,\n isReady,\n isPending,\n isUpdating,\n hasInitialized,\n hasControlGroup,\n onEdit,\n resource\n } = this.props;\n const { changeBtnLabel } = resource;\n\n this.payLoad.contentAction.etext = TelemetryConstant.CheckoutChange;\n const changeBtnAttributes = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\n const canEdit = hasControlGroup && isReady && isVisted && onEdit;\n\n return (\n <div\n className={classname('ms-checkout__guided-card', {\n active: isActive,\n expanded: isExpanded,\n closed: !isExpanded,\n visted: isVisted,\n hidden: disabled,\n initialized: hasInitialized,\n disabled,\n ready: isReady,\n pending: isPending,\n updating: isUpdating\n })}\n ref={this.formCardRef}\n >\n <div className='ms-checkout__guided-card-header'>\n {this.getTitle()}\n\n {canEdit && (\n <Button\n innerRef={this.editButtonRef}\n className='ms-checkout__guided-card-btn-edit'\n title={changeBtnLabel}\n color='link'\n onClick={onEdit}\n role='link'\n aria-label={title && title.text ? `${changeBtnLabel} ${title.text}` : ''}\n {...changeBtnAttributes}\n >\n {changeBtnLabel}\n </Button>\n )}\n </div>\n\n <div\n className={classname('ms-checkout__guided-card-body', {\n hidden: !isExpanded\n })}\n >\n <div className='ms-checkout__guided-card-content'>\n {children}\n </div>\n\n {this.renderFooder()}\n </div>\n </div>\n );\n }\n\n private readonly renderFooder = (): JSX.Element | null => {\n const { isVisted, isReady, isSubmitting, isCancelAllowed, hasControlGroup, onCancel, onSubmit, resource } = this.props;\n const { saveBtnLabel, cancelBtnLabel, saveAndContinueBtnLabel } = resource;\n\n const canSubmit = !isReady && onSubmit;\n const canCancel = !isReady && isVisted && isCancelAllowed && onCancel;\n\n if (!hasControlGroup || (!canSubmit && !canCancel)) {\n return null;\n }\n\n this.payLoad.contentAction.etext = isVisted ? TelemetryConstant.Save : TelemetryConstant.SaveContinue;\n const saveBtnAttributes = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\n this.payLoad.contentAction.etext = TelemetryConstant.Cancel;\n const cancelBtnAttributes = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\n\n return (\n <div className='ms-checkout__guided-card-footer'>\n {canSubmit && (\n <Button\n className={classname('ms-checkout__guided-card-btn-save', { 'is-submitting': isSubmitting })}\n title={isVisted ? saveBtnLabel : saveAndContinueBtnLabel}\n color='primary'\n disabled={isSubmitting}\n onClick={onSubmit}\n {...saveBtnAttributes}\n >\n {isVisted && isCancelAllowed ? saveBtnLabel : saveAndContinueBtnLabel}\n </Button>\n )}\n {canCancel && (\n <Button\n className='ms-checkout__guided-card-btn-cancel'\n title={cancelBtnLabel}\n color='secondary'\n onClick={onCancel}\n {...cancelBtnAttributes}\n >\n {cancelBtnLabel}\n </Button>\n )}\n </div>\n );\n };\n\n private readonly focusOnFirstFocusableElement = (): void => {\n const node = this.formCardRef.current as HTMLElement;\n const focussableElements = `\n a:not([disabled]),\n button:not([disabled]),\n input[type=submit]:not([disabled]),\n input[type=checkbox]:not([disabled]),\n input[type=text]:not([disabled]),\n input[type=radio]:not([disabled]),\n input[type=password]:not([disabled]),\n select:not([disabled]),\n textarea:not([disabled]),\n [tabindex]:not([disabled]):not([tabindex=\"-1\"])\n `;\n\n const child = node && node.querySelector && (node.querySelector(focussableElements) as HTMLElement);\n child && child.focus && child.focus();\n };\n\n private readonly focusOnEditButton = (): void => {\n // Focus on edit button\n const editButton =\n this.editButtonRef &&\n this.editButtonRef.current &&\n this.editButtonRef.current.focus &&\n (this.editButtonRef.current as HTMLElement);\n editButton && editButton.focus();\n };\n\n private readonly scrollToTitle = (): void => {\n // Scroll window to the title of the step that was just completed only in mobile viewport\n const formCard = this.props.isMobile && this.formCardRef && this.formCardRef.current && (this.formCardRef.current as HTMLElement);\n formCard && formCard.scrollIntoView();\n };\n\n private readonly getTitle = (): JSX.Element => {\n const { step, title } = this.props;\n const { headingTag: Tag = 'h2', text = '' } = title || {};\n return (\n <Tag className='ms-checkout__guided-card-title'>\n <span className='ms-checkout__guided-card-title-step'>\n {step + 1}\n .\n {' '}\n </span>\n {text && <span className='ms-checkout__guided-card-title-text'>\n {text}\n </span>}\n </Tag>\n );\n };\n}\n\nexport default CheckoutGuidedCard;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { observable } from 'mobx';\n\n/**\n * State information related to what is needed to succesfully perform a autosuggest.\n */\nexport class SearchState {\n @observable public searchText?: string;\n\n @observable public defaultBasicSearchUrl?: string;\n\n @observable public searchQueryStringParameter?: string;\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { Autosuggestions } from '@msdyn365-commerce/commerce-entities';\nimport {\n CacheType, createObservableDataAction, getCatalogId, IAction, IActionContext, IActionInput,\n ICreateActionContext\n} from '@msdyn365-commerce/core';\nimport { SearchSuggestion, SearchSuggestionCriteria } from '@msdyn365-commerce/retail-proxy';\nimport {\n getSearchSuggestionsAsync\n} from '@msdyn365-commerce/retail-proxy/dist/DataActions/StoreOperationsDataActions.g';\nimport { generateImageUrl } from '@msdyn365-commerce-modules/retail-actions';\n\nexport enum SuggestionType {\n Category = 'ScopedCategory',\n Keyword = 'Keyword',\n Product = 'Product',\n None = 'None'\n}\n\n/**\n * Input class for auto suggest search input.\n */\nexport class AutoSuggestInput implements IActionInput {\n public searchQuery?: string;\n\n public topResultsCount?: number;\n\n public suggestionType?: string;\n\n public hitPrefix?: string;\n\n public hitSuffix?: string;\n\n public constructor(searchText?: string, top?: number, suggestionType?: string, hitPrefix?: string, hitSuffix?: string) {\n this.searchQuery = searchText;\n this.topResultsCount = top;\n this.suggestionType = suggestionType;\n this.hitPrefix = hitPrefix;\n this.hitSuffix = hitSuffix;\n }\n\n public getCacheKey = () => 'AutoSuggestSearchSuggestions';\n\n public getCacheObjectType = () => 'AutoSuggestSearchSuggestions';\n\n public dataCacheType = (): CacheType => 'none';\n}\n\nconst createInput = (inputData: ICreateActionContext) => {\n return new AutoSuggestInput();\n};\n\n/**\n * Calls the Retail API and returns a auto-suggest suggestions.\n * @param input\n * @param ctx\n */\nexport async function getSearchSuggestionsAction(input: AutoSuggestInput, ctx: IActionContext): Promise<Autosuggestions | null> {\n // If no input is provided fail out\n if (!input || !input.searchQuery) {\n throw new Error('[getSearchSuggestionsAction]No valid Input was provided, failing');\n }\n\n const autosuggest: Autosuggestions = {};\n\n const autoSuggestPromises = [_getAutoSuggest(input, autosuggest, ctx)];\n return Promise.all(autoSuggestPromises).then(() => {\n return autosuggest;\n });\n}\n\nasync function _getAutoSuggest(\n input: AutoSuggestInput,\n autosuggest: Autosuggestions,\n ctx: IActionContext\n): Promise<void> {\n const catalogId = getCatalogId(ctx.requestContext);\n const searchCriteria: SearchSuggestionCriteria = {\n ProductSearchCriteria: {\n SearchCondition: input.searchQuery && input.searchQuery.length > 0 ? input.searchQuery : '',\n Context: {\n ChannelId: +ctx.requestContext.apiSettings.channelId,\n CatalogId: catalogId\n }\n },\n HitPrefix: input.hitPrefix,\n HitSuffix: input.hitSuffix,\n SuggestionType: input.suggestionType\n };\n\n const searchSuggestions = await getSearchSuggestionsAsync(\n { callerContext: ctx, queryResultSettings: { Paging: { Top: input.topResultsCount } } },\n searchCriteria\n );\n\n if (searchSuggestions && searchSuggestions.length > 0) {\n // Generate image url\n searchSuggestions.map(\n (item: SearchSuggestion) => (item.ImageUrl = item.ImageUrl ? generateImageUrl(item.ImageUrl, ctx.requestContext.apiSettings) : '')\n );\n\n autosuggest.AllSearchResults = searchSuggestions;\n } else {\n ctx.telemetry.error(`[getSearchSuggestionsAction] unable to get availabilites for search with suggestion type ${searchCriteria.SuggestionType}`);\n }\n}\n\nexport const getSearchSuggestionsActionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/search/get-auto-suggest-suggestions',\n action: <IAction<Autosuggestions>>getSearchSuggestionsAction,\n input: createInput\n});\n\nexport default getSearchSuggestionsActionDataAction;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport MsDyn365, { getRichTextHtml } from '@msdyn365-commerce/core';\nimport { ProductRefiner, ProductRefinerSource, ProductRefinerValue, SearchSuggestion } from '@msdyn365-commerce/retail-proxy';\nimport { format, getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ISearchData } from '../search.data';\nimport { ISearchProps } from '../search.props.autogenerated';\n\nexport interface ISearchCategorySuggestProps {\n searchCategorySuggestClass: string;\n searchPageURL: string;\n searchQsp: string | undefined;\n hitPrefix: string;\n hitSuffix: string;\n autoSuggestProps: ISearchProps<ISearchData>;\n searchText: string;\n searchRefiners: ProductRefiner[] | undefined;\n suggestions: SearchSuggestion[] | undefined;\n telemetryContent?: ITelemetryContent;\n shouldShowFullPath?: boolean;\n}\n\nexport interface ISearchCategoryViewProps {\n title: React.ReactNode;\n text: React.ReactNode[];\n}\n\nlet payLoad: IPayLoad;\n\n/**\n * CategorySuggestionsComponent.\n * @param props\n */\nexport const CategorySuggestionsComponent = (props: ISearchCategorySuggestProps): ISearchCategoryViewProps | undefined => {\n const {\n suggestions,\n searchText,\n autoSuggestProps: {\n resources: { categorySuggestionHeading }\n }\n } = props;\n\n const reactNodes: React.ReactNode[] = [];\n payLoad = getPayloadObject('click', props.telemetryContent!, '');\n\n suggestions?.map(item => {\n reactNodes.push(_assembleNode(item, props));\n });\n\n const titleNode = _renderTitle(categorySuggestionHeading, searchText);\n\n return { title: titleNode, text: reactNodes };\n};\n\nconst _renderTitle = (categorySuggestionHeading: string, searchText: string) => {\n const categoryAutoSuggestionHeading = categorySuggestionHeading ? format(categorySuggestionHeading, searchText) : `Search \"${searchText}\" in categories`;\n\n return (<li className='msc-autoSuggest__categoryResults-title'>\n {categoryAutoSuggestionHeading}\n </li>);\n};\n\nconst _assembleNode = (item: SearchSuggestion, props: ISearchCategorySuggestProps) => {\n const { searchText, hitPrefix, hitSuffix, shouldShowFullPath } = props;\n\n const splitValue = shouldShowFullPath ? item.Value : item.Value && item.Value.split('|').pop();\n const ariaLabel = splitValue ? splitValue.replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '') : item.Value && item.Value.replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\n payLoad.contentAction.etext = item.Value;\n const attribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n return (\n <li className='msc-autoSuggest__categoryResults-item' key={item.Id}>\n <a aria-label={ariaLabel} href={_generateLink(item, searchText, props)} {...attribute}>\n {_generateLink(item, searchText, props) && _getHighlightedText(splitValue ? splitValue : '', hitPrefix, hitSuffix)}\n </a>\n </li>\n );\n};\n\nconst _generateLink = (suggestion: SearchSuggestion, searchText: string, props: ISearchCategorySuggestProps): string => {\n return suggestion && suggestion.Id ? _getCategoryLink(suggestion.Id, searchText, props) : '';\n};\n\nconst _getCategoryLink = (id: string, searchText: string, props: ISearchCategorySuggestProps): string => {\n const { searchPageURL, searchQsp, searchRefiners } = props;\n\n if (!MsDyn365.isBrowser) {\n return '';\n }\n\n const queryUrl = new URL(searchPageURL, window.location.href);\n\n if (searchQsp && searchText) {\n queryUrl.searchParams.set(searchQsp, searchText);\n }\n\n const categoryRefiners = searchRefiners?.find(refiners => {\n return refiners.SourceValue === ProductRefinerSource.Category;\n });\n const refiner = categoryRefiners?.Values?.find(item => {\n return item.RefinerRecordId === Number.parseInt(id, 10);\n });\n\n const encodedRefiner = refiner && JSON.stringify(compressRefiners([refiner]));\n if (encodedRefiner) {\n queryUrl.searchParams.set('refiners', encodedRefiner);\n }\n\n return queryUrl.href;\n};\n\nconst _getHighlightedText = (suggestion: string, hitPrefix: string, hitSuffix: string): JSX.Element => {\n const formattedText = suggestion\n .replace(new RegExp(`[${hitPrefix}]`, 'gi'), '<strong>')\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '</strong>');\n\n return <span dangerouslySetInnerHTML={getRichTextHtml(formattedText)} />;\n};\n\n// TODO: This code is currently duplicated in categoryautosuggest need to either remove one of these files\n// or move this code to a common place\nconst compressedRefinerKeys = ['DataTypeValue', 'LeftValueBoundString', 'RefinerRecordId', 'RefinerSourceValue', 'RightValueBoundString', 'UnitText'];\n\n/**\n * Compressed a list of refiners for use in URLs.\n * @param refiners The uncompressed refiners.\n */\nconst compressRefiners = (refiners: ProductRefinerValue[]) => {\n const compressedRefiners: (string | number)[][] = [];\n\n refiners.forEach((refiner) => {\n const compressedRefiner: (string | number)[] = [];\n compressedRefinerKeys.forEach((refinerKey) => {\n compressedRefiner.push(refiner[refinerKey]);\n });\n compressedRefiners.push(compressedRefiner);\n });\n\n return compressedRefiners;\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { Button } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nexport interface ISearchFormProps {\n hideSearchLabel: boolean | undefined;\n isSearchFormExpanded?: boolean | undefined;\n disableSubmitSearch: boolean | undefined;\n searchTextInput: React.RefObject<HTMLInputElement>;\n maxChars: number;\n searchQsp: string;\n searchPlaceholder: string;\n query: string;\n ariaLabelCancel: string;\n ariaLabelSearch: string;\n ariaLabelSubmit: string;\n handleCancelSearchChange(): void;\n handleInputChange(query: string): void;\n}\n\nexport interface ISearchFormViewProps {\n input: React.ReactNode;\n submitBtn: React.ReactNode;\n cancelBtn: React.ReactNode;\n\n}\n\n/**\n * On Input Change functionality.\n * @param handleInputChange -Input change function.\n * @returns Set updated input value.\n */\nconst onInputChangeFunction = (handleInputChange: (query: string) => void) => (event: React.ChangeEvent<HTMLInputElement>) => {\n handleInputChange(event.target.value || '');\n};\nexport const FormComponent = (props: ISearchFormProps): ISearchFormViewProps => {\n const {\n searchQsp,\n searchPlaceholder,\n hideSearchLabel,\n searchTextInput,\n handleInputChange,\n maxChars,\n disableSubmitSearch,\n handleCancelSearchChange,\n query,\n ariaLabelCancel,\n ariaLabelSearch,\n ariaLabelSubmit\n } = props;\n\n const onInputChange = onInputChangeFunction(handleInputChange);\n\n const inputNode = !hideSearchLabel ? (\n <input\n className='ms-search__form-control'\n type='text'\n aria-label={ariaLabelSearch}\n name={searchQsp}\n placeholder={searchPlaceholder}\n ref={searchTextInput}\n onChange={onInputChange}\n maxLength={maxChars}\n value={query}\n />\n ) : (\n <input\n className='ms-search__form-control'\n type='text'\n aria-label={ariaLabelSearch}\n name={searchQsp}\n placeholder={searchPlaceholder}\n ref={searchTextInput}\n onChange={onInputChange}\n value={query}\n />\n );\n\n const submitBtnNode = !disableSubmitSearch && (\n <Button className='ms-search__form-submitSearch' aria-label={ariaLabelSubmit} />\n );\n\n const cancelBtNoden = (\n <Button\n className={!disableSubmitSearch ? 'ms-search__form-cancelSearch' : 'ms-search__form-cancelSearchNoSumbit'}\n aria-label={ariaLabelCancel}\n onClick={handleCancelSearchChange}\n type='button'\n />\n );\n\n return { input: inputNode, cancelBtn: cancelBtNoden, submitBtn: submitBtnNode };\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport MsDyn365, { getRichTextHtml } from '@msdyn365-commerce/core';\nimport { SearchSuggestion } from '@msdyn365-commerce/retail-proxy';\nimport { getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ISearchData } from '../search.data';\nimport { ISearchProps } from '../search.props.autogenerated';\n\nexport interface ISearchKeywordSuggestProps {\n searchKeywordSuggestClass: string;\n searchPageURL: string;\n searchQsp: string | undefined;\n hitPrefix: string;\n hitSuffix: string;\n autoSuggestProps: ISearchProps<ISearchData>;\n searchText: string;\n suggestions: SearchSuggestion[] | undefined;\n telemetryContent?: ITelemetryContent;\n}\n\nexport interface ISearchKeywordViewProps {\n text: React.ReactNode[];\n}\n\nlet payLoad: IPayLoad;\n\n/**\n * KeywordSuggestionsComponent.\n * @param props\n */\nexport const KeywordSuggestionsComponent = (props: ISearchKeywordSuggestProps): ISearchKeywordViewProps | undefined => {\n const {\n suggestions,\n hitPrefix,\n hitSuffix\n } = props;\n\n payLoad = getPayloadObject('click', props.telemetryContent!, '');\n\n const reactNodes: React.ReactNode[] = [];\n\n suggestions?.map(item => {\n reactNodes.push(_assembleNode(item, hitPrefix, hitSuffix, props));\n });\n\n return { text: reactNodes };\n};\n\nconst _assembleNode = (item: SearchSuggestion, hitPrefix: string, hitSuffix: string, props: ISearchKeywordSuggestProps) => {\n const ariaLabel = item.Value &&\n (item.Value).replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\n payLoad.contentAction.etext = ariaLabel;\n const attribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n return (\n <li className='msc-autoSuggest__keywordResults-item' key={item.Id}>\n <a\n aria-label={ariaLabel}\n href={_generateLink(item, hitPrefix, hitSuffix, props)}\n {...attribute}\n >\n {_generateLink(item, hitPrefix, hitSuffix, props) &&\n _getHighlightedText(item.Value ? item.Value : '', hitPrefix, hitSuffix)}\n </a>\n </li>\n );\n};\n\nconst _generateLink = (suggestion: SearchSuggestion, hitPrefix: string, hitSuffix: string, props: ISearchKeywordSuggestProps): string => {\n const { searchPageURL, searchQsp } = props;\n\n const formattedLink = (suggestion.Value as string)\n .replace(new RegExp(`[${hitPrefix}]`, 'gi'), '')\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\n\n if (!MsDyn365.isBrowser) {\n return '';\n }\n\n const queryUrl = new URL(searchPageURL, window.location.href);\n if (searchQsp && formattedLink) {\n queryUrl.searchParams.set(searchQsp, formattedLink);\n }\n\n return queryUrl.href;\n};\n\nconst _getHighlightedText = (suggestion: string, hitPrefix: string, hitSuffix: string): JSX.Element => {\n const formattedText = suggestion\n .replace(new RegExp(`[${hitPrefix}]`, 'gi'), '<strong>')\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '</strong>');\n\n return <span dangerouslySetInnerHTML={getRichTextHtml(formattedText)} />;\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { Button, getPayloadObject, getTelemetryAttributes, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nexport interface ISearchLabelProps {\n isSearchFormExpanded: boolean;\n searchLabelClass: string;\n searchLabelArialLabel: string;\n searchtext: string;\n searchCollapsedLabel: React.RefObject<HTMLButtonElement>;\n hideSearchLabel?: boolean;\n telemetryContent: ITelemetryContent;\n handleCancelSearchChange(): void;\n}\n\nexport const LabelComponent = (props: ISearchLabelProps) => {\n const { searchLabelClass, searchLabelArialLabel, isSearchFormExpanded, searchtext, searchCollapsedLabel, hideSearchLabel, handleCancelSearchChange, telemetryContent } = props;\n const payLoad = getPayloadObject('click', telemetryContent, searchtext, '');\n const attributes = getTelemetryAttributes(telemetryContent, payLoad);\n\n return (\n <div className={searchLabelClass}>\n <Button\n className='ms-search__icon'\n aria-expanded={isSearchFormExpanded}\n aria-label={searchLabelArialLabel}\n onClick={handleCancelSearchChange}\n innerRef={searchCollapsedLabel}\n {...attributes}\n >\n {!hideSearchLabel && <span className='ms-search__icon-text' aria-hidden>\n {searchtext}\n </span>}\n </Button>\n </div>\n );\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { PriceComponent } from '@msdyn365-commerce/components';\nimport { getRichTextHtml, IActionContext, IImageSettings, Image, ITelemetry } from '@msdyn365-commerce/core';\nimport { SearchSuggestion } from '@msdyn365-commerce/retail-proxy';\nimport { getProductPageUrlSync, ObjectExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { getPayloadObject, getTelemetryAttributes, INodeProps, IPayLoad, ITelemetryContent, NodeTag } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ISearchData } from '../search.data';\nimport { ISearchProps } from '../search.props.autogenerated';\n\n/**\n * Search product suggest resources.\n */\nexport interface ISearchProductSuggestResources {\n freePriceText: string;\n}\n\nexport interface ISearchProductSuggestProps {\n searchProductSuggestClass: string;\n searchPageURL: string;\n searchQsp: string | undefined;\n hitPrefix: string;\n hitSuffix: string;\n autoSuggestProps: ISearchProps<ISearchData>;\n searchText: string;\n suggestions: SearchSuggestion[] | undefined;\n telemetry: ITelemetry;\n moduleType: string;\n moduleId: string;\n telemetryContent?: ITelemetryContent;\n resources?: ISearchProductSuggestResources;\n}\n\nexport interface ISearchProductViewProps {\n title: React.ReactNode;\n items: ISearchProductItemViewProps[];\n}\n\nexport interface ISearchProductItemViewProps {\n text: React.ReactNode;\n thumbnail: React.ReactNode;\n price: React.ReactNode;\n LiProduct: INodeProps;\n AProduct: INodeProps;\n id: string | undefined;\n}\n\nlet payLoad: IPayLoad;\nlet telemetryContent: ITelemetryContent | undefined;\n\n/**\n * ProductSuggestionsComponent.\n * @param props\n */\nexport const ProductSuggestionsComponent = (props: ISearchProductSuggestProps): ISearchProductViewProps | undefined => {\n const {\n suggestions,\n hitSuffix,\n hitPrefix,\n autoSuggestProps: {\n context: { actionContext },\n resources: { productSuggestionHeading }\n },\n moduleType,\n moduleId\n } = props;\n const reactNodes: ISearchProductItemViewProps[] = [];\n telemetryContent = props.telemetryContent;\n payLoad = getPayloadObject('click', props.telemetryContent!, '');\n\n suggestions?.map(item => {\n reactNodes.push(_assembleNode(item, hitPrefix, hitSuffix, actionContext, props, moduleType, moduleId));\n });\n\n const titleNode = _renderTitle(productSuggestionHeading);\n\n return { title: titleNode, items: reactNodes };\n};\n\nconst _renderTitle = (productSuggestionHeading: string) => {\n const productAutoSuggestionHeading = productSuggestionHeading ? productSuggestionHeading : 'Go to products';\n\n return (<li className='msc-autoSuggest__productResults-title'>\n {productAutoSuggestionHeading}\n </li>);\n};\n\nconst _assembleNode = (\n item: SearchSuggestion,\n hitPrefix: string,\n hitSuffix: string,\n actionContext: IActionContext,\n props: ISearchProductSuggestProps,\n moduleType: string,\n moduleId: string\n): ISearchProductItemViewProps => {\n const altText =\n item.Value &&\n (item.Value).replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\n\n const price = item.Value3?.Value?.DecimalValue;\n return {\n text: _getHighlightedText(item.Value ? item.Value : '', hitPrefix, hitSuffix),\n thumbnail: _renderThumbnail(item, altText ? altText : '', props),\n price: !ObjectExtensions.isNullOrUndefined(price) &&\n _renderPrice(price, price, moduleId, moduleType, props),\n LiProduct: _getLiWrapper(),\n AProduct: _getAWrapper(item, hitPrefix, hitSuffix, actionContext, props),\n id: item.Id\n };\n};\n\nconst _getLiWrapper = () => {\n return {\n className: 'msc-autoSuggest__productResults-item',\n tag: 'li' as NodeTag\n };\n};\n\nconst _getAWrapper = (item: SearchSuggestion, hitPrefix: string, hitSuffix: string, actionContext: IActionContext, props: ISearchProductSuggestProps) => {\n const {\n autoSuggestProps: { context }\n } = props;\n const ariaLabel = item.Value &&\n (item.Value).replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\n\n payLoad.contentAction.recid = item.Id;\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\n const productPrice = context.cultureFormatter.formatCurrency(item.Value3!.Value!.DecimalValue!);\n\n return {\n className: 'msc-autoSuggest__productResults-item',\n tag: 'a' as NodeTag,\n 'aria-label': `${ariaLabel!} ${productPrice}`,\n href: _generateLink(item, hitPrefix, hitSuffix, actionContext),\n ...attribute\n };\n};\n\nconst _generateLink = (suggestion: SearchSuggestion, hitPrefix: string, hitSuffix: string, actionContext: IActionContext) => {\n const formattedLink = (suggestion.Value as string).replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\n return suggestion.Value && suggestion.Id ? getProductPageUrlSync(formattedLink, suggestion.Id as unknown as number, actionContext, undefined) : '';\n};\n\nconst _getHighlightedText = (suggestion: string, hitPrefix: string, hitSuffix: string): JSX.Element => {\n const formattedText = suggestion\n .replace(new RegExp(`[${hitPrefix}]`, 'gi'), '<strong>')\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '</strong>');\n\n return <span className='msc-price msc-autoSuggest__productResults-item-text' dangerouslySetInnerHTML={getRichTextHtml(formattedText)} />;\n};\n\nconst _renderPrice = (adjustedPrice: number, basePrice: number, moduleId: string, moduleType: string, props: ISearchProductSuggestProps): JSX.Element | null => {\n const {\n autoSuggestProps: { context }\n } = props;\n\n return (\n <PriceComponent\n id={moduleId}\n typeName={moduleType}\n context={context}\n data={{\n price: {\n CustomerContextualPrice: adjustedPrice,\n BasePrice: basePrice\n }\n }}\n className='msc-autoSuggest__productResults-item-price'\n freePriceText={props.resources?.freePriceText}\n />\n );\n};\n\nconst _renderThumbnail = (suggestion: SearchSuggestion, altText: string, props: ISearchProductSuggestProps): JSX.Element | null => {\n const {\n autoSuggestProps: {\n context: {\n request: { gridSettings }\n },\n config: { imageSettings }\n }\n } = props;\n if (imageSettings) {\n imageSettings.cropFocalRegion = true;\n }\n\n if (!suggestion || !suggestion.ImageUrl) {\n props.telemetry.error('Search suggestion content is empty, module wont render.');\n return null;\n }\n\n const defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=40&h=40&m=6', w: 0, h: 0 },\n lg: { q: 'w=40&h=40&m=6', w: 0, h: 0 },\n xl: { q: 'w=40&h=40&m=6', w: 0, h: 0 }\n },\n lazyload: true,\n cropFocalRegion: true\n };\n\n return (\n <Image\n requestContext={props.autoSuggestProps.context.actionContext.requestContext}\n altText={altText}\n className='msc-autoSuggest__productResults-item-img'\n src={suggestion.ImageUrl}\n gridSettings={gridSettings!}\n imageSettings={imageSettings ? imageSettings : defaultImageSettings}\n loadFailureBehavior='empty'\n />\n );\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { Autosuggestions } from '@msdyn365-commerce/commerce-entities';\nimport MsDyn365, { getCatalogId, getUrlSync } from '@msdyn365-commerce/core';\nimport { ProductRefiner, ProductRefinerSource, ProductsDataActions } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions, ObjectExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { createSearchStateInput } from '@msdyn365-commerce-modules/search-utilities';\nimport { getTelemetryObject, IModuleProps, INodeProps, ITelemetryContent, KeyCodes } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { debounce } from 'lodash';\nimport { Spinner, SpinnerSize } from 'office-ui-fabric-react';\nimport * as React from 'react';\n\nimport getSearchSuggestionsAction, { AutoSuggestInput, SuggestionType } from './actions/get-auto-suggest-suggestions';\nimport {\n CategorySuggestionsComponent,\n FormComponent,\n ISearchCategoryViewProps,\n ISearchKeywordViewProps,\n ISearchProductViewProps,\n KeywordSuggestionsComponent,\n LabelComponent,\n ProductSuggestionsComponent\n} from './components';\nimport { ISearchData } from './search.data';\nimport { ISearchProps, ISuggestionTypeCriterionData } from './search.props.autogenerated';\n\nexport interface ISearchState {\n isSearchFormExpanded: boolean;\n searchText: string;\n searchKeywordSuggestClass: string;\n searchProductSuggestClass: string;\n searchCategorySuggestClass: string;\n suggestions: Autosuggestions | undefined;\n searchRefiners?: ProductRefiner[] | undefined;\n autoSuggestAriaLabel: string;\n isInitialState: boolean;\n isLoadingAutoSuggest?: boolean;\n}\n\nexport interface ISearchViewProps extends ISearchProps<ISearchData> {\n Search: IModuleProps;\n AutoSuggestAriaLabel: INodeProps;\n AutoSuggestAriaLabelText: string;\n searchText: string;\n AutoSuggest: INodeProps;\n KeywordSuggest: INodeProps;\n ProductSuggest: INodeProps;\n CategorySuggest: INodeProps;\n SearchForm: INodeProps;\n FormWrapper: INodeProps;\n UlKeyword: INodeProps;\n UlProduct: INodeProps;\n UlCategory: INodeProps;\n label: React.ReactNode;\n form: React.ReactNode;\n autosuggestKeyword?: ISearchKeywordViewProps;\n autosuggestProduct?: ISearchProductViewProps;\n autosuggestCategory?: ISearchCategoryViewProps;\n callbacks: {\n handleCancelSearchChange(): void;\n };\n isSearchFormExpanded: boolean;\n isLoadingAutoSuggest?: boolean;\n isLoadingNode?: React.ReactNode;\n}\n\n/**\n *\n * Search module.\n * @extends {React.Component<ISearchProps<ISearchData>, ISearchState>}\n */\nclass Search extends React.Component<ISearchProps<ISearchData>, ISearchState> {\n private readonly searchTextInput: React.RefObject<HTMLInputElement>;\n\n private readonly searchCollapsedLabel: React.RefObject<HTMLButtonElement>;\n\n private readonly formReference: React.RefObject<HTMLButtonElement>;\n\n private readonly maxChars: number;\n\n private readonly inputSuggestionType?: ISuggestionTypeCriterionData[];\n\n private readonly topResultsCount?: number;\n\n private readonly hitPrefix: string = '{';\n\n private readonly hitSuffix: string = '}';\n\n private readonly waitTime: number = 500;\n\n private readonly autoSuggestResultScreenReaderDiv: React.RefObject<HTMLDivElement>;\n\n private readonly autoSuggestResultDiv: React.RefObject<HTMLDivElement>;\n\n private readonly searchFormClass: string;\n\n private readonly searchLabelClass: string;\n\n private readonly telemetryContent: ITelemetryContent;\n\n // @ts-expect-error\n private cancellabelDebounce: debounce;\n\n constructor(props: ISearchProps<ISearchData>) {\n super(props);\n this.searchTextInput = React.createRef();\n this.searchCollapsedLabel = React.createRef();\n this.autoSuggestResultScreenReaderDiv = React.createRef();\n this.autoSuggestResultDiv = React.createRef();\n this.formReference = React.createRef();\n this.state = {\n isSearchFormExpanded: false,\n searchText: '',\n searchKeywordSuggestClass: 'ms-search__autoSuggest__keyword',\n searchProductSuggestClass: 'ms-search__autoSuggest__product',\n searchCategorySuggestClass: 'ms-search__autoSuggest__category',\n suggestions: undefined,\n searchRefiners: undefined,\n autoSuggestAriaLabel: '',\n isInitialState: true,\n isLoadingAutoSuggest: false\n };\n this.maxChars =\n (this.props.context &&\n this.props.context.app &&\n this.props.context.app.config &&\n this.props.context.app.config.searchInputMaxLength) ||\n 50;\n this.inputSuggestionType = this.props.config && this.props.config.suggestionTypeCriterion;\n this.topResultsCount = this.props.config && this.props.config.topResultsCount ? this.props.config.topResultsCount : 5;\n this.searchFormClass = 'ms-search__form';\n this.searchLabelClass = 'ms-search__label';\n this.telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!, this.props.friendlyName, this.props.telemetry);\n }\n\n public async componentDidMount(): Promise<void> {\n document.body && document.body.addEventListener('mousedown', this._focusOutTarget);\n window && window.addEventListener('keyup', this._keyup);\n }\n\n public componentWillUnmount(): void {\n document.body && document.body.removeEventListener('mousedown', this._focusOutTarget, false);\n window && window.removeEventListener('keyup', this._keyup, false);\n }\n\n public componentDidUpdate(): void {\n const {\n config: { hideSearchLabel }\n } = this.props;\n const { isSearchFormExpanded, isInitialState } = this.state;\n\n if (!this.props.context.request.params.isEditor) {\n if (!hideSearchLabel && isSearchFormExpanded) {\n this.searchTextInput && this.searchTextInput.current && this.searchTextInput.current.focus();\n } else if (!isInitialState) {\n this.searchCollapsedLabel && this.searchCollapsedLabel.current && this.searchCollapsedLabel.current.focus();\n }\n }\n }\n\n public shouldComponentUpdate(nextProps: ISearchProps<ISearchData>,\n nextState: ISearchState): boolean {\n if (this.state === nextState && this.props === nextProps) {\n return false;\n }\n return true;\n }\n\n // eslint-disable-next-line complexity -- ignore complexity.\n public render(): JSX.Element {\n const {\n context,\n resources: { searchtext, searchLabelArialLabel, cancelBtnAriaLabel, searchBtnAriaLabel, submitBtnAriaLabel },\n config: { hideSearchLabel, disableSubmitSearch, searchplaceholderText, shouldShowFullCategoryPath, className = '' }\n } = this.props;\n\n const {\n isSearchFormExpanded,\n searchText,\n searchKeywordSuggestClass,\n searchProductSuggestClass,\n searchCategorySuggestClass,\n suggestions,\n searchRefiners,\n isLoadingAutoSuggest\n } = this.state;\n\n const searchQsp = (context && context.app && context.app.config && context.app.config.searchQueryStringParameter) || 'q';\n const searchPageURL = getUrlSync('search', context && context.actionContext) || '';\n const searchURL = this._appendQueryParams(searchPageURL, searchText, searchQsp);\n const searchPlaceholder = searchplaceholderText && searchplaceholderText.length > 0 ? searchplaceholderText : 'Search in Fabrikam';\n\n const keywordSuggestions = suggestions?.AllSearchResults?.filter(\n suggestion => suggestion.SuggestionType === SuggestionType.Keyword || suggestion.SuggestionType === SuggestionType.None\n );\n const productSuggestions = suggestions?.AllSearchResults?.filter(suggestion => suggestion.SuggestionType === SuggestionType.Product);\n const categoryRefiners = searchRefiners?.find(refiner => {\n return refiner.SourceValue === ProductRefinerSource.Category;\n });\n const categorySuggestions = suggestions?.AllSearchResults?.filter(\n suggestion => {\n if (suggestion.SuggestionType !== SuggestionType.Category) {\n return false;\n }\n const refiner = categoryRefiners?.Values?.find(item => {\n return `${item.RefinerRecordId ?? 0}` === suggestion.Id;\n });\n\n return !ObjectExtensions.isNullOrUndefined(refiner);\n });\n\n const viewProps: ISearchViewProps = {\n ...(this.props as ISearchProps<ISearchData>),\n\n Search: {\n moduleProps: this.props,\n className: `${classnames('ms-search', className)} ${disableSubmitSearch ? 'no-submit' : 'with-submit'}`\n },\n AutoSuggestAriaLabel: {\n tag: 'div',\n className: 'msc-autoSuggest__screen-reader',\n 'aria-live': 'assertive',\n ref: this.autoSuggestResultScreenReaderDiv\n },\n AutoSuggestAriaLabelText: this.state.autoSuggestAriaLabel,\n searchText: this.state.searchText,\n AutoSuggest: {\n ref: this.autoSuggestResultDiv,\n className: 'ms-search__autoSuggest'\n },\n KeywordSuggest: {\n className: searchKeywordSuggestClass\n },\n ProductSuggest: {\n className: searchProductSuggestClass\n },\n CategorySuggest: {\n className: searchCategorySuggestClass\n },\n SearchForm: {\n className: `${this.searchFormClass} ${isSearchFormExpanded ? 'bx-show' : 'bx-hide'}`\n },\n FormWrapper: {\n tag: 'form',\n ref: this.formReference,\n className: 'ms-search__searchForm',\n 'aria-label': 'Search',\n name: 'searchForm',\n role: 'search',\n action: searchURL,\n autoComplete: 'off',\n onSubmit: this._handleSubmit\n },\n UlKeyword: {\n tag: 'ul',\n className: classnames('msc-autoSuggest__keywordResults-items', className)\n },\n UlProduct: {\n tag: 'ul',\n className: classnames('msc-autoSuggest__productResults-items', className)\n },\n UlCategory: {\n tag: 'ul',\n className: classnames('msc-autoSuggest__categoryResults-items', className)\n },\n label: LabelComponent({\n isSearchFormExpanded,\n searchLabelClass: `${this.searchLabelClass} ${isSearchFormExpanded ? 'bx-hide' : 'bx-show'}`,\n searchtext,\n searchLabelArialLabel,\n searchCollapsedLabel: this.searchCollapsedLabel,\n hideSearchLabel,\n handleCancelSearchChange: this._handleCancelSearchChange,\n telemetryContent: this.telemetryContent\n }),\n form: FormComponent({\n ariaLabelCancel: cancelBtnAriaLabel,\n ariaLabelSearch: searchBtnAriaLabel,\n ariaLabelSubmit: submitBtnAriaLabel,\n hideSearchLabel,\n searchTextInput: this.searchTextInput,\n disableSubmitSearch,\n handleInputChange: this._handleInputChange,\n handleCancelSearchChange: this._handleCancelSearchChange,\n maxChars: this.maxChars,\n searchQsp,\n searchPlaceholder,\n query: searchText\n }),\n autosuggestKeyword:\n searchText && searchText.length > 0 &&\n (isLoadingAutoSuggest || (keywordSuggestions && ArrayExtensions.hasElements(keywordSuggestions))) ? KeywordSuggestionsComponent({\n searchKeywordSuggestClass,\n searchPageURL,\n searchQsp,\n hitPrefix: this.hitPrefix,\n hitSuffix: this.hitSuffix,\n autoSuggestProps: this.props,\n searchText,\n suggestions: keywordSuggestions,\n telemetryContent: this.telemetryContent\n }) : undefined,\n autosuggestProduct:\n searchText && searchText.length > 0 &&\n (isLoadingAutoSuggest || (productSuggestions && ArrayExtensions.hasElements(productSuggestions))) ? ProductSuggestionsComponent({\n searchProductSuggestClass,\n searchPageURL,\n searchQsp,\n hitPrefix: this.hitPrefix,\n hitSuffix: this.hitSuffix,\n autoSuggestProps: this.props,\n searchText,\n suggestions: productSuggestions,\n telemetry: this.props.telemetry,\n moduleType: this.props.typeName,\n moduleId: this.props.id,\n telemetryContent: this.telemetryContent,\n resources: this.props.resources\n }) : undefined,\n autosuggestCategory:\n searchText && searchText.length > 0 &&\n (isLoadingAutoSuggest || (categorySuggestions && ArrayExtensions.hasElements(categorySuggestions))) ? CategorySuggestionsComponent({\n searchCategorySuggestClass,\n searchPageURL,\n searchQsp,\n hitPrefix: this.hitPrefix,\n hitSuffix: this.hitSuffix,\n autoSuggestProps: this.props,\n searchText,\n suggestions: categorySuggestions,\n searchRefiners,\n telemetryContent: this.telemetryContent,\n shouldShowFullPath: shouldShowFullCategoryPath\n }) : undefined,\n callbacks: {\n handleCancelSearchChange: this._handleCancelSearchChange\n },\n isSearchFormExpanded: this.state.isSearchFormExpanded,\n isLoadingAutoSuggest,\n isLoadingNode: this._isLoadingNode()\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n /**\n * Function to create the ReactNode for loading Autosuggest result.\n * @returns ReachNode for loading Autosuggest result.\n */\n private readonly _isLoadingNode = (): React.ReactNode => {\n const loadingText = this.props.resources.autoSuggestResultLoadingMessage;\n return (<Spinner\n className='msc-autoSuggest__loadingResult'\n label={loadingText}\n size={SpinnerSize.medium}\n labelPosition='right'\n />);\n };\n\n private readonly _focusOutTarget = (e: any): void => {\n const { suggestions } = this.state;\n\n if (\n suggestions &&\n suggestions.AllSearchResults &&\n e.target.closest('.ms-search') === null\n ) {\n this._clearAutoSuggestState();\n }\n };\n\n private readonly _keyup = (e: KeyboardEvent): void => {\n const { suggestions } = this.state;\n\n if (suggestions && suggestions.AllSearchResults && e.keyCode === KeyCodes.Escape) {\n this._clearAutoSuggestState();\n } else if (this.state.isSearchFormExpanded && e.keyCode === KeyCodes.Escape) {\n if (this.state.isSearchFormExpanded) {\n this.setState({ isSearchFormExpanded: false });\n }\n }\n\n if (!((this.formReference.current && this.formReference.current.contains(e.target as unknown as Node)) ||\n (this.autoSuggestResultDiv.current && this.autoSuggestResultDiv.current.contains(e.target as unknown as Node)))) {\n if (suggestions && suggestions.AllSearchResults) {\n this._clearAutoSuggestState();\n }\n\n if (this.state.isSearchFormExpanded) {\n this.setState({ isSearchFormExpanded: false });\n }\n }\n };\n\n private readonly _clearAutoSuggestState = (): void => {\n const {\n context: { actionContext },\n data: { searchState }\n } = this.props;\n\n if (this.searchTextInput.current && this.searchTextInput.current.value.length > 0) {\n searchState.searchText = '';\n searchState.defaultBasicSearchUrl = '';\n searchState.searchQueryStringParameter = '';\n actionContext ? actionContext.update(createSearchStateInput(searchState), searchState) : null;\n this.searchTextInput.current.value = '';\n }\n\n this.setState({ searchText: '', suggestions: undefined, searchRefiners: undefined });\n };\n\n private readonly _handleInputChange = (query: string): void => {\n if (!query || query.length <= this.maxChars) {\n this.setState({ searchText: query });\n }\n\n if (this.cancellabelDebounce) {\n this.cancellabelDebounce.cancel();\n }\n\n const {\n telemetry,\n context,\n data: { searchState }\n } = this.props;\n\n if (context) {\n if (query && query.length > 0) {\n if (query.length > this.maxChars) {\n return;\n }\n\n this.cancellabelDebounce = debounce(() => {\n this.setState({ isLoadingAutoSuggest: true });\n getSearchSuggestionsAction(\n new AutoSuggestInput(\n query,\n this.topResultsCount,\n this._getSuggestionType(this.inputSuggestionType),\n this.hitPrefix,\n this.hitSuffix\n ),\n context.actionContext\n )\n .then(results => {\n this._getSearchRefiners(query)\n .then(refiners => {\n this.setState({ suggestions: results, searchRefiners: refiners,\n autoSuggestAriaLabel: this._setAutoSuggestResultCount(results), isLoadingAutoSuggest: false });\n })\n .catch(error => {\n this.setState({ suggestions: results, searchRefiners: undefined,\n autoSuggestAriaLabel: this._setAutoSuggestResultCount(results) });\n telemetry.exception(error);\n telemetry.debug('Unable to get refiners results');\n });\n })\n .catch(error => {\n this.setState({ suggestions: undefined, searchRefiners: undefined,\n autoSuggestAriaLabel: this._setAutoSuggestResultCount() });\n telemetry.exception(error);\n telemetry.debug('Unable to get auto suggest results');\n });\n }, this.waitTime);\n\n setTimeout(() => {\n this.cancellabelDebounce();\n }, 0);\n\n searchState.searchText = query;\n } else {\n this.setState({ suggestions: undefined, searchRefiners: undefined });\n searchState.searchText = '';\n }\n context.actionContext.update(createSearchStateInput(searchState), searchState);\n }\n };\n\n private readonly _getSuggestionType = (suggestionTypes?: ISuggestionTypeCriterionData[]): string => {\n if (suggestionTypes && suggestionTypes.length > 0) {\n const distinctSuggestionTypes: string[] = [];\n suggestionTypes && suggestionTypes.forEach((suggestionTypeItem, index) => {\n suggestionTypeItem.SuggestionType && distinctSuggestionTypes.push(suggestionTypeItem.SuggestionType.charAt(0).toUpperCase() + suggestionTypeItem.SuggestionType.slice(1));\n });\n return distinctSuggestionTypes.join(',');\n }\n return 'Keyword, Product, ScopedCategory';\n };\n\n private async _getSearchRefiners(searchText: string): Promise<ProductRefiner[]> {\n const { actionContext: ctx } = this.props.context;\n const catalogId = getCatalogId(ctx.requestContext);\n return ProductsDataActions.getProductSearchRefinersAsync(\n { callerContext: ctx },\n {\n SearchCondition: searchText,\n Context: {\n ChannelId: +ctx.requestContext.apiSettings.channelId,\n CatalogId: catalogId\n }\n }\n );\n }\n\n private readonly _handleSubmit = (\n e: React.MouseEvent<HTMLElement> | React.KeyboardEvent<HTMLElement> | React.FormEvent<HTMLFormElement>\n ): void => {\n const {\n config: { disableSubmitSearch },\n context: {\n actionContext,\n app: {\n config: { searchQueryStringParameter }\n }\n }\n } = this.props;\n\n const query = this.searchTextInput.current && this.searchTextInput.current.value;\n e.preventDefault();\n\n if (!query || (query && query.length === 0) || disableSubmitSearch) {\n this.searchTextInput && this.searchTextInput.current && this.searchTextInput.current.focus();\n } else {\n const searchQsp = searchQueryStringParameter || 'q';\n const searchURL = this._appendQueryParams(getUrlSync('search', actionContext) || '', query, searchQsp);\n document.location.href = searchURL;\n }\n };\n\n private readonly _handleCancelSearchChange = (): void => {\n const { isSearchFormExpanded, suggestions } = this.state;\n\n if (!isSearchFormExpanded) {\n this.setState({\n isSearchFormExpanded: true,\n searchText: '',\n isInitialState: false\n });\n } else {\n if (suggestions && suggestions.AllSearchResults) {\n this._clearAutoSuggestState();\n }\n\n this.setState({ isSearchFormExpanded: false });\n }\n };\n\n private readonly _appendQueryParams = (route: string, query: string, qsp: string): string => {\n if (!MsDyn365.isBrowser) {\n return '';\n }\n\n const queryUrl = new URL(route, window.location.href);\n if (qsp && query) {\n queryUrl.searchParams.set(qsp, query);\n }\n\n return queryUrl.href;\n };\n\n private readonly _setAutoSuggestResultCount = (result?: Autosuggestions) => {\n if (this.autoSuggestResultScreenReaderDiv.current !== null) {\n const ariaLiveRegion = this.autoSuggestResultScreenReaderDiv.current;\n const suggestResultString = this.props.resources.autoSuggestFoundMessage;\n const emptyResultString = this.props.resources.noAutoSuggestionMessage;\n ariaLiveRegion.innerText = result && (result.AllSearchResults && result.AllSearchResults.length > 0) ? suggestResultString : emptyResultString;\n ariaLiveRegion.setAttribute('aria-live', 'assertive');\n return ariaLiveRegion.innerText;\n }\n return '';\n\n };\n}\n\nexport default Search;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { INodeProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ISingleOrderTemplateViewProps } from './components';\nimport { IOrderTemplateListViewProps } from './order-template-list';\n\nexport const OrderTemplateListView: React.FC<IOrderTemplateListViewProps> = props => {\n const { OrderTemplateList, status, statusMessage, heading, OrderTemplates, orderTemplates, OrderTemplate, createOrderTemplateButton, templateHeaderStatusMessage } = props;\n\n return (\n <Module {...OrderTemplateList}>\n {heading}\n {status !== 'SUCCESS' && statusMessage}\n <Node className=''>\n {createOrderTemplateButton}\n {templateHeaderStatusMessage}\n </Node>\n { OrderTemplates && orderTemplates && orderTemplates.length > 0 &&\n <Node {...OrderTemplates}>\n {orderTemplates && orderTemplates.map((orderTemplate) => {\n return _renderOrderTemplate(orderTemplate, OrderTemplate);\n })}\n </Node>}\n </Module>\n );\n};\n\nconst _renderOrderTemplate = (orderTemplate: ISingleOrderTemplateViewProps, OrderTemplate?: INodeProps): JSX.Element | null => {\n\n const { key, addToCartButton, orderTemplateImage, orderTemplateStatusMessage, removeButton, orderTemplateName } = orderTemplate;\n return (\n <Node key={key} className={OrderTemplate!.className} {...OrderTemplate}>\n {orderTemplateName}\n {orderTemplateImage}\n {addToCartButton}\n {removeButton}\n {orderTemplateStatusMessage}\n </Node>\n );\n};\n\nexport default OrderTemplateListView;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { IModuleStateManager } from '@msdyn365-commerce-modules/checkout-utilities';\nimport { Heading } from '@msdyn365-commerce-modules/data-types';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport get from 'lodash/get';\nimport { computed } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport GuidedCard from './guided-card';\n\nexport interface ICheckoutGuidedFormProps {\n items: React.ReactNode[];\n moduleState: IModuleStateManager;\n disableGuidedCheckoutFlow?: boolean;\n isMobile?: boolean;\n isEditor?: boolean;\n resource: {\n checkoutStepTitleFormat: string;\n saveBtnLabel: string;\n changeBtnLabel: string;\n cancelBtnLabel: string;\n saveAndContinueBtnLabel: string;\n };\n telemetryContent?: ITelemetryContent;\n isPaymentVerificationRedirection?: boolean;\n shouldEnableSinglePaymentAuthorizationCheckout?: boolean;\n hasError?: boolean;\n hasShippingAddress?: boolean | undefined;\n hasCartDeliveryMode?: boolean | undefined;\n hasGuestCheckoutEmail?: boolean | undefined;\n isTermsAndConditionAccepted?: boolean | undefined;\n}\n\ninterface ICheckoutGuidedFormState {\n currentStep: number;\n}\n\nconst paymentInstrumentModuleId = 'payment-instrument';\n\n/**\n *\n * CheckoutGuidedForm component.\n * @extends {React.Component<ICheckoutGuidedFormProps>}\n */\n@observer\nclass CheckoutGuidedForm extends React.PureComponent<ICheckoutGuidedFormProps> {\n\n @computed public get hasMissingInfo(): boolean {\n if (this.props.hasShippingAddress === false || this.props.hasCartDeliveryMode === false ||\n this.props.hasGuestCheckoutEmail === false || this.props.isTermsAndConditionAccepted === false) {\n return true;\n }\n\n return false;\n }\n\n @computed public get hasOrderError(): boolean {\n for (const item of this.props.items) {\n const childId = this.getId(item);\n const state = this.props.moduleState.getModule(childId);\n\n const isPaymentSectionContainer = ArrayExtensions.hasElements(\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Explicitly check for null/undefined.\n state.childIds?.filter(currentId => currentId?.includes(paymentInstrumentModuleId)));\n\n if (!isPaymentSectionContainer && !state.isDisabled && state.hasError) {\n return true;\n }\n }\n\n return false;\n }\n\n public state: ICheckoutGuidedFormState = {\n currentStep: 0\n };\n\n public componentDidMount(): void {\n /**\n * Append child modules.\n */\n const childIds = this.props.items.map((item: React.ReactNode) => get(item, 'props.id'));\n this.props.moduleState.init({ childIds });\n }\n\n public render(): JSX.Element | null {\n const { moduleState, items, resource } = this.props;\n if (!items || !moduleState) {\n return null;\n }\n\n const shouldCollapseAfterRedirect = this.props.isPaymentVerificationRedirection &&\n this.props.shouldEnableSinglePaymentAuthorizationCheckout &&\n !this.props.hasError && !this.hasMissingInfo && !this.hasOrderError;\n\n return (\n <div className='ms-checkout__guided-form'>\n {items.map((item: React.ReactNode) => {\n const childId = this.getId(item);\n const step = this.getStep(childId);\n const title = this.getHeading(item);\n const state = this.props.moduleState.getModule(childId);\n const { isReady, isPending, isUpdating, isDisabled, isCancelAllowed, onEdit, onCancel, onSubmit, hasModuleState, hasInitialized } =\n state || ({} as IModuleStateManager);\n return (\n\n <GuidedCard\n key={childId}\n step={step}\n title={title}\n resource={resource}\n disabled={!hasModuleState || isDisabled}\n isActive={!shouldCollapseAfterRedirect && this.isActive(step)}\n isVisted={!shouldCollapseAfterRedirect && this.isVisted(step)}\n isExpanded={!shouldCollapseAfterRedirect && this.isExpanded(step)}\n isSubmitting={isPending}\n isMobile={this.props.isMobile}\n isPending={isPending}\n isUpdating={isUpdating}\n hasInitialized={hasInitialized}\n isReady={isReady}\n isCancelAllowed={isCancelAllowed}\n onSubmit={onSubmit}\n onCancel={onCancel}\n onEdit={onEdit}\n onNext={this.onNext}\n hasControlGroup={!this.props.disableGuidedCheckoutFlow && hasInitialized}\n telemetryContent={this.props.telemetryContent}\n >\n {React.cloneElement(item as React.ReactElement, { enableControl: true })}\n </GuidedCard>\n );\n })}\n </div>\n );\n }\n\n private readonly getEnabledModules = (): string[] => {\n const {\n moduleState: { childIds, getModule }\n } = this.props;\n return childIds.filter((childId: string) => {\n const state = getModule(childId);\n return !!state && !state.isDisabled;\n });\n };\n\n private readonly getStep = (id: string): number => {\n return this.getEnabledModules().indexOf(id);\n };\n\n private readonly getId = (item: React.ReactNode): string => {\n return get(item, 'props.id') || '';\n };\n\n private readonly getHeading = (item: React.ReactNode): Heading => {\n return get(item, 'props.config.heading') || '';\n };\n\n private readonly isExpanded = (step: number): boolean => {\n if (this.props.isEditor) {\n // Editorial mode: Expand all the drawers\n return true;\n }\n return step > -1 && step <= this.state.currentStep;\n };\n\n private readonly isActive = (step: number): boolean => {\n return step === this.state.currentStep;\n };\n\n private readonly isVisted = (step: number): boolean => {\n return step > -1 && step < this.state.currentStep;\n };\n\n private readonly onNext = (): void => {\n this.setState({\n currentStep: this.state.currentStep + 1\n });\n };\n}\n\nexport default CheckoutGuidedForm;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { PriceComponent } from '@msdyn365-commerce/components';\nimport { ICoreContext, ITelemetry } from '@msdyn365-commerce/core';\nimport { ICheckoutState, IGiftCardExtend } from '@msdyn365-commerce/global-state';\nimport { Cart, CartLine } from '@msdyn365-commerce/retail-proxy';\nimport { format } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nexport interface IInvoiceSummaryProps {\n orderTotalLabel: string;\n invoiceLabel: string;\n loyaltyLabel?: string;\n giftcardLabel?: string;\n context: ICoreContext;\n telemetry: ITelemetry;\n cart: Cart;\n id: string;\n typeName: string;\n freeText?: string;\n toBeCalculatedText?: string;\n checkoutState?: ICheckoutState;\n}\n\nexport interface IInvoiceSummaryLines {\n orderTotal: React.ReactNode;\n invoices: React.ReactNode;\n giftCard?: React.ReactNode;\n loyalty?: React.ReactNode;\n}\n\ninterface IInvoiceSummaryLineProps {\n label: string;\n context: ICoreContext;\n telemetry: ITelemetry;\n price?: number;\n freeText?: string;\n toBeCalculatedText?: string;\n id: string;\n typeName: string;\n cssLabel: string;\n}\n\nconst InvoiceSummaryLine: React.FC<IInvoiceSummaryLineProps> = ({\n price,\n label,\n context,\n id,\n typeName,\n toBeCalculatedText,\n freeText,\n cssLabel\n}) => {\n return (\n <p className={`msc-invoice-summary__line-${cssLabel}`}>\n <span className='msc-invoice-summary__label'>\n {label}\n </span>\n {price || price === 0 ? (\n <PriceComponent\n data={{\n price: { CustomerContextualPrice: price }\n }}\n freePriceText={freeText}\n context={context}\n id={id}\n typeName={typeName}\n className='msc-invoice-summary__value'\n />\n ) : (\n <span className='msc-invoice-summary__value'>\n {toBeCalculatedText}\n </span>\n )}\n </p>\n );\n};\n\nconst _buildPaymentSummarySection = (\n props: IInvoiceSummaryProps,\n price: number | undefined,\n label: string,\n cssLabel: string\n): React.ReactNode => {\n return (\n <InvoiceSummaryLine\n price={price}\n label={label}\n context={props.context}\n id={props.id}\n typeName={props.typeName}\n toBeCalculatedText={props.toBeCalculatedText}\n freeText={props.freeText}\n telemetry={props.telemetry}\n cssLabel={cssLabel}\n />\n );\n};\n\nconst _computedLoyaltyAmount = (checkoutState: ICheckoutState): number => {\n return (checkoutState && checkoutState.loyaltyAmount) || 0;\n};\n\nconst _computeGiftCardAmount = (checkoutState: ICheckoutState, cart: Cart): number => {\n\n const giftCardCounter = (count: number, giftCard: IGiftCardExtend) => {\n return count + (giftCard.Balance || 0);\n };\n const giftCardTotalValue = (checkoutState.giftCardExtends || []).reduce(giftCardCounter, 0);\n const amount = (cart.TotalAmount || 0) - _computedLoyaltyAmount(checkoutState);\n return Math.min(giftCardTotalValue, amount);\n};\n\nexport const InvoiceSummary = (props: IInvoiceSummaryProps) => {\n const { TotalAmount, CartLines } = props.cart;\n const invoiceLines = CartLines?.filter(cartLine => cartLine.IsInvoiceLine);\n const reactNodes: IInvoiceSummaryLines = {\n invoices: invoiceLines?.map((invoiceLine: CartLine) => {\n return _buildPaymentSummarySection(props, invoiceLine.InvoiceAmount, format(props.invoiceLabel, invoiceLine.InvoiceId), 'invoice');\n }),\n orderTotal: _buildPaymentSummarySection(props, TotalAmount, props.orderTotalLabel, 'total')\n };\n\n if (props.checkoutState) {\n const giftCardAmount = _computeGiftCardAmount(props.checkoutState, props.cart);\n const loyaltyAmount = _computedLoyaltyAmount(props.checkoutState);\n const totalAmountAfterGiftCard = (TotalAmount || 0) - giftCardAmount - loyaltyAmount;\n\n if (loyaltyAmount > 0) {\n reactNodes.loyalty = _buildPaymentSummarySection(props, -loyaltyAmount, props.loyaltyLabel || 'Loyalty amount', 'loyalty');\n }\n\n if (giftCardAmount > 0) {\n reactNodes.giftCard = _buildPaymentSummarySection(props, -giftCardAmount, props.giftcardLabel || 'Gift card amount', 'gift-card');\n }\n\n reactNodes.orderTotal = _buildPaymentSummarySection({ ...props, freeText: undefined }, totalAmountAfterGiftCard, props.orderTotalLabel, 'total');\n }\n\n return reactNodes;\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { CacheType, createObservableDataAction, IAction, IActionContext, IActionInput, IAny, ICommerceApiSettings, ICreateActionContext, IGeneric } from '@msdyn365-commerce/core';\nimport { buildCacheKey } from '@msdyn365-commerce-modules/retail-actions';\n\nimport { CheckoutState } from './checkout-state';\n\n/**\n * CheckoutState - action input.\n */\nexport class CheckoutStateInput implements IActionInput {\n private readonly apiSettings: ICommerceApiSettings;\n\n constructor(apiSettings: ICommerceApiSettings) {\n this.apiSettings = apiSettings;\n }\n\n public getCacheKey = () => buildCacheKey('CheckoutState', this.apiSettings);\n\n public getCacheObjectType = () => 'CheckoutState';\n\n public dataCacheType = (): CacheType => 'request';\n}\n\n/**\n * CheckoutState - action.\n * @param input\n * @param ctx\n */\nexport async function checkoutStateAction(input: CheckoutStateInput, ctx: IActionContext): Promise<CheckoutState> {\n return new CheckoutState();\n}\n\n/**\n * CheckoutState - create new input for create action.\n * @param inputData\n */\nconst createInput = (inputData: ICreateActionContext<IGeneric<IAny>>): IActionInput => {\n return new CheckoutStateInput(inputData.requestContext.apiSettings);\n};\n\n/**\n * CheckoutState - create action.\n */\nexport const checkoutStateActionDataAction = createObservableDataAction<CheckoutState>({\n action: <IAction<CheckoutState>>checkoutStateAction,\n input: createInput\n});\n\nexport default checkoutStateActionDataAction;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { getUrlSync, IActionContext } from '@msdyn365-commerce/core';\nimport { ICheckoutState } from '@msdyn365-commerce/global-state';\nimport { SalesOrder, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\n\nimport checkout from './checkout';\nimport emptyActiveCart from './empty-active-cart';\n\nexport default async (ctx: IActionContext, checkoutState: ICheckoutState | undefined, orderedProducts: SimpleProduct[] | undefined,\n redirect: boolean, updatedCartVersion?: number, isPaymentVerificationRedirection?: boolean) => {\n return new Promise(async (resolve: () => void, reject: (reason?: Error) => void) => {\n let salesOrder: SalesOrder;\n\n // Proceed checkout\n try {\n salesOrder = await checkout(ctx, updatedCartVersion, isPaymentVerificationRedirection);\n } catch (error) {\n reject(error); return;\n }\n\n // Remove purchased items from the active cart\n try {\n await emptyActiveCart(ctx);\n } catch (error) {\n reject(error); return;\n }\n\n if (redirect) {\n // Redirect to the order confirmation page\n const orderConfirmationUrl = getUrlSync('orderConfirmation', ctx) || '';\n if (!orderConfirmationUrl) {\n reject(new Error('Error: No orderConfirmationUrl')); return;\n }\n\n const separator = orderConfirmationUrl.includes('?') ? '&' : '?';\n const url = `${orderConfirmationUrl}${separator}transactionId=${salesOrder.Id}`;\n window.location.assign(url);\n } else {\n if (checkoutState) {\n const result = await checkoutState.updateSalesOrder({ newSalesOrder: salesOrder, newOrderedProducts: orderedProducts || [] });\n\n if (result.status === 'FAILED') {\n reject(new Error('Error: Updating error state failed')); return;\n }\n } else {\n reject(new Error('Error: No checkout state')); return;\n }\n resolve();\n }\n });\n};\n"],"sourceRoot":""}